/*For game material*/ #include "GMT/GmtHandl.h" /*Include For "Sector.h"*/ #include "ACP_Base.h" #include "MTH.h" #include "GEO.h" #include "GLI.h" #include "PCS.h" #include "PO.h" /*XB980821*/ #ifndef D_THROW_IPO #include "IPO.h" #include "ISI.h" #endif /* D_THROW_IPO */ /*End XB*/ #undef extern /*for PO (and AI)*/ #include "SPO.h" #include "LST.h" /*For the sound*/ #include "SND.h" #include "SCT.h" #include "PRF.h" /* Oliv' - 25/05/1999 */ #if defined(_U64_GLI_BENCH_) extern ACP_tdxBool GLIBENCH_g_bColMap; extern void GLIBENCH_SCT_fn_vSendCollisionSectorWhereIAmToViewport( MTH3D_tdstVector *_p_stAbsolutePositionOfCamera, struct GLD_tdstViewportAttributes_ *_p_stVpt, HIE_tdxHandleToSuperObject _hSprObjSector, long _lDrawMask ); #endif /* _U64_GLI_BENCH_ */ /* EndOfOliv' */ /*Constants*/ #define SCT_C_xNbMaxOfMirrorsInVisibleSectors 6 #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ ACP_tdxBool bViewingInMirror; #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ void AGO_vProcessAllParts(GLD_tdstViewportAttributes *_p_stViewport); void SECT_fn_vSendFogToViewport(struct GLD_tdstViewportAttributes_ *_p_stVpt,HIE_tdxHandleToSuperObject _hSprObjSector); void fn_vSendOneModuleToViewPort(GLD_tdxHandleToViewportAttributes _hVpt,HIE_tdxHandleToSuperObject _hSprObj,long _lDrawMask); #if !defined(U64) /*Prototypes*/ void SCT_fn_vGetSymMatrixOfCameraInMirror(GEO_tdxHandleToMatrix hMatrixOfCamera, GEO_tdxHandleToMatrix hMatrixOfSymCamera, MTH3D_tdstVector *pstGlobalPositionOfSymCamera, MTH3D_tdstVector *pstGlobalNormalOfMirror, MTH3D_tdstVector *pstGlobalPointOfMirror); void SCT_fn_vFindAllMirrorsInVisibleSector( struct GLD_tdstViewportAttributes_ *_p_stVpt, HIE_tdxHandleToSuperObject _hSprObjSector, HIE_tdxHandleToSuperObject *hHandleOfMirror, ACP_tdxHandleOfObject *p_hHandleOfGometricMirror, HIE_tdxHandleToSuperObject *hSectorOfMirror, short *shNbOfMirror); /**********************************************************************************************/ /* Name: SCT_fn_vGetSymMatrixOfCameraInMirror*/ /* Goal: Compute the new matrix for the symetric camera*/ /* Code: Philippe Thiébaut*/ /* Verified: Yes*/ /* OPTIMMIZED : No*/ /**********************************************************************************************/ void SCT_fn_vGetSymMatrixOfCameraInMirror ( GEO_tdxHandleToMatrix hMatrixOfCamera, GEO_tdxHandleToMatrix hMatrixOfSymCamera, MTH3D_tdstVector *pstGlobalPositionOfSymCamera, MTH3D_tdstVector *pstGlobalNormalOfMirror, MTH3D_tdstVector *pstGlobalPointOfMirror ) { POS_tdstCompletePosition stGlobalMatrixOfCamera; POS_tdstCompletePosition stMulMatrixScale; POS_tdstCompletePosition stTempMatrixForMultiplication; MTH3D_tdstVector stTransVector; MTH_tdxReal xTemp; MTH3D_tdstVector stTransVectorOfCamera; MTH3D_tdstVector pstModuleAxes[3]; MTH_tdxReal a11,a22,a33,a12,a13,a23; /*I get the global matrix of the camera*/ POS_fn_vSetIdentityMatrix(&stGlobalMatrixOfCamera); POS_fn_vInvertMatrix(&stGlobalMatrixOfCamera, hMatrixOfCamera); /*I compute the matrix of the mirror transformation */ POS_fn_vSetIdentityMatrix(&stMulMatrixScale); a11=MTH_M_xSub(MTH_C_ONE,MTH_M_xMul(MTH_C_2,MTH_M_xMul(pstGlobalNormalOfMirror->xX,pstGlobalNormalOfMirror->xX))); a22=MTH_M_xSub(MTH_C_ONE,MTH_M_xMul(MTH_C_2,MTH_M_xMul(pstGlobalNormalOfMirror->xY,pstGlobalNormalOfMirror->xY))); a33=MTH_M_xSub(MTH_C_ONE,MTH_M_xMul(MTH_C_2,MTH_M_xMul(pstGlobalNormalOfMirror->xZ,pstGlobalNormalOfMirror->xZ))); a12=MTH_M_xMul(MTH_C_Minus2,MTH_M_xMul(pstGlobalNormalOfMirror->xX,pstGlobalNormalOfMirror->xY)); a13=MTH_M_xMul(MTH_C_Minus2,MTH_M_xMul(pstGlobalNormalOfMirror->xX,pstGlobalNormalOfMirror->xZ)); a23=MTH_M_xMul(MTH_C_Minus2,MTH_M_xMul(pstGlobalNormalOfMirror->xY,pstGlobalNormalOfMirror->xZ)); MTH3D_M_vSetVectorElements(&pstModuleAxes[0],a11,a12,a13); MTH3D_M_vSetVectorElements(&pstModuleAxes[1],a12,a22,a23); MTH3D_M_vSetVectorElements(&pstModuleAxes[2],a13,a23,a33); POS_fn_vSetRotationMatrix(&stMulMatrixScale,&pstModuleAxes[0],&pstModuleAxes[1],&pstModuleAxes[2]); /*I compute the translation matrix of the mirror transformation*/ POS_fn_vGetTranslationVector(&stGlobalMatrixOfCamera,&stTransVectorOfCamera); MTH3D_M_vSubVector(&stTransVector,&stTransVectorOfCamera,pstGlobalPointOfMirror); xTemp=MTH_M_xMul(MTH_C_Minus2,MTH3D_M_xDotProductVector(&stTransVector,pstGlobalNormalOfMirror)); MTH3D_M_vMulScalarVector(&stTransVector, xTemp, pstGlobalNormalOfMirror); MTH3D_M_vAddVector(&stTransVector,&stTransVector,&stTransVectorOfCamera); /*I transform the matrix*/ /* POS_fn_vInitPositionFlag(&stTempMatrixForMultiplication);*/ GEO_M_vCopyMatrix( &stTempMatrixForMultiplication,&stGlobalMatrixOfCamera) POS_fn_vMulMatrixMatrix(&stGlobalMatrixOfCamera,&stMulMatrixScale, &stTempMatrixForMultiplication); POS_fn_vSetTranslationVector(&stGlobalMatrixOfCamera,&stTransVector); MTH3D_M_vCopyVector(pstGlobalPositionOfSymCamera,&stTransVector); /*I invert the matrix of the SymCamera*/ POS_fn_vSetIdentityMatrix(hMatrixOfSymCamera); POS_fn_vInvertMatrix(hMatrixOfSymCamera,&stGlobalMatrixOfCamera); } /**********************************************************************************************/ /* Name: SCT_fn_vFindAllMirrorsInVisibleSector*/ /* Goal: Find all the mirrors in the current sector and in the visible sectors*/ /* Code: Philippe Thiébaut*/ /* Verified: No*/ /* OPTIMMIZED : No*/ /**********************************************************************************************/ void SCT_fn_vFindAllMirrorsInVisibleSector ( struct GLD_tdstViewportAttributes_ *_p_stVpt, HIE_tdxHandleToSuperObject _hSprObjSector, HIE_tdxHandleToSuperObject *p_hHandleOfMirror, ACP_tdxHandleOfObject *p_hHandleOfGometricMirror, HIE_tdxHandleToSuperObject *p_hSectorOfMirror, short *p_shNbOfMirrors ) { SECT_tdxHandleOfElementLstGraphicInteraction hGraphicElement; short xI, xJ , i, shTempNbOfMirrors; /*To get the list of characters*/ SECT_tdxHandleOfSectorObject hSectorObject; SECT_tdxHandleOfElementLstCharacter hCharacter; (*p_shNbOfMirrors)=0; hSectorObject=(SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(_hSprObjSector); /* * I find all the mirrors in the current sector. *----------------------------------------------- */ /*Static*/ if(!(HIE_fn_lGetSuperObjectDrawMask(_hSprObjSector) & GLI_C_lHasNoMirror)) { HIE_fn_hFindAllMirrorsInHierarchy ( _p_stVpt, _hSprObjSector, p_hHandleOfMirror, p_hHandleOfGometricMirror, p_shNbOfMirrors, SCT_C_xNbMaxOfMirrorsInVisibleSectors ); } /*Dynamic */ LST2_M_DynamicForEachElementOf(&(hSectorObject->stListOfCharacters), hCharacter, xI) { if(!(HIE_fn_lGetSuperObjectDrawMask(hCharacter->hPointerOfCharacter) & GLI_C_lHasNoMirror)) { HIE_fn_hFindAllMirrorsInHierarchy ( _p_stVpt, hCharacter->hPointerOfCharacter, p_hHandleOfMirror, p_hHandleOfGometricMirror, p_shNbOfMirrors, SCT_C_xNbMaxOfMirrorsInVisibleSectors ); } } for (i=0;i<(*p_shNbOfMirrors);i++) { /*I need the sector where is the mirror*/ p_hSectorOfMirror[i]=_hSprObjSector; } /* * I find all the mirrors in the visible sectors. *------------------------------------------------ */ SECT_M_ForEachGraphicNodeInGraphicInteractionList(_hSprObjSector,hGraphicElement,xI) { shTempNbOfMirrors=(*p_shNbOfMirrors); /*Static*/ if(!(HIE_fn_lGetSuperObjectDrawMask(SECT_GetSectorInGraphicList(hGraphicElement)) & GLI_C_lHasNoMirror)) { HIE_fn_hFindAllMirrorsInHierarchy ( _p_stVpt, SECT_GetSectorInGraphicList(hGraphicElement), p_hHandleOfMirror, p_hHandleOfGometricMirror, p_shNbOfMirrors, SCT_C_xNbMaxOfMirrorsInVisibleSectors ); } hSectorObject=(SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(SECT_GetSectorInGraphicList(hGraphicElement)); /*Dynamic */ LST2_M_DynamicForEachElementOf ( &(hSectorObject->stListOfCharacters), hCharacter, xJ ) { if(!(HIE_fn_lGetSuperObjectDrawMask(hCharacter->hPointerOfCharacter) & GLI_C_lHasNoMirror)) { HIE_fn_hFindAllMirrorsInHierarchy ( _p_stVpt, hCharacter->hPointerOfCharacter, p_hHandleOfMirror, p_hHandleOfGometricMirror, p_shNbOfMirrors, SCT_C_xNbMaxOfMirrorsInVisibleSectors ); } } for (i=shTempNbOfMirrors;i<(*p_shNbOfMirrors);i++) { /*I need the sector where is the mirror*/ p_hSectorOfMirror[i]=SECT_GetSectorInGraphicList(hGraphicElement); } } } #endif /* U64 */ /**********************************************************************************************/ /* Name: SCT_fn_vSendSectorWhereIAmToViewportWithMirror*/ /* Goal: Draw the sector with mirrors*/ /* Code: Philippe Thiébaut*/ /* Verified: No*/ /* OPTIMMIZED : No*/ /**********************************************************************************************/ /*this is the function called from exterior*/ void SCT_fn_vSendSectorWhereIAmToViewportWithMirror ( MTH3D_tdstVector *_p_stAbsolutePositionOfCamera, GLD_tdhDevice _hDevice, GLD_tdhViewport _hViewport, struct GLD_tdstViewportAttributes_ *_p_stVpt, HIE_tdxHandleToSuperObject _hSprObjSector , long _lDrawMask ) { #if !defined(U64) /* No Mirror for Nintendo 64*/ HIE_tdxHandleToSuperObject hHandleOfMirror[SCT_C_xNbMaxOfMirrorsInVisibleSectors]; HIE_tdxHandleToSuperObject hSectorOfMirror[SCT_C_xNbMaxOfMirrorsInVisibleSectors]; short shNbOfMirror; ACP_tdxBool p_bIDrawTheMirror[SCT_C_xNbMaxOfMirrorsInVisibleSectors]; short i; /* ACP_tdxIndex xTempIndex[3];*/ ACP_tdxHandleOfObject p_hHandleOfGometricMirror[SCT_C_xNbMaxOfMirrorsInVisibleSectors]; MTH3D_tdstVector stNormalOfMirror; MTH3D_tdstVector stPointOfMirror; GEO_tdxHandleToMatrix p_hGlobalMatrixOfMirror[SCT_C_xNbMaxOfMirrorsInVisibleSectors]; MTH3D_tdstVector stI, stJ, stK; MTH3D_tdstVector stGlobalPositionOfSymCamera; POS_tdstCompletePosition stTransMatrix; struct GLI_tdstCamera_ stSymCam; struct GLI_tdstCamera_ *p_stCpyCam; /* This the radius of visibility for all mirrors */ /*MTH_tdxReal xDistanceOfActivationOfMirror=50.0f; // DANGER !!!!!!!!!!!!*/ /*MTH_tdxReal xDistanceFromCameraToMirror;*/ /* For clipping by water */ MTH_tdxReal xWaterDistance; /* For clipping by a window */ long lXMin, lXMax, lYMin, lYMax; unsigned long lXMinA,lXMaxA,lYMinA,lYMaxA; GLD_tdstDeviceAttributes stDevAttrib ; #endif /* U64*/ #if !defined(U64) /* No Mirror for Nintendo 64*/ GEO_fn_vComputeCameraParametersForCulling( _p_stVpt, fn_xGetSectorZFar( _hSprObjSector ) ); SCT_fn_vFindAllMirrorsInVisibleSector(_p_stVpt,_hSprObjSector,hHandleOfMirror,p_hHandleOfGometricMirror, hSectorOfMirror,&shNbOfMirror); /* if there's a global fog set it now.*/ if(GLI_cGlobalFogIsOn) { GLI_vSetFog2( GLI_xFogBlendNear, GLI_xFogNear, GLI_xFogBlendFar, GLI_xFogFar, GLI_xFogInfinite, &GLI_stFogColor ); GLI_vFogOn(); } if ( shNbOfMirror != 0 ) { /*There is a mirror in the scene so i make some initializations*/ /*I save the clip window of the viewport*/ lXMin=_p_stVpt->dwClipLeftInPix; lXMax=_p_stVpt->dwClipRightInPix; lYMin=_p_stVpt->dwClipTopInPix; lYMax=_p_stVpt->dwClipBottomInPix; lXMinA=65536; lXMaxA=0; lYMinA=65536; lYMaxA=0; GLD_bGetDeviceAttributes( _hDevice, &stDevAttrib ) ; for (i=0;ixNbElements!=1) GLI_vSetWaterplaneOff(); else { xWaterDistance=MTH3D_M_xDotProductVector(&stPointOfMirror,&stNormalOfMirror); GLI_vSetWaterplane(_p_stVpt,&stNormalOfMirror,xWaterDistance); } /* I draw the symetric sector */ if (hSectorObject->xVirtual) { SCT_fn_vSendSectorWhereIAmToViewport( &stGlobalPositionOfSymCamera, _p_stVpt, _hSprObjSector , _lDrawMask - GLI_C_lIsNotDrawingInMirror - GLI_C_lNotHideWhatIsUnderWater); } else { /* Drawing the normal objects */ SCT_fn_vSendSectorWhereIAmToViewport( &stGlobalPositionOfSymCamera, _p_stVpt,hSectorOfMirror[i], _lDrawMask - GLI_C_lIsNotDrawingInMirror - GLI_C_lNotHideWhatIsUnderWater); } if(lXMinA>_p_stVpt->dwClipLeftInPix) lXMinA=_p_stVpt->dwClipLeftInPix; if(lYMinA>_p_stVpt->dwClipTopInPix) lYMinA=_p_stVpt->dwClipTopInPix; if(lXMaxA<_p_stVpt->dwClipRightInPix) lXMaxA=_p_stVpt->dwClipRightInPix; if(lYMaxA<_p_stVpt->dwClipBottomInPix) lYMaxA=_p_stVpt->dwClipBottomInPix; /* I restore the clip window */ _p_stVpt->dwClipLeftInPix=lXMin; _p_stVpt->dwClipRightInPix=lXMax; _p_stVpt->dwClipTopInPix=lYMin; _p_stVpt->dwClipBottomInPix=lYMax; /* I restore the clipping mode */ if (p_hHandleOfGometricMirror[i]->xNbElements!=1) GLI_vSetWaterplaneOn(); /* Draw transparent faces and Clear Zbuffer Before drawing mirror surfaces*/ /* Transparent faces are send when all symetric worlds are drawn*/ GLI_xSendListToViewport (_p_stVpt ) ; GLI_xClearViewingList () ; /* I restore the camera */ GLI_xSetViewportCamera ( _hDevice, _hViewport, p_stCpyCam ) ; /* -------------------------------------------------------------------*/ /* Draw mirror surface*/ bViewingInMirror = TRUE; GLI_vWaterplaneDisable2DSinus(); HIE_fn_bInitCameraMatrixStack(_p_stVpt); HIE_fn_vPushMatrix (hHandleOfMirror[i]); HIE_fn_vPushOnCameraMatrixStack(hHandleOfMirror[i]); /* Send Light and fog*/ SECT_fn_vSendDynamicLightsFromWhereIAmToViewport(_p_stVpt,hSectorOfMirror[i]); SECT_fn_vSendFogToViewport(_p_stVpt,hSectorOfMirror[i]); fn_vSendOneModuleToViewPort(_p_stVpt,hHandleOfMirror[i],_lDrawMask); /* Clear all lights of viewport*/ GLI_vClearListOfLightInViewport (_p_stVpt); HIE_fn_vPopMatrix(); HIE_fn_vPopOnCameraMatrixStack(); bViewingInMirror = FALSE; /* -------------------------------------------------------------------*/ } } } } #endif /* U64 */ /* I draw the normal sector */ GEO_fn_vComputeCameraParametersForCulling( _p_stVpt, fn_xGetSectorZFar( _hSprObjSector ) ); /* Oliv' - to see collision Map with collision sector interaction - 25/05/1999 */ #if defined(_U64_GLI_BENCH_) if( GLIBENCH_g_bColMap ) { GLIBENCH_SCT_fn_vSendCollisionSectorWhereIAmToViewport( _p_stAbsolutePositionOfCamera, _p_stVpt, _hSprObjSector, _lDrawMask); } else #endif /* _U64_GLI_BENCH_ */ { SCT_fn_vSendSectorWhereIAmToViewport( _p_stAbsolutePositionOfCamera, _p_stVpt, _hSprObjSector, _lDrawMask); } /* EndOfOliv' */ AGO_vProcessAllParts(_p_stVpt); } #ifndef U64 /**********************************************************************************************/ /* Name: SCT_fn_vInitMirrorFlagForAllSectors*/ /* Goal: Search mirror in each sector to set the flag GLI_C_lHasNoMirror*/ /* Code: Carlos Torres*/ /* Verified: No*/ /* OPTIMMIZED : No*/ /**********************************************************************************************/ void SCT_fn_vInitMirrorFlagForAllSectors(HIE_tdxHandleToSuperObject _hStaticRoot) { int i; HIE_tdxHandleToSuperObject hSector; /* If find a mirror in sector set is DrawFlag*/ HIE_M_ForEachChildOf(_hStaticRoot,hSector,i) { if (HIE_fn_bFindMirrorInHierarchy(hSector)) HIE_fn_vSetSuperObjectDrawMask(hSector,HIE_fn_lGetSuperObjectDrawMask(hSector) & ~GLI_C_lHasNoMirror); } } #endif /* U64 */