- rna/python api object.create_render_mesh(...) support for getting a mesh from metab...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 16 Sep 2009 10:09:57 +0000 (10:09 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 16 Sep 2009 10:09:57 +0000 (10:09 +0000)
- povray converts curves to meshes on export, (metaballs don't need meshing).
- use 'extend' bool rather then 'seltype' enum for object_select operators for consistency.

release/io/engine_render_pov.py
source/blender/editors/object/object_select.c
source/blender/editors/space_node/node_select.c
source/blender/editors/space_view3d/view3d_select.c
source/blender/makesrna/intern/rna_object_api.c

index 22cf1a3..c1cd84c 100644 (file)
@@ -275,7 +275,7 @@ def write_pov(filename, scene=None, info_callback = None):
                for ob in sel:
                        ob_num+= 1
                        
-                       if ob.type in ('LAMP', 'CAMERA', 'EMPTY'):
+                       if ob.type in ('LAMP', 'CAMERA', 'EMPTY', 'META'):
                                continue
                        
                        me = ob.data
index cfd65ad..432aaf2 100644 (file)
@@ -53,6 +53,7 @@
 #include "BKE_property.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
+#include "BKE_utildefines.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -117,22 +118,16 @@ void ED_base_object_activate(bContext *C, Base *base)
 
 /********************** Selection Operators **********************/
 
-static EnumPropertyItem prop_select_types[] = {
-       {0, "EXCLUSIVE", 0, "Exclusive", ""},
-       {1, "EXTEND", 0, "Extend", ""},
-       {0, NULL, 0, NULL, NULL}
-};
-
 /************************ Select by Type *************************/
 
 static int object_select_by_type_exec(bContext *C, wmOperator *op)
 {
-       short obtype, seltype;
+       short obtype, extend;
        
        obtype = RNA_enum_get(op->ptr, "type");
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
                
-       if (seltype == 0) {
+       if (extend == 0) {
                CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
                        ED_base_object_select(base, BA_DESELECT);
                }
@@ -166,9 +161,9 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 0, "Selection", "Extend selection or clear selection then select");
+       /* properties */
+       RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
        RNA_def_enum(ot->srna, "type", object_type_items, 1, "Type", "");
-
 }
 
 /*********************** Selection by Links *********************/
@@ -192,7 +187,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
        Tex *tex=0;
        int a, b;
        int nr = RNA_enum_get(op->ptr, "type");
-       short changed = 0, seltype;
+       short changed = 0, extend;
        /* events (nr):
         * Object Ipo: 1
         * ObData: 2
@@ -202,9 +197,9 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
         * PSys: 6
         */
 
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
        
-       if (seltype == 0) {
+       if (extend == 0) {
                CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
                        ED_base_object_select(base, BA_DESELECT);
                }
@@ -327,9 +322,9 @@ void OBJECT_OT_select_linked(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
+       /* properties */
+       RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
        RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
-
 }
 
 /*********************** Selected Grouped ********************/
@@ -575,11 +570,11 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op)
        Scene *scene= CTX_data_scene(C);
        Object *ob;
        int nr = RNA_enum_get(op->ptr, "type");
-       short changed = 0, seltype;
+       short changed = 0, extend;
 
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
        
-       if (seltype == 0) {
+       if (extend == 0) {
                CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
                        ED_base_object_select(base, BA_DESELECT);
                }
@@ -628,8 +623,8 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* properties */
+       RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
        RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
 }
 
 /************************* Select by Layer **********************/
@@ -637,12 +632,12 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
 static int object_select_by_layer_exec(bContext *C, wmOperator *op)
 {
        unsigned int layernum;
-       short seltype;
+       short extend;
        
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
        layernum = RNA_int_get(op->ptr, "layer");
        
-       if (seltype == 0) {
+       if (extend == 0) {
                CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
                        ED_base_object_select(base, BA_DESELECT);
                }
@@ -676,8 +671,9 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
+       /* properties */
+       RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
        RNA_def_int(ot->srna, "layer", 1, 1, 20, "Layer", "", 1, 20);
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
 }
 
 /************************** Select Inverse *************************/
@@ -878,9 +874,9 @@ void object_flip_name (char *name)
 static int object_select_mirror_exec(bContext *C, wmOperator *op)
 {
        char tmpname[32];
-       short seltype;
+       short extend;
        
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
        
        CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
 
@@ -894,7 +890,7 @@ static int object_select_mirror_exec(bContext *C, wmOperator *op)
                }
                CTX_DATA_END;
                
-               if (seltype == 0) ED_base_object_select(primbase, BA_DESELECT);
+               if (extend == 0) ED_base_object_select(primbase, BA_DESELECT);
                
        }
        CTX_DATA_END;
@@ -920,7 +916,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
+       RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
 }
 
 
@@ -981,11 +977,11 @@ void OBJECT_OT_select_name(wmOperatorType *ot)
 static int object_select_random_exec(bContext *C, wmOperator *op)
 {      
        float percent;
-       short seltype;
+       short extend;
        
-       seltype = RNA_enum_get(op->ptr, "seltype");
+       extend= RNA_boolean_get(op->ptr, "extend");
        
-       if (seltype == 0) {
+       if (extend == 0) {
                CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
                        ED_base_object_select(base, BA_DESELECT);
                }
@@ -1020,8 +1016,9 @@ void OBJECT_OT_select_random(wmOperatorType *ot)
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
+       /* properties */
+       RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
        RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "percentage of objects to randomly select", 0.0001f, 1.0f);
-       RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
 }
 
 
index 94e17b5..94691dd 100644 (file)
@@ -224,12 +224,6 @@ void NODE_OT_select(wmOperatorType *ot)
 
 /* ****** Border Select ****** */
 
-static EnumPropertyItem prop_select_types[] = {
-       {NODE_EXCLUSIVE, "EXCLUSIVE", 0, "Exclusive", ""}, /* right mouse */
-       {NODE_EXTEND, "EXTEND", 0, "Extend", ""}, /* left mouse */
-       {0, NULL, 0, NULL, NULL}
-};
-
 static int node_borderselect_exec(bContext *C, wmOperator *op)
 {
        SpaceNode *snode= CTX_wm_space_node(C);
@@ -288,8 +282,6 @@ void NODE_OT_select_border(wmOperatorType *ot)
        RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
        RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
        RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
-
-       RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "");
 }
 
 /* ****** Select/Deselect All ****** */
index c639b44..b1fec79 100644 (file)
@@ -1592,7 +1592,7 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
        RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
        RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
 
-       RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everyting first.");
+       RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
 }
 
 /* ****** Mouse Select ****** */
index 6545898..cfbd363 100644 (file)
 
 #include "BKE_customdata.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
+#include "BKE_object.h"
+#include "BKE_main.h"
 
 #include "DNA_mesh_types.h"
+#include "DNA_curve_types.h"
 #include "DNA_scene_types.h"
 
 /* copied from init_render_mesh (render code) */
-static Mesh *rna_Object_create_render_mesh(Object *ob, Scene *scene)
+static Mesh *rna_Object_create_render_mesh(Object *ob, bContext *C, Scene *scene)
 {
        CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
+       Object *tmpobj = NULL;
        DerivedMesh *dm;
        Mesh *me;
        
-       /* TODO: other types */
-       if(ob->type != OB_MESH)
-               return NULL;
+       switch(ob->type) {
+       case OB_FONT:
+       case OB_CURVE:
+       case OB_SURF:
+       {
+               int cage = 0; //XXX -todo
+               Curve *tmpcu = NULL;
+
+               /* copies object and modifiers (but not the data) */
+               tmpobj= copy_object( ob );
+               tmpcu = (Curve *)tmpobj->data;
+               tmpcu->id.us--;
+
+               /* if getting the original caged mesh, delete object modifiers */
+               if( cage )
+                       object_free_modifiers(tmpobj);
+
+               /* copies the data */
+               tmpobj->data = copy_curve( (Curve *) ob->data );
+
+#if 0
+               /* copy_curve() sets disp.first null, so currently not need */
+               {
+                       Curve *cu;
+                       cu = (Curve *)tmpobj->data;
+                       if( cu->disp.first )
+                               MEM_freeN( cu->disp.first );
+                       cu->disp.first = NULL;
+               }
        
-       dm= mesh_create_derived_render(scene, ob, mask);
+#endif
 
-       if(!dm)
-               return NULL;
+               /* get updated display list, and convert to a mesh */
+               makeDispListCurveTypes( scene, tmpobj, 0 );
+               nurbs_to_mesh( tmpobj );
 
-       me= add_mesh("tmp_render_mesh");
-       me->id.us--; /* we don't assign it to anything */
-       DM_to_mesh(dm, me);
-       dm->release(dm);
+               /* nurbs_to_mesh changes the type tp a mesh, check it worked */
+               if (tmpobj->type != OB_MESH) {
+                       free_libblock_us( &(CTX_data_main(C)->object), tmpobj );
+                       printf("cant convert curve to mesh. Does the curve have any segments?" ); // XXX use report api
+               }
+               me = tmpobj->data;
+               free_libblock_us( &(CTX_data_main(C)->object), tmpobj );
+               break;
+       }
+       case OB_MBALL:
+               /* metaballs don't have modifiers, so just convert to mesh */
+               ob = find_basis_mball( ob );
+               /* todo, re-generatre for render-res */
+               // metaball_polygonize(scene, ob)
+               me = add_mesh("Mesh");
+               mball_to_mesh( &ob->disp, me );
+               break;
+       case OB_MESH:
+       {
+               dm= mesh_create_derived_render(scene, ob, mask);
+               // dm= mesh_create_derived_view(scene, ob, mask);
+
+               if(!dm)
+                       return NULL;
+
+               me= add_mesh("tmp_render_mesh");
+               me->id.us--; /* we don't assign it to anything */
+               DM_to_mesh(dm, me);
+               dm->release(dm);
+               break;
+       }
+       default:
+               return NULL;
+       }
 
 
        {       /* update the material */
@@ -94,6 +156,7 @@ void RNA_api_object(StructRNA *srna)
 
        func= RNA_def_function(srna, "create_render_mesh", "rna_Object_create_render_mesh");
        RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        prop= RNA_def_pointer(func, "scene", "Scene", "", "");
        RNA_def_property_flag(prop, PROP_REQUIRED);
        prop= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");