[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