[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32447] branches/particles-2010/source/ blender: Added generic RNA property socket read/write functions.

Lukas Toenne lukas.toenne at googlemail.com
Wed Oct 13 14:27:40 CEST 2010


Revision: 32447
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32447
Author:   lukastoenne
Date:     2010-10-13 14:27:40 +0200 (Wed, 13 Oct 2010)

Log Message:
-----------
Added generic RNA property socket read/write functions. This allows correct conversions in data nodes (esp. euler/axis-angle to quaternion and vice versa) and makes them more readable.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_set_data.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-10-13 11:40:59 UTC (rev 32446)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-10-13 12:27:40 UTC (rev 32447)
@@ -599,9 +599,6 @@
 int simnode_setdata_property_valid(struct bNode *node, struct PropertyRNA *prop);
 void simnode_setdata_add_rna_socket(struct bNode *node, struct PropertyRNA *prop);
 
-int sim_rna_socket_type(struct PropertyRNA *prop);
-void sim_rna_socket_set_defaults(struct PropertyRNA *prop, struct bNodeSocket *sock);
-
 /**/
 
 void init_nodesystem(void);

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-13 11:40:59 UTC (rev 32446)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-13 12:27:40 UTC (rev 32447)
@@ -975,6 +975,420 @@
 	}
 }
 
+
+int sim_rna_socket_type(PropertyRNA *prop)
+{
+	PropertyType proptype = RNA_property_type(prop);
+	PropertySubType subtype = RNA_property_subtype(prop);
+	
+	switch (proptype) {
+	case PROP_FLOAT:
+		switch (subtype) {
+		case PROP_NONE:
+		case PROP_UNSIGNED:
+		case PROP_PERCENTAGE:
+		case PROP_FACTOR:
+		case PROP_ANGLE:
+		case PROP_TIME:
+		case PROP_DISTANCE:
+			return SOCK_FLOAT;
+		
+		case PROP_TRANSLATION:
+		case PROP_DIRECTION:
+		case PROP_VELOCITY:
+		case PROP_ACCELERATION:
+			return SOCK_VECTOR;
+		
+		case PROP_COLOR_GAMMA:
+		case PROP_COLOR:
+			return SOCK_RGBA;
+		
+		case PROP_QUATERNION:
+		case PROP_EULER:
+		case PROP_AXISANGLE:
+			return SOCK_QUAT;
+		
+		case PROP_MATRIX:
+			return SOCK_MATRIX;
+		
+		/* TODO how to handle these? */
+		case PROP_XYZ:
+		case PROP_XYZ_LENGTH:
+			return -1;
+		
+		default:
+			return -1;
+		}
+	
+	case PROP_INT:
+		return SOCK_INT;
+	
+	case PROP_BOOLEAN:
+		return SOCK_BOOL;
+	
+	case PROP_STRING:
+		return SOCK_STRING;
+	
+	default:
+		return -1;
+	}
+}
+
+void sim_rna_socket_set_defaults(PropertyRNA *prop, bNodeSocket *sock)
+{
+	PropertyType proptype = RNA_property_type(prop);
+	PropertySubType subtype = RNA_property_subtype(prop);
+//	int imin, imax;
+//	PointerRNA ptr;
+//	RNA_pointer_create(NULL, NULL, NULL, &ptr);
+	
+	/* TODO sometimes property defaults and ranges depend on the actual instance,
+	 * which crashes with NULL pointer. Using sensible standard ranges for now, which is ok
+	 * since ranges are handled by RNA when updating, just cannot be used for socket defaults.
+	 */
+	
+	switch (proptype) {
+	case PROP_FLOAT:
+		switch (subtype) {
+		/* SOCK_FLOAT */
+		case PROP_NONE:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.min=		-1000000.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		case PROP_UNSIGNED:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		case PROP_PERCENTAGE:
+			sock->ns.vec[0]=	100.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		100.0f;
+			break;
+		case PROP_FACTOR:
+			sock->ns.vec[0]=	1.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		1.0f;
+			break;
+		case PROP_ANGLE:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		360.0f;
+			break;
+		case PROP_TIME:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.min=		-1000000.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		case PROP_DISTANCE:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		
+		/* SOCK_VECTOR */
+		case PROP_TRANSLATION:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.min=		-1000000.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		case PROP_DIRECTION:
+			sock->ns.vec[0]=	1.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.min=		-1.0f;
+			sock->ns.max=		1.0f;
+			break;
+		case PROP_VELOCITY:
+		case PROP_ACCELERATION:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.min=		-1000000.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		
+		/* SOCK_RGBA */
+		case PROP_COLOR_GAMMA:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.vec[3]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		100.0f;
+			break;
+		case PROP_COLOR:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.vec[3]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		1.0f;
+			break;
+		
+		/* SOCK_QUAT */
+		case PROP_QUATERNION:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.vec[3]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		1.0f;
+			break;
+		case PROP_EULER:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	0.0f;
+			sock->ns.vec[3]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		360.0f;
+			break;
+		case PROP_AXISANGLE:
+			sock->ns.vec[0]=	0.0f;
+			sock->ns.vec[1]=	0.0f;
+			sock->ns.vec[2]=	1.0f;
+			sock->ns.vec[3]=	0.0f;
+			sock->ns.min=		0.0f;
+			sock->ns.max=		360.0f;
+			break;
+		
+		/* SOCK_MATRIX */
+		case PROP_MATRIX:
+			unit_m4(sock->default_matrix);
+			sock->ns.min=		-1000000.0f;
+			sock->ns.max=		1000000.0f;
+			break;
+		
+		/* TODO how to handle these? */
+		case PROP_XYZ:
+		case PROP_XYZ_LENGTH:
+			break;
+		
+		default:
+			break;
+		}
+		break;
+	
+	/* SOCK_INT */
+	case PROP_INT:
+		sock->ns.ival=		0;
+		sock->ns.imin=		-1000000;
+		sock->ns.imax=		1000000;
+		break;
+	
+	/* SOCK_BOOL */
+	case PROP_BOOLEAN:
+		sock->ns.ival=		0;
+		sock->ns.imin=		0;
+		sock->ns.imax=		1;
+		break;
+	
+	/* SOCK_STRING */
+	case PROP_STRING:
+		sock->default_string[0]= '\0';
+		break;
+		
+	default:
+		break;
+	}
+}
+
+void sim_rna_socket_write(SimExecData *execdata, PointerRNA *ptr, PropertyRNA *prop, SimSocketIterator *iter)
+{
+	PropertyType proptype = RNA_property_type(prop);
+	PropertySubType subtype = RNA_property_subtype(prop);
+	float vector[3];
+	float rgba[4];
+	float quat[4], euler[3], axisangle[4];
+	float matrix[16];
+	char str[SIM_STRINGLENGTH];
+	
+	switch (proptype) {
+	case PROP_FLOAT:
+		switch (subtype) {
+		/* SOCK_FLOAT */
+		case PROP_NONE:
+		case PROP_UNSIGNED:
+		case PROP_PERCENTAGE:
+		case PROP_FACTOR:
+		case PROP_ANGLE:
+		case PROP_TIME:
+		case PROP_DISTANCE:
+			sim_output_write_float(execdata, iter, RNA_property_float_get(ptr, prop));
+			break;
+		
+		/* SOCK_VECTOR */
+		case PROP_TRANSLATION:
+		case PROP_DIRECTION:
+		case PROP_VELOCITY:
+		case PROP_ACCELERATION:
+			RNA_property_float_get_array(ptr, prop, vector);
+			sim_output_write_vector(execdata, iter, vector);
+			break;
+		
+		/* SOCK_RGBA */
+		case PROP_COLOR_GAMMA:
+		case PROP_COLOR:
+			RNA_property_float_get_array(ptr, prop, rgba);
+			sim_output_write_rgba(execdata, iter, rgba);
+			break;
+		
+		/* SOCK_QUAT */
+		case PROP_QUATERNION:
+			RNA_property_float_get_array(ptr, prop, quat);
+			sim_output_write_quat(execdata, iter, quat);
+			break;
+		case PROP_EULER:
+			RNA_property_float_get_array(ptr, prop, euler);
+			eul_to_quat(quat, euler);
+			sim_output_write_quat(execdata, iter, quat);
+			break;
+		case PROP_AXISANGLE:
+			RNA_property_float_get_array(ptr, prop, axisangle);
+			axis_angle_to_quat(quat, axisangle, axisangle[3]);
+			sim_output_write_quat(execdata, iter, quat);
+			break;
+		
+		/* SOCK_MATRIX */
+		case PROP_MATRIX:
+			RNA_property_float_get_array(ptr, prop, matrix);
+			sim_output_write_matrix(execdata, iter, matrix);
+			break;
+		
+		/* TODO how to handle these? */
+		case PROP_XYZ:
+		case PROP_XYZ_LENGTH:
+			break;
+		
+		default:
+			break;
+		}
+		break;
+	
+	/* SOCK_INT */
+	case PROP_INT:
+		sim_output_write_int(execdata, iter, RNA_property_int_get(ptr, prop));
+		break;
+	
+	/* SOCK_BOOL */
+	case PROP_BOOLEAN:
+		sim_output_write_bool(execdata, iter, RNA_property_boolean_get(ptr, prop));
+		break;
+	
+	/* SOCK_STRING */
+	case PROP_STRING:
+		RNA_property_string_get(ptr, prop, str);
+		sim_output_write_string(execdata, iter, str);
+		break;
+		
+	default:
+		break;
+	}
+}
+
+void sim_rna_socket_read(SimExecData *execdata, PointerRNA *ptr, PropertyRNA *prop, SimSocketIterator *iter)
+{
+	PropertyType proptype = RNA_property_type(prop);
+	PropertySubType subtype = RNA_property_subtype(prop);
+	float floatval;
+	int intval;
+	char boolval;
+	float vector[3];
+	float rgba[4];
+	float quat[4], euler[3], axisangle[4];
+	float matrix[16];
+	char str[SIM_STRINGLENGTH];
+	
+	switch (proptype) {
+	case PROP_FLOAT:
+		switch (subtype) {
+		/* SOCK_FLOAT */
+		case PROP_NONE:
+		case PROP_UNSIGNED:
+		case PROP_PERCENTAGE:
+		case PROP_FACTOR:
+		case PROP_ANGLE:
+		case PROP_TIME:
+		case PROP_DISTANCE:
+			sim_input_read_float(execdata, iter, &floatval);
+			RNA_property_float_set(ptr, prop, floatval);
+			break;
+		
+		/* SOCK_VECTOR */
+		case PROP_TRANSLATION:
+		case PROP_DIRECTION:
+		case PROP_VELOCITY:
+		case PROP_ACCELERATION:
+			sim_input_read_vector(execdata, iter, vector);
+			RNA_property_float_set_array(ptr, prop, vector);
+			break;
+		
+		/* SOCK_RGBA */
+		case PROP_COLOR_GAMMA:
+		case PROP_COLOR:
+			sim_input_read_rgba(execdata, iter, rgba);
+			RNA_property_float_set_array(ptr, prop, rgba);
+			break;
+		
+		/* SOCK_QUAT */
+		case PROP_QUATERNION:
+			sim_input_read_quat(execdata, iter, quat);
+			RNA_property_float_set_array(ptr, prop, quat);
+			break;
+		case PROP_EULER:
+			sim_input_read_quat(execdata, iter, quat);
+			quat_to_eul(euler, quat);
+			RNA_property_float_set_array(ptr, prop, euler);
+			break;
+		case PROP_AXISANGLE:
+			sim_input_read_quat(execdata, iter, quat);
+			quat_to_axis_angle(axisangle, &axisangle[3], quat);
+			RNA_property_float_set_array(ptr, prop, axisangle);
+			break;
+		
+		/* SOCK_MATRIX */
+		case PROP_MATRIX:
+			sim_input_read_matrix(execdata, iter, matrix);
+			RNA_property_float_set_array(ptr, prop, matrix);
+			break;
+		
+		/* TODO how to handle these? */
+		case PROP_XYZ:
+		case PROP_XYZ_LENGTH:
+			break;
+		
+		default:
+			break;
+		}
+		break;
+	
+	/* SOCK_INT */
+	case PROP_INT:
+		sim_input_read_int(execdata, iter, &intval);
+		RNA_property_int_set(ptr, prop, intval);
+		break;
+	
+	/* SOCK_BOOL */
+	case PROP_BOOLEAN:
+		sim_input_read_bool(execdata, iter, &boolval);
+		RNA_property_boolean_set(ptr, prop, boolval);
+		break;
+	
+	/* SOCK_STRING */
+	case PROP_STRING:
+		sim_input_read_string(execdata, iter, str);
+		RNA_property_string_set(ptr, prop, str);
+		break;
+		
+	default:
+		break;
+	}
+}
+
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list