X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2FEffect.cxx;h=3ad9316216fd0904e039f9c8caeb79f76092ab2c;hb=d04cf4d8978866eb80a1639b6d4ddfe387338c77;hp=940b1f18b15873bd1722f6460287235aaa21683a;hpb=430c60ed1ac8d1c1ee79cdd45f6540d6dc8a5996;p=simgear.git diff --git a/simgear/scene/material/Effect.cxx b/simgear/scene/material/Effect.cxx index 940b1f18..3ad93162 100644 --- a/simgear/scene/material/Effect.cxx +++ b/simgear/scene/material/Effect.cxx @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,7 @@ #include #include +#include #include #include #include @@ -142,7 +144,7 @@ Effect::~Effect() } void buildPass(Effect* effect, Technique* tniq, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { Pass* pass = new Pass; tniq->passes.push_back(pass); @@ -187,12 +189,12 @@ osg::Vec4f getColor(const SGPropertyNode* prop) struct LightingBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; void LightingBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -206,7 +208,7 @@ InstallAttributeBuilder installLighting("lighting"); struct ShadeModelBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -228,7 +230,7 @@ InstallAttributeBuilder installShadeModel("shade-model"); struct CullFaceBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) { @@ -253,6 +255,24 @@ struct CullFaceBuilder : PassAttributeBuilder InstallAttributeBuilder installCullFace("cull-face"); +struct ColorMaskBuilder : PassAttributeBuilder +{ + void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, + const SGReaderWriterXMLOptions* options) + { + const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); + if (!realProp) + return; + + ColorMask *mask = new ColorMask; + Vec4 m = getColor(realProp); + mask->setMask(m.r(), m.g(), m.b(), m.a()); + pass->setAttributeAndModes(mask); + } +}; + +InstallAttributeBuilder installColorMask("color-mask"); + EffectNameValue renderingHintInit[] = { { "default", StateSet::DEFAULT_BIN }, @@ -265,7 +285,7 @@ EffectPropertyMap renderingHints(renderingHintInit); struct HintBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -281,7 +301,7 @@ InstallAttributeBuilder installHint("rendering-hint"); struct RenderBinBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -308,7 +328,7 @@ InstallAttributeBuilder installRenderBin("render-bin"); struct MaterialBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; EffectNameValue colorModeInit[] = @@ -324,7 +344,7 @@ EffectPropertyMap colorModes(colorModeInit); void MaterialBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -394,7 +414,7 @@ EffectPropertyMap blendFuncModes(blendFuncModesInit); struct BlendBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -475,6 +495,99 @@ struct BlendBuilder : public PassAttributeBuilder InstallAttributeBuilder installBlend("blend"); + +EffectNameValue stencilFunctionInit[] = +{ + {"never", Stencil::NEVER }, + {"less", Stencil::LESS}, + {"equal", Stencil::EQUAL}, + {"less-or-equal", Stencil::LEQUAL}, + {"greater", Stencil::GREATER}, + {"not-equal", Stencil::NOTEQUAL}, + {"greater-or-equal", Stencil::GEQUAL}, + {"always", Stencil::ALWAYS} +}; + +EffectPropertyMap stencilFunction(stencilFunctionInit); + +EffectNameValue stencilOperationInit[] = +{ + {"keep", Stencil::KEEP}, + {"zero", Stencil::ZERO}, + {"replace", Stencil::REPLACE}, + {"increase", Stencil::INCR}, + {"decrease", Stencil::DECR}, + {"invert", Stencil::INVERT}, + {"increase-wrap", Stencil::INCR_WRAP}, + {"decrease-wrap", Stencil::DECR_WRAP} +}; + +EffectPropertyMap stencilOperation(stencilOperationInit); + +struct StencilBuilder : public PassAttributeBuilder +{ + void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, + const SGReaderWriterXMLOptions* options) + { + if (!isAttributeActive(effect, prop)) + return; + + const SGPropertyNode* pmode = getEffectPropertyChild(effect, prop, + "mode"); + if (pmode && !pmode->getValue()) { + pass->setMode(GL_STENCIL, StateAttribute::OFF); + return; + } + const SGPropertyNode* pfunction + = getEffectPropertyChild(effect, prop, "function"); + const SGPropertyNode* pvalue + = getEffectPropertyChild(effect, prop, "value"); + const SGPropertyNode* pmask + = getEffectPropertyChild(effect, prop, "mask"); + const SGPropertyNode* psfail + = getEffectPropertyChild(effect, prop, "stencil-fail"); + const SGPropertyNode* pzfail + = getEffectPropertyChild(effect, prop, "z-fail"); + const SGPropertyNode* ppass + = getEffectPropertyChild(effect, prop, "pass"); + + Stencil::Function func = Stencil::ALWAYS; // Always pass + int ref = 0; + unsigned int mask = ~0u; // All bits on + Stencil::Operation sfailop = Stencil::KEEP; // Keep the old values as default + Stencil::Operation zfailop = Stencil::KEEP; + Stencil::Operation passop = Stencil::KEEP; + + ref_ptr stencilFunc = new Stencil; + + if (pfunction) + findAttr(stencilFunction, pfunction, func); + if (pvalue) + ref = pvalue->getIntValue(); + if (pmask) + mask = pmask->getIntValue(); + + if (psfail) + findAttr(stencilOperation, psfail, sfailop); + if (pzfail) + findAttr(stencilOperation, pzfail, zfailop); + if (ppass) + findAttr(stencilOperation, ppass, passop); + + // Set the stencil operation + stencilFunc->setFunction(func, ref, mask); + + // Set the operation, s-fail, s-pass/z-fail, s-pass/z-pass + stencilFunc->setOperation(sfailop, zfailop, passop); + + // Add the operation to pass + pass->setAttributeAndModes(stencilFunc.get()); + } +}; + +InstallAttributeBuilder installStencil("stencil"); + + EffectNameValue alphaComparisonInit[] = { {"never", AlphaFunc::NEVER}, @@ -492,7 +605,7 @@ alphaComparison(alphaComparisonInit); struct AlphaTestBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -603,12 +716,12 @@ void reload_shaders() struct ShaderProgramBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; void ShaderProgramBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* + const SGReaderWriterXMLOptions* options) { using namespace boost; @@ -703,7 +816,7 @@ EffectPropertyMap uniformTypes(uniformTypesInit); struct UniformBuilder :public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -777,7 +890,7 @@ InstallAttributeBuilder installUniform("uniform"); struct NameBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { // name can't use string name = prop->getStringValue(); @@ -799,7 +912,7 @@ EffectPropertyMap polygonModeModes(polygonModeModesInit); struct PolygonModeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -827,7 +940,7 @@ InstallAttributeBuilder installPolygonMode("polygon-mode"); struct VertexProgramTwoSideBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -844,7 +957,7 @@ installTwoSide("vertex-program-two-side"); struct VertexProgramPointSizeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -874,7 +987,7 @@ EffectPropertyMap depthFunction(depthFunctionInit); struct DepthBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -905,7 +1018,7 @@ struct DepthBuilder : public PassAttributeBuilder InstallAttributeBuilder installDepth("depth"); void buildTechnique(Effect* effect, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { Technique* tniq = new Technique; effect->techniques.push_back(tniq); @@ -1011,7 +1124,7 @@ bool makeParametersFromStateSet(SGPropertyNode* effectRoot, const StateSet* ss) // Walk the techniques property tree, building techniques and // passes. -bool Effect::realizeTechniques(const osgDB::ReaderWriter::Options* options) +bool Effect::realizeTechniques(const SGReaderWriterXMLOptions* options) { if (_isRealized) return true;