Hi,

I'm having problem updating my nodes geometry vertex data manually. I can't see 
the changes when I change the vertex values...
My code... to initialize:

Code:

...
for(int i=0;i<_morphParts.size();i++)
        {
                osg::ref_ptr<osg::Node> morphNode;
                if(_morphParts[i].compare(""))
                        morphNode = modelNode->findGeodeNode(_morphParts[i]);
                if(morphNode.valid()){
                        osg::ref_ptr<osg::Geometry> geometry = 
morphNode->asGeode()->getDrawable(0)->asGeometry();
                        _geometryBases.push_back(geometry);
                        // Disable Display lists and setup Vertex Buffer Objects
                        _geometryBases.back()->setUseDisplayList (false);
                        _geometryBases.back()->setUseVertexBufferObjects(true);
                        
_geometryBases.back()->setDataVariance(osg::Object::DYNAMIC);
                        osg::VertexBufferObject* df = 
_geometryBases.back()->getOrCreateVertexBufferObject();
                        df->setUsage (GL_STREAM_DRAW);
                        if 
(_geometryBases.back()->getInternalOptimizedGeometry())
                                
_geometryBases.back()->computeInternalOptimizedGeometry();
                        
_geometryBasesOrig.push_back(dynamic_cast<osg::Geometry*>(morphNode->asGeode()->getDrawable(0)->asGeometry()->
                                clone( osg::CopyOp::DEEP_COPY_ALL)));

                        std::vector<osg::ref_ptr<osgAnimation::MorphGeometry>> 
morphGeometrys;
                }
                else
                        printf("erro finding morph target in the model, 
%s\n",_morphParts[i].c_str());
        }
...



And when I update the values...

Code:

void MorphManager::update()
{
        if(_morphTargetBuffer.size()>0)
        {
                float t = 1.0;

                osg::ref_ptr<osg::Geometry> geometry = _geometryBases[0];
                if (geometry.valid())
                        geometry = geometry->getInternalOptimizedGeometry();
                osg::ref_ptr<osg::Geometry> origGeometry = 
_geometryBasesOrig[0];
                if (origGeometry.valid())
                        origGeometry = 
origGeometry->getInternalOptimizedGeometry();

                osg::Vec3Array* origArray = 
dynamic_cast<osg::Vec3Array*>(origGeometry->getVertexArray());
                osg::Vec3Array* resultArray = 
dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());

                osg::Vec3Array* origNormal = 
dynamic_cast<osg::Vec3Array*>(origGeometry->getNormalArray());
                osg::Vec3Array* resultNormal = 
dynamic_cast<osg::Vec3Array*>(geometry->getNormalArray());
                
                //initialize result
                osg::Vec3Array::iterator res = resultArray->begin();
                osg::Vec3Array::iterator resNormal = resultNormal->begin();
                osg::Vec3Array::iterator oNormal = origNormal->begin();
                for(osg::Vec3Array::iterator orig = origArray->begin(); orig != 
origArray->end();orig++)
                {
                        res->set(orig->x(),orig->y(),orig->z());
                        resNormal->set(oNormal->x(),oNormal->y(),oNormal->z());
                        res++; resNormal++; oNormal++;
                }
                for(int i=0;i<_morphTargetBuffer.size();i++)
                {
                        osg::Vec3Array* morphTarget = 
dynamic_cast<osg::Vec3Array*>(
                                
_partsMorphGeometrys[_morphTargetBuffer[i]->id][0]->getVertexArray());
                        osg::Vec3Array* morphNormal = 
dynamic_cast<osg::Vec3Array*>(
                                
_partsMorphGeometrys[_morphTargetBuffer[i]->id][0]->getNormalArray());

                        osg::Vec3Array::iterator morph = morphTarget->begin();
                        osg::Vec3Array::iterator morphN = morphNormal->begin();
                        resNormal = resultNormal->begin();
                        for(osg::Vec3Array::iterator res = 
resultArray->begin(); res != resultArray->end();res++)
                        {
                                res->set(0,0,0);//res->x()*(1-t) + 
morph->x()*t,res->y()*(1-t) + morph->y()*t,res->z()*(1-t) + morph->z()*t);
                                resNormal->set(resNormal->x()*(1-t) + 
morphN->x()*t,resNormal->y()*(1-t) + morphN->y()*t,
                                        resNormal->z()*(1-t) + morphN->z()*t);
                                resNormal->normalize();
                                morph++; resNormal++; morphN++;
                        }
                }

                resultArray->dirty();
                resultNormal->dirty();
                geometry->dirtyBound();

        }
}




All is loaded well and in debug mode i can see how change the vertex values... 
but i can't see the results. i supose I forgot something...

Can I help me anyone please????

Thank you!

Cheers,
Aitor

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=43448#43448





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to