AssetObjectT Shader::read(IResource* resource, AssetObjectM& assetObjects) { ChunkHeader shaderHeader( resource ); if( shaderHeader.type != BA_SHADER ) throw Exception( "Unexpected chunk type" ); if( shaderHeader.size != sizeof(Chunk) ) throw Exception( "Incompatible binary asset version" ); Chunk chunk; fread( &chunk, sizeof(Chunk), 1, resource->getFile() ); Shader* shader = new Shader( chunk.numLayers, chunk.name ); for( int i=0; i<chunk.numLayers; i++ ) { AssetObjectI assetObjectI = assetObjects.find( chunk.layerTexture[i] ); if( assetObjectI != assetObjects.end() ) { shader->setLayerTexture( i, reinterpret_cast<Texture*>( assetObjectI->second ) ); } shader->_layerUV[i] = chunk.layerUV[i]; shader->_layerBlending[i] = chunk.layerBlending[i]; shader->_layerConstant[i] = chunk.layerConstant[i]; } shader->_materialColor = chunk.materialColor; AssetObjectI assetObjectI = assetObjects.find( chunk.normalMap ); if( assetObjectI != assetObjects.end() ) { shader->setNormalMap( reinterpret_cast<Texture*>( assetObjectI->second ) ); } shader->_normalMapUV = chunk.normalMapUV; assetObjectI = assetObjects.find( chunk.environmentMap ); if( assetObjectI != assetObjects.end() ) { shader->setEnvironmentMap( reinterpret_cast<Texture*>( assetObjectI->second ) ); } shader->_flags = chunk.flags | engine::sfCaching | engine::sfLighting; shader->_lightset = chunk.lightset; shader->_alphaTestFunction = chunk.alphaTestFunction; shader->_alphaTestRef = chunk.alphaTestRef; shader->_blendOp = chunk.blendOp; shader->_srcBlend = chunk.srcBlend; shader->_dstBlend = chunk.dstBlend; if( chunk.hasEffect ) { AssetObjectT assetObjectT = Effect::read( resource, assetObjects ); shader->setEffect( reinterpret_cast<Effect*>( assetObjectT.second ) ); assetObjects.insert( assetObjectT ); } return AssetObjectT( chunk.id, shader ); }
void Shader::write(IResource* resource) { ChunkHeader shaderHeader( BA_SHADER, sizeof( Chunk ) ); shaderHeader.write( resource ); Chunk chunk; chunk.id = (auid)( this ); memset( chunk.name, 0, engine::maxNameLength ); if( _name.length() > engine::maxNameLength ) { strncpy( chunk.name, _name.c_str(), engine::maxNameLength - 1 ); } else { strcpy( chunk.name, _name.c_str() ); } chunk.numLayers = _numLayers; for( int i=0; i<_numLayers; i++ ) { chunk.layerTexture[i] = (auid)( _layerTexture[i] ); chunk.layerUV[i] = _layerUV[i]; chunk.layerBlending[i] = _layerBlending[i]; chunk.layerConstant[i] = _layerConstant[i]; } chunk.materialColor = _materialColor; chunk.normalMap = (auid)( _normalMap ); chunk.normalMapUV = _normalMapUV; chunk.environmentMap = (auid)( _environmentMap ); chunk.flags = _flags; chunk.lightset = _lightset; chunk.alphaTestFunction = _alphaTestFunction; chunk.alphaTestRef = _alphaTestRef; chunk.blendOp = _blendOp; chunk.srcBlend = _srcBlend; chunk.dstBlend = _dstBlend; chunk.hasEffect = ( _effect != NULL ); fwrite( &chunk, sizeof(Chunk), 1, resource->getFile() ); if( _effect ) { reinterpret_cast<Effect*>( _effect )->write( resource ); } }
static string fragmentSource(string defaultHeader, int maxLights, bool hasTexture){ return shaderHeader(defaultHeader,maxLights,hasTexture) + fragmentShader; }
static string vertexSource(string defaultHeader, int maxLights, bool hasTexture){ return shaderHeader(defaultHeader,maxLights,hasTexture) + vertexShader; }