reman3/Rayman_X/cpa/tempgrp/GAM/ToolCam.c

458 lines
15 KiB
C
Raw Blame History

#define D_CineInfo_StructureDefine
#include "ToolsCPA.h"
#include "Structur/State.h"
#include "Actions/AllActs.h"
#include "Actions/collset.h"
#include "structur/StdObjSt.h"
#include "structur/engmode.h"
#include "structur/objects.h"
#include "structur/MemGame.h"
#include "GameEng.h"
#include "ObjType.h"
#include "ia_dnm.h"
#include "ToolCam.h"
#ifdef SOUND_FOR_3DOS
#include "Micros.h"
#endif
#include "TypeCam.h"
#include "ToolMatr.h"
#include "collisio.h"
#include "ZdxStuff.h"
#include "ZeMem.h"
/****************************/
/* ANNECY MT - 14/09/98 { to display info on Wnd screen*/
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
extern void DisplayPolices (char * _szText , long _lX , long _lY);
#define GLI_vDisplayPolices(Text,X,Y) DisplayPolices((char*)(Text),X,Y)
#endif
/* END ANNECY MT }*/
/****************************/
/* ANNECY AV DEMO {*/
#ifndef U64
#include "Specif/Demos.h"
#endif
/* END ANNECY AV }*/
/*
*=================================================================================================
* Get pointer on the ViewportManagement Structure
*=================================================================================================
*/
tdxHandleToViewportManagement CAM_fn_p_stGetViewPortManagement(long _lViewportNumber)
{
if
(
(_lViewportNumber > CAM_Nb_Viewport)
|| (_lViewportNumber == (long) CAM_e_NoViewport)
)
return NULL;
else
return(&g_stEngineStructure.a_hViewportArray[_lViewportNumber - 1]);
}
/*
*=================================================================================================
* Return handle of game's camera and pointer on camera's structur
*=================================================================================================
*/
HIE_tdxHandleToSuperObject CAM_fn_hGetActiveCamera(long _lViewportNumber)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
tdxHandleToViewportManagement hViewport;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hViewport = CAM_fn_p_stGetViewPortManagement(_lViewportNumber);
return (hViewport->hCamera);
}
/*
*=================================================================================================
* Assign a camera to a viewport
*=================================================================================================
*/
void CAM_fn_vAssignCameraToAViewport(long _lViewportNumber, HIE_tdxHandleToSuperObject _hCamera)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
tdxHandleToViewportManagement hViewport;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hViewport = CAM_fn_p_stGetViewPortManagement(_lViewportNumber);
hViewport->hCamera = _hCamera;
hViewport->bValid = TRUE;
}
/*
*=================================================================================================
* Reinitialization of camera's lists
*=================================================================================================
*/
void CAM_fn_vReInitCameras(void)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
long i;
tdstNodeCamera *p_stTempNodeCamera;
tdstNodeCamera *p_stNextNodeCamera;
HIE_tdxHandleToSuperObject hSuperObject ;
tdxHandleToViewportManagement hViewport;
MS_tdxHandleToInternalCineinfo hIntCineinfo;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Some inits */
for (i = 1; i <= CAM_Nb_Viewport; i++)
{
hViewport = CAM_fn_p_stGetViewPortManagement(i);
hViewport->hTempCamera = NULL;
hViewport->bValid = FALSE;
}
LST2_M_DynamicForEachMovingElementOf(&g_stEngineStructure.hCameraList,p_stTempNodeCamera, p_stNextNodeCamera, i)
{
if (p_stTempNodeCamera != NULL)
{
/* Search the SuperObject with HIE_C_ulActor type */
hSuperObject=p_stTempNodeCamera->p_stSuperObjectCamera;
hIntCineinfo = M_GetCineinfo(hSuperObject,Init);
if
(
(hIntCineinfo -> bIsActive)
&& (hIntCineinfo -> eTypeOfViewport != CAM_e_NoViewport)
)
{
CAM_fn_vAssignCameraToAViewport
(
hIntCineinfo -> eTypeOfViewport,
hSuperObject
);
}
}
}
}
/*
*=================================================================================================
* Initialization of camera's lists
*=================================================================================================
*/
extern void CAM_fn_vLoadCameraConstants(void);
void CAM_fn_vInitCameras(void)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
long lSize;
long i;
tdxHandleToViewportManagement hViewport;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Allocation */
lSize = sizeof(struct tdstViewportManagement_) * CAM_Nb_Viewport;
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeViewPortArray , 0 );
g_stEngineStructure.a_hViewportArray = (tdxHandleToViewportManagement)M_p_GameMallocInHLM(lSize);
CAM_fn_vReInitCameras();
for (i = 1; i <= CAM_Nb_Viewport; i++)
{
hViewport = CAM_fn_p_stGetViewPortManagement(i);
GLI_xCreateCamera(&hViewport->p_stCamera,GLI_C_lPersCamWithoutDistorsion);
/*GLI_xSetCameraAspectAndRatio(hViewport->p_stCamera, MTH_M_xFloatToReal(1.5f), MTH_C_ONE);*/
GLI_xSetCameraAspectAndRatio(hViewport->p_stCamera, MTH_M_xFloatToReal(1.5f), MTH_M_xFloatToReal(0.75f));
}
CAM_fn_vLoadCameraConstants();
}
/*
*=================================================================================================
* Test if the super object is a camera
*=================================================================================================
*/
ACP_tdxBool CAM_fn_bSuperObjectIsACamera(HIE_tdxHandleToSuperObject _h_SprObj)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToCineinfo h_Cineinfo;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if(HIE_fn_ulGetSuperObjectType(_h_SprObj) != HIE_C_ulActor)
return FALSE;
else
{
h_Cineinfo = M_GetMSHandle(_h_SprObj,Cineinfo);
if ((struct tdstCineinfo_ *) h_Cineinfo == NULL)
return FALSE;
else
return TRUE;
}
}
/*
*=================================================================================================
* Actualize a viewport
*=================================================================================================
*/
void CAM_fn_vActualizeAViewport(long _lViewport)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
tdxHandleToViewportManagement hViewport;
struct GLI_tdstCamera_ *p_Camera;
POS_tdstCompletePosition stMatrix;
MTH_tdxReal xAngle,xRatio, xFocal;
MTH3D_tdstVector I,J,K;
POS_tdstCompletePosition *p_stCamera;
HIE_tdxHandleToSuperObject hCamera;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
hViewport = CAM_fn_p_stGetViewPortManagement(_lViewport);
hCamera = hViewport->hCamera;
p_stCamera = HIE_fn_hGetSuperObjectGlobalMatrix(hCamera);
POS_fn_vGetRotationMatrix( p_stCamera, &I, &J, &K );
/* POS_fn_vSetType(&stMatrix, POS_C_xCompletePosition);*/
POS_fn_vCopyMatrix( &stMatrix, p_stCamera );
MTH3D_M_vNegVector( &J, &J );
POS_fn_vSetRotationMatrix( &stMatrix, &I, &K, &J );
POS_fn_vInvertIsoMatrix( &stMatrix, &stMatrix );
#if defined(WIN32)
WaitForSingleObject(g_stEngineStructure.hDrawSem, INFINITE);
#endif /*WIN32*/
p_Camera = hViewport->p_stCamera;
GLI_xSetCameraMatrix(p_Camera, &stMatrix);
GLI_xGetCameraAspectAndRatio(p_Camera, &xAngle, &xRatio);
xFocal = M_GetMSHandle(hCamera, Cineinfo)->hWork->xFocal;
if (MTH_M_bIsNull(xFocal))
xFocal = M_GetMSHandle(hCamera, Cineinfo)->hCurrent->xFocal;
if (!MTH_M_bEqual(xFocal, xAngle))
{
GLI_xSetCameraAspectAndRatio(p_Camera, xFocal, xRatio);
/* XB 23/06/99 */
#ifndef U64
GLI_xSetViewportCamera(g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport, p_Camera);
GLI_xAdjustCameraToViewport(g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport, p_Camera);
#else /* U64 */
GLI_xSetViewportCamera(NULL, NULL, p_Camera);
GLI_xAdjustCameraToViewport(NULL, NULL, p_Camera);
#endif /* U64 */
/* End XB 23/06/99 */
}
else
/* XB 23/06/99 */
#ifndef U64
GLI_xSetViewportCamera(g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport, p_Camera);
#else /* U64 */
GLI_xSetViewportCamera(NULL, NULL, p_Camera);
#endif /* U64 */
/* End XB 23/06/99 */
#if defined(WIN32)
ReleaseSemaphore(g_stEngineStructure.hDrawSem,1,NULL);
#endif /*WIN32*/
}
/*
*=================================================================================================
* Management of all cameras in the game
*=================================================================================================
*/
void CAM_fn_vCameraManagement(void)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
tdxHandleToNodeCamera p_stNodeCamera;
long i;
tdxHandleToViewportManagement hViewport;
HIE_tdxHandleToSuperObject hCamera;
MS_tdxHandleToInternalCineinfo hIntCineinfo;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*
* Treat each camera.
*/
/* ANNECY AV DEMO {*/
#ifndef U64
if(g_DEMO_KeybTest != DEMO_PLAY)
#endif
/* END ANNECY AV }*/
{
LST2_M_DynamicForEachElementOf(&g_stEngineStructure.hCameraList, p_stNodeCamera, i)
{
if (p_stNodeCamera != NULL)
{
hCamera = p_stNodeCamera->p_stSuperObjectCamera;
if(M_GetMSHandle(hCamera, Cineinfo)->ucVolIAFlags & C_VolIAFlags_CurrentAlreadyCopiedInWork)
{
hIntCineinfo = M_GetCineinfo(hCamera, Work);
}
else
{
hIntCineinfo = M_GetCineinfo(hCamera, Current);
}
if((hIntCineinfo->bIsActive) || (hIntCineinfo->eTypeOfViewport != CAM_e_NoViewport))
{
if(hIntCineinfo->eTypeOfViewport != CAM_e_NoViewport)
fn_vTreatCameraHierarchy(p_stNodeCamera->p_stSuperObjectCamera, TRUE);
else
fn_vTreatCameraHierarchy(p_stNodeCamera->p_stSuperObjectCamera, FALSE);
}
}
}
}
/*
* Actualise all viewports.
*/
for(i = CAM_Nb_Viewport; i > 0; i--)
{
hViewport = CAM_fn_p_stGetViewPortManagement(i);
if(hViewport->bValid)
CAM_fn_vActualizeAViewport(i);
}
}
/*
*=================================================================================================
* Display camera parameters
*=================================================================================================
*/
#if !defined(PRESS_DEMO)
void CAM_vDisplayInfo(void)
{
#ifndef RETAIL
#ifndef U64
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
MS_tdxHandleToDynam h_Dynam = NULL;
DNM_tdstDynamics *p_stDynamics = NULL;
DNM_tdstReport *p_stReport = NULL;
MTH_tdxReal xNorm;
MTH3D_tdstVector stShifting;
unsigned char szLine[100];
long lX;
long lY;
MTH3D_tdstVector *p_stTarget;
HIE_tdxHandleToSuperObject pSuperObjectCamera;
MS_tdxHandleToCineinfo hCineInfo;
MS_tdxHandleToInternalCineinfo hWorkCI;
MTH3D_tdstVector stSightAxis;
MTH3D_tdstVector stFirstComplementaryAxis;
MTH3D_tdstVector stSecondComplementaryAxis;
MTH3D_tdstVector stTempVector, stTempVector1, stTempVector2;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
pSuperObjectCamera = CAM_fn_hGetActiveCamera(CAM_e_MainViewport);
hCineInfo = M_GetMSHandle(pSuperObjectCamera, Cineinfo);
h_Dynam = M_GetMSHandle(pSuperObjectCamera, Dynam);
if(h_Dynam)
p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam);
if(p_stDynamics)
p_stReport = DNM_M_p_stDynamicsGetReport(p_stDynamics);
if (!(hCineInfo->ucPerIAFlags & C_PerIAFlags_ShowInfo))
return;
hWorkCI = hCineInfo->hWork;
lX = 320;
lY = 0;
p_stTarget = &hWorkCI->stShiftTarget;
sprintf ((char *) szLine, "ShiftTgt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f<EFBFBD>%.2f", p_stTarget->xX, p_stTarget->xY, p_stTarget->xZ);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
p_stTarget = &hWorkCI->stShiftPos;
sprintf ((char *) szLine, "ShiftPos<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f<EFBFBD>%.2f", p_stTarget->xX, p_stTarget->xY, p_stTarget->xZ);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
sprintf((char *) szLine, "Distance<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f<EFBFBD>%.2f<EFBFBD>%.2f", hWorkCI->xDistMin, hWorkCI->xDistMax, hWorkCI->xBoundDistMin, hWorkCI->xBoundDistMax);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
sprintf ((char *) szLine, "Alpha<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f", hWorkCI->xAngleAlpha, hWorkCI->xAngleShiftAlpha);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
sprintf ((char *) szLine, "Theta<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f", hWorkCI->xAngleTheta, hWorkCI->xAngleShiftTheta);
GLI_vDisplayPolices( szLine, lX , lY);
lY += 16;
sprintf ((char *) szLine, "ZMinMax<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f", hWorkCI->xZMin, hWorkCI->xZMax);
GLI_vDisplayPolices( szLine, lX , lY);
lY += 16;
/* Sight axis of targeted perso */
if(hWorkCI->hSuperObjectTargeted)
{
fn_vGetPersoSightAxisSystem
(
hCineInfo,
&stSightAxis,
&stFirstComplementaryAxis,
&stSecondComplementaryAxis
);
sprintf((char *) szLine, "Sight<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.2f<EFBFBD>%.2f<EFBFBD>%.2f", stSightAxis.xX, stSightAxis.xY, stSightAxis.xZ);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
}
/* Delta T */
sprintf((char *) szLine, "DeltaT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.4f", M_xGetUsefulDeltaTimeInSeconds(g_stEngineStructure.stEngineTimer));
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
/* Real move camera */
if(p_stReport != NULL)
{
MTH3D_M_vCopyVector(&stShifting, DNM_M_p_stReportGetLastMove(p_stReport));
xNorm = MTH3D_M_xNormVector(&stShifting);
sprintf((char *) szLine, "RealMove<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%.4f", xNorm);
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
}
/* Distance to target */
if(hWorkCI->hSuperObjectTargeted)
{
if (hWorkCI->hSuperObjectTargeted)
{
POS_fn_vGetTranslationVector
(
HIE_fn_hGetSuperObjectGlobalMatrix(pSuperObjectCamera),
&stTempVector1
);
CAM_fn_vAveragePosition(hCineInfo, CAM_g_stCameraConstants.xAverageForComputePos, &stTempVector);
POS_fn_vGetTranslationVector
(
HIE_fn_hGetSuperObjectGlobalMatrix(hWorkCI->hSuperObjectTargeted),
&stTempVector2
);
MTH3D_M_vSubVector(&stTempVector, &stTempVector, &stTempVector1);
MTH3D_M_vSubVector(&stTempVector2, &stTempVector2, &stTempVector1);
sprintf((char *) szLine, "DAver<EFBFBD>DReal<EFBFBD><EFBFBD>%.2f %.2f", MTH3D_M_xNormVector(&stTempVector), MTH3D_M_xNormVector(&stTempVector2));
}
GLI_vDisplayPolices(szLine, lX , lY);
lY += 16;
}
#endif /*!U64*/
#endif /*!RETAIL*/
}
#endif /* PRESS_DEMO */