[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51469] trunk/blender: BGE VideoTexture: add depth buffer access to ImageViewport and ImageRender.

Benoit Bolsee benoit.bolsee at online.be
Sun Oct 21 00:28:45 CEST 2012


Revision: 51469
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51469
Author:   ben2610
Date:     2012-10-20 22:28:44 +0000 (Sat, 20 Oct 2012)
Log Message:
-----------
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])

Modified Paths:
--------------
    trunk/blender/doc/python_api/rst/bge.texture.rst
    trunk/blender/source/gameengine/VideoTexture/FilterBase.h
    trunk/blender/source/gameengine/VideoTexture/FilterSource.h
    trunk/blender/source/gameengine/VideoTexture/ImageBase.cpp
    trunk/blender/source/gameengine/VideoTexture/ImageBase.h
    trunk/blender/source/gameengine/VideoTexture/ImageRender.cpp
    trunk/blender/source/gameengine/VideoTexture/ImageViewport.cpp

Modified: trunk/blender/doc/python_api/rst/bge.texture.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.texture.rst	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/doc/python_api/rst/bge.texture.rst	2012-10-20 22:28:44 UTC (rev 51469)
@@ -351,6 +351,15 @@
 
       use whole viewport to render
 
+   .. attribute:: depth
+
+      use depth component of render as array of float -  not suitable for texture source,
+      should only be used with bge.texture.imageToArray(mode='F')
+
+   .. attribute:: zbuff
+
+      use depth component of render as grey scale color -  suitable for texture source
+
 .. class:: ImageViewport()
 
    Image source from viewport
@@ -399,6 +408,15 @@
 
       use whole viewport to capture
 
+   .. attribute:: depth
+
+      use depth component of viewport as array of float -  not suitable for texture source,
+      should only be used with bge.texture.imageToArray(mode='F')
+
+   .. attribute:: zbuff
+
+      use depth component of viewport as grey scale color -  suitable for texture source
+
 .. class:: Texture(gameObj)
 
    Texture objects
@@ -518,13 +536,16 @@
       0 to force a fixed 0 color channel and 1 to force a fixed 255 color channel.
       Example: "BGR" will return 3 bytes per pixel with the Blue, Green and Red channels in that order.
       "RGB1" will return 4 bytes per pixel with the Red, Green, Blue channels in that order and the alpha channel forced to 255.
+      A special mode "F" allows to return the image as an array of float. This mode should only be used to retrieve
+      the depth buffer of the ImageViewport and ImageRender object.
       The default mode is "RGBA".
+          
 
    :type mode: string
    :rtype: :class:`~bgl.buffer`
    :return: A object representing the image as one dimensional array of bytes of size (pixel_size*width*height),
       line by line starting from the bottom of the image. The pixel size and format is determined by the mode
-      parameter.
+      parameter. For mode 'F', the array is a one dimensional array of float of size (width*height).
 
 .. function:: materialID(object,name)
 

Modified: trunk/blender/source/gameengine/VideoTexture/FilterBase.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterBase.h	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/source/gameengine/VideoTexture/FilterBase.h	2012-10-20 22:28:44 UTC (rev 51469)
@@ -95,6 +95,10 @@
 	virtual unsigned int filter (unsigned int * src, short x, short y,
 		short * size, unsigned int pixSize, unsigned int val = 0)
 	{ return val; }
+	/// filter pixel, source float buffer
+	virtual unsigned int filter (float * src, short x, short y,
+		short * size, unsigned int pixSize, unsigned int val = 0)
+	{ return val; }
 
 	/// get source pixel size
 	virtual unsigned int getPixelSize (void) { return 1; }

Modified: trunk/blender/source/gameengine/VideoTexture/FilterSource.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterSource.h	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/source/gameengine/VideoTexture/FilterSource.h	2012-10-20 22:28:44 UTC (rev 51469)
@@ -31,7 +31,6 @@
 
 #include "FilterBase.h"
 
-
 /// class for RGB24 conversion
 class FilterRGB24 : public FilterBase
 {
@@ -97,6 +96,65 @@
 	{ VT_RGBA(val,src[2],src[1],src[0],0xFF); return val; }
 };
 
+/// class for Z_buffer conversion
+class FilterZZZA : public FilterBase
+{
+public:
+	/// constructor
+	FilterZZZA (void) {}
+	/// destructor
+	virtual ~FilterZZZA (void) {}
+
+	/// get source pixel size
+	virtual unsigned int getPixelSize (void) { return 1; }
+
+protected:
+	/// filter pixel, source float buffer
+	virtual unsigned int filter (float * src, short x, short y,
+		short * size, unsigned int pixSize, unsigned int val)
+	{
+		// calculate gray value
+        // convert float to unsigned char
+		unsigned int depth = int(src[0] * 255);
+		// return depth scale value
+		VT_R(val) = depth;
+		VT_G(val) = depth;
+		VT_B(val) = depth;
+		VT_A(val) = 0xFF;
+
+		return val;
+	}
+};
+
+
+/// class for Z_buffer conversion
+class FilterDEPTH : public FilterBase
+{
+public:
+	/// constructor
+	FilterDEPTH (void) {}
+	/// destructor
+	virtual ~FilterDEPTH (void) {}
+
+	/// get source pixel size
+	virtual unsigned int getPixelSize (void) { return 1; }
+
+protected:
+	/// filter pixel, source float buffer
+	virtual unsigned int filter (float * src, short x, short y,
+		short * size, unsigned int pixSize, unsigned int val)
+	{
+        // Copy the float value straight away
+		// The user can retrieve the original float value by using 
+		// 'F' mode in BGL buffer
+        memcpy(&val, src, sizeof (unsigned int));
+		return val;
+	}
+};
+
+
+
+
 /// class for YV12 conversion
 class FilterYV12 : public FilterBase
 {

Modified: trunk/blender/source/gameengine/VideoTexture/ImageBase.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/ImageBase.cpp	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/source/gameengine/VideoTexture/ImageBase.cpp	2012-10-20 22:28:44 UTC (rev 51469)
@@ -49,6 +49,8 @@
 // constructor
 ImageBase::ImageBase (bool staticSrc) : m_image(NULL), m_imgSize(0),
 m_avail(false), m_scale(false), m_scaleChange(false), m_flip(false),
+m_zbuff(false),
+m_depth(false),
 m_staticSources(staticSrc), m_pyfilter(NULL)
 {
 	m_size[0] = m_size[1] = 0;
@@ -402,6 +404,18 @@
 			{
 				buffer = BGL_MakeBuffer( GL_BYTE, 1, &dimensions, image);
 			}
+			else if (!strcasecmp(mode, "F"))
+			{
+				// this mode returns the image as an array of float.
+				// This makes sense ONLY for the depth buffer:
+				//   source = VideoTexture.ImageViewport()
+				//   source.depth = True
+				//   depth = VideoTexture.imageToArray(source, 'F')
+
+				// adapt dimension from byte to float
+				dimensions /= sizeof(float);
+				buffer = BGL_MakeBuffer( GL_FLOAT, 1, &dimensions, image);
+			}
 			else 
 			{
 				int i, c, ncolor, pixels;
@@ -532,7 +546,53 @@
 	return 0;
 }
 
+// get zbuff
+PyObject * Image_getZbuff (PyImage * self, void * closure)
+{
+	if (self->m_image != NULL && self->m_image->getZbuff()) Py_RETURN_TRUE;
+	else Py_RETURN_FALSE;
+}
 
+// set zbuff
+int Image_setZbuff (PyImage * self, PyObject * value, void * closure)
+{
+	// check parameter, report failure
+	if (value == NULL || !PyBool_Check(value))
+	{
+		PyErr_SetString(PyExc_TypeError, "The value must be a bool");
+		return -1;
+	}
+	// set scale
+	if (self->m_image != NULL) self->m_image->setZbuff(value == Py_True);
+	// success
+	return 0;
+}
+
+// get depth
+PyObject * Image_getDepth (PyImage * self, void * closure)
+{
+	if (self->m_image != NULL && self->m_image->getDepth()) Py_RETURN_TRUE;
+	else Py_RETURN_FALSE;
+}
+
+// set depth
+int Image_setDepth (PyImage * self, PyObject * value, void * closure)
+{
+	// check parameter, report failure
+	if (value == NULL || !PyBool_Check(value))
+	{
+		PyErr_SetString(PyExc_TypeError, "The value must be a bool");
+		return -1;
+	}
+	// set scale
+	if (self->m_image != NULL) self->m_image->setDepth(value == Py_True);
+	// success
+	return 0;
+}
+
+
+
+
 // get filter source object
 PyObject *Image_getSource (PyImage *self, PyObject *args)
 {

Modified: trunk/blender/source/gameengine/VideoTexture/ImageBase.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/ImageBase.h	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/source/gameengine/VideoTexture/ImageBase.h	2012-10-20 22:28:44 UTC (rev 51469)
@@ -78,6 +78,14 @@
 	bool getFlip (void) { return m_flip; }
 	/// set vertical flip
 	void setFlip (bool flip) { m_flip = flip; }
+	/// get Z buffer
+	bool getZbuff (void) { return m_zbuff; }
+	/// set Z buffer
+	void setZbuff (bool zbuff) { m_zbuff = zbuff; }
+	/// get depth
+	bool getDepth (void) { return m_depth; }
+	/// set depth
+	void setDepth (bool depth) { m_depth = depth; }
 
 	/// get source object
 	PyImage * getSource (const char * id);
@@ -111,6 +119,10 @@
 	bool m_scaleChange;
 	/// flip image vertically
 	bool m_flip;
+	/// use the Z buffer as a texture
+	bool m_zbuff;
+	/// extract the Z buffer with unisgned int precision
+	bool m_depth;
 
 	/// source image list
 	ImageSourceList m_sources;
@@ -347,7 +359,15 @@
 PyObject *Image_getSource (PyImage *self, PyObject *args);
 // set filter source object
 PyObject *Image_setSource (PyImage *self, PyObject *args);
-
+// get Z buffer
+PyObject * Image_getZbuff (PyImage * self, void * closure);
+// set Z buffer
+int Image_setZbuff (PyImage * self, PyObject * value, void * closure);
+// get depth
+PyObject * Image_getDepth (PyImage * self, void * closure);
+// set depth
+int Image_setDepth (PyImage * self, PyObject * value, void * closure);
+ 
 // get pixel filter object
 PyObject *Image_getFilter (PyImage *self, void *closure);
 // set pixel filter object

Modified: trunk/blender/source/gameengine/VideoTexture/ImageRender.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/ImageRender.cpp	2012-10-20 20:46:42 UTC (rev 51468)
+++ trunk/blender/source/gameengine/VideoTexture/ImageRender.cpp	2012-10-20 22:28:44 UTC (rev 51469)
@@ -385,6 +385,8 @@
 	{(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 using unsigned int precision", NULL},
 	{(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
 	{NULL}
 };
@@ -547,6 +549,8 @@
 	{(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},

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list