From: timoore Date: Fri, 21 Dec 2007 06:25:13 +0000 (+0000) Subject: Repaint 2D cloud layers using texture combiner X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=18d30ea8fa0ad68a8dfdde8fb650d4cc2fc13a1a;p=simgear.git Repaint 2D cloud layers using texture combiner Don't change the color in the cloud layer geometry --- diff --git a/simgear/scene/sky/cloud.cxx b/simgear/scene/sky/cloud.cxx index 0b532fd0..cc708724 100644 --- a/simgear/scene/sky/cloud.cxx +++ b/simgear/scene/sky/cloud.cxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -91,7 +92,6 @@ SGMakeState(const SGPath &path, const char* colorTexture, options.get())); stateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON); StateAttributeFactory* attribFactory = StateAttributeFactory::instance(); - stateSet->setTextureAttribute(0, attribFactory->getStandardTexEnv()); stateSet->setAttributeAndModes(attribFactory->getSmoothShadeModel()); stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF); stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF); @@ -153,7 +153,40 @@ SGCloudLayer::SGCloudLayer( const string &tex_path ) : layer_root->addChild(group_top.get()); osg::StateSet *rootSet = layer_root->getOrCreateStateSet(); rootSet->setRenderBinDetails(CLOUDS_BIN, "DepthSortedBin"); - rootSet->setTextureAttribute(0, new osg::TexMat()); + rootSet->setTextureAttribute(0, new osg::TexMat); + // Combiner for fog color and cloud alpha + osg::TexEnvCombine* combine0 = new osg::TexEnvCombine; + osg::TexEnvCombine* combine1 = new osg::TexEnvCombine; + combine0->setCombine_RGB(osg::TexEnvCombine::MODULATE); + combine0->setSource0_RGB(osg::TexEnvCombine::PREVIOUS); + combine0->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); + combine0->setSource1_RGB(osg::TexEnvCombine::TEXTURE0); + combine0->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR); + combine0->setCombine_Alpha(osg::TexEnvCombine::MODULATE); + combine0->setSource0_Alpha(osg::TexEnvCombine::PREVIOUS); + combine0->setOperand0_Alpha(osg::TexEnvCombine::SRC_ALPHA); + combine0->setSource1_Alpha(osg::TexEnvCombine::TEXTURE0); + combine0->setOperand1_Alpha(osg::TexEnvCombine::SRC_ALPHA); + + combine1->setCombine_RGB(osg::TexEnvCombine::MODULATE); + combine1->setSource0_RGB(osg::TexEnvCombine::PREVIOUS); + combine1->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); + combine1->setSource1_RGB(osg::TexEnvCombine::CONSTANT); + combine1->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR); + combine1->setCombine_Alpha(osg::TexEnvCombine::MODULATE); + combine1->setSource0_Alpha(osg::TexEnvCombine::PREVIOUS); + combine1->setOperand0_Alpha(osg::TexEnvCombine::SRC_ALPHA); + combine1->setSource1_Alpha(osg::TexEnvCombine::CONSTANT); + combine1->setOperand1_Alpha(osg::TexEnvCombine::SRC_ALPHA); + combine1->setDataVariance(osg::Object::DYNAMIC); + rootSet->setTextureAttributeAndModes(0, combine0); + rootSet->setTextureAttributeAndModes(1, combine1); + rootSet->setTextureMode(1, GL_TEXTURE_2D, osg::StateAttribute::ON); + rootSet->setTextureAttributeAndModes(1, StateAttributeFactory::instance() + ->getWhiteTexture(), + osg::StateAttribute::ON); + rootSet->setDataVariance(osg::Object::DYNAMIC); + base = osg::Vec2(sg_random(), sg_random()); group_top->addChild(layer_transform.get()); @@ -516,8 +549,7 @@ SGCloudLayer::rebuild() //OSGFIXME: true if ( layer_states[layer_coverage].valid() ) { - osg::CopyOp copyOp(osg::CopyOp::DEEP_COPY_ALL - & ~osg::CopyOp::DEEP_COPY_TEXTURES); + osg::CopyOp copyOp; // shallow copy // render bin will be set in reposition osg::StateSet* stateSet = static_cast(layer_states2[layer_coverage]->clone(copyOp)); stateSet->setDataVariance(osg::Object::DYNAMIC); @@ -783,30 +815,12 @@ ss->setTextureAttributeAndModes(0, te, osg::StateAttribute::OVERRIDE | osg::Stat // repaint the cloud layer colors bool SGCloudLayer::repaint( const SGVec3f& fog_color ) { - for ( int i = 0; i < 4; i++ ) { - osg::Vec4 color(fog_color.osg(), 1); - color[3] = (i == 0) ? 0.0f : cloud_alpha * 0.15f; - (*cl[i])[0] = color; - - for ( int j = 0; j < 4; ++j ) { - color[3] = - ((j == 0) || (i == 3)) ? - ((j == 0) && (i == 3)) ? 0.0f : cloud_alpha * 0.15f : cloud_alpha; - (*cl[i])[(2*j) + 1] = color; - - color[3] = - ((j == 3) || (i == 0)) ? - ((j == 3) && (i == 0)) ? 0.0f : cloud_alpha * 0.15f : cloud_alpha; - (*cl[i])[(2*j) + 2] = color; - } - - color[3] = (i == 3) ? 0.0f : cloud_alpha * 0.15f; - (*cl[i])[9] = color; - - cl[i]->dirty(); - } - - return true; + osg::Vec4f combineColor(fog_color.osg(), cloud_alpha); + osg::TexEnvCombine* combiner + = dynamic_cast(layer_root->getStateSet() + ->getTextureAttribute(1, osg::StateAttribute::TEXENV)); + combiner->setConstantColor(combineColor); + return true; } // reposition the cloud layer at the specified origin and orientation diff --git a/simgear/scene/util/StateAttributeFactory.cxx b/simgear/scene/util/StateAttributeFactory.cxx index 3071ef3e..17a1e305 100644 --- a/simgear/scene/util/StateAttributeFactory.cxx +++ b/simgear/scene/util/StateAttributeFactory.cxx @@ -1,5 +1,27 @@ +/* -*-c++-*- + * + * Copyright (C) 2007 Tim Moore + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + #include +#include #include "StateAttributeFactory.hxx" using namespace osg; @@ -24,6 +46,17 @@ StateAttributeFactory::StateAttributeFactory() _standardTexEnv = new TexEnv; _standardTexEnv->setMode(TexEnv::MODULATE); _standardTexEnv->setDataVariance(Object::STATIC); + osg::Image *dummyImage = new osg::Image; + dummyImage->allocateImage(1, 1, 1, GL_LUMINANCE_ALPHA, + GL_UNSIGNED_BYTE); + unsigned char* imageBytes = dummyImage->data(0, 0); + imageBytes[0] = 255; + imageBytes[1] = 255; + _whiteTexture = new osg::Texture2D; + _whiteTexture->setImage(dummyImage); + _whiteTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); + _whiteTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); + _whiteTexture->setDataVariance(osg::Object::STATIC); } osg::ref_ptr StateAttributeFactory::_theInstance; diff --git a/simgear/scene/util/StateAttributeFactory.hxx b/simgear/scene/util/StateAttributeFactory.hxx index f8192df9..080a386f 100644 --- a/simgear/scene/util/StateAttributeFactory.hxx +++ b/simgear/scene/util/StateAttributeFactory.hxx @@ -1,3 +1,24 @@ +/* -*-c++-*- + * + * Copyright (C) 2007 Tim Moore + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + #ifndef SIMGEAR_STATEATTRIBUTEFACTORY_HXX #define SIMGEAR_STATEATTRIBUTEFACTORY_HXX 1 @@ -6,6 +27,7 @@ #include #include #include +#include #include // Return read-only instances of common OSG state attributes. @@ -21,6 +43,8 @@ public: osg::TexEnv* getStandardTexEnv() { return _standardTexEnv.get(); } osg::ShadeModel* getSmoothShadeModel() { return _smooth.get(); } osg::ShadeModel* getFlatShadeModel() { return _flat.get(); } + // White, repeating texture + osg::Texture2D* getWhiteTexture() { return _whiteTexture.get(); } static StateAttributeFactory* instance(); protected: StateAttributeFactory(); @@ -29,6 +53,7 @@ protected: osg::ref_ptr _flat; osg::ref_ptr _standardBlendFunc; osg::ref_ptr _standardTexEnv; + osg::ref_ptr _whiteTexture; static osg::ref_ptr _theInstance; static OpenThreads::Mutex _instanceMutex; };