More patches from Francisco Leon, will be tested multi-platform etc. today
This commit is contained in:
@@ -4,8 +4,8 @@ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
|||||||
|
|
||||||
This software is provided 'as-is', without any express or implied warranty.
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
In no event will the authors be held liable for any damages arising from the use of this software.
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
including commercial applications, and to alter it and redistribute it freely,
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
subject to the following restrictions:
|
subject to the following restrictions:
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||||||
@@ -47,84 +47,144 @@ subject to the following restrictions:
|
|||||||
#include "BMF_Api.h"
|
#include "BMF_Api.h"
|
||||||
#include <stdio.h> //printf debugging
|
#include <stdio.h> //printf debugging
|
||||||
|
|
||||||
//#define USE_DISPLAY_LISTS 1
|
class GlDrawcallback : public btTriangleCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool m_wireframe;
|
||||||
|
|
||||||
|
virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
|
||||||
|
{
|
||||||
|
if (m_wireframe)
|
||||||
|
{
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glColor3f(1, 0, 0);
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0, 1, 0);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0, 0, 1);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glEnd();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
btVector3 diff1 = triangle[1] - triangle[0];
|
||||||
|
btVector3 diff2 = triangle[2] - triangle[0];
|
||||||
|
btVector3 normal = diff1.cross(diff2);
|
||||||
|
normal.normalize();
|
||||||
|
glBegin(GL_TRIANGLES);
|
||||||
|
glColor3f(1.0f, 0.3f, 0.6f);
|
||||||
|
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glColor3f(1.0f, 0.3f, 0.6f);
|
||||||
|
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(1.0f, 0.3f, 0.6f);
|
||||||
|
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class GlDrawcallback_plane : public btTriangleCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool m_wireframe;
|
||||||
|
|
||||||
|
virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
|
||||||
|
{
|
||||||
|
if(m_wireframe)
|
||||||
|
{
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glColor3f(0.5, 0, 1);
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0.5, 0, 1);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0.5, 0, 1);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glBegin(GL_TRIANGLES);
|
||||||
|
glColor3f(0.4, -0.4, 0.5);
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
|
||||||
|
glColor3f(0.4, -0.4, 1.0);
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
|
||||||
|
glColor3f(0.4, -0.4, 0.5);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TriangleGlDrawcallback : public btInternalTriangleIndexCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
|
||||||
|
{
|
||||||
|
glBegin(GL_TRIANGLES);//LINES);
|
||||||
|
glColor3f(1, 0, 0);
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0, 1, 0);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
||||||
|
glColor3f(0, 0, 1);
|
||||||
|
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
||||||
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define USE_DISPLAY_LISTS 1
|
||||||
#ifdef USE_DISPLAY_LISTS
|
#ifdef USE_DISPLAY_LISTS
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
//Set for storing Display list per trimesh
|
//Set for storing Display list per trimesh
|
||||||
struct TRIMESH_KEY
|
struct TRIMESH_KEY
|
||||||
{
|
{
|
||||||
btCollisionShape* m_shape;
|
btCollisionShape* m_shape;
|
||||||
GLuint m_dlist;//OpenGL display list
|
GLuint m_dlist;//OpenGL display list
|
||||||
};
|
GLuint m_dlist_wireframe;//OpenGL display list
|
||||||
|
|
||||||
typedef map<unsigned long,TRIMESH_KEY> TRIMESH_KEY_MAP;
|
inline bool operator <(const TRIMESH_KEY& other) const
|
||||||
|
|
||||||
typedef pair<unsigned long,TRIMESH_KEY> TRIMESH_KEY_PAIR;
|
|
||||||
|
|
||||||
TRIMESH_KEY_MAP g_display_lists;
|
|
||||||
|
|
||||||
class GlDisplaylistDrawcallback : public btTriangleCallback
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
|
|
||||||
{
|
{
|
||||||
|
return (m_shape < other.m_shape);
|
||||||
|
}
|
||||||
|
|
||||||
btVector3 diff1 = triangle[1] - triangle[0];
|
inline bool operator >(const TRIMESH_KEY& other) const
|
||||||
btVector3 diff2 = triangle[2] - triangle[0];
|
{
|
||||||
btVector3 normal = diff1.cross(diff2);
|
return (m_shape > other.m_shape);
|
||||||
|
|
||||||
normal.normalize();
|
|
||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
|
||||||
glColor3f(0, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
|
||||||
|
|
||||||
glColor3f(0, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
|
||||||
|
|
||||||
glColor3f(0, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
|
||||||
glEnd();
|
|
||||||
|
|
||||||
/*glBegin(GL_LINES);
|
|
||||||
glColor3f(1, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
|
||||||
glColor3f(1, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ());
|
|
||||||
glColor3f(1, 1, 0);
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ());
|
|
||||||
glNormal3d(normal.getX(),normal.getY(),normal.getZ());
|
|
||||||
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
|
||||||
glEnd();*/
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
GLuint OGL_get_displaylist_for_shape(btCollisionShape * shape)
|
typedef btAlignedObjectArray<TRIMESH_KEY> TRIMESH_KEY_MAP;
|
||||||
|
|
||||||
|
TRIMESH_KEY_MAP g_display_lists;
|
||||||
|
|
||||||
|
TRIMESH_KEY * OGL_get_displaylist_for_shape(btCollisionShape * shape)
|
||||||
{
|
{
|
||||||
TRIMESH_KEY_MAP::iterator map_iter;
|
if(g_display_lists.size()==0) return 0;
|
||||||
|
|
||||||
unsigned long key = (unsigned long)shape;
|
TRIMESH_KEY searchkey;
|
||||||
map_iter = g_display_lists.find(key);
|
searchkey.m_shape = shape;
|
||||||
if(map_iter!=g_display_lists.end())
|
|
||||||
|
int map_iter = g_display_lists.findBinarySearch(searchkey);
|
||||||
|
if(map_iter < g_display_lists.size())
|
||||||
{
|
{
|
||||||
return map_iter->second.m_dlist;
|
return &g_display_lists[map_iter];
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -132,51 +192,119 @@ GLuint OGL_get_displaylist_for_shape(btCollisionShape * shape)
|
|||||||
|
|
||||||
void OGL_displaylist_clean()
|
void OGL_displaylist_clean()
|
||||||
{
|
{
|
||||||
TRIMESH_KEY_MAP::iterator map_iter,map_itend;
|
int map_iter = g_display_lists.size();
|
||||||
|
|
||||||
map_iter = g_display_lists.begin();
|
while(map_iter--)
|
||||||
|
|
||||||
while(map_iter!=map_itend)
|
|
||||||
{
|
{
|
||||||
glDeleteLists(map_iter->second.m_dlist,1);
|
glDeleteLists(g_display_lists[map_iter].m_dlist,1);
|
||||||
map_iter++;
|
glDeleteLists(g_display_lists[map_iter].m_dlist_wireframe,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_display_lists.clear();
|
g_display_lists.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRIMESH_KEY * OGL_displaylist_register_shape(btCollisionShape * shape)
|
||||||
void OGL_displaylist_register_shape(btCollisionShape * shape)
|
|
||||||
{
|
{
|
||||||
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
btVector3 aabbMax(1e30f,1e30f,1e30f);
|
||||||
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
btVector3 aabbMin(-1e30f,-1e30f,-1e30f);
|
||||||
GlDisplaylistDrawcallback drawCallback;
|
GlDrawcallback drawCallback;
|
||||||
|
|
||||||
TRIMESH_KEY dlist;
|
TRIMESH_KEY dlist;
|
||||||
|
|
||||||
dlist.m_dlist = glGenLists(1);
|
dlist.m_dlist = glGenLists(1);
|
||||||
|
dlist.m_dlist_wireframe = glGenLists(1);
|
||||||
dlist.m_shape = shape;
|
dlist.m_shape = shape;
|
||||||
|
|
||||||
unsigned long key = (unsigned long)shape;
|
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
||||||
|
|
||||||
g_display_lists.insert(TRIMESH_KEY_PAIR(key,dlist));
|
|
||||||
|
|
||||||
glNewList(dlist.m_dlist,GL_COMPILE);
|
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
|
||||||
|
|
||||||
glCullFace(GL_BACK);
|
|
||||||
|
|
||||||
if (shape->isConcave())
|
|
||||||
{
|
{
|
||||||
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
||||||
//todo pass camera, for some culling
|
//Draw
|
||||||
|
glNewList(dlist.m_dlist,GL_COMPILE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawCallback.m_wireframe = false;
|
||||||
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
//Draw wireframe
|
||||||
|
glNewList(dlist.m_dlist_wireframe,GL_COMPILE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawCallback.m_wireframe = true;
|
||||||
|
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
else if (shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
|
||||||
|
{
|
||||||
|
btConcaveShape* gimpactMesh = (btConcaveShape*) shape;
|
||||||
|
|
||||||
|
//Draw
|
||||||
|
glNewList(dlist.m_dlist,GL_COMPILE);
|
||||||
|
//glEnable(GL_CULL_FACE);
|
||||||
|
//glCullFace(GL_BACK);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawCallback.m_wireframe = false;
|
||||||
|
gimpactMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
//glDisable(GL_CULL_FACE);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
//Draw wireframe
|
||||||
|
glNewList(dlist.m_dlist_wireframe,GL_COMPILE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawCallback.m_wireframe = true;
|
||||||
|
gimpactMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
else if (shape->getShapeType() == STATIC_PLANE_PROXYTYPE)
|
||||||
|
{
|
||||||
|
GlDrawcallback_plane drawPlaneCallback;
|
||||||
|
btVector3 paabbMax(100.f,100.f,100.f);
|
||||||
|
btVector3 paabbMin(-100.f,-100.f,-100.f);
|
||||||
|
|
||||||
|
btConcaveShape* planeshape = (btConcaveShape*) shape;
|
||||||
|
|
||||||
|
//Draw
|
||||||
|
glNewList(dlist.m_dlist,GL_COMPILE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawPlaneCallback.m_wireframe = false;
|
||||||
|
planeshape->processAllTriangles(&drawPlaneCallback,paabbMin,paabbMax);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
//Draw wireframe
|
||||||
|
glNewList(dlist.m_dlist_wireframe,GL_COMPILE);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
drawPlaneCallback.m_wireframe = true;
|
||||||
|
planeshape->processAllTriangles(&drawPlaneCallback,paabbMin,paabbMax);
|
||||||
|
glEndList();
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_CULL_FACE);
|
g_display_lists.push_back(dlist);
|
||||||
|
g_display_lists.heapSort(TRIMESH_KEY_MAP::less());
|
||||||
|
|
||||||
glEndList();
|
int inserted = g_display_lists.findBinarySearch(dlist);
|
||||||
|
|
||||||
|
return &g_display_lists[inserted];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OGL_draw_shape(btCollisionShape* shape, bool wireframe)
|
||||||
|
{
|
||||||
|
TRIMESH_KEY * dlist = OGL_get_displaylist_for_shape(shape);
|
||||||
|
|
||||||
|
if(dlist == 0)
|
||||||
|
{
|
||||||
|
dlist = OGL_displaylist_register_shape(shape);
|
||||||
|
}
|
||||||
|
if(wireframe)
|
||||||
|
{
|
||||||
|
glCallList(dlist->m_dlist_wireframe);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glCallList(dlist->m_dlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //USE_DISPLAY_LISTS
|
#endif //USE_DISPLAY_LISTS
|
||||||
|
|
||||||
void GL_ShapeDrawer::drawCoordSystem() {
|
void GL_ShapeDrawer::drawCoordSystem() {
|
||||||
@@ -191,13 +319,13 @@ void GL_ShapeDrawer::drawCoordSystem() {
|
|||||||
glVertex3d(0, 0, 0);
|
glVertex3d(0, 0, 0);
|
||||||
glVertex3d(0, 0, 1);
|
glVertex3d(0, 0, 1);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
class GlDrawcallback : public btTriangleCallback
|
class GlDrawcallback : public btTriangleCallback
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -243,8 +371,9 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
class TriangleGlDrawcallback : public btInternalTriangleIndexCallback
|
/*class TriangleGlDrawcallback : public btInternalTriangleIndexCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
|
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
|
||||||
@@ -265,11 +394,11 @@ public:
|
|||||||
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ());
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
};
|
};*/
|
||||||
|
|
||||||
void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis)
|
void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
switch (upAxis)
|
switch (upAxis)
|
||||||
@@ -283,7 +412,7 @@ void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis)
|
|||||||
glTranslatef(0.0, 0.0, -halfHeight);
|
glTranslatef(0.0, 0.0, -halfHeight);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
|
||||||
glTranslatef(0.0, 0.0, -halfHeight);
|
glTranslatef(0.0, 0.0, -halfHeight);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -292,17 +421,17 @@ void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUquadricObj *quadObj = gluNewQuadric();
|
GLUquadricObj *quadObj = gluNewQuadric();
|
||||||
|
|
||||||
//The gluCylinder subroutine draws a cylinder that is oriented along the z axis.
|
//The gluCylinder subroutine draws a cylinder that is oriented along the z axis.
|
||||||
//The base of the cylinder is placed at z = 0; the top of the cylinder is placed at z=height.
|
//The base of the cylinder is placed at z = 0; the top of the cylinder is placed at z=height.
|
||||||
//Like a sphere, the cylinder is subdivided around the z axis into slices and along the z axis into stacks.
|
//Like a sphere, the cylinder is subdivided around the z axis into slices and along the z axis into stacks.
|
||||||
|
|
||||||
gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL);
|
gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL);
|
||||||
gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH);
|
gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH);
|
||||||
|
|
||||||
|
|
||||||
gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10);
|
gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
gluDeleteQuadric(quadObj);
|
gluDeleteQuadric(quadObj);
|
||||||
@@ -311,9 +440,9 @@ void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis)
|
|||||||
void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode)
|
void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
btglMultMatrix(m);
|
btglMultMatrix(m);
|
||||||
|
|
||||||
if (shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE)
|
if (shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
@@ -325,7 +454,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
0,scalingFactor,0,0,
|
0,scalingFactor,0,0,
|
||||||
0,0,scalingFactor,0,
|
0,0,scalingFactor,0,
|
||||||
0,0,0,1};
|
0,0,0,1};
|
||||||
|
|
||||||
drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode);
|
drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode);
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -347,12 +476,12 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
//drawCoordSystem();
|
//drawCoordSystem();
|
||||||
|
|
||||||
//glPushMatrix();
|
//glPushMatrix();
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
glColor3f(color.x(),color.y(), color.z());
|
glColor3f(color.x(),color.y(), color.z());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool useWireframeFallback = true;
|
bool useWireframeFallback = true;
|
||||||
|
|
||||||
@@ -372,7 +501,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
case TRIANGLE_SHAPE_PROXYTYPE:
|
case TRIANGLE_SHAPE_PROXYTYPE:
|
||||||
case TETRAHEDRAL_SHAPE_PROXYTYPE:
|
case TETRAHEDRAL_SHAPE_PROXYTYPE:
|
||||||
{
|
{
|
||||||
//todo:
|
//todo:
|
||||||
// useWireframeFallback = false;
|
// useWireframeFallback = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -395,7 +524,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
|
|
||||||
drawCylinder(radius,halfHeight,upAxis);
|
drawCylinder(radius,halfHeight,upAxis);
|
||||||
|
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(0.0, -halfHeight,0.0);
|
glTranslatef(0.0, -halfHeight,0.0);
|
||||||
glutSolidSphere(radius,10,10);
|
glutSolidSphere(radius,10,10);
|
||||||
@@ -432,8 +561,8 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
{
|
{
|
||||||
const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
|
const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
|
||||||
int upAxis = cylinder->getUpAxis();
|
int upAxis = cylinder->getUpAxis();
|
||||||
|
|
||||||
|
|
||||||
float radius = cylinder->getRadius();
|
float radius = cylinder->getRadius();
|
||||||
float halfHeight = cylinder->getHalfExtents()[upAxis];
|
float halfHeight = cylinder->getHalfExtents()[upAxis];
|
||||||
|
|
||||||
@@ -448,9 +577,9 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (useWireframeFallback)
|
if (useWireframeFallback)
|
||||||
{
|
{
|
||||||
@@ -458,8 +587,8 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
if (shape->isPolyhedral())
|
if (shape->isPolyhedral())
|
||||||
{
|
{
|
||||||
btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
|
btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
|
||||||
|
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
|
|
||||||
@@ -476,7 +605,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
if (debugMode==btIDebugDraw::DBG_DrawFeaturesText)
|
if (debugMode==btIDebugDraw::DBG_DrawFeaturesText)
|
||||||
{
|
{
|
||||||
glRasterPos3f(0.0, 0.0, 0.0);
|
glRasterPos3f(0.0, 0.0, 0.0);
|
||||||
@@ -504,37 +633,41 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
char buf[12];
|
char buf[12];
|
||||||
sprintf(buf," plane %d",i);
|
sprintf(buf," plane %d",i);
|
||||||
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_DISPLAY_LISTS
|
#ifdef USE_DISPLAY_LISTS
|
||||||
|
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||
|
||||||
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
|
shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE||
|
||||||
|
shape->getShapeType() == STATIC_PLANE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
GLuint dlist = OGL_get_displaylist_for_shape((btCollisionShape * )shape);
|
if((debugMode & btIDebugDraw::DBG_DrawWireframe)!=0)
|
||||||
if (dlist)
|
|
||||||
{
|
{
|
||||||
glCallList(dlist);
|
OGL_draw_shape((btCollisionShape *)shape,true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#else
|
OGL_draw_shape((btCollisionShape *)shape,false);
|
||||||
if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
|
}
|
||||||
// if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
|
||||||
|
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
btConcaveShape* concaveMesh = (btTriangleMeshShape*) shape;
|
||||||
//btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
//btVector3 aabbMax(1e30f,1e30f,1e30f);
|
||||||
//btVector3 aabbMax(100,100,100);//btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
//btVector3 aabbMax(100,100,100);//1e30f,1e30f,1e30f);
|
||||||
|
|
||||||
//todo pass camera, for some culling
|
//todo pass camera, for some culling
|
||||||
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
btVector3 aabbMax(1e30f,1e30f,1e30f);
|
||||||
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
btVector3 aabbMin(-1e30f,-1e30f,-1e30f);
|
||||||
|
|
||||||
GlDrawcallback drawCallback;
|
GlDrawcallback drawCallback;
|
||||||
drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0;
|
drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0;
|
||||||
@@ -542,25 +675,37 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (shape->getShapeType() == STATIC_PLANE_PROXYTYPE)
|
||||||
|
{
|
||||||
|
|
||||||
|
GlDrawcallback_plane drawPlaneCallback;
|
||||||
|
btVector3 paabbMax(100.f,100.f,100.f);
|
||||||
|
btVector3 paabbMin(-100.f,-100.f,-100.f);
|
||||||
|
|
||||||
|
btConcaveShape* planeshape = (btConcaveShape*) shape;
|
||||||
|
|
||||||
|
drawPlaneCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0;
|
||||||
|
//Draw
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
planeshape->processAllTriangles(&drawPlaneCallback,paabbMin,paabbMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_DISPLAY_LISTS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
|
if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
|
btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
|
||||||
|
|
||||||
//todo: pass camera for some culling
|
//todo: pass camera for some culling
|
||||||
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
||||||
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
||||||
TriangleGlDrawcallback drawCallback;
|
TriangleGlDrawcallback drawCallback;
|
||||||
convexMesh->getStridingMesh()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
|
convexMesh->getStridingMesh()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
glDisable(GL_DEPTH_BUFFER_BIT);
|
glDisable(GL_DEPTH_BUFFER_BIT);
|
||||||
glRasterPos3f(0,0,0);//mvtx.x(), vtx.y(), vtx.z());
|
glRasterPos3f(0,0,0);//mvtx.x(), vtx.y(), vtx.z());
|
||||||
@@ -578,5 +723,5 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
// glPopMatrix();
|
// glPopMatrix();
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class GL_ShapeDrawer
|
|||||||
static void drawCylinder(float radius,float halfHeight, int upAxis);
|
static void drawCylinder(float radius,float halfHeight, int upAxis);
|
||||||
};
|
};
|
||||||
|
|
||||||
void OGL_displaylist_register_shape(btCollisionShape * shape);
|
//void OGL_displaylist_register_shape(btCollisionShape * shape);
|
||||||
void OGL_displaylist_clean();
|
void OGL_displaylist_clean();
|
||||||
|
|
||||||
#endif //GL_SHAPE_DRAWER_H
|
#endif //GL_SHAPE_DRAWER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user