[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29698] branches/soc-2010-moguri/source/ blender/gpu/intern/gpu_material.c: Adding support for uniform values from RNA values.

Mitchell Stokes mogurijin at gmail.com
Sat Jun 26 01:13:37 CEST 2010


Revision: 29698
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29698
Author:   moguri
Date:     2010-06-26 01:13:37 +0200 (Sat, 26 Jun 2010)

Log Message:
-----------
Adding support for uniform values from RNA values. Currently the following are supported:

 * diffuse_color
 * specular_colir
 * alpha
 * emit

More can be added easily.

Modified Paths:
--------------
    branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c

Modified: branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c	2010-06-25 22:45:42 UTC (rev 29697)
+++ branches/soc-2010-moguri/source/blender/gpu/intern/gpu_material.c	2010-06-25 23:13:37 UTC (rev 29698)
@@ -44,6 +44,8 @@
 #include "DNA_view3d_types.h"
 #include "DNA_world_types.h"
 
+#include "RNA_access.h"
+
 #include "BKE_anim.h"
 #include "BKE_colortools.h"
 #include "BKE_DerivedMesh.h"
@@ -65,6 +67,15 @@
 
 #include <string.h>
 
+/* Supported RNA values for uniforms */
+#define rna_floats_size 4
+char* rna_floats[rna_floats_size] = {
+				"diffuse_color",
+				"specular_color",
+				"alpha",
+				"emit",
+};
+
 /* Structs */
 
 typedef enum DynMatProperty {
@@ -362,7 +373,8 @@
 	if(material->pass) {
 		GPUShader *shader = GPU_pass_shader(material->pass);
 		CustomUniform *cu;
-		int loc;
+		int loc, i;
+		PointerRNA ma_ptr;
 		LinkData *nlink;
 		GPULamp *lamp;
 		float invmat[4][4], col[4];
@@ -419,6 +431,36 @@
 			}
 		}
 
+		/* handle rna uniforms */
+		RNA_pointer_create((ID*)material->ma, &RNA_Material, material->ma, &ma_ptr);
+
+		for(i=0; i<rna_floats_size; i++)
+		{
+			loc = GPU_shader_get_uniform(shader, rna_floats[i]);
+
+			if (loc > -1)
+			{
+				int array_length = RNA_property_array_length(&ma_ptr, RNA_struct_find_property(&ma_ptr, rna_floats[i]));
+				
+				if (array_length > 1)
+				{
+					float *val = MEM_mallocN(sizeof(float)*array_length, "rna_float");
+					RNA_float_get_array(&ma_ptr, rna_floats[i], val);
+
+					GPU_shader_uniform_vector(shader, loc, array_length, 1, val);
+
+					MEM_freeN(val);
+				}
+				else
+				{
+					float val;
+					val = RNA_float_get(&ma_ptr, rna_floats[i]);
+					GPU_shader_uniform_vector(shader, loc, 1, 1, &val);
+				}
+			}
+		}
+
+
 		/* update lamps */
 		for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
 			lamp= nlink->data;





More information about the Bf-blender-cvs mailing list