From fca6d1138138d4e8a6fb1f1423eec21154aeefce Mon Sep 17 00:00:00 2001 From: erwincoumans Date: Fri, 6 Dec 2013 17:48:58 -0800 Subject: [PATCH] created new Bullet 2 CPU BasicDemo, using the OpenGL 3 rendering. I will add picking soon. Hold ctrl/alt + mouse to move/zoom camera remove reference to btGImpact (it is removed now) --- Demos3/SimpleOpenGL3/premake4.lua | 46 +- Demos3/bullet2/BasicDemo/main.cpp | 217 ++++++++ Demos3/bullet2/BasicDemo/premake4.lua | 38 ++ {btgui => Test}/OpenGLTrueTypeFont/main.cpp | 0 btgui/OpenGLTrueTypeFont/premake4.lua | 46 +- btgui/OpenGLWindow/SimpleOpenGL3App.cpp | 17 +- btgui/OpenGLWindow/SimpleOpenGL3App.h | 4 +- btgui/OpenGLWindow/gwenWindow.cpp | 375 ------------- btgui/OpenGLWindow/gwenWindow.h | 24 - btgui/OpenGLWindow/main.cpp | 516 ------------------ btgui/OpenGLWindow/premake4.lua | 60 +- btgui/OpenGLWindow/renderscene.cpp | 199 ------- btgui/OpenGLWindow/renderscene.h | 7 - build3/premake4.lua | 7 + .../CollisionDispatch/btCollisionWorld.cpp | 11 +- src/BulletDynamics/Dynamics/Bullet-C-API.cpp | 405 -------------- 16 files changed, 301 insertions(+), 1671 deletions(-) create mode 100644 Demos3/bullet2/BasicDemo/main.cpp create mode 100644 Demos3/bullet2/BasicDemo/premake4.lua rename {btgui => Test}/OpenGLTrueTypeFont/main.cpp (100%) delete mode 100644 btgui/OpenGLWindow/gwenWindow.cpp delete mode 100644 btgui/OpenGLWindow/gwenWindow.h delete mode 100644 btgui/OpenGLWindow/main.cpp delete mode 100644 btgui/OpenGLWindow/renderscene.cpp delete mode 100644 btgui/OpenGLWindow/renderscene.h delete mode 100644 src/BulletDynamics/Dynamics/Bullet-C-API.cpp diff --git a/Demos3/SimpleOpenGL3/premake4.lua b/Demos3/SimpleOpenGL3/premake4.lua index 318e8caf5..a413f1c93 100644 --- a/Demos3/SimpleOpenGL3/premake4.lua +++ b/Demos3/SimpleOpenGL3/premake4.lua @@ -15,59 +15,15 @@ initOpenGL() initGlew() - --links{"gwen"} + links{"gwen", "OpenGL_Window","OpenGL_TrueTypeFont"} files { "**.cpp", "**.h", "../../src/Bullet3Common/**.cpp", "../../src/Bullet3Common/**.h", - "../../btgui/OpenGLWindow/SimpleOpenGL3App.cpp", - "../../btgui/OpenGLWindow/SimpleOpenGL3App.h", - "../../btgui/OpenGLWindow/TwFonts.cpp", - "../../btgui/OpenGLWindow/TwFonts.h", - "../../btgui/OpenGLWindow/LoadShader.cpp", - "../../btgui/OpenGLWindow/LoadShader.h", - "../../btgui/OpenGLWindow/GLPrimitiveRenderer.cpp", - "../../btgui/OpenGLWindow/GLPrimitiveRenderer.h", - "../../btgui/OpenGLWindow/GwenOpenGL3CoreRenderer.h", - "../../btgui/OpenGLWindow/GLInstancingRenderer.cpp", - "../../btgui/OpenGLWindow/GLInstancingRenderer.h", - "../../btgui/OpenGLWindow/GLRenderToTexture.cpp", - "../../btgui/OpenGLWindow/GLRenderToTexture.h", - "../../btgui/OpenGLWindow/TwFonts.cpp", - "../../btgui/OpenGLWindow/TwFonts.h", - "../../btgui/FontFiles/OpenSans.cpp", - "../../btgui/OpenGLTrueTypeFont/fontstash.cpp", - "../../btgui/OpenGLTrueTypeFont/fontstash.h", - "../../btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp", - "../../btgui/OpenGLTrueTypeFont/opengl_fontstashcallbacks.h", - "../../btgui/Bullet3Common/**.cpp", - "../../btgui/Bullet3Common/**.h", "../../btgui/Timing/b3Clock.cpp", "../../btgui/Timing/b3Clock.h" } -if os.is("Windows") then - files { - "../../btgui/OpenGLWindow/Win32OpenGLWindow.cpp", - "../../btgui/OpenGLWindow/Win32OpenGLWindow.h", - "../../btgui/OpenGLWindow/Win32Window.cpp", - "../../btgui/OpenGLWindow/Win32Window.h", - } - end - if os.is("Linux") then - links ("X11") - files{ - "../../btgui/OpenGLWindow/X11OpenGLWindow.h", - "../../btgui/OpenGLWindow/X11OpenGLWindow.cpp" - } - end - if os.is("MacOSX") then - links{"Cocoa.framework"} - files{ - "../../btgui/OpenGLWindow/MacOpenGLWindow.mm", - "../../btgui/OpenGLWindow/MacOpenGLWindow.h", - } - end diff --git a/Demos3/bullet2/BasicDemo/main.cpp b/Demos3/bullet2/BasicDemo/main.cpp new file mode 100644 index 000000000..e0d919054 --- /dev/null +++ b/Demos3/bullet2/BasicDemo/main.cpp @@ -0,0 +1,217 @@ + +#define ARRAY_SIZE_X 5 +#define ARRAY_SIZE_Y 5 +#define ARRAY_SIZE_Z 5 + + +#include "OpenGLWindow/SimpleOpenGL3App.h" +#include "Bullet3Common/b3Vector3.h" +#include "assert.h" +#include + +#include "btBulletDynamicsCommon.h" + +class Bullet2RigidBodyDemo +{ +protected: + btDiscreteDynamicsWorld* m_dynamicsWorld; + btCollisionDispatcher* m_dispatcher; + btBroadphaseInterface* m_bp; + btCollisionConfiguration* m_config; + btConstraintSolver* m_solver; + +public: + Bullet2RigidBodyDemo() + { + m_config = 0; + m_dispatcher = 0; + m_bp = 0; + m_solver = 0; + m_dynamicsWorld = 0; + } + virtual void initPhysics() + { + m_config = new btDefaultCollisionConfiguration; + m_dispatcher = new btCollisionDispatcher(m_config); + m_bp = new btDbvtBroadphase(); + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_bp,m_solver,m_config); + } + virtual void exitPhysics() + { + delete m_dynamicsWorld; + m_dynamicsWorld=0; + delete m_solver; + m_solver=0; + delete m_bp; + m_bp=0; + delete m_dispatcher; + m_dispatcher=0; + delete m_config; + m_config=0; + } + + virtual ~Bullet2RigidBodyDemo() + { + btAssert(m_config == 0); + btAssert(m_dispatcher == 0); + btAssert(m_bp == 0); + btAssert(m_solver == 0); + btAssert(m_dynamicsWorld == 0); + } + +}; + +class BasicDemo : public Bullet2RigidBodyDemo +{ + SimpleOpenGL3App* m_glApp; + +public: + BasicDemo(SimpleOpenGL3App* app) + :m_glApp(app) + { + } + virtual ~BasicDemo() + { + } + + void initPhysics() + { + Bullet2RigidBodyDemo::initPhysics(); + + //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}; + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + m_glApp->m_instancingRenderer->registerGraphicsInstance(cubeShapeId,groundTransform.getOrigin(),groundTransform.getRotation(),color,halfExtents); + btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(halfExtents[0]),btScalar(halfExtents[1]),btScalar(halfExtents[2]))); + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + } + + { + float halfExtents[]={1,1,1,1}; + float color[]={0,1,0,1}; + + btTransform startTransform; + startTransform.setIdentity(); + btScalar mass = 1.f; + btVector3 localInertia; + btBoxShape* colShape = new btBoxShape(btVector3(halfExtents[0],halfExtents[1],halfExtents[2])); + colShape ->calculateLocalInertia(mass,localInertia); + + for (int k=0;km_instancingRenderer->registerGraphicsInstance(cubeShapeId,startTransform.getOrigin(),startTransform.getRotation(),color,halfExtents); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + + m_dynamicsWorld->addRigidBody(body); + } + } + } + } + + m_glApp->m_instancingRenderer->writeTransforms(); + } + void exitPhysics() + { + Bullet2RigidBodyDemo::exitPhysics(); + } + void drawObjects() + { + //sync graphics -> physics world transforms + { + for (int i=0;igetNumCollisionObjects();i++) + { + btVector3 pos = m_dynamicsWorld->getCollisionObjectArray()[i]->getWorldTransform().getOrigin(); + btQuaternion orn = m_dynamicsWorld->getCollisionObjectArray()[i]->getWorldTransform().getRotation(); + m_glApp->m_instancingRenderer->writeSingleInstanceTransformToCPU(pos,orn,i); + } + m_glApp->m_instancingRenderer->writeTransforms(); + } + + m_glApp->m_instancingRenderer->renderScene(); + } + void stepSimulation() + { + m_dynamicsWorld->stepSimulation(1./60,0); + } +}; + +int main(int argc, char* argv[]) +{ + + float dt = 1./120.f; + + SimpleOpenGL3App* app = new SimpleOpenGL3App("Bullet 2 CPU BasicDemo",1024,768); + app->m_instancingRenderer->setCameraDistance(40); + app->m_instancingRenderer->setCameraPitch(0); + app->m_instancingRenderer->setCameraTargetPosition(b3MakeVector3(0,0,0)); + + BasicDemo* demo = new BasicDemo(app); + demo->initPhysics(); + + GLint err = glGetError(); + assert(err==GL_NO_ERROR); + + do + { + GLint err = glGetError(); + assert(err==GL_NO_ERROR); + app->m_instancingRenderer->init(); + app->m_instancingRenderer->updateCamera(); + + demo->stepSimulation(); + demo->drawObjects(); + app->drawGrid(10,0.01); + char bla[1024]; + static int frameCount = 0; + frameCount++; + sprintf(bla,"Simulation frame %d", frameCount); + + app->drawText(bla,10,10); + app->swapBuffer(); + } while (!app->m_window->requestedExit()); + + + demo->exitPhysics(); + delete demo; + + delete app; + return 0; +} diff --git a/Demos3/bullet2/BasicDemo/premake4.lua b/Demos3/bullet2/BasicDemo/premake4.lua new file mode 100644 index 000000000..0007a678f --- /dev/null +++ b/Demos3/bullet2/BasicDemo/premake4.lua @@ -0,0 +1,38 @@ + + project "App2_BasicDemo" + + language "C++" + + kind "ConsoleApp" + targetdir "../../../bin" + + includedirs { + ".", + "../../../src", + "../../../btgui" + } + + initOpenGL() + initGlew() + + links{"gwen", "BulletDynamics", "BulletCollision","LinearMath", + "OpenGL_Window", "OpenGL_TrueTypeFont" + } + + files { + "**.cpp", + "**.h", + "../../../src/Bullet3Common/**.cpp", + "../../../src/Bullet3Common/**.h", + "../../../btgui/Timing/b3Clock.cpp", + "../../../btgui/Timing/b3Clock.h" + + } + + if os.is("Linux") then + links ("X11") + end + + if os.is("MacOSX") then + links{"Cocoa.framework"} + end diff --git a/btgui/OpenGLTrueTypeFont/main.cpp b/Test/OpenGLTrueTypeFont/main.cpp similarity index 100% rename from btgui/OpenGLTrueTypeFont/main.cpp rename to Test/OpenGLTrueTypeFont/main.cpp diff --git a/btgui/OpenGLTrueTypeFont/premake4.lua b/btgui/OpenGLTrueTypeFont/premake4.lua index 967c5c940..b43f5b0d5 100644 --- a/btgui/OpenGLTrueTypeFont/premake4.lua +++ b/btgui/OpenGLTrueTypeFont/premake4.lua @@ -4,9 +4,8 @@ language "C++" - kind "ConsoleApp" - targetdir "../../bin" - + kind "StaticLib" + initOpenGL() initGlew() @@ -16,49 +15,14 @@ ".." } - - - files { - "main.cpp", + files + { "../FontFiles/OpenSans.cpp", - "../OpenGLWindow/LoadShader.cpp", - "../OpenGLWindow/LoadShader.h", - "../../src/Bullet3Common/b3AlignedAllocator.cpp", - "../../src/Bullet3Common/b3Logging.cpp", - "../Timing/b3Quickprof.cpp", - "../Timing/b3Quickprof.h" , - "../Timing/b3Clock.cpp", - "../Timing/b3Clock.h" , "fontstash.cpp", "fontstash.h", "opengl_fontstashcallbacks.cpp", "opengl_fontstashcallbacks.h", "stb_image_write.h", "stb_truetype.h", - } + } - if os.is("Windows") then - files{ - "../OpenGLWindow/Win32OpenGLWindow.cpp", - "../OpenGLWindow/Win32OpenGLWindow.h", - "../OpenGLWindow/Win32Window.cpp", - "../OpenGLWindow/Win32Window.h", - } - end - if os.is("Linux") then - links{"X11"} - files{ - "../OpenGLWindow/X11OpenGLWindow.h", - "../OpenGLWindow/X11OpenGLWindow.cpp" - } - end - - if os.is("MacOSX") then - links { "Cocoa.framework" } - files{ - "../OpenGLWindow/MacOpenGLWindow.h", - "../OpenGLWindow/MacOpenGLWindow.mm", - } - - end - diff --git a/btgui/OpenGLWindow/SimpleOpenGL3App.cpp b/btgui/OpenGLWindow/SimpleOpenGL3App.cpp index be0f3aa9d..469b6cad9 100644 --- a/btgui/OpenGLWindow/SimpleOpenGL3App.cpp +++ b/btgui/OpenGLWindow/SimpleOpenGL3App.cpp @@ -1,5 +1,5 @@ #include "SimpleOpenGL3App.h" - +#include "ShapeData.h" #ifdef __APPLE__ #include "OpenGLWindow/MacOpenGLWindow.h" @@ -171,8 +171,15 @@ void SimpleOpenGL3App::drawText( const char* txt, int posX, int posY) glDisable(GL_BLEND); } - -void SimpleOpenGL3App::drawGrid(int gridSize) +int SimpleOpenGL3App::registerCubeShape() +{ + int strideInBytes = 9*sizeof(float); + int numVertices = sizeof(cube_vertices)/strideInBytes; + int numIndices = sizeof(cube_indices)/sizeof(int); + int shapeId = m_instancingRenderer->registerShape(&cube_vertices[0],numVertices,cube_indices,numIndices); + return shapeId; +} +void SimpleOpenGL3App::drawGrid(int gridSize, float yOffset) { b3Vector3 gridColor = b3MakeVector3(0.5,0.5,0.5); @@ -182,12 +189,12 @@ void SimpleOpenGL3App::drawGrid(int gridSize) GLint err = glGetError(); b3Assert(err==GL_NO_ERROR); - m_instancingRenderer->drawLine(b3MakeVector3(float(i),0,float(-gridSize)),b3MakeVector3(float(i),0,float(gridSize)),gridColor); + m_instancingRenderer->drawLine(b3MakeVector3(float(i),yOffset,float(-gridSize)),b3MakeVector3(float(i),yOffset,float(gridSize)),gridColor); err = glGetError(); b3Assert(err==GL_NO_ERROR); - m_instancingRenderer->drawLine(b3MakeVector3(float(-gridSize),0,float(i)),b3MakeVector3(float(gridSize),0,float(i)),gridColor); + m_instancingRenderer->drawLine(b3MakeVector3(float(-gridSize),yOffset,float(i)),b3MakeVector3(float(gridSize),yOffset,float(i)),gridColor); } m_instancingRenderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(1,0,0),b3MakeVector3(1,0,0),3); diff --git a/btgui/OpenGLWindow/SimpleOpenGL3App.h b/btgui/OpenGLWindow/SimpleOpenGL3App.h index 6cdb38413..ff9ef7321 100644 --- a/btgui/OpenGLWindow/SimpleOpenGL3App.h +++ b/btgui/OpenGLWindow/SimpleOpenGL3App.h @@ -16,7 +16,9 @@ struct SimpleOpenGL3App SimpleOpenGL3App(const char* title, int width,int height); virtual ~SimpleOpenGL3App(); - void drawGrid(int gridSize=10); + int registerCubeShape(); + + void drawGrid(int gridSize=10, float yOffset=0.001); void swapBuffer(); void drawText( const char* txt, int posX, int posY); diff --git a/btgui/OpenGLWindow/gwenWindow.cpp b/btgui/OpenGLWindow/gwenWindow.cpp deleted file mode 100644 index 06df2d15d..000000000 --- a/btgui/OpenGLWindow/gwenWindow.cpp +++ /dev/null @@ -1,375 +0,0 @@ - -#include "gwenWindow.h" - - -#include "Gwen/Platform.h" -#include "Gwen/Controls/TreeControl.h" -#include "Gwen/Controls/RadioButtonController.h" -#include "Gwen/Controls/VerticalSlider.h" -#include "Gwen/Controls/HorizontalSlider.h" -#include "Gwen/Controls/GroupBox.h" -#include "Gwen/Controls/CheckBox.h" -#include "Gwen/Controls/MenuStrip.h" - - -#include "Gwen/Gwen.h" -#include "Gwen/Align.h" -#include "Gwen/Utility.h" -#include "Gwen/Controls/WindowControl.h" -#include "Gwen/Controls/TabControl.h" -#include "Gwen/Controls/ListBox.h" - -#include "Bullet3Common/b3Quickprof.h" -#include "GwenOpenGL3CoreRenderer.h" -#include "GLPrimitiveRenderer.h" - -GLPrimitiveRenderer* primRenderer=0; -GwenOpenGL3CoreRenderer* pRenderer = 0; -//Gwen::Renderer::OpenGL_DebugFont * pRenderer =0; -Gwen::Skin::Simple skin; -Gwen::Controls::Canvas* pCanvas =0; -class MyProfileWindow* profWindow = 0; - - - - -/*struct MyHander :public Gwen::Event::Handler -{ - - MyHander (Application* app) - :m_app(app) - { - } - - void onButtonA( Gwen::Controls::Base* pControl ) - { - OpenTissue::glut::toggleIdle(); - } - - void SliderMoved(Gwen::Controls::Base* pControl ) - { - Gwen::Controls::Slider* pSlider = (Gwen::Controls::Slider*)pControl; - this->m_app->scaleYoungModulus(pSlider->GetValue()); - // printf("Slider Value: %.2f", pSlider->GetValue() ); - } - - - void OnCheckChangedStiffnessWarping (Gwen::Controls::Base* pControl) - { - Gwen::Controls::CheckBox* labeled = (Gwen::Controls::CheckBox* )pControl; - bool checked = labeled->IsChecked(); - m_app->m_stiffness_warp_on = checked; - } - - -}; - -*/ - - - -class MyProfileWindow : public Gwen::Controls::WindowControl -{ - - // Gwen::Controls::TabControl* m_TabControl; - //Gwen::Controls::ListBox* m_TextOutput; - unsigned int m_iFrames; - float m_fLastSecond; - - Gwen::Controls::TreeNode* m_node; - Gwen::Controls::TreeControl* m_ctrl; - - -protected: - - void onButtonA( Gwen::Controls::Base* pControl ) - { - // OpenTissue::glut::toggleIdle(); - } - - void SliderMoved(Gwen::Controls::Base* pControl ) - { - Gwen::Controls::Slider* pSlider = (Gwen::Controls::Slider*)pControl; - //this->m_app->scaleYoungModulus(pSlider->GetValue()); - // printf("Slider Value: %.2f", pSlider->GetValue() ); - } - - - void OnCheckChangedStiffnessWarping (Gwen::Controls::Base* pControl) - { - Gwen::Controls::CheckBox* labeled = (Gwen::Controls::CheckBox* )pControl; - bool checked = labeled->IsChecked(); - //m_app->m_stiffness_warp_on = checked; - } -public: - - void MenuItemSelect(Gwen::Controls::Base* pControl) - { - if (Hidden()) - { - SetHidden(false); - } else - { - SetHidden(true); - } - } - - - MyProfileWindow ( Gwen::Controls::Base* pParent) - : Gwen::Controls::WindowControl( pParent ) - { - SetTitle( L"FEM Settings" ); - - SetSize( 450, 150 ); - this->SetPos(10,40); - -// this->Dock( Gwen::Pos::Bottom); - - - - { - m_ctrl = new Gwen::Controls::TreeControl( this ); - m_node = m_ctrl->AddNode( L"Total Parent Time" ); - - - //Gwen::Controls::TreeNode* pNode = ctrl->AddNode( L"Node Two" ); - //pNode->AddNode( L"Node Two Inside" ); - //pNode->AddNode( L"Eyes" ); - //pNode->AddNode( L"Brown" )->AddNode( L"Node Two Inside" )->AddNode( L"Eyes" )->AddNode( L"Brown" ); - //Gwen::Controls::TreeNode* node = ctrl->AddNode( L"Node Three" ); - - - - //m_ctrl->Dock(Gwen::Pos::Bottom); - - m_ctrl->ExpandAll(); - m_ctrl->SetBounds( this->GetInnerBounds().x,this->GetInnerBounds().y,this->GetInnerBounds().w,this->GetInnerBounds().h); - - } - - - - } - - - float dumpRecursive(b3ProfileIterator* profileIterator, Gwen::Controls::TreeNode* parentNode) - { - profileIterator->First(); - if (profileIterator->Is_Done()) - return 0.f; - - float accumulated_time=0,parent_time = profileIterator->Is_Root() ? b3ProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time(); - int i; - int frames_since_reset = b3ProfileManager::Get_Frame_Count_Since_Reset(); - - //printf("Profiling: %s (total running time: %.3f ms) ---\n", profileIterator->Get_Current_Parent_Name(), parent_time ); - float totalTime = 0.f; - - - int numChildren = 0; - Gwen::UnicodeString txt; - std::vector nodes; - - for (i = 0; !profileIterator->Is_Done(); i++,profileIterator->Next()) - { - numChildren++; - float current_total_time = profileIterator->Get_Current_Total_Time(); - accumulated_time += current_total_time; - double fraction = parent_time > B3_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; - - Gwen::String name(profileIterator->Get_Current_Name()); -#ifdef _WIN32 - Gwen::UnicodeString uname = Gwen::Utility::StringToUnicode(name); - - txt = Gwen::Utility::Format(L"%s (%.2f %%) :: %.3f ms / frame (%d calls)",uname.c_str(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->Get_Current_Total_Calls()); - -#else - txt = Gwen::Utility::Format(L"%s (%.2f %%) :: %.3f ms / frame (%d calls)",name.c_str(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->Get_Current_Total_Calls()); - -#endif - - Gwen::Controls::TreeNode* childNode = (Gwen::Controls::TreeNode*)profileIterator->Get_Current_UserPointer(); - if (!childNode) - { - childNode = parentNode->AddNode(L""); - profileIterator->Set_Current_UserPointer(childNode); - } - childNode->SetText(txt); - nodes.push_back(childNode); - - totalTime += current_total_time; - //recurse into children - } - - for (i=0;iEnter_Child(i); - Gwen::Controls::TreeNode* curNode = nodes[i]; - - dumpRecursive(profileIterator, curNode); - - profileIterator->Enter_Parent(); - } - return accumulated_time; - - } - - void UpdateText(b3ProfileIterator* profileIterator, bool idle) - { - - static bool update=true; - - m_ctrl->SetBounds(0,0,this->GetInnerBounds().w,this->GetInnerBounds().h); - -// if (!update) -// return; - update=false; - - - static int test = 1; - test++; - - static double time_since_reset = 0.f; - if (!idle) - { - time_since_reset = b3ProfileManager::Get_Time_Since_Reset(); - } - - //Gwen::UnicodeString txt = Gwen::Utility::Format( L"FEM Settings %i fps", test ); - { - //recompute profiling data, and store profile strings - - char blockTime[128]; - - double totalTime = 0; - - int frames_since_reset = b3ProfileManager::Get_Frame_Count_Since_Reset(); - - profileIterator->First(); - - double parent_time = profileIterator->Is_Root() ? time_since_reset : profileIterator->Get_Current_Parent_Total_Time(); - - - Gwen::Controls::TreeNode* curParent = m_node; - - double accumulated_time = dumpRecursive(profileIterator,m_node); - - const char* name = profileIterator->Get_Current_Parent_Name(); -#ifdef _WIN32 - Gwen::UnicodeString uname = Gwen::Utility::StringToUnicode(name); - Gwen::UnicodeString txt = Gwen::Utility::Format( L"Profiling: %s total time: %.3f ms, unaccounted %.3f %% :: %.3f ms", uname.c_str(), parent_time , - parent_time > B3_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); -#else - Gwen::UnicodeString txt = Gwen::Utility::Format( L"Profiling: %s total time: %.3f ms, unaccounted %.3f %% :: %.3f ms", name, parent_time , - parent_time > B3_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); -#endif - //sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---", profileIterator->Get_Current_Parent_Name(), parent_time ); - //displayProfileString(xOffset,yStart,blockTime); - m_node->SetText(txt); - - - //printf("%s (%.3f %%) :: %.3f ms\n", "Unaccounted:",); - - - } - - static bool once1 = true; - if (once1) - { - once1 = false; - m_ctrl->ExpandAll(); - } - - } - void PrintText( const Gwen::UnicodeString& str ) - { - - } - - void Render( Gwen::Skin::Base* skin ) - { - m_iFrames++; - - if ( m_fLastSecond < Gwen::Platform::GetTimeInSeconds() ) - { - SetTitle( Gwen::Utility::Format( L"Profiler %i fps", m_iFrames ) ); - - m_fLastSecond = Gwen::Platform::GetTimeInSeconds() + 1.0f; - m_iFrames = 0; - } - - Gwen::Controls::WindowControl::Render( skin ); - - } - - -}; - -struct MyTestMenuBar : public Gwen::Controls::MenuStrip -{ - MyProfileWindow* m_profileWindow; - - - MyTestMenuBar(Gwen::Controls::Base* pParent, MyProfileWindow* profileWindow) - :Gwen::Controls::MenuStrip(pParent), - m_profileWindow(profileWindow) - { -// Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( pParent ); - { - Gwen::Controls::MenuItem* pRoot = AddItem( L"File" ); - - pRoot = AddItem( L"View" ); -// Gwen::Event::Handler* handler = GWEN_MCALL(&MyTestMenuBar::MenuItemSelect ); - pRoot->GetMenu()->AddItem( L"Profiler",m_profileWindow,(Gwen::Event::Handler::Function)&MyProfileWindow::MenuItemSelect); - -/* pRoot->GetMenu()->AddItem( L"New", L"test16.png", GWEN_MCALL( ThisClass::MenuItemSelect ) ); - pRoot->GetMenu()->AddItem( L"Load", L"test16.png", GWEN_MCALL( ThisClass::MenuItemSelect ) ); - pRoot->GetMenu()->AddItem( L"Save", GWEN_MCALL( ThisClass::MenuItemSelect ) ); - pRoot->GetMenu()->AddItem( L"Save As..", GWEN_MCALL( ThisClass::MenuItemSelect ) ); - pRoot->GetMenu()->AddItem( L"Quit", GWEN_MCALL( ThisClass::MenuItemSelect ) ); - */ - } - } - -}; - -void setupGUI(int width, int height, sth_stash* font, float retinaScale,GLPrimitiveRenderer* primRender) -{ - primRenderer = primRender; - pRenderer = new GwenOpenGL3CoreRenderer(primRenderer,font,width,height, retinaScale); - if (primRenderer) - primRenderer->setScreenSize(width,height); - -// pRenderer = new Gwen::Renderer::OpenGL_DebugFont(); - skin.SetRender( pRenderer ); - - pCanvas = new Gwen::Controls::Canvas( &skin ); - pCanvas->SetSize( width,height); - pCanvas->SetDrawBackground( false); - pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); -// pCanvas->SetScale(.5); - //MyWindow* window = new MyWindow(pCanvas); - profWindow = new MyProfileWindow(pCanvas); - - MyTestMenuBar* menubar = new MyTestMenuBar(pCanvas, profWindow); - - - -} - -void resizeGUI(int width, int height) -{ - pCanvas->SetSize(width,height); - pRenderer->resize(width,height); - primRenderer->setScreenSize(width,height); -} - -void processProfileData(b3ProfileIterator* iterator, bool idle) -{ - if (profWindow) - { - - profWindow->UpdateText(iterator, idle); - } - -} diff --git a/btgui/OpenGLWindow/gwenWindow.h b/btgui/OpenGLWindow/gwenWindow.h deleted file mode 100644 index 6f0940770..000000000 --- a/btgui/OpenGLWindow/gwenWindow.h +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef MY_GWEN_WINDOW_H -#define MY_GWEN_WINDOW_H - - -#include "Gwen/Gwen.h" -#include "Gwen/Controls/Button.h" -#include "Gwen/Skins/Simple.h" -#include "Gwen/Renderers/OpenGL_DebugFont.h" - -struct sth_stash; - -extern class GwenOpenGL3CoreRenderer* pRenderer; -//extern Gwen::Renderer::OpenGL_DebugFont * pRenderer; -extern Gwen::Skin::Simple skin; -extern Gwen::Controls::Canvas* pCanvas; - -class GLPrimitiveRenderer; - -void setupGUI(int width, int height, sth_stash* font, float retinaScale,GLPrimitiveRenderer* primRender); -void processProfileData(class b3ProfileIterator* iterator, bool idle); -void resizeGUI(int width, int height); - -#endif //MY_GWEN_WINDOW_H diff --git a/btgui/OpenGLWindow/main.cpp b/btgui/OpenGLWindow/main.cpp deleted file mode 100644 index 18581a367..000000000 --- a/btgui/OpenGLWindow/main.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* -Copyright (c) 2012 Advanced Micro Devices, Inc. - -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. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -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. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ -//Originally written by Erwin Coumans - -// -//#include "vld.h" -#ifndef __APPLE__ -#include -#endif -#include - -#include "GLInstancingRenderer.h" - -#ifdef __APPLE__ -#include "MacOpenGLWindow.h" -#elif _WIN32 -#include "Win32OpenGLWindow.h" -#elif __linux -#include "X11OpenGLWindow.h" -#endif - -#include "GLPrimitiveRenderer.h" - -extern char OpenSansData[]; - -#include "renderscene.h" - - -#include "Bullet3Common/b3Quickprof.h" -#include "Bullet3Common/b3Quaternion.h" - -#include "Bullet3Common/b3CommandLineArgs.h" - -#include "../OpenGLTrueTypeFont/fontstash.h" -#include "../OpenGLTrueTypeFont/opengl_fontstashcallbacks.h" - -bool printStats = false; -bool pauseSimulation = false; -bool shootObject = false; - - -bool useInterop = false; - -extern int NUM_OBJECTS_X; -extern int NUM_OBJECTS_Y; -extern int NUM_OBJECTS_Z; -extern bool keepStaticObjects; -extern float X_GAP; -extern float Y_GAP; -extern float Z_GAP; - -const char* fileName="../../bin/1000 stack.bullet"; -void Usage() -{ - printf("\nprogram.exe [--pause_simulation=<0 or 1>] [--load_bulletfile=test.bullet] [--enable_interop=<0 or 1>] [--enable_gpusap=<0 or 1>] [--enable_convexheightfield=<0 or 1>] [--enable_static=<0 or 1>] [--x_dim=] [--y_dim=] [--z_dim=] [--x_gap=] [--y_gap=] [--z_gap=]\n"); -}; - - -#include "gwenWindow.h" - - -void MyMouseButtonCallback(int button, int state, float x, float y) -{ - //b3DefaultMouseCallback(button,state,x,y); - - if (pCanvas) - { - bool handled = pCanvas->InputMouseMoved(x,y,x, y); - - if (button>=0) - { - handled = pCanvas->InputMouseButton(button,state); - if (handled) - { - if (!state) - return; - } - } - } -} - -int g_OpenGLWidth = 1024;//650; -int g_OpenGLHeight =800; - -void MyResizeCallback(float width, float height) -{ - g_OpenGLWidth = width; - g_OpenGLHeight = height; - if (pCanvas) - { - pCanvas->SetSize(width,height); - resizeGUI(width,height); - } -} - -void MyMouseMoveCallback( float x, float y) -{ - //b3DefaultMouseCallback(button,state,x,y); - - static int m_lastmousepos[2] = {0,0}; - static bool isInitialized = false; - if (pCanvas) - { - if (!isInitialized) - { - isInitialized = true; - m_lastmousepos[0] = x+1; - m_lastmousepos[1] = y+1; - } - bool handled = pCanvas->InputMouseMoved(x,y,m_lastmousepos[0],m_lastmousepos[1]); - } -} - - int droidRegular;//, droidItalic, droidBold, droidJapanese, dejavu; - -sth_stash* initFont(GLPrimitiveRenderer* primRender) -{ - GLint err; - - struct sth_stash* stash = 0; - int datasize; - - float sx,sy,dx,dy,lh; - GLuint texture; - OpenGL2RenderCallbacks* renderCallbacks = new OpenGL2RenderCallbacks(primRender); - stash = sth_create(512,512,renderCallbacks);//256,256);//,1024);//512,512); - err = glGetError(); - assert(err==GL_NO_ERROR); - - if (!stash) - { - fprintf(stderr, "Could not create stash.\n"); - return 0; - } -#ifdef LOAD_FONT_FROM_FILE - unsigned char* data; - const char* fontPaths[]={ - "./", - "../../bin/", - "../bin/", - "bin/" - }; - - int numPaths=sizeof(fontPaths)/sizeof(char*); - - // Load the first truetype font from memory (just because we can). - - FILE* fp = 0; - const char* fontPath ="./"; - char fullFontFileName[1024]; - - for (int i=0;icreateWindow(wci); - window->setWindowTitle("render test"); - - - - float retinaScale = 1; - -#ifndef __APPLE__ - GLenum err = glewInit(); -#else - retinaScale = window->getRetinaScale(); -#endif - - window->runMainLoop(); - window->startRendering(); - window->endRendering(); - - int maxObjectCapacity=128*1024; - GLInstancingRenderer render(maxObjectCapacity); - - GLPrimitiveRenderer* primRenderer = new GLPrimitiveRenderer(g_OpenGLWidth,g_OpenGLHeight); - - sth_stash* stash = initFont(primRenderer); - - render.InitShaders(); - - - createSceneProgrammatically(render); - - - render.writeTransforms(); - - window->runMainLoop(); - - window->setMouseButtonCallback(MyMouseButtonCallback); - window->setMouseMoveCallback(MyMouseMoveCallback); - window->setResizeCallback(MyResizeCallback); - window->setKeyboardCallback(b3DefaultKeyboardCallback); - window->setWheelCallback(b3DefaultWheelCallback); - - - //GLPrimitiveRenderer* pprender = new GLPrimitiveRenderer(g_OpenGLWidth,g_OpenGLHeight); - - glUseProgram(0); - - - - -//////////////////////////////// - - ///////////////////////////////////// - - - if (pCanvas) - { - pCanvas->SetSize(g_OpenGLWidth,g_OpenGLHeight); - } - setupGUI(g_OpenGLWidth,g_OpenGLHeight,stash,retinaScale,primRenderer); - class b3ProfileIterator* m_profileIterator; - m_profileIterator = b3ProfileManager::Get_Iterator(); - - glClearColor(1,1,1,1); - while (!window->requestedExit()) - { - b3ProfileManager::Reset(); - - { - B3_PROFILE("loop"); - - - - - { - B3_PROFILE("startRendering"); - window->startRendering(); - } - render.RenderScene(); - glFinish(); - float col[4]={0,1,0,1}; - // pprender->drawRect(10,50,120,60,col); -// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - //glEnable(GL_TEXTURE_2D); - - float x = 10; - float y=220; - float dx=0; - if (1) - { - B3_PROFILE("font sth_draw_text"); - - glEnable(GL_BLEND); - GLint err = glGetError(); - assert(err==GL_NO_ERROR); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - err = glGetError(); - assert(err==GL_NO_ERROR); - - glDisable(GL_DEPTH_TEST); - err = glGetError(); - assert(err==GL_NO_ERROR); - - - glDisable(GL_CULL_FACE); - - sth_begin_draw(stash); - sth_flush_draw(stash); - sth_draw_text(stash, droidRegular,20.f, x, y, "Non-retina font rendering !@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,1);//retinaScale); - if (retinaScale!=1.f) - sth_draw_text(stash, droidRegular,20.f*retinaScale, x, y+20, "Retina font rendering!@#$", &dx,g_OpenGLWidth,g_OpenGLHeight,0,retinaScale); - sth_flush_draw(stash); - - sth_end_draw(stash); - } - - if (1) - { - B3_PROFILE("gwen RenderCanvas"); - - if (pCanvas) - { - glEnable(GL_BLEND); - GLint err = glGetError(); - assert(err==GL_NO_ERROR); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - err = glGetError(); - assert(err==GL_NO_ERROR); - - err = glGetError(); - assert(err==GL_NO_ERROR); - - glDisable(GL_DEPTH_TEST); - err = glGetError(); - assert(err==GL_NO_ERROR); - - //glColor4ub(255,0,0,255); - - err = glGetError(); - assert(err==GL_NO_ERROR); - - - err = glGetError(); - assert(err==GL_NO_ERROR); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - // saveOpenGLState(width,height);//m_glutScreenWidth,m_glutScreenHeight); - - err = glGetError(); - assert(err==GL_NO_ERROR); - - - err = glGetError(); - assert(err==GL_NO_ERROR); - - glDisable(GL_CULL_FACE); - - glDisable(GL_DEPTH_TEST); - err = glGetError(); - assert(err==GL_NO_ERROR); - - err = glGetError(); - assert(err==GL_NO_ERROR); - - glEnable(GL_BLEND); - - - err = glGetError(); - assert(err==GL_NO_ERROR); - - - - pCanvas->RenderCanvas(); - //restoreOpenGLState(); - } - - } - - - - - - - window->endRendering(); - - } - - - - b3ProfileManager::Increment_Frame_Counter(); - - - - static bool printStats = true; - - - if (printStats && !pauseSimulation) - { - static int count = 0; - count--; - if (count<0) - { - count = 100; - { - //B3_PROFILE("processProfileData"); - processProfileData(m_profileIterator,false); - } - //b3ProfileManager::dumpAll(); - //printStats = false; - } else - { -// printf("."); - } - } - - - } - - //delete pprender; -// render.CleanupShaders(); - window->closeWindow(); - - delete window; - - - - return 0; - - -} diff --git a/btgui/OpenGLWindow/premake4.lua b/btgui/OpenGLWindow/premake4.lua index 1854eb942..59c17fdf0 100644 --- a/btgui/OpenGLWindow/premake4.lua +++ b/btgui/OpenGLWindow/premake4.lua @@ -1,14 +1,11 @@ - - project "OpenGL_rendertest" - + project "OpenGL_Window" language "C++" - kind "ConsoleApp" + kind "StaticLib" targetdir "../../bin" - initOpenGL() initGlew() @@ -17,61 +14,36 @@ "../../src", } - links { - "gwen" - } + --links { + --} files { - "main.cpp", - "renderscene.cpp", - "renderscene.h", - "GLInstancingRenderer.cpp", - "GLInstancingRenderer.h", - "GLPrimitiveRenderer.h", - "GLPrimitiveRenderer.cpp", - "SimpleOpenGL3App.cpp", - "SimpleOpenGL3App.h", - "LoadShader.cpp", - "LoadShader.h", - "gwenWindow.cpp", - "gwenWindow.h", - "TwFonts.cpp", - "TwFonts.h", - "GwenOpenGL3CoreRenderer.h", - "../FontFiles/OpenSans.cpp", - "../OpenGLTrueTypeFont/fontstash.cpp", - "../OpenGLTrueTypeFont/fontstash.h", - "../OpenGLTrueTypeFont/opengl_fontstashcallbacks.cpp", - "../OpenGLTrueTypeFont/opengl_fontstashcallbacks.h", - "../../src/Bullet3Geometry/b3ConvexHullComputer.cpp", - "../../src/Bullet3Geometry/b3ConvexHullComputer.h", - "../../src/Bullet3Common/b3AlignedAllocator.cpp", - "../Timing/b3Quickprof.cpp", - "../Timing/b3Quickprof.h", - "../Timing/b3Clock.cpp", - "../Timing/b3Clock.h", + "**.cpp", + "**.h", + "**.c" } - if os.is("Windows") then - files{ + if not os.is("Windows") then + excludes { "Win32OpenGLWindow.cpp", "Win32OpenGLWindow.h", "Win32Window.cpp", "Win32Window.h", } end - if os.is("Linux") then - files { + if not os.is("Linux") then + excludes { "X11OpenGLWindow.cpp", "X11OpenGLWindows.h" } end if os.is("MacOSX") then links{"Cocoa.framework"} - files + else + excludes { - "../OpenGLWindow/MacOpenGLWindow.h", - "../OpenGLWindow/MacOpenGLWindow.mm", - } + "../OpenGLWindow/MacOpenGLWindow.h", + "../OpenGLWindow/MacOpenGLWindow.mm", + } end diff --git a/btgui/OpenGLWindow/renderscene.cpp b/btgui/OpenGLWindow/renderscene.cpp deleted file mode 100644 index 402e6fa19..000000000 --- a/btgui/OpenGLWindow/renderscene.cpp +++ /dev/null @@ -1,199 +0,0 @@ -int NUM_OBJECTS_X = 35; -int NUM_OBJECTS_Y = 35; -int NUM_OBJECTS_Z = 35; - - -float X_GAP = 2.3f; -float Y_GAP = 2.f; -float Z_GAP = 2.3f; - -bool keepStaticObjects = false; -#include - -#include "OpenGLInclude.h" - -#include "renderscene.h" - -#include "GLInstancingRenderer.h" -//#include "LinearMath/b3Quickprof.h" -#include "Bullet3Common/b3Quaternion.h" -#include "Bullet3Common/b3Matrix3x3.h" -//#include "../opencl/gpu_rigidbody_pipeline/b3ConvexUtility.h" -#include "ShapeData.h" -///work-in-progress -///This ReadBulletSample is kept as simple as possible without dependencies to the Bullet SDK. -///It can be used to load .bullet data for other physics SDKs -///For a more complete example how to load and convert Bullet data using the Bullet SDK check out -///the Bullet/Demos/SerializeDemo and Bullet/Serialize/BulletWorldImporter - - -//using namespace Bullet; - -struct GraphicsVertex -{ - float xyzw[4]; - float normal[3]; - float uv[2]; -}; -struct GraphicsShape -{ - const float* m_vertices; - int m_numvertices; - const int* m_indices; - int m_numIndices; - float m_scaling[4]; -}; - -struct InstanceGroup -{ -// Bullet::b3CollisionShapeData* m_shape; - int m_collisionShapeIndex; - -// b3AlignedObjectArray m_rigidBodies; -}; - - - - -#define MY_UNITSPHERE_POINTS 42 - -static b3Vector3 sUnitSpherePoints[MY_UNITSPHERE_POINTS] = -{ - b3Vector3(b3Scalar(0.000000) , b3Scalar(-0.000000),b3Scalar(-1.000000)), - b3Vector3(b3Scalar(0.723608) , b3Scalar(-0.525725),b3Scalar(-0.447219)), - b3Vector3(b3Scalar(-0.276388) , b3Scalar(-0.850649),b3Scalar(-0.447219)), - b3Vector3(b3Scalar(-0.894426) , b3Scalar(-0.000000),b3Scalar(-0.447216)), - b3Vector3(b3Scalar(-0.276388) , b3Scalar(0.850649),b3Scalar(-0.447220)), - b3Vector3(b3Scalar(0.723608) , b3Scalar(0.525725),b3Scalar(-0.447219)), - b3Vector3(b3Scalar(0.276388) , b3Scalar(-0.850649),b3Scalar(0.447220)), - b3Vector3(b3Scalar(-0.723608) , b3Scalar(-0.525725),b3Scalar(0.447219)), - b3Vector3(b3Scalar(-0.723608) , b3Scalar(0.525725),b3Scalar(0.447219)), - b3Vector3(b3Scalar(0.276388) , b3Scalar(0.850649),b3Scalar(0.447219)), - b3Vector3(b3Scalar(0.894426) , b3Scalar(0.000000),b3Scalar(0.447216)), - b3Vector3(b3Scalar(-0.000000) , b3Scalar(0.000000),b3Scalar(1.000000)), - b3Vector3(b3Scalar(0.425323) , b3Scalar(-0.309011),b3Scalar(-0.850654)), - b3Vector3(b3Scalar(-0.162456) , b3Scalar(-0.499995),b3Scalar(-0.850654)), - b3Vector3(b3Scalar(0.262869) , b3Scalar(-0.809012),b3Scalar(-0.525738)), - b3Vector3(b3Scalar(0.425323) , b3Scalar(0.309011),b3Scalar(-0.850654)), - b3Vector3(b3Scalar(0.850648) , b3Scalar(-0.000000),b3Scalar(-0.525736)), - b3Vector3(b3Scalar(-0.525730) , b3Scalar(-0.000000),b3Scalar(-0.850652)), - b3Vector3(b3Scalar(-0.688190) , b3Scalar(-0.499997),b3Scalar(-0.525736)), - b3Vector3(b3Scalar(-0.162456) , b3Scalar(0.499995),b3Scalar(-0.850654)), - b3Vector3(b3Scalar(-0.688190) , b3Scalar(0.499997),b3Scalar(-0.525736)), - b3Vector3(b3Scalar(0.262869) , b3Scalar(0.809012),b3Scalar(-0.525738)), - b3Vector3(b3Scalar(0.951058) , b3Scalar(0.309013),b3Scalar(0.000000)), - b3Vector3(b3Scalar(0.951058) , b3Scalar(-0.309013),b3Scalar(0.000000)), - b3Vector3(b3Scalar(0.587786) , b3Scalar(-0.809017),b3Scalar(0.000000)), - b3Vector3(b3Scalar(0.000000) , b3Scalar(-1.000000),b3Scalar(0.000000)), - b3Vector3(b3Scalar(-0.587786) , b3Scalar(-0.809017),b3Scalar(0.000000)), - b3Vector3(b3Scalar(-0.951058) , b3Scalar(-0.309013),b3Scalar(-0.000000)), - b3Vector3(b3Scalar(-0.951058) , b3Scalar(0.309013),b3Scalar(-0.000000)), - b3Vector3(b3Scalar(-0.587786) , b3Scalar(0.809017),b3Scalar(-0.000000)), - b3Vector3(b3Scalar(-0.000000) , b3Scalar(1.000000),b3Scalar(-0.000000)), - b3Vector3(b3Scalar(0.587786) , b3Scalar(0.809017),b3Scalar(-0.000000)), - b3Vector3(b3Scalar(0.688190) , b3Scalar(-0.499997),b3Scalar(0.525736)), - b3Vector3(b3Scalar(-0.262869) , b3Scalar(-0.809012),b3Scalar(0.525738)), - b3Vector3(b3Scalar(-0.850648) , b3Scalar(0.000000),b3Scalar(0.525736)), - b3Vector3(b3Scalar(-0.262869) , b3Scalar(0.809012),b3Scalar(0.525738)), - b3Vector3(b3Scalar(0.688190) , b3Scalar(0.499997),b3Scalar(0.525736)), - b3Vector3(b3Scalar(0.525730) , b3Scalar(0.000000),b3Scalar(0.850652)), - b3Vector3(b3Scalar(0.162456) , b3Scalar(-0.499995),b3Scalar(0.850654)), - b3Vector3(b3Scalar(-0.425323) , b3Scalar(-0.309011),b3Scalar(0.850654)), - b3Vector3(b3Scalar(-0.425323) , b3Scalar(0.309011),b3Scalar(0.850654)), - b3Vector3(b3Scalar(0.162456) , b3Scalar(0.499995),b3Scalar(0.850654)) -}; - - -void createSceneProgrammatically(GLInstancingRenderer& renderer) -{ - int strideInBytes = sizeof(float)*9; - - bool noHeightField = false; - int barrelShapeIndex = -1; - int cubeShapeIndex = -1; - int tetraShapeIndex = -1; - - float position[4]={0,0,0,0}; - b3Quaternion born(b3Vector3(1,0,0),B3_PI*0.25*0.5); - - float orn[4] = {0,0,0,1}; -// float rotOrn[4] = {born.getX(),born.getY(),born.getZ(),born.getW()};// - float rotOrn[4] ={0,0,0,1}; - - - float color[4] = {1,1,1,1}; - int index=0; - - - - - - - - float cubeScaling[4] = {1,1,1,1}; - { - int numVertices = sizeof(cube_vertices)/strideInBytes; - int numIndices = sizeof(cube_indices)/sizeof(int); - cubeShapeIndex = renderer.registerShape(&cube_vertices[0],numVertices,cube_indices,numIndices); - } - - - - - if (1) - for (int i=0;iperformRaycast(&rcb,rayFromLocal,rayToLocal); } - else if(collisionShape->getShapeType()==GIMPACT_SHAPE_PROXYTYPE) - { - btGImpactMeshShape* concaveShape = (btGImpactMeshShape*)collisionShape; - - BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObjectWrap->getCollisionObject(),concaveShape, colObjWorldTransform); - rcb.m_hitFraction = resultCallback.m_closestHitFraction; - concaveShape->processAllTrianglesRay(&rcb,rayFromLocal,rayToLocal); - }else + else { //generic (slower) case btConcaveShape* concaveShape = (btConcaveShape*)collisionShape; diff --git a/src/BulletDynamics/Dynamics/Bullet-C-API.cpp b/src/BulletDynamics/Dynamics/Bullet-C-API.cpp deleted file mode 100644 index bd8e27483..000000000 --- a/src/BulletDynamics/Dynamics/Bullet-C-API.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -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. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -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. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -/* - Draft high-level generic physics C-API. For low-level access, use the physics SDK native API's. - Work in progress, functionality will be added on demand. - - If possible, use the richer Bullet C++ API, by including -*/ - -#include "Bullet-C-Api.h" -#include "btBulletDynamicsCommon.h" -#include "LinearMath/btAlignedAllocator.h" - - - -#include "LinearMath/btVector3.h" -#include "LinearMath/btScalar.h" -#include "LinearMath/btMatrix3x3.h" -#include "LinearMath/btTransform.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "BulletCollision/CollisionShapes/btTriangleShape.h" - -#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" -#include "BulletCollision/NarrowPhaseCollision/btPointCollector.h" -#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" -#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" -#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" -#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h" -#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" -#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" - - -/* - Create and Delete a Physics SDK -*/ - -struct btPhysicsSdk -{ - -// btDispatcher* m_dispatcher; -// btOverlappingPairCache* m_pairCache; -// btConstraintSolver* m_constraintSolver - - btVector3 m_worldAabbMin; - btVector3 m_worldAabbMax; - - - //todo: version, hardware/optimization settings etc? - btPhysicsSdk() - :m_worldAabbMin(-1000,-1000,-1000), - m_worldAabbMax(1000,1000,1000) - { - - } - - -}; - -plPhysicsSdkHandle plNewBulletSdk() -{ - void* mem = btAlignedAlloc(sizeof(btPhysicsSdk),16); - return (plPhysicsSdkHandle)new (mem)btPhysicsSdk; -} - -void plDeletePhysicsSdk(plPhysicsSdkHandle physicsSdk) -{ - btPhysicsSdk* phys = reinterpret_cast(physicsSdk); - btAlignedFree(phys); -} - - -/* Dynamics World */ -plDynamicsWorldHandle plCreateDynamicsWorld(plPhysicsSdkHandle physicsSdkHandle) -{ - btPhysicsSdk* physicsSdk = reinterpret_cast(physicsSdkHandle); - void* mem = btAlignedAlloc(sizeof(btDefaultCollisionConfiguration),16); - btDefaultCollisionConfiguration* collisionConfiguration = new (mem)btDefaultCollisionConfiguration(); - mem = btAlignedAlloc(sizeof(btCollisionDispatcher),16); - btDispatcher* dispatcher = new (mem)btCollisionDispatcher(collisionConfiguration); - mem = btAlignedAlloc(sizeof(btAxisSweep3),16); - btBroadphaseInterface* pairCache = new (mem)btAxisSweep3(physicsSdk->m_worldAabbMin,physicsSdk->m_worldAabbMax); - mem = btAlignedAlloc(sizeof(btSequentialImpulseConstraintSolver),16); - btConstraintSolver* constraintSolver = new(mem) btSequentialImpulseConstraintSolver(); - - mem = btAlignedAlloc(sizeof(btDiscreteDynamicsWorld),16); - return (plDynamicsWorldHandle) new (mem)btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration); -} -void plDeleteDynamicsWorld(plDynamicsWorldHandle world) -{ - //todo: also clean up the other allocations, axisSweep, pairCache,dispatcher,constraintSolver,collisionConfiguration - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - btAlignedFree(dynamicsWorld); -} - -void plStepSimulation(plDynamicsWorldHandle world, plReal timeStep) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - btAssert(dynamicsWorld); - dynamicsWorld->stepSimulation(timeStep); -} - -void plAddRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - btAssert(dynamicsWorld); - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - - dynamicsWorld->addRigidBody(body); -} - -void plRemoveRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) -{ - btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); - btAssert(dynamicsWorld); - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - - dynamicsWorld->removeRigidBody(body); -} - -/* Rigid Body */ - -plRigidBodyHandle plCreateRigidBody( void* user_data, float mass, plCollisionShapeHandle cshape ) -{ - btTransform trans; - trans.setIdentity(); - btVector3 localInertia(0,0,0); - btCollisionShape* shape = reinterpret_cast( cshape); - btAssert(shape); - if (mass) - { - shape->calculateLocalInertia(mass,localInertia); - } - void* mem = btAlignedAlloc(sizeof(btRigidBody),16); - btRigidBody::btRigidBodyConstructionInfo rbci(mass, 0,shape,localInertia); - btRigidBody* body = new (mem)btRigidBody(rbci); - body->setWorldTransform(trans); - body->setUserPointer(user_data); - return (plRigidBodyHandle) body; -} - -void plDeleteRigidBody(plRigidBodyHandle cbody) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(cbody); - btAssert(body); - btAlignedFree( body); -} - - -/* Collision Shape definition */ - -plCollisionShapeHandle plNewSphereShape(plReal radius) -{ - void* mem = btAlignedAlloc(sizeof(btSphereShape),16); - return (plCollisionShapeHandle) new (mem)btSphereShape(radius); - -} - -plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z) -{ - void* mem = btAlignedAlloc(sizeof(btBoxShape),16); - return (plCollisionShapeHandle) new (mem)btBoxShape(btVector3(x,y,z)); -} - -plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height) -{ - //capsule is convex hull of 2 spheres, so use btMultiSphereShape - - const int numSpheres = 2; - btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)}; - btScalar radi[numSpheres] = {radius,radius}; - void* mem = btAlignedAlloc(sizeof(btMultiSphereShape),16); - return (plCollisionShapeHandle) new (mem)btMultiSphereShape(positions,radi,numSpheres); -} -plCollisionShapeHandle plNewConeShape(plReal radius, plReal height) -{ - void* mem = btAlignedAlloc(sizeof(btConeShape),16); - return (plCollisionShapeHandle) new (mem)btConeShape(radius,height); -} - -plCollisionShapeHandle plNewCylinderShape(plReal radius, plReal height) -{ - void* mem = btAlignedAlloc(sizeof(btCylinderShape),16); - return (plCollisionShapeHandle) new (mem)btCylinderShape(btVector3(radius,height,radius)); -} - -/* Convex Meshes */ -plCollisionShapeHandle plNewConvexHullShape() -{ - void* mem = btAlignedAlloc(sizeof(btConvexHullShape),16); - return (plCollisionShapeHandle) new (mem)btConvexHullShape(); -} - - -/* Concave static triangle meshes */ -plMeshInterfaceHandle plNewMeshInterface() -{ - return 0; -} - -plCollisionShapeHandle plNewCompoundShape() -{ - void* mem = btAlignedAlloc(sizeof(btCompoundShape),16); - return (plCollisionShapeHandle) new (mem)btCompoundShape(); -} - -void plAddChildShape(plCollisionShapeHandle compoundShapeHandle,plCollisionShapeHandle childShapeHandle, plVector3 childPos,plQuaternion childOrn) -{ - btCollisionShape* colShape = reinterpret_cast(compoundShapeHandle); - btAssert(colShape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE); - btCompoundShape* compoundShape = reinterpret_cast(colShape); - btCollisionShape* childShape = reinterpret_cast(childShapeHandle); - btTransform localTrans; - localTrans.setIdentity(); - localTrans.setOrigin(btVector3(childPos[0],childPos[1],childPos[2])); - localTrans.setRotation(btQuaternion(childOrn[0],childOrn[1],childOrn[2],childOrn[3])); - compoundShape->addChildShape(localTrans,childShape); -} - -void plSetEuler(plReal yaw,plReal pitch,plReal roll, plQuaternion orient) -{ - btQuaternion orn; - orn.setEuler(yaw,pitch,roll); - orient[0] = orn.getX(); - orient[1] = orn.getY(); - orient[2] = orn.getZ(); - orient[3] = orn.getW(); - -} - - -// extern void plAddTriangle(plMeshInterfaceHandle meshHandle, plVector3 v0,plVector3 v1,plVector3 v2); -// extern plCollisionShapeHandle plNewStaticTriangleMeshShape(plMeshInterfaceHandle); - - -void plAddVertex(plCollisionShapeHandle cshape, plReal x,plReal y,plReal z) -{ - btCollisionShape* colShape = reinterpret_cast( cshape); - (void)colShape; - btAssert(colShape->getShapeType()==CONVEX_HULL_SHAPE_PROXYTYPE); - btConvexHullShape* convexHullShape = reinterpret_cast( cshape); - convexHullShape->addPoint(btVector3(x,y,z)); - -} - -void plDeleteShape(plCollisionShapeHandle cshape) -{ - btCollisionShape* shape = reinterpret_cast( cshape); - btAssert(shape); - btAlignedFree(shape); -} -void plSetScaling(plCollisionShapeHandle cshape, plVector3 cscaling) -{ - btCollisionShape* shape = reinterpret_cast( cshape); - btAssert(shape); - btVector3 scaling(cscaling[0],cscaling[1],cscaling[2]); - shape->setLocalScaling(scaling); -} - - - -void plSetPosition(plRigidBodyHandle object, const plVector3 position) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - btVector3 pos(position[0],position[1],position[2]); - btTransform worldTrans = body->getWorldTransform(); - worldTrans.setOrigin(pos); - body->setWorldTransform(worldTrans); -} - -void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - btQuaternion orn(orientation[0],orientation[1],orientation[2],orientation[3]); - btTransform worldTrans = body->getWorldTransform(); - worldTrans.setRotation(orn); - body->setWorldTransform(worldTrans); -} - -void plSetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - btTransform& worldTrans = body->getWorldTransform(); - worldTrans.setFromOpenGLMatrix(matrix); -} - -void plGetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - body->getWorldTransform().getOpenGLMatrix(matrix); - -} - -void plGetPosition(plRigidBodyHandle object,plVector3 position) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - const btVector3& pos = body->getWorldTransform().getOrigin(); - position[0] = pos.getX(); - position[1] = pos.getY(); - position[2] = pos.getZ(); -} - -void plGetOrientation(plRigidBodyHandle object,plQuaternion orientation) -{ - btRigidBody* body = reinterpret_cast< btRigidBody* >(object); - btAssert(body); - const btQuaternion& orn = body->getWorldTransform().getRotation(); - orientation[0] = orn.getX(); - orientation[1] = orn.getY(); - orientation[2] = orn.getZ(); - orientation[3] = orn.getW(); -} - - - -//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); - -// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); - -double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float q2[3], float q3[3], float *pa, float *pb, float normal[3]) -{ - btVector3 vp(p1[0], p1[1], p1[2]); - btTriangleShape trishapeA(vp, - btVector3(p2[0], p2[1], p2[2]), - btVector3(p3[0], p3[1], p3[2])); - trishapeA.setMargin(0.000001f); - btVector3 vq(q1[0], q1[1], q1[2]); - btTriangleShape trishapeB(vq, - btVector3(q2[0], q2[1], q2[2]), - btVector3(q3[0], q3[1], q3[2])); - trishapeB.setMargin(0.000001f); - - // btVoronoiSimplexSolver sGjkSimplexSolver; - // btGjkEpaPenetrationDepthSolver penSolverPtr; - - static btSimplexSolverInterface sGjkSimplexSolver; - sGjkSimplexSolver.reset(); - - static btGjkEpaPenetrationDepthSolver Solver0; - static btMinkowskiPenetrationDepthSolver Solver1; - - btConvexPenetrationDepthSolver* Solver = NULL; - - Solver = &Solver1; - - btGjkPairDetector convexConvex(&trishapeA ,&trishapeB,&sGjkSimplexSolver,Solver); - - convexConvex.m_catchDegeneracies = 1; - - // btGjkPairDetector convexConvex(&trishapeA ,&trishapeB,&sGjkSimplexSolver,0); - - btPointCollector gjkOutput; - btGjkPairDetector::ClosestPointInput input; - - - btTransform tr; - tr.setIdentity(); - - input.m_transformA = tr; - input.m_transformB = tr; - - convexConvex.getClosestPoints(input, gjkOutput, 0); - - - if (gjkOutput.m_hasResult) - { - - pb[0] = pa[0] = gjkOutput.m_pointInWorld[0]; - pb[1] = pa[1] = gjkOutput.m_pointInWorld[1]; - pb[2] = pa[2] = gjkOutput.m_pointInWorld[2]; - - pb[0]+= gjkOutput.m_normalOnBInWorld[0] * gjkOutput.m_distance; - pb[1]+= gjkOutput.m_normalOnBInWorld[1] * gjkOutput.m_distance; - pb[2]+= gjkOutput.m_normalOnBInWorld[2] * gjkOutput.m_distance; - - normal[0] = gjkOutput.m_normalOnBInWorld[0]; - normal[1] = gjkOutput.m_normalOnBInWorld[1]; - normal[2] = gjkOutput.m_normalOnBInWorld[2]; - - return gjkOutput.m_distance; - } - return -1.0f; -} -