== Multires ==

Fixed bug #6153, Blender Crash during rendering (internal) with object selected in edit mode.

* Added a render parameter to several of multires's functions. If render==true, multires won't push data onto the undo stack, and regular Mesh data is always used (as opposed to EditMesh data.)
This commit is contained in:
Nicholas Bishop
2007-03-08 05:54:39 +00:00
parent f361c49d70
commit 4bd5ab628b
9 changed files with 35 additions and 31 deletions

View File

@@ -201,8 +201,8 @@ struct Multires;
struct MultiresLevel;
struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
void multires_free(struct Multires *mr);
void multires_set_level(void *ob, void *me_v);
void multires_update_levels(struct Mesh *me);
void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
void multires_update_levels(struct Mesh *me, const int render);
void multires_calc_level_maps(struct MultiresLevel *lvl);
struct Multires *multires_copy(struct Multires *orig);
/* sculptmode.c */

View File

@@ -294,8 +294,8 @@ void post_server_add(void) {}
/* Multires/sculpt stubs */
struct MultiresLevel *multires_level_n(struct Multires *mr, int n) {return NULL;}
void multires_free(struct Multires *mr) {}
void multires_set_level(void *ob, void *me_v) {}
void multires_update_levels(struct Mesh *me) {}
void multires_set_level(struct Object *ob, struct Mesh *me, const int render) {}
void multires_update_levels(struct Mesh *me, const int render) {}
void multires_calc_level_maps(struct MultiresLevel *lvl) {}
struct Multires *multires_copy(struct Multires *orig) {return NULL;}
void sculptmode_init(struct Scene *sce) {}

View File

@@ -2225,7 +2225,7 @@ float *multires_render_pin(Object *ob, Mesh *me, int *orig_lvl)
int i;
/* Make sure all mesh edits are properly stored in the multires data*/
multires_update_levels(me);
multires_update_levels(me, 1);
/* Copy the highest level of multires verts */
*orig_lvl= me->mr->current;
@@ -2236,7 +2236,7 @@ float *multires_render_pin(Object *ob, Mesh *me, int *orig_lvl)
/* Goto the pin level for multires */
me->mr->newlvl= me->mr->pinlvl;
multires_set_level(ob, me);
multires_set_level(ob, me, 1);
}
return vert_copy;
@@ -2256,7 +2256,7 @@ void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_c
(*dm)->release(*dm);
me->mr->newlvl= me->mr->renderlvl;
multires_set_level(ob, me);
multires_set_level(ob, me, 1);
(*dm)= getMeshDerivedMesh(me, ob, NULL);
/* Some of the data in dm is referenced externally, so make a copy */
@@ -2266,7 +2266,7 @@ void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_c
/* Restore the original verts */
me->mr->newlvl= BLI_countlist(&me->mr->levels);
multires_set_level(ob, me);
multires_set_level(ob, me, 1);
for(i=0; i<lvl->totvert; ++i)
VecCopyf(me->mvert[i].co, &vert_copy[i*3]);
}
@@ -2275,7 +2275,7 @@ void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_c
MEM_freeN(vert_copy);
me->mr->newlvl= orig_lvl;
multires_set_level(ob, me);
multires_set_level(ob, me, 1);
}
}

View File

@@ -55,9 +55,10 @@ void multires_free_level(struct MultiresLevel *lvl);
void multires_del_lower(void *ob, void *me);
void multires_del_higher(void *ob, void *me);
void multires_add_level(void *ob, void *me);
void multires_set_level(void *ob, void *me);
void multires_update_levels(struct Mesh *me);
void multires_level_to_mesh(struct Object *ob, struct Mesh *me);
void multires_set_level_cb(void *ob, void *me);
void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
void multires_update_levels(struct Mesh *me, const int render);
void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int render);
void multires_calc_level_maps(struct MultiresLevel *lvl);
void multires_edge_level_update(void *ob, void *me);
int multires_modifier_warning();

View File

@@ -6618,7 +6618,7 @@ static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type )
switch ((int)type) {
case MESH_MULTIRES_LEVEL:
self->mesh->mr->newlvl = i;
multires_set_level(self->object, self->mesh);
multires_set_level(self->object, self->mesh, 0);
break;
case MESH_MULTIRES_EDGE:
self->mesh->mr->edgelvl = i;

View File

@@ -5196,7 +5196,7 @@ void editing_panel_mesh_multires()
cy-= 20;
but= uiDefButC(block,NUM,B_NOP,"Level: ",cx,cy,200,19,&me->mr->newlvl,1.0,me->mr->level_count,0,0,"");
uiButSetFunc(but,multires_set_level,ob,me);
uiButSetFunc(but,multires_set_level_cb, ob, me);
cy-= 20;
but= uiDefButC(block,NUM,B_NOP,"Edges: ",cx,cy,200,19,&me->mr->edgelvl,1.0,me->mr->level_count,0,0,"Set level of edges to display");

View File

@@ -346,12 +346,12 @@ void multires_delete_layer(Mesh *me, CustomData *cd, const int type, int n)
if(me && me->mr && cd) {
MultiresLevel *lvl1= me->mr->levels.first;
multires_update_levels(me);
multires_update_levels(me, 0);
CustomData_set_layer_active(cd, type, n);
CustomData_free_layer_active(cd, type, lvl1->totface);
multires_level_to_mesh(OBACT, me);
multires_level_to_mesh(OBACT, me, 0);
}
}
@@ -359,7 +359,7 @@ MultiresLevel *current_level(Multires *mr);
void multires_add_layer(Mesh *me, CustomData *cd, const int type, const int n)
{
if(me && me->mr && cd) {
multires_update_levels(me);
multires_update_levels(me, 0);
if(CustomData_has_layer(cd, type))
CustomData_add_layer(cd, type, CD_DUPLICATE, CustomData_get_layer(cd, type),
@@ -368,6 +368,6 @@ void multires_add_layer(Mesh *me, CustomData *cd, const int type, const int n)
CustomData_add_layer(cd, type, CD_DEFAULT, NULL, current_level(me->mr)->totface);
CustomData_set_layer_active(cd, type, n);
multires_level_to_mesh(OBACT, me);
multires_level_to_mesh(OBACT, me, 0);
}
}

View File

@@ -994,7 +994,7 @@ void multires_add_level(void *ob, void *me_v)
}
}
multires_update_levels(me);
multires_update_levels(me, 0);
me->mr->newlvl= me->mr->level_count;
me->mr->current= me->mr->newlvl;
/* Unless the render level has been set to something other than the
@@ -1002,7 +1002,7 @@ void multires_add_level(void *ob, void *me_v)
the highest available level */
if(me->mr->renderlvl == me->mr->level_count - 1) me->mr->renderlvl= me->mr->level_count;
multires_level_to_mesh(ob,me);
multires_level_to_mesh(ob, me, 0);
allqueue(REDRAWBUTSEDIT, 0);
@@ -1011,10 +1011,13 @@ void multires_add_level(void *ob, void *me_v)
waitcursor(0);
}
void multires_set_level(void *ob, void *me_v)
void multires_set_level_cb(void *ob, void *me)
{
Mesh *me= me_v;
multires_set_level(ob, me, 1);
}
void multires_set_level(struct Object *ob, struct Mesh *me, const int render)
{
waitcursor(1);
multires_check_state();
@@ -1022,15 +1025,15 @@ void multires_set_level(void *ob, void *me_v)
if(me->pv) sculptmode_pmv_off(me);
check_colors(me);
multires_update_levels(me);
multires_update_levels(me, render);
me->mr->current= me->mr->newlvl;
if(me->mr->current<1) me->mr->current= 1;
else if(me->mr->current>me->mr->level_count) me->mr->current= me->mr->level_count;
multires_level_to_mesh(ob,me);
multires_level_to_mesh(ob, me, render);
if(G.obedit || G.f & G_SCULPTMODE)
if(!render && (G.obedit || G.f & G_SCULPTMODE))
BIF_undo_push("Multires set level");
allqueue(REDRAWBUTSEDIT, 0);
@@ -1053,11 +1056,11 @@ void medge_flag_to_eed(const short flag, const char crease, EditEdge *eed)
}
/* note, function is called in background render too, without UI */
void multires_level_to_mesh(Object *ob, Mesh *me)
void multires_level_to_mesh(Object *ob, Mesh *me, const int render)
{
MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
int i;
EditMesh *em= G.obedit ? G.editMesh : NULL;
EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
EditVert **eves= NULL;
EditEdge *eed= NULL;
@@ -1326,7 +1329,7 @@ void multires_update_edge_flags(Multires *mr, Mesh *me, EditMesh *em)
}
}
void multires_update_levels(Mesh *me)
void multires_update_levels(Mesh *me, const int render)
{
/* cr=current, pr=previous, or=original */
MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl;
@@ -1334,7 +1337,7 @@ void multires_update_levels(Mesh *me)
vec3f *pr_deltas= NULL, *cr_deltas= NULL;
char *pr_flag_damaged= NULL, *cr_flag_damaged= NULL, *pr_mat_damaged= NULL, *cr_mat_damaged= NULL;
char *or_flag_damaged= NULL, *or_mat_damaged= NULL;
EditMesh *em= G.obedit ? G.editMesh : NULL;
EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
EditVert *eve= NULL;
EditFace *efa= NULL;
MultiApplyData data;

View File

@@ -1337,13 +1337,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PAGEUPKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current+1;
multires_set_level(ob,ob->data);
multires_set_level(ob, ob->data, 0);
}
break;
case PAGEDOWNKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current-1;
multires_set_level(ob,ob->data);
multires_set_level(ob, ob->data, 0);
}
break;
/* Partial Visibility */