vrsode/src/TrimeshShape.cpp

Go to the documentation of this file.
00001 
00002 #include "TrimeshShape.h"
00003 #include "TriangleData.h"
00004 #include "PhysicsManager.h"
00005 
00006 #include <vrs/container/makeiterator.h>
00007 #include <vrs/colorattribute.h>
00008 #include <vrs/constantdetail.h>
00009 #include <vrs/facestyle.h>
00010 #include <vrs/polygonset.h>
00011 #include <vrs/sphere.h>
00012 
00013 namespace vrsode
00014 {
00015 
00016 TrimeshShape::TrimeshShape(VRS::SO<TriangleData> p_triangleData) : Shape()
00017 {
00018     setCollisionShape(CS_Trimesh);
00019     m_triangleData = p_triangleData;
00020     m_triangleData->setGeometryChangeCallback(
00021             this, &TrimeshShape::geometryChangeCallback);
00022     
00023     m_trimeshId = dGeomTriMeshDataCreate();
00024     dGeomTriMeshDataBuildSingle(m_trimeshId, 
00025                                 m_triangleData->vertexArray(), 
00026                                 m_triangleData->sizeOfVertexStride(), 
00027                                 m_triangleData->vertexCount(),
00028                                 m_triangleData->indexArray(),
00029                                 m_triangleData->indexCount(),
00030                                 m_triangleData->sizeOfTriangleStride());
00031 
00032     createGeometry();
00033     createDebugNode();
00034     
00035     // dGeomTriMeshEnableTC(geomId(), dBoxClass, true);
00036     // dGeomTriMeshEnableTC(geomId(), dSphereClass, true);
00037     // dGeomTriMeshEnableTC(geomId(), dCylinderClass, true);
00038     // dGeomTriMeshEnableTC(geomId(), dCapsuleClass, true);
00039 }
00040 
00041 TrimeshShape::~TrimeshShape()
00042 {
00043     dGeomTriMeshDataDestroy(m_trimeshId);
00044 }
00045 
00046 void
00047 TrimeshShape::createGeometry()
00048 {
00049     setGeomId(dCreateTriMesh(0, m_trimeshId, 0, 0, 0));
00050 }
00051 
00052 void
00053 TrimeshShape::createDebugNode()
00054 {
00055     if(m_triangleData)
00056     {
00057         debugNode()->clear();
00058         
00059         if(!debugNodeActive())
00060             return;
00061 
00062         debugNode()->append(new VRS::ColorAttribute(0.2, 0.9, 0.3, 0.3));
00063         debugNode()->append(new VRS::ConstantDetail(1, 1));
00064         debugNode()->append(new VRS::PolygonSet(VRS::PolygonSet::Lines,
00065                 makeIterator(m_triangleData->explicitVertexListForLines())));
00066     }
00067 }
00068 
00069 void
00070 TrimeshShape::geometryChangeCallback()
00071 {
00072     createDebugNode();
00073     
00074     dTriMeshDataID trimeshId = dGeomTriMeshDataCreate();
00075 
00076     dGeomTriMeshDataBuildSingle(trimeshId, 
00077     // dGeomTriMeshDataBuildDouble(trimeshId, 
00078                                 m_triangleData->vertexArray(), 
00079                                 m_triangleData->sizeOfVertexStride(), 
00080                                 m_triangleData->vertexCount(),
00081                                 m_triangleData->indexArray(),
00082                                 m_triangleData->indexCount(),
00083                                 m_triangleData->sizeOfTriangleStride());
00084 
00085     // dGeomTriMeshClearTCCache(geomId());
00086     dGeomTriMeshSetData(geomId(), trimeshId);
00087     dGeomTriMeshDataDestroy(m_trimeshId);
00088     m_trimeshId = trimeshId;
00089     
00090     // dGeomTriMeshEnableTC(geomId(), dBoxClass, true);
00091     // dGeomTriMeshEnableTC(geomId(), dSphereClass, true);
00092     // dGeomTriMeshEnableTC(geomId(), dCylinderClass, true);
00093     // dGeomTriMeshEnableTC(geomId(), dCapsuleClass, true);
00094 }
00095 
00096 }

Generated on Fri May 11 21:01:58 2007 for Random Racer by  doxygen 1.5.1