[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49865] branches/ge_harmony/source: Getting an alternate code path setup in gpu_material for reading from a light map .

Daniel Stokes kupomail at gmail.com
Mon Aug 13 06:39:48 CEST 2012


Revision: 49865
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49865
Author:   kupoman
Date:     2012-08-13 04:39:42 +0000 (Mon, 13 Aug 2012)
Log Message:
-----------
Getting an alternate code path setup in gpu_material for reading from a light map. Also adding an array to the OGL rasterizer of what render targets are enabled.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_extensions.h
    branches/ge_harmony/source/blender/gpu/GPU_material.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/ge_harmony/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-08-12 23:56:46 UTC (rev 49864)
+++ branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-08-13 04:39:42 UTC (rev 49865)
@@ -36,6 +36,50 @@
 extern "C" {
 #endif
 
+#define	GPU_R8
+#define	GPU_R16
+#define	GPU_R16F
+#define	GPU_R32F
+#define	GPU_R8I
+#define	GPU_R16I
+#define	GPU_R32I
+#define	GPU_R8UI
+#define	GPU_R16UI
+#define	GPU_R32UI
+
+#define	GPU_RG8
+#define	GPU_RG16
+#define	GPU_RG16F
+#define	GPU_RG32F
+#define	GPU_RG8I
+#define	GPU_RG16I
+#define	GPU_RG32I
+#define	GPU_RG8UI
+#define	GPU_RG16UI
+#define	GPU_RG32UI
+
+#define	GPU_RGB8
+#define	GPU_RGB16
+#define	GPU_RGB16F
+#define	GPU_RGB32F
+#define	GPU_RGB8I
+#define	GPU_RGB16I
+#define	GPU_RGB32I
+#define	GPU_RGB8UI
+#define	GPU_RGB16UI
+#define	GPU_RGB32UI
+
+#define	GPU_RGBA8
+#define	GPU_RGBA16
+#define	GPU_RGBA16F
+#define	GPU_RGBA32F
+#define	GPU_RGBA8I
+#define	GPU_RGBA16I
+#define	GPU_RGBA32I
+#define	GPU_RGBA8UI
+#define	GPU_RGBA16UI
+#define	GPU_RGBA32UI
+
 struct Image;
 struct ImageUser;
 

Modified: branches/ge_harmony/source/blender/gpu/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h	2012-08-12 23:56:46 UTC (rev 49864)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h	2012-08-13 04:39:42 UTC (rev 49865)
@@ -121,6 +121,7 @@
 GPUBlendMode GPU_material_alpha_blend(GPUMaterial *material, float obcol[4]);
 
 /* High level functions to create and use GPU materials */
+void GPU_material_set_light_map(unsigned int map);
 
 GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma);
 void GPU_material_free(struct Material *ma);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2012-08-12 23:56:46 UTC (rev 49864)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2012-08-13 04:39:42 UTC (rev 49865)
@@ -78,6 +78,8 @@
 				"emit",
 };
 
+static unsigned int light_map = -1;
+
 /* Structs */
 
 typedef enum DynMatProperty {
@@ -1020,12 +1022,22 @@
 	add_user_list(&lamp->materials, shi->gpumat->ma);
 }
 
+static void shade_map_light(GPUShadeInput *shi, GPUShadeResult *shr)
+{
+
+}
+
 static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
 {
 	Base *base;
 	Object *ob;
 	Scene *sce_iter;
 	GPULamp *lamp;
+
+	if (light_map != -1) {
+		shade_map_light(shi, shr);
+		return;
+	}
 	
 	for (SETLOOPER(shi->gpumat->scene, sce_iter, base)) {
 		ob= base->object;
@@ -1690,6 +1702,15 @@
 	return shr.combined;
 }
 
+void GPU_material_set_light_map(unsigned int map)
+{
+	Material *ma;
+	light_map = map;
+
+	for (ma=G.main->mat.first; ma; ma=ma->id.next)
+		GPU_material_free(ma);
+}
+
 GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
 {
 	GPUMaterial *mat;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-12 23:56:46 UTC (rev 49864)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-13 04:39:42 UTC (rev 49865)
@@ -92,8 +92,7 @@
 	m_last_frontface(true),
 	m_materialCachingInfo(0),
 	m_width(0),
-	m_height(0),
-	m_target_count(2)
+	m_height(0)
 {
 	m_viewmatrix.setIdentity();
 	m_viewinvmatrix.setIdentity();
@@ -112,6 +111,13 @@
 	{
 		m_color_target[i] = -1;
 	}
+
+	m_target_enabled[0] = true;
+	m_target_enabled[1] = true;
+
+	// Light Map (Handle this here to sneak in before material conversion)
+	glGenTextures(1, &m_light_target);
+	//GPU_material_set_light_map(m_light_target);
 }
 
 
@@ -120,6 +126,8 @@
 {
 	// Restore the previous AF value
 	GPU_set_anisotropic(m_prevafvalue);
+	glDeleteTextures(1, &m_light_target);
+	//GPU_material_set_light_map(-1);
 }
 
 bool RAS_OpenGLRasterizer::Init()
@@ -154,7 +162,7 @@
 	// FBO
 	glGenFramebuffersEXT(1, &m_fbo);
 	glGenTextures(1, &m_depth_target);
-	glGenTextures(m_target_count, m_color_target);
+	glGenTextures(RAS_MAX_MRT, m_color_target);
 
 	return true;
 }
@@ -293,7 +301,7 @@
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
 
-	glDeleteTextures(m_target_count, m_color_target);
+	glDeleteTextures(RAS_MAX_MRT, m_color_target);
 	glDeleteTextures(1, &m_depth_target);
 	glDeleteFramebuffersEXT(1, &m_fbo);
 	
@@ -309,9 +317,12 @@
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
 	m_final_target = m_color_target[0];
 	
-	GLenum targets[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT};
-	glDrawBuffersARB(m_target_count, targets);
+	GLenum targets[RAS_MAX_MRT];
+	for (int i = 0; i < RAS_MAX_MRT; i++)
+		targets[i] = (m_target_enabled[i]) ? GL_COLOR_ATTACHMENT0_EXT+i : GL_NONE;
 
+	glDrawBuffersARB(RAS_MAX_MRT, targets);
+
 	// Blender camera routine destroys the settings
 	if (m_drawingmode < KX_SOLID)
 	{
@@ -565,9 +576,9 @@
 	
 	if (m_2DCanvas->GetWindowArea().GetRight() != m_width || m_2DCanvas->GetWindowArea().GetTop() != m_height)
 	{
-		GLenum internal_formats[2] = {GL_RGB16F, GL_RGB16F};
-		GLenum formats[2] = {GL_RGB, GL_RGB};
-		GLenum sizes[2] = {GL_HALF_FLOAT, GL_HALF_FLOAT};
+		GLenum internal_formats[RAS_MAX_MRT] = {GL_RGB16F, GL_RGB16F, GL_RGB16F, GL_RGB16F};
+		GLenum formats[RAS_MAX_MRT] = {GL_RGB, GL_RGB, GL_RGB, GL_RGB};
+		GLenum sizes[RAS_MAX_MRT] = {GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT};
 
 		m_width = m_2DCanvas->GetWindowArea().GetRight();
 		m_height = m_2DCanvas->GetWindowArea().GetTop();
@@ -575,9 +586,6 @@
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
 
 		//Update depth target
-		//glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depth_target);
-		//glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, m_width, m_height);
-		//glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depth_target);
 		glBindTexture(GL_TEXTURE_2D, m_depth_target);
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -587,15 +595,18 @@
 		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depth_target, 0);
 
 		//Update color targets
-		for (int i = 0; i < m_target_count; i++)
+		for (int i = 0; i < RAS_MAX_MRT; i++)
 		{
-			glBindTexture(GL_TEXTURE_2D, m_color_target[i]);
-			glTexImage2D(GL_TEXTURE_2D, 0, internal_formats[i], m_width, m_height, 0, formats[i], sizes[i], NULL);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_color_target[i], 0);
+			if (m_target_enabled[i])
+			{
+				glBindTexture(GL_TEXTURE_2D, m_color_target[i]);
+				glTexImage2D(GL_TEXTURE_2D, 0, internal_formats[i], m_width, m_height, 0, formats[i], sizes[i], NULL);
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+				glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_color_target[i], 0);
+			}
 		}
 
 		//Check completeness

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-12 23:56:46 UTC (rev 49864)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-13 04:39:42 UTC (rev 49865)
@@ -117,9 +117,10 @@
 	bool			m_last_frontface;
 
 	/* Framebuffer Object */
-	int				m_target_count;
+	bool			m_target_enabled[RAS_MAX_MRT];
 	unsigned int	m_fbo;
 	unsigned int	m_color_target[RAS_MAX_MRT];
+	unsigned int	m_light_target;
 	unsigned int	m_depth_target;
 	unsigned int	m_final_target;
 	int				m_width;




More information about the Bf-blender-cvs mailing list