forked from bartvdbraak/blender
- Added checking if modifier is active in find_multires_modifier
- Pass MultiresModifierData to reshape functions
This commit is contained in:
parent
d153c765bc
commit
640fb84bed
@ -47,15 +47,19 @@ void multires_force_external_reload(struct Object *ob);
|
|||||||
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
|
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
|
||||||
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
|
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
|
||||||
|
|
||||||
struct MultiresModifierData *find_multires_modifier(struct Object *ob);
|
struct MultiresModifierData *find_multires_modifier(struct Scene *scene, struct Object *ob);
|
||||||
struct DerivedMesh *get_multires_dm(struct Object *ob);
|
struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
|
||||||
|
struct Object *ob);
|
||||||
void multiresModifier_join(struct Object *);
|
void multiresModifier_join(struct Object *);
|
||||||
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
|
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
|
||||||
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
|
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
|
||||||
int updateblock, int simple);
|
int updateblock, int simple);
|
||||||
int multiresModifier_reshape(struct Object *dst, struct Object *src);
|
int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd,
|
||||||
int multiresModifier_reshapeFromDM(struct Object *ob, struct DerivedMesh *srcdm);
|
struct Object *dst, struct Object *src);
|
||||||
int multiresModifier_reshapeFromDeformMod(struct Object *ob, struct ModifierData *md);
|
int multiresModifier_reshapeFromDM(struct Scene *scene, struct MultiresModifierData *mmd,
|
||||||
|
struct Object *ob, struct DerivedMesh *srcdm);
|
||||||
|
int multiresModifier_reshapeFromDeformMod(struct Scene *scene, struct MultiresModifierData *mmd,
|
||||||
|
struct Object *ob, struct ModifierData *md);
|
||||||
|
|
||||||
void multires_stitch_grids(struct Object *);
|
void multires_stitch_grids(struct Object *);
|
||||||
|
|
||||||
|
@ -60,35 +60,33 @@ static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129,
|
|||||||
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
|
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
|
||||||
static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
|
static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
|
||||||
|
|
||||||
DerivedMesh *get_multires_dm(Object *ob)
|
DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob)
|
||||||
{
|
{
|
||||||
Mesh *me= ob->data;
|
ModifierData *md= (ModifierData *)mmd;
|
||||||
ModifierData *md= (ModifierData *)find_multires_modifier(ob);
|
|
||||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||||
DerivedMesh *tdm = CDDM_from_mesh(me, ob);
|
DerivedMesh *tdm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
|
||||||
DerivedMesh *dm;
|
DerivedMesh *dm;
|
||||||
|
|
||||||
CDDM_calc_normals(tdm);
|
|
||||||
dm = mti->applyModifier(md, ob, tdm, 0, 1);
|
dm = mti->applyModifier(md, ob, tdm, 0, 1);
|
||||||
|
if (dm == tdm) {
|
||||||
if(tdm != dm) tdm->release(tdm);
|
dm = CDDM_copy(tdm);
|
||||||
|
}
|
||||||
|
|
||||||
return dm;
|
return dm;
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiresModifierData *find_multires_modifier(Object *ob)
|
MultiresModifierData *find_multires_modifier(Scene *scene, Object *ob)
|
||||||
{
|
{
|
||||||
ModifierData *md;
|
ModifierData *md;
|
||||||
MultiresModifierData *mmd = NULL;
|
|
||||||
|
|
||||||
for(md = ob->modifiers.first; md; md = md->next) {
|
for(md = ob->modifiers.first; md; md = md->next) {
|
||||||
if(md->type == eModifierType_Multires) {
|
if(md->type == eModifierType_Multires) {
|
||||||
mmd = (MultiresModifierData*)md;
|
if (modifier_isEnabled(scene, md, eModifierMode_Realtime))
|
||||||
break;
|
return (MultiresModifierData*)md;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return mmd;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
|
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
|
||||||
@ -215,9 +213,10 @@ void multiresModifier_join(Object *ob)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm)
|
int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
|
||||||
|
Object *ob, DerivedMesh *srcdm)
|
||||||
{
|
{
|
||||||
DerivedMesh *mrdm = get_multires_dm (ob);
|
DerivedMesh *mrdm = get_multires_dm (scene, mmd, ob);
|
||||||
|
|
||||||
if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
|
if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
|
||||||
multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
|
multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
|
||||||
@ -236,13 +235,14 @@ int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Returns 1 on success, 0 if the src's totvert doesn't match */
|
/* Returns 1 on success, 0 if the src's totvert doesn't match */
|
||||||
int multiresModifier_reshape(Object *dst, Object *src)
|
int multiresModifier_reshape(Scene *scene, MultiresModifierData *mmd, Object *dst, Object *src)
|
||||||
{
|
{
|
||||||
DerivedMesh *srcdm = src->derivedFinal;
|
DerivedMesh *srcdm = mesh_get_derived_final(scene, src, CD_MASK_BAREMESH);
|
||||||
return multiresModifier_reshapeFromDM(dst, srcdm);
|
return multiresModifier_reshapeFromDM(scene, mmd, dst, srcdm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
|
int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mmd,
|
||||||
|
Object *ob, ModifierData *md)
|
||||||
{
|
{
|
||||||
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||||
DerivedMesh *dm, *ndm;
|
DerivedMesh *dm, *ndm;
|
||||||
@ -250,7 +250,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
|
|||||||
float (*deformedVerts)[3];
|
float (*deformedVerts)[3];
|
||||||
|
|
||||||
/* Create DerivedMesh for deformation modifier */
|
/* Create DerivedMesh for deformation modifier */
|
||||||
dm = get_multires_dm(ob);
|
dm = get_multires_dm(scene, mmd, ob);
|
||||||
numVerts= dm->getNumVerts(dm);
|
numVerts= dm->getNumVerts(dm);
|
||||||
deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
|
deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md)
|
|||||||
dm->release(dm);
|
dm->release(dm);
|
||||||
|
|
||||||
/* Reshaping */
|
/* Reshaping */
|
||||||
result= multiresModifier_reshapeFromDM(ob, ndm);
|
result= multiresModifier_reshapeFromDM(scene, mmd, ob, ndm);
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
ndm->release(ndm);
|
ndm->release(ndm);
|
||||||
|
@ -399,7 +399,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
|||||||
if (ob->type==OB_MESH) {
|
if (ob->type==OB_MESH) {
|
||||||
DerivedMesh *dm;
|
DerivedMesh *dm;
|
||||||
Mesh *me = ob->data;
|
Mesh *me = ob->data;
|
||||||
MultiresModifierData *mmd= find_multires_modifier(ob);
|
MultiresModifierData *mmd= find_multires_modifier(scene, ob);
|
||||||
|
|
||||||
if( me->key) {
|
if( me->key) {
|
||||||
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
|
||||||
@ -413,7 +413,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
|
|||||||
multires_force_update(ob);
|
multires_force_update(ob);
|
||||||
|
|
||||||
if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
|
if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
|
||||||
multiresModifier_reshapeFromDeformMod (ob, md);
|
multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md);
|
||||||
} else {
|
} else {
|
||||||
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
dm = mesh_create_derived_for_modifier(scene, ob, md);
|
||||||
if (!dm) {
|
if (!dm) {
|
||||||
@ -954,6 +954,7 @@ void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
|
|||||||
static int multires_reshape_exec(bContext *C, wmOperator *op)
|
static int multires_reshape_exec(bContext *C, wmOperator *op)
|
||||||
{
|
{
|
||||||
Object *ob= ED_object_active_context(C), *secondob= NULL;
|
Object *ob= ED_object_active_context(C), *secondob= NULL;
|
||||||
|
Scene *scene= CTX_data_scene(C);
|
||||||
MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
|
MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
|
||||||
|
|
||||||
if (!mmd)
|
if (!mmd)
|
||||||
@ -972,7 +973,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
|
|||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!multiresModifier_reshape(ob, secondob)) {
|
if(!multiresModifier_reshape(scene, mmd, ob, secondob)) {
|
||||||
BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices.");
|
BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices.");
|
||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user