void XAsset::createD3HierarchyClasses(Clump* clump, D3DXFRAME* frame)
{
    Frame* f = static_cast<Frame*>( frame );
    while( f->pMeshContainer )
    {
        Mesh* mesh = static_cast<Mesh*>( f->pMeshContainer );
        
        const char* geometryName = mesh->Name;
        if( !geometryName ) geometryName = "NamelessGeometry";
        Geometry* geometry = new Geometry( mesh, geometryName );

        Atomic* atomic = new Atomic;
        atomic->setGeometry( geometry );
        atomic->setFrame( f );

        clump->add( atomic );

        f->pMeshContainer = f->pMeshContainer->pNextMeshContainer;
    }

    if( f->pFrameFirstChild ) 
    {
        static_cast<Frame*>( f->pFrameFirstChild )->pParentFrame = f;
        createD3HierarchyClasses( clump, f->pFrameFirstChild );
    }

    if( f->pFrameSibling ) 
    {
        static_cast<Frame*>( f->pFrameSibling )->pParentFrame = f->pParentFrame;
        createD3HierarchyClasses( clump, f->pFrameSibling );
    }
}
Example #2
0
ImportAsset::ImportAsset(const char* resourcePath)
{
    import::IImport* iImport = NULL;
    queryInterface( "Import", &iImport );

    import::IImportStream* iImportStream = iImport->importRws( resourcePath );
    
    while( iImportStream->getType() != import::itNULL )
    switch( iImportStream->getType() )
    {
    case import::itTexture:
        {
            import::ImportTexture* importData = iImportStream->importTexture();
            // search for texture in current dictionary
            if( Texture::textures.find( importData->name ) == Texture::textures.end() )
            {
                if( strcmp( importData->name, "House01" ) == 0 )
                {
                    int iiii=0;
                }
                // create compatible texture
                Texture* texture = Texture::createDynamicTexture( 
                    importData->width, 
                    importData->height, 
                    importData->depth, 
                    importData->name
                );
                // lock texture top-level surface
                D3DLOCKED_RECT lockedRect;
                texture->iDirect3DTexture()->LockRect( 0, &lockedRect, NULL, 0 );
                // copy pixels
                int offset = 0;
                unsigned char* destPixels = (unsigned char*)(lockedRect.pBits);    
                for( int i=0; i<importData->width*importData->height; i++ )
                {
                    destPixels[offset + 0] = importData->pixels[offset + 2],
                    destPixels[offset + 1] = importData->pixels[offset + 1],
                    destPixels[offset + 2] = importData->pixels[offset + 0],
                    destPixels[offset + 3] = importData->pixels[offset + 3];
                    offset += 4;
                }
                texture->iDirect3DTexture()->UnlockRect( 0 );
                // setup filetering, addressing, etc
                switch( importData->addressMode )
                {
                case import::iamWrap: 
                    texture->setAddressTypeU( engine::atWrap );
                    texture->setAddressTypeV( engine::atWrap );
                    break;
                case import::iamMirror:
                    texture->setAddressTypeU( engine::atMirror );
                    texture->setAddressTypeV( engine::atMirror );
                    break;
                case import::iamClamp:
                    texture->setAddressTypeU( engine::atClamp );
                    texture->setAddressTypeV( engine::atClamp );
                    break;
                case import::iamBorder:
                    texture->setAddressTypeU( engine::atBorder );
                    texture->setAddressTypeV( engine::atBorder );
                    break;
                }
                switch( importData->filterMode )
                {
                case import::ifmNearest:
                    texture->setMagFilter( engine::ftPoint );
                    texture->setMinFilter( engine::ftPoint );
                    texture->setMipFilter( engine::ftNone );
                    break;
                case import::ifmLinear:
                    texture->setMagFilter( engine::ftLinear );
                    texture->setMinFilter( engine::ftLinear );
                    texture->setMipFilter( engine::ftNone );
                    break;
                case import::ifmMipNearest:
                    texture->setMagFilter( engine::ftPoint );
                    texture->setMinFilter( engine::ftPoint );
                    texture->setMipFilter( engine::ftPoint );
                    break;
                case import::ifmMipLinear:
                    texture->setMagFilter( engine::ftPoint );
                    texture->setMinFilter( engine::ftPoint );
                    texture->setMipFilter( engine::ftLinear );
                    break;
                case import::ifmLinearMipNearest:
                    texture->setMagFilter( engine::ftLinear );
                    texture->setMinFilter( engine::ftLinear );
                    texture->setMipFilter( engine::ftPoint );
                    break;
                case import::ifmLinearMipLinear:
                    texture->setMagFilter( engine::ftLinear );
                    texture->setMinFilter( engine::ftLinear );
                    texture->setMipFilter( engine::ftLinear );
                    break;
                }
                // override filtering
                texture->setMagFilter( engine::ftLinear );
                texture->setMinFilter( engine::ftLinear );
                texture->setMipFilter( engine::ftLinear );
                texture->setMaxAnisotropy( 8 );
                /*
                // create normal map
                iImport->createNormalMap(
                    importData->width, 
                    importData->height, 
                    importData->depth, 
                    importData->pixels,
                    importData->stride,
                    true,
                    5.0f
                );
                // create compatible texture
                Texture* normalMap = Texture::createDynamicTexture(
                    importData->width, 
                    importData->height, 
                    importData->depth, 
                    ( std::string( importData->name ) + "_nmap" ).c_str()
                );
                normalMap->setMagFilter( engine::ftLinear );
                normalMap->setMinFilter( engine::ftLinear );
                normalMap->setMipFilter( engine::ftLinear );
                // lock texture top-level surface
                lockedRect;
                normalMap->iDirect3DTexture()->LockRect( 0, &lockedRect, NULL, 0 );
                // copy pixels
                offset = 0;
                destPixels = (unsigned char*)(lockedRect.pBits);    
                for( i=0; i<importData->width*importData->height; i++ )
                {
                    destPixels[offset + 0] = importData->pixels[offset + 2],
                    destPixels[offset + 1] = importData->pixels[offset + 1],
                    destPixels[offset + 2] = importData->pixels[offset + 0],
                    destPixels[offset + 3] = importData->pixels[offset + 3];
                    offset += 4;
                }
                normalMap->iDirect3DTexture()->UnlockRect( 0 );
                */
                // put texture into importer storage
                _textures.insert( TextureT( importData->id, texture ) );
            }
            // release import data
            iImport->release( importData );
        }
        break;
    case import::itMaterial:
        {
            import::ImportMaterial* importData = iImportStream->importMaterial();

            Shader* shader = NULL;
            
            if( importData->textureId == 0 && importData->dualPassTextureId == 0 )
            {
                shader = new Shader( 0, importData->name );
            }
            else if( importData->textureId != 0 && importData->dualPassTextureId == 0 )
            {
                shader = new Shader( 1, importData->name );
                TextureI textureI = _textures.find( importData->textureId );
                if( textureI != _textures.end() ) 
                {
                    shader->setLayerTexture( 0, textureI->second );
                }
                shader->setLayerUV( 0,0 );
                /*
                ::TextureI normalMapI = Texture::textures.find( ( std::string( textureI->second->getName() ) + "_nmap" ).c_str() );
                if( normalMapI != Texture::textures.end() )
                {
                    shader->setNormalMap( normalMapI->second );
                    shader->setNormalMapUV( 0 );
                }
                */
            }
            else
            {
                shader = new Shader( 2, importData->name );
                TextureI textureI = _textures.find( importData->textureId );
                if( textureI != _textures.end() ) 
                {
                    shader->setLayerTexture( 0, textureI->second );
                }
                textureI = _textures.find( importData->dualPassTextureId );
                if( textureI != _textures.end() ) 
                {
                    shader->setLayerTexture( 1, textureI->second );
                }
                shader->setLayerUV( 1,1 );
                switch( importData->dualPassBlendType )
                {
                case import::ImportMaterial::btAdd:
                    shader->setLayerBlending( 1, engine::btAdd );
                    break;
                case import::ImportMaterial::btModulate:
                    shader->setLayerBlending( 1, engine::btModulate );
                    break;
                case import::ImportMaterial::btBlendTextureAlpha:
                    shader->setLayerBlending( 1, engine::btBlendTextureAlpha );
                    break;
                default:
                    shader->setLayerBlending( 1, engine::btOver );
                }

                textureI = _textures.find( importData->textureId );
                assert( textureI != _textures.end() );
                ::TextureI normalMapI = Texture::textures.find( ( std::string( textureI->second->getName() ) + "_nmap" ).c_str() );
                if( normalMapI != Texture::textures.end() )
                {
                    shader->setNormalMap( normalMapI->second );
                    shader->setNormalMapUV( 0 );
                }
            }

            shader->setDiffuseColor( importData->color );
            // put texture into importer storage
            _shaders.insert( ShaderT( importData->id, shader ) );
            // release import data
            iImport->release( importData );
        }
        break;
    case import::itFrame:
        {
            import::ImportFrame* importData = iImportStream->importFrame();

            Frame* frame = new Frame( importData->name );
            frame->TransformationMatrix = wrap( importData->modeling );	
			
            FrameI parentI = _frames.find( importData->parentId );
            if( parentI != _frames.end() ) 
            {
                frame->setParent( parentI->second );
            }
            _frames.insert( FrameT( importData->id, frame ) );
            iImport->release( importData );
        }
        break;
    case import::itGeometry:
        {
            import::ImportGeometry* importData = iImportStream->importGeometry();

            Geometry* geometry = new Geometry(
                importData->numVertices,
                importData->numTriangles,
                importData->numUVs,
                importData->numMaterials,
                ( importData->prelights != NULL ) ? 1 : 0,
                false,
                importData->name
            );

            for( int i=0; i<importData->numVertices; i++ )
            {
                geometry->getVertices()[i] = wrap( importData->vertices[i] );				
                geometry->getNormals()[i] = wrap( importData->normals[i] );
				// rh2lh conversion
                /*
				geometry->getVertices()[i][2] *= -1;
				geometry->getNormals()[i][2] *= -1;
                */
                geometry->getUVSet(0)[i] = wrap( importData->uvs[0][i] );
                if( importData->numUVs > 1 ) 
                {
                    geometry->getUVSet(1)[i] = wrap( importData->uvs[1][i] );
                }
                if( importData->prelights )
                {
                    geometry->getPrelights(0)[i] = wrap( importData->prelights[i] );
                }
            }
            for( i=0; i<importData->numTriangles; i++ )
            {
                /*
                geometry->getTriangles()[i].set(
                    importData->triangles[i].vertexId[0],
					importData->triangles[i].vertexId[2],
					importData->triangles[i].vertexId[1],					
                    importData->triangles[i].materialId
                );
                */
                geometry->getTriangles()[i].set(
                    importData->triangles[i].vertexId[0],
                    importData->triangles[i].vertexId[1],
					importData->triangles[i].vertexId[2],					
                    importData->triangles[i].materialId
                );
            }
            for( i=0; i<importData->numMaterials; i++ )
            {
                ShaderI shaderI = _shaders.find( importData->materials[i] );
                assert( shaderI != _shaders.end() );
                geometry->setShader( i, shaderI->second );
            }
            geometry->instance();
            _geometries.insert( GeometryT( importData->id, geometry ) );
            iImport->release( importData );
        }
        break;
    case import::itAtomic:
        {
            import::ImportAtomic* importData = iImportStream->importAtomic();
            Atomic* atomic = new Atomic;
            FrameI frameI = _frames.find( importData->frameId );
            assert( frameI != _frames.end() );
            atomic->setFrame( frameI->second );
            GeometryI geometryI = _geometries.find( importData->geometryId );
            assert( geometryI != _geometries.end() );
            atomic->setGeometry( geometryI->second );            
            TextureI textureI = _textures.find( importData->lightmapId );
            if( textureI != _textures.end() ) 
            {
                atomic->setLightMap( textureI->second );
            }
            _atomics.insert( AtomicT( importData->id, atomic ) );
            iImport->release( importData );
        }
        break;
    case import::itClump:
        {
            import::ImportClump* importData = iImportStream->importClump();
            Clump* clump = new Clump( importData->name );
            FrameI frameI = _frames.find( importData->frameId );
            assert( frameI != _frames.end() );
            clump->setFrame( frameI->second );
            frameI->second->dirty();
            for( int i=0; i<importData->numAtomics; i++ )
            {
                AtomicI atomicI = _atomics.find( importData->atomics[i] );
                assert( atomicI != _atomics.end() );
                clump->add( atomicI->second );
            }
            for( i=0; i<importData->numLights; i++ )
            {
                LightI lightI = _lights.find( importData->lights[i] );
                assert( lightI != _lights.end() );
                clump->add( lightI->second );
            }
            iImport->release( importData );
            /*
			rh2lh( clump->frame() );
            */
            _clumps.push_back( clump );
        }
        break;
    case import::itWorldSector:
        {
            import::ImportWorldSector* importData = iImportStream->importWorldSector();
            
            BSPI bspI = _bspM.find( importData->worldId ); assert( bspI != _bspM.end() );
            BSPSectorI parentSectorI = _bspSectorM.find( importData->parentId );
            BSPSector* parentSector = NULL;
            if( parentSectorI != _bspSectorM.end() ) parentSector = parentSectorI->second;
            AABB boundingBox;
            boundingBox.inf = wrap( importData->aabbInf );
            boundingBox.sup = wrap( importData->aabbSup );
			// rh2lh conversion
            /*
			float temp = boundingBox.inf[2] * -1;
			boundingBox.inf[2] = boundingBox.sup[2] * -1;
			boundingBox.sup[2] = temp;
            */

            int numPrelights = 0; if( importData->prelights ) numPrelights++;

            Geometry* geometry = NULL;

            if( importData->numVertices && importData->numTriangles )
            {
                geometry = new Geometry( 
                    importData->numVertices, 
                    importData->numTriangles, 
                    importData->numUVs, 
                    bspI->second->getNumShaders(),
                    numPrelights,
                    true,
                    strformat( "BSPSector_%x_Shape", importData->id ).c_str()
                );

                geometry->setShaders( bspI->second->getShaders() );

                for( int i=0; i<importData->numVertices; i++ )
                {
                    geometry->getVertices()[i] = wrap( importData->vertices[i] );
                    geometry->getNormals()[i] = wrap( importData->normals[i] );
					// rh2lh conversion
                    /*
					geometry->getVertices()[i][2] *= -1;
                    geometry->getNormals()[i][2] *= -1;
                    */
                    for( int j=0; j<importData->numUVs; j++ ) geometry->getUVSet(j)[i] = wrap( importData->uvs[j][i] );
                    if( numPrelights ) geometry->getPrelights(0)[i] = wrap( importData->prelights[i] );
                }
                for( i=0; i<importData->numTriangles; i++ )
                {
                    /*
                    geometry->getTriangles()[i].set(
                        importData->triangles[i].vertexId[0],
                        importData->triangles[i].vertexId[2],
						importData->triangles[i].vertexId[1],
                        importData->triangles[i].materialId
                    );
                    */
                    geometry->getTriangles()[i].set(
                        importData->triangles[i].vertexId[0],
                        importData->triangles[i].vertexId[1],
                        importData->triangles[i].vertexId[2],
                        importData->triangles[i].materialId
                    );
                }
                geometry->instance();
            }
            BSPSector* sector = new BSPSector( bspI->second, parentSector, boundingBox, geometry );

            TextureI textureI = _textures.find( importData->lightmapId );
            if( textureI != _textures.end() ) 
            {
                sector->setLightMap( textureI->second );
            }

            _bspSectorM.insert( BSPSectorT( importData->id, sector ) );
            iImport->release( importData );
        };
        break;
    case import::itWorld:
        {
            import::ImportWorld* importData = iImportStream->importWorld();
			AABB boundingBox; 
			boundingBox.inf = wrap( importData->aabbInf );
			boundingBox.sup = wrap( importData->aabbSup );			
			// rh2lh conversion
            /*
			float temp = boundingBox.inf[2] * -1;
			boundingBox.inf[2] = boundingBox.sup[2] * -1;
			boundingBox.sup[2] = temp;
            */

            BSP* bsp = new BSP( 
                importData->name,
                boundingBox, 
                importData->numMaterials 
            );
            for( int i=0; i<importData->numMaterials; i++ )
            {
                ShaderI shaderI = _shaders.find( importData->materials[i] );
                assert( shaderI != _shaders.end() );
                bsp->setShader( i, shaderI->second );
            }
            _bspM.insert( BSPT( importData->id, bsp ) );
            _bsps.push_back( bsp );
            iImport->release( importData );
        };
        break;
    case import::itLight:
        {
            import::ImportLight* importData = iImportStream->importLight();

            engine::LightType lightType;
            switch( importData->type )
            {
            case import::ImportLight::ltAmbient:
                lightType = engine::ltAmbient;
                break;
            case import::ImportLight::ltDirectional:
                lightType = engine::ltDirectional;
                break;
            case import::ImportLight::ltPoint:
                lightType = engine::ltPoint;
                break;
            case import::ImportLight::ltSpot:
                lightType = engine::ltSpot;
                break;
            default:
                assert( !"shouldn't be here!" );
            }

            Light* light = new Light( lightType );
            light->setRange( importData->radius );
            light->setDiffuseColor( importData->color );
            light->setSpecularColor( importData->color );
            light->setPhi( importData->coneAngle );
            light->setTheta( importData->coneAngle );
            light->setAttenuation( Vector3f( 0,0.0001f,0 ) );
            
            FrameI frameI = _frames.find( importData->frameId );
            assert( frameI != _frames.end() );
            light->setFrame( frameI->second );

            _lights.insert( LightT( importData->id, light ) );

            iImport->release( importData );
        }
        break;
    default:
        assert( !"shouldn't be here!" );
    }

    iImport->release( iImportStream );
}