[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