diff --git a/examples/CommonInterfaces/CommonCameraInterface.h b/examples/CommonInterfaces/CommonCameraInterface.h index 813aa4344..88db58685 100644 --- a/examples/CommonInterfaces/CommonCameraInterface.h +++ b/examples/CommonInterfaces/CommonCameraInterface.h @@ -36,6 +36,9 @@ struct CommonCameraInterface virtual void setAspectRatio(float ratio) = 0; virtual float getAspectRatio() const = 0; + + virtual float getCameraFrustumFar() const = 0; + virtual float getCameraFrustumNear() const = 0; }; #endif //COMMON_CAMERA_INTERFACE_H diff --git a/examples/ExampleBrowser/OpenGLGuiHelper.cpp b/examples/ExampleBrowser/OpenGLGuiHelper.cpp index c739d2e47..87bff6e59 100644 --- a/examples/ExampleBrowser/OpenGLGuiHelper.cpp +++ b/examples/ExampleBrowser/OpenGLGuiHelper.cpp @@ -437,10 +437,15 @@ void OpenGLGuiHelper::copyCameraImageData(const float viewMatrix[16], const floa int bytesPerPixel = 4; //RGBA int sourcePixelIndex = (xIndex+yIndex*sourceWidth)*bytesPerPixel; + int sourceDepthIndex = xIndex+yIndex*sourceWidth; + m_data->m_rgbaPixelBuffer1[(i+j*destinationWidth)*4+0] = sourceRgbaPixelBuffer[sourcePixelIndex+0]; m_data->m_rgbaPixelBuffer1[(i+j*destinationWidth)*4+1] = sourceRgbaPixelBuffer[sourcePixelIndex+1]; m_data->m_rgbaPixelBuffer1[(i+j*destinationWidth)*4+2] = sourceRgbaPixelBuffer[sourcePixelIndex+2]; m_data->m_rgbaPixelBuffer1[(i+j*destinationWidth)*4+3] = 255; + + m_data->m_depthBuffer1[i+j*destinationWidth] = sourceDepthBuffer[sourceDepthIndex]; + } } } @@ -456,7 +461,7 @@ void OpenGLGuiHelper::copyCameraImageData(const float viewMatrix[16], const floa { for (int i=0;im_depthBuffer1[i]; + depthBuffer[i] = m_data->m_depthBuffer1[i+startPixelIndex]; } } if (numPixelsCopied) diff --git a/examples/OpenGLWindow/SimpleCamera.cpp b/examples/OpenGLWindow/SimpleCamera.cpp index 4b0b27164..93838a212 100644 --- a/examples/OpenGLWindow/SimpleCamera.cpp +++ b/examples/OpenGLWindow/SimpleCamera.cpp @@ -383,3 +383,13 @@ float SimpleCamera::getAspectRatio() const { return m_data->m_aspect; } + +float SimpleCamera::getCameraFrustumFar() const +{ + return m_data->m_frustumZFar; +} + +float SimpleCamera::getCameraFrustumNear() const +{ + return m_data->m_frustumZNear; +} diff --git a/examples/OpenGLWindow/SimpleCamera.h b/examples/OpenGLWindow/SimpleCamera.h index 5a61a729f..b186759c8 100644 --- a/examples/OpenGLWindow/SimpleCamera.h +++ b/examples/OpenGLWindow/SimpleCamera.h @@ -47,6 +47,9 @@ struct SimpleCamera : public CommonCameraInterface virtual void setAspectRatio(float ratio); virtual float getAspectRatio() const; + + virtual float getCameraFrustumFar() const; + virtual float getCameraFrustumNear() const; }; -#endif //SIMPLE_CAMERA_H \ No newline at end of file +#endif //SIMPLE_CAMERA_H diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index 5ae682fc2..cfe25c938 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -958,7 +958,16 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels { if (depthBuffer) { - depthBuffer[i] = m_data->m_depthBuffer[i+startPixelIndex]; + float distance = -m_data->m_depthBuffer[i+startPixelIndex]; + float farPlane = m_data->m_camera.getCameraFrustumFar(); + float nearPlane = m_data->m_camera.getCameraFrustumNear(); + + btClamp(distance,nearPlane,farPlane); + + // the depth buffer value is between 0 and 1 + float a = farPlane / (farPlane - nearPlane); + float b = farPlane * nearPlane / (nearPlane - farPlane); + depthBuffer[i] = a + b / distance; } if (segmentationMaskBuffer) {