From 88897cc7442bd41ade167c65fb9d9b13c6a65080 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Fri, 30 Jun 2017 19:11:43 -0700 Subject: [PATCH] implement pybullet.changeTexture. For now, the width/height has to match the target texture unique id, otherwise crashes may happen (a check for width/height match will be added) See also examples\pybullet\examples\changeTexture.py --- data/tex256.png | Bin 0 -> 12089 bytes .../CommonGUIHelperInterface.h | 1 + examples/ExampleBrowser/OpenGLGuiHelper.cpp | 6 ++ examples/ExampleBrowser/OpenGLGuiHelper.h | 1 + .../OpenGLWindow/GLInstancingRenderer.cpp | 43 +++++++--- examples/SharedMemory/PhysicsClientC_API.cpp | 19 +++++ examples/SharedMemory/PhysicsClientC_API.h | 1 + .../PhysicsClientSharedMemory.cpp | 4 +- examples/SharedMemory/PhysicsDirect.cpp | 8 ++ .../PhysicsServerCommandProcessor.cpp | 18 +++++ .../SharedMemory/PhysicsServerExample.cpp | 28 +++++++ examples/SharedMemory/SharedMemoryCommands.h | 7 ++ examples/SharedMemory/SharedMemoryPublic.h | 2 + examples/pybullet/examples/changeTexture.py | 43 ++++++++++ examples/pybullet/pybullet.c | 74 +++++++++++++++++- 15 files changed, 241 insertions(+), 14 deletions(-) create mode 100644 data/tex256.png create mode 100644 examples/pybullet/examples/changeTexture.py diff --git a/data/tex256.png b/data/tex256.png new file mode 100644 index 0000000000000000000000000000000000000000..130d4aadec279ee9e0791ad9c9c4fb35db117148 GIT binary patch literal 12089 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 literal 0 HcmV?d00001 diff --git a/examples/CommonInterfaces/CommonGUIHelperInterface.h b/examples/CommonInterfaces/CommonGUIHelperInterface.h index d552f1ebf..cbd52aa6f 100644 --- a/examples/CommonInterfaces/CommonGUIHelperInterface.h +++ b/examples/CommonInterfaces/CommonGUIHelperInterface.h @@ -40,6 +40,7 @@ struct GUIHelperInterface virtual void removeGraphicsInstance(int graphicsUid) {} virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]) {} virtual void changeSpecularColor(int instanceUid, const double specularColor[3]) {} + virtual void changeTexture(int textureUniqueId, const unsigned char* rgbTexels, int width, int height){} virtual int getShapeIndexFromInstance(int instanceUid){return -1;} virtual void replaceTexture(int shapeIndex, int textureUid){} diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.cpp b/examples/ExampleBrowser/OpenGLGuiHelper.cpp index dfc259542..49b717b5a 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.cpp +++ b/examples/ExampleBrowser/OpenGLGuiHelper.cpp @@ -292,6 +292,12 @@ int OpenGLGuiHelper::registerTexture(const unsigned char* texels, int width, int return textureId; } +void OpenGLGuiHelper::changeTexture(int textureUniqueId, const unsigned char* texels, int width, int height) +{ + bool flipPixelsY = true; + m_data->m_glApp->m_renderer->updateTexture(textureUniqueId, texels,flipPixelsY); +} + int OpenGLGuiHelper::registerGraphicsShape(const float* vertices, int numvertices, const int* indices, int numIndices,int primitiveType, int textureId) { diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.h b/examples/ExampleBrowser/OpenGLGuiHelper.h index ade554a8a..52a522e0e 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.h +++ b/examples/ExampleBrowser/OpenGLGuiHelper.h @@ -28,6 +28,7 @@ struct OpenGLGuiHelper : public GUIHelperInterface virtual void removeGraphicsInstance(int graphicsUid); virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]); virtual void changeSpecularColor(int instanceUid, const double specularColor[3]); + virtual void changeTexture(int textureUniqueId, const unsigned char* rgbTexels, int width, int height); virtual int getShapeIndexFromInstance(int instanceUid); virtual void replaceTexture(int shapeIndex, int textureUid); diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp index e756dec66..92a11f417 100644 --- a/examples/OpenGLWindow/GLInstancingRenderer.cpp +++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp @@ -117,13 +117,14 @@ GLint lineWidthRange[2]={1,1}; enum { - eGfxTransparency=1 + eGfxTransparency=1, }; + struct b3GraphicsInstance { GLuint m_cube_vao; GLuint m_index_vbo; - GLuint m_texturehandle; + GLuint m_textureIndex; int m_numIndices; int m_numVertices; @@ -141,7 +142,7 @@ struct b3GraphicsInstance b3GraphicsInstance() :m_cube_vao(-1), m_index_vbo(-1), - m_texturehandle(0), + m_textureIndex(-1), m_numIndices(-1), m_numVertices(-1), m_numGraphicsInstances(0), @@ -188,6 +189,7 @@ struct InternalTextureHandle GLuint m_glTexture; int m_width; int m_height; + int m_enableFiltering; }; struct b3PublicGraphicsInstanceData @@ -954,7 +956,7 @@ int GLInstancingRenderer::registerTexture(const unsigned char* texels, int width h.m_glTexture = textureHandle; h.m_width = width; h.m_height = height; - + h.m_enableFiltering = true; m_data->m_textureHandles.push_back(h); if (texels) { @@ -971,7 +973,8 @@ void GLInstancingRenderer::replaceTexture(int shapeIndex, int textureId) b3GraphicsInstance* gfxObj = m_graphicsInstances[shapeIndex]; if (textureId>=0) { - gfxObj->m_texturehandle = m_data->m_textureHandles[textureId].m_glTexture; + gfxObj->m_textureIndex = textureId; + } } } @@ -980,9 +983,6 @@ void GLInstancingRenderer::updateTexture(int textureIndex, const unsigned cha { if (textureIndex>=0) { - - - glActiveTexture(GL_TEXTURE0); b3Assert(glGetError() ==GL_NO_ERROR); InternalTextureHandle& h = m_data->m_textureHandles[textureIndex]; @@ -1011,7 +1011,10 @@ void GLInstancingRenderer::updateTexture(int textureIndex, const unsigned cha glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, h.m_width,h.m_height,0,GL_RGB,GL_UNSIGNED_BYTE,&texels[0]); } b3Assert(glGetError() ==GL_NO_ERROR); - glGenerateMipmap(GL_TEXTURE_2D); + if (h.m_enableFiltering) + { + glGenerateMipmap(GL_TEXTURE_2D); + } b3Assert(glGetError() ==GL_NO_ERROR); } } @@ -1048,7 +1051,7 @@ int GLInstancingRenderer::registerShape(const float* vertices, int numvertices, if (textureId>=0) { - gfxObj->m_texturehandle = m_data->m_textureHandles[textureId].m_glTexture; + gfxObj->m_textureIndex = textureId; } gfxObj->m_primitiveType = primitiveType; @@ -2201,10 +2204,26 @@ b3Assert(glGetError() ==GL_NO_ERROR); { glActiveTexture(GL_TEXTURE0); GLuint curBindTexture = 0; - if (gfxObj->m_texturehandle) - curBindTexture = gfxObj->m_texturehandle; + if (gfxObj->m_textureIndex>=0) + { + curBindTexture = m_data->m_textureHandles[gfxObj->m_textureIndex].m_glTexture; + + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0); + + if (m_data->m_textureHandles[gfxObj->m_textureIndex].m_enableFiltering) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + } else + { curBindTexture = m_data->m_defaultTexturehandle; + } //disable lazy evaluation, it just leads to bugs //if (lastBindTexture != curBindTexture) diff --git a/examples/SharedMemory/PhysicsClientC_API.cpp b/examples/SharedMemory/PhysicsClientC_API.cpp index 5a89751bd..22ce287a0 100644 --- a/examples/SharedMemory/PhysicsClientC_API.cpp +++ b/examples/SharedMemory/PhysicsClientC_API.cpp @@ -2918,6 +2918,25 @@ void b3GetVisualShapeInformation(b3PhysicsClientHandle physClient, struct b3Visu } } +b3SharedMemoryCommandHandle b3CreateChangeTextureCommandInit(b3PhysicsClientHandle physClient, int textureUniqueId, int width, int height, const char* rgbPixels) +{ + PhysicsClient* cl = (PhysicsClient* ) physClient; + b3Assert(cl); + b3Assert(cl->canSubmitCommand()); + struct SharedMemoryCommand* command = cl->getAvailableSharedMemoryCommand(); + b3Assert(command); + command->m_type = CMD_CHANGE_TEXTURE; + + command->m_changeTextureArgs.m_textureUniqueId = textureUniqueId; + command->m_changeTextureArgs.m_width = width; + command->m_changeTextureArgs.m_height = height; + int numPixels = width*height; + cl->uploadBulletFileToSharedMemory(rgbPixels,numPixels*3); + command->m_updateFlags = 0; + return (b3SharedMemoryCommandHandle) command; +} + + b3SharedMemoryCommandHandle b3InitLoadTexture(b3PhysicsClientHandle physClient, const char* filename) { PhysicsClient* cl = (PhysicsClient* ) physClient; diff --git a/examples/SharedMemory/PhysicsClientC_API.h b/examples/SharedMemory/PhysicsClientC_API.h index 9c7271275..a0ce40f7b 100644 --- a/examples/SharedMemory/PhysicsClientC_API.h +++ b/examples/SharedMemory/PhysicsClientC_API.h @@ -219,6 +219,7 @@ void b3GetVisualShapeInformation(b3PhysicsClientHandle physClient, struct b3Visu b3SharedMemoryCommandHandle b3InitLoadTexture(b3PhysicsClientHandle physClient, const char* filename); int b3GetStatusTextureUniqueId(b3SharedMemoryStatusHandle statusHandle); +b3SharedMemoryCommandHandle b3CreateChangeTextureCommandInit(b3PhysicsClientHandle physClient, int textureUniqueId, int width, int height, const char* rgbPixels); b3SharedMemoryCommandHandle b3InitUpdateVisualShape(b3PhysicsClientHandle physClient, int bodyUniqueId, int jointIndex, int shapeIndex, int textureUniqueId); void b3UpdateVisualShapeRGBAColor(b3SharedMemoryCommandHandle commandHandle, double rgbaColor[4]); diff --git a/examples/SharedMemory/PhysicsClientSharedMemory.cpp b/examples/SharedMemory/PhysicsClientSharedMemory.cpp index 0877b1d0a..12585e13b 100644 --- a/examples/SharedMemory/PhysicsClientSharedMemory.cpp +++ b/examples/SharedMemory/PhysicsClientSharedMemory.cpp @@ -1368,7 +1368,9 @@ void PhysicsClientSharedMemory::uploadBulletFileToSharedMemory(const char* data, SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE); } else { for (int i = 0; i < len; i++) { - m_data->m_testBlock1->m_bulletStreamDataClientToServer[i] = data[i]; + //m_data->m_testBlock1->m_bulletStreamDataClientToServer[i] = data[i]; + m_data->m_testBlock1->m_bulletStreamDataServerToClientRefactor[i] = data[i]; + } } } diff --git a/examples/SharedMemory/PhysicsDirect.cpp b/examples/SharedMemory/PhysicsDirect.cpp index afbf92f0a..d26ff70da 100644 --- a/examples/SharedMemory/PhysicsDirect.cpp +++ b/examples/SharedMemory/PhysicsDirect.cpp @@ -1095,6 +1095,14 @@ void PhysicsDirect::setSharedMemoryKey(int key) void PhysicsDirect::uploadBulletFileToSharedMemory(const char* data, int len) { + if (len>SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE) + { + len = SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE; + } + for (int i=0;im_bulletStreamDataServerToClient[i] = data[i]; + } //m_data->m_physicsClient->uploadBulletFileToSharedMemory(data,len); } diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 55fac1dc9..2719f2788 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -6863,6 +6863,24 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm break; } + + case CMD_CHANGE_TEXTURE: + { + SharedMemoryStatus& serverCmd = serverStatusOut; + serverCmd.m_type = CMD_CHANGE_TEXTURE_COMMAND_FAILED; + + InternalTextureHandle* texH = m_data->m_textureHandles.getHandle(clientCmd.m_changeTextureArgs.m_textureUniqueId); + if(texH) + { + int gltex = texH->m_openglTextureId; + m_data->m_guiHelper->changeTexture(gltex, + (const unsigned char*)bufferServerToClient, clientCmd.m_changeTextureArgs.m_width,clientCmd.m_changeTextureArgs.m_height); + + serverCmd.m_type = CMD_CLIENT_COMMAND_COMPLETED; + } + hasStatus = true; + break; + } case CMD_LOAD_TEXTURE: { BT_PROFILE("CMD_LOAD_TEXTURE"); diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 0a28b9c31..80968c880 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -133,6 +133,7 @@ enum MultiThreadedGUIHelperCommunicationEnums eGUIHelperSetVisualizerFlag, eGUIHelperChangeGraphicsInstanceTextureId, eGUIHelperGetShapeIndexFromInstance, + eGUIHelperChangeTexture, }; @@ -958,6 +959,23 @@ public: workerThreadWait(); } + + int m_changeTextureUniqueId; + const unsigned char* m_changeTextureRgbTexels; + int m_changeTextureWidth; + int m_changeTextureHeight; + + virtual void changeTexture(int textureUniqueId, const unsigned char* rgbTexels, int width, int height) + { + m_changeTextureUniqueId = textureUniqueId; + m_changeTextureRgbTexels = rgbTexels; + m_changeTextureWidth = width; + m_changeTextureHeight = height; + m_cs->lock(); + m_cs->setSharedParam(1,eGUIHelperChangeTexture); + workerThreadWait(); + } + double m_rgbaColor[4]; int m_graphicsInstanceChangeColor; virtual void changeRGBAColor(int instanceUid, const double rgbaColor[4]) @@ -1955,6 +1973,16 @@ void PhysicsServerExample::updateGraphics() } + case eGUIHelperChangeTexture: + { + m_multiThreadedHelper->m_childGuiHelper->changeTexture( + m_multiThreadedHelper->m_changeTextureUniqueId, + m_multiThreadedHelper->m_changeTextureRgbTexels, + m_multiThreadedHelper->m_changeTextureWidth, + m_multiThreadedHelper->m_changeTextureHeight); + m_multiThreadedHelper->mainThreadRelease(); + break; + } case eGUIHelperChangeGraphicsInstanceRGBAColor: { diff --git a/examples/SharedMemory/SharedMemoryCommands.h b/examples/SharedMemory/SharedMemoryCommands.h index 4b9fe12b9..a5db4cd71 100644 --- a/examples/SharedMemory/SharedMemoryCommands.h +++ b/examples/SharedMemory/SharedMemoryCommands.h @@ -898,6 +898,12 @@ struct b3CreateMultiBodyResultArgs int m_bodyUniqueId; }; +struct b3ChangeTextureArgs +{ + int m_textureUniqueId; + int m_width; + int m_height; +}; struct SharedMemoryCommand { @@ -950,6 +956,7 @@ struct SharedMemoryCommand struct b3CreateVisualShapeArgs m_createVisualShapeArgs; struct b3CreateMultiBodyArgs m_createMultiBodyArgs; struct b3RequestCollisionInfoArgs m_requestCollisionInfoArgs; + struct b3ChangeTextureArgs m_changeTextureArgs; }; }; diff --git a/examples/SharedMemory/SharedMemoryPublic.h b/examples/SharedMemory/SharedMemoryPublic.h index eaf3de675..05875d9b5 100644 --- a/examples/SharedMemory/SharedMemoryPublic.h +++ b/examples/SharedMemory/SharedMemoryPublic.h @@ -67,6 +67,7 @@ enum EnumSharedMemoryClientCommand CMD_CREATE_MULTI_BODY, CMD_REQUEST_COLLISION_INFO, CMD_REQUEST_MOUSE_EVENTS_DATA, + CMD_CHANGE_TEXTURE, //don't go beyond this command! CMD_MAX_CLIENT_COMMANDS, @@ -161,6 +162,7 @@ enum EnumSharedMemoryServerStatus CMD_REQUEST_COLLISION_INFO_COMPLETED, CMD_REQUEST_COLLISION_INFO_FAILED, CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED, + CMD_CHANGE_TEXTURE_COMMAND_FAILED, //don't go beyond 'CMD_MAX_SERVER_COMMANDS! CMD_MAX_SERVER_COMMANDS }; diff --git a/examples/pybullet/examples/changeTexture.py b/examples/pybullet/examples/changeTexture.py new file mode 100644 index 000000000..c9e592f88 --- /dev/null +++ b/examples/pybullet/examples/changeTexture.py @@ -0,0 +1,43 @@ +import pybullet as p +import time +p.connect(p.GUI) +planeUidA = p.loadURDF("plane_transparent.urdf",[0,0,0]) +planeUid = p.loadURDF("plane_transparent.urdf",[0,0,-1]) + +texUid = p.loadTexture("tex256.png") + +p.changeVisualShape(planeUidA,-1,rgbaColor=[1,1,1,0.5]) +p.changeVisualShape(planeUid,-1,rgbaColor=[1,1,1,0.5]) +p.changeVisualShape(planeUid,-1, textureUniqueId = texUid) + +width = 256 +height = 256 +pixels = [255]*width*height*3 +colorR = 0 +colorG = 0 +colorB = 0 + + +#p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,0) +#p.configureDebugVisualizer(p.COV_ENABLE_GUI,0) + +blue=0 +logId = p.startStateLogging(p.STATE_LOGGING_PROFILE_TIMINGS, "renderbench.json") +for i in range (100000): + p.stepSimulation() + for i in range (width): + for j in range(height): + pixels[(i+j*width)*3+0]=i + pixels[(i+j*width)*3+1]=(j+blue)%256 + pixels[(i+j*width)*3+2]=blue + blue=blue+1 + p.changeTexture(texUid, pixels,width,height) + start = time.time() + p.getCameraImage(300,300,renderer=p.ER_BULLET_HARDWARE_OPENGL) + end = time.time() + print("rendering duraction") + print(end-start) +p.stopStateLogging(logId) +#p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,1) +#p.configureDebugVisualizer(p.COV_ENABLE_GUI,1) + diff --git a/examples/pybullet/pybullet.c b/examples/pybullet/pybullet.c index 08aee99e3..4cf3eb6ac 100644 --- a/examples/pybullet/pybullet.c +++ b/examples/pybullet/pybullet.c @@ -1433,7 +1433,7 @@ static PyObject* pybullet_setJointMotorControlArray(PyObject* self, PyObject* ar int i; for (i = 0; i < numControlledDofs; i++) { - int jointIndex = pybullet_internalGetFloatFromSequence(jointIndicesSeq, i); + int jointIndex = pybullet_internalGetIntFromSequence(jointIndicesSeq, i); if ((jointIndex >= numJoints) || (jointIndex < 0)) { Py_DECREF(jointIndicesSeq); @@ -4551,6 +4551,75 @@ static PyObject* pybullet_changeVisualShape(PyObject* self, PyObject* args, PyOb return Py_None; } + +static PyObject* pybullet_changeTexture(PyObject* self, PyObject* args, PyObject* keywds) +{ + b3SharedMemoryCommandHandle commandHandle = 0; + b3SharedMemoryStatusHandle statusHandle=0; + int statusType = -1; + int textureUniqueId = -1; + int physicsClientId = 0; + int width=-1; + int height=-1; + + PyObject* pixelsObj = 0; + + b3PhysicsClientHandle sm = 0; + static char* kwlist[] = {"textureUniqueId", "pixels", "width", "height", "physicsClientId", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "iOii|i", kwlist, &textureUniqueId, &pixelsObj, &width, &height, &physicsClientId)) + { + return NULL; + } + sm = getPhysicsClient(physicsClientId); + if (sm == 0) + { + PyErr_SetString(SpamError, "Not connected to physics server."); + return NULL; + } + + if (textureUniqueId>=0 && width>=0 && height>=0 && pixelsObj) + { + PyObject* seqPixels = PySequence_Fast(pixelsObj, "expected a sequence"); + PyObject* item; + int i; + int numPixels = width*height; + unsigned char* pixelBuffer = (char*) malloc (numPixels*3); + if (PyList_Check(seqPixels)) + { + for (i=0;i