diff options
author | erwincoumans <erwin.coumans@gmail.com> | 2016-10-15 10:49:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-15 10:49:53 -0700 |
commit | e744890f106fb7c8b2af10121942cd671b001f6d (patch) | |
tree | 5ca7b2d0cdb13c06a4e90543116acc880b57513e | |
parent | 4ebc3271511161ee0e504ca7e0e66e01454a66dd (diff) | |
parent | da4098166e387999e6946301d4a8b5e456c46223 (diff) | |
download | bullet3-e744890f106fb7c8b2af10121942cd671b001f6d.tar.gz |
Merge pull request #835 from erwincoumans/master2.85.1
don't use GL_LINEAR_MIPMAP_LINEAR for shadow maps, compile issue, VR tiny UI work-in-progress
23 files changed, 616 insertions, 83 deletions
diff --git a/examples/BasicDemo/BasicExample.cpp b/examples/BasicDemo/BasicExample.cpp index b687c35b1..dac3008f0 100644 --- a/examples/BasicDemo/BasicExample.cpp +++ b/examples/BasicDemo/BasicExample.cpp @@ -14,7 +14,6 @@ subject to the following restrictions: */ - #include "BasicExample.h" #include "btBulletDynamicsCommon.h" diff --git a/examples/CommonInterfaces/CommonRigidBodyBase.h b/examples/CommonInterfaces/CommonRigidBodyBase.h index c13f9519d..07175ca25 100644 --- a/examples/CommonInterfaces/CommonRigidBodyBase.h +++ b/examples/CommonInterfaces/CommonRigidBodyBase.h @@ -446,9 +446,15 @@ struct CommonRigidBodyBase : public CommonExampleInterface virtual void renderScene() { - m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); + { + + m_guiHelper->syncPhysicsToGraphics(m_dynamicsWorld); + } - m_guiHelper->render(m_dynamicsWorld); + { + + m_guiHelper->render(m_dynamicsWorld); + } } }; diff --git a/examples/ExampleBrowser/CMakeLists.txt b/examples/ExampleBrowser/CMakeLists.txt index 32f4c18f6..39b8c043f 100644 --- a/examples/ExampleBrowser/CMakeLists.txt +++ b/examples/ExampleBrowser/CMakeLists.txt @@ -131,7 +131,7 @@ SET(BulletExampleBrowser_SRCS ../SharedMemory/TinyRendererVisualShapeConverter.h ../SharedMemory/IKTrajectoryHelper.cpp ../SharedMemory/IKTrajectoryHelper.h - ../RenderingExamples/TinyRendererSetup.cpp + ../SharedMemory/PhysicsServer.cpp ../SharedMemory/PhysicsClientSharedMemory.cpp ../SharedMemory/PhysicsClient.cpp @@ -208,10 +208,16 @@ SET(BulletExampleBrowser_SRCS ../MultiThreading/b3PosixThreadSupport.cpp ../MultiThreading/b3Win32ThreadSupport.cpp ../MultiThreading/b3ThreadSupportInterface.cpp + ../RenderingExamples/TinyRendererSetup.cpp ../RenderingExamples/TimeSeriesCanvas.cpp ../RenderingExamples/TimeSeriesCanvas.h ../RenderingExamples/TimeSeriesFontData.cpp ../RenderingExamples/TimeSeriesFontData.h + ../RenderingExamples/DynamicTexturedCubeDemo.cpp + ../RenderingExamples/DynamicTexturedCubeDemo.h + ../RenderingExamples/TinyVRGui.cpp + ../RenderingExamples/TinyVRGui.h + ../RoboticsLearning/GripperGraspExample.cpp ../RoboticsLearning/GripperGraspExample.h ../RoboticsLearning/b3RobotSimAPI.cpp diff --git a/examples/ExampleBrowser/ExampleEntries.cpp b/examples/ExampleBrowser/ExampleEntries.cpp index 0608f0bd1..3310084fc 100644 --- a/examples/ExampleBrowser/ExampleEntries.cpp +++ b/examples/ExampleBrowser/ExampleEntries.cpp @@ -6,7 +6,7 @@ #include "../RenderingExamples/CoordinateSystemDemo.h" #include "../RenderingExamples/RaytracerSetup.h" #include "../RenderingExamples/TinyRendererSetup.h" - +#include "../RenderingExamples/DynamicTexturedCubeDemo.h" #include "../ForkLift/ForkLiftDemo.h" #include "../BasicDemo/BasicExample.h" #include "../Planar2D/Planar2D.h" @@ -290,6 +290,9 @@ static ExampleEntry gDefaultExamples[]= ExampleEntry(1,"CoordinateSystemDemo","Show the axis and positive rotation direction around the axis.", CoordinateSystemCreateFunc), ExampleEntry(1,"Time Series", "Render some value(s) in a 2D graph window, shifting to the left", TimeSeriesCreateFunc), ExampleEntry(1,"TinyRenderer", "Very small software renderer.", TinyRendererCreateFunc), + ExampleEntry(1,"Dynamic Texture", "Dynamic updated textured applied to a cube.", DynamicTexturedCubeDemoCreateFunc), + + //Extended Tutorials Added by Mobeen ExampleEntry(0,"Extended Tutorials"), diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp index f75ae91c6..e9f09b692 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp @@ -1087,7 +1087,7 @@ bool OpenGLExampleBrowser::requestedExit() void OpenGLExampleBrowser::update(float deltaTime) { - + B3_PROFILE("OpenGLExampleBrowser::update"); assert(glGetError()==GL_NO_ERROR); s_instancingRenderer->init(); DrawGridData dg; @@ -1139,9 +1139,11 @@ void OpenGLExampleBrowser::update(float deltaTime) singleStepSimulation = false; //printf("---------------------------------------------------\n"); //printf("Framecount = %d\n",frameCount); - + B3_PROFILE("sCurrentDemo->stepSimulation"); + if (gFixedTimeStep>0) { + sCurrentDemo->stepSimulation(gFixedTimeStep); } else { @@ -1167,7 +1169,7 @@ void OpenGLExampleBrowser::update(float deltaTime) sCurrentDemo->renderScene(); } { - + B3_PROFILE("physicsDebugDraw"); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); sCurrentDemo->physicsDebugDraw(gDebugDrawFlags); } @@ -1179,6 +1181,7 @@ void OpenGLExampleBrowser::update(float deltaTime) if (gui2 && s_guiHelper && s_guiHelper->getRenderInterface() && s_guiHelper->getRenderInterface()->getActiveCamera()) { + B3_PROFILE("setStatusBarMessage"); char msg[1024]; float camDist = s_guiHelper->getRenderInterface()->getActiveCamera()->getCameraDistance(); float pitch = s_guiHelper->getRenderInterface()->getActiveCamera()->getCameraPitch(); @@ -1194,6 +1197,7 @@ void OpenGLExampleBrowser::update(float deltaTime) static int toggle = 1; if (renderGui) { + B3_PROFILE("renderGui"); // if (!pauseSimulation) // processProfileData(s_profWindow,false); @@ -1202,7 +1206,7 @@ void OpenGLExampleBrowser::update(float deltaTime) saveOpenGLState(s_instancingRenderer->getScreenWidth(), s_instancingRenderer->getScreenHeight()); } - BT_PROFILE("Draw Gwen GUI"); + if (m_internalData->m_gui) { m_internalData->m_gui->draw(s_instancingRenderer->getScreenWidth(), s_instancingRenderer->getScreenHeight()); @@ -1237,6 +1241,7 @@ void OpenGLExampleBrowser::update(float deltaTime) if (gui2) { + B3_PROFILE("forceUpdateScrollBars"); gui2->forceUpdateScrollBars(); } diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.cpp b/examples/ExampleBrowser/OpenGLGuiHelper.cpp index ff499f0be..4a4277b2d 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.cpp +++ b/examples/ExampleBrowser/OpenGLGuiHelper.cpp @@ -289,18 +289,25 @@ void OpenGLGuiHelper::syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWor return; int numCollisionObjects = rbWorld->getNumCollisionObjects(); - for (int i = 0; i<numCollisionObjects; i++) { - btCollisionObject* colObj = rbWorld->getCollisionObjectArray()[i]; - btVector3 pos = colObj->getWorldTransform().getOrigin(); - btQuaternion orn = colObj->getWorldTransform().getRotation(); - int index = colObj->getUserIndex(); - if (index >= 0) + B3_PROFILE("write all InstanceTransformToCPU"); + for (int i = 0; i<numCollisionObjects; i++) { - m_data->m_glApp->m_renderer->writeSingleInstanceTransformToCPU(pos, orn, index); + B3_PROFILE("writeSingleInstanceTransformToCPU"); + btCollisionObject* colObj = rbWorld->getCollisionObjectArray()[i]; + btVector3 pos = colObj->getWorldTransform().getOrigin(); + btQuaternion orn = colObj->getWorldTransform().getRotation(); + int index = colObj->getUserIndex(); + if (index >= 0) + { + m_data->m_glApp->m_renderer->writeSingleInstanceTransformToCPU(pos, orn, index); + } } } - m_data->m_glApp->m_renderer->writeTransforms(); + { + B3_PROFILE("writeTransforms"); + m_data->m_glApp->m_renderer->writeTransforms(); + } } diff --git a/examples/ExampleBrowser/premake4.lua b/examples/ExampleBrowser/premake4.lua index 5bd7eec42..e5cc37dce 100644 --- a/examples/ExampleBrowser/premake4.lua +++ b/examples/ExampleBrowser/premake4.lua @@ -54,7 +54,6 @@ project "App_BulletExampleBrowser" "../TinyRenderer/tgaimage.cpp", "../TinyRenderer/our_gl.cpp", "../TinyRenderer/TinyRenderer.cpp", - "../RenderingExamples/TinyRendererSetup.cpp", "../SharedMemory/IKTrajectoryHelper.cpp", "../SharedMemory/IKTrajectoryHelper.h", "../SharedMemory/PhysicsClientC_API.cpp", diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp index 8ca3f6dc8..718a9fc60 100644 --- a/examples/OpenGLWindow/GLInstancingRenderer.cpp +++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp @@ -413,17 +413,32 @@ void GLInstancingRenderer::writeSingleInstanceTransformToGPU(float* position, fl void GLInstancingRenderer::writeTransforms() { - b3Assert(glGetError() ==GL_NO_ERROR); - + { + B3_PROFILE("b3Assert(glGetError() 1"); + b3Assert(glGetError() ==GL_NO_ERROR); + } + { + B3_PROFILE("glBindBuffer"); + glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); + } - glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); - //glFlush(); + { + B3_PROFILE("glFlush()"); + //without the flush, the glBufferSubData can spike to really slow (seconds slow) + glFlush(); + } - b3Assert(glGetError() ==GL_NO_ERROR); + { + B3_PROFILE("b3Assert(glGetError() 2"); + b3Assert(glGetError() ==GL_NO_ERROR); + } #ifdef B3_DEBUG { + + //B3_PROFILE("m_data->m_totalNumInstances == totalNumInstances"); + int totalNumInstances= 0; for (int k=0;k<m_graphicsInstances.size();k++) { @@ -440,14 +455,29 @@ void GLInstancingRenderer::writeTransforms() // int SCALE_BUFFER_SIZE = (totalNumInstances*sizeof(float)*3); #if 1 + { + // printf("m_data->m_totalNumInstances = %d\n", m_data->m_totalNumInstances); + { + B3_PROFILE("glBufferSubData pos"); glBufferSubData( GL_ARRAY_BUFFER,m_data->m_maxShapeCapacityInBytes,m_data->m_totalNumInstances*sizeof(float)*4, &m_data->m_instance_positions_ptr[0]); + } + { + B3_PROFILE("glBufferSubData orn"); glBufferSubData( GL_ARRAY_BUFFER,m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE,m_data->m_totalNumInstances*sizeof(float)*4, &m_data->m_instance_quaternion_ptr[0]); + } + { + B3_PROFILE("glBufferSubData color"); glBufferSubData( GL_ARRAY_BUFFER,m_data->m_maxShapeCapacityInBytes+ POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE, m_data->m_totalNumInstances*sizeof(float)*4, &m_data->m_instance_colors_ptr[0]); + } + { + B3_PROFILE("glBufferSubData scale"); glBufferSubData( GL_ARRAY_BUFFER, m_data->m_maxShapeCapacityInBytes+POSITION_BUFFER_SIZE+ORIENTATION_BUFFER_SIZE+COLOR_BUFFER_SIZE,m_data->m_totalNumInstances*sizeof(float)*3, &m_data->m_instance_scale_ptr[0]); + } + } #else char* orgBase = (char*)glMapBuffer( GL_ARRAY_BUFFER,GL_READ_WRITE); @@ -517,9 +547,15 @@ void GLInstancingRenderer::writeTransforms() #endif - glBindBuffer(GL_ARRAY_BUFFER, 0);//m_data->m_vbo); + { + B3_PROFILE("glBindBuffer 2"); + glBindBuffer(GL_ARRAY_BUFFER, 0);//m_data->m_vbo); + } - b3Assert(glGetError() ==GL_NO_ERROR); + { + B3_PROFILE("b3Assert(glGetError() 4"); + b3Assert(glGetError() ==GL_NO_ERROR); + } } @@ -686,9 +722,13 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, glBindBuffer(GL_ARRAY_BUFFER, m_data->m_vbo); - char* dest= (char*)glMapBuffer( GL_ARRAY_BUFFER,GL_WRITE_ONLY);//GL_WRITE_ONLY int vertexStrideInBytes = 9*sizeof(float); int sz = numvertices*vertexStrideInBytes; +#if 0 + + char* dest= (char*)glMapBuffer( GL_ARRAY_BUFFER,GL_WRITE_ONLY);//GL_WRITE_ONLY + + #ifdef B3_DEBUG int totalUsed = vertexStrideInBytes*gfxObj->m_vertexArrayOffset+sz; b3Assert(totalUsed<m_data->m_maxShapeCapacityInBytes); @@ -696,6 +736,10 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, memcpy(dest+vertexStrideInBytes*gfxObj->m_vertexArrayOffset,vertices,sz); glUnmapBuffer( GL_ARRAY_BUFFER); +#else + glBufferSubData( GL_ARRAY_BUFFER,vertexStrideInBytes*gfxObj->m_vertexArrayOffset,sz, + vertices); +#endif glGenBuffers(1, &gfxObj->m_index_vbo); @@ -1465,7 +1509,7 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode) #endif//OLD_SHADOWMAP_INIT glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl index 0902c5149..094ae7640 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl @@ -36,11 +36,9 @@ void main(void) //float bias = 0.005f; - float bias = 0.0001*tan(acos(intensity)); - bias = clamp(bias, 0,0.01); - + - float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z-bias)/ShadowCoord.w)); + float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w)); intensity = 0.7*intensity + 0.3*intensity*visibility; diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h index a9d53adb5..f7f2a6a11 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h @@ -30,9 +30,8 @@ static const char* useShadowMapInstancingFragmentShader= \ " \n" " //float bias = 0.005f;\n" " \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" +" float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w));\n" " \n" " intensity = 0.7*intensity + 0.3*intensity*visibility;\n" " \n" diff --git a/examples/OpenGLWindow/SimpleOpenGL3App.cpp b/examples/OpenGLWindow/SimpleOpenGL3App.cpp index f94465655..6abcd2185 100644 --- a/examples/OpenGLWindow/SimpleOpenGL3App.cpp +++ b/examples/OpenGLWindow/SimpleOpenGL3App.cpp @@ -173,6 +173,7 @@ SimpleOpenGL3App::SimpleOpenGL3App( const char* title, int width,int height, boo b3Assert(glGetError() ==GL_NO_ERROR); m_instancingRenderer = new GLInstancingRenderer(128*1024,128*1024*1024); + m_primRenderer = new GLPrimitiveRenderer(width,height); m_renderer = m_instancingRenderer ; diff --git a/examples/RenderingExamples/DynamicTexturedCubeDemo.cpp b/examples/RenderingExamples/DynamicTexturedCubeDemo.cpp new file mode 100644 index 000000000..1316663d0 --- /dev/null +++ b/examples/RenderingExamples/DynamicTexturedCubeDemo.cpp @@ -0,0 +1,152 @@ + +#include "DynamicTexturedCubeDemo.h" +#include "Bullet3Common/b3Logging.h" +#include "../CommonInterfaces/CommonGraphicsAppInterface.h" +#include "Bullet3Common/b3Quaternion.h" +#include "Bullet3Common/b3AlignedObjectArray.h" +#include "../CommonInterfaces/CommonRenderInterface.h" +#include "../CommonInterfaces/CommonExampleInterface.h" +#include "../CommonInterfaces/CommonGUIHelperInterface.h" +#include "GwenGUISupport/GraphingTexture.h" + +#include "../CommonInterfaces/Common2dCanvasInterface.h" +#include "../RenderingExamples/TimeSeriesCanvas.h" +#include "../RenderingExamples/TimeSeriesFontData.h" +#include "../Importers/ImportMeshUtility/b3ImportMeshUtility.h" +#include "../OpenGLWindow/GLInstanceGraphicsShape.h" +#include "TinyVRGui.h" +#include "../CommonInterfaces/CommonParameterInterface.h" + +class DynamicTexturedCubeDemo : public CommonExampleInterface +{ + CommonGraphicsApp* m_app; + float m_x; + float m_y; + float m_z; + b3AlignedObjectArray<int> m_movingInstances; + + + TinyVRGui* m_tinyVrGUI; + + enum + { + numCubesX = 1, + numCubesY = 1 + }; +public: + + DynamicTexturedCubeDemo(CommonGraphicsApp* app) + :m_app(app), + m_x(0), + m_y(0), + m_z(0), + m_tinyVrGUI(0) + { + m_app->setUpAxis(2); + + { + b3Vector3 extents=b3MakeVector3(100,100,100); + extents[m_app->getUpAxis()]=1; + + int xres = 20; + int yres = 20; + + b3Vector4 color0=b3MakeVector4(0.1, 0.1, 0.5,1); + b3Vector4 color1=b3MakeVector4(0.6, 0.6, 0.6,1); + m_app->registerGrid(xres, yres, color0, color1); + } + + ComboBoxParams comboParams; + comboParams.m_comboboxId = 0; + comboParams.m_numItems = 0; + comboParams.m_startItem = 0; + comboParams.m_callback = 0;//MyComboBoxCallback; + comboParams.m_userPointer = 0;//this; + + + m_tinyVrGUI = new TinyVRGui(comboParams,m_app->m_renderer); + m_tinyVrGUI->init(); + + m_app->m_renderer->writeTransforms(); + } + virtual ~DynamicTexturedCubeDemo() + { + delete m_tinyVrGUI; + m_app->m_renderer->enableBlend(false); + } + + + virtual void physicsDebugDraw(int debugDrawMode) + { + + } + virtual void initPhysics() + { + } + virtual void exitPhysics() + { + + } + + virtual void stepSimulation(float deltaTime) + { + static b3Transform tr = b3Transform::getIdentity(); + static b3Scalar t = 0.f; + t+=deltaTime; + tr.setOrigin(b3MakeVector3(0.,0.,2.)+b3MakeVector3(0.,0.,0.02*b3Sin(t))); + + m_tinyVrGUI->tick(deltaTime,tr); + + m_app->m_renderer->writeTransforms(); + + } + virtual void renderScene() + { + + m_app->m_renderer->renderScene(); + } + + + virtual void physicsDebugDraw() + { + + } + virtual bool mouseMoveCallback(float x,float y) + { + return false; + } + virtual bool mouseButtonCallback(int button, int state, float x, float y) + { + return false; + } + virtual bool keyboardCallback(int key, int state) + { + return false; + } + + virtual void resetCamera() + { + float dist = 1.15; + float pitch = 396; + float yaw = 33.7; + float targetPos[3]={-0.5,0.7,1.45}; + if (m_app->m_renderer && m_app->m_renderer->getActiveCamera()) + { + m_app->m_renderer->getActiveCamera()->setCameraDistance(dist); + m_app->m_renderer->getActiveCamera()->setCameraPitch(pitch); + m_app->m_renderer->getActiveCamera()->setCameraYaw(yaw); + m_app->m_renderer->getActiveCamera()->setCameraTargetPosition(targetPos[0],targetPos[1],targetPos[2]); + } + } + +}; + + +class CommonExampleInterface* DynamicTexturedCubeDemoCreateFunc(struct CommonExampleOptions& options) +{ + return new DynamicTexturedCubeDemo(options.m_guiHelper->getAppInterface()); +} + + + + diff --git a/examples/RenderingExamples/DynamicTexturedCubeDemo.h b/examples/RenderingExamples/DynamicTexturedCubeDemo.h new file mode 100644 index 000000000..a00185b2d --- /dev/null +++ b/examples/RenderingExamples/DynamicTexturedCubeDemo.h @@ -0,0 +1,6 @@ +#ifndef DYNAMIC_TEXTURED_CUBE_DEMO_H +#define DYNAMIC_TEXTURED_CUBE_DEMO_H + +class CommonExampleInterface* DynamicTexturedCubeDemoCreateFunc(struct CommonExampleOptions& options); + +#endif //DYNAMIC_TEXTURED_CUBE_DEMO_H diff --git a/examples/RenderingExamples/TimeSeriesCanvas.cpp b/examples/RenderingExamples/TimeSeriesCanvas.cpp index 31bc28c23..bfd2e9dfd 100644 --- a/examples/RenderingExamples/TimeSeriesCanvas.cpp +++ b/examples/RenderingExamples/TimeSeriesCanvas.cpp @@ -104,7 +104,7 @@ void TimeSeriesCanvas::addDataSource(const char* dataSourceLabel, unsigned char m_internalData->m_dataSources.push_back(dataSource); } -void TimeSeriesCanvas::setupTimeSeries(float yScale, int ticksPerSecond, int startTime) +void TimeSeriesCanvas::setupTimeSeries(float yScale, int ticksPerSecond, int startTime, bool clearCanvas) { if (0==m_internalData->m_canvasInterface) return; @@ -113,20 +113,23 @@ void TimeSeriesCanvas::setupTimeSeries(float yScale, int ticksPerSecond, int sta m_internalData->m_ticksPerSecond = ticksPerSecond; m_internalData->m_yScale = yScale; m_internalData->m_dataSources.clear(); - for (int i=0;i<m_internalData->m_width;i++) + + if (clearCanvas) { - for (int j=0;j<m_internalData->m_height;j++) + for (int i=0;i<m_internalData->m_width;i++) { + for (int j=0;j<m_internalData->m_height;j++) + { - m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,i,j, - m_internalData->m_backgroundRed, - m_internalData->m_backgroundGreen, - m_internalData->m_backgroundBlue, - m_internalData->m_backgroundAlpha); + m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,i,j, + m_internalData->m_backgroundRed, + m_internalData->m_backgroundGreen, + m_internalData->m_backgroundBlue, + m_internalData->m_backgroundAlpha); + } } } - float zeroPixelCoord = m_internalData->m_zero; float pixelsPerUnit = m_internalData->m_pixelsPerUnit; @@ -207,7 +210,7 @@ void TimeSeriesCanvas::shift1PixelToLeft() int countdown = resetVal; //shift pixture one pixel to the left - for (int j=0;j<m_internalData->m_height-48;j++) + for (int j=50;j<m_internalData->m_height-48;j++) { for (int i=40;i<this->m_internalData->m_width;i++) { diff --git a/examples/RenderingExamples/TimeSeriesCanvas.h b/examples/RenderingExamples/TimeSeriesCanvas.h index 3a4269295..41f466279 100644 --- a/examples/RenderingExamples/TimeSeriesCanvas.h +++ b/examples/RenderingExamples/TimeSeriesCanvas.h @@ -6,17 +6,17 @@ class TimeSeriesCanvas protected: struct TimeSeriesInternalData* m_internalData; void shift1PixelToLeft(); - void grapicalPrintf(const char* str, void* fontData, int rasterposx,int rasterposy,unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); - + public: TimeSeriesCanvas(struct Common2dCanvasInterface* canvasInterface, int width, int height, const char* windowTitle); virtual ~TimeSeriesCanvas(); - void setupTimeSeries(float yScale, int ticksPerSecond, int startTime); + void setupTimeSeries(float yScale, int ticksPerSecond, int startTime, bool clearCanvas=true); void addDataSource(const char* dataSourceLabel, unsigned char red,unsigned char green,unsigned char blue); void insertDataAtCurrentTime(float value, int dataSourceIndex, bool connectToPrevious); float getCurrentTime() const; + void grapicalPrintf(const char* str, void* fontData, int rasterposx,int rasterposy,unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); virtual void nextTick(); diff --git a/examples/RenderingExamples/TinyVRGui.cpp b/examples/RenderingExamples/TinyVRGui.cpp new file mode 100644 index 000000000..3dfcc0e3d --- /dev/null +++ b/examples/RenderingExamples/TinyVRGui.cpp @@ -0,0 +1,218 @@ +#include "TinyVRGui.h" +#include "../CommonInterfaces/CommonGUIHelperInterface.h" +#include "../ExampleBrowser/GwenGUISupport/GraphingTexture.h" + +#include "../CommonInterfaces/Common2dCanvasInterface.h" +#include "../RenderingExamples/TimeSeriesCanvas.h" +#include "../RenderingExamples/TimeSeriesFontData.h" +#include "../Importers/ImportMeshUtility/b3ImportMeshUtility.h" +#include "../OpenGLWindow/GLInstanceGraphicsShape.h" + +#include "../CommonInterfaces/CommonRenderInterface.h" +#include "../CommonInterfaces/CommonParameterInterface.h" + + +struct TestCanvasInterface2 : public Common2dCanvasInterface +{ + b3AlignedObjectArray<unsigned char>& m_texelsRGB; + int m_width; + int m_height; + + TestCanvasInterface2(b3AlignedObjectArray<unsigned char>& texelsRGB, int width, int height) + :m_width(width), + m_height(height), + m_texelsRGB(texelsRGB) + { + } + + virtual ~TestCanvasInterface2() + {} + virtual int createCanvas(const char* canvasName, int width, int height) + { + return 0; + } + virtual void destroyCanvas(int canvasId) + { + } + virtual void setPixel(int canvasId, int x, int y, unsigned char red, unsigned char green,unsigned char blue, unsigned char alpha) + { + if (x>=0 && x<m_width && y>=0 && y<m_height) + { + m_texelsRGB[(x+y*m_width)*3+0] = red; + m_texelsRGB[(x+y*m_width)*3+1] = green; + m_texelsRGB[(x+y*m_width)*3+2] = blue; + } + } + virtual void getPixel(int canvasId, int x, int y, unsigned char& red, unsigned char& green,unsigned char& blue, unsigned char& alpha) + { + if (x>=0 && x<m_width && y>=0 && y<m_height) + { + red = m_texelsRGB[(x+y*m_width)*3+0]; + green = m_texelsRGB[(x+y*m_width)*3+1]; + blue = m_texelsRGB[(x+y*m_width)*3+2]; + } + } + + virtual void refreshImageData(int canvasId) + { + + } + +}; + + + +struct TinyVRGuiInternalData +{ + CommonRenderInterface* m_renderer; + + b3AlignedObjectArray<unsigned char> m_texelsRGB; + TestCanvasInterface2* m_testCanvas; + TimeSeriesCanvas* m_timeSeries; + int m_src; + int m_textureId; + int m_gfxObjectId; + + TinyVRGuiInternalData() + :m_renderer(0), + m_testCanvas(0), + m_timeSeries(0), + m_src(-1), + m_textureId(-1), + m_gfxObjectId(-1) + { + } +}; + + +TinyVRGui::TinyVRGui(struct ComboBoxParams& params, struct CommonRenderInterface* renderer) +{ + m_data = new TinyVRGuiInternalData; + m_data->m_renderer = renderer; + + +} + +TinyVRGui::~TinyVRGui() +{ + delete m_data->m_timeSeries; + delete m_data->m_testCanvas; + delete m_data; +} + +bool TinyVRGui::init() +{ + { + + + int width = 256; + int height = 256; + m_data->m_texelsRGB.resize(width*height*3); + for (int i=0;i<width;i++) + for (int j=0;j<height;j++) + { + m_data->m_texelsRGB[(i+j*width)*3+0] = 155; + m_data->m_texelsRGB[(i+j*width)*3+1] = 155; + m_data->m_texelsRGB[(i+j*width)*3+2] = 255; + } + + m_data->m_testCanvas = new TestCanvasInterface2(m_data->m_texelsRGB,width,height); + m_data->m_timeSeries = new TimeSeriesCanvas(m_data->m_testCanvas,width,height,"time series"); + + + bool clearCanvas = false; + + m_data->m_timeSeries->setupTimeSeries(3,100, 0,clearCanvas); + m_data->m_timeSeries->addDataSource("Some sine wave", 255,0,0); + m_data->m_timeSeries->addDataSource("Some cosine wave", 0,255,0); + m_data->m_timeSeries->addDataSource("Delta Time (*10)", 0,0,255); + m_data->m_timeSeries->addDataSource("Tan", 255,0,255); + m_data->m_timeSeries->addDataSource("Some cosine wave2", 255,255,0); + m_data->m_timeSeries->addDataSource("Empty source2", 255,0,255); + + m_data->m_textureId = m_data->m_renderer->registerTexture(&m_data->m_texelsRGB[0],width,height); + + { + + const char* fileName = "cube.obj";//"textured_sphere_smooth.obj"; + //fileName = "cube.obj"; + + int shapeId = -1; + + b3ImportMeshData meshData; + if (b3ImportMeshUtility::loadAndRegisterMeshFromFileInternal(fileName, meshData)) + { + + + shapeId = m_data->m_renderer->registerShape(&meshData.m_gfxShape->m_vertices->at(0).xyzw[0], + meshData.m_gfxShape->m_numvertices, + &meshData.m_gfxShape->m_indices->at(0), + meshData.m_gfxShape->m_numIndices, + B3_GL_TRIANGLES, + m_data->m_textureId); + + float position[4]={0,0,2,1}; + float orn[4]={0,0,0,1}; + float color[4]={1,1,1,1}; + float scaling[4]={.1,.1,.1,1}; + + m_data->m_gfxObjectId = m_data->m_renderer->registerGraphicsInstance(shapeId,position,orn,color,scaling); + m_data->m_renderer->writeTransforms(); + + + + meshData.m_gfxShape->m_scaling[0] = scaling[0]; + meshData.m_gfxShape->m_scaling[1] = scaling[1]; + meshData.m_gfxShape->m_scaling[2] = scaling[2]; + + + delete meshData.m_gfxShape; + delete meshData.m_textureImage; + } + + + + } + } + + m_data->m_renderer->writeTransforms(); + return true; +} + + +void TinyVRGui::tick(b3Scalar deltaTime, const b3Transform& guiWorldTransform) +{ + float time = m_data->m_timeSeries->getCurrentTime(); + float v = sinf(time); + m_data->m_timeSeries->insertDataAtCurrentTime(v,0,true); + v = cosf(time); + m_data->m_timeSeries->insertDataAtCurrentTime(v,1,true); + v = tanf(time); + m_data->m_timeSeries->insertDataAtCurrentTime(v,3,true); + m_data->m_timeSeries->insertDataAtCurrentTime(deltaTime*10,2,true); + + m_data->m_timeSeries->nextTick(); + + m_data->m_renderer->updateTexture(m_data->m_textureId,&m_data->m_texelsRGB[0]); + m_data->m_renderer->writeSingleInstanceTransformToCPU(guiWorldTransform.getOrigin(),guiWorldTransform.getRotation(),m_data->m_gfxObjectId); + m_data->m_renderer->writeTransforms(); +} + +void TinyVRGui::clearTextArea() +{ + int width = 256; + int height = 50; + for (int i=0;i<width;i++) + for (int j=0;j<height;j++) + { + m_data->m_texelsRGB[(i+j*width)*3+0] = 155; + m_data->m_texelsRGB[(i+j*width)*3+1] = 155; + m_data->m_texelsRGB[(i+j*width)*3+2] = 255; + } +} + +void TinyVRGui::grapicalPrintf(const char* str,int rasterposx,int rasterposy,unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) +{ + m_data->m_timeSeries->grapicalPrintf(str,sTimeSeriesFontData,rasterposx,rasterposy,red,green,blue,alpha); +} + diff --git a/examples/RenderingExamples/TinyVRGui.h b/examples/RenderingExamples/TinyVRGui.h new file mode 100644 index 000000000..23432e421 --- /dev/null +++ b/examples/RenderingExamples/TinyVRGui.h @@ -0,0 +1,25 @@ + +#ifndef TINY_VR_GUI_H +#define TINY_VR_GUI_H + +#include "Bullet3Common/b3Transform.h" + +class TinyVRGui +{ + struct TinyVRGuiInternalData* m_data; + +public: + + TinyVRGui(struct ComboBoxParams& params, struct CommonRenderInterface* renderer); + virtual ~TinyVRGui(); + + bool init(); + void tick(b3Scalar deltaTime, const b3Transform& guiWorldTransform); + + void clearTextArea(); + void grapicalPrintf(const char* str,int rasterposx,int rasterposy,unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha); + +}; + + +#endif //TINY_VR_GUI_H diff --git a/examples/SharedMemory/PhysicsClientExample.cpp b/examples/SharedMemory/PhysicsClientExample.cpp index 9abacbfc7..95faa3fc7 100644 --- a/examples/SharedMemory/PhysicsClientExample.cpp +++ b/examples/SharedMemory/PhysicsClientExample.cpp @@ -5,6 +5,7 @@ #include "../CommonInterfaces/Common2dCanvasInterface.h" #include "SharedMemoryCommon.h" #include "../CommonInterfaces/CommonParameterInterface.h" + #include "PhysicsClientC_API.h" #include "PhysicsClient.h" //#include "SharedMemoryCommands.h" diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index ee2ff385a..6f2de6b05 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -27,6 +27,7 @@ #include "../CommonInterfaces/CommonGUIHelperInterface.h" #include "SharedMemoryCommands.h" + //@todo(erwincoumans) those globals are hacks for a VR demo, move this to Python/pybullet! btVector3 gLastPickPos(0, 0, 0); bool gCloseToKuka=false; @@ -403,6 +404,8 @@ struct PhysicsServerCommandProcessorInternalData btMultiBody* m_kukaGripperMultiBody; btMultiBodyPoint2Point* m_kukaGripperRevolute1; btMultiBodyPoint2Point* m_kukaGripperRevolute2; + + int m_huskyId; int m_KukaId; int m_sphereId; @@ -457,6 +460,10 @@ struct PhysicsServerCommandProcessorInternalData :m_hasGround(false), m_gripperRigidbodyFixed(0), m_gripperMultiBody(0), + m_kukaGripperFixed(0), + m_kukaGripperMultiBody(0), + m_kukaGripperRevolute1(0), + m_kukaGripperRevolute2(0), m_allowRealTimeSimulation(false), m_huskyId(-1), m_KukaId(-1), @@ -1363,7 +1370,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm ///this is a very rudimentary way to save the state of the world, for scene authoring ///many todo's, for example save the state of motor controllers etc. - if (clientCmd.m_sdfArguments.m_sdfFileName) + { //saveWorld(clientCmd.m_sdfArguments.m_sdfFileName); @@ -3128,6 +3135,7 @@ void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec) gBufferServerToClient.resize(SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE); int bodyId = 0; + if (gCreateObjectSimVR >= 0) { gCreateObjectSimVR = -1; @@ -3317,7 +3325,7 @@ void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec) //loadUrdf("rook.urdf", btVector3(-1.2, 0, 0.7), btQuaternion(btVector3(1, 0, 0), SIMD_HALF_PI), true, false, &bodyId, &gBufferServerToClient[0], gBufferServerToClient.size()); //loadUrdf("knight.urdf", btVector3(-1.2, 0.2, 0.7), btQuaternion(btVector3(1, 0, 0), SIMD_HALF_PI), true, false, &bodyId, &gBufferServerToClient[0], gBufferServerToClient.size()); - loadUrdf("husky/husky.urdf", btVector3(2, -5, 1), btQuaternion(0, 0, 0, 1), true, false, &bodyId, &gBufferServerToClient[0], gBufferServerToClient.size()); + //loadUrdf("husky/husky.urdf", btVector3(2, -5, 1), btQuaternion(0, 0, 0, 1), true, false, &bodyId, &gBufferServerToClient[0], gBufferServerToClient.size()); m_data->m_huskyId = bodyId; m_data->m_dynamicsWorld->setGravity(btVector3(0, 0, -10)); diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index eb35719d1..ef7f1404f 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -12,6 +12,12 @@ #include "Bullet3Common/b3Matrix3x3.h" #include "../Utils/b3Clock.h" #include "../MultiThreading/b3ThreadSupportInterface.h" +#ifdef BT_ENABLE_VR +#include "../RenderingExamples/TinyVRGui.h" +#endif//BT_ENABLE_VR + + +#include "../CommonInterfaces/CommonParameterInterface.h" #define MAX_VR_CONTROLLERS 8 @@ -546,6 +552,10 @@ class PhysicsServerExample : public SharedMemoryCommon bool m_replay; int m_options; +#ifdef BT_ENABLE_VR + TinyVRGui* m_tinyVrGui; +#endif + public: PhysicsServerExample(MultiThreadedOpenGLGuiHelper* helper, SharedMemoryInterface* sharedMem=0, int options=0); @@ -677,6 +687,9 @@ m_wantsShutdown(false), m_isConnected(false), m_replay(false), m_options(options) +#ifdef BT_ENABLE_VR +,m_tinyVrGui(0) +#endif { m_multiThreadedHelper = helper; b3Printf("Started PhysicsServer\n"); @@ -686,6 +699,9 @@ m_options(options) PhysicsServerExample::~PhysicsServerExample() { +#ifdef BT_ENABLE_VR + delete m_tinyVrGui; +#endif bool deInitializeSharedMemory = true; m_physicsServer.disconnectSharedMemory(deInitializeSharedMemory); m_isConnected = false; @@ -942,7 +958,73 @@ extern double gSubStep; void PhysicsServerExample::renderScene() { B3_PROFILE("PhysicsServerExample::RenderScene"); + static char line0[1024]; + static char line1[1024]; + + if (gEnableRealTimeSimVR) + { + + static int frameCount=0; + static btScalar prevTime = m_clock.getTimeSeconds(); + frameCount++; + + static btScalar worseFps = 1000000; + int numFrames = 200; + static int count = 0; + count++; + + if (0 == (count & 1)) + { + btScalar curTime = m_clock.getTimeSeconds(); + btScalar fps = 1. / (curTime - prevTime); + prevTime = curTime; + if (fps < worseFps) + { + worseFps = fps; + } + + if (count > numFrames) + { + count = 0; + sprintf(line0, "fps:%f frame:%d", worseFps, frameCount / 2); + sprintf(line1, "drop:%d tscale:%f dt:%f, substep %f)", gDroppedSimulationSteps, simTimeScalingFactor,gDtInSec, gSubStep); + gDroppedSimulationSteps = 0; + + worseFps = 1000000; + } + } + +#ifdef BT_ENABLE_VR + if (m_tinyVrGui==0) + { + ComboBoxParams comboParams; + comboParams.m_comboboxId = 0; + comboParams.m_numItems = 0; + comboParams.m_startItem = 0; + comboParams.m_callback = 0;//MyComboBoxCallback; + comboParams.m_userPointer = 0;//this; + + m_tinyVrGui = new TinyVRGui(comboParams,this->m_multiThreadedHelper->m_childGuiHelper->getRenderInterface()); + m_tinyVrGui->init(); + } + + if (m_tinyVrGui) + { + b3Transform tr;tr.setIdentity(); + tr.setOrigin(b3MakeVector3(gVRController2Pos[0],gVRController2Pos[1],gVRController2Pos[2])); + tr.setRotation(b3Quaternion(gVRController2Orn[0],gVRController2Orn[1],gVRController2Orn[2],gVRController2Orn[3])); + tr = tr*b3Transform(b3Quaternion(0,0,-SIMD_HALF_PI),b3MakeVector3(0,0,0)); + b3Scalar dt = 0.01; + m_tinyVrGui->clearTextArea(); + + m_tinyVrGui->grapicalPrintf(line0,0,0,0,0,0,255); + m_tinyVrGui->grapicalPrintf(line1,0,16,255,255,255,255); + + m_tinyVrGui->tick(dt,tr); + } +#endif//BT_ENABLE_VR + } ///debug rendering //m_args[0].m_cs->lock(); @@ -993,38 +1075,6 @@ void PhysicsServerExample::renderScene() B3_PROFILE("Draw Debug HUD"); //some little experiment to add text/HUD to a VR camera (HTC Vive/Oculus Rift) - static int frameCount=0; - static btScalar prevTime = m_clock.getTimeSeconds(); - frameCount++; - static char line0[1024]; - static char line1[1024]; - - static btScalar worseFps = 1000000; - int numFrames = 200; - static int count = 0; - count++; - - if (0 == (count & 1)) - { - btScalar curTime = m_clock.getTimeSeconds(); - btScalar fps = 1. / (curTime - prevTime); - prevTime = curTime; - if (fps < worseFps) - { - worseFps = fps; - } - - if (count > numFrames) - { - count = 0; - sprintf(line0, "Graphics FPS (worse) = %f, frame %d", worseFps, frameCount / 2); - - sprintf(line1, "Physics Steps = %d, Drop = %d, time scale=%f, dt %f, Substep %f)", gNumSteps, gDroppedSimulationSteps, simTimeScalingFactor,gDtInSec, gSubStep); - gDroppedSimulationSteps = 0; - - worseFps = 1000000; - } - } float pos[4]; m_guiHelper->getAppInterface()->m_renderer->getActiveCamera()->getCameraTargetPosition(pos); diff --git a/examples/SharedMemory/premake4.lua b/examples/SharedMemory/premake4.lua index 0dd45af08..2215cfbe0 100644 --- a/examples/SharedMemory/premake4.lua +++ b/examples/SharedMemory/premake4.lua @@ -231,6 +231,9 @@ if os.is("Windows") then "../ExampleBrowser/OpenGLGuiHelper.cpp", "../ExampleBrowser/GL_ShapeDrawer.cpp", "../ExampleBrowser/CollisionShape2TriangleMesh.cpp", + "../RenderingExamples/TinyVRGui.cpp", + "../RenderingExamples/TimeSeriesCanvas.cpp", + "../RenderingExamples/TimeSeriesFontData.cpp", "../ThirdPartyLibs/openvr/samples/shared/lodepng.cpp", "../ThirdPartyLibs/openvr/samples/shared/lodepng.h", "../ThirdPartyLibs/openvr/samples/shared/Matrices.cpp", diff --git a/src/BulletDynamics/Featherstone/btMultiBody.cpp b/src/BulletDynamics/Featherstone/btMultiBody.cpp index 8a8a5da77..b85656875 100644 --- a/src/BulletDynamics/Featherstone/btMultiBody.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBody.cpp @@ -28,7 +28,7 @@ #include "btMultiBodyJointFeedback.h"
#include "LinearMath/btTransformUtil.h"
#include "LinearMath/btSerializer.h"
-#include "Bullet3Common/b3Logging.h"
+//#include "Bullet3Common/b3Logging.h"
// #define INCLUDE_GYRO_TERM
///todo: determine if we need these options. If so, make a proper API, otherwise delete those globals
diff --git a/src/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp b/src/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp index a9b929f36..29f8e469c 100644 --- a/src/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp @@ -1118,7 +1118,7 @@ static void applyJointFeedback(btMultiBodyJacobianData& data, const btMultiBodyS } #endif -#include "Bullet3Common/b3Logging.h" + void btMultiBodyConstraintSolver::writeBackSolverBodyToMultiBody(btMultiBodySolverConstraint& c, btScalar deltaTime) { #if 1 |