[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53307] branches/ge_harmony: Adding support for mat2, mat3, and mat4 uniforms to custom shaders.

Daniel Stokes kupomail at gmail.com
Mon Dec 24 04:27:13 CET 2012


Revision: 53307
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53307
Author:   kupoman
Date:     2012-12-24 03:27:05 +0000 (Mon, 24 Dec 2012)
Log Message:
-----------
Adding support for mat2, mat3, and mat4 uniforms to custom shaders. Unfortunately the Blender UI displays them a little oddly.

Modified Paths:
--------------
    branches/ge_harmony/CMakeLists.txt
    branches/ge_harmony/source/blender/blenkernel/intern/shader.c
    branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
    branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c

Modified: branches/ge_harmony/CMakeLists.txt
===================================================================
--- branches/ge_harmony/CMakeLists.txt	2012-12-24 03:13:53 UTC (rev 53306)
+++ branches/ge_harmony/CMakeLists.txt	2012-12-24 03:27:05 UTC (rev 53307)
@@ -1086,11 +1086,7 @@
 
 		if(WITH_PYTHON)
 			# normally cached but not since we include them with blender
-			if(MSVC10)
-				set(PYTHON_VERSION 3.2) # CACHE STRING)
-			else()
-				set(PYTHON_VERSION 3.3) # CACHE STRING)
-			endif()
+			set(PYTHON_VERSION 3.3) # CACHE STRING)
 
 			set_lib_path(PYTHON "python")
 			STRING(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})

Modified: branches/ge_harmony/source/blender/blenkernel/intern/shader.c
===================================================================
--- branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2012-12-24 03:13:53 UTC (rev 53306)
+++ branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2012-12-24 03:27:05 UTC (rev 53307)
@@ -130,6 +130,13 @@
 	else if (strcmp(type, "sampler2D") == 0) {
 		uni->type = SHADER_UNF_SAMPLER2D;
 	}
+	else if (starts_with(type, "mat")) {
+		uni->type = SHADER_UNF_MAT2;
+		uni->size = atoi(type+3);
+		uni->type += uni->size -2;
+		uni->size *= uni->size;
+		data_size = sizeof(float);
+	}
 	else {
 		printf("Data type %s is not supported\n", type);
 		MEM_freeN(uni);
@@ -138,10 +145,10 @@
 
 
 	/* Clamp sizes in case there is an error in the shader */
-	if (uni->size < 1)
-		uni->size = 1;
-	else if (uni->size > 4)
-		uni->size = 4;
+	//if (uni->size < 1)
+	//	uni->size = 1;
+	//else if (uni->size > 4)
+	//	uni->size = 4;
 
 	/* Ready data */
 	if (uni->size > 1) {		

Modified: branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
===================================================================
--- branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-12-24 03:13:53 UTC (rev 53306)
+++ branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-12-24 03:27:05 UTC (rev 53307)
@@ -130,6 +130,9 @@
 #define SHADER_UNF_IVEC3	7
 #define SHADER_UNF_IVEC4	8
 #define SHADER_UNF_SAMPLER2D 10
+#define SHADER_UNF_MAT2		11
+#define SHADER_UNF_MAT3		12
+#define SHADER_UNF_MAT4		13
 
 
 #endif //__DNA_SHADER_TYPES_H__

Modified: branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c
===================================================================
--- branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c	2012-12-24 03:13:53 UTC (rev 53306)
+++ branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c	2012-12-24 03:27:05 UTC (rev 53307)
@@ -229,6 +229,12 @@
 		return &RNA_IVec4Uniform;
 	case SHADER_UNF_SAMPLER2D:
 		return &RNA_Sampler2DUniform;
+	case SHADER_UNF_MAT2:
+		return &RNA_Mat2Uniform;
+	case SHADER_UNF_MAT3:
+		return &RNA_Mat3Uniform;
+	case SHADER_UNF_MAT4:
+		return &RNA_Mat4Uniform;
 	default:
 		return &RNA_Uniform;
 	}
@@ -237,17 +243,27 @@
 #endif
 
 /* Helper function for defining the different uniform data types */
-static void rna_def_uniformtype(BlenderRNA *brna, const char *name, const char *doc, int type, int size)
+static void rna_def_uniformtype(BlenderRNA *brna, const char *name, const char *doc, int type, int subtype, int size)
 {
 	PropertyRNA *prop;
 	StructRNA *srna;
+	int x2[] = {2, 2};
+	int x3[] = {3, 3};
+	int x4[] = {4, 4};
 
 	srna= RNA_def_struct(brna, name, "Uniform");
 	RNA_def_struct_ui_text(srna, name, doc);
 	RNA_def_struct_sdna(srna, "Uniform");
 
-	prop= RNA_def_property(srna, "value", type, PROP_NONE);
-	if (size > 1)
+	prop= RNA_def_property(srna, "value", type, subtype);
+	
+	if (size == 4 && subtype == PROP_MATRIX)
+		RNA_def_property_multi_array(prop, 2, x2);
+	else if (size == 9)
+		RNA_def_property_multi_array(prop, 2, x3);
+	else if (size == 16)
+		RNA_def_property_multi_array(prop, 2, x4);
+	else if (size > 1)
 		RNA_def_property_array(prop, size);
 
 	if (type == PROP_INT)
@@ -295,6 +311,9 @@
 		{SHADER_UNF_IVEC3, "IVEC3", 0, "ivec3", "ivec3"},
 		{SHADER_UNF_IVEC4, "IVEC4", 0, "ivec4", "ivec4"},
 		{SHADER_UNF_SAMPLER2D, "SAMPLER2D", 0, "sampler2D", "sampler2D"},
+		{SHADER_UNF_MAT2, "MAT2", 0, "mat2", "mat2"},
+		{SHADER_UNF_MAT3, "MAT3", 0, "mat3", "mat3"},
+		{SHADER_UNF_MAT4, "MAT4", 0, "mat4", "mat4"},
 		{0, NULL, 0, NULL, NULL}};
 		
 	srna= RNA_def_struct(brna, "Uniform", NULL);
@@ -315,15 +334,18 @@
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Uniform type", "The data type of the uniform");
 
-	rna_def_uniformtype(brna, "FloatUniform", "Custom float uniform", PROP_FLOAT, 1);
-	rna_def_uniformtype(brna, "IntUniform", "Custom integer uniform", PROP_INT, 1);
-	rna_def_uniformtype(brna, "Vec2Uniform", "Custom float vector 2 uniform", PROP_FLOAT, 2);
-	rna_def_uniformtype(brna, "Vec3Uniform", "Custom float vector 3 uniform", PROP_FLOAT, 3);
-	rna_def_uniformtype(brna, "Vec4Uniform", "Custom float vector 4 uniform", PROP_FLOAT, 4);
-	rna_def_uniformtype(brna, "IVec2Uniform", "Custom integer vector 2 uniform", PROP_INT, 2);
-	rna_def_uniformtype(brna, "IVec3Uniform", "Custom integer vector 3 uniform", PROP_INT, 3);
-	rna_def_uniformtype(brna, "IVec4Uniform", "Custom integer vector 4 uniform", PROP_INT, 4);
-	rna_def_uniformtype(brna, "Sampler2DUniform", "Custom sampler2D uniform", PROP_POINTER, 1);
+	rna_def_uniformtype(brna, "FloatUniform", "Custom float uniform", PROP_FLOAT, PROP_NONE, 1);
+	rna_def_uniformtype(brna, "IntUniform", "Custom integer uniform", PROP_INT, PROP_NONE, 1);
+	rna_def_uniformtype(brna, "Vec2Uniform", "Custom float vector 2 uniform", PROP_FLOAT, PROP_NONE, 2);
+	rna_def_uniformtype(brna, "Vec3Uniform", "Custom float vector 3 uniform", PROP_FLOAT, PROP_NONE, 3);
+	rna_def_uniformtype(brna, "Vec4Uniform", "Custom float vector 4 uniform", PROP_FLOAT, PROP_NONE, 4);
+	rna_def_uniformtype(brna, "IVec2Uniform", "Custom integer vector 2 uniform", PROP_INT, PROP_NONE, 2);
+	rna_def_uniformtype(brna, "IVec3Uniform", "Custom integer vector 3 uniform", PROP_INT, PROP_NONE, 3);
+	rna_def_uniformtype(brna, "IVec4Uniform", "Custom integer vector 4 uniform", PROP_INT, PROP_NONE, 4);
+	rna_def_uniformtype(brna, "Mat2Uniform", "Custom 2x2 matrix uniform", PROP_FLOAT, PROP_MATRIX, 4);
+	rna_def_uniformtype(brna, "Mat3Uniform", "Custom 3x3 matrix uniform", PROP_FLOAT, PROP_MATRIX, 9);
+	rna_def_uniformtype(brna, "Mat4Uniform", "Custom 4x4 matrix uniform", PROP_FLOAT, PROP_MATRIX, 16);
+	rna_def_uniformtype(brna, "Sampler2DUniform", "Custom sampler2D uniform", PROP_POINTER, PROP_NONE, 1);
 }
 
 static void rna_def_shader_shaderlink(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list