[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33415] branches/particles-2010/source/ blender: Added some more mesh custom data types.

Lukas Toenne lukas.toenne at googlemail.com
Wed Dec 1 16:54:36 CET 2010


Revision: 33415
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33415
Author:   lukastoenne
Date:     2010-12-01 16:54:35 +0100 (Wed, 01 Dec 2010)

Log Message:
-----------
Added some more mesh custom data types.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenlib/BLI_math_vector.h
    branches/particles-2010/source/blender/blenlib/intern/math_vector.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_data.c

Modified: branches/particles-2010/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- branches/particles-2010/source/blender/blenlib/BLI_math_vector.h	2010-12-01 14:55:55 UTC (rev 33414)
+++ branches/particles-2010/source/blender/blenlib/BLI_math_vector.h	2010-12-01 15:54:35 UTC (rev 33415)
@@ -116,6 +116,7 @@
 void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float w[4]);
 void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t);
 void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]);
+void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4]);
 
 void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
 

Modified: branches/particles-2010/source/blender/blenlib/intern/math_vector.c
===================================================================
--- branches/particles-2010/source/blender/blenlib/intern/math_vector.c	2010-12-01 14:55:55 UTC (rev 33414)
+++ branches/particles-2010/source/blender/blenlib/intern/math_vector.c	2010-12-01 15:54:35 UTC (rev 33415)
@@ -91,6 +91,14 @@
 	p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2];
 }
 
+void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4])
+{
+	p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3];
+	p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3];
+	p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3];
+	p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2] + v4[3]*w[3];
+}
+
 void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
 {
 	v[0]= 0.5f*(v1[0] + v2[0]);

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_data.c	2010-12-01 14:55:55 UTC (rev 33414)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_mesh_data.c	2010-12-01 15:54:35 UTC (rev 33415)
@@ -65,7 +65,9 @@
 
 CDDMProperty cddm_properties[] = {
 	{ CD_MVERT,		CD_MASK_MVERT,	"Vertex Position",	"",		SOCK_VECTOR },
+	{ CD_MCOL,		CD_MASK_MCOL,	"Vertex Color",		"",		SOCK_RGBA },
 	{ CD_NORMAL,	CD_MASK_NORMAL,	"Normal",			"",		SOCK_VECTOR },
+	{ CD_TANGENT,	CD_MASK_TANGENT,	"Tangent",			"",		SOCK_VECTOR },
 	
 	{ -1, 0, NULL, NULL, 0 }	/* terminator */
 };
@@ -144,6 +146,11 @@
 	
 	for (i=0; i < node->totout; ++i) {
 		CDDMProperty *prop= (CDDMProperty*)args[i+5];
+		
+		/* skip if derived mesh does not provide this data */
+		if (!prop->data)
+			continue;
+		
 		switch (prop->cd) {
 		case CD_MVERT:
 			vec = SIM_OUTPUT_VECTOR(0, global_id);
@@ -168,6 +175,78 @@
 			case SIM_SPACE_OBJECT:
 				break;
 			}
+			break;
+			
+		case CD_MCOL:
+			vec = SIM_OUTPUT_RGBA(0, global_id);
+			if (mf->v4) {
+				MCol *c1= (MCol*)prop->data+mf->v1;
+				MCol *c2= (MCol*)prop->data+mf->v2;
+				MCol *c3= (MCol*)prop->data+mf->v3;
+				MCol *c4= (MCol*)prop->data+mf->v4;
+				/* MCol is just four floats and can be interpreted as a float[4] */
+				interp_v4_v4v4v4v4(vec, (float*)c1, (float*)c2, (float*)c3, (float*)c4, weights);
+			}
+			else {
+				MCol *c1= (MCol*)prop->data+mf->v1;
+				MCol *c2= (MCol*)prop->data+mf->v2;
+				MCol *c3= (MCol*)prop->data+mf->v3;
+				/* MCol is just four floats and can be interpreted as a float[4] */
+				interp_v4_v4v4v4(vec, (float*)c1, (float*)c2, (float*)c3, weights);
+			}
+			break;
+			
+		case CD_NORMAL:
+			vec = SIM_OUTPUT_VECTOR(0, global_id);
+			if (mf->v4) {
+				float *v1= (float*)prop->data+3*mf->v1;
+				float *v2= (float*)prop->data+3*mf->v2;
+				float *v3= (float*)prop->data+3*mf->v3;
+				float *v4= (float*)prop->data+3*mf->v4;
+				interp_v3_v3v3v3v3(vec, v1, v2, v3, v4, weights);
+			}
+			else {
+				float *v1= (float*)prop->data+3*mf->v1;
+				float *v2= (float*)prop->data+3*mf->v2;
+				float *v3= (float*)prop->data+3*mf->v3;
+				interp_v3_v3v3v3(vec, v1, v2, v3, weights);
+			}
+			
+			switch (node->base->custom1) {
+			case SIM_SPACE_WORLD:
+				/* don't translate normals */
+				mul_mat3_m4_v3(ob->obmat, vec);
+				break;
+			case SIM_SPACE_OBJECT:
+				break;
+			}
+			break;
+			
+		case CD_TANGENT:
+			vec = SIM_OUTPUT_VECTOR(0, global_id);
+			if (mf->v4) {
+				float *v1= (float*)prop->data+3*mf->v1;
+				float *v2= (float*)prop->data+3*mf->v2;
+				float *v3= (float*)prop->data+3*mf->v3;
+				float *v4= (float*)prop->data+3*mf->v4;
+				interp_v3_v3v3v3v3(vec, v1, v2, v3, v4, weights);
+			}
+			else {
+				float *v1= (float*)prop->data+3*mf->v1;
+				float *v2= (float*)prop->data+3*mf->v2;
+				float *v3= (float*)prop->data+3*mf->v3;
+				interp_v3_v3v3v3(vec, v1, v2, v3, weights);
+			}
+			
+			switch (node->base->custom1) {
+			case SIM_SPACE_WORLD:
+				/* don't translate tangents */
+				mul_mat3_m4_v3(ob->obmat, vec);
+				break;
+			case SIM_SPACE_OBJECT:
+				break;
+			}
+			break;
 		}
 	}
 }





More information about the Bf-blender-cvs mailing list