Show
Ignore:
Timestamp:
04/19/06 15:04:21 (8 years ago)
Author:
robert
Message:

Convertered shaders across to using modelview matrix instead of uniforms.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgprecipitation/osgprecipitation.cpp

    r5095 r5096  
    4646        fogEnd(1000.0), 
    4747        fogColour(0.5, 0.5, 0.5, 1.0), 
    48         clearColour(0.5, 0.5, 0.5, 1.0) 
     48        clearColour(0.5, 0.5, 0.5, 1.0), 
     49        useFarLineSegments(false) 
    4950    { 
    5051        rain(0.5); 
     
    6566        fogColour.set(0.5, 0.5, 0.5, 1.0); 
    6667        clearColour.set(0.5, 0.5, 0.5, 1.0); 
     68        useFarLineSegments = false; 
    6769    } 
    6870 
     
    8183        fogColour.set(0.6, 0.6, 0.6, 1.0); 
    8284        clearColour.set(0.6, 0.6, 0.6, 1.0); 
     85        useFarLineSegments = false; 
    8386    } 
    8487 
     
    98101    osg::Vec4           fogColour; 
    99102    osg::Vec4           clearColour; 
     103    bool                useFarLineSegments; 
    100104}; 
    101105 
     
    139143        void setPosition(const osg::Vec3& position) { _position = position; } 
    140144        const osg::Vec3& getPosition() const { return _position; } 
     145         
     146        void setScale(const osg::Vec3& scale) { _scale = scale; } 
     147        const osg::Vec3& getScale() const { return _scale; } 
    141148         
    142149        void setStartTime(float time) { _startTime = time; } 
     
    164171            glNormal3fv(_position.ptr()); 
    165172            extensions->glMultiTexCoord1f(GL_TEXTURE0+1, _startTime); 
    166  
     173             
     174            glPushMatrix(); 
     175             
     176            osg::Matrix modelview = state.getModelViewMatrix(); 
     177            modelview.preMult(osg::Matrix::translate(_position)); 
     178            modelview.preMult(osg::Matrix::scale(_scale)); 
     179             
     180            bool isPoint = (_internalGeometry->getName()=="point"); 
     181             
     182            glLoadMatrix(modelview.ptr()); 
     183             
     184            if (!isPoint) 
     185            { 
     186                state.setActiveTextureUnit(0); 
     187                glMatrixMode( GL_TEXTURE ); 
     188 
     189                glPushMatrix(); 
     190 
     191                glLoadMatrix(_previousModelView.ptr()); 
     192 
     193                _previousModelView = modelview; 
     194            } 
     195#if 0             
     196            else 
     197            { 
     198                state.setActiveTextureUnit(0); 
     199                glMatrixMode( GL_TEXTURE ); 
     200 
     201                glPushMatrix(); 
     202 
     203                glLoadIdentity(); 
     204 
     205                _previousModelView = modelview; 
     206            }       
     207#endif                         
    167208            _internalGeometry->draw(state); 
    168209             
     
    206247                s_NumberPointsVertices+= _internalGeometry->getVertexArray()->getNumElements(); 
    207248            } 
     249         
     250            if (!isPoint) 
     251            { 
     252                glPopMatrix(); 
     253                glMatrixMode( GL_MODELVIEW ); 
     254            } 
     255             
     256            glPopMatrix(); 
    208257        } 
    209258 
     
    216265 
    217266        osg::Vec3                   _position; 
     267        osg::Vec3                   _scale; 
    218268        float                       _startTime; 
    219269        osg::ref_ptr<osg::Geometry> _internalGeometry; 
     270        mutable osg::Matrix                 _previousModelView; 
    220271 
    221272}; 
     
    452503#ifdef USE_LOCAL_SHADERS 
    453504        char vertexShaderSource[] =  
    454             "uniform vec3 dv_i;\n" 
    455             "uniform vec3 dv_j;\n" 
    456             "uniform vec3 dv_k;\n" 
    457             "\n" 
    458505            "uniform float inversePeriod;\n" 
    459506            "uniform vec4 particleColour;\n" 
     
    462509            "uniform float osg_FrameTime;\n" 
    463510            "uniform float osg_DeltaFrameTime;\n" 
    464             "uniform mat4 previousModelViewMatrix;\n" 
    465511            "\n" 
    466512            "varying vec4 colour;\n" 
     
    469515            "void main(void)\n" 
    470516            "{\n" 
    471             "    vec3 pos = gl_Normal.xyz + (gl_Vertex.x*dv_i) + (dv_j * gl_Vertex.y);\n" 
    472             "    \n" 
    473517            "    float offset = gl_Vertex.z;\n" 
     518            "    float startTime = gl_MultiTexCoord1.x;\n" 
    474519            "    texCoord = gl_MultiTexCoord0.xy;\n" 
    475             "    float startTime = gl_MultiTexCoord1.x;\n" 
    476             "\n" 
    477             "    vec3 v_previous = pos + dv_k * fract( (osg_FrameTime - startTime)*inversePeriod - offset);\n" 
    478             "    vec3 v_current = v_previous + dv_k * (osg_DeltaFrameTime*inversePeriod);\n" 
    479             "    \n" 
     520            "\n" 
     521            "    vec4 v_previous = gl_Vertex;\n" 
     522            "    v_previous.z = fract( (osg_FrameTime - startTime)*inversePeriod - offset);\n" 
     523            "    \n" 
     524            "    vec4 v_current =  v_previous;\n" 
     525            "    v_current.z += (osg_DeltaFrameTime*inversePeriod);\n" 
     526            "    \n" 
     527            "\n" 
    480528            "    colour = particleColour;\n" 
    481529            "    \n" 
    482             "    vec4 v1 = gl_ModelViewMatrix * vec4(v_current,1.0);\n" 
    483             "    vec4 v2 = previousModelViewMatrix * vec4(v_previous,1.0);\n" 
     530            "    vec4 v1 = gl_ModelViewMatrix * v_current;\n" 
     531            "    vec4 v2 = gl_TextureMatrix[0] * v_previous;\n" 
    484532            "    \n" 
    485533            "    vec3 dv = v2.xyz - v1.xyz;\n" 
     
    531579#ifdef USE_LOCAL_SHADERS 
    532580        char vertexShaderSource[] =  
    533             "uniform vec3 dv_i;\n" 
    534             "uniform vec3 dv_j;\n" 
    535             "uniform vec3 dv_k;\n" 
    536             "\n" 
    537581            "uniform float inversePeriod;\n" 
    538582            "uniform vec4 particleColour;\n" 
     
    548592            "void main(void)\n" 
    549593            "{\n" 
    550             "    vec3 pos = gl_Normal.xyz + (gl_Vertex.x*dv_i) + (dv_j * gl_Vertex.y);\n" 
    551             "    \n" 
    552             "\n" 
    553594            "    float offset = gl_Vertex.z;\n" 
     595            "    float startTime = gl_MultiTexCoord1.x;\n" 
    554596            "    texCoord = gl_MultiTexCoord0.xy;\n" 
    555             "    float startTime = gl_MultiTexCoord1.x;\n" 
    556             "\n" 
    557             "    vec3 v_previous = pos + dv_k * fract( (osg_FrameTime - startTime)*inversePeriod - offset);\n" 
    558             "    vec3 v_current = v_previous + dv_k * (osg_DeltaFrameTime*inversePeriod);\n" 
     597            "\n" 
     598            "    vec4 v_previous = gl_Vertex;\n" 
     599            "    v_previous.z = fract( (osg_FrameTime - startTime)*inversePeriod - offset);\n" 
     600            "    \n" 
     601            "    vec4 v_current =  v_previous;\n" 
     602            "    v_current.z += (osg_DeltaFrameTime*inversePeriod);\n" 
    559603            "    \n" 
    560604            "    colour = particleColour;\n" 
    561605            "    \n" 
    562             "    vec4 v1 = gl_ModelViewMatrix * vec4(v_current,1.0);\n" 
    563             "    vec4 v2 = previousModelViewMatrix * vec4(v_previous,1.0);\n" 
     606            "    vec4 v1 = gl_ModelViewMatrix * v_current;\n" 
     607            "    vec4 v2 = gl_TextureMatrix[0] * v_previous;\n" 
    564608            "    \n" 
    565609            "    vec3 dv = v2.xyz - v1.xyz;\n" 
     
    569613            "    \n" 
    570614            "    float area = length(dv.xy);\n" 
    571             "    colour.a = 0.1+(particleSize)/area;\n" 
     615            "    colour.a = (particleSize)/area;\n" 
    572616            "    \n" 
    573617            "    v1.xyz += dv*texCoord.y;\n" 
    574618            "    \n" 
    575619            "    gl_Position = gl_ProjectionMatrix * v1;\n" 
    576             "}"; 
     620            "}\n"; 
    577621 
    578622        char fragmentShaderSource[] =  
     
    607651#ifdef USE_LOCAL_SHADERS 
    608652        char vertexShaderSource[] =  
    609             "uniform vec3 dv_i;\n" 
    610             "uniform vec3 dv_j;\n" 
    611             "uniform vec3 dv_k;\n" 
    612             "\n" 
    613653            "uniform float inversePeriod;\n" 
    614654            "uniform vec4 particleColour;\n" 
     
    618658            "\n" 
    619659            "varying vec4 colour;\n" 
    620             "varying vec2 texCoord;\n" 
    621660            "\n" 
    622661            "void main(void)\n" 
    623662            "{\n" 
    624             "    vec3 pos = gl_Normal.xyz + (gl_Vertex.x*dv_i) + (dv_j * gl_Vertex.y);\n" 
    625             "    texCoord = gl_MultiTexCoord0.xy;\n" 
    626             "\n" 
     663            "    float offset = gl_Vertex.z;\n" 
    627664            "    float startTime = gl_MultiTexCoord1.x;\n" 
    628665            "\n" 
    629             "    vec3 v_current = pos + dv_k * fract( (osg_FrameTime - startTime)*inversePeriod - gl_Vertex.z);\n" 
     666            "    vec4 v_current = gl_Vertex;\n" 
     667            "    v_current.z = fract( (osg_FrameTime - startTime)*inversePeriod - offset);\n" 
    630668            "   \n" 
    631669            "    colour = particleColour;\n" 
    632670            "\n" 
    633             "    gl_Position = gl_ModelViewProjectionMatrix * vec4(v_current,1.0);\n" 
     671            "    gl_Position = gl_ModelViewProjectionMatrix * v_current;\n" 
    634672            "\n" 
    635673            "    float pointSize = abs(1280.0*particleSize / gl_Position.w);\n" 
     674            "\n" 
    636675            "    //gl_PointSize = max(ceil(pointSize),2);\n" 
    637676            "    gl_PointSize = ceil(pointSize);\n" 
     
    642681        char fragmentShaderSource[] =  
    643682            "uniform sampler2D baseTexture;\n" 
    644             "varying vec2 texCoord;\n" 
    645683            "varying vec4 colour;\n" 
    646684            "\n" 
    647685            "void main (void)\n" 
    648686            "{\n" 
    649             "    gl_FragColor = colour * texture2D( baseTexture, texCoord);\n" 
     687            "    gl_FragColor = colour * texture2D( baseTexture, gl_TexCoord[0]);\n" 
    650688            "}\n"; 
    651689 
     
    655693        // get shaders from source 
    656694        program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile("point_rain.vert"))); 
    657         program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("rain.frag"))); 
     695        program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("point_rain.frag"))); 
    658696#endif 
    659697 
     
    671709 
    672710 
    673 osg::Node* createRainEffect(const osg::BoundingBox& bb, const osg::Vec3& velocity, float nearTransition, float farTransition) 
     711osg::Node* createRainEffect(const osg::BoundingBox& bb, const PrecipatationParameters& parameters) 
    674712{ 
    675713    osg::LOD* lod = new osg::LOD; 
     
    680718 
    681719    // time taken to get from start to the end of cycle 
    682     float period = fabs((bb.zMax()-bb.zMin()) / velocity.z()); 
     720    float period = fabs((bb.zMax()-bb.zMin()) / parameters.particleVelocity.z()); 
    683721    osg::Vec3 dv_i( bb.xMax()-bb.xMin(), 0.0f, 0.0f ); 
    684722    osg::Vec3 dv_j( 0.0f, bb.yMax()-bb.yMin(), 0.0f ); 
    685     osg::Vec3 dv_k( velocity * period ); 
     723    osg::Vec3 dv_k( parameters.particleVelocity * period ); 
     724 
     725    osg::Vec3 scale( bb.xMax()-bb.xMin(), bb.yMax()-bb.yMin(), parameters.particleVelocity.z() * period); 
    686726 
    687727    float startTime = random(0, period); 
     
    697737        geometry->setName("highres"); 
    698738        geometry->setPosition(position); 
     739        geometry->setScale(scale); 
    699740        geometry->setStartTime(startTime); 
    700741        geometry->setInitialBound(bb); 
     
    702743        geometry->setStateSet(quad_stateset.get()); 
    703744         
    704         lod->addChild( highres_geode, 0.0f, nearTransition ); 
    705     } 
    706      
    707     // low res LOD 
     745        lod->addChild( highres_geode, 0.0f, parameters.nearTransition ); 
     746    } 
     747 
     748 
     749    if (parameters.useFarLineSegments) 
    708750    { 
    709751        osg::Geode* lowres_geode = new osg::Geode; 
     
    716758        geometry->setName("lowres"); 
    717759        geometry->setPosition(position); 
     760        geometry->setScale(scale); 
     761        geometry->setStartTime(startTime); 
     762        geometry->setInitialBound(bb); 
     763        geometry->setInternalGeometry(line_geometry.get()); 
     764        geometry->setStateSet(line_stateset.get()); 
     765         
     766        lod->addChild( lowres_geode, parameters.nearTransition, parameters.farTransition ); 
     767    } 
     768    else 
     769    { 
     770        osg::Geode* lowres_geode = new osg::Geode; 
     771 
     772 
     773        PrecipitationGeometry* geometry = new PrecipitationGeometry; 
     774 
     775        lowres_geode->addDrawable(geometry); 
     776 
     777        geometry->setName("lowres"); 
     778        geometry->setPosition(position); 
     779        geometry->setScale(scale); 
    718780        geometry->setStartTime(startTime); 
    719781        geometry->setInitialBound(bb); 
     
    721783        geometry->setStateSet(point_stateset.get()); 
    722784         
    723         lod->addChild( lowres_geode, nearTransition, farTransition ); 
     785        lod->addChild( lowres_geode, parameters.nearTransition, parameters.farTransition ); 
    724786    } 
    725787 
     
    759821                                     bb.zMax()); 
    760822 
    761             group->addChild(createRainEffect(bbLocal, parameters.particleVelocity, parameters.nearTransition, parameters.farTransition)); 
     823            group->addChild(createRainEffect(bbLocal, parameters)); 
    762824        }         
    763825    } 
     
    779841    osg::Vec3 dv_k( parameters.particleVelocity * period ); 
    780842 
    781     // set up uniforms 
    782     // osg::Uniform* position_Uniform = new osg::Uniform("position",position); 
    783     osg::Uniform* dv_i_Uniform = new osg::Uniform("dv_i",dv_i); 
    784     osg::Uniform* dv_j_Uniform = new osg::Uniform("dv_j",dv_j); 
    785     osg::Uniform* dv_k_Uniform = new osg::Uniform("dv_k",dv_k); 
    786843 
    787844    osg::Uniform* inversePeriodUniform = new osg::Uniform("inversePeriod",1.0f/period); 
    788845    //osg::Uniform* startTime = new osg::Uniform("startTime",0.0f); 
    789846 
    790     //stateset->addUniform(position_Uniform); // vec3 
    791     stateset->addUniform(dv_i_Uniform); // vec3 could be float  
    792     stateset->addUniform(dv_j_Uniform); // vec3 could be float 
    793     stateset->addUniform(dv_k_Uniform); // vec3 
    794847    stateset->addUniform(inversePeriodUniform); // float 
    795848    //stateset->addUniform(startTime); // float 
     
    807860    stateset->addUniform(new osg::Uniform("particleSize", parameters.particleSize)); 
    808861   
    809     osg::Uniform* previousModelViewUniform = new osg::Uniform("previousModelViewMatrix",osg::Matrix()); 
    810     stateset->addUniform(previousModelViewUniform); 
    811      
    812     group->setCullCallback(new CullCallback(previousModelViewUniform)); 
     862    // osg::Uniform* previousModelViewUniform = new osg::Uniform("previousModelViewMatrix",osg::Matrix()); 
     863    // stateset->addUniform(previousModelViewUniform); 
     864     
     865    // group->setCullCallback(new CullCallback(previousModelViewUniform)); 
    813866 
    814867 
     
    940993    while (arguments.read("--fogColour", parameters.fogColour.r(), parameters.fogColour.g(), parameters.fogColour.b(), parameters.fogColour.a())) {} 
    941994  
     995    while (arguments.read("--useFarLineSegments")) { parameters.useFarLineSegments = true; } 
    942996 
    943997    viewer.setClearColor(parameters.clearColour);