//======================================================================== // Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. // // File: IntersectLoader.cpp // // Description: Implementation for IntersectLoader class. // // History: Implemented --Devin [7/19/2002] //======================================================================== //======================================== // System Includes //======================================== #include #include //======================================== // Project Includes //======================================== #include #include #include #include //************************************************************************ // // Global Data, Local Data, Local Classes // //************************************************************************ //************************************************************************ // // Public Member Functions : IntersectLoader Interface // //************************************************************************ //======================================================================== // IntersectLoader:: //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== IntersectLoader::IntersectLoader() : tSimpleChunkHandler(SRR2::ChunkID::INTERSECT_DSG) { mpListenerCB = NULL; mUserData = -1; } /////////////////////////////////////////////////////////////////////// // tSimpleChunkHandler /////////////////////////////////////////////////////////////////////// //======================================================================== // IntersectLoader:: //======================================================================== // // Description: // // Parameters: None. // // Return: None. // // Constraints: None. // // ULONG NumIndices; // ULONG Indices // array = NumIndices; // ULONG NumPositions; // tlPoint Positions // array = NumPositions; // ULONG NumNormals; // tlPoint Normals // array = NumNormals; // ULONG NumCentroids; // tlPoint Centroids // array = NumCentroids; // ULONG NumRadii; // float Radii // array = NumRadii; // Chunk tlBBoxChunk; // Chunk tlBSphereChunk; // //======================================================================== tEntity* IntersectLoader::LoadObject(tChunkFile* f, tEntityStore* store) { /* static int profileNumPts = 0; static int profileNumNorms = 0; static int profileNumTerrain = 0; static int profileNumIndicies = 0; static int profileTotalSize = 0; */ IEntityDSG::msDeletionsSafe=true; int i; IntersectDSG* pIDSG = new IntersectDSG; pIDSG->mTriIndices.Allocate(f->GetLong()); pIDSG->mTriIndices.AddUse(pIDSG->mTriIndices.mSize); for(i=0; imTriIndices.mSize; i++) { pIDSG->mTriIndices[i] = (int)(f->GetLong()); } pIDSG->mTriPts.Allocate(f->GetLong()); pIDSG->mTriPts.AddUse(pIDSG->mTriPts.mSize); //for(i=0; imTriPts.mSize; i++) { f->GetData(&pIDSG->mTriPts[0], 3*pIDSG->mTriPts.mSize, tFile::DWORD); } pIDSG->mTriNorms.Allocate(f->GetLong()); pIDSG->mTriNorms.AddUse(pIDSG->mTriNorms.mSize); //for(i=0; imTriNorms.mSize; i++) { f->GetData(&pIDSG->mTriNorms[0], 3*pIDSG->mTriNorms.mSize, tFile::DWORD); } /* pIDSG->mTriCentroids.Allocate(f->GetLong()); pIDSG->mTriCentroids.AddUse(pIDSG->mTriCentroids.mSize); //for(i=0; imTriCentroids.mSize; i++) { f->GetData(&pIDSG->mTriCentroids[0], 3*pIDSG->mTriCentroids.mSize, tFile::DWORD); } pIDSG->mTriRadius.Allocate(f->GetLong()); pIDSG->mTriRadius.AddUse(pIDSG->mTriRadius.mSize); //for(i=0; imTriRadius.mSize; i++) { f->GetData(&pIDSG->mTriRadius[0], pIDSG->mTriRadius.mSize, tFile::DWORD); } */ for(i=0 ; f->ChunksRemaining(); i++) { f->BeginChunk(); switch(f->GetCurrentID()) { case Pure3D::Mesh::BOX: { float minx = f->GetFloat(); float miny = f->GetFloat(); float minz = f->GetFloat(); float maxx = f->GetFloat(); float maxy = f->GetFloat(); float maxz = f->GetFloat(); pIDSG->SetBoundingBox( minx, miny, minz, maxx, maxy, maxz); break; } case Pure3D::Mesh::SPHERE: { float cx = f->GetFloat(); float cy = f->GetFloat(); float cz = f->GetFloat(); float r = f->GetFloat(); pIDSG->SetBoundingSphere(cx,cy,cz,r); break; } case SRR2::ChunkID::TERRAIN_TYPE: { long version = f->GetLong(); rAssert( version == 0 ); long size = f->GetLong(); pIDSG->mTerrainType.Allocate( size ); pIDSG->mTerrainType.AddUse( size ); //for( i = 0; i < size; ++i ) //{ f->GetData(&pIDSG->mTerrainType[0], pIDSG->mTerrainType.mSize, tFile::BYTE); //f->GetData( &pIDSG->mTerrainType[ i ], 1, tFile::BYTE ); //} break; } default: rAssert(false); break; } // switch f->EndChunk(); } /* if(pIDSG->mTriPts.mSize > profileNumPts) profileNumPts = pIDSG->mTriPts.mSize; if(pIDSG->mTriNorms.mSize > profileNumNorms) profileNumNorms = pIDSG->mTriNorms.mSize; if(pIDSG->mTerrainType.mSize > profileNumTerrain) profileNumTerrain = pIDSG->mTerrainType.mSize; if(pIDSG->mTriIndices.mSize > profileNumIndicies) profileNumIndicies = pIDSG->mTriIndices.mSize; if( 3*4*(pIDSG->mTriPts.mSize + pIDSG->mTriNorms.mSize) + pIDSG->mTriIndices.mSize*4 + pIDSG->mTerrainType.mSize > profileTotalSize ) { profileTotalSize = 3*4*(pIDSG->mTriPts.mSize + pIDSG->mTriNorms.mSize) + pIDSG->mTriIndices.mSize*4 + pIDSG->mTerrainType.mSize; if(profileTotalSize > 8192) profileTotalSize = 8192; } */ mpListenerCB->OnChunkLoaded( pIDSG, mUserData, _id ); IEntityDSG::msDeletionsSafe=false; return NULL;//pIDSG; } /////////////////////////////////////////////////////////////////////// // IWrappedLoader /////////////////////////////////////////////////////////////////////// //======================================================================== // IntersectLoader::SetRegdListener //======================================================================== // // Description: Register a new listener/caretaker, notify old listener of // severed connection. // // Parameters: pListenerCB: Callback to call OnChunkLoaded // pUserData: Data to pass along for filtering, etc // // Return: None. // // Constraints: None. // //======================================================================== void IntersectLoader::SetRegdListener ( ChunkListenerCallback* pListenerCB, int iUserData ) { // // Follow protocol; notify old Listener, that it has been // "disconnected". // if( mpListenerCB != NULL ) { mpListenerCB->OnChunkLoaded( NULL, iUserData, 0 ); } mpListenerCB = pListenerCB; mUserData = iUserData; } //======================================================================== // IntersectLoader::ModRegdListener //======================================================================== // // Description: Just fuck with the current pUserData // // Parameters: None. // // Return: None. // // Constraints: None. // //======================================================================== void IntersectLoader::ModRegdListener ( ChunkListenerCallback* pListenerCB, int iUserData ) { #if 0 char DebugBuf[255]; sprintf( DebugBuf, "IntersectLoader::ModRegdListener: pListenerCB %X vs mpListenerCB %X\n", pListenerCB, mpListenerCB ); rDebugString( DebugBuf ); #endif rAssert( pListenerCB == mpListenerCB ); mUserData = iUserData; } //************************************************************************ // // Protected Member Functions : IntersectLoader // //************************************************************************ //************************************************************************ // // Private Member Functions : IntersectLoader // //************************************************************************