From e1a412454f223c4b46fd20000ae909f01fd10f76 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Tue, 7 Jan 2014 16:06:13 -0800 Subject: [PATCH] fixes to improve demos a bit --- Demos3/AllBullet2Demos/BulletDemoEntries.h | 6 +- Demos3/AllBullet2Demos/main.cpp | 12 +- Demos3/bullet2/BasicDemo/BasicDemo.cpp | 33 +- Demos3/bullet2/BasicDemo/BasicDemo.h | 2 + .../BulletMultiBodyDemos.cpp | 394 +++++++++++++++++- Demos3/bullet2/RagdollDemo/RagdollDemo.cpp | 376 +++++++++++++++++ btgui/OpenGLWindow/GLInstancingRenderer.cpp | 13 +- .../Shaders/useShadowMapInstancingPS.glsl | 2 +- .../Shaders/useShadowMapInstancingPS.h | 2 +- btgui/OpenGLWindow/ShapeData.h | 14 +- 10 files changed, 816 insertions(+), 38 deletions(-) create mode 100644 Demos3/bullet2/RagdollDemo/RagdollDemo.cpp diff --git a/Demos3/AllBullet2Demos/BulletDemoEntries.h b/Demos3/AllBullet2Demos/BulletDemoEntries.h index 031b0bebe..9d4e479af 100644 --- a/Demos3/AllBullet2Demos/BulletDemoEntries.h +++ b/Demos3/AllBullet2Demos/BulletDemoEntries.h @@ -2,9 +2,11 @@ #ifndef BULLET_DEMO_ENTRIES_H #define BULLET_DEMO_ENTRIES_H -#include "BulletDemoInterface.h"" +#include "BulletDemoInterface.h" #include "../bullet2/BasicDemo/BasicDemo.h" #include "../bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.h" +#include "../bullet2/RagdollDemo/RagdollDemo.h" + #include struct BulletDemoEntry @@ -19,8 +21,10 @@ static BulletDemoEntry allDemos[]= //{"emptydemo",EmptyBulletDemo::MyCreateFunc}, {"BasicDemo",BasicDemo::MyCreateFunc}, + {"Ragdoll",RagDollDemo::MyCreateFunc}, {"MultiBody1",FeatherstoneDemo1::MyCreateFunc}, {"MultiBody2",FeatherstoneDemo2::MyCreateFunc}, + }; diff --git a/Demos3/AllBullet2Demos/main.cpp b/Demos3/AllBullet2Demos/main.cpp index 46b0e1cf1..4c435c829 100644 --- a/Demos3/AllBullet2Demos/main.cpp +++ b/Demos3/AllBullet2Demos/main.cpp @@ -16,6 +16,7 @@ static b3AlignedObjectArray allNames; extern bool useShadowMap; static bool wireframe=false; +static bool pauseSimulation=false; void MyKeyboardCallback(int key, int state) { @@ -39,6 +40,10 @@ void MyKeyboardCallback(int key, int state) glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); } } + if (key=='I' && state) + { + pauseSimulation = !pauseSimulation; + } if (key=='s' && state) { @@ -50,6 +55,8 @@ void MyKeyboardCallback(int key, int state) app->m_window->setRequestExit(); } + b3DefaultKeyboardCallback(key,state); + } static void MyMouseMoveCallback( float x, float y) @@ -134,7 +141,7 @@ int main(int argc, char* argv[]) app->m_instancingRenderer->setCameraTargetPosition(b3MakeVector3(0,0,0)); app->m_window->setMouseMoveCallback(MyMouseMoveCallback); app->m_window->setMouseButtonCallback(MyMouseButtonCallback); - app->m_window->setKeyboardCallback(MyKeyboardCallback); + app->m_window->setKeyboardCallback(MyKeyboardCallback); GLint err = glGetError(); assert(err==GL_NO_ERROR); @@ -176,7 +183,8 @@ int main(int argc, char* argv[]) app->drawText(bla,10,10); if (sCurrentDemo) { - sCurrentDemo->stepSimulation(1./60.f); + if (!pauseSimulation) + sCurrentDemo->stepSimulation(1./60.f); sCurrentDemo->renderScene(); } diff --git a/Demos3/bullet2/BasicDemo/BasicDemo.cpp b/Demos3/bullet2/BasicDemo/BasicDemo.cpp index ce642b8fc..a24ced148 100644 --- a/Demos3/bullet2/BasicDemo/BasicDemo.cpp +++ b/Demos3/bullet2/BasicDemo/BasicDemo.cpp @@ -3,9 +3,9 @@ #include "btBulletDynamicsCommon.h" #include "Bullet3Common/b3Vector3.h" -#define ARRAY_SIZE_X 5 -#define ARRAY_SIZE_Y 5 -#define ARRAY_SIZE_Z 5 +#define ARRAY_SIZE_X 1 +#define ARRAY_SIZE_Y 1 +#define ARRAY_SIZE_Z 1 BasicDemo::BasicDemo(SimpleOpenGL3App* app) @@ -17,16 +17,8 @@ BasicDemo::~BasicDemo() { } -void BasicDemo::initPhysics() +void BasicDemo::createGround(int cubeShapeId) { - Bullet2RigidBodyDemo::initPhysics(); - int curColor=0; - //create ground - int cubeShapeId = m_glApp->registerCubeShape(); - float pos[]={0,0,0}; - float orn[]={0,0,0,1}; - - { float color[]={0.3,0.3,1,1}; float halfExtents[]={50,50,50,1}; @@ -51,9 +43,22 @@ void BasicDemo::initPhysics() m_dynamicsWorld->addRigidBody(body); } } +} +void BasicDemo::initPhysics() +{ + Bullet2RigidBodyDemo::initPhysics(); + int curColor=0; + //create ground + int cubeShapeId = m_glApp->registerCubeShape(); + float pos[]={0,0,0}; + float orn[]={0,0,0,1}; + + + createGround(cubeShapeId); + { - float halfExtents[]={1,1,1,1}; + float halfExtents[]={0.1,1,1,1}; b3Vector4 colors[4] = { b3MakeVector4(1,0,0,1), @@ -83,7 +88,7 @@ void BasicDemo::initPhysics() curColor&=3; startTransform.setOrigin(btVector3( btScalar(2.0*i), - btScalar(20+2.0*k), + btScalar(2+2.0*k), btScalar(2.0*j))); m_glApp->m_instancingRenderer->registerGraphicsInstance(cubeShapeId,startTransform.getOrigin(),startTransform.getRotation(),color,halfExtents); diff --git a/Demos3/bullet2/BasicDemo/BasicDemo.h b/Demos3/bullet2/BasicDemo/BasicDemo.h index 1fa00c727..efa401a47 100644 --- a/Demos3/bullet2/BasicDemo/BasicDemo.h +++ b/Demos3/bullet2/BasicDemo/BasicDemo.h @@ -18,6 +18,8 @@ public: BasicDemo(SimpleOpenGL3App* app); virtual ~BasicDemo(); + + void createGround(int cubeShapeId); void initPhysics(); void exitPhysics(); diff --git a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp index 1036809f1..dd747e4e5 100644 --- a/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp +++ b/Demos3/bullet2/FeatherstoneMultiBodyDemo/BulletMultiBodyDemos.cpp @@ -25,6 +25,18 @@ static float friction = 1.; #include "BulletDynamics/Featherstone/btMultiBodyJointMotor.h" #include "BulletDynamics/Featherstone/btMultiBodyPoint2Point.h" +#include "OpenGLWindow/GLInstancingRenderer.h" +#include "BulletCollision/CollisionShapes/btShapeHull.h" + +#define CONSTRAINT_DEBUG_SIZE 0.2f + +struct GraphicsVertex +{ + float pos[4]; + float normal[3]; + float texcoord[2]; +}; + static b3Vector4 colors[4] = { b3MakeVector4(1,0,0,1), @@ -429,21 +441,15 @@ btMultiBody* FeatherstoneDemo1::createFeatherstoneMultiBody(class btMultiBodyDyn if (1) { btCollisionShape* box = new btBoxShape(btVector3(halfExtents[0],halfExtents[1],halfExtents[2])*scaling); - btRigidBody* body = new btRigidBody(mass,0,box,inertia); btMultiBodyLinkCollider* col= new btMultiBodyLinkCollider(bod,-1); - - - - body->setCollisionShape(box); col->setCollisionShape(box); btTransform tr; tr.setIdentity(); tr.setOrigin(local_origin[0]); tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3])); - body->setWorldTransform(tr); - col->setWorldTransform(tr); + col->setWorldTransform(tr); b3Vector4 color = colors[curColor++]; curColor&=3; @@ -615,19 +621,387 @@ FeatherstoneDemo2::~FeatherstoneDemo2() { } + + +class RagDoll2 +{ + enum + { + BODYPART_PELVIS = 0, + BODYPART_SPINE, + BODYPART_HEAD, + + BODYPART_LEFT_UPPER_LEG, + BODYPART_LEFT_LOWER_LEG, + + BODYPART_RIGHT_UPPER_LEG, + BODYPART_RIGHT_LOWER_LEG, + + BODYPART_LEFT_UPPER_ARM, + BODYPART_LEFT_LOWER_ARM, + + BODYPART_RIGHT_UPPER_ARM, + BODYPART_RIGHT_LOWER_ARM, + + BODYPART_COUNT + }; + + enum + { + JOINT_PELVIS_SPINE = 0, + JOINT_SPINE_HEAD, + + JOINT_LEFT_HIP, + JOINT_LEFT_KNEE, + + JOINT_RIGHT_HIP, + JOINT_RIGHT_KNEE, + + JOINT_LEFT_SHOULDER, + JOINT_LEFT_ELBOW, + + JOINT_RIGHT_SHOULDER, + JOINT_RIGHT_ELBOW, + + JOINT_COUNT + }; + + btDynamicsWorld* m_ownerWorld; + btConvexShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + SimpleOpenGL3App* m_app;//used to create graphics shapes + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btConvexShape* shape, const btVector3& color=btVector3(1,0,0) ) + { + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + + btVector3 scaling(1,1,1); + + btShapeHull* hull = new btShapeHull(shape); + hull->buildHull(0.01); + + { + int strideInBytes = 9*sizeof(float); + int numVertices = hull->numVertices(); + int numIndices =hull->numIndices(); + + btAlignedObjectArray gvertices; + + for (int i=0;igetVertexPointer()[i]; + vtx.pos[0] = pos.x(); + vtx.pos[1] = pos.y(); + vtx.pos[2] = pos.z(); + vtx.pos[3] = 1.f; + pos.normalize(); + vtx.normal[0] =pos.x(); + vtx.normal[1] =pos.y(); + vtx.normal[2] =pos.z(); + vtx.texcoord[0] = 0.5f; + vtx.texcoord[1] = 0.5f; + gvertices.push_back(vtx); + } + + btAlignedObjectArray indices; + for (int i=0;igetIndexPointer()[i]); + + int shapeId = m_app->m_instancingRenderer->registerShape(&gvertices[0].pos[0],numVertices,&indices[0],numIndices); + + int index = m_app->m_instancingRenderer->registerGraphicsInstance(shapeId,body->getWorldTransform().getOrigin(),body->getWorldTransform().getRotation(),color,scaling); + body ->setUserIndex(index); + } + delete hull; + + + + return body; + } + +public: + RagDoll2 (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,SimpleOpenGL3App* app) + : m_ownerWorld (ownerWorld), + m_app(app) + { + + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15), btScalar(0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15), btScalar(0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10), btScalar(0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + //m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS], btVector3(0,1,0)); + + // btMultiBody * bod = new btMultiBody(n_links, mass, inertia, settings.m_isFixedBase, settings.m_canSleep); + int n_links = 0; + float mass = 1.f; + btVector3 localInertia; + m_shapes[BODYPART_PELVIS]->calculateLocalInertia(mass,localInertia); + + bool isFixedBase = true; + bool canSleep = true; + btMultiBody * bod = new btMultiBody(n_links, mass, localInertia, isFixedBase, canSleep); + + btTransform tr; + tr = offset*transform; + + + bod->setBasePos(tr.getOrigin()); + bod->setWorldToBaseRot(tr.getRotation()); + btVector3 vel(0,0,0); + bod->setBaseVel(vel); + +#if 0 + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE],btVector3(0,0,1)); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } +#endif +#if 0 + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); + // hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); + // hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); +#endif + + } + + virtual ~RagDoll2 () + { + int i; + /* + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + */ + /* + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + */ + } +}; + + + void FeatherstoneDemo2::initPhysics() { Bullet2MultiBodyDemo::initPhysics(); createGround(); - btMultiBodySettings settings; +/* btMultiBodySettings settings; settings.m_isFixedBase = false; settings.m_basePosition.setValue(0,20,0); settings.m_numLinks = 3; settings.m_usePrismatic = true; btMultiBody* mb = createFeatherstoneMultiBody(m_dynamicsWorld,settings); +*/ + btVector3 offset(0,2,0); + RagDoll2* doll = new RagDoll2(m_dynamicsWorld,offset,m_glApp); - + m_glApp->m_instancingRenderer->writeTransforms(); -} \ No newline at end of file +} + + + + + + diff --git a/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp b/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp new file mode 100644 index 000000000..b109cd531 --- /dev/null +++ b/Demos3/bullet2/RagdollDemo/RagdollDemo.cpp @@ -0,0 +1,376 @@ +#include "btBulletDynamicsCommon.h" +#include "RagdollDemo.h" +#include "OpenGLWindow/SimpleOpenGL3App.h" +#include "OpenGLWindow/GLInstancingRenderer.h" +#include "BulletCollision/CollisionShapes/btShapeHull.h" + +#define CONSTRAINT_DEBUG_SIZE 0.2f + +struct GraphicsVertex +{ + float pos[4]; + float normal[3]; + float texcoord[2]; +}; + +class RagDoll +{ + enum + { + BODYPART_PELVIS = 0, + BODYPART_SPINE, + BODYPART_HEAD, + + BODYPART_LEFT_UPPER_LEG, + BODYPART_LEFT_LOWER_LEG, + + BODYPART_RIGHT_UPPER_LEG, + BODYPART_RIGHT_LOWER_LEG, + + BODYPART_LEFT_UPPER_ARM, + BODYPART_LEFT_LOWER_ARM, + + BODYPART_RIGHT_UPPER_ARM, + BODYPART_RIGHT_LOWER_ARM, + + BODYPART_COUNT + }; + + enum + { + JOINT_PELVIS_SPINE = 0, + JOINT_SPINE_HEAD, + + JOINT_LEFT_HIP, + JOINT_LEFT_KNEE, + + JOINT_RIGHT_HIP, + JOINT_RIGHT_KNEE, + + JOINT_LEFT_SHOULDER, + JOINT_LEFT_ELBOW, + + JOINT_RIGHT_SHOULDER, + JOINT_RIGHT_ELBOW, + + JOINT_COUNT + }; + + btDynamicsWorld* m_ownerWorld; + btConvexShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + SimpleOpenGL3App* m_app;//used to create graphics shapes + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btConvexShape* shape) + { + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + btVector3 color(1,0,0); + btVector3 scaling(1,1,1); + + btShapeHull* hull = new btShapeHull(shape); + hull->buildHull(0.01); + + { + int strideInBytes = 9*sizeof(float); + int numVertices = hull->numVertices(); + int numIndices =hull->numIndices(); + + btAlignedObjectArray gvertices; + + for (int i=0;igetVertexPointer()[i]; + vtx.pos[0] = pos.x(); + vtx.pos[1] = pos.y(); + vtx.pos[2] = pos.z(); + vtx.pos[3] = 1.f; + pos.normalize(); + vtx.normal[0] =pos.x(); + vtx.normal[1] =pos.y(); + vtx.normal[2] =pos.z(); + vtx.texcoord[0] = 0.5f; + vtx.texcoord[1] = 0.5f; + gvertices.push_back(vtx); + } + + btAlignedObjectArray indices; + for (int i=0;igetIndexPointer()[i]); + + int shapeId = m_app->m_instancingRenderer->registerShape(&gvertices[0].pos[0],numVertices,&indices[0],numIndices); + + m_app->m_instancingRenderer->registerGraphicsInstance(shapeId,body->getWorldTransform().getOrigin(),body->getWorldTransform().getRotation(),color,scaling); + + } + delete hull; + + + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,SimpleOpenGL3App* app) + : m_ownerWorld (ownerWorld), + m_app(app) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15), btScalar(0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15), btScalar(0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10), btScalar(0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + + + +RagDollDemo::RagDollDemo(SimpleOpenGL3App* app) +:BasicDemo(app) +{ + +} +RagDollDemo::~RagDollDemo() +{ + +} + + + + +void RagDollDemo::initPhysics() +{ + Bullet2RigidBodyDemo::initPhysics(); + int cubeShapeId = m_glApp->registerCubeShape(); + + createGround(cubeShapeId); + + btVector3 offset(0,10,0); + + RagDoll* doll = new RagDoll(this->m_dynamicsWorld,offset,m_glApp); + + + m_glApp->m_instancingRenderer->writeTransforms(); + +} + + + diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.cpp b/btgui/OpenGLWindow/GLInstancingRenderer.cpp index 578903cea..8fb865c06 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.cpp +++ b/btgui/OpenGLWindow/GLInstancingRenderer.cpp @@ -1507,7 +1507,8 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) B3_PROFILE("init"); init(); } - + + GLint err = glGetError(); b3Assert(err==GL_NO_ERROR); @@ -1519,6 +1520,9 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) // Compute the MVP matrix from the light's point of view if (renderMode==B3_CREATE_SHADOWMAP_RENDERMODE) { + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); + if (!m_data->m_shadowMap) { glActiveTexture(GL_TEXTURE0); @@ -1557,7 +1561,12 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) GLint err = glGetError(); b3Assert(err==GL_NO_ERROR); - } + } else + { + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + } static b3Vector3 lightPos = b3MakeVector3(-5.f,200,-40);//20,15,10);//-13,6,2);// = b3Vector3(0.5f,2,2); // lightPos.y+=0.1f; b3CreateOrtho(-shadowMapWorldSize,shadowMapWorldSize,-shadowMapWorldSize,shadowMapWorldSize,1,300,depthProjectionMatrix);//-14,14,-14,14,1,200, depthProjectionMatrix); diff --git a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl index 3e92fba96..e4fc56d02 100644 --- a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl +++ b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl @@ -37,7 +37,7 @@ void main(void) //float bias = 0.005f; - float bias = 0.005*tan(acos(intensity)); + float bias = 0.0001*tan(acos(intensity)); bias = clamp(bias, 0,0.01); diff --git a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.h b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.h index 92f545263..ab36f9313 100644 --- a/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.h +++ b/btgui/OpenGLWindow/Shaders/useShadowMapInstancingPS.h @@ -31,7 +31,7 @@ static const char* useShadowMapInstancingFragmentShader= \ " \n" " //float bias = 0.005f;\n" " \n" -" float bias = 0.005*tan(acos(intensity));\n" +" float bias = 0.0001*tan(acos(intensity));\n" " bias = clamp(bias, 0,0.01);\n" " float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z-bias)/ShadowCoord.w));\n" " \n" diff --git a/btgui/OpenGLWindow/ShapeData.h b/btgui/OpenGLWindow/ShapeData.h index a51a9c19b..e616bac50 100644 --- a/btgui/OpenGLWindow/ShapeData.h +++ b/btgui/OpenGLWindow/ShapeData.h @@ -200,10 +200,10 @@ static const float cube_vertices2[] = static const int cube_indices[]= { 0,1,2,0,2,3,//ground face - 4,5,6,4,6,7,//top face - 8,9,10,8,10,11, + 6,5,4,7,6,4,//top face + 10,9,8,11,10,8, 12,13,14,12,14,15, - 16,17,18,16,18,19, + 18,17,16,19,18,16, 20,21,22,20,22,23 }; /* @@ -284,7 +284,7 @@ static const int pyramid_indices[]= static const float tetra_vertices[] = { - 1.f, 1.f, 1.f, 0.5f, 0, 1,0, 0,0, + 0.f, 0.f, 1.f, 0.5f, 0, 1,0, 0,0, 1.f, -1.f, -1.f, 0.5f, 0, 1,0, 1,0, -1.f, 1.f, -1.f, 0.5f, 0, 1,0, 1,1, -1.f, -1, 1.f, 0.5f, 0, 1,0, 0,1 @@ -296,9 +296,9 @@ static const float tetra_vertices[] = static const int tetra_indices[]= { 0,1,2,//ground face - 3,1,2, - 3,0,1, - 3,2,0 + 2,1,3, + 1,0,3, + 0,2,3 };