AssetObjectT Geometry::read(IResource* resource, AssetObjectM& assetObjects) { ChunkHeader geometryHeader( resource ); if( geometryHeader.type != BA_GEOMETRY ) throw Exception( "Unexpected chunk type" ); if( geometryHeader.size != sizeof(Chunk) ) throw Exception( "Incompatible binary asset version" ); Chunk chunk; fread( &chunk, sizeof(Chunk), 1, resource->getFile() ); // read shaders if( !chunk.sharedShaders ) for( int i=0; i<chunk.numShaders; i++ ) { assetObjects.insert( Shader::read( resource, assetObjects ) ); } // create geometry Geometry* geometry = new Geometry( chunk.numVertices, chunk.numTriangles, chunk.numUVSets, chunk.numShaders, chunk.numPrelights, chunk.sharedShaders, chunk.name ); // read vertices ChunkHeader verticesHeader( resource ); if( verticesHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( verticesHeader.size != sizeof(Vector)*chunk.numVertices ) throw Exception( "Incompatible binary asset version" ); fread( geometry->getVertices(), verticesHeader.size, 1, resource->getFile() ); // f**k up vertices //Vector* vertices = geometry->getVertices(); //for (int i = 0; i < chunk.numVertices; ++i) { // getCore()->logMessage( "%s %3.3f, %3.3f, %3.3f", resource->getName(), vertices[i].x, vertices[i].y, vertices[i].z); // //if (strcmp(resource->getName(), "./res/dropzone/dropzone.ba") == 0) { // //if (vertices[i].y == 401000.0f) vertices[i].y = 701000.0f; // //vertices[i] *= 3.0f; // //} //} // read normals ChunkHeader normalsHeader( resource ); if( normalsHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( normalsHeader.size != sizeof(Vector)*chunk.numVertices ) throw Exception( "Incompatible binary asset version" ); fread( geometry->getNormals(), normalsHeader.size, 1, resource->getFile() ); // read UV-sets int i; for( i=0; i<geometry->getNumUVSets(); i++ ) { ChunkHeader uvsHeader( resource ); if( uvsHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( uvsHeader.size != sizeof(Flector)*chunk.numVertices ) throw Exception( "Incompatible binary asset version" ); fread( geometry->getUVSet(i), uvsHeader.size, 1, resource->getFile() ); } // read prelights for( i=0; i<geometry->getNumPrelights(); i++ ) { ChunkHeader prelightsHeader( resource ); if( prelightsHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( prelightsHeader.size != sizeof(Color)*chunk.numVertices ) throw Exception( "Incompatible binary asset version" ); fread( geometry->getPrelights(i), prelightsHeader.size, 1, resource->getFile() ); } // read triangles ChunkHeader trianglesHeader( resource ); if( trianglesHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( trianglesHeader.size != sizeof(Triangle)*chunk.numTriangles ) throw Exception( "Incompatible binary asset version" ); fread( geometry->getTriangles(), trianglesHeader.size, 1, resource->getFile() ); // read shaders if( !chunk.sharedShaders ) { ChunkHeader shadersHeader( resource ); if( shadersHeader.type != BA_BINARY ) throw Exception( "Unexpected chunk type" ); if( shadersHeader.size != sizeof(auid)*chunk.numShaders ) throw Exception( "Incompatible binary asset version" ); auid* shaders = new auid[chunk.numShaders]; fread( shaders, shadersHeader.size, 1, resource->getFile() ); for( i=0; i<chunk.numShaders; i++ ) { AssetObjectI assetObjectI = assetObjects.find( shaders[i] ); if( assetObjectI != assetObjects.end() ) { geometry->setShader( i, reinterpret_cast<Shader*>( assetObjectI->second ) ); } } delete[] shaders; } assetObjects.insert( AssetObjectT( chunk.id, geometry ) ); // read octree if( chunk.numOcTreeSectors ) { for( int i=0; i<chunk.numOcTreeSectors; i++ ) { AssetObjectT assetObjectT = OcTreeSector::read( resource, assetObjects ); if( i == 0 ) geometry->_ocTreeRoot = reinterpret_cast<OcTreeSector*>( assetObjectT.second ); assetObjects.insert( assetObjectT ); } assert( geometry->_ocTreeRoot->checkConsistency() ); } // read effect if( chunk.hasEffect ) { AssetObjectT assetObjectT = Effect::read( resource, assetObjects ); assetObjects.insert( assetObjectT ); geometry->setEffect( reinterpret_cast<Effect*>( assetObjectT.second ) ); } return AssetObjectT( chunk.id, geometry ); }