Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2012-10-21 02:28:44 +0400
committerBenoit Bolsee <benoit.bolsee@online.be>2012-10-21 02:28:44 +0400
commit4213eca5fc3b5f2c2b23945e9462b38e13f843c4 (patch)
tree8f296c8e6847423ec0ded76e04a38efb44543d5c /source/gameengine/VideoTexture/ImageViewport.cpp
parent7deb8d8a26a63a338b845eae3617111316e015f9 (diff)
BGE VideoTexture: add depth buffer access to ImageViewport and ImageRender.
2 new attributes to ImageViewport and ImageRender object: depth: set to True to retrieve the depth buffer as an array of float (not suitable for texture source). zbuff: set to True to retrieve the depth buffer as a grey scale pixel array (suitable for texture source). A new mode 'F' is added to VideoTexture.imageToArray() to allow returning the image buffer as a one dimensional array of float. This mode should only be used to retrieve the depth buffer of ImageViewport and ImageRender objects. Example: viewport = VideoTexture.ImageViewport() viewport.depth = True depth = VideoTexture.imageToArray(viewport,'F') # show depth of bottom left pixel # 1.0 = infinite, 0.0 = on near clip plane. print(depth[0])
Diffstat (limited to 'source/gameengine/VideoTexture/ImageViewport.cpp')
-rw-r--r--source/gameengine/VideoTexture/ImageViewport.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/source/gameengine/VideoTexture/ImageViewport.cpp b/source/gameengine/VideoTexture/ImageViewport.cpp
index 9b503efcf39..0836422576f 100644
--- a/source/gameengine/VideoTexture/ImageViewport.cpp
+++ b/source/gameengine/VideoTexture/ImageViewport.cpp
@@ -50,6 +50,8 @@ ImageViewport::ImageViewport (void) : m_alpha(false), m_texInit(false)
//glGetIntegerv(GL_VIEWPORT, m_viewport);
// create buffer for viewport image
+ // Warning: this buffer is also used to get the depth buffer as an array of
+ // float (1 float = 4 bytes per pixel)
m_viewportImage = new BYTE [4 * getViewportSize()[0] * getViewportSize()[1]];
// set attributes
setWhole(false);
@@ -57,7 +59,9 @@ ImageViewport::ImageViewport (void) : m_alpha(false), m_texInit(false)
// destructor
ImageViewport::~ImageViewport (void)
-{ delete [] m_viewportImage; }
+{
+ delete [] m_viewportImage;
+}
// use whole viewport to capture image
@@ -131,7 +135,7 @@ void ImageViewport::calcImage (unsigned int texId, double ts)
}
// if texture can be directly created
if (texId != 0 && m_pyfilter == NULL && m_capSize[0] == calcSize(m_capSize[0])
- && m_capSize[1] == calcSize(m_capSize[1]) && !m_flip)
+ && m_capSize[1] == calcSize(m_capSize[1]) && !m_flip && !m_zbuff && !m_depth)
{
// just copy current viewport to texture
glBindTexture(GL_TEXTURE_2D, texId);
@@ -142,6 +146,32 @@ void ImageViewport::calcImage (unsigned int texId, double ts)
// otherwise copy viewport to buffer, if image is not available
else if (!m_avail)
{
+ if (m_zbuff)
+ {
+ // Use read pixels with the depth buffer
+ // *** misusing m_viewportImage here, but since it has the correct size
+ // (4 bytes per pixel = size of float) and we just need it to apply
+ // the filter, it's ok
+ glReadPixels(m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1],
+ GL_DEPTH_COMPONENT, GL_FLOAT, m_viewportImage);
+ // filter loaded data
+ FilterZZZA filt;
+ filterImage(filt, (float *)m_viewportImage, m_capSize);
+ }
+ else
+
+ if (m_depth)
+ {
+ // Use read pixels with the depth buffer
+ // See warning above about m_viewportImage.
+ glReadPixels(m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1],
+ GL_DEPTH_COMPONENT, GL_FLOAT, m_viewportImage);
+ // filter loaded data
+ FilterDEPTH filt;
+ filterImage(filt, (float *)m_viewportImage, m_capSize);
+ }
+ else
+
// get frame buffer data
if (m_alpha)
{
@@ -310,6 +340,8 @@ static PyGetSetDef imageViewportGetSets[] =
{(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
{(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbor)", NULL},
{(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
+ {(char*)"zbuff", (getter)Image_getZbuff, (setter)Image_setZbuff, (char*)"use depth buffer as texture", NULL},
+ {(char*)"depth", (getter)Image_getDepth, (setter)Image_setDepth, (char*)"get depth information from z-buffer as array of float", NULL},
{(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
{NULL}
};