//-------------------------------------------------------------- ofMatrix4x4 ofxBulletBaseShape::getTransformationMatrix() const { float m[16]; ofGetOpenGLMatrixFromRigidBody( _rigidBody, m ); ofMatrix4x4 mat; mat.set(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10], m[11], m[12], m[13], m[14], m[15]); return mat; }
//-------------------------------------------------------------- void ofxBulletBox::draw() { if(!_bCreated || _rigidBody == NULL) { ofLog(OF_LOG_WARNING, "ofxBulletBox :: draw : must call create() first and add() after"); return; } btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( _rigidBody, m ); glPushMatrix(); glMultMatrixf( m ); //ofBox(ofVec3f(0., 0., 0.), getSize().x); ofVec3f size = getSize(); drawBox( size.x*.5, size.y*.5, size.z*.5); glPopMatrix(); }
//-------------------------------------------------------------- void ofxBulletCylinder::draw() { if(!_bCreated || _rigidBody == NULL) { ofLog(OF_LOG_WARNING, "ofxBulletCylinder :: draw : must call create() first and add() after"); return; } int upAxis = ((btCylinderShape*)_rigidBody->getCollisionShape())->getUpAxis(); float halfHeight = ((btCylinderShape*)_rigidBody->getCollisionShape())->getHalfExtentsWithMargin()[upAxis]; btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( _rigidBody, m ); glPushMatrix(); glMultMatrixf( m ); drawCylinder( getRadius(), halfHeight, upAxis ); glPopMatrix(); }
//-------------------------------------------------------------- void ofxBulletCapsule::draw() { if(!_bCreated || _rigidBody == NULL) { ofLog(OF_LOG_WARNING, "ofxBulletCapsule :: draw : must call create() first and add() after"); return; } btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( _rigidBody, m ); glPushMatrix(); #ifdef BT_USE_DOUBLE_PRECISION glMultMatrixd(m); #else glMultMatrixf( m ); #endif if(hull == NULL) { hull = new btShapeHull((btConvexShape*)_rigidBody->getCollisionShape()); btScalar margin = _rigidBody->getCollisionShape()->getMargin(); hull->buildHull(margin); } if (hull->numTriangles () > 0) { int index = 0; const unsigned int* idx = hull->getIndexPointer(); const btVector3* vtx = hull->getVertexPointer(); glBegin (GL_TRIANGLES); for (int i = 0; i < hull->numTriangles (); i++) { int i1 = index++; int i2 = index++; int i3 = index++; btAssert(i1 < hull->numIndices () && i2 < hull->numIndices () && i3 < hull->numIndices ()); int index1 = idx[i1]; int index2 = idx[i2]; int index3 = idx[i3]; btAssert(index1 < hull->numVertices () && index2 < hull->numVertices () && index3 < hull->numVertices ()); btVector3 v1 = vtx[index1]; btVector3 v2 = vtx[index2]; btVector3 v3 = vtx[index3]; btVector3 normal = (v3-v1).cross(v2-v1); normal.normalize(); glNormal3f(normal.getX(),normal.getY(),normal.getZ()); glVertex3f (v1.x(), v1.y(), v1.z()); glVertex3f (v2.x(), v2.y(), v2.z()); glVertex3f (v3.x(), v3.y(), v3.z()); } glEnd (); } glPopMatrix(); }
//-------------------------------------------------------------- void testApp::draw() { glEnable( GL_DEPTH_TEST ); camera.begin(); ofSetLineWidth(1.f); if(bDrawDebug) world.drawDebug(); ofEnableLighting(); light.enable(); light.setPosition(shapes[0]->getPosition()); ofSetColor(255, 255, 255); shapes[0]->draw(); ofSetColor(100., 100., 100.); if(!bDropBox) { boundsMat.begin(); for(int i = 0; i < bounds.size()-1; i++) { bounds[i]->draw(); } boundsMat.end(); } else { ofNoFill(); btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( boundsShape->getRigidBody(), m ); glPushMatrix(); glMultMatrixf( m ); ofBox(ofVec3f(0, 0,0), boundsWidth); glPopMatrix(); ofFill(); } ofDisableAlphaBlending(); ofDisableBlendMode(); glPushAttrib(GL_ALL_ATTRIB_BITS); glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); glEnable(GL_NORMALIZE); glDisable(GL_CULL_FACE); ofPoint scale = assimpModel.getScale(); ofSetColor(0, 0, 0); logoMat.begin(); for(int i = 0; i < logos.size(); i++) { btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( logos[i]->getRigidBody(), m ); glPushMatrix(); glMultMatrixf( m ); glTranslatef(-logos[i]->getCentroid().x, -logos[i]->getCentroid().y, -logos[i]->getCentroid().z); ofScale(scale.x,scale.y,scale.z); assimpModel.getMesh(0).drawFaces(); glPopMatrix(); } glPopAttrib(); logoMat.end(); ofSetColor(15,197,138); ofPushStyle(); shapesMat.begin(); for(int i = 0; i < shapes.size(); i++) { shapes[i]->draw(); } shapesMat.end(); ofPopStyle(); light.disable(); ofDisableLighting(); camera.end(); glDisable(GL_DEPTH_TEST); int totalShapes = shapes.size() + logos.size(); ofVec3f gravity = world.getGravity(); stringstream ss; ss << "Draw Debug (d): " << bDrawDebug << endl; ss << "Total Shapes: " << totalShapes << endl; ss << "Add logos(o)" << endl; ss << "add spherers (s)" << endl; ss << "add boxes (b)" << endl; ss << "Gravity(up/down/left/right): x=" << gravity.x << " y= " << gravity.y << " z= " << gravity.z << endl; ofSetColor(255, 255, 255); ofDrawBitmapString(ss.str().c_str(), 20, 20); }
//-------------------------------------------------------------- void ofxBulletBaseShape::transformGL() { btScalar m[16]; ofGetOpenGLMatrixFromRigidBody( getRigidBody(), m ); ofPushMatrix(); ofMultMatrix( ofMatrix4x4(m) ); }
//-------------------------------------------------------------- void ofxBulletBaseShape::getOpenGLMatrix( btScalar* a_m ) { ofGetOpenGLMatrixFromRigidBody( _rigidBody, a_m ); }