forked from bartvdbraak/blender
Build Modifier - Add "Reversed" Option
This commit introduces the ability to make the Build Modifier operate in reverse, essentially allowing it to be used as a "deconstruction" effect. (See D219 for more details about use cases for this)
This commit is contained in:
parent
607df8090b
commit
5c74ac2c2a
@ -160,6 +160,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
col = split.column()
|
||||
col.prop(md, "frame_start")
|
||||
col.prop(md, "frame_duration")
|
||||
col.prop(md, "use_reverse")
|
||||
|
||||
col = split.column()
|
||||
col.prop(md, "use_random_order")
|
||||
|
@ -2655,6 +2655,22 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *main)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(main, 269, 9)) {
|
||||
Object *ob;
|
||||
|
||||
for (ob = main->object.first; ob; ob = ob->id.next) {
|
||||
ModifierData *md;
|
||||
for (md = ob->modifiers.first; md; md = md->next) {
|
||||
if (md->type == eModifierType_Build) {
|
||||
BuildModifierData *bmd = (BuildModifierData *)md;
|
||||
if (bmd->randomize) {
|
||||
bmd->flag |= MOD_BUILD_FLAG_RANDOMIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!DNA_struct_elem_find(fd->filesdna, "BevelModifierData", "float", "profile")) {
|
||||
Object *ob;
|
||||
|
@ -167,9 +167,18 @@ typedef struct BuildModifierData {
|
||||
ModifierData modifier;
|
||||
|
||||
float start, length;
|
||||
int randomize, seed;
|
||||
short flag;
|
||||
|
||||
short randomize; /* (bool) whether order of vertices is randomized - legacy files (for readfile conversion) */
|
||||
int seed; /* (int) random seed */
|
||||
} BuildModifierData;
|
||||
|
||||
/* Build Modifier -> flag */
|
||||
enum {
|
||||
MOD_BUILD_FLAG_RANDOMIZE = (1 << 0), /* order of vertices is randomized */
|
||||
MOD_BUILD_FLAG_REVERSE = (1 << 1), /* frame range is reversed, resulting in a deconstruction effect */
|
||||
};
|
||||
|
||||
/* Mask Modifier */
|
||||
typedef struct MaskModifierData {
|
||||
ModifierData modifier;
|
||||
|
@ -1092,8 +1092,13 @@ static void rna_def_modifier_build(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Length", "Total time the build effect requires");
|
||||
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||
|
||||
prop = RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_BUILD_FLAG_REVERSE);
|
||||
RNA_def_property_ui_text(prop, "Reversed", "Deconstruct the mesh instead of building it");
|
||||
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||
|
||||
prop = RNA_def_property(srna, "use_random_order", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "randomize", 1);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_BUILD_FLAG_RANDOMIZE);
|
||||
RNA_def_property_ui_text(prop, "Randomize", "Randomize the faces or edges during build");
|
||||
RNA_def_property_update(prop, 0, "rna_Modifier_update");
|
||||
|
||||
|
@ -119,7 +119,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
|
||||
|
||||
frac = (BKE_scene_frame_get(md->scene) - bmd->start) / bmd->length;
|
||||
CLAMP(frac, 0.0f, 1.0f);
|
||||
|
||||
|
||||
if (bmd->flag & MOD_BUILD_FLAG_REVERSE) {
|
||||
frac = 1.0 - frac;
|
||||
}
|
||||
|
||||
numFaces_dst = numPoly_src * frac;
|
||||
numEdges_dst = numEdge_src * frac;
|
||||
|
||||
@ -129,7 +133,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
|
||||
MLoop *ml, *mloop;
|
||||
MEdge *medge;
|
||||
|
||||
if (bmd->randomize) {
|
||||
if (bmd->flag & MOD_BUILD_FLAG_RANDOMIZE) {
|
||||
BLI_array_randomize(faceMap, sizeof(*faceMap),
|
||||
numPoly_src, bmd->seed);
|
||||
}
|
||||
@ -174,7 +178,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
|
||||
else if (numEdges_dst) {
|
||||
MEdge *medge, *me;
|
||||
|
||||
if (bmd->randomize)
|
||||
if (bmd->flag & MOD_BUILD_FLAG_RANDOMIZE)
|
||||
BLI_array_randomize(edgeMap, sizeof(*edgeMap),
|
||||
numEdge_src, bmd->seed);
|
||||
|
||||
@ -207,7 +211,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
|
||||
else {
|
||||
int numVerts = numVert_src * frac;
|
||||
|
||||
if (bmd->randomize) {
|
||||
if (bmd->flag & MOD_BUILD_FLAG_RANDOMIZE) {
|
||||
BLI_array_randomize(vertMap, sizeof(*vertMap),
|
||||
numVert_src, bmd->seed);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user