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