JD2022-TU1/main/extern/Camcam/LIBS/Mixer/SCENE_Manager.cpp

603 lines
14 KiB
C++

#define _WIN32_WINNT 0x0501
#include "TRACK.h"
#include "SCENE.h"
#include "ShotTracker.h"
#ifdef ONLINE_MODE
#include "account.h"
#endif
#include <Windows.h>
u32 FILEIO_IsModePackedEXE();
void FreePrevs();
extern void DW_WatchDirectoryCheck();
#ifdef ONLINE_MODE
extern CCamCamAccount Account;
#endif
int frameTime = 0;
void WORLD::FrameCall()
{
u32 Counter;
u32 ulMustReloadTM = 0;
extern u32 IsMinimized;
extern int mouseX;
extern int mouseY;
if (!IsMinimized)
{
RECT Rect;
POINT Point;
GetClientRect(OwnerHwnd , &Rect);
float CX = (float)XSize / (float)(Rect.right - Rect.left);
float CY = (float)YSize / (float)(Rect.bottom - Rect.top);
GetCursorPos(&Point);
ScreenToClient(OwnerHwnd, &Point);
mouseX = (int)(CX * (float)Point.x); // horizontal position of cursor
mouseY = (int)(CY * (float)Point.y); // vertical position of cursor
} else
{
mouseX = -1;
mouseY = -1;
}
memset(&FrmSmooth, 0, sizeof(FrmSmooth));
FrmQuatMode = 0;
if (LuaScriptManage)
{
if (LuaScriptManage < 0)
LuaSetLevel(LuaScriptManage);
else
{
BOOL clearAll = 2;
switch (LuaScriptManage)
{
case 1:
break;
case 2:
LuaSetLevel(1);
break;
case 255:
clearAll = 0;
LuaSetLevel(0);
break;
}
#ifdef USER_MODE
BOOL IsFileAllowed(char *filename, bool fromLua);
if (IsFileAllowed(ScriptNameStack[currentScript], 0))
LoadLua(ScriptNameStack[currentScript], clearAll);
else
{
void displayIntegrityError(int num);
displayIntegrityError(4);
exit(0);
}
#else
LoadLua(ScriptNameStack[currentScript], clearAll);
#endif
}
LuaScriptManage = 0;
}
if (*LuaScriptRestart)
{
extern void API_RESTART(char* luaFileToBoot);
API_RESTART(LuaScriptRestart);
}
STOP_RASTER(TheRest);
START_RASTER(Media);
PickReportCurrent.PickFrozed ++;
TrackRes = 0;
for (u32 Priority = 0 ;Priority < 4;Priority++)
{
for (Counter = 0 ; Counter < MAX_INPMED ; Counter++)
{
if (ID_MEDIA[Counter])
{
ID_MEDIA[Counter]->ulMediaRedirectValue = -1;
}
if (ID_MEDIA[Counter] && (ID_MEDIA[Counter]->Priority == Priority) && (ID_MEDIA[Counter]->VirtuallyDestroyed == 0))
{
if (SkipFunctions & SKIP_MEDIA) continue;
if ((ID_MEDIA[Counter]->GetType() == IOtype_AVI) &&
(SkipFunctions & SKIP_AVI)) continue;
if ((ID_MEDIA[Counter]->GetType() == IOtype_REVR) &&
(SkipFunctions & SKIP_REVERSE)) continue;
if ((ID_MEDIA[Counter]->GetType() == IOtype_CAM) &&
(SkipFunctions & SKIP_CAMERA)) continue;
u32 FrameRaster = timeGetTime();
u32 Framed = ID_MEDIA[Counter]->FRAME();
ID_MEDIA[Counter]->HasBeenUpdated = Framed;
if ((Framed || (MediaToTrack == Counter)))
{
if (Framed && (MediaToTrack == Counter))
{
static u32 u32stticLastTime = 0;
if (u32stticLastTime)
{
u32stticLastTime = timeGetTime() - u32stticLastTime;
trackMiliseconds_x_16 -= trackMiliseconds_x_16>>4;
trackMiliseconds_x_16 += (u32stticLastTime)<<4;
}
else
{
trackMiliseconds_x_16 = (1000 / 30)<<8;
}
u32stticLastTime = timeGetTime();
}
if (MediaToTrack == Counter && ID_MEDIA[MediaToTrack]->Image.GetBase() && !(SkipFunctions & SKIP_TRACKER))
{
STOP_RASTER(Media);
START_RASTER(Tracker);
/* Save Tracked media Picture */
#define SAVE_TRACKED_MEDIA
#ifdef SAVE_TRACKED_MEDIA
ulMustReloadTM = 0;
u32 Size;
Size = ID_MEDIA[Counter]->Image.PITCH * ID_MEDIA[Counter]->Image.SY * 4;
if (Size)
{
if (Size != SaveTrackedMediaSize)
{
if (SaveTrackedMedia) CC_free(SaveTrackedMedia);
SaveTrackedMedia = (u32 *)CC_malloc(Size);
SaveTrackedMediaSize = Size;
}
memcpy(SaveTrackedMedia,ID_MEDIA[MediaToTrack]->Image.GetBase(),Size);
}
#endif
SetCurrentFocale(ID_MEDIA[Counter]->MediaFocale);
extern void *pZBUFFERMEDIA;
if (ID_MEDIA[Counter]->GetType() == IOtype_PRIMESENS)
TrackRes = TRACK_OneFrameCall(ID_MEDIA[Counter]->Image,&((INPUT_IO *)ID_MEDIA[Counter]->GetData(0))->Image);
else
TrackRes = TRACK_OneFrameCall(ID_MEDIA[Counter]->Image,NULL);
STOP_RASTER(Tracker);
START_RASTER(Media);
if (TrackRes)
{
if ((ID_MEDIA[Counter]->ulAssociatedTextureIndex != -1) )
{
ulMustReloadTM = 1;
DI->UpdateTexture_BM_2_HW(ID_MEDIA[Counter]->ulAssociatedTextureIndex);
}
}
} else
if ((ID_MEDIA[Counter]->ulAssociatedTextureIndex != -1) )
{
DI->UpdateTexture_BM_2_HW(ID_MEDIA[Counter]->ulAssociatedTextureIndex);
}
}
ID_MEDIA[Counter]->FrameRaster = (float)(timeGetTime() - FrameRaster) * 0.1f + ID_MEDIA[Counter]->FrameRaster * 0.9f;
}
}
if (Priority == 0)
{
/* Parse animated ID's */
for (Counter = 0 ; Counter < MAX_ID ; Counter++)
{
if (ID_TABLE[Counter] && ID_TABLE[Counter]->SF_U.IsAnimatedTrack)
{
u32 TM;
TM = ID_TABLE[Counter]->AnimatedMedia;
if ((TM != -1) && (TM < MAX_INPMED) && ID_MEDIA[TM])
{
SetCurrentFocale(ID_MEDIA[TM]->MediaFocale);
if (ID_MEDIA[TM]->Tracks)
{
//ID_MEDIA[TM]->Tracks->Get(
// ID_TABLE[Counter]->AnimatedMedia_SubIndex,
// ID_MEDIA[TM]->ulCurrentFrame+ID_MEDIA[TM]->lCurrentTrackOffset,
// &ID_TABLE[Counter]->CurrentMatrix_U);
ID_MEDIA[TM]->Tracks->Get(
ID_TABLE[Counter]->AnimatedMedia_SubIndex,
ID_MEDIA[TM]->dCurrentTime*ID_MEDIA[TM]->dAvgFramePerSecond,
&ID_TABLE[Counter]->CurrentMatrix_U);
ID_MEDIA[TM]->Tracks->GetScale(
ID_TABLE[Counter]->AnimatedMedia_SubIndex,
&ID_TABLE[Counter]->vModelScale);
}
//if (ID_TABLE[CurrentID] && ID_TABLE[CurrentID]->SF_U.DrawMesh)
if (ID_TABLE[Counter] && ID_TABLE[Counter]->SF_U.DrawMesh)
{
ID_TABLE[Counter]->p_UsedMesh->MatrixSrc = ID_TABLE[Counter]->CurrentMatrix_U;
ID_TABLE[Counter]->p_UsedMesh->Render(ID_MEDIA[TM]->Image, 0xffff, 1,1);
DI->UpdateTexture_BM_2_HW(ID_MEDIA[TM]->ulAssociatedTextureIndex);
}
}
}
}
}
}
STOP_RASTER(Media);
PickReportCurrent.PickFrozed --;
/* Picking */
extern s32 mouseX;
extern s32 mouseY;
DI->MousePicking.x = mouseX;
DI->MousePicking.y = mouseY;
DI->PickingEnable = 0;
// Process events
memcpy(&PickReportToWatch , &PickReportResult , sizeof(PickReportResult));
if (!CaptureMode)
{
if (memcmp(&PickReportFinal, &PickReportResult, sizeof(PickReportResult )))
{
if (luaScriptTable[currentScript])
{
LuaProcessEvent(EVT_onRollOut);
LuaProcessEvent(EVT_onRollOver);
}
memcpy(&PickReportFinal , &PickReportResult, sizeof(PickReportResult ));
}
}
#ifndef TEST_PHILIPPE
extern DWORD CurrentSessionID;
static int currentUserNameCounter = 0;
if (!(currentUserNameCounter++ & 0xFF))
{
if (CurrentSessionID != WTSGetActiveConsoleSessionId())
{
CurrentSessionID = WTSGetActiveConsoleSessionId();
LuaProcessEvent(EVT_onSessionChange);
}
}
#endif
LuaEventsExec();
memset(&PickReportCurrent,0,sizeof(PickReportCurrent));
memset(&PickReportResult,0,sizeof(PickReportResult));
u32 TextOrigin = DI->RectifyTextOrigin;
if (bManualBoot & !oldManualBoot)
{
if (ID_MEDIA[MediaToTrack])
{
DI->ClearZ();
DI->SetBackGround(ID_MEDIA[MediaToTrack]->ulAssociatedTextureIndex);
}
} else {
START_RASTER(Script);
SceneScript_EXECUTE();
STOP_RASTER(Script);
LuaProcessEvent(EVT_loop);
LuaEventsExec();
DI->RectifyTextOrigin = 0;
DI->ClearZ();
DI->SetQuadRot(0,NULL,NULL);
LUA_DEBUG();
#ifndef USER_MODE
if (*LuaErrors)
{
int nbLines = 0;
char *luaErrorPtr = LuaErrors;
while (strchr(luaErrorPtr, '\n'))
{
luaErrorPtr = strchr(luaErrorPtr, '\n') + 1;
nbLines++;
}
DI->DrawText((unsigned char *)LuaErrors, 0, nbLines*16, 1, 1, 0xff000000 | RGB(255,0,0));
}
#endif
if (SkipFunctions & SKIP_NOMOSAIC)
{
DI->ClearZ();
Mosaique();
}
}
InputHookPickEnd();
/* Restore Tracked media Picture */
#ifdef SAVE_TRACKED_MEDIA
if (ulMustReloadTM && ID_MEDIA[MediaToTrack])
{
u32 Size;
Size = ID_MEDIA[MediaToTrack]->Image.PITCH * ID_MEDIA[MediaToTrack]->Image.SY * 4;
if (Size && (Size == SaveTrackedMediaSize))
{
memcpy(ID_MEDIA[MediaToTrack]->Image.GetBase(),SaveTrackedMedia,Size);
}
}
#endif
RS Nullmlml;
GLOB_SetDefaultRS(&Nullmlml);
DI->SetRS(&Nullmlml,-1);
if (bDrawConsole) DrawConsole();
DI->SetViewport(0,0,XSize,YSize);
DI->FORCE_RENDER_FLAG = 0;
STOP_RASTER(Global);
DrawRasters(bDrawRasters);
START_RASTER(Global);
#ifndef SKIMMED_NET
ConnectedNumber = GetBitNumber(NetObj->ValidMask);
NetObj->OneFrameCall();
#endif
RenderFlip();
DI->RectifyTextOrigin = TextOrigin;
START_RASTER(TheRest);
DW_WatchDirectoryCheck();
FlashCom_OneFrame();
RenderingCounter++;
RestoreAllSmallScene(false);
ResetMaterialOverload();
}
extern int DW_WatchDirectory(char *DirectoryToWatch,void Callback(void *,char *),void *);
extern int DW_UnWatchDirectory();
// Not used, DW_WatchDirectory() calls a specific callback
void DW_WatchDirectory_CALLBACK(void *pSCN,char *STR)
{
}
WORLD *CreateWORLD(HWND hwnd,u32 SizeX,u32 SizeY, char *iniFile)
{
WORLD *NS;
#ifndef NO_DIR_CREATE
if (!FILEIO_IsModePackedEXE())
{
CreateDirectory(".\\Mads\\",NULL);
CreateDirectory(".\\IDs\\",NULL);
CreateDirectory(".\\Anims\\",NULL);
CreateDirectory(".\\Particles\\",NULL);
CreateDirectory(".\\Sounds\\",NULL);
CreateDirectory(".\\TAG\\",NULL);
}
#endif
SHOTS_CLASS::Init();
extern void ComputeBitNum();
ComputeBitNum();
NS = new(WORLD);
#ifndef SKIMMED_NET
NS->NetObj = new(NET_IO);
NS->NetObj->NET_Init();
NS->NetObj->Owner = NS;
#endif
NS->SceneScript_INIT();
NS->FlashCom_Init();
u32 Counter = 0;
NS->OwnerHwnd = hwnd;
NS->hbmScreen = NULL;
NS->hdcCompatible = NULL;
extern int D3DDisplay;
char d3d[64];
if (D3DDisplay < 0)
{
if (iniFile && NS->GetIniValue(iniFile, "d3d", d3d))
D3DDisplay = *d3d - '0';
else
D3DDisplay = -D3DDisplay-1;
} else if (iniFile)
{
sprintf(d3d, "%i", D3DDisplay);
NS->SetIniValue(iniFile, "d3d", d3d);
NS->SaveIniFile(iniFile);
}
if (D3DDisplay == 2)
NS->DI = CreateNulObject(hwnd,SizeX,SizeY);
else
{
if (D3DDisplay == 1)
NS->DI = CreateD3DObject(hwnd,SizeX,SizeY);
else
NS->DI = CreateOglObject(hwnd,SizeX,SizeY);
}
NS->DI->MotherClass = NS;
NS->WebCamXInvert = 1;
NS->MediaDico.Init();
NS->luaLoaddedFilesDICO.Init();
NS->PGeneratorDico.Init();
NS->SmallSceneDico.Init();
NS->PackFileDico.Init();
NS->AnimDico.Init();
NS->CollisionDico.Init();
NS->XSize = SizeX;
NS->YSize = SizeY;
NS->FrameBufferResult.SetSize(SizeX, SizeY);
NS->MediaToTrack = 0;
NS->ulMustUpdateFrameBufferResult = 0;
NS->IniFileDico.Init();
NS->ResetMaterialOverload();
{
memset(NS->ID_TABLE,0,sizeof(NS->ID_TABLE));
NS->ID_New();
//NS->ID_AutoStart(NS->ID_New());
}
NS->WFlags = LUA_AUTO_RELOAD;
#ifndef USER_MODE
//#ifndef ONLINE_MODE
// Must not auto reload lua files when downloading an asset
DW_WatchDirectory(".\\",&DW_WatchDirectory_CALLBACK,(void*)NS);
//#endif
#endif
NS->forceAdVisibility = false;
//NS->bDrawConsole = 1;
//void CreateTags();
//CreateTags();
return NS;
}
void WORLD::ChangeDriver(u32 NewIndex)
{
if (NewIndex>2) return;
if (DI->GetDriverType() == NewIndex) return;
for (u32 Counter = 0 ; Counter < MAX_INPMED; Counter++)
{
if (ID_MEDIA[Counter])
{
if (ID_MEDIA[Counter]->ulAssociatedTextureIndex != -1)
{
if (ID_MEDIA[Counter]->GetType() == IOtype_LAYER)
DI->DestroyLayerTexture(ID_MEDIA[Counter]->ulAssociatedTextureIndex);
else
DI->DestroyTexture(ID_MEDIA[Counter]->ulAssociatedTextureIndex);
}
}
}
u32 RectifyTextOrigin = DI->RectifyTextOrigin;
DI->Destroy();
delete DI;
DI = NULL;
if (NewIndex == 2) DI = CreateNulObject(OwnerHwnd,XSize,YSize);
if (NewIndex == 1) DI = CreateD3DObject(OwnerHwnd,XSize,YSize);
if (NewIndex == 0) DI = CreateOglObject(OwnerHwnd,XSize,YSize);
if (!DI) DI = CreateOglObject(OwnerHwnd,XSize,YSize);
DI->MotherClass = this;
for (u32 Counter = 0 ; Counter < MAX_INPMED; Counter++)
{
if (ID_MEDIA[Counter])
{
u32 LAYER_GetIndex(INPUT_IO *Ret);
if (ID_MEDIA[Counter]->GetType() != IOtype_LAYER)
ID_MEDIA[Counter]->ulAssociatedTextureIndex = DI->CreateTexture(&ID_MEDIA[Counter]->Image,ID_MEDIA[Counter]->ulColorMode);
else
ID_MEDIA[Counter]->ulAssociatedTextureIndex = DI->CreateLayerTexture(&ID_MEDIA[Counter]->Image,LAYER_GetIndex(ID_MEDIA[Counter]));
}
}
DI->RectifyTextOrigin = RectifyTextOrigin ;
return;
}
u32 DestroyWORLD(WORLD *pW)
{
if (pW)
{
TerminateThread(pW->FlashthreadHandle, 0);
FreePrevs();
/* Kill tracking thread */
pW->DestroyTrackeur();
pW->DestroyAllMedia();
pW->DestroyAllPGenerator();
pW->DestroyAllAnim();
pW->DestroyAllSMSC();
pW->DestroyAllAnim();
pW->FlashCom_Destroy();
if (pW->WSPC) WSPC_Destroy(pW->WSPC);
pW->WSPC = NULL;
u32 Counter = MAX_ID;
while (Counter--)
{
pW->ID_Destroy(Counter);
}
Counter = MAX_INIFILES;
while (Counter--)
{
pW->IniFiles[Counter].Destroy();
}
pW->luaLoaddedFilesDICO.Destroy();
pW->MediaDico.Destroy();
pW->PGeneratorDico.Destroy();
Counter = MAX_INIFILES;
while (Counter--)
pW->IniFiles[Counter].Destroy();
pW->IniFileDico.Destroy();
pW->SmallSceneDico.Destroy();
pW->AnimDico.Destroy();
pW->PackFileDico.Destroy();
pW->PackFileDicoNeredondance.Destroy();
pW->FrameBufferResult.Delete();
if (pW->SaveTrackedMedia) CC_free(pW->SaveTrackedMedia);
pW->LuaSetLevel(0);
if (pW->ComputingBuffer2) CC_free(pW->ComputingBuffer2);
if (pW->ComputingBuffer_Normales) CC_free(pW->ComputingBuffer_Normales);
if (pW->ComputingBuffer_UV) CC_free(pW->ComputingBuffer_UV);
if (pW->ComputingBuffer) CC_free(pW->ComputingBuffer);
if (pW->pRenderDrawSort) CC_free(pW->pRenderDrawSort);
pW->RenderDrawSortNumberMax = 0;
if (pW->hbmScreen) DeleteObject(pW->hbmScreen);
if (pW->hdcCompatible) DeleteDC(pW->hdcCompatible);
pW->hbmScreen = NULL;
pW->hdcCompatible = NULL;
MicroInStop(&pW->microIn);
MicroOutStop(&pW->microOut);
delete pW->DI; pW->DI = NULL;
#ifndef SKIMMED_NET
pW->NetObj->NET_Close();
delete pW->NetObj; pW->NetObj = NULL;
#endif
delete pW;
}
extern Subfile* subfiles;
if (subfiles)
{
CC_free(subfiles);
subfiles = 0;
}
#ifndef USER_MODE
DW_UnWatchDirectory(); // dir monitor callback would crash in UNIC_Dico when quitting
#endif
return 0;
}
WORLD *MyCreateWORLD(HWND HwNd,u32 SizeX,u32 SizeY, char *iniFile)
{
return CreateWORLD(HwNd,SizeX,SizeY,iniFile);
}