[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55900] trunk/blender/source/blender/ editors: fix for various crashes from incorrect poll functions.
Campbell Barton
ideasman42 at gmail.com
Mon Apr 8 12:03:51 CEST 2013
Revision: 55900
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55900
Author: campbellbarton
Date: 2013-04-08 10:03:51 +0000 (Mon, 08 Apr 2013)
Log Message:
-----------
fix for various crashes from incorrect poll functions.
- bevel had incorrect cancel when initialization failed which could crash (own mistake).
- main particle poll function didnt check if the area/region were NULL.
- some uv operators needed space image but didnt check for it. also use uv_ prefix for most operator functions.
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/ED_screen.h
trunk/blender/source/blender/editors/mesh/editmesh_bevel.c
trunk/blender/source/blender/editors/mesh/editmesh_inset.c
trunk/blender/source/blender/editors/physics/particle_edit.c
trunk/blender/source/blender/editors/screen/screen_ops.c
trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
Modified: trunk/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_screen.h 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/include/ED_screen.h 2013-04-08 10:03:51 UTC (rev 55900)
@@ -170,6 +170,7 @@
int ED_operator_editlattice(struct bContext *C);
int ED_operator_editmball(struct bContext *C);
int ED_operator_uvedit(struct bContext *C);
+int ED_operator_uvedit_space_image(struct bContext *C);
int ED_operator_uvmap(struct bContext *C);
int ED_operator_posemode_exclusive(struct bContext *C);
int ED_operator_posemode_context(struct bContext *C);
Modified: trunk/blender/source/blender/editors/mesh/editmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_bevel.c 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/mesh/editmesh_bevel.c 2013-04-08 10:03:51 UTC (rev 55900)
@@ -91,14 +91,14 @@
}
}
-static int edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal)
+static bool edbm_bevel_init(bContext *C, wmOperator *op, const bool is_modal)
{
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BMEdit_FromObject(obedit);
BevelData *opdata;
if (em->bm->totvertsel == 0) {
- return 0;
+ return false;
}
op->customdata = opdata = MEM_mallocN(sizeof(BevelData), "beveldata_mesh_operator");
@@ -122,10 +122,10 @@
v3d->twtype = 0;
}
- return 1;
+ return true;
}
-static int edbm_bevel_calc(wmOperator *op)
+static bool edbm_bevel_calc(wmOperator *op)
{
BevelData *opdata = op->customdata;
BMEditMesh *em = opdata->em;
@@ -139,12 +139,9 @@
EDBM_redo_state_restore(opdata->mesh_backup, em, false);
}
- if (!EDBM_op_init(em, &bmop, op,
- "bevel geom=%hev offset=%f segments=%i vertex_only=%b",
- BM_ELEM_SELECT, offset, segments, vertex_only))
- {
- return 0;
- }
+ EDBM_op_init(em, &bmop, op,
+ "bevel geom=%hev offset=%f segments=%i vertex_only=%b",
+ BM_ELEM_SELECT, offset, segments, vertex_only);
BMO_op_exec(em->bm, &bmop);
@@ -157,13 +154,13 @@
/* no need to de-select existing geometry */
if (!EDBM_op_finish(em, &bmop, op, true))
- return 0;
+ return false;
EDBM_mesh_normals_update(opdata->em);
EDBM_update_generic(opdata->em, true, true);
- return 1;
+ return true;
}
static void edbm_bevel_exit(bContext *C, wmOperator *op)
@@ -207,7 +204,6 @@
static int edbm_bevel_exec(bContext *C, wmOperator *op)
{
if (!edbm_bevel_init(C, op, false)) {
- edbm_bevel_exit(C, op);
return OPERATOR_CANCELLED;
}
Modified: trunk/blender/source/blender/editors/mesh/editmesh_inset.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_inset.c 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/mesh/editmesh_inset.c 2013-04-08 10:03:51 UTC (rev 55900)
@@ -107,14 +107,14 @@
}
-static int edbm_inset_init(bContext *C, wmOperator *op, const bool is_modal)
+static bool edbm_inset_init(bContext *C, wmOperator *op, const bool is_modal)
{
InsetData *opdata;
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BMEdit_FromObject(obedit);
if (em->bm->totvertsel == 0) {
- return 0;
+ return false;
}
op->customdata = opdata = MEM_mallocN(sizeof(InsetData), "inset_operator_data");
@@ -141,7 +141,7 @@
v3d->twtype = 0;
}
- return 1;
+ return true;
}
static void edbm_inset_exit(bContext *C, wmOperator *op)
@@ -183,7 +183,7 @@
return OPERATOR_CANCELLED;
}
-static int edbm_inset_calc(wmOperator *op)
+static bool edbm_inset_calc(wmOperator *op)
{
InsetData *opdata;
BMEditMesh *em;
@@ -233,11 +233,11 @@
}
if (!EDBM_op_finish(em, &bmop, op, true)) {
- return 0;
+ return false;
}
else {
EDBM_update_generic(em, true, true);
- return 1;
+ return true;
}
}
Modified: trunk/blender/source/blender/editors/physics/particle_edit.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_edit.c 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/physics/particle_edit.c 2013-04-08 10:03:51 UTC (rev 55900)
@@ -132,8 +132,12 @@
int PE_poll_view3d(bContext *C)
{
- return PE_poll(C) && CTX_wm_area(C)->spacetype == SPACE_VIEW3D &&
- CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW;
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
+
+ return (PE_poll(C) &&
+ (sa && sa->spacetype == SPACE_VIEW3D) &&
+ (ar && ar->regiontype == RGN_TYPE_WINDOW));
}
void PE_free_ptcache_edit(PTCacheEdit *edit)
Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c 2013-04-08 10:03:51 UTC (rev 55900)
@@ -421,6 +421,13 @@
return ED_space_image_show_uvedit(sima, obedit);
}
+int ED_operator_uvedit_space_image(bContext *C)
+{
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Object *obedit = CTX_data_edit_object(C);
+ return sima && ED_space_image_show_uvedit(sima, obedit);
+}
+
int ED_operator_uvmap(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2013-04-08 09:52:43 UTC (rev 55899)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2013-04-08 10:03:51 UTC (rev 55900)
@@ -83,7 +83,7 @@
#include "uvedit_intern.h"
-static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+static void uv_select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
/************************* state testing ************************/
@@ -742,7 +742,7 @@
}
}
-static void find_nearest_uv_face(Scene *scene, Image *ima, BMEditMesh *em, const float co[2], NearestHit *hit)
+static void uv_find_nearest_face(Scene *scene, Image *ima, BMEditMesh *em, const float co[2], NearestHit *hit)
{
MTexPoly *tf;
BMFace *efa;
@@ -776,7 +776,7 @@
}
}
-static int nearest_uv_between(BMEditMesh *em, BMFace *efa, int UNUSED(nverts), int id,
+static int uv_nearest_between(BMEditMesh *em, BMFace *efa, int UNUSED(nverts), int id,
const float co[2], const float uv[2])
{
BMLoop *l;
@@ -864,7 +864,7 @@
if (dist <= mindist) {
if (dist == mindist)
- if (!nearest_uv_between(em, efa, efa->len, i, co, luv->uv)) {
+ if (!uv_nearest_between(em, efa, efa->len, i, co, luv->uv)) {
i++;
continue;
}
@@ -926,7 +926,7 @@
/*********************** loop select ***********************/
-static void select_edgeloop_uv_vertex_loop_flag(UvMapVert *first)
+static void uv_select_edgeloop_vertex_loop_flag(UvMapVert *first)
{
UvMapVert *iterv;
int count = 0;
@@ -942,7 +942,7 @@
first->flag = 1;
}
-static UvMapVert *select_edgeloop_uv_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a)
+static UvMapVert *uv_select_edgeloop_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a)
{
UvMapVert *iterv, *first;
BMLoop *l;
@@ -960,7 +960,7 @@
return NULL;
}
-static int select_edgeloop_uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface)
+static int uv_select_edgeloop_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface)
{
UvMapVert *iterv1, *iterv2;
BMFace *efa;
@@ -1012,8 +1012,8 @@
return 1;
}
-static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit,
- float limit[2], const bool extend)
+static int uv_select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit,
+ float limit[2], const bool extend)
{
BMFace *efa;
BMIter iter, liter;
@@ -1032,20 +1032,20 @@
BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE);
if (!extend) {
- select_all_perform(scene, ima, em, SEL_DESELECT);
+ uv_select_all_perform(scene, ima, em, SEL_DESELECT);
}
BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, FALSE);
/* set flags for first face and verts */
nverts = hit->efa->len;
- iterv1 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, hit->lindex);
- iterv2 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts);
- select_edgeloop_uv_vertex_loop_flag(iterv1);
- select_edgeloop_uv_vertex_loop_flag(iterv2);
+ iterv1 = uv_select_edgeloop_vertex_map_get(vmap, hit->efa, hit->lindex);
+ iterv2 = uv_select_edgeloop_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts);
+ uv_select_edgeloop_vertex_loop_flag(iterv1);
+ uv_select_edgeloop_vertex_loop_flag(iterv2);
starttotf = 0;
- select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf);
+ uv_select_edgeloop_edge_tag_faces(em, iterv1, iterv2, &starttotf);
/* sorry, first edge isn't even ok */
if (iterv1->flag == 0 && iterv2->flag == 0) looking = 0;
@@ -1064,20 +1064,20 @@
nverts = efa->len;
for (a = 0; a < nverts; a++) {
/* check face not hidden and not tagged */
- iterv1 = select_edgeloop_uv_vertex_map_get(vmap, efa, a);
- iterv2 = select_edgeloop_uv_vertex_map_get(vmap, efa, (a + 1) % nverts);
+ iterv1 = uv_select_edgeloop_vertex_map_get(vmap, efa, a);
+ iterv2 = uv_select_edgeloop_vertex_map_get(vmap, efa, (a + 1) % nverts);
if (!iterv1 || !iterv2)
continue;
/* check if vertex is tagged and has right valence */
if (iterv1->flag || iterv2->flag) {
- if (select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf)) {
+ if (uv_select_edgeloop_edge_tag_faces(em, iterv1, iterv2, &starttotf)) {
looking = 1;
BM_elem_flag_enable(efa, BM_ELEM_TAG);
- select_edgeloop_uv_vertex_loop_flag(iterv1);
- select_edgeloop_uv_vertex_loop_flag(iterv2);
+ uv_select_edgeloop_vertex_loop_flag(iterv1);
+ uv_select_edgeloop_vertex_loop_flag(iterv2);
break;
}
}
@@ -1088,8 +1088,8 @@
/* do the actual select/deselect */
nverts = hit->efa->len;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list