Fix #35174: dynamic paint displacement missing in render.

A previous bugfix disabled the dynamic paint modifier for orco texture
coordinate evaluation of the modifier stack. However the MOD_APPLY_USECACHE
flag is not a good way to check if the modifier is evaluated for orcos.

Instead I've added a MOD_APPLY_ORCO flag. Also removed a bunch of
applyModifierEM callbacks, none of them served a purpose except for the
subsurf modifier.
This commit is contained in:
Brecht Van Lommel 2013-05-02 14:42:05 +00:00
parent 4a8663d66e
commit 4a4f091155
20 changed files with 33 additions and 149 deletions

View File

@ -111,7 +111,9 @@ typedef void (*TexWalkFunc)(void *userData, struct Object *ob, struct ModifierDa
typedef enum ModifierApplyFlag {
MOD_APPLY_RENDER = 1 << 0, /* Render time. */
MOD_APPLY_USECACHE = 1 << 1, /* Final result. Is not set for temporary calculations like orco dms. */
MOD_APPLY_USECACHE = 1 << 1, /* Result of evaluation will be cached, so modifier might
* want to cache data for quick updates (used by subsurf) */
MOD_APPLY_ORCO = 1 << 2 /* Modifier evaluated for undeformed texture coordinates */
} ModifierApplyFlag;
@ -200,7 +202,8 @@ typedef struct ModifierTypeInfo {
*/
struct DerivedMesh *(*applyModifierEM)(struct ModifierData *md, struct Object *ob,
struct BMEditMesh *editData,
struct DerivedMesh *derivedData);
struct DerivedMesh *derivedData,
ModifierApplyFlag flag);
/********************* Optional functions *********************/

View File

@ -1692,7 +1692,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
DM_set_only_copy(orcodm, nextmask | CD_MASK_ORIGINDEX |
(mti->requiredDataMask ?
mti->requiredDataMask(ob, md) : 0));
ndm = mti->applyModifier(md, ob, orcodm, app_flags & ~MOD_APPLY_USECACHE);
ndm = mti->applyModifier(md, ob, orcodm, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO);
if (ndm) {
/* if the modifier returned a new dm, release the old one */
@ -1708,7 +1708,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
nextmask &= ~CD_MASK_CLOTH_ORCO;
DM_set_only_copy(clothorcodm, nextmask | CD_MASK_ORIGINDEX);
ndm = mti->applyModifier(md, ob, clothorcodm, app_flags & ~MOD_APPLY_USECACHE);
ndm = mti->applyModifier(md, ob, clothorcodm, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO);
if (ndm) {
/* if the modifier returned a new dm, release the old one */
@ -2031,9 +2031,9 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX);
if (mti->applyModifierEM)
ndm = mti->applyModifierEM(md, ob, em, orcodm);
ndm = mti->applyModifierEM(md, ob, em, orcodm, MOD_APPLY_ORCO);
else
ndm = mti->applyModifier(md, ob, orcodm, 0);
ndm = mti->applyModifier(md, ob, orcodm, MOD_APPLY_ORCO);
if (ndm) {
/* if the modifier returned a new dm, release the old one */
@ -2055,9 +2055,9 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
}
if (mti->applyModifierEM)
ndm = mti->applyModifierEM(md, ob, em, dm);
ndm = mti->applyModifierEM(md, ob, em, dm, MOD_APPLY_USECACHE);
else
ndm = mti->applyModifier(md, ob, dm, 0);
ndm = mti->applyModifier(md, ob, dm, MOD_APPLY_USECACHE);
if (ndm) {
if (dm && dm != ndm)

View File

@ -1132,10 +1132,12 @@ static void curve_calc_orcodm(Scene *scene, Object *ob, DerivedMesh *derivedFina
int required_mode;
int editmode = (!forRender && (cu->editnurb || cu->editfont));
DerivedMesh *ndm, *orcodm = NULL;
const ModifierApplyFlag app_flag = renderResolution ? MOD_APPLY_RENDER : 0;
ModifierApplyFlag app_flag = MOD_APPLY_ORCO;
if (renderResolution)
if (renderResolution) {
app_flag |= MOD_APPLY_RENDER;
required_mode = eModifierMode_Render;
}
else
required_mode = eModifierMode_Realtime;

View File

@ -597,13 +597,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *dm)
{
return applyModifier(md, ob, dm, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_Array = {
/* name */ "Array",
@ -622,7 +615,7 @@ ModifierTypeInfo modifierType_Array = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
/* freeData */ NULL,

View File

@ -215,13 +215,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
#endif
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_Bevel = {
/* name */ "Bevel",
@ -238,7 +231,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -110,7 +110,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *) md;
/* dont apply dynamic paint on orco dm stack */
if (flag & MOD_APPLY_USECACHE) {
if (!(flag & MOD_APPLY_ORCO)) {
return dynamicPaint_Modifier_do(pmd, md->scene, ob, dm);
}
return dm;

View File

@ -141,13 +141,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_EdgeSplit = {
/* name */ "EdgeSplit",
@ -166,7 +159,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
/* freeData */ NULL,

View File

@ -335,13 +335,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_Mirror = {
/* name */ "Mirror",
@ -360,7 +353,7 @@ ModifierTypeInfo modifierType_Mirror = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
/* freeData */ NULL,

View File

@ -548,14 +548,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_Ocean = {
/* name */ "Ocean",
@ -572,7 +564,7 @@ ModifierTypeInfo modifierType_Ocean = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,

View File

@ -395,13 +395,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_ParticleInstance = {
/* name */ "ParticleInstance",
/* structName */ "ParticleInstanceModifierData",
@ -418,7 +411,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
/* freeData */ NULL,

View File

@ -931,16 +931,6 @@ static void foreachObjectLink(
walk(userData, ob, &ltmd->ob_axis);
}
/* This dosnt work with material*/
static DerivedMesh *applyModifierEM(
ModifierData *md,
Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
static int dependsOnTime(ModifierData *UNUSED(md))
{
return 0;
@ -964,7 +954,7 @@ ModifierTypeInfo modifierType_Screw = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
/* freeData */ NULL,

View File

@ -1852,18 +1852,6 @@ static void copyData(ModifierData *md, ModifierData *target)
*tsmd = *smd;
}
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *UNUSED(ob),
struct BMEditMesh *UNUSED(em),
DerivedMesh *dm)
{
DerivedMesh *result;
if (!(result = final_skin((SkinModifierData *)md, dm)))
return dm;
return result;
}
static DerivedMesh *applyModifier(ModifierData *md,
Object *UNUSED(ob),
DerivedMesh *dm,
@ -1895,7 +1883,7 @@ ModifierTypeInfo modifierType_Skin = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -827,14 +827,6 @@ static DerivedMesh *applyModifier(
#undef SOLIDIFY_SIDE_NORMALS
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_Solidify = {
/* name */ "Solidify",
@ -854,7 +846,7 @@ ModifierTypeInfo modifierType_Solidify = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -120,7 +120,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
DerivedMesh *derivedData,
ModifierApplyFlag UNUSED(flag))
{
SubsurfModifierData *smd = (SubsurfModifierData *) md;
DerivedMesh *result;

View File

@ -78,20 +78,6 @@ static void copyData(ModifierData *md, ModifierData *target)
*tsmd = *smd;
}
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *UNUSED(ob),
struct BMEditMesh *UNUSED(em),
DerivedMesh *dm)
{
TriangulateModifierData *tmd = (TriangulateModifierData *)md;
DerivedMesh *result;
if (!(result = triangulate_dm(dm, tmd->flag))) {
return dm;
}
return result;
}
static DerivedMesh *applyModifier(ModifierData *md,
Object *UNUSED(ob),
DerivedMesh *dm,
@ -123,7 +109,7 @@ ModifierTypeInfo modifierType_Triangulate = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL, //requiredDataMask,
/* freeData */ NULL,

View File

@ -366,13 +366,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return result;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_UVProject = {
/* name */ "UVProject",
@ -390,7 +383,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -201,13 +201,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData)
{
UVWarpModifierData *umd = (UVWarpModifierData *) md;
@ -254,7 +247,7 @@ ModifierTypeInfo modifierType_UVWarp = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -276,13 +276,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_WeightVGEdit = {
/* name */ "VertexWeightEdit",
@ -300,7 +293,7 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,

View File

@ -398,13 +398,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_WeightVGMix = {
/* name */ "VertexWeightMix",
@ -422,7 +415,7 @@ ModifierTypeInfo modifierType_WeightVGMix = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,

View File

@ -542,13 +542,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
}
ModifierTypeInfo modifierType_WeightVGProximity = {
/* name */ "VertexWeightProximity",
@ -566,7 +559,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ NULL,