1 /* KJL 15:25:20 8/16/97
2 *
3 * smacker.c - functions to handle FMV playback
4 *
5 */
6 #include "3dc.h"
7 #include "module.h"
8 #include "inline.h"
9 #include "stratdef.h"
10 #include "gamedef.h"
11 #include "fmv.h"
12 #include "avp_menus.h"
13 #include "avp_userprofile.h"
14 #include "oglfunc.h" // move this into opengl.c
15
16 #define UseLocalAssert 1
17 #include "ourasert.h"
18
19 int VolumeOfNearestVideoScreen;
20 int PanningOfNearestVideoScreen;
21
22 extern char *ScreenBuffer;
23 extern int GotAnyKey;
24 extern void DirectReadKeyboard(void);
25 extern IMAGEHEADER ImageHeaderArray[];
26 #if MaxImageGroups>1
27 extern int NumImagesArray[];
28 #else
29 extern int NumImages;
30 #endif
31
32 void PlayFMV(char *filenamePtr);
33
34 void FindLightingValueFromFMV(unsigned short *bufferPtr);
35 void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr);
36
37 int SmackerSoundVolume=ONE_FIXED/512;
38 int MoviesAreActive;
39 int IntroOutroMoviesAreActive=1;
40
41 int FmvColourRed;
42 int FmvColourGreen;
43 int FmvColourBlue;
44
45 void ReleaseFMVTexture(FMVTEXTURE *ftPtr);
46
47
48 /* KJL 12:45:23 10/08/98 - FMVTEXTURE stuff */
49 #define MAX_NO_FMVTEXTURES 10
50 FMVTEXTURE FMVTexture[MAX_NO_FMVTEXTURES];
51 int NumberOfFMVTextures;
52
ScanImagesForFMVs(void)53 void ScanImagesForFMVs(void)
54 {
55
56 extern void SetupFMVTexture(FMVTEXTURE *ftPtr);
57 int i;
58 IMAGEHEADER *ihPtr;
59 NumberOfFMVTextures=0;
60
61 #if MaxImageGroups>1
62 for (j=0; j<MaxImageGroups; j++)
63 {
64 if (NumImagesArray[j])
65 {
66 ihPtr = &ImageHeaderArray[j*MaxImages];
67 for (i = 0; i<NumImagesArray[j]; i++, ihPtr++)
68 {
69 #else
70 {
71 if(NumImages)
72 {
73 ihPtr = &ImageHeaderArray[0];
74 for (i = 0; i<NumImages; i++, ihPtr++)
75 {
76 #endif
77 char *strPtr;
78 if((strPtr = strstr(ihPtr->ImageName,"FMVs")))
79 {
80 char filename[30];
81 {
82 char *filenamePtr = filename;
83 do
84 {
85 *filenamePtr++ = *strPtr;
86 }
87 while(*strPtr++!='.');
88
89 *filenamePtr++='s';
90 *filenamePtr++='m';
91 *filenamePtr++='k';
92 *filenamePtr=0;
93 }
94
95 //if (smackHandle)
96 //{
97 // FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 0;
98 //}
99 //else
100 {
101 FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 1;
102 }
103
104 {
105 //FMVTexture[NumberOfFMVTextures].SmackHandle = smackHandle;
106 FMVTexture[NumberOfFMVTextures].ImagePtr = ihPtr;
107 FMVTexture[NumberOfFMVTextures].StaticImageDrawn=0;
108 SetupFMVTexture(&FMVTexture[NumberOfFMVTextures]);
109 NumberOfFMVTextures++;
110
111 if (NumberOfFMVTextures == MAX_NO_FMVTEXTURES)
112 {
113 break;
114 }
115 }
116 }
117 }
118 }
119 }
120
121
122 }
123
124 void UpdateAllFMVTextures(void)
125 {
126 extern void UpdateFMVTexture(FMVTEXTURE *ftPtr);
127 int i = NumberOfFMVTextures;
128
129 while(i--)
130 {
131 UpdateFMVTexture(&FMVTexture[i]);
132 }
133
134 }
135
136 void ReleaseAllFMVTextures(void)
137 {
138 extern void UpdateFMVTexture(FMVTEXTURE *ftPtr);
139 int i = NumberOfFMVTextures;
140
141 while(i--)
142 {
143 ReleaseFMVTexture(&FMVTexture[i]);
144 }
145
146 }
147
148
149 int NextFMVTextureFrame(FMVTEXTURE *ftPtr, void *bufferPtr)
150 {
151 int w = 128;
152
153 if (!ftPtr->StaticImageDrawn)
154 {
155 int i = w*96/4;
156 unsigned int seed = FastRandom();
157 int *ptr = (int*)bufferPtr;
158 do
159 {
160 seed = ((seed*1664525)+1013904223);
161 *ptr++ = seed;
162 }
163 while(--i);
164 ftPtr->StaticImageDrawn=1;
165 }
166 FindLightingValuesFromTriggeredFMV((unsigned char*)bufferPtr,ftPtr);
167 return 1;
168
169 }
170
171 void UpdateFMVTexturePalette(FMVTEXTURE *ftPtr)
172 {
173 //unsigned char *c;
174 int i;
175 //
176 //if (MoviesAreActive && ftPtr->SmackHandle)
177 //{
178 //}
179 //else
180 {
181 {
182 unsigned int seed = FastRandom();
183 for(i=0;i<256;i++)
184 {
185 int l = (seed&(seed>>24)&(seed>>16));
186 seed = ((seed*1664525)+1013904223);
187 ftPtr->SrcPalette[i].peRed=l;
188 ftPtr->SrcPalette[i].peGreen=l;
189 ftPtr->SrcPalette[i].peBlue=l;
190 }
191 }
192 }
193 }
194
195 extern void StartTriggerPlotFMV(int number)
196 {
197 (void) number;
198
199 //int i = NumberOfFMVTextures;
200 //char buffer[25];
201 //
202 //if (CheatMode_Active != CHEATMODE_NONACTIVE) return;
203 //
204 //sprintf(buffer,"FMVs//message%d.smk",number);
205 //{
206 // FILE* file=fopen(buffer,"rb");
207 // if(!file)
208 // {
209 // return;
210 // }
211 // fclose(file);
212 //}
213 //while(i--)
214 //{
215 // if (FMVTexture[i].IsTriggeredPlotFMV)
216 // {
217 // FMVTexture[i].MessageNumber = number;
218 // }
219 //}
220 }
221
222 extern void StartFMVAtFrame(int number, int frame)
223 {
224 }
225
226 extern void GetFMVInformation(int *messageNumberPtr, int *frameNumberPtr)
227 {
228 //int i = NumberOfFMVTextures;
229 //
230 //while(i--)
231 //{
232 // if (FMVTexture[i].IsTriggeredPlotFMV)
233 // {
234 // if(FMVTexture[i].SmackHandle)
235 // {
236 // *messageNumberPtr = FMVTexture[i].MessageNumber;
237 // *frameNumberPtr = 0;
238 // return;
239 // }
240 // }
241 //}
242
243 *messageNumberPtr = 0;
244 *frameNumberPtr = 0;
245 }
246
247
248 extern void InitialiseTriggeredFMVs(void)
249 {
250 //int i = NumberOfFMVTextures;
251 //while(i--)
252 //{
253 // if (FMVTexture[i].IsTriggeredPlotFMV)
254 // {
255 // if(FMVTexture[i].SmackHandle)
256 // {
257 // FMVTexture[i].MessageNumber = 0;
258 // }
259 //
260 // FMVTexture[i].SmackHandle = 0;
261 // }
262 //}
263 }
264
265 void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr)
266 {
267 unsigned int totalRed=0;
268 unsigned int totalBlue=0;
269 unsigned int totalGreen=0;
270
271 int pixels = 128*96;//64*48;//256*192;
272 do
273 {
274 unsigned char source = (*bufferPtr++);
275 totalBlue += ftPtr->SrcPalette[source].peBlue;
276 totalGreen += ftPtr->SrcPalette[source].peGreen;
277 totalRed += ftPtr->SrcPalette[source].peRed;
278 }
279 while(--pixels);
280
281 FmvColourRed = totalRed/48*16;
282 FmvColourGreen = totalGreen/48*16;
283 FmvColourBlue = totalBlue/48*16;
284
285 }
286
287 void SetupFMVTexture(FMVTEXTURE *ftPtr)
288 {
289 if (ftPtr->PalettedBuf == NULL)
290 {
291 ftPtr->PalettedBuf = (unsigned char*) calloc(1, 128*128+128*128*4);
292 }
293
294 if (ftPtr->RGBBuf == NULL)
295 {
296 if (ftPtr->PalettedBuf == NULL)
297 {
298 return;
299 }
300
301 ftPtr->RGBBuf = &ftPtr->PalettedBuf[128*128];
302 }
303
304 pglBindTexture(GL_TEXTURE_2D, ftPtr->ImagePtr->D3DTexture->id);
305 pglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, &ftPtr->RGBBuf[0]);
306
307 }
308
309 void UpdateFMVTexture(FMVTEXTURE *ftPtr)
310 {
311 unsigned char *srcPtr;
312 unsigned char *dstPtr;
313
314 int pixels = 128*96;//64*48;//256*192;
315
316 // get the next frame into the paletted buffer
317 if (!NextFMVTextureFrame(ftPtr, &ftPtr->PalettedBuf[0]))
318 {
319 return;
320 }
321
322 // update the texture palette
323 UpdateFMVTexturePalette(ftPtr);
324
325 srcPtr = &ftPtr->PalettedBuf[0];
326 dstPtr = &ftPtr->RGBBuf[0];
327
328 // not using paletted textures, so convert to rgb manually
329 do
330 {
331 unsigned char source = (*srcPtr++);
332 dstPtr[0] = ftPtr->SrcPalette[source].peRed;
333 dstPtr[1] = ftPtr->SrcPalette[source].peGreen;
334 dstPtr[2] = ftPtr->SrcPalette[source].peBlue;
335 dstPtr[3] = 255;
336
337 dstPtr += 4;
338 } while(--pixels);
339
340 //#warning move this into opengl.c
341 // update the opengl texture
342 pglBindTexture(GL_TEXTURE_2D, ftPtr->ImagePtr->D3DTexture->id);
343
344 pglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 96, GL_RGBA, GL_UNSIGNED_BYTE, &ftPtr->RGBBuf[0]);
345
346 // if using mipmaps, they will need to be updated now
347 //pglGenerateMipmap(GL_TEXTURE_2D);
348 }
349
350 void ReleaseFMVTexture(FMVTEXTURE *ftPtr)
351 {
352 ftPtr->MessageNumber = 0;
353
354 //if (FMVTexture[i].SrcTexture)
355 //{
356 // ReleaseD3DTexture(FMVTexture[i].SrcTexture);
357 // FMVTexture[i].SrcTexture=0;
358 //}
359 //if (FMVTexture[i].SrcSurface)
360 //{
361 // ReleaseDDSurface(FMVTexture[i].SrcSurface);
362 // FMVTexture[i].SrcSurface=0;
363 //}
364 //if (FMVTexture[i].DestTexture)
365 //{
366 // ReleaseD3DTexture(FMVTexture[i].DestTexture);
367 // FMVTexture[i].DestTexture = 0;
368 //}
369
370 if (ftPtr->PalettedBuf != NULL)
371 {
372 free(ftPtr->PalettedBuf);
373 ftPtr->PalettedBuf = NULL;
374 }
375
376 ftPtr->RGBBuf = NULL;
377 }
378