Fix #22661: Multires/Sculpt Segfult
- Show error message in multires modifier if there is no MDISPS layer - Sculpt on basis mesh if there is no the same layer
This commit is contained in:
@@ -112,8 +112,14 @@ void ED_sculpt_force_update(bContext *C)
|
|||||||
it's the last modifier on the stack and it is not on the first level */
|
it's the last modifier on the stack and it is not on the first level */
|
||||||
struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
|
struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
|
||||||
{
|
{
|
||||||
|
Mesh *me= (Mesh*)ob->data;
|
||||||
ModifierData *md, *nmd;
|
ModifierData *md, *nmd;
|
||||||
|
|
||||||
|
if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
|
||||||
|
/* multires can't work without displacement layer */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
|
for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
|
||||||
if(md->type == eModifierType_Multires) {
|
if(md->type == eModifierType_Multires) {
|
||||||
MultiresModifierData *mmd= (MultiresModifierData*)md;
|
MultiresModifierData *mmd= (MultiresModifierData*)md;
|
||||||
|
@@ -38,6 +38,8 @@
|
|||||||
#include "BKE_paint.h"
|
#include "BKE_paint.h"
|
||||||
#include "BKE_particle.h"
|
#include "BKE_particle.h"
|
||||||
|
|
||||||
|
#include "DNA_mesh_types.h"
|
||||||
|
|
||||||
static void initData(ModifierData *md)
|
static void initData(ModifierData *md)
|
||||||
{
|
{
|
||||||
MultiresModifierData *mmd = (MultiresModifierData*)md;
|
MultiresModifierData *mmd = (MultiresModifierData*)md;
|
||||||
@@ -66,6 +68,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
|
|||||||
int sculpting= (ob->mode & OB_MODE_SCULPT) && ss;
|
int sculpting= (ob->mode & OB_MODE_SCULPT) && ss;
|
||||||
MultiresModifierData *mmd = (MultiresModifierData*)md;
|
MultiresModifierData *mmd = (MultiresModifierData*)md;
|
||||||
DerivedMesh *result;
|
DerivedMesh *result;
|
||||||
|
Mesh *me= (Mesh*)ob->data;
|
||||||
|
|
||||||
|
if(mmd->totlvl) {
|
||||||
|
if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
|
||||||
|
/* multires can't work without displacement layer */
|
||||||
|
modifier_setError(md, "Modifier needs mesh with displacement data.");
|
||||||
|
return dm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc);
|
result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user