Please see HfFluidDemo.cpp for examples of how to use the height field fluid along with buoyant collision shapes. The implementation is still lacking in my ways: 1) Need to complete more collision algorithms for buoyant collision shapes 2) Support compound buoyant shapes 3) The buoyancy model isn't that great 4) Fluid volume can be lost over time
131 lines
3.3 KiB
C++
131 lines
3.3 KiB
C++
|
|
#include "GLDebugDrawer.h"
|
|
|
|
#ifdef WIN32 //needed for glut.h
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
//think different
|
|
#if defined(__APPLE__) && !defined (VMDMESA)
|
|
#include <OpenGL/gl.h>
|
|
#include <OpenGL/glu.h>
|
|
#include <GLUT/glut.h>
|
|
#else
|
|
#include <GL/glut.h>
|
|
#endif
|
|
|
|
#include "BMF_Api.h"
|
|
#include <stdio.h> //printf debugging
|
|
GLDebugDrawer::GLDebugDrawer()
|
|
:m_debugMode(0)
|
|
{
|
|
|
|
}
|
|
|
|
void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor)
|
|
{
|
|
glBegin(GL_LINES);
|
|
glColor3f(fromColor.getX(), fromColor.getY(), fromColor.getZ());
|
|
glVertex3d(from.getX(), from.getY(), from.getZ());
|
|
glColor3f(toColor.getX(), toColor.getY(), toColor.getZ());
|
|
glVertex3d(to.getX(), to.getY(), to.getZ());
|
|
glEnd();
|
|
}
|
|
|
|
void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
|
|
{
|
|
// if (m_debugMode > 0)
|
|
{
|
|
glBegin(GL_LINES);
|
|
glColor4f(color.getX(), color.getY(), color.getZ(),1.f);
|
|
glVertex3d(from.getX(), from.getY(), from.getZ());
|
|
glVertex3d(to.getX(), to.getY(), to.getZ());
|
|
glEnd();
|
|
}
|
|
}
|
|
|
|
void GLDebugDrawer::drawSphere (const btVector3& p, btScalar radius, const btVector3& color)
|
|
{
|
|
glColor4f (color.getX(), color.getY(), color.getZ(), btScalar(1.0f));
|
|
glPushMatrix ();
|
|
glTranslatef (p.getX(), p.getY(), p.getZ());
|
|
glutSolidSphere (radius, 10, 10);
|
|
glPopMatrix();
|
|
}
|
|
|
|
void GLDebugDrawer::drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha)
|
|
{
|
|
btVector3 halfExtent = (boxMax - boxMin) * btScalar(0.5f);
|
|
btVector3 center = (boxMax + boxMin) * btScalar(0.5f);
|
|
//glEnable(GL_BLEND); // Turn blending On
|
|
//glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
glColor4f (color.getX(), color.getY(), color.getZ(), alpha);
|
|
glPushMatrix ();
|
|
glTranslatef (center.getX(), center.getY(), center.getZ());
|
|
glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]);
|
|
glutSolidCube(1.0);
|
|
glPopMatrix ();
|
|
//glDisable(GL_BLEND);
|
|
}
|
|
|
|
void GLDebugDrawer::drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha)
|
|
{
|
|
// if (m_debugMode > 0)
|
|
{
|
|
const btVector3 n=cross(b-a,c-a).normalized();
|
|
glBegin(GL_TRIANGLES);
|
|
glColor4f(color.getX(), color.getY(), color.getZ(),alpha);
|
|
glNormal3d(n.getX(),n.getY(),n.getZ());
|
|
glVertex3d(a.getX(),a.getY(),a.getZ());
|
|
glVertex3d(b.getX(),b.getY(),b.getZ());
|
|
glVertex3d(c.getX(),c.getY(),c.getZ());
|
|
glEnd();
|
|
}
|
|
}
|
|
|
|
void GLDebugDrawer::setDebugMode(int debugMode)
|
|
{
|
|
m_debugMode = debugMode;
|
|
|
|
}
|
|
|
|
void GLDebugDrawer::draw3dText(const btVector3& location,const char* textString)
|
|
{
|
|
glRasterPos3f(location.x(), location.y(), location.z());
|
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),textString);
|
|
}
|
|
|
|
void GLDebugDrawer::reportErrorWarning(const char* warningString)
|
|
{
|
|
printf(warningString);
|
|
}
|
|
|
|
void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)
|
|
{
|
|
|
|
{
|
|
btVector3 to=pointOnB+normalOnB*distance;
|
|
const btVector3&from = pointOnB;
|
|
glColor4f(color.getX(), color.getY(), color.getZ(),1.f);
|
|
//glColor4f(0,0,0,1.f);
|
|
|
|
glBegin(GL_LINES);
|
|
glVertex3d(from.getX(), from.getY(), from.getZ());
|
|
glVertex3d(to.getX(), to.getY(), to.getZ());
|
|
glEnd();
|
|
|
|
|
|
glRasterPos3f(from.x(), from.y(), from.z());
|
|
char buf[12];
|
|
sprintf(buf," %d",lifeTime);
|
|
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|