From afd1066c50991a626b81f91edd5b63c8dd5fd1c4 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Thu, 28 Dec 2017 10:18:35 -0800 Subject: [PATCH] pybullet.getCameraImage: preparation to expose link index in segmentation mask buffer --- examples/RenderingExamples/TinyRendererSetup.cpp | 2 +- examples/SharedMemory/PhysicsClientExample.cpp | 7 +++++-- examples/SharedMemory/PhysicsServerExample.cpp | 6 +++++- .../TinyRendererVisualShapeConverter.cpp | 2 +- examples/TinyRenderer/TinyRenderer.cpp | 9 +++++---- examples/TinyRenderer/TinyRenderer.h | 3 ++- examples/TinyRenderer/our_gl.cpp | 15 +++++++++++---- 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/examples/RenderingExamples/TinyRendererSetup.cpp b/examples/RenderingExamples/TinyRendererSetup.cpp index 64fa77f14..61ead53d5 100644 --- a/examples/RenderingExamples/TinyRendererSetup.cpp +++ b/examples/RenderingExamples/TinyRendererSetup.cpp @@ -195,7 +195,7 @@ TinyRendererSetup::TinyRendererSetup(struct GUIHelperInterface* gui) m_internalData->m_depthBuffer, &m_internalData->m_shadowBuffer, &m_internalData->m_segmentationMaskBuffer, - m_internalData->m_renderObjects.size()); + m_internalData->m_renderObjects.size(), -1); meshData.m_gfxShape->m_scaling[0] = scaling[0]; meshData.m_gfxShape->m_scaling[1] = scaling[1]; diff --git a/examples/SharedMemory/PhysicsClientExample.cpp b/examples/SharedMemory/PhysicsClientExample.cpp index 86aaa1a8a..08adb66c6 100644 --- a/examples/SharedMemory/PhysicsClientExample.cpp +++ b/examples/SharedMemory/PhysicsClientExample.cpp @@ -940,8 +940,11 @@ void PhysicsClientExample::stepSimulation(float deltaTime) btVector4(32,255,255,255)}; if (segmentationMask>=0) { - btVector4 rgb = palette[segmentationMask&3]; - m_canvas->setPixel(m_canvasSegMaskIndex,i,j, + int obIndex = segmentationMask&(0x1e24-1); + int linkIndex = (segmentationMask>>24)-1; + + btVector4 rgb = palette[(obIndex+linkIndex)&3]; + m_canvas->setPixel(m_canvasSegMaskIndex,i,j, rgb.x(), rgb.y(), rgb.z(), 255); //alpha set to 255 diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 518f1b657..8d13bf105 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -2169,7 +2169,11 @@ void PhysicsServerExample::updateGraphics() btVector4(32,255,255,255)}; if (segmentationMask>=0) { - btVector4 rgb = palette[segmentationMask&3]; + int obIndex = segmentationMask&(0x1e24-1); + int linkIndex = (segmentationMask>>24)-1; + + btVector4 rgb = palette[(obIndex+linkIndex)&3]; + m_canvas->setPixel(m_canvasSegMaskIndex,i,j, rgb.x(), rgb.y(), diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index d44defa34..c687732da 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -629,7 +629,7 @@ void TinyRendererVisualShapeConverter::convertVisualShapes( if (vertices.size() && indices.size()) { - TinyRenderObjectData* tinyObj = new TinyRenderObjectData(m_data->m_rgbColorBuffer,m_data->m_depthBuffer, &m_data->m_shadowBuffer, &m_data->m_segmentationMaskBuffer, bodyUniqueId); + TinyRenderObjectData* tinyObj = new TinyRenderObjectData(m_data->m_rgbColorBuffer,m_data->m_depthBuffer, &m_data->m_shadowBuffer, &m_data->m_segmentationMaskBuffer, bodyUniqueId, linkIndex); unsigned char* textureImage1=0; int textureWidth=0; int textureHeight=0; diff --git a/examples/TinyRenderer/TinyRenderer.cpp b/examples/TinyRenderer/TinyRenderer.cpp index e722f4a2c..dbf6522e8 100644 --- a/examples/TinyRenderer/TinyRenderer.cpp +++ b/examples/TinyRenderer/TinyRenderer.cpp @@ -199,7 +199,7 @@ m_objectIndex(-1) } -TinyRenderObjectData::TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer, b3AlignedObjectArray* shadowBuffer, b3AlignedObjectArray* segmentationMaskBuffer, int objectIndex) +TinyRenderObjectData::TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer, b3AlignedObjectArray* shadowBuffer, b3AlignedObjectArray* segmentationMaskBuffer, int objectIndex, int linkIndex) :m_model(0), m_rgbColorBuffer(rgbColorBuffer), m_depthBuffer(depthBuffer), @@ -207,7 +207,8 @@ m_shadowBuffer(shadowBuffer), m_segmentationMaskBufferPtr(segmentationMaskBuffer), m_userData(0), m_userIndex(-1), -m_objectIndex(objectIndex) +m_objectIndex(objectIndex), +m_linkIndex(linkIndex) { Vec3f eye(1,1,3); Vec3f center(0,0,0); @@ -561,12 +562,12 @@ void TinyRenderer::renderObject(TinyRenderObjectData& renderData) { for (int t=0;t&depthBuffer); TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer,b3AlignedObjectArray* segmentationMaskBuffer,int objectIndex); TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer,b3AlignedObjectArray* shadowBuffer); - TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer,b3AlignedObjectArray* shadowBuffer, b3AlignedObjectArray* segmentationMaskBuffer,int objectIndex); + TinyRenderObjectData(TGAImage& rgbColorBuffer,b3AlignedObjectArray&depthBuffer,b3AlignedObjectArray* shadowBuffer, b3AlignedObjectArray* segmentationMaskBuffer,int objectIndex, int linkIndex); virtual ~TinyRenderObjectData(); void loadModel(const char* fileName); @@ -52,6 +52,7 @@ struct TinyRenderObjectData void* m_userData; int m_userIndex; int m_objectIndex; + int m_linkIndex; }; diff --git a/examples/TinyRenderer/our_gl.cpp b/examples/TinyRenderer/our_gl.cpp index 8ea08f00b..c13e345a8 100644 --- a/examples/TinyRenderer/our_gl.cpp +++ b/examples/TinyRenderer/our_gl.cpp @@ -75,7 +75,7 @@ void triangleClipped(mat<4,3,float> &clipc, mat<4,3,float> &orgClipc, IShader &s triangleClipped(clipc, orgClipc,shader,image,zbuffer,0,viewPortMatrix,0); } -void triangleClipped(mat<4,3,float> &clipc, mat<4,3,float> &orgClipc, IShader &shader, TGAImage &image, float *zbuffer, int* segmentationMaskBuffer, const Matrix& viewPortMatrix, int objectIndex) +void triangleClipped(mat<4,3,float> &clipc, mat<4,3,float> &orgClipc, IShader &shader, TGAImage &image, float *zbuffer, int* segmentationMaskBuffer, const Matrix& viewPortMatrix, int objectAndLinkIndex) { mat<3,4,float> screenSpacePts = (viewPortMatrix*clipc).transpose(); // transposed to ease access to each of the points @@ -135,7 +135,7 @@ void triangleClipped(mat<4,3,float> &clipc, mat<4,3,float> &orgClipc, IShader &s zbuffer[P.x+P.y*image.get_width()] = frag_depth; if (segmentationMaskBuffer) { - segmentationMaskBuffer[P.x+P.y*image.get_width()] = objectIndex; + segmentationMaskBuffer[P.x+P.y*image.get_width()] = objectAndLinkIndex; } image.set(P.x, P.y, color); } @@ -149,7 +149,7 @@ void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zb triangle(clipc,shader,image,zbuffer,0,viewPortMatrix,0); } -void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zbuffer, int* segmentationMaskBuffer, const Matrix& viewPortMatrix, int objectIndex) { +void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zbuffer, int* segmentationMaskBuffer, const Matrix& viewPortMatrix, int objectAndLinkIndex) { mat<3,4,float> pts = (viewPortMatrix*clipc).transpose(); // transposed to ease access to each of the points @@ -189,7 +189,14 @@ void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zb zbuffer[P.x+P.y*image.get_width()] = frag_depth; if (segmentationMaskBuffer) { - segmentationMaskBuffer[P.x+P.y*image.get_width()] = objectIndex; + if (objectAndLinkIndex) + { + segmentationMaskBuffer[P.x+P.y*image.get_width()] = objectAndLinkIndex; + } else + { + segmentationMaskBuffer[P.x+P.y*image.get_width()] = 0; + + } } image.set(P.x, P.y, color); }