== 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:
@@ -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 */
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user