diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-09-16 14:09:57 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-09-16 14:09:57 +0400 |
commit | 103e11359d3838ac944f2a8895a41cc26ab9e74b (patch) | |
tree | 2d3eca56267542f12621f5fd021683e7d7ad8af1 /source/blender | |
parent | e03b8b7be7c34450b0e419bbf1d8dfb78a8439b1 (diff) |
- rna/python api object.create_render_mesh(...) support for getting a mesh from metaballs and curves (bevel, surface, text etc).
- 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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/object/object_select.c | 61 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_select.c | 8 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_select.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object_api.c | 85 |
4 files changed, 104 insertions, 52 deletions
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index cfd65ad18ec..432aaf2d2cb 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -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"); } diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 94e17b56a02..94691dd0ed2 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -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 ****** */ diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index c639b445f9e..b1fec793b09 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -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 ****** */ diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 6545898c1ab..cfbd363e358 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -38,30 +38,92 @@ #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."); |