[Bf-blender-cvs] [e4ea5e5810] ge_2df_textures: BGE: 2D filter additions.

Benoit Bolsee noreply at git.blender.org
Tue Mar 21 00:51:18 CET 2017


Commit: e4ea5e5810928ed3da2119a9a4a646bb6991436d
Author: Benoit Bolsee
Date:   Tue Mar 21 00:26:52 2017 +0100
Branches: ge_2df_textures
https://developer.blender.org/rBe4ea5e5810928ed3da2119a9a4a646bb6991436d

BGE: 2D filter additions.

gpu_draw: skip color management for textures declared as 'non-color'.

New reserved names in 2D filters: bgl_ObjectTextureX (X=0 to 4) to
access texture channels 0 to 4 of the object on which the 2D filter
is defined.

Force U.use_16bit_textures to 1 in the blender player to give access to
floating point textures in the 2D fitlers shaders.

bge.logic.setOffScreen(True) to define and use a floating point offscreen
render buffer of the same size than the framebuffer in the main BGE loop.
Useful to get floating point results from 2D filters. The offscreen render
buffer will automatically be used by bge.texture.ImageViewport if it's enabled.
It is legal to call bge.logic.setOffScreen(True/False) to disable and reenable
the framebuffer on a frame by frame basis.

New refresh mode for bge.texture.ImageViewport and bge.texture.ImageRender
objects:
iv.refresh(buffer, mode)
  mode = "DEPTH" to retrieve floating point depth buffer
       = "RG32F" to retrieve red and green channels as floating point.
       = "RGB32F" to retrieve red, green and blue channels as floating point
       = "RGBA32F" to retrieve red, green, blue and alpha channels as floating point.
For ImageViewport and ImageRender, refresh() bypasses all filters and object
options and retrieve directly from the frame buffer or render buffer.

===================================================================

M	source/blender/gpu/intern/gpu_draw.c
M	source/gameengine/Converter/KX_ConvertActuators.cpp
M	source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
M	source/gameengine/GameLogic/SCA_2DFilterActuator.h
M	source/gameengine/GameLogic/SCA_IScene.h
M	source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
M	source/gameengine/Ketsji/KX_KetsjiEngine.cpp
M	source/gameengine/Ketsji/KX_KetsjiEngine.h
M	source/gameengine/Ketsji/KX_PythonInit.cpp
M	source/gameengine/Ketsji/KX_Scene.cpp
M	source/gameengine/Ketsji/KX_Scene.h
M	source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
M	source/gameengine/Rasterizer/RAS_2DFilterManager.h
M	source/gameengine/Rasterizer/RAS_IOffScreen.h
M	source/gameengine/Rasterizer/RAS_IRasterizer.h
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
M	source/gameengine/VideoTexture/ImageBase.cpp
M	source/gameengine/VideoTexture/ImageBase.h
M	source/gameengine/VideoTexture/ImageRender.cpp
M	source/gameengine/VideoTexture/ImageRender.h
M	source/gameengine/VideoTexture/ImageViewport.cpp
M	source/gameengine/VideoTexture/ImageViewport.h

===================================================================

diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 7936811ab4..83b9b07fc3 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -641,7 +641,7 @@ int GPU_verify_image(
 		}
 
 		/* TODO unneeded when float images are correctly treated as linear always */
-		if (!is_data) {
+		if (!is_data && !(ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA)) {
 			do_color_management = true;
 		}
 	}
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index 974dcbca95..1764367317 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -69,6 +69,7 @@
 #include "KX_SCA_DynamicActuator.h"
 #include "KX_SteeringActuator.h"
 #include "KX_MouseActuator.h"
+#include "KX_BlenderMaterial.h"
 
 #include "KX_Scene.h"
 #include "KX_KetsjiEngine.h"
@@ -911,6 +912,7 @@ void BL_ConvertActuators(const char* maggiename,
 		{
 			bTwoDFilterActuator *_2dfilter = (bTwoDFilterActuator*) bact->data;
 			SCA_2DFilterActuator *tmp = NULL;
+			BL_Material *mat = NULL;
 
 			RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode;
 			switch (_2dfilter->type) {
@@ -949,6 +951,16 @@ void BL_ConvertActuators(const char* maggiename,
 					break;
 				case ACT_2DFILTER_CUSTOMFILTER:
 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER;
+					if (gameobj->GetMeshCount() > 0) {
+						unsigned int matid = 0;
+						RAS_MeshMaterial *meshMat = gameobj->GetMesh(0)->GetMeshMaterial(matid);
+						if (meshMat != NULL && meshMat->m_bucket != NULL) {
+							RAS_IPolyMaterial *polymat = meshMat->m_bucket->GetPolyMaterial();
+							if (polymat->GetFlag() & RAS_BLENDERGLSL) {
+								mat = ((KX_BlenderMaterial *)polymat)->GetBLMaterial();
+							}
+						}
+					}
 					break;
 				case ACT_2DFILTER_NOFILTER:
 					filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER;
@@ -964,7 +976,7 @@ void BL_ConvertActuators(const char* maggiename,
 					break;
 			}
 
-			tmp = new SCA_2DFilterActuator(gameobj, filtermode,  _2dfilter->flag,
+			tmp = new SCA_2DFilterActuator(gameobj, mat, filtermode,  _2dfilter->flag,
 			                               _2dfilter->float_arg, _2dfilter->int_arg,
 			                               ketsjiEngine->GetRasterizer(), scene);
 
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
index 6a87d3ccb9..b2e2a74b44 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
@@ -40,6 +40,7 @@ SCA_2DFilterActuator::~SCA_2DFilterActuator()
 
 SCA_2DFilterActuator::SCA_2DFilterActuator(
         SCA_IObject *gameobj,
+        BL_Material *mat,
         RAS_2DFilterManager::RAS_2DFILTER_MODE type,
         short flag,
         float float_arg,
@@ -55,9 +56,11 @@ SCA_2DFilterActuator::SCA_2DFilterActuator(
       m_scene(scene)
 {
 	m_gameobj = NULL;
+	m_mat = NULL;
 	if (gameobj) {
 		m_propNames = gameobj->GetPropertyNames();
 		m_gameobj = gameobj;
+		m_mat = mat;
 	}
 }
 
@@ -90,7 +93,7 @@ bool SCA_2DFilterActuator::Update()
 	}
 	else if (m_type < RAS_2DFilterManager::RAS_2DFILTER_NUMBER_OF_FILTERS)
 	{
-		m_scene->Update2DFilter(m_propNames, m_gameobj, m_type, m_int_arg, m_shaderText);
+		m_scene->Update2DFilter(m_propNames, m_gameobj, m_mat, m_type, m_int_arg, m_shaderText);
 	}
 	// once the filter is in place, no need to update it again => disable the actuator
 	return false;
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
index 4635a8ad9f..eb9f3a7984 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
@@ -35,6 +35,8 @@
 #include "SCA_IActuator.h"
 #include "SCA_IScene.h"
 
+class BL_Material;
+
 class SCA_2DFilterActuator : public SCA_IActuator
 {
 	Py_Header
@@ -48,11 +50,13 @@ private:
 	STR_String	m_shaderText;
 	RAS_IRasterizer* m_rasterizer;
 	SCA_IScene* m_scene;
+	BL_Material* m_mat;
 
 public:
 
 	SCA_2DFilterActuator(
 	        class SCA_IObject* gameobj,
+	        BL_Material *mat,
 	        RAS_2DFilterManager::RAS_2DFILTER_MODE type,
 	        short flag,
 	        float float_arg,
diff --git a/source/gameengine/GameLogic/SCA_IScene.h b/source/gameengine/GameLogic/SCA_IScene.h
index b76b5636b1..f5e9a73d02 100644
--- a/source/gameengine/GameLogic/SCA_IScene.h
+++ b/source/gameengine/GameLogic/SCA_IScene.h
@@ -74,7 +74,8 @@ public:
 	void			RemoveDebugProperty(class CValue *gameobj, const STR_String &name);
 	void			RemoveObjectDebugProperties(class CValue* gameobj);
 
-	virtual void	Update2DFilter(std::vector<STR_String>& propNames, void* gameObj, 
+	virtual void	Update2DFilter(std::vector<STR_String>& propNames, void* gameObj,
+	                               void *mat,
 									RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, 
 									int pass, STR_String& text) {}
 
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 0c206dfce3..e5ee60c89a 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -562,6 +562,7 @@ int main(
 	U.anisotropic_filter = 2;
 	// enable fast mipmap generation
 	U.use_gpu_mipmap = 1;
+	U.use_16bit_textures = 1;
 
 	BKE_sound_init_once();
 
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index b0a8e376eb..fc4d00ce6d 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -52,6 +52,7 @@
 #include "RAS_IRasterizer.h"
 #include "RAS_ICanvas.h"
 #include "RAS_ILightObject.h"
+#include "RAS_IOffScreen.h"
 #include "MT_Vector3.h"
 #include "MT_Transform.h"
 #include "SCA_IInputDevice.h"
@@ -109,6 +110,7 @@ double KX_KetsjiEngine::m_average_framerate = 0.0;
 bool   KX_KetsjiEngine::m_restrict_anim_fps = false;
 short  KX_KetsjiEngine::m_exitkey = 130; // ESC Key
 bool   KX_KetsjiEngine::m_doRender = true;
+bool   KX_KetsjiEngine::m_doOffScreen = false;
 
 /**
  *	Constructor of the Ketsji Engine
@@ -116,6 +118,7 @@ bool   KX_KetsjiEngine::m_doRender = true;
 KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
 	:	m_canvas(NULL),
 	m_rasterizer(NULL),
+    m_offScreenRender(NULL),
 	m_kxsystem(system),
 	m_sceneconverter(NULL),
 	m_networkdevice(NULL),
@@ -778,6 +781,16 @@ bool KX_KetsjiEngine::NextFrame()
 	return doRender && m_doRender;
 }
 
+void KX_KetsjiEngine::BindOffScreen(bool bind)
+{
+	if (m_doOffScreen && m_offScreenRender)
+	{
+		if (bind)
+			m_offScreenRender->Bind(RAS_IOffScreen::RAS_OFS_BIND_READ);
+		else
+			m_offScreenRender->Unbind();
+	}
+}
 
 
 void KX_KetsjiEngine::Render()
@@ -797,9 +810,12 @@ void KX_KetsjiEngine::Render()
 	if (m_hideCursor)
 		m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
 
+	m_canvas->BeginDraw();
+	// redirect render if requested
+	if (m_doOffScreen && m_offScreenRender)
+		m_offScreenRender->Bind(RAS_IOffScreen::RAS_OFS_BIND_RENDER);
 	// clear the entire game screen with the border color
 	// only once per frame
-	m_canvas->BeginDraw();
 	if (m_rasterizer->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) {
 		m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
 		if (m_overrideFrameColor)
@@ -845,7 +861,10 @@ void KX_KetsjiEngine::Render()
 		//scene->UpdateMeshTransformations();
 
 		// shadow buffers
-		RenderShadowBuffers(scene);
+		if (RenderShadowBuffers(scene) && m_doOffScreen && m_offScreenRender)
+			// shadow render restore the frame buffer, must restore it if we have a customer render buffer
+			m_offScreenRender->Bind(RAS_IOffScreen::RAS_OFS_BIND_RENDER);
+
 
 		// Avoid drawing the scene with the active camera twice when its viewport is enabled
 		if (cam && !cam->GetViewport())
@@ -929,6 +948,8 @@ void KX_KetsjiEngine::Render()
 			PostRenderScene(scene);
 		}
 	} // if (m_rasterizer->Stereo())
+	if (m_doOffScreen && m_offScreenRender)
+		m_offScreenRender->Unbind();
 
 	EndFrame();
 }
@@ -1085,10 +1106,11 @@ void KX_KetsjiEngine::UpdateAnimations(KX_Scene *scene)
 		scene->UpdateAnimations(m_frameTime);
 }
 
-void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
+bool KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
 {
 	CListValue *lightlist = scene->GetLightList();
 	int i, drawmode;
+	bool hasShadow = false;
 
 	m_rasterizer->SetAuxilaryClientInfo(scene);
 
@@ -1135,10 +1157,12 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
 			raslight->UnbindShadowBuffer();
 			m_rasterizer->SetDrawingMode(drawmode);
 			cam->Release();
+			hasShadow = true;
 		}
 	}
 	/* remember that we have a valid shadow buffer for that scene */
 	scene->SetShadowDone(true);
+	return hasShadow;
 }
 	
 // update graphics
@@ -1335,6 +1359,11 @@ void KX_KetsjiEngine::StopEngine()
 		}
 		m_scenes.clear();
 
+		if (m_offScreenRender)
+		{
+			delete m_offScreenRender;
+			m_offScreenRender = NULL;
+		}
 		// cleanup all the stuff
 		m_rasterizer->Exit();
 	}
@@ -1941,6 +1970,17 @@ bool KX_KetsjiEngine::GetRender()
 	return m_doRender;
 }
 
+void KX_KetsjiEngine::SetOffScreen(bool offScreen)
+{
+	m_doOffScreen = offScreen;
+	if (offScreen && !m_offScreenRender)
+	{
+		// offscreen render requested, create the offscreen render buffer
+		m_offScreenRender = m_rasterizer->CreateOffScreen(m_canvas->GetWidth(), m_canvas->GetHeight(), 0, RAS_IOffScreen::RAS_OFS_RENDER_BUFFER, RAS_IOffScreen::RAS_OFS_COLOR_FLOAT);
+	}
+}
+
+
 void KX_KetsjiEngine::SetShowFramerate(bool frameRate)
 {
 	m_show_framerate = frameRate;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 1756214b6d..53597c7d5d 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -74,6 +74,7 @@ class KX_KetsjiEngine
 private:
 	class RAS_ICanvas*					m_canvas; // 2D Canvas (2D Rendering Device Context)
 	class RAS_IRasterizer*				m_rasterizer;  // 3D Rasterizer (3D Rendering)
+	class RAS_IOffScreen*				m_offScreenRender;	// render in render buffer instead

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list