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
00036
00037
00038
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
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
00086 dGeomTriMeshSetData(geomId(), trimeshId);
00087 dGeomTriMeshDataDestroy(m_trimeshId);
00088 m_trimeshId = trimeshId;
00089
00090
00091
00092
00093
00094 }
00095
00096 }