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; }