Thread: [cgkit-commits] cgkit2/wrappers/osg osgcore.cpp,1.2,1.3 osgcore.h,1.2,1.3
Brought to you by:
mbaas
From: ocil <oc...@us...> - 2006-02-07 10:01:46
|
Update of /cvsroot/cgkit/cgkit2/wrappers/osg In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21717/wrappers/osg Modified Files: osgcore.cpp osgcore.h Log Message: simple mesh support Index: osgcore.cpp =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/osg/osgcore.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** osgcore.cpp 7 Feb 2006 08:47:40 -0000 1.2 --- osgcore.cpp 7 Feb 2006 10:01:35 -0000 1.3 *************** *** 22,28 **** --- 22,212 ---- #include "osgcore.h" + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + ///////////////////////////// -- ///////////////////////////// + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + + void createMesh(support3d::TriMeshGeom *trigeom, osg::Geometry *pGeometry) + { + int i,j; + bool normals; + osg::Vec3Array* pMeshVertices = 0; + osg::DrawElementsUInt* pElements = 0; + + std::cout << "--------------------------------------------------------" << std::endl; + std::cout << "creating OPENSCENEGRAPH mesh" << std::endl; + if (trigeom == 0 || pGeometry == 0) + { + std::cout << "invalid pointer, returning!" << std::endl; + return; + } + + std::cout << "vertices @ "<< trigeom->verts.dataPtr() << std::endl; + std::cout << "indices @ "<< trigeom->faces.dataPtr() << std::endl; + + pMeshVertices = new osg::Vec3Array; + pElements = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0); + + support3d::vec3d* pVertices = trigeom->verts.dataPtr(); + support3d::vec3d* vertsptr2 = trigeom->verts.dataPtr(); + + int* faceptr = trigeom->faces.dataPtr(); + int* faceptr2 = trigeom->faces.dataPtr(); + int* faceptr3 = trigeom->faces.dataPtr(); + + int numfaces = trigeom->faces.size(); + int numverts = trigeom->verts.size(); + + std::cout << "checking normals" << std::endl; + normals = false; + + support3d::PrimVarInfo *pNormalsVarInfo = trigeom->findVariable("N"); + support3d::vec3d *pNormals=0; + support3d::ArraySlot<support3d::vec3d>* normsptr = 0; + + if (pNormalsVarInfo == 0 + || pNormalsVarInfo->storage != support3d::VARYING + || pNormalsVarInfo->type != support3d::NORMAL + || pNormalsVarInfo->multiplicity != 1 ) + { + std::cout << "could not assign normals, hence i will calculate them" << std::endl; + normals = false; + } + else + { + std::cout << "reading normals ..." << std::endl; + + normsptr = dynamic_cast<support3d::ArraySlot<support3d::vec3d>*>(pNormalsVarInfo->slot); + pNormals = normsptr->dataPtr(); + + std::cout << "...count: " << normsptr->size() << std::endl; + normals = true; + } + // ......................... Vorarbeit Ende + + support3d::vec3d *normalsVector=0; + normalsVector = new support3d::vec3d[numverts]; + + for (i = 0; i < numfaces; i++) + { + int ia,ib,ic; + support3d::vec3d normal; + normal.set(0.0, 0.0, 0.0); + + ia = *faceptr; + pElements->push_back(*faceptr); + faceptr++; + + ib = *faceptr; + pElements->push_back(*faceptr); + faceptr++; + + ic = *faceptr; + pElements->push_back(*faceptr); + faceptr++; + + // NORMALS + if (!normals) + { + try + { + normal = ( normal.cross( *(vertsptr2+ib) - *(vertsptr2+ia), *(vertsptr2+ic) - *(vertsptr2+ia) ) ); + normal = normal.normalize(); + } + catch(...) + { + std::cout << "Warning: (0,0,0) normal detected!" << std::endl; + normal.set(0,0,0); + } + + // NORMALS part (face-normals) setzen, also insgesamt 3mal, zu den korrespondierenden ia, ib, ic vertices + normalsVector[ia]=normal; + normalsVector[ib]=normal; + normalsVector[ic]=normal; + } + } + std::cout << "index buffer filled" << std::endl; + + for (i = 0; i < numverts; i++) + { + if (normals) + { + pMeshVertices->push_back( osg::Vec3(pVertices->x, pVertices->y, pVertices->z) ); + /* + pVertexInfo[i] = ( S3DVertex( pVertices->x, pVertices->y, pVertices->z, + pNormals->x, pNormals->y, pNormals->z, + SColor(128, 255, 128, 128), + 0.0f, 0.0f ) ); + */ + } + else + { + pMeshVertices->push_back( osg::Vec3(pVertices->x, pVertices->y, pVertices->z) ); + /* + pVertexInfo[i] = ( S3DVertex( pVertices->x, pVertices->y, pVertices->z, + normalsVector[i].x, normalsVector[i].y, normalsVector[i].z, + SColor(128, 255, 128, 128), + 0.0f, 0.0f ) ); + */ + } + pVertices++; + pNormals++; + } + std::cout << "vertex buffer filled" << std::endl; + + pGeometry->setVertexArray( pMeshVertices ); + pGeometry->addPrimitiveSet( pElements ); + } + + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + ///////////////////////////// -- ///////////////////////////// + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + + void OsgDependent::setup(support3d::WorldObject *pWorldObject, osg::Node *pSceneNode) + { + mpWorldObject = pWorldObject; + mpSceneNode = pSceneNode; + } + + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + ///////////////////////////// -- ///////////////////////////// + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + + void OsgDependent::onValueChanged() + { + osg::MatrixTransform* pMtxT = (mpSceneNode->asTransform())->asMatrixTransform(); + if (pMtxT != 0) + { + double *pValueList = 0; + mpWorldObject->localTransform().toList( pValueList ); + std::cout << "ValueList of support3d Matrix is: " << pValueList << std::endl; + pMtxT->setMatrix( osg::Matrixd(pValueList) ); + } + else + { + std::cout << "bad bad bad!" << std::endl; + } + } + + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + ///////////////////////////// -- ///////////////////////////// + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + OsgCore::OsgCore() {}; OsgCore::~OsgCore() {}; + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + ///////////////////////////// -- ///////////////////////////// + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + void OsgCore::initStuff(support3d::WorldObject& visumRoot) { *************** *** 39,47 **** osg::Geometry* pTestGeometry = 0; osg::Vec3Array* pTestVertices = 0; pTestGeode = new osg::Geode(); pTestGeometry = new osg::Geometry(); pTestGeode->addDrawable(pTestGeometry); ! pRoot->addChild(pTestGeode); pTestVertices = new osg::Vec3Array; --- 223,236 ---- osg::Geometry* pTestGeometry = 0; osg::Vec3Array* pTestVertices = 0; + osg::DrawElementsUInt* pElements = 0; + osg::PositionAttitudeTransform* pTestXForm = 0; pTestGeode = new osg::Geode(); pTestGeometry = new osg::Geometry(); pTestGeode->addDrawable(pTestGeometry); ! pTestXForm = new osg::PositionAttitudeTransform(); ! pRoot->addChild(pTestXForm); ! pTestXForm->addChild(pTestGeode); ! pTestXForm->setPosition( osg::Vec3(15,0,0) ); pTestVertices = new osg::Vec3Array; *************** *** 53,56 **** --- 242,250 ---- pTestGeometry->setVertexArray( pTestVertices ); + pElements = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); + pElements->push_back(3); pElements->push_back(2); + pElements->push_back(1); pElements->push_back(0); + pTestGeometry->addPrimitiveSet(pElements); + ////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////// Index: osgcore.h =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/osg/osgcore.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** osgcore.h 7 Feb 2006 08:47:40 -0000 1.2 --- osgcore.h 7 Feb 2006 10:01:35 -0000 1.3 *************** *** 60,63 **** --- 60,81 ---- #undef min #include "worldobject.h" + #include "geomobject.h" + #include "trimeshgeom.h" + + class OsgDependent : public support3d::Dependent + { + public: + osg::Node *mpSceneNode; + support3d::WorldObject* mpWorldObject; + + virtual void onValueChanged(); + virtual void setup(support3d::WorldObject* pWorldObject, osg::Node *pSceneNode); + OsgDependent(); + ~OsgDependent(); + }; + + class OsgMeshDependent : public OsgDependent + { + }; class OsgCore *************** *** 71,74 **** --- 89,93 ---- private: osgProducer::Viewer theViewer; + std::vector<OsgDependent*> mDependents; }; |