[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33033] branches/particles-2010/source/ blender/nodes/intern: Automatic conversion of scalar socket types (float, int, boolean) into vectors, matrices and colors in simulation trees.

Lukas Toenne lukas.toenne at googlemail.com
Fri Nov 12 09:20:19 CET 2010


Revision: 33033
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33033
Author:   lukastoenne
Date:     2010-11-12 09:19:42 +0100 (Fri, 12 Nov 2010)

Log Message:
-----------
Automatic conversion of scalar socket types (float, int, boolean) into vectors, matrices and colors in simulation trees. Vectors and matrices become scaled unit vector/matrix, while colors are greyscale with alpha=1.

Modified Paths:
--------------
    branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-12 07:36:06 UTC (rev 33032)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-12 08:19:42 UTC (rev 33033)
@@ -65,22 +65,22 @@
 	}
 }
 
-static int socket_types_compatible(int a, int b)
+static int socket_types_compatible(int from, int to)
 {
-	int valid;
 	/* SOCK_ANY sockets are only valid when resolved or both ends are unresolved */
-	if ((a == SOCK_ANY && b != SOCK_ANY) || (a != SOCK_ANY && b == SOCK_ANY)) {
-		valid = 0;
-	}
-	/* numerical primitives can be freely converted */
-	else if (ELEM3(a, SOCK_INT, SOCK_FLOAT, SOCK_BOOL) && ELEM3(b, SOCK_INT, SOCK_FLOAT, SOCK_BOOL)) {
-		valid = 1;
-	}
+	if ((from == SOCK_ANY && to != SOCK_ANY) || (from != SOCK_ANY && to == SOCK_ANY))
+		return 0;
+	
+	/* scalar type conversions */
+	if (ELEM3(from, SOCK_INT, SOCK_FLOAT, SOCK_BOOL) && (
+			ELEM3(to, SOCK_INT, SOCK_FLOAT, SOCK_BOOL)	/* scalar types can be freely converted into each other */
+			|| ELEM(to, SOCK_VECTOR, SOCK_MATRIX)		/* scalars can be interpreted as scale */
+			|| to==SOCK_RGBA							/* scalars can be interpreted as greyscale colors */
+		))
+		return 1;
+	
 	/* by default only allow perfect type matches */
-	else {
-		valid = (a == b);
-	}
-	return valid;
+	return (from == to);
 }
 
 static int socket_type_priority(int type)

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_util.c	2010-11-12 07:36:06 UTC (rev 33032)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_util.c	2010-11-12 08:19:42 UTC (rev 33033)
@@ -364,6 +364,9 @@
 #endif
 
 
+/*******************************/
+/**** Socket Data Iterators ****/
+/*******************************/
 
 size_t sim_sockettype_size(int datatype)
 {
@@ -621,6 +624,9 @@
 			result[1] = ((cl_float4*)iter->current)->y;
 			result[2] = ((cl_float4*)iter->current)->z;
 			break;
+		case SOCK_FLOAT:	result[0]=result[1]=result[2]= *(cl_float*)iter->current;	break;
+		case SOCK_INT:		result[0]=result[1]=result[2]= *(cl_int*)iter->current;		break;
+		case SOCK_BOOL:		result[0]=result[1]=result[2]= *(cl_char*)iter->current;	break;
 		default:
 			zero_v3(result);
 		}
@@ -634,6 +640,9 @@
 			result[1] = ((float*)iter->current)[1];
 			result[2] = ((float*)iter->current)[2];
 			break;
+		case SOCK_FLOAT:	result[0]=result[1]=result[2]= *(float*)iter->current;	break;
+		case SOCK_INT:		result[0]=result[1]=result[2]= *(int*)iter->current;	break;
+		case SOCK_BOOL:		result[0]=result[1]=result[2]= *(char*)iter->current;	break;
 		default:
 			zero_v3(result);
 		}
@@ -651,6 +660,18 @@
 			result[2] = ((cl_float4*)iter->current)->z;
 			result[3] = ((cl_float4*)iter->current)->w;
 			break;
+		case SOCK_FLOAT:
+			result[0]=result[1]=result[2]= *(cl_float*)iter->current;
+			result[3]= 1.0f;
+			break;
+		case SOCK_INT:
+			result[0]=result[1]=result[2]= *(cl_int*)iter->current;
+			result[3]= 1.0f;
+			break;
+		case SOCK_BOOL:
+			result[0]=result[1]=result[2]= *(cl_char*)iter->current;
+			result[3]= 1.0f;
+			break;
 		default:
 			zero_v4(result);
 		}
@@ -665,6 +686,18 @@
 			result[2] = ((float*)iter->current)[2];
 			result[3] = ((float*)iter->current)[3];
 			break;
+		case SOCK_FLOAT:
+			result[0]=result[1]=result[2]= *(float*)iter->current;
+			result[3]= 1.0f;
+			break;
+		case SOCK_INT:
+			result[0]=result[1]=result[2]= *(int*)iter->current;
+			result[3]= 1.0f;
+			break;
+		case SOCK_BOOL:
+			result[0]=result[1]=result[2]= *(char*)iter->current;
+			result[3]= 1.0f;
+			break;
 		default:
 			zero_v4(result);
 		}
@@ -725,6 +758,15 @@
 			result[3][2] = ((cl_float4*)iter->current)[3].z;
 			result[3][3] = ((cl_float4*)iter->current)[3].w;
 			break;
+		case SOCK_FLOAT:
+			scale_m4_fl(result, *(cl_float*)iter->current);
+			break;
+		case SOCK_INT:
+			scale_m4_fl(result, *(cl_int*)iter->current);
+			break;
+		case SOCK_BOOL:
+			scale_m4_fl(result, *(cl_char*)iter->current);
+			break;
 		default:
 			zero_m4(result);
 		}
@@ -736,6 +778,15 @@
 		case SOCK_MATRIX:
 			copy_m4_m4(result, (float(*)[4])iter->current);
 			break;
+		case SOCK_FLOAT:
+			scale_m4_fl(result, *(float*)iter->current);
+			break;
+		case SOCK_INT:
+			scale_m4_fl(result, *(int*)iter->current);
+			break;
+		case SOCK_BOOL:
+			scale_m4_fl(result, *(char*)iter->current);
+			break;
 		default:
 			zero_m4(result);
 		}

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_util.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_util.h	2010-11-12 07:36:06 UTC (rev 33032)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_util.h	2010-11-12 08:19:42 UTC (rev 33033)
@@ -343,6 +343,9 @@
 {
 	switch (type) {
 	case SOCK_VECTOR:	copy_v3_v3(result, ((float*)data + 3*index));	break;
+	case SOCK_FLOAT:	result[0]=result[1]=result[2]= (*((float*)data + index));		break;
+	case SOCK_INT:		result[0]=result[1]=result[2]= (float)(*((int*)data + index));	break;
+	case SOCK_BOOL:		result[0]=result[1]=result[2]= (float)(*((char*)data + index));	break;
 	default:			zero_v3(result);
 	}
 }
@@ -351,7 +354,10 @@
 {
 	switch (type) {
 	case SOCK_RGBA:		copy_v4_v4(result, (float*)data + 4*index);	break;
-	default:			result[0]=result[1]=result[2]=0.0f; result[3]=1.0f;
+	case SOCK_FLOAT:	result[0]=result[1]=result[2]= (*((float*)data + index));		result[3]= 1.0f;	break;
+	case SOCK_INT:		result[0]=result[1]=result[2]= (float)(*((int*)data + index));	result[3]= 1.0f;	break;
+	case SOCK_BOOL:		result[0]=result[1]=result[2]= (float)(*((char*)data + index));	result[3]= 1.0f;	break;
+	default:			result[0]=result[1]=result[2]= 0.0f;							result[3]= 1.0f;
 	}
 }
 
@@ -367,6 +373,9 @@
 {
 	switch (type) {
 	case SOCK_MATRIX:	copy_m4_m4(result, (float(*)[4])((float*)data + 16*index));	break;
+	case SOCK_FLOAT:	scale_m4_fl(result, (*((float*)data + index)));			break;
+	case SOCK_INT:		scale_m4_fl(result, (float)(*((int*)data + index)));	break;
+	case SOCK_BOOL:		scale_m4_fl(result, (float)(*((char*)data + index)));	break;
 	default:			unit_m4(result);
 	}
 }





More information about the Bf-blender-cvs mailing list