Modifiers: add callback to loop over each texture assigned to a modifier.

This commit is contained in:
2011-08-12 18:11:22 +00:00
parent e4bdb6e95a
commit c265a686d8
38 changed files with 84 additions and 3 deletions

View File

@@ -101,6 +101,7 @@ typedef enum {
typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin); typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin); typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin);
typedef void (*TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname);
typedef struct ModifierTypeInfo { typedef struct ModifierTypeInfo {
/* The user visible name for this modifier */ /* The user visible name for this modifier */
@@ -284,6 +285,16 @@ typedef struct ModifierTypeInfo {
*/ */
void (*foreachIDLink)(struct ModifierData *md, struct Object *ob, void (*foreachIDLink)(struct ModifierData *md, struct Object *ob,
IDWalkFunc walk, void *userData); IDWalkFunc walk, void *userData);
/* Should call the given walk function for each texture that the
* modifier data stores. This is used for finding all textures in
* the context for the UI.
*
* This function is optional. If it is not present, it will be
* assumed the modifier has no textures.
*/
void (*foreachTexLink)(struct ModifierData *md, struct Object *ob,
TexWalkFunc walk, void *userData);
} ModifierTypeInfo; } ModifierTypeInfo;
ModifierTypeInfo *modifierType_getInfo (ModifierType type); ModifierTypeInfo *modifierType_getInfo (ModifierType type);
@@ -315,6 +326,10 @@ void modifiers_foreachObjectLink(struct Object *ob,
void modifiers_foreachIDLink(struct Object *ob, void modifiers_foreachIDLink(struct Object *ob,
IDWalkFunc walk, IDWalkFunc walk,
void *userData); void *userData);
void modifiers_foreachTexLink(struct Object *ob,
TexWalkFunc walk,
void *userData);
struct ModifierData *modifiers_findByType(struct Object *ob, ModifierType type); struct ModifierData *modifiers_findByType(struct Object *ob, ModifierType type);
struct ModifierData *modifiers_findByName(struct Object *ob, const char *name); struct ModifierData *modifiers_findByName(struct Object *ob, const char *name);
void modifiers_clearErrors(struct Object *ob); void modifiers_clearErrors(struct Object *ob);

View File

@@ -195,6 +195,18 @@ void modifiers_foreachIDLink(Object *ob, IDWalkFunc walk, void *userData)
} }
} }
void modifiers_foreachTexLink(Object *ob, TexWalkFunc walk, void *userData)
{
ModifierData *md = ob->modifiers.first;
for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if(mti->foreachTexLink)
mti->foreachTexLink(md, ob, walk, userData);
}
}
void modifier_copyData(ModifierData *md, ModifierData *target) void modifier_copyData(ModifierData *md, ModifierData *target)
{ {
ModifierTypeInfo *mti = modifierType_getInfo(md->type); ModifierTypeInfo *mti = modifierType_getInfo(md->type);

View File

@@ -213,4 +213,5 @@ ModifierTypeInfo modifierType_Armature = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -826,4 +826,5 @@ ModifierTypeInfo modifierType_Array = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -150,4 +150,5 @@ ModifierTypeInfo modifierType_Bevel = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -197,4 +197,5 @@ ModifierTypeInfo modifierType_Boolean = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -299,5 +299,6 @@ ModifierTypeInfo modifierType_Build = {
/* dependsOnTime */ dependsOnTime, /* dependsOnTime */ dependsOnTime,
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -632,4 +632,5 @@ ModifierTypeInfo modifierType_Cast = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -229,4 +229,5 @@ ModifierTypeInfo modifierType_Cloth = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
}; };

View File

@@ -267,4 +267,5 @@ ModifierTypeInfo modifierType_Collision = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -162,4 +162,5 @@ ModifierTypeInfo modifierType_Curve = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -218,4 +218,5 @@ ModifierTypeInfo modifierType_Decimate = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -134,6 +134,12 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
} }
static void foreachTexLink(ModifierData *md, Object *ob,
TexWalkFunc walk, void *userData)
{
walk(userData, ob, md, "texture");
}
static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{ {
DisplaceModifierData *dmd = (DisplaceModifierData*) md; DisplaceModifierData *dmd = (DisplaceModifierData*) md;
@@ -283,4 +289,5 @@ ModifierTypeInfo modifierType_Displace = {
/* dependsOnNormals */ dependsOnNormals, /* dependsOnNormals */ dependsOnNormals,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
}; };

View File

@@ -1311,4 +1311,5 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -1037,4 +1037,5 @@ ModifierTypeInfo modifierType_Explode = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -162,4 +162,5 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -289,4 +289,5 @@ ModifierTypeInfo modifierType_Hook = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -156,4 +156,5 @@ ModifierTypeInfo modifierType_Lattice = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -407,4 +407,5 @@ ModifierTypeInfo modifierType_Mask = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -463,4 +463,5 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -363,4 +363,5 @@ ModifierTypeInfo modifierType_Mirror = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -131,4 +131,5 @@ ModifierTypeInfo modifierType_Multires = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -77,4 +77,5 @@ ModifierTypeInfo modifierType_None = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -350,4 +350,5 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -242,4 +242,5 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -903,4 +903,5 @@ ModifierTypeInfo modifierType_Screw = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -148,5 +148,6 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* dependsOnTime */ NULL, /* dependsOnTime */ NULL,
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -186,4 +186,5 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -385,4 +385,5 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -189,4 +189,5 @@ ModifierTypeInfo modifierType_Smoke = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL
}; };

View File

@@ -270,4 +270,5 @@ ModifierTypeInfo modifierType_Smooth = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -87,4 +87,5 @@ ModifierTypeInfo modifierType_Softbody = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -689,5 +689,6 @@ ModifierTypeInfo modifierType_Solidify = {
/* dependsOnTime */ NULL, /* dependsOnTime */ NULL,
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -152,4 +152,6 @@ ModifierTypeInfo modifierType_Subsurf = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -192,4 +192,5 @@ ModifierTypeInfo modifierType_Surface = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ NULL, /* foreachObjectLink */ NULL,
/* foreachIDLink */ NULL, /* foreachIDLink */ NULL,
/* foreachTexLink */ NULL,
}; };

View File

@@ -434,4 +434,5 @@ ModifierTypeInfo modifierType_UVProject = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
}; };

View File

@@ -140,6 +140,11 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u
walk(userData, ob, (ID **)&wmd->map_object); walk(userData, ob, (ID **)&wmd->map_object);
} }
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
{
walk(userData, ob, md, "texture");
}
static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
Object *UNUSED(ob), DagNode *obNode) Object *UNUSED(ob), DagNode *obNode)
{ {
@@ -364,4 +369,5 @@ ModifierTypeInfo modifierType_Warp = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
}; };

View File

@@ -126,6 +126,12 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
} }
static void foreachTexLink(ModifierData *md, Object *ob,
TexWalkFunc walk, void *userData)
{
walk(userData, ob, md, "texture");
}
static void updateDepgraph(ModifierData *md, DagForest *forest, static void updateDepgraph(ModifierData *md, DagForest *forest,
Scene *UNUSED(scene), Scene *UNUSED(scene),
Object *UNUSED(ob), Object *UNUSED(ob),
@@ -466,4 +472,5 @@ ModifierTypeInfo modifierType_Wave = {
/* dependsOnNormals */ NULL, /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink, /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink, /* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ foreachTexLink,
}; };