static int object_add_surface_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); ListBase *editnurb; Nurb *nu; int newob= 0; if(obedit==NULL || obedit->type!=OB_SURF) { ED_object_add_type(C, OB_SURF); ED_object_enter_editmode(C, 0); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); obedit= CTX_data_edit_object(C); nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob); editnurb= curve_get_editcurve(obedit); BLI_addtail(editnurb, nu); /* userdef */ if (newob && (U.flag & USER_ADD_EDITMODE)==0) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
static int object_armature_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); View3D *v3d= CTX_wm_view3d(C); RegionView3D *rv3d= NULL; int newob= 0; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { ED_object_add_type(C, OB_ARMATURE); ED_object_enter_editmode(C, 0); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); if(v3d) rv3d= CTX_wm_region(C)->regiondata; /* v3d and rv3d are allowed to be NULL */ add_primitive_bone(CTX_data_scene(C), v3d, rv3d); /* userdef */ if (newob && (U.flag & USER_ADD_EDITMODE)==0) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
static int group_instance_add_exec(bContext *C, wmOperator *op) { Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); int enter_editmode; unsigned int layer; float loc[3], rot[3]; object_add_generic_invoke_options(C, op); if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; if(group) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Object *ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE, layer); rename_id(&ob->id, group->id.name+2); ob->dup_group= group; ob->transflag |= OB_DUPLIGROUP; id_lib_extern(&group->id); /* works without this except if you try render right after, see: 22027 */ DAG_scene_sort(bmain, scene); WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C)); return OPERATOR_FINISHED; } return OPERATOR_CANCELLED; }
/* ***************** add primitives *************** */ static int object_metaball_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); /*MetaElem *elem;*/ /*UNUSED*/ int newob= 0; int enter_editmode; unsigned int layer; float loc[3], rot[3]; float mat[4][4]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; if(obedit==NULL || obedit->type!=OB_MBALL) { obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer); newob = 1; } else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); /* elem= (MetaElem *) */ add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob); /* userdef */ if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA); } WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
static int object_camera_add_exec(bContext *C, wmOperator *op) { View3D *v3d = CTX_wm_view3d(C); Scene *scene= CTX_data_scene(C); Object *ob; int enter_editmode; unsigned int layer; float loc[3], rot[3]; /* force view align for cameras */ RNA_boolean_set(op->ptr, "view_align", 1); object_add_generic_invoke_options(C, op); if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_CAMERA, loc, rot, FALSE, layer); if (v3d) { if (v3d->camera == NULL) v3d->camera = ob; if (v3d->scenelock && scene->camera==NULL) { scene->camera = ob; } } return OPERATOR_FINISHED; }
static int object_metaball_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); MetaBall *mball; MetaElem *elem; int newob= 0; if(obedit==NULL || obedit->type!=OB_MBALL) { ED_object_add_type(C, OB_MBALL); ED_object_enter_editmode(C, 0); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); obedit= CTX_data_edit_object(C); elem= (MetaElem*)add_metaball_primitive(C, RNA_enum_get(op->ptr, "type"), newob); mball= (MetaBall*)obedit->data; BLI_addtail(mball->editelems, elem); /* userdef */ if (newob && (U.flag & USER_ADD_EDITMODE)==0) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
/* for effector add primitive operators */ static Object *effector_add_type(bContext *C, wmOperator *op, int type) { Object *ob; int enter_editmode; unsigned int layer; float loc[3], rot[3]; float mat[4][4]; object_add_generic_invoke_options(C, op); if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return NULL; if(type==PFIELD_GUIDE) { ob= ED_object_add_type(C, OB_CURVE, loc, rot, FALSE, layer); rename_id(&ob->id, "CurveGuide"); ((Curve*)ob->data)->flag |= CU_PATH|CU_3D; ED_object_enter_editmode(C, 0); ED_object_new_primitive_matrix(C, ob, loc, rot, mat); BLI_addtail(curve_get_editcurve(ob), add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_PATH, 1)); if(!enter_editmode) ED_object_exit_editmode(C, EM_FREEDATA); } else { ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE, layer); rename_id(&ob->id, "Field"); switch(type) { case PFIELD_WIND: case PFIELD_VORTEX: ob->empty_drawtype = OB_SINGLE_ARROW; break; } } ob->pd= object_add_collision_fields(type); DAG_scene_sort(CTX_data_main(C), CTX_data_scene(C)); return ob; }
static int object_lamp_add_exec(bContext *C, wmOperator *op) { Object *ob; int type= RNA_enum_get(op->ptr, "type"); ob= ED_object_add_type(C, OB_LAMP); if(ob && ob->data) ((Lamp*)ob->data)->type= type; return OPERATOR_FINISHED; }
static void group_instance_cb(bContext *C, Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem) { Group *group = (Group *)tselem->id; Object *ob = ED_object_add_type(C, OB_EMPTY, scene->cursor, NULL, FALSE, scene->layact); rename_id(&ob->id, group->id.name + 2); ob->dup_group = group; ob->transflag |= OB_DUPLIGROUP; id_lib_extern(&group->id); }
/* for object add operator */ static int object_add_exec(bContext *C, wmOperator *op) { int enter_editmode; unsigned int layer; float loc[3], rot[3]; if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer); return OPERATOR_FINISHED; }
static int object_add_text_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); if(obedit && obedit->type==OB_FONT) return OPERATOR_CANCELLED; ED_object_add_type(C, OB_FONT); 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); return OPERATOR_FINISHED; }
static int object_lamp_add_exec(bContext *C, wmOperator *op) { Object *ob; int type= RNA_enum_get(op->ptr, "type"); int enter_editmode; unsigned int layer; float loc[3], rot[3]; object_add_generic_invoke_options(C, op); if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer); ((Lamp*)ob->data)->type= type; rename_id((ID *)ob, get_lamp_defname(type)); rename_id((ID *)ob->data, get_lamp_defname(type)); return OPERATOR_FINISHED; }
static void make_prim_init(bContext *C, const char *idname, float *dia, float mat[][4], int *state, float *loc, float *rot, unsigned int layer) { Object *obedit = CTX_data_edit_object(C); *state = 0; if (obedit == NULL || obedit->type != OB_MESH) { obedit = ED_object_add_type(C, OB_MESH, loc, rot, FALSE, layer); rename_id((ID *)obedit, idname); rename_id((ID *)obedit->data, idname); /* create editmode */ ED_object_enter_editmode(C, EM_DO_UNDO | EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ *state = 1; } *dia = new_primitive_matrix(C, loc, rot, mat); }
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")); if(group) { Object *ob= ED_object_add_type(C, OB_EMPTY); rename_id(&ob->id, group->id.name+2); ob->dup_group= group; ob->transflag |= OB_DUPLIGROUP; id_us_plus(&group->id); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); return OPERATOR_FINISHED; } return OPERATOR_CANCELLED; }
static int object_add_text_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); int enter_editmode; unsigned int layer; float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; if(obedit && obedit->type==OB_FONT) return OPERATOR_CANCELLED; obedit= ED_object_add_type(C, OB_FONT, loc, rot, enter_editmode, layer); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
static Object *make_prim_init(bContext *C, const char *idname, float *dia, float mat[4][4], bool *was_editmode, const float loc[3], const float rot[3], const unsigned int layer) { Object *obedit = CTX_data_edit_object(C); *was_editmode = false; if (obedit == NULL || obedit->type != OB_MESH) { obedit = ED_object_add_type(C, OB_MESH, loc, rot, false, layer); rename_id((ID *)obedit, idname); rename_id((ID *)obedit->data, idname); /* create editmode */ ED_object_editmode_enter(C, EM_DO_UNDO | EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ *was_editmode = true; } *dia = ED_object_new_primitive_matrix(C, obedit, loc, rot, mat, false); return obedit; }
static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmode, unsigned int layer, int type, int tot, int seg, int subdiv, float dia, float depth, int ext, int fill) { Object *obedit= CTX_data_edit_object(C); int newob = 0; float mat[4][4]; float scale; if(obedit==NULL || obedit->type!=OB_MESH) { obedit= ED_object_add_type(C, OB_MESH, loc, rot, FALSE, layer); rename_id((ID *)obedit, get_mesh_defname(type)); rename_id((ID *)obedit->data, get_mesh_defname(type)); /* create editmode */ ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ newob = 1; } else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); scale= ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); dia *= scale; depth *= scale * 0.5f; make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill); DAG_id_tag_update(obedit->data, 0); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); /* userdef */ 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); }
static int object_armature_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); View3D *v3d= CTX_wm_view3d(C); RegionView3D *rv3d= CTX_wm_region_view3d(C); int newob= 0; int enter_editmode; unsigned int layer; float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) return OPERATOR_CANCELLED; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { obedit= ED_object_add_type(C, OB_ARMATURE, loc, rot, TRUE, layer); ED_object_enter_editmode(C, 0); newob = 1; } else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); if(obedit==NULL) { BKE_report(op->reports, RPT_ERROR, "Cannot create editmode armature."); return OPERATOR_CANCELLED; } /* v3d and rv3d are allowed to be NULL */ add_primitive_bone(CTX_data_scene(C), v3d, rv3d); /* userdef */ if (newob && !enter_editmode) ED_object_exit_editmode(C, EM_FREEDATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); return OPERATOR_FINISHED; }
static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) { Object *obedit = CTX_data_edit_object(C); ListBase *editnurb; Nurb *nu; bool newob = false; bool enter_editmode, is_view_aligned; unsigned int layer; float dia; float loc[3], rot[3]; float mat[4][4]; WM_operator_view3d_unit_defaults(C, op); if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, &is_view_aligned)) return OPERATOR_CANCELLED; if (!isSurf) { /* adding curve */ if (obedit == NULL || obedit->type != OB_CURVE) { Curve *cu; obedit = ED_object_add_type(C, OB_CURVE, loc, rot, true, layer); newob = true; cu = (Curve *)obedit->data; cu->flag |= CU_DEFORM_FILL; if (type & CU_PRIM_PATH) cu->flag |= CU_PATH | CU_3D; } else { DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); } } else { /* adding surface */ if (obedit == NULL || obedit->type != OB_SURF) { obedit = ED_object_add_type(C, OB_SURF, loc, rot, true, layer); newob = true; } else { DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); } } /* rename here, the undo stack checks name for valid undo pushes */ if (newob) { if (obedit->type == OB_CURVE) { rename_id((ID *)obedit, get_curve_defname(type)); rename_id((ID *)obedit->data, get_curve_defname(type)); } else { rename_id((ID *)obedit, get_surf_defname(type)); rename_id((ID *)obedit->data, get_surf_defname(type)); } } /* ED_object_add_type doesnt do an undo, is needed for redo operator on primitive */ if (newob && enter_editmode) ED_undo_push(C, "Enter Editmode"); ED_object_new_primitive_matrix(C, obedit, loc, rot, mat, false); dia = RNA_float_get(op->ptr, "radius"); mat[0][0] *= dia; mat[1][1] *= dia; mat[2][2] *= dia; nu = add_nurbs_primitive(C, obedit, mat, type, newob); editnurb = object_editcurve_get(obedit); BLI_addtail(editnurb, nu); /* userdef */ if (newob && !enter_editmode) { ED_object_editmode_exit(C, EM_FREEDATA); } WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); return OPERATOR_FINISHED; }
static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) { Object *obedit = CTX_data_edit_object(C); ListBase *editnurb; Nurb *nu; bool newob = false; bool enter_editmode; unsigned int layer; float dia; float loc[3], rot[3]; float mat[4][4]; WM_operator_view3d_unit_defaults(C, op); if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if (!isSurf) { /* adding curve */ if (obedit == NULL || obedit->type != OB_CURVE) { const char *name = get_curve_defname(type); Curve *cu; obedit = ED_object_add_type(C, OB_CURVE, name, loc, rot, true, layer); newob = true; cu = (Curve *)obedit->data; cu->flag |= CU_DEFORM_FILL; if (type & CU_PRIM_PATH) cu->flag |= CU_PATH | CU_3D; } else { DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); } } else { /* adding surface */ if (obedit == NULL || obedit->type != OB_SURF) { const char *name = get_surf_defname(type); obedit = ED_object_add_type(C, OB_SURF, name, loc, rot, true, layer); newob = true; } else { DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); } } ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); dia = RNA_float_get(op->ptr, "radius"); mul_mat3_m4_fl(mat, dia); nu = ED_curve_add_nurbs_primitive(C, obedit, mat, type, newob); editnurb = object_editcurve_get(obedit); BLI_addtail(editnurb, nu); /* userdef */ if (newob && !enter_editmode) { ED_object_editmode_exit(C, EM_FREEDATA); } WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); return OPERATOR_FINISHED; }
static Object* createRepresentation(bContext *C, struct recast_polyMesh *pmesh, struct recast_polyMeshDetail *dmesh, Base* base) { float co[3], rot[3]; EditMesh *em; int i,j, k; unsigned short* v; int face[3]; Scene *scene= CTX_data_scene(C); Object* obedit; int createob= base==NULL; int nverts, nmeshes, nvp; unsigned short *verts, *polys; unsigned int *meshes; float bmin[3], cs, ch, *dverts; unsigned char *tris; zero_v3(co); zero_v3(rot); if(createob) { /* create new object */ obedit= ED_object_add_type(C, OB_MESH, co, rot, FALSE, 1); } else { obedit= base->object; scene_select_base(scene, base); copy_v3_v3(obedit->loc, co); copy_v3_v3(obedit->rot, rot); } ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); if(!createob) { /* clear */ if(em->verts.first) free_vertlist(em, &em->verts); if(em->edges.first) free_edgelist(em, &em->edges); if(em->faces.first) free_facelist(em, &em->faces); if(em->selected.first) BLI_freelistN(&(em->selected)); } /* create verts for polygon mesh */ verts= recast_polyMeshGetVerts(pmesh, &nverts); recast_polyMeshGetBoundbox(pmesh, bmin, NULL); recast_polyMeshGetCell(pmesh, &cs, &ch); for(i= 0; i<nverts; i++) { v= &verts[3*i]; co[0]= bmin[0] + v[0]*cs; co[1]= bmin[1] + v[1]*ch; co[2]= bmin[2] + v[2]*cs; SWAP(float, co[1], co[2]); addvertlist(em, co, NULL); } /* create custom data layer to save polygon idx */ CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "createRepresentation recastData"); /* create verts and faces for detailed mesh */ meshes= recast_polyMeshDetailGetMeshes(dmesh, &nmeshes); polys= recast_polyMeshGetPolys(pmesh, NULL, &nvp); dverts= recast_polyMeshDetailGetVerts(dmesh, NULL); tris= recast_polyMeshDetailGetTris(dmesh, NULL); for(i= 0; i<nmeshes; i++) { int uniquevbase= em->totvert; unsigned int vbase= meshes[4*i+0]; unsigned short ndv= meshes[4*i+1]; unsigned short tribase= meshes[4*i+2]; unsigned short trinum= meshes[4*i+3]; const unsigned short* p= &polys[i*nvp*2]; int nv= 0; for(j= 0; j < nvp; ++j) { if(p[j]==0xffff) break; nv++; } /* create unique verts */ for(j= nv; j<ndv; j++) { copy_v3_v3(co, &dverts[3*(vbase + j)]); SWAP(float, co[1], co[2]); addvertlist(em, co, NULL); } EM_init_index_arrays(em, 1, 0, 0); /* create faces */ for(j= 0; j<trinum; j++) { unsigned char* tri= &tris[4*(tribase+j)]; EditFace* newFace; int* polygonIdx; for(k= 0; k<3; k++) { if(tri[k]<nv) face[k]= p[tri[k]]; /* shared vertex */ else face[k]= uniquevbase+tri[k]-nv; /* unique vertex */ } newFace= addfacelist(em, EM_get_vert_for_index(face[0]), EM_get_vert_for_index(face[2]), EM_get_vert_for_index(face[1]), NULL, NULL, NULL); /* set navigation polygon idx to the custom layer */ polygonIdx= (int*)CustomData_em_get(&em->fdata, newFace->data, CD_RECAST); *polygonIdx= i+1; /* add 1 to avoid zero idx */ } EM_free_index_arrays(); } recast_destroyPolyMesh(pmesh); recast_destroyPolyMeshDetail(dmesh); BKE_mesh_end_editmesh((Mesh*)obedit->data, em); DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); ED_object_exit_editmode(C, EM_FREEDATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); if(createob) { obedit->gameflag&= ~OB_COLLISION; obedit->gameflag|= OB_NAVMESH; obedit->body_type= OB_BODY_TYPE_NAVMESH; rename_id((ID *)obedit, "Navmesh"); } BKE_mesh_ensure_navmesh(obedit->data); return obedit; }
/* for object add operator */ static int object_add_exec(bContext *C, wmOperator *op) { ED_object_add_type(C, RNA_enum_get(op->ptr, "type")); return OPERATOR_FINISHED; }