[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54965] trunk/blender/source/gameengine: Fix #34483: game engine multi UV glsl materials not working correct after changes

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Mar 1 21:45:43 CET 2013


Revision: 54965
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54965
Author:   blendix
Date:     2013-03-01 20:45:42 +0000 (Fri, 01 Mar 2013)
Log Message:
-----------
Fix #34483: game engine multi UV glsl materials not working correct after changes
to support more than 2 UV maps. This code indirectly depended on the order of
OpenGL attribute ID's assigned by the OpenGL driver being the same as the
attributes being declared in the GLSL shader code, which is not always the case.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h

Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-03-01 20:45:42 UTC (rev 54965)
@@ -80,7 +80,7 @@
 {
 	GPUVertexAttribs attribs;
 	GPUMaterial *gpumat;
-	int i, attrib_num;
+	int i, attrib_num, uv = 0;
 
 	ras->SetAttribNum(0);
 
@@ -103,7 +103,7 @@
 				continue;
 
 			if (attribs.layer[i].type == CD_MTFACE)
-				ras->SetAttrib(RAS_IRasterizer::RAS_TEXCO_UV, attribs.layer[i].glindex);
+				ras->SetAttrib(RAS_IRasterizer::RAS_TEXCO_UV, attribs.layer[i].glindex, uv++);
 			else if (attribs.layer[i].type == CD_TANGENT)
 				ras->SetAttrib(RAS_IRasterizer::RAS_TEXTANGENT, attribs.layer[i].glindex);
 			else if (attribs.layer[i].type == CD_ORCO)

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2013-03-01 20:45:42 UTC (rev 54965)
@@ -396,7 +396,7 @@
 	virtual void	SetTexCoordNum(int num) = 0;
 	virtual void	SetAttribNum(int num) = 0;
 	virtual void	SetTexCoord(TexCoGen coords, int unit) = 0;
-	virtual void	SetAttrib(TexCoGen coords, int unit) = 0;
+	virtual void	SetAttrib(TexCoGen coords, int unit, int layer = 0) = 0;
 
 	virtual const MT_Matrix4x4&	GetViewMatrix() const = 0;
 	virtual const MT_Matrix4x4&	GetViewInvMatrix() const = 0;

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-03-01 20:45:42 UTC (rev 54965)
@@ -116,19 +116,19 @@
 
 	if (m_storage_type == RAS_VBO /*|| m_storage_type == RAS_AUTO_STORAGE && GLEW_ARB_vertex_buffer_object*/)
 	{
-		m_storage = new RAS_StorageVBO(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
-		m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+		m_storage = new RAS_StorageVBO(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
+		m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
 		m_storage_type = RAS_VBO;
 	}
 	else if ((m_storage_type == RAS_VA) || (m_storage_type == RAS_AUTO_STORAGE && GLEW_VERSION_1_1))
 	{
-		m_storage = new RAS_StorageVA(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
-		m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+		m_storage = new RAS_StorageVA(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
+		m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
 		m_storage_type = RAS_VA;
 	}
 	else
 	{
-		m_storage = m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+		m_storage = m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
 		m_storage_type = RAS_IMMEDIATE;
 	}
 }
@@ -740,11 +740,13 @@
 		m_texco[unit] = coords;
 }
 
-void RAS_OpenGLRasterizer::SetAttrib(TexCoGen coords, int unit)
+void RAS_OpenGLRasterizer::SetAttrib(TexCoGen coords, int unit, int layer)
 {
 	// this changes from material to material
-	if (unit < RAS_MAX_ATTRIB)
+	if (unit < RAS_MAX_ATTRIB) {
 		m_attrib[unit] = coords;
+		m_attrib_layer[unit] = layer;
+	}
 }
 
 void RAS_OpenGLRasterizer::IndexPrimitives(RAS_MeshSlot& ms)

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2013-03-01 20:45:42 UTC (rev 54965)
@@ -109,6 +109,7 @@
 	int				m_drawingmode;
 	TexCoGen		m_texco[RAS_MAX_TEXCO];
 	TexCoGen		m_attrib[RAS_MAX_ATTRIB];
+	int				m_attrib_layer[RAS_MAX_ATTRIB];
 	int				m_texco_num;
 	int				m_attrib_num;
 	//int				m_last_alphablend;
@@ -296,7 +297,7 @@
 	virtual void SetTexCoordNum(int num);
 	virtual void SetAttribNum(int num);
 	virtual void SetTexCoord(TexCoGen coords, int unit);
-	virtual void SetAttrib(TexCoGen coords, int unit);
+	virtual void SetAttrib(TexCoGen coords, int unit, int layer = 0);
 
 	void TexCoord(const RAS_TexVert &tv);
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp	2013-03-01 20:45:42 UTC (rev 54965)
@@ -39,11 +39,12 @@
 	#include "BKE_DerivedMesh.h"
 }
 
-RAS_StorageIM::RAS_StorageIM(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib) :
+RAS_StorageIM::RAS_StorageIM(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer) :
 	m_texco_num(texco_num),
 	m_attrib_num(attrib_num),
 	m_texco(texco),
-	m_attrib(attrib)
+	m_attrib(attrib),
+	m_attrib_layer(attrib_layer)
 {
 }
 RAS_StorageIM::~RAS_StorageIM()
@@ -95,7 +96,6 @@
 	}
 
 	if (GLEW_ARB_vertex_program) {
-		int uv = 0;
 		for (unit = 0; unit < *m_attrib_num; unit++) {
 			switch (m_attrib[unit]) {
 				case RAS_IRasterizer::RAS_TEXCO_ORCO:
@@ -103,7 +103,7 @@
 					glVertexAttrib3fvARB(unit, tv.getXYZ());
 					break;
 				case RAS_IRasterizer::RAS_TEXCO_UV:
-					glVertexAttrib2fvARB(unit, tv.getUV(uv++));
+					glVertexAttrib2fvARB(unit, tv.getUV(m_attrib_layer[unit]));
 					break;
 				case RAS_IRasterizer::RAS_TEXCO_NORM:
 					glVertexAttrib3fvARB(unit, tv.getNormal());

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h	2013-03-01 20:45:42 UTC (rev 54965)
@@ -34,7 +34,7 @@
 class RAS_StorageIM : public RAS_IStorage
 {
 public:
-	RAS_StorageIM(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib);
+	RAS_StorageIM(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer);
 	virtual ~RAS_StorageIM();
 
 	virtual bool	Init();
@@ -51,6 +51,7 @@
 	int*			m_attrib_num;
 	RAS_IRasterizer::TexCoGen*		m_texco;
 	RAS_IRasterizer::TexCoGen*		m_attrib;
+	int*			                m_attrib_layer;
 
 	void	TexCoord(const RAS_TexVert &tv);
 	void	SetCullFace(bool enable);

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp	2013-03-01 20:45:42 UTC (rev 54965)
@@ -29,13 +29,14 @@
 
 #include "GL/glew.h"
 
-RAS_StorageVA::RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib) :
+RAS_StorageVA::RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer) :
 	m_texco_num(texco_num),
 	m_attrib_num(attrib_num),
 	m_last_texco_num(0),
 	m_last_attrib_num(0),
 	m_texco(texco),
-	m_attrib(attrib)
+	m_attrib(attrib),
+	m_attrib_layer(attrib_layer)
 {
 }
 
@@ -214,7 +215,6 @@
 	}
 
 	if (GLEW_ARB_vertex_program) {
-		int uv = 0;
 		for (unit = 0; unit < *m_attrib_num; unit++) {
 			switch (m_attrib[unit]) {
 				case RAS_IRasterizer::RAS_TEXCO_ORCO:
@@ -222,7 +222,7 @@
 					glVertexAttribPointerARB(unit, 3, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getXYZ());
 					break;
 				case RAS_IRasterizer::RAS_TEXCO_UV:
-					glVertexAttribPointerARB(unit, 2, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getUV(uv++));
+					glVertexAttribPointerARB(unit, 2, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getUV(m_attrib_layer[unit]));
 					break;
 				case RAS_IRasterizer::RAS_TEXCO_NORM:
 					glVertexAttribPointerARB(unit, 3, GL_FLOAT, GL_FALSE, sizeof(RAS_TexVert), tv->getNormal());

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h	2013-03-01 20:45:42 UTC (rev 54965)
@@ -37,7 +37,7 @@
 {
 
 public:
-	RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib);
+	RAS_StorageVA(int *texco_num, RAS_IRasterizer::TexCoGen *texco, int *attrib_num, RAS_IRasterizer::TexCoGen *attrib, int *attrib_layer);
 	virtual ~RAS_StorageVA();
 
 	virtual bool	Init();
@@ -59,6 +59,7 @@
 
 	RAS_IRasterizer::TexCoGen*		m_texco;
 	RAS_IRasterizer::TexCoGen*		m_attrib;
+	int*			                m_attrib_layer;
 
 	RAS_IRasterizer::TexCoGen		m_last_texco[RAS_MAX_TEXCO];
 	RAS_IRasterizer::TexCoGen		m_last_attrib[RAS_MAX_ATTRIB];

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp	2013-03-01 19:15:32 UTC (rev 54964)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp	2013-03-01 20:45:42 UTC (rev 54965)
@@ -101,10 +101,10 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list