From e69698d11edfe564cf4940714482856bd2088fd4 Mon Sep 17 00:00:00 2001 From: Steven Fuller Date: Sun, 5 Oct 2008 21:43:28 -0700 Subject: Added the missing support for static on the televisions. --- src/fmv.c | 368 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 src/fmv.c (limited to 'src/fmv.c') diff --git a/src/fmv.c b/src/fmv.c new file mode 100644 index 0000000..8edbd65 --- /dev/null +++ b/src/fmv.c @@ -0,0 +1,368 @@ +/* KJL 15:25:20 8/16/97 + * + * smacker.c - functions to handle FMV playback + * + */ +#include "3dc.h" +#include "module.h" +#include "inline.h" +#include "stratdef.h" +#include "gamedef.h" +#include "fmv.h" +#include "avp_menus.h" +#include "avp_userprofile.h" +#include "oglfunc.h" + +#define UseLocalAssert 1 +#include "ourasert.h" + +int VolumeOfNearestVideoScreen; +int PanningOfNearestVideoScreen; + +extern char *ScreenBuffer; +extern int GotAnyKey; +extern void DirectReadKeyboard(void); +extern IMAGEHEADER ImageHeaderArray[]; +#if MaxImageGroups>1 +extern int NumImagesArray[]; +#else +extern int NumImages; +#endif + +void PlayFMV(char *filenamePtr); + +void FindLightingValueFromFMV(unsigned short *bufferPtr); +void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr); + +int SmackerSoundVolume=ONE_FIXED/512; +int MoviesAreActive; +int IntroOutroMoviesAreActive=1; + +int FmvColourRed; +int FmvColourGreen; +int FmvColourBlue; + +void ReleaseFMVTexture(FMVTEXTURE *ftPtr); + + +/* KJL 12:45:23 10/08/98 - FMVTEXTURE stuff */ +#define MAX_NO_FMVTEXTURES 10 +FMVTEXTURE FMVTexture[MAX_NO_FMVTEXTURES]; +int NumberOfFMVTextures; + +void ScanImagesForFMVs(void) +{ + + extern void SetupFMVTexture(FMVTEXTURE *ftPtr); + int i; + IMAGEHEADER *ihPtr; + NumberOfFMVTextures=0; + + #if MaxImageGroups>1 + for (j=0; jImageName,"FMVs"))) + { + char filename[30]; + { + char *filenamePtr = filename; + do + { + *filenamePtr++ = *strPtr; + } + while(*strPtr++!='.'); + + *filenamePtr++='s'; + *filenamePtr++='m'; + *filenamePtr++='k'; + *filenamePtr=0; + } + + //if (smackHandle) + //{ + // FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 0; + //} + //else + { + FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 1; + } + + { + //FMVTexture[NumberOfFMVTextures].SmackHandle = smackHandle; + FMVTexture[NumberOfFMVTextures].ImagePtr = ihPtr; + FMVTexture[NumberOfFMVTextures].StaticImageDrawn=0; + SetupFMVTexture(&FMVTexture[NumberOfFMVTextures]); + NumberOfFMVTextures++; + + if (NumberOfFMVTextures == MAX_NO_FMVTEXTURES) + { + break; + } + } + } + } + } + } + + +} + +void UpdateAllFMVTextures(void) +{ + extern void UpdateFMVTexture(FMVTEXTURE *ftPtr); + int i = NumberOfFMVTextures; + + while(i--) + { + UpdateFMVTexture(&FMVTexture[i]); + } + +} + +void ReleaseAllFMVTextures(void) +{ + extern void UpdateFMVTexture(FMVTEXTURE *ftPtr); + int i = NumberOfFMVTextures; + + while(i--) + { + ReleaseFMVTexture(&FMVTexture[i]); + } + +} + + +int NextFMVTextureFrame(FMVTEXTURE *ftPtr, void *bufferPtr) +{ + int w = 128; + + if (!ftPtr->StaticImageDrawn) + { + int i = w*96/4; + unsigned int seed = FastRandom(); + int *ptr = (int*)bufferPtr; + do + { + seed = ((seed*1664525)+1013904223); + *ptr++ = seed; + } + while(--i); + ftPtr->StaticImageDrawn=1; + } + FindLightingValuesFromTriggeredFMV((unsigned char*)bufferPtr,ftPtr); + return 1; + +} + +void UpdateFMVTexturePalette(FMVTEXTURE *ftPtr) +{ + //unsigned char *c; + int i; + // + //if (MoviesAreActive && ftPtr->SmackHandle) + //{ + //} + //else + { + { + unsigned int seed = FastRandom(); + for(i=0;i<256;i++) + { + int l = (seed&(seed>>24)&(seed>>16)); + seed = ((seed*1664525)+1013904223); + ftPtr->SrcPalette[i].peRed=l; + ftPtr->SrcPalette[i].peGreen=l; + ftPtr->SrcPalette[i].peBlue=l; + } + } + } +} + +extern void StartTriggerPlotFMV(int number) +{ + (void) number; + + //int i = NumberOfFMVTextures; + //char buffer[25]; + // + //if (CheatMode_Active != CHEATMODE_NONACTIVE) return; + // + //sprintf(buffer,"FMVs//message%d.smk",number); + //{ + // FILE* file=fopen(buffer,"rb"); + // if(!file) + // { + // return; + // } + // fclose(file); + //} + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // FMVTexture[i].MessageNumber = number; + // } + //} +} + +extern void StartFMVAtFrame(int number, int frame) +{ +} + +extern void GetFMVInformation(int *messageNumberPtr, int *frameNumberPtr) +{ + //int i = NumberOfFMVTextures; + // + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // if(FMVTexture[i].SmackHandle) + // { + // *messageNumberPtr = FMVTexture[i].MessageNumber; + // *frameNumberPtr = 0; + // return; + // } + // } + //} + + *messageNumberPtr = 0; + *frameNumberPtr = 0; +} + + +extern void InitialiseTriggeredFMVs(void) +{ + //int i = NumberOfFMVTextures; + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // if(FMVTexture[i].SmackHandle) + // { + // FMVTexture[i].MessageNumber = 0; + // } + // + // FMVTexture[i].SmackHandle = 0; + // } + //} +} + +void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr) +{ + unsigned int totalRed=0; + unsigned int totalBlue=0; + unsigned int totalGreen=0; + + int pixels = 128*96;//64*48;//256*192; + do + { + unsigned char source = (*bufferPtr++); + totalBlue += ftPtr->SrcPalette[source].peBlue; + totalGreen += ftPtr->SrcPalette[source].peGreen; + totalRed += ftPtr->SrcPalette[source].peRed; + } + while(--pixels); + + FmvColourRed = totalRed/48*16; + FmvColourGreen = totalGreen/48*16; + FmvColourBlue = totalBlue/48*16; + +} + +void SetupFMVTexture(FMVTEXTURE *ftPtr) +{ + if (ftPtr->PalettedBuf == NULL) + { + ftPtr->PalettedBuf = (unsigned char*) malloc(128*128*4); + } + + if (ftPtr->RGBBuf == NULL) + { + if (ftPtr->PalettedBuf == NULL) + { + return; + } + + ftPtr->RGBBuf = &ftPtr->PalettedBuf[128*128]; + } +} + +void UpdateFMVTexture(FMVTEXTURE *ftPtr) +{ + unsigned char *srcPtr; + unsigned char *dstPtr; + + int pixels = 128*96;//64*48;//256*192; + + // get the next frame into the paletted buffer + if (!NextFMVTextureFrame(ftPtr, &ftPtr->PalettedBuf[0])) + { + return; + } + + // update the texture palette + UpdateFMVTexturePalette(ftPtr); + + srcPtr = &ftPtr->PalettedBuf[0]; + dstPtr = &ftPtr->RGBBuf[0]; + + // not using paletted textures, so convert to rgb manually + do + { + unsigned char source = (*srcPtr++); + dstPtr[0] = ftPtr->SrcPalette[source].peRed; + dstPtr[1] = ftPtr->SrcPalette[source].peGreen; + dstPtr[2] = ftPtr->SrcPalette[source].peBlue; + + dstPtr += 3; + } while(--pixels); + + // update the opengl texture + pglBindTexture(GL_TEXTURE_2D, ftPtr->ImagePtr->D3DTexture->id); + + pglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 96, GL_RGB, GL_UNSIGNED_BYTE, &ftPtr->RGBBuf[0]); +} + +void ReleaseFMVTexture(FMVTEXTURE *ftPtr) +{ + ftPtr->MessageNumber = 0; + + //if (FMVTexture[i].SrcTexture) + //{ + // ReleaseD3DTexture(FMVTexture[i].SrcTexture); + // FMVTexture[i].SrcTexture=0; + //} + //if (FMVTexture[i].SrcSurface) + //{ + // ReleaseDDSurface(FMVTexture[i].SrcSurface); + // FMVTexture[i].SrcSurface=0; + //} + //if (FMVTexture[i].DestTexture) + //{ + // ReleaseD3DTexture(FMVTexture[i].DestTexture); + // FMVTexture[i].DestTexture = 0; + //} + + if (ftPtr->PalettedBuf != NULL) + { + free(ftPtr->PalettedBuf); + ftPtr->PalettedBuf = NULL; + } + + ftPtr->RGBBuf = NULL; +} -- cgit v1.3