Ejemplo n.º 1
0
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 );
}
Ejemplo n.º 2
0
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 );
    }
}
Ejemplo n.º 3
0
static string fragmentSource(string defaultHeader, int maxLights, bool hasTexture){
	return shaderHeader(defaultHeader,maxLights,hasTexture) + fragmentShader;
}
Ejemplo n.º 4
0
static string vertexSource(string defaultHeader, int maxLights, bool hasTexture){
	return shaderHeader(defaultHeader,maxLights,hasTexture) + vertexShader;
}