forked from bartvdbraak/blender
- all add object operators now take view_align as an argument, and enter_editmode where its used. Makes running the operator from python pradictable without having to know the user prefs.
- missing return in function - python error in view3d (assumed active object exists)
This commit is contained in:
parent
9ea97203ae
commit
1d9f90ed42
@ -1334,7 +1334,7 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel):
|
||||
col.itemR(view, "all_object_centers")
|
||||
col.itemR(view, "relationship_lines")
|
||||
if ob and ob.type == 'MESH':
|
||||
mesh = context.active_object.data
|
||||
mesh = ob.data
|
||||
col.itemR(mesh, "all_edges")
|
||||
|
||||
col = layout.column()
|
||||
|
@ -479,7 +479,7 @@ static void txt_add_object(bContext *C, TextLine *firstline, int totline, float
|
||||
obedit= add_object(scene, OB_FONT);
|
||||
base= scene->basact;
|
||||
|
||||
ED_object_base_init_from_view(C, base);
|
||||
ED_object_base_init_from_view(C, base, 1); /* seems to assume view align ? TODO - look into this, could be an operator option */
|
||||
where_is_object(scene, obedit);
|
||||
|
||||
obedit->loc[0] += offset[0];
|
||||
|
@ -42,6 +42,9 @@ struct Mesh;
|
||||
struct Curve;
|
||||
struct ReportList;
|
||||
struct ModifierData;
|
||||
struct wmOperatorType;
|
||||
struct wmOperator;
|
||||
struct wmEvent;
|
||||
|
||||
/* object_edit.c */
|
||||
void ED_operatortypes_object(void);
|
||||
@ -74,8 +77,11 @@ void ED_object_toggle_modes(struct bContext *C, int mode);
|
||||
void ED_object_exit_editmode(struct bContext *C, int flag);
|
||||
void ED_object_enter_editmode(struct bContext *C, int flag);
|
||||
|
||||
void ED_object_base_init_from_view(struct bContext *C, struct Base *base);
|
||||
struct Object *ED_object_add_type(struct bContext *C, int type);
|
||||
void ED_object_base_init_from_view(struct bContext *C, struct Base *base, int view_align);
|
||||
void ED_object_add_generic_props(struct wmOperatorType *ot, int do_editmode);
|
||||
int ED_object_add_generic_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
|
||||
void ED_object_add_generic_get_opts(struct wmOperator *op, int *view_align, int *enter_editmode);
|
||||
struct Object *ED_object_add_type(struct bContext *C, int type, int view_align, int enter_editmode);
|
||||
|
||||
void ED_object_single_users(struct Scene *scene, int full);
|
||||
|
||||
|
@ -1273,7 +1273,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
|
||||
|
||||
/* uses context to figure out transform for primitive */
|
||||
/* returns standard diameter */
|
||||
static float new_primitive_matrix(bContext *C, float primmat[][4])
|
||||
static float new_primitive_matrix(bContext *C, int view_align, float primmat[][4])
|
||||
{
|
||||
Object *obedit= CTX_data_edit_object(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
@ -1283,7 +1283,7 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
|
||||
|
||||
Mat4One(primmat);
|
||||
|
||||
if(rv3d && (U.flag & USER_ADD_VIEWALIGNED)) {
|
||||
if(rv3d && view_align) {
|
||||
Mat3CpyMat4(vmat, rv3d->viewmat);
|
||||
} else
|
||||
Mat3One(vmat);
|
||||
@ -1307,7 +1307,8 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
|
||||
|
||||
/* ********* add primitive operators ************* */
|
||||
|
||||
static void make_prim_ext(bContext *C, int type, int tot, int seg,
|
||||
static void make_prim_ext(bContext *C, int view_align, int enter_editmode,
|
||||
int type, int tot, int seg,
|
||||
int subdiv, float dia, float depth, int ext, int fill)
|
||||
{
|
||||
Object *obedit= CTX_data_edit_object(C);
|
||||
@ -1316,14 +1317,14 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg,
|
||||
|
||||
if(obedit==NULL || obedit->type!=OB_MESH) {
|
||||
/* create editmode */
|
||||
ED_object_add_type(C, OB_MESH);
|
||||
ED_object_add_type(C, OB_MESH, view_align, FALSE);
|
||||
ED_object_enter_editmode(C, EM_DO_UNDO);
|
||||
obedit= CTX_data_edit_object(C);
|
||||
newob = 1;
|
||||
}
|
||||
else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
|
||||
|
||||
dia *= new_primitive_matrix(C, mat);
|
||||
dia *= new_primitive_matrix(C, view_align, mat);
|
||||
|
||||
make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill);
|
||||
|
||||
@ -1332,7 +1333,7 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg,
|
||||
|
||||
|
||||
/* userdef */
|
||||
if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
|
||||
if (newob && !enter_editmode) {
|
||||
ED_object_exit_editmode(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */
|
||||
}
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
|
||||
@ -1340,8 +1341,11 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg,
|
||||
|
||||
static int add_primitive_plane_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
/* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
|
||||
make_prim_ext(C, PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1);
|
||||
make_prim_ext(C, view_align, enter_editmode, PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@ -1353,17 +1357,23 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_plane_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_plane_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_cube_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
/* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
|
||||
make_prim_ext(C, PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1);
|
||||
make_prim_ext(C, view_align, enter_editmode, PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@ -1375,16 +1385,23 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_cube_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_cube_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_circle_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
RNA_float_get(op->ptr,"radius"), 0.0f, 0,
|
||||
RNA_boolean_get(op->ptr, "fill"));
|
||||
|
||||
@ -1399,6 +1416,7 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_circle_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_circle_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1409,11 +1427,17 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
|
||||
RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, "Vertices", "", 3, 500);
|
||||
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, "Radius", "", 0.001, 100.00);
|
||||
RNA_def_boolean(ot->srna, "fill", 0, "Fill", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_tube_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
RNA_float_get(op->ptr,"radius"),
|
||||
RNA_float_get(op->ptr, "depth"), 1,
|
||||
RNA_boolean_get(op->ptr, "cap_ends"));
|
||||
@ -1429,6 +1453,7 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_tube_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_tube_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1440,11 +1465,17 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot)
|
||||
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, "Radius", "", 0.001, 100.00);
|
||||
RNA_def_float(ot->srna, "depth", 1.0f, 0.0, FLT_MAX, "Depth", "", 0.001, 100.00);
|
||||
RNA_def_boolean(ot->srna, "cap_ends", 1, "Cap Ends", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_cone_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0,
|
||||
RNA_float_get(op->ptr,"radius"), RNA_float_get(op->ptr, "depth"),
|
||||
0, RNA_boolean_get(op->ptr, "cap_end"));
|
||||
|
||||
@ -1459,6 +1490,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_cone_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_cone_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1471,11 +1503,16 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
|
||||
RNA_def_float(ot->srna, "depth", 1.0f, 0.0, FLT_MAX, "Depth", "", 0.001, 100.00);
|
||||
RNA_def_boolean(ot->srna, "cap_end", 0, "Cap End", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_grid_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"),
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"),
|
||||
RNA_int_get(op->ptr, "y_subdivisions"), 0,
|
||||
RNA_float_get(op->ptr,"size"), 0.0f, 0, 1);
|
||||
|
||||
@ -1490,6 +1527,7 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_grid_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_grid_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1500,11 +1538,18 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
|
||||
RNA_def_int(ot->srna, "x_subdivisions", 10, INT_MIN, INT_MAX, "X Subdivisions", "", 3, 1000);
|
||||
RNA_def_int(ot->srna, "y_subdivisions", 10, INT_MIN, INT_MAX, "Y Subdivisions", "", 3, 1000);
|
||||
RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, "Size", "", 0.001, FLT_MAX);
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0);
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@ -1516,16 +1561,23 @@ void MESH_OT_primitive_monkey_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_monkey_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_monkey_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"),
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"),
|
||||
RNA_int_get(op->ptr, "segments"), 0,
|
||||
RNA_float_get(op->ptr,"size"), 0.0f, 0, 0);
|
||||
|
||||
@ -1540,6 +1592,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_uv_sphere_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_uvsphere_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1550,11 +1603,17 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
|
||||
RNA_def_int(ot->srna, "segments", 32, INT_MIN, INT_MAX, "Segments", "", 3, 500);
|
||||
RNA_def_int(ot->srna, "rings", 24, INT_MIN, INT_MAX, "Rings", "", 3, 500);
|
||||
RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, "Size", "", 0.001, 100.00);
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
make_prim_ext(C, PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"),
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
make_prim_ext(C, view_align, enter_editmode,
|
||||
PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"),
|
||||
RNA_float_get(op->ptr,"size"), 0.0f, 0, 0);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
@ -1568,6 +1627,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
|
||||
ot->idname= "MESH_OT_primitive_ico_sphere_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= add_primitive_icosphere_exec;
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
|
||||
@ -1577,6 +1637,8 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
|
||||
/* props */
|
||||
RNA_def_int(ot->srna, "subdivisions", 2, 0, 6, "Subdivisions", "", 0, 8);
|
||||
RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00);
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
/****************** add duplicate operator ***************/
|
||||
|
@ -99,7 +99,7 @@
|
||||
|
||||
/************************** Exported *****************************/
|
||||
|
||||
void ED_object_base_init_from_view(bContext *C, Base *base)
|
||||
void ED_object_base_init_from_view(bContext *C, Base *base, int view_align)
|
||||
{
|
||||
View3D *v3d= CTX_wm_view3d(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
@ -122,7 +122,7 @@ void ED_object_base_init_from_view(bContext *C, Base *base)
|
||||
VECCOPY(ob->loc, scene->cursor);
|
||||
}
|
||||
|
||||
if (U.flag & USER_ADD_VIEWALIGNED) {
|
||||
if (view_align) {
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
if(rv3d) {
|
||||
rv3d->viewquat[0]= -rv3d->viewquat[0];
|
||||
@ -141,8 +141,42 @@ void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menu
|
||||
/* keep here to get things compile, remove later */
|
||||
}
|
||||
|
||||
void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode)
|
||||
{
|
||||
RNA_def_boolean(ot->srna, "view_align", 0, "View Align", "Align the new object to the view.");
|
||||
|
||||
if(do_editmode)
|
||||
RNA_def_boolean(ot->srna, "enter_editmode", 0, "Enter Editmode", "Enter editmode when adding this object.");
|
||||
}
|
||||
|
||||
static void object_add_generic_invoke_options(bContext *C, wmOperator *op)
|
||||
{
|
||||
if (!RNA_property_is_set(op->ptr, "view_align"))
|
||||
RNA_boolean_set(op->ptr, "view_align", U.flag & USER_ADD_VIEWALIGNED);
|
||||
|
||||
if(RNA_struct_find_property(op->ptr, "enter_editmode")) /* optional */
|
||||
if (!RNA_property_is_set(op->ptr, "enter_editmode"))
|
||||
RNA_boolean_set(op->ptr, "enter_editmode", U.flag & USER_ADD_EDITMODE);
|
||||
}
|
||||
|
||||
int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
object_add_generic_invoke_options(C, op);
|
||||
return op->type->exec(C, op);
|
||||
}
|
||||
|
||||
void ED_object_add_generic_get_opts(wmOperator *op, int *view_align, int *enter_editmode)
|
||||
{
|
||||
*view_align= RNA_boolean_get(op->ptr, "view_align");
|
||||
*enter_editmode = FALSE;
|
||||
|
||||
if(RNA_struct_find_property(op->ptr, "enter_editmode") && RNA_boolean_get(op->ptr, "enter_editmode")) {
|
||||
*enter_editmode = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* for object add primitive operators */
|
||||
Object *ED_object_add_type(bContext *C, int type)
|
||||
Object *ED_object_add_type(bContext *C, int type, int view_align, int enter_editmode)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Object *ob;
|
||||
@ -157,17 +191,22 @@ Object *ED_object_add_type(bContext *C, int type)
|
||||
ED_base_object_activate(C, BASACT);
|
||||
|
||||
/* more editor stuff */
|
||||
ED_object_base_init_from_view(C, BASACT);
|
||||
ED_object_base_init_from_view(C, BASACT, view_align);
|
||||
|
||||
DAG_scene_sort(scene);
|
||||
|
||||
if(enter_editmode)
|
||||
ED_object_enter_editmode(C, 0);
|
||||
|
||||
return ob;
|
||||
}
|
||||
|
||||
/* for object add operator */
|
||||
static int object_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
ED_object_add_type(C, RNA_enum_get(op->ptr, "type"));
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), view_align, enter_editmode);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
@ -180,7 +219,7 @@ void OBJECT_OT_add(wmOperatorType *ot)
|
||||
ot->idname= "OBJECT_OT_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= WM_menu_invoke;
|
||||
ot->invoke= ED_object_add_generic_invoke;
|
||||
ot->exec= object_add_exec;
|
||||
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
@ -189,6 +228,8 @@ void OBJECT_OT_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "type", object_type_items, 0, "Type", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
/********************* Add Effector Operator ********************/
|
||||
@ -215,53 +256,41 @@ void add_effector_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or me
|
||||
}
|
||||
|
||||
/* for effector add primitive operators */
|
||||
static Object *effector_add_type(bContext *C, int type)
|
||||
static Object *effector_add_type(bContext *C, wmOperator *op, int type)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Object *ob;
|
||||
|
||||
/* for as long scene has editmode... */
|
||||
if (CTX_data_edit_object(C))
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO); /* freedata, and undo */
|
||||
|
||||
/* deselects all, sets scene->basact */
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(type==PFIELD_GUIDE) {
|
||||
ob = add_object(scene, OB_CURVE);
|
||||
ob= ED_object_add_type(C, OB_CURVE, view_align, FALSE);
|
||||
|
||||
((Curve*)ob->data)->flag |= CU_PATH|CU_3D;
|
||||
ED_object_enter_editmode(C, 0);
|
||||
BLI_addtail(curve_get_editcurve(ob), add_nurbs_primitive(C, CU_NURBS|CU_PRIM_PATH, 1));
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
|
||||
if(!enter_editmode)
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
}
|
||||
else {
|
||||
ob= add_object(scene, OB_EMPTY);
|
||||
|
||||
ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE);
|
||||
switch(type) {
|
||||
case PFIELD_WIND:
|
||||
case PFIELD_VORTEX:
|
||||
ob->empty_drawtype = OB_SINGLE_ARROW;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ob->pd= object_add_collision_fields(type);
|
||||
|
||||
/* editor level activate, notifiers */
|
||||
ED_base_object_activate(C, BASACT);
|
||||
|
||||
/* more editor stuff */
|
||||
ED_object_base_init_from_view(C, BASACT);
|
||||
|
||||
DAG_scene_sort(scene);
|
||||
|
||||
return ob;
|
||||
}
|
||||
|
||||
/* for object add operator */
|
||||
static int effector_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
effector_add_type(C, RNA_int_get(op->ptr, "type"));
|
||||
effector_add_type(C, op, RNA_int_get(op->ptr, "type"));
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
@ -283,6 +312,8 @@ void OBJECT_OT_effector_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "type", field_type_items, 0, "Type", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
/* ***************** add primitives *************** */
|
||||
@ -302,10 +333,11 @@ static int object_add_curve_exec(bContext *C, wmOperator *op)
|
||||
ListBase *editnurb;
|
||||
Nurb *nu;
|
||||
int newob= 0, type= RNA_enum_get(op->ptr, "type");
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(obedit==NULL || obedit->type!=OB_CURVE) {
|
||||
ED_object_add_type(C, OB_CURVE);
|
||||
ED_object_enter_editmode(C, 0);
|
||||
ED_object_add_type(C, OB_CURVE, view_align, TRUE);
|
||||
newob = 1;
|
||||
obedit= CTX_data_edit_object(C);
|
||||
|
||||
@ -319,7 +351,7 @@ static int object_add_curve_exec(bContext *C, wmOperator *op)
|
||||
BLI_addtail(editnurb, nu);
|
||||
|
||||
/* userdef */
|
||||
if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
|
||||
if (newob && !enter_editmode) {
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
}
|
||||
|
||||
@ -334,6 +366,8 @@ static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
uiPopupMenu *pup;
|
||||
uiLayout *layout;
|
||||
|
||||
object_add_generic_invoke_options(C, op);
|
||||
|
||||
pup= uiPupMenuBegin(C, op->type->name, 0);
|
||||
layout= uiPupMenuLayout(pup);
|
||||
if(!obedit || obedit->type == OB_CURVE)
|
||||
@ -362,6 +396,8 @@ void OBJECT_OT_curve_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", "");
|
||||
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static EnumPropertyItem prop_surface_types[]= {
|
||||
@ -380,10 +416,11 @@ static int object_add_surface_exec(bContext *C, wmOperator *op)
|
||||
ListBase *editnurb;
|
||||
Nurb *nu;
|
||||
int newob= 0;
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(obedit==NULL || obedit->type!=OB_SURF) {
|
||||
ED_object_add_type(C, OB_SURF);
|
||||
ED_object_enter_editmode(C, 0);
|
||||
ED_object_add_type(C, OB_SURF, view_align, TRUE);
|
||||
newob = 1;
|
||||
}
|
||||
else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
|
||||
@ -394,7 +431,7 @@ static int object_add_surface_exec(bContext *C, wmOperator *op)
|
||||
BLI_addtail(editnurb, nu);
|
||||
|
||||
/* userdef */
|
||||
if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
|
||||
if (newob && !enter_editmode) {
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
}
|
||||
|
||||
@ -411,7 +448,7 @@ void OBJECT_OT_surface_add(wmOperatorType *ot)
|
||||
ot->idname= "OBJECT_OT_surface_add";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= WM_menu_invoke;
|
||||
ot->invoke= ED_object_add_generic_invoke; // WM_menu_invoke
|
||||
ot->exec= object_add_surface_exec;
|
||||
|
||||
ot->poll= ED_operator_scene_editable;
|
||||
@ -420,6 +457,7 @@ void OBJECT_OT_surface_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", "");
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static EnumPropertyItem prop_metaball_types[]= {
|
||||
@ -437,10 +475,11 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
|
||||
MetaBall *mball;
|
||||
MetaElem *elem;
|
||||
int newob= 0;
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(obedit==NULL || obedit->type!=OB_MBALL) {
|
||||
ED_object_add_type(C, OB_MBALL);
|
||||
ED_object_enter_editmode(C, 0);
|
||||
ED_object_add_type(C, OB_MBALL, view_align, TRUE);
|
||||
newob = 1;
|
||||
}
|
||||
else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
|
||||
@ -451,7 +490,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
|
||||
BLI_addtail(mball->editelems, elem);
|
||||
|
||||
/* userdef */
|
||||
if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
|
||||
if (newob && !enter_editmode) {
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
}
|
||||
|
||||
@ -466,6 +505,8 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *even
|
||||
uiPopupMenu *pup;
|
||||
uiLayout *layout;
|
||||
|
||||
object_add_generic_invoke_options(C, op);
|
||||
|
||||
pup= uiPupMenuBegin(C, op->type->name, 0);
|
||||
layout= uiPupMenuLayout(pup);
|
||||
if(!obedit || obedit->type == OB_MBALL)
|
||||
@ -493,19 +534,19 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", "");
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
static int object_add_text_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *obedit= CTX_data_edit_object(C);
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(obedit && obedit->type==OB_FONT)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
ED_object_add_type(C, OB_FONT);
|
||||
ED_object_add_type(C, OB_FONT, view_align, enter_editmode);
|
||||
obedit= CTX_data_active_object(C);
|
||||
|
||||
if(U.flag & USER_ADD_EDITMODE)
|
||||
ED_object_enter_editmode(C, 0);
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
|
||||
|
||||
@ -525,6 +566,7 @@ void OBJECT_OT_text_add(wmOperatorType *ot)
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int object_armature_add_exec(bContext *C, wmOperator *op)
|
||||
@ -533,9 +575,11 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
|
||||
View3D *v3d= CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d= NULL;
|
||||
int newob= 0;
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) {
|
||||
obedit= ED_object_add_type(C, OB_ARMATURE);
|
||||
obedit= ED_object_add_type(C, OB_ARMATURE, view_align, TRUE);
|
||||
ED_object_enter_editmode(C, 0);
|
||||
obedit= CTX_data_edit_object(C);
|
||||
newob = 1;
|
||||
@ -554,7 +598,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
|
||||
add_primitive_bone(CTX_data_scene(C), v3d, rv3d);
|
||||
|
||||
/* userdef */
|
||||
if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
|
||||
if (newob && !enter_editmode) {
|
||||
ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
|
||||
}
|
||||
|
||||
@ -576,14 +620,17 @@ void OBJECT_OT_armature_add(wmOperatorType *ot)
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
ED_object_add_generic_props(ot, TRUE);
|
||||
}
|
||||
|
||||
static int object_lamp_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *ob;
|
||||
int type= RNA_enum_get(op->ptr, "type");
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
ob= ED_object_add_type(C, OB_LAMP);
|
||||
ob= ED_object_add_type(C, OB_LAMP, view_align, FALSE);
|
||||
if(ob && ob->data)
|
||||
((Lamp*)ob->data)->type= type;
|
||||
|
||||
@ -615,6 +662,8 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot)
|
||||
|
||||
/* properties */
|
||||
RNA_def_enum(ot->srna, "type", lamp_type_items, 0, "Type", "");
|
||||
|
||||
ED_object_add_generic_props(ot, FALSE);
|
||||
}
|
||||
|
||||
/* add dupligroup */
|
||||
@ -644,8 +693,11 @@ static int group_instance_add_exec(bContext *C, wmOperator *op)
|
||||
/* XXX, using an enum for library lookups is a bit dodgy */
|
||||
Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "type"));
|
||||
|
||||
int view_align, enter_editmode;
|
||||
ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
|
||||
|
||||
if(group) {
|
||||
Object *ob= ED_object_add_type(C, OB_EMPTY);
|
||||
Object *ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE);
|
||||
rename_id(&ob->id, group->id.name+2);
|
||||
ob->dup_group= group;
|
||||
ob->transflag |= OB_DUPLIGROUP;
|
||||
@ -684,6 +736,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot)
|
||||
/* properties */
|
||||
prop= RNA_def_enum(ot->srna, "type", prop_group_dummy_types, 0, "Type", "");
|
||||
RNA_def_enum_funcs(prop, add_dupligroup_itemf);
|
||||
ED_object_add_generic_props(ot, FALSE);
|
||||
}
|
||||
|
||||
/**************************** Delete Object *************************/
|
||||
|
@ -1272,7 +1272,7 @@ static char *wpaint_make_validmap(Mesh *me, Object *ob)
|
||||
}
|
||||
|
||||
if (!i)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
validmap = MEM_callocN(i, "wpaint valid map");
|
||||
|
||||
|
@ -1970,7 +1970,10 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot)
|
||||
ot->invoke= set_3dcursor_invoke;
|
||||
|
||||
ot->poll= ED_operator_view3d_active;
|
||||
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
/* rna later */
|
||||
|
||||
}
|
||||
|
@ -903,6 +903,9 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
|
||||
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
|
||||
IDProperty *idprop;
|
||||
|
||||
/* just incase other values are passed */
|
||||
if(value) value= 1;
|
||||
|
||||
if((idprop=rna_idproperty_check(&prop, ptr)))
|
||||
IDP_Int(idprop)= value;
|
||||
else if(bprop->set)
|
||||
|
Loading…
Reference in New Issue
Block a user