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