[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16080] branches/apricot: Apricot Branch

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Aug 13 19:37:37 CEST 2008


Revision: 16080
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16080
Author:   blendix
Date:     2008-08-13 19:37:37 +0200 (Wed, 13 Aug 2008)

Log Message:
-----------
Apricot Branch
==============

Various cleanups and optimizations in the game engine:
* Remove some duplication in the RAS_RenderTools, and sync the blender
  and game player versions. Also avoid some opengl state changes.
* Don't make separate materials for triangles and quads, this distinction
  was moved to the mesh level. Also don't take some other irrelevant tface
  settings into account to avoid making more materials.
* Refactoring of mesh storage, should fix wrong normals on meshes that are
  reused. It also allows for joining together nearby meshes for speed, though
  that's disabled still because it doesn't work together correct yet with 
  ome features.
* Added a distinction for game objects to be either culled or set invisible,
  previously there was only one flag, which couldn't work correct.
* For parenting to bones, where_is_pose was executed multiple times per
  frame, now should be once per armature.
* Fix uninitialized intertia value in the physics system.
* Various warning fixes.
* Removed some conditionals in GLSL and other minor optimizations in the
  code. Also cache opengl uniform locations, and fix an invalid memory read.
* Avoid doing some math for GLSL lamps if it is not required.

Modified Paths:
--------------
    branches/apricot/intern/moto/include/GEN_Map.h
    branches/apricot/intern/moto/include/MT_Matrix4x4.h
    branches/apricot/intern/moto/include/MT_Matrix4x4.inl
    branches/apricot/source/blender/blenkernel/intern/armature.c
    branches/apricot/source/blender/gpu/GPU_extensions.h
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_codegen.h
    branches/apricot/source/blender/gpu/intern/gpu_extensions.c
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
    branches/apricot/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    branches/apricot/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    branches/apricot/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
    branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp
    branches/apricot/source/gameengine/Converter/BL_ArmatureObject.h
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/Converter/BL_MeshDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_ShapeActionActuator.cpp
    branches/apricot/source/gameengine/Converter/BL_ShapeDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinDeformer.h
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.h
    branches/apricot/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/apricot/source/gameengine/Converter/KX_ConvertActuators.cpp
    branches/apricot/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    branches/apricot/source/gameengine/GamePlayer/common/GPC_RenderTools.h
    branches/apricot/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/apricot/source/gameengine/Ketsji/BL_Material.h
    branches/apricot/source/gameengine/Ketsji/BL_Shader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_Shader.h
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/apricot/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.h
    branches/apricot/source/gameengine/Ketsji/KX_MeshProxy.cpp
    branches/apricot/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    branches/apricot/source/gameengine/Ketsji/KX_PolygonMaterial.h
    branches/apricot/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Scene.cpp
    branches/apricot/source/gameengine/Ketsji/KX_VertexProxy.cpp
    branches/apricot/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
    branches/apricot/source/gameengine/Physics/Bullet/CcdPhysicsController.h
    branches/apricot/source/gameengine/Rasterizer/RAS_BucketManager.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_BucketManager.h
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    branches/apricot/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/apricot/source/gameengine/Rasterizer/RAS_IRenderTools.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_IRenderTools.h
    branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.h
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.h
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
    branches/apricot/source/gameengine/Rasterizer/RAS_Polygon.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_Polygon.h
    branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.h
    branches/apricot/source/gameengine/Rasterizer/SConscript
    branches/apricot/source/kernel/gen_system/GEN_Map.h

Modified: branches/apricot/intern/moto/include/GEN_Map.h
===================================================================
--- branches/apricot/intern/moto/include/GEN_Map.h	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/intern/moto/include/GEN_Map.h	2008-08-13 17:37:37 UTC (rev 16080)
@@ -50,6 +50,19 @@
             m_buckets[i] = 0;
         }
     }
+
+	GEN_Map(const GEN_Map& map)
+	{
+		m_num_buckets = map.m_num_buckets;
+		m_buckets = new Entry *[m_num_buckets];
+
+		for (int i = 0; i < m_num_buckets; ++i) {
+			m_buckets[i] = 0;
+
+			for(Entry *entry = map.m_buckets[i]; entry; entry=entry->m_next)
+				insert(entry->m_key, entry->m_value);
+		}
+	}
     
     int size() { 
         int count=0;

Modified: branches/apricot/intern/moto/include/MT_Matrix4x4.h
===================================================================
--- branches/apricot/intern/moto/include/MT_Matrix4x4.h	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/intern/moto/include/MT_Matrix4x4.h	2008-08-13 17:37:37 UTC (rev 16080)
@@ -212,6 +212,7 @@
 	MT_Matrix4x4 transposed() const; 
 	void         transpose();
 
+	MT_Matrix4x4 inverse() const;
 	void         invert();
   
 protected:

Modified: branches/apricot/intern/moto/include/MT_Matrix4x4.inl
===================================================================
--- branches/apricot/intern/moto/include/MT_Matrix4x4.inl	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/intern/moto/include/MT_Matrix4x4.inl	2008-08-13 17:37:37 UTC (rev 16080)
@@ -52,15 +52,15 @@
 		}
 }
 
-/* We do things slightly different here, because the invert() modifies
- * the buffer itself. This makes it impossible to make this op right
- * away. Like other, still missing facilities, I will repair this
- * later. */
-/* GEN_INLINE T_Matrix4x4 MT_Matrix4x4::inverse() const */
-/*  { */
-/*  } */
+GEN_INLINE MT_Matrix4x4 MT_Matrix4x4::inverse() const
+{
+	MT_Matrix4x4 invmat = *this;
 
+	invmat.invert();
 
+	return invmat;
+}
+
 GEN_INLINE MT_Matrix4x4& MT_Matrix4x4::operator*=(const MT_Matrix4x4& m)
 {
 	setValue(m.tdot(0, m_el[0]), m.tdot(1, m_el[0]), m.tdot(2, m_el[0]), m.tdot(3, m_el[0]),

Modified: branches/apricot/source/blender/blenkernel/intern/armature.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/armature.c	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/source/blender/blenkernel/intern/armature.c	2008-08-13 17:37:37 UTC (rev 16080)
@@ -2295,8 +2295,9 @@
 					
 					/* 4. walk over the tree for regular solving */
 					for(a=0; a<tree->totchannel; a++) {
-						if(!(tree->pchan[a]->flag & POSE_DONE))	// successive trees can set the flag
+						if(!(tree->pchan[a]->flag & POSE_DONE))	{// successive trees can set the flag
 							where_is_pose_bone(ob, tree->pchan[a], ctime);
+						}
 					}
 					/* 5. execute the IK solver */
 					execute_posetree(ob, tree);

Modified: branches/apricot/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_extensions.h	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/source/blender/gpu/GPU_extensions.h	2008-08-13 17:37:37 UTC (rev 16080)
@@ -120,9 +120,10 @@
 void GPU_shader_bind(GPUShader *shader);
 void GPU_shader_unbind();
 
-void GPU_shader_uniform_vector(GPUShader *shader, char *name, int length,
+int GPU_shader_get_uniform(GPUShader *shader, char *name);
+void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
 	int arraysize, float *value);
-void GPU_shader_uniform_texture(GPUShader *shader, char *name, GPUTexture *tex);
+void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex);
 
 int GPU_shader_get_attribute(GPUShader *shader, char *name);
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-08-13 17:37:37 UTC (rev 16080)
@@ -144,6 +144,7 @@
 	struct ImageUser *iuser;/* image user */
 	float *dynamicvec;		/* vector data in case it is dynamic */
 	GPUTexture *tex;		/* input texture, only set at runtime */
+	int shaderloc;			/* id from opengl */
 	char shadername[32];	/* name in shader */
 
 	float vec[16];			/* vector data */
@@ -683,7 +684,7 @@
 	BLI_dynstr_append(ds, ";\n");
 }
 
-static char *code_generate_fragment(ListBase *nodes, GPUOutput *output)
+static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const char *name)
 {
 	DynStr *ds = BLI_dynstr_new();
 	char *code;
@@ -693,6 +694,9 @@
 	codegen_set_unique_ids(nodes);
 	codegen_print_uniforms_functions(ds, nodes);
 
+	//if(G.f & G_DEBUG)
+	//	BLI_dynstr_printf(ds, "/* %s */\n", name);
+
 	BLI_dynstr_append(ds, "void main(void)\n");
 	BLI_dynstr_append(ds, "{\n");
 
@@ -705,7 +709,7 @@
 	code = BLI_dynstr_get_cstring(ds);
 	BLI_dynstr_free(ds);
 
-	if(G.f & G_DEBUG) printf("%s\n", code);
+	//if(G.f & G_DEBUG) printf("%s\n", code);
 
 	return code;
 }
@@ -766,7 +770,7 @@
 	GPUNode *node;
 	GPUInput *next, *input;
 	ListBase *inputs = &pass->inputs;
-	int extract;
+	int extract, z;
 
 	memset(inputs, 0, sizeof(*inputs));
 
@@ -776,7 +780,8 @@
 	GPU_shader_bind(shader);
 
 	for (node=nodes->first; node; node=node->next) {
-		for (input=node->inputs.first; input; input=next) {
+		z = 0;
+		for (input=node->inputs.first; input; input=next, z++) {
 			next = input->next;
 
 			/* attributes don't need to be bound, they already have
@@ -800,6 +805,9 @@
 			else if(input->dynamicvec)
 				extract = 1;
 
+			if(extract)
+				input->shaderloc = GPU_shader_get_uniform(shader, input->shadername);
+
 			/* extract nodes */
 			if(extract) {
 				BLI_remlink(&node->inputs, input);
@@ -830,7 +838,7 @@
 		if(input->ima || input->tex) {
 			if(input->tex) {
 				GPU_texture_bind(input->tex, input->texid);
-				GPU_shader_uniform_texture(shader, input->shadername, input->tex);
+				GPU_shader_uniform_texture(shader, input->shaderloc, input->tex);
 			}
 		}
 	}
@@ -848,7 +856,7 @@
 	/* pass dynamic inputs to opengl, others were removed */
 	for (input=inputs->first; input; input=input->next)
 		if(!(input->ima || input->tex))
-			GPU_shader_uniform_vector(shader, input->shadername, input->type, 1,
+			GPU_shader_uniform_vector(shader, input->shaderloc, input->type, 1,
 				input->dynamicvec);
 }
 
@@ -926,6 +934,8 @@
 		if(strcmp(name, "set_value")==0 || strcmp(name, "set_rgb")==0) {
 			input = MEM_dupallocN(outnode->inputs.first);
 			input->type = type;
+			if(input->link)
+				input->link->users++;
 			BLI_addtail(&node->inputs, input);
 			return;
 		}
@@ -1049,9 +1059,8 @@
 	GPUInput *input;
 
 	for(input=inputs->first; input; input=input->next) {
-		if(input->link) {
+		if(input->link)
 			GPU_node_link_free(input->link);
-		}
 		else if(input->tex && !input->dynamictex)
 			GPU_texture_free(input->tex);
 	}
@@ -1379,7 +1388,7 @@
 	}
 }
 
-GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins)
+GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttribs *attribs, int *builtins, const char *name)
 {
 	GPUShader *shader;
 	GPUPass *pass;
@@ -1397,7 +1406,7 @@
 	gpu_nodes_get_builtin_flag(nodes, builtins);
 
 	/* generate code and compile with opengl */
-	fragmentcode = code_generate_fragment(nodes, outlink->output);
+	fragmentcode = code_generate_fragment(nodes, outlink->output, name);
 	vertexcode = code_generate_vertex(nodes);
 	shader = GPU_shader_create(vertexcode, fragmentcode, FUNCTION_LIB);
 	MEM_freeN(fragmentcode);

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.h	2008-08-13 17:37:37 UTC (rev 16080)
@@ -67,7 +67,7 @@
 typedef struct GPUPass GPUPass;
 
 GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink,
-	struct GPUVertexAttribs *attribs, int *builtin);
+	struct GPUVertexAttribs *attribs, int *builtin, const char *name);
 
 struct GPUShader *GPU_pass_shader(GPUPass *pass);
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-08-13 17:34:09 UTC (rev 16079)
+++ branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-08-13 17:37:37 UTC (rev 16080)
@@ -955,7 +955,6 @@
 	return shader;
 }
 
-
 void GPU_shader_bind(GPUShader *shader)
 {
 	GPU_print_error("Pre Shader Bind");
@@ -983,22 +982,24 @@
 	MEM_freeN(shader);
 }
 
+int GPU_shader_get_uniform(GPUShader *shader, char *name)
+{
+	return glGetUniformLocationARB(shader->object, name);
+}
 
-void GPU_shader_uniform_vector(GPUShader *shader, char *name, int length, int arraysize, float *value)
+void GPU_shader_uniform_vector(GPUShader *shader, int location, int length, int arraysize, float *value)
 {
-	GLint location = glGetUniformLocationARB(shader->object, name);
-
 	if(location == -1)
 		return;
 
 	GPU_print_error("Pre Uniform Vector");
 
-	/*if (length == 1) printf("%s %f\n", name, value[0]);
-	else if (length == 2) printf("%s %f %f\n", name, value[0], value[1]);
-	else if (length == 3) { printf("%s ", name); printvecf("", value); }
-	else if (length == 4) { printf("%s ", name); printquat("", value); }
-	else if (length == 9) { printf("%s ", name); printmatrix3("", (float(*)[3])value); }
-	else if (length == 16) { printf("%s ", name); printmatrix4("", (float(*)[4])value); }*/
+	/*if (length == 1) fprintf(stderr, "%d %s %f\n", location, name, value[0]);
+	else if (length == 2) fprintf(stderr, "%d %s %f %f\n", location, name, value[0], value[1]);
+	else if (length == 3) { fprintf(stderr, "%d %s ", location, name); printvecf("", value); }
+	else if (length == 4) { fprintf(stderr, "%d %s ", location, name); printquat("", value); }
+	else if (length == 9) { fprintf(stderr, "%d %s ", location, name); printmatrix3("", (float(*)[3])value); }
+	else if (length == 16) { fprintf(stderr, "%d %s ", location, name); printmatrix4("", (float(*)[4])value); }*/
 
 	if (length == 1) glUniform1fvARB(location, arraysize, value);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list