Ejemplo n.º 1
0
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 );
}