[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