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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to