Exemplo n.º 1
0
StatePtr PhongMaterial::makeState(void)
{
    StatePtr state = State::create();

    prepareLocalChunks();

    Color3f v3;
    Color4f v4;
    float alpha = 1.f - getTransparency();

    prepareLocalChunks();

    beginEditCP(_materialChunk);
    v3 = getAmbient();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setAmbient(v4);

    v3 = getDiffuse();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setDiffuse(v4);

    v3 = getSpecular();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setSpecular(v4);

    _materialChunk->setShininess(getShininess());

    v3 = getEmission();
    v4.setValuesRGBA(v3[0], v3[1], v3[2], alpha);
    _materialChunk->setEmission(v4);

    _materialChunk->setLit(getLit());
    _materialChunk->setColorMaterial(getColorMaterial());
    endEditCP  (_materialChunk);
    state->addChunk(_materialChunk);

    if(isTransparent())
        state->addChunk(_blendChunk);

    if(_vpChunk != NullFC)
        state->addChunk(_vpChunk);

    createFragmentProgram();

    if(_fpChunk != NullFC)
        state->addChunk(_fpChunk);

    for(MFStateChunkPtr::iterator i  = _mfChunks.begin();
            i != _mfChunks.end();
            ++i)
    {
        state->addChunk(*i);
    }

    return state;
}
StatePtr SimpleTexturedMaterial::makeState(void)
{
    StatePtr state = Inherited::makeState();

    prepareLocalChunks();

    state->addChunk(_textureChunk);
    state->addChunk(_texGenChunk);

    if(getImage() != NullFC &&
       getImage()->hasAlphaChannel() && 
       getEnvMode() != GL_DECAL)
    {
        if(getImage()->isAlphaBinary())
        {
            if(_blendChunk->getSrcFactor() == GL_SRC_ALPHA)
            {
                beginEditCP(_blendChunk);
                _blendChunk->setSrcFactor(GL_ONE);
                _blendChunk->setDestFactor(GL_ZERO);
                _blendChunk->setAlphaFunc(GL_NOTEQUAL);
                _blendChunk->setAlphaValue(0);          
                endEditCP(_blendChunk);            
            }
        }
        else
        {
            if(_blendChunk->getSrcFactor() != GL_SRC_ALPHA)
            {
                beginEditCP(_blendChunk);
                _blendChunk->setSrcFactor(GL_SRC_ALPHA);
                _blendChunk->setDestFactor(GL_ONE_MINUS_SRC_ALPHA);
                _blendChunk->setAlphaFunc(GL_NONE);
                _blendChunk->setAlphaValue(0);          
                endEditCP(_blendChunk);                        
            }
        }
    }

    return state;
}