/* ##C_FILE# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FILE : ISI_ISI.c DESCRIPTION : ISI accessors, loading, saving, creating, deleting. VERSION : 1.00 / David Fournier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* ##INCLUDE#---------------------------------------------------------------------------- Includes Files ---------------------------------------------------------------------------------------*/ /*For game material*/ #include "GMT/GmtHandl.h" #include "ACP_base.h" /*memory management of geometry.*/ #include "GEO.h" #include "GLI.h" #include "SCR.h" #include "COL.h" #include "SPO.h" /*IPO*/ #include "PCS.h" #include "PO.h" #include "IPO.h" /*PATH NAME*/ #include "DPT.h" #if !defined(U64) /*#include "BIN.h"*/ #endif /* U64 */ #include "ISI\ISI_Ext.h" #include "ISI\Specif\ISI_Func.h" #include "ISI_Int.h" /* ##CONSTANTE#-------------------------------------------------------------------------- Constantes declaration ---------------------------------------------------------------------------------------*/ #ifndef _FIRE_DEADCODE_U64_ #define ISI_C_BUFFER_SIZE 128*1024 /* Max size of a RLI ?*/ #endif /* _FIRE_DEADCODE_U64_ */ /* ##GLOBVAR#---------------------------------------------------------------------------- Globale variable declaration ---------------------------------------------------------------------------------------*/ #if !defined(U64) /*Link Table*/ SCR_tdst_Link_Table ISI_stLinkTable; #endif /* U64 */ /* ##FUNCDEF#---------------------------------------------------------------------------- Functions definition ---------------------------------------------------------------------------------------*/ #if !defined(U64) SCR_tde_Anl_ReturnValue ISI_fn_xLoadISI(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType); #endif /* U64 */ /*End of Prototypes*/ #include "Specif\ISI_Func.cxx" /* ##-########################### ## Creating / Deleting ############################## */ /* ##F=================================================================================== NAME : ISI_vInitLoad DESCRIPTION : Function to initialise the script loading ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ void ISI_vInitLoad(void) { #if !defined(U64) SCR_fn_v_RdL0_RegisterCallback("ISI", ISI_fn_xLoadISI, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback("IS2", ISI_fn_xLoadISI2, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_Link_InitTable(&ISI_stLinkTable); #endif /* U64 */ } /* ##F=================================================================================== NAME : ISI_fn_hCreateISILOD DESCRIPTION : Create an ISI level of detail. INPUT : _hISI = Handle to ISI. _xNumISILOD = Level of detail number. _xNbRLI = Number of RLI. OUTPUT : Return table of RLI. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ISI_tdstColor *ISI_fn_hCreateISILOD(ACP_tdxHandleToRadiosity _hISI ,ACP_tdxIndex _xNumISILOD,ACP_tdxIndex _xNbRLI) { ACP_tdxIndex xI; ISI_tdstColor *p_stTabCol; ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; hCpyISI->d_stISILOD[_xNumISILOD].xNbVertexRLI=_xNbRLI; MMG_fn_vAddMemoryInfo( MMG_C_lTypeISI , MMG_C_lSubTypeLOD , 0 ); GEO_M_CPAMalloc(p_stTabCol,ISI_tdstColor *, sizeof(ISI_tdstColor)*_xNbRLI, E_uwGEONotEnoughtMemory); hCpyISI->d_stISILOD[_xNumISILOD].d_stVertexRLI=p_stTabCol; for(xI=0;xI<_xNbRLI;xI++) { p_stTabCol[xI].xRed=0; p_stTabCol[xI].xGreen=0; p_stTabCol[xI].xBlue=0; p_stTabCol[xI].xAlpha=0; } return p_stTabCol; } /* ##F=================================================================================== NAME : ISI_fn_hCreateISI DESCRIPTION : Create ISI structure. INPUT : _xNbISILOD = Number of level of detail. OUTPUT : handle to ISI. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ACP_tdxHandleToRadiosity ISI_fn_hCreateISI(ACP_tdxIndex _xNbISILOD) { ISI_HandleToISI hISI; ACP_tdxIndex xI; MMG_fn_vAddMemoryInfo( MMG_C_lTypeISI , MMG_C_lSubTypeStruct , 0 ); GEO_M_CPAMalloc(hISI,ISI_HandleToISI,sizeof(struct ISI_tdstISI_),E_uwGEONotEnoughtMemory); hISI->xNbISILOD=_xNbISILOD; MMG_fn_vAddMemoryInfo( MMG_C_lTypeISI , MMG_C_lSubTypeArray , 0 ); GEO_M_CPAMalloc(hISI->d_stISILOD,ISI_tdstISILOD *, sizeof(ISI_tdstISILOD)*_xNbISILOD, E_uwGEONotEnoughtMemory); for(xI=0;xI<_xNbISILOD;xI++) { hISI->d_stISILOD[xI].xNbVertexRLI=0; hISI->d_stISILOD[xI].d_stVertexRLI=NULL; } return (ACP_tdxHandleToRadiosity)hISI; } /* ##F=================================================================================== NAME : ISI_fn_vFreeISI DESCRIPTION : Free an ISI structure. INPUT : _hISI = handle to ISI. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ #ifndef _FIRE_DEADCODE_U64_ void ISI_fn_vFreeISI(ACP_tdxHandleToRadiosity _hISI) { ISI_HandleToISI hCpyISI; ACP_tdxIndex xI; hCpyISI=(ISI_HandleToISI)_hISI; for(xI=0;xIxNbISILOD;xI++) { if (hCpyISI->d_stISILOD[xI].d_stVertexRLI) GEO_M_CPAFree(hCpyISI->d_stISILOD[xI].d_stVertexRLI); } GEO_M_CPAFree(hCpyISI->d_stISILOD); GEO_M_CPAFree(hCpyISI); } #endif /* _FIRE_DEADCODE_U64_ */ /* ##-########################### ## Accessors ############################## */ /* ##F=================================================================================== NAME : ISI_ColISIToGEO DESCRIPTION : Convert a ISI_tdstColor in GEO_tdstColor. INPUT : GEOCol = table of GEO color. ISICol = table of ISI color. ulNbr = number of color. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ #define ISI_xColorCompInvFac 0.00390625f /* 1/ISI_tdxColorCompFac = 1/256*/ void ISI_ColISIToGEO(GEO_tdstColor *GEOCol ,ISI_tdstColor *ISICol,unsigned long ulNbr) { float *p_fGeo, *p_fLastGeo; ISI_tdxColorComp *p_xIsi; p_fGeo = (float *) GEOCol; p_fLastGeo = (float *) (GEOCol + ulNbr); p_xIsi = (ISI_tdxColorComp *) ISICol; for (; p_fGeo < p_fLastGeo;) { *p_fGeo++ = *p_xIsi++ * ISI_xColorCompInvFac; *p_fGeo++ = *p_xIsi++ * ISI_xColorCompInvFac; *p_fGeo++ = *p_xIsi++ * ISI_xColorCompInvFac; *p_fGeo++ = *p_xIsi++ * ISI_xColorCompInvFac; } /* while (ulNbr--) { GEOCol->xR = MTH_M_xLongToFloat((long)ISICol->xRed) * ISI_xColorCompInvFac; GEOCol->xG = MTH_M_xLongToFloat((long)ISICol->xGreen) * ISI_xColorCompInvFac; GEOCol->xB = MTH_M_xLongToFloat((long)ISICol->xBlue) * ISI_xColorCompInvFac; GEOCol->xA = MTH_M_xLongToFloat((long)ISICol->xAlpha) * ISI_xColorCompInvFac; GEOCol++; ISICol++; } */ } /* ##F=================================================================================== NAME : ISI_ColGEOToISI DESCRIPTION : Convert a GEO_tdstColor in ISI_tdstColor. INPUT : ISICol = table of ISI color. GEOCol = table of GEO color. ulNbr = number of color. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ void ISI_ColGEOToISI(ISI_tdstColor *ISICol , GEO_tdstColor *GEOCol,unsigned long ulNbr) { long R,G,B,A; while (ulNbr--) { R=MTH_M_xFloatToLong(GEOCol->xR*ISI_tdxColorCompFac); G=MTH_M_xFloatToLong(GEOCol->xG*ISI_tdxColorCompFac); B=MTH_M_xFloatToLong(GEOCol->xB*ISI_tdxColorCompFac); A=MTH_M_xFloatToLong(GEOCol->xA*ISI_tdxColorCompFac); if (RISI_tdxColorCompMax) R=ISI_tdxColorCompMax; if (GISI_tdxColorCompMax) G=ISI_tdxColorCompMax; if (BISI_tdxColorCompMax) B=ISI_tdxColorCompMax; if (AISI_tdxColorCompMax) A=ISI_tdxColorCompMax; ISICol->xRed =(ISI_tdxColorComp)R; ISICol->xGreen=(ISI_tdxColorComp)G; ISICol->xBlue =(ISI_tdxColorComp)B; ISICol->xAlpha=(ISI_tdxColorComp)A; GEOCol++; ISICol++; } } #ifndef _FIRE_DEADCODE_U64_ /* ##F=================================================================================== NAME : ISI_fn_xGetNbLOD DESCRIPTION : Return the number of LOD. INPUT : _hISI = handle to ISI. OUTPUT : Number of LOD. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ACP_tdxIndex ISI_fn_xGetNbLOD(ACP_tdxHandleToRadiosity _hISI) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; return hCpyISI->xNbISILOD; } /* ##F=================================================================================== NAME : ISI_fn_xGetNbVertexRLILOD DESCRIPTION : Return the number of RLI for one LOD. INPUT : _hISI = handle to ISI. _xNumISILOD = LOD number. OUTPUT : Number of RLI in the LOD. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ACP_tdxIndex ISI_fn_xGetNbVertexRLILOD(ACP_tdxHandleToRadiosity _hISI,ACP_tdxIndex _xNumISILOD) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; return hCpyISI->d_stISILOD[_xNumISILOD].xNbVertexRLI; } /* ##F=================================================================================== NAME : ISI_fn_dGetVertexRLILOD DESCRIPTION : Return the table of RLI for one LOD. INPUT : _hISI = handle to ISI. _xNumISILOD = LOD number. OUTPUT : Table of RLI. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ISI_tdstColor *ISI_fn_dGetVertexRLILOD(ACP_tdxHandleToRadiosity _hISI,ACP_tdxIndex _xNumISILOD) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; return hCpyISI->d_stISILOD[_xNumISILOD].d_stVertexRLI; } /* ##F=================================================================================== NAME : ISI_fn_xGetNbVertexRLI DESCRIPTION : Return the number of RLI for the first LOD. INPUT : _hISI = handle to ISI. OUTPUT : Number of RLI for the first LOD. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ACP_tdxIndex ISI_fn_xGetNbVertexRLI(ACP_tdxHandleToRadiosity _hISI) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; return hCpyISI->d_stISILOD[0].xNbVertexRLI; } /* ##F=================================================================================== NAME : ISI_fn_dGetVertexRLI DESCRIPTION : Return the table of RLI for the first LOD. INPUT : _hISI = handle to ISI. OUTPUT : Table of RLI for the first LOD. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ ISI_tdstColor *ISI_fn_dGetVertexRLI(ACP_tdxHandleToRadiosity _hISI) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; return hCpyISI->d_stISILOD[0].d_stVertexRLI; } /* ##F=================================================================================== NAME : ISI_fn_vSetVertexRLILOD DESCRIPTION : Change RLI of one vertex for one LOD. INPUT : _hISI = handle to ISI. _p_stColor = adress of ISI color for setting. _xNumISILOD = LOD number in the ISI. _xIndex = RLI number in the LOD. OUTPUT : Table of RLI for the first LOD. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ void ISI_fn_vSetVertexRLILOD(ACP_tdxHandleToRadiosity _hISI, ISI_tdstColor *_p_stColor, ACP_tdxIndex _xNumISILOD, ACP_tdxIndex _xIndex) { ISI_HandleToISI hCpyISI; hCpyISI=(ISI_HandleToISI)_hISI; hCpyISI->d_stISILOD[_xNumISILOD].d_stVertexRLI[_xIndex]=*_p_stColor; } #endif /* _FIRE_DEADCODE_U64_ */ /* ##F=================================================================================== NAME : ISI_fn_vAmbientLight DESCRIPTION : Add ambient light to all RLI, create RLI if they not exist. INPUT : _hSuperObject = hierarchie for lighting. _xDR = red intensity. _xDG = green intensity. _xDB = blue intensity. ========================================================================================= LAST MODIFICATIONS : 20/11/97 David Fournier : New commentary form. =======================================================================================*/ void ISI_fn_vAmbientLight(HIE_tdxHandleToSuperObject _hSuperObject, MTH_tdxReal _xDR, MTH_tdxReal _xDG, MTH_tdxReal _xDB) { HIE_tdxHandleToSuperObject hchildSO; ACP_tdxHandleOfObject hPhysicalObject; ACP_tdxIndex xI,xNumISILOD,xNbVertexRLI; ACP_tdxHandleToRadiosity hISI; ISI_HandleToISI hCpyISI; GEO_tdstColor GEOColInt; ISI_tdstColor *d_stVertexRLI; MTH_tdxReal xTemp; long lType; HIE_M_ForEachChildOf(_hSuperObject,hchildSO,xI) { ISI_fn_vAmbientLight(hchildSO,_xDR,_xDG,_xDB); } lType = HIE_fn_ulGetSuperObjectType(_hSuperObject); if(lType & ( HIE_C_ulIPO | HIE_C_ulIPO_Mirror)) { hISI=IPO_fn_hGetRadiosity((IPO_tdxHandleToInstanciatedPhysicalObject)HIE_fn_hGetSuperObjectObject(_hSuperObject)); if(!hISI) { GEO_tdxHandleToVisualSet hVisuSet; ACP_tdxIndex xNbLod; hVisuSet=PO_fn_hGetVisualSet(IPO_fn_hGetPhysicalObject((IPO_tdxHandleToInstanciatedPhysicalObject)HIE_fn_hGetSuperObjectObject(_hSuperObject))); xNbLod=(short)GLI_lGetVisualSetNumbertOfLOD(hVisuSet); if (xNbLod>2) xNbLod=2; hISI=ISI_fn_hCreateISI(xNbLod); IPO_fn_vSetRadiosity((IPO_tdxHandleToInstanciatedPhysicalObject)HIE_fn_hGetSuperObjectObject(_hSuperObject),hISI); for(xNumISILOD=0;xNumISILODxNbPoints); } } hCpyISI=(ISI_HandleToISI)hISI; /* For all LOD.*/ for(xNumISILOD=0;xNumISILODxNbISILOD;xNumISILOD++) { xNbVertexRLI=hCpyISI->d_stISILOD[xNumISILOD].xNbVertexRLI; d_stVertexRLI=hCpyISI->d_stISILOD[xNumISILOD].d_stVertexRLI; /* For all RLI of the LOD.*/ for(xI=0;xIxNbISILOD) ; hReturnRad = (ISI_HandleToISI)hBlendISI ; xNbVertex = hISI1->d_stISILOD[xNumISILOD].xNbVertexRLI ; hBlendISI->d_stISILOD[xNumISILOD].xNbVertexRLI = xNbVertex ; MMG_fn_vAddMemoryInfo( MMG_C_lTypeISI , MMG_C_lSubTypeBlendRLI , 0 ); GEO_M_CPAMalloc( p_stBlendTabCol, ISI_tdstColor *, sizeof(ISI_tdstColor) * xNbVertex, E_uwGEONotEnoughtMemory); hBlendISI->d_stISILOD[xNumISILOD].d_stVertexRLI=p_stBlendTabCol; p_stTabCol1 = hISI1->d_stISILOD[xNumISILOD].d_stVertexRLI ; p_stTabCol2 = hISI2->d_stISILOD[xNumISILOD].d_stVertexRLI ; xPercentComplement = (float)1.0 - xPercent ; for(xI=0;xI