add an influence slider to mesh cache.
authorCampbell Barton <ideasman42@gmail.com>
Mon, 21 Jan 2013 16:43:04 +0000 (16:43 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 21 Jan 2013 16:43:04 +0000 (16:43 +0000)
release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/intern/math_vector.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_meshcache.c

index 99559f47ff605a2b936090bcdebfdb08087e2776..79846df14aef27404e8a6858b08e94548dbdb018 100644 (file)
@@ -167,6 +167,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         layout.prop(md, "filepath")
 
         layout.label(text="Evaluation:")
         layout.prop(md, "filepath")
 
         layout.label(text="Evaluation:")
+        layout.prop(md, "factor", slider=True)
         layout.prop(md, "interpolation")
 
         layout.label(text="Time Mapping:")
         layout.prop(md, "interpolation")
 
         layout.label(text="Time Mapping:")
index e9217728eae48814a332c9aa26cc34e04bf1e517..42a6b90f738828264fc8bbad7818b32435e679da 100644 (file)
@@ -255,6 +255,7 @@ void sub_vn_vn(float *array_tar, const float *array_src, const int size);
 void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
 void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
 void msub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size);
 void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
 void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size);
 void msub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size);
+void interp_vn_vn(float *array_tar, const float *array_src, const float t, const int size);
 void fill_vn_i(int *array_tar, const int size, const int val);
 void fill_vn_ushort(unsigned short *array_tar, const int size, const unsigned short val);
 void fill_vn_fl(float *array_tar, const int size, const float val);
 void fill_vn_i(int *array_tar, const int size, const int val);
 void fill_vn_ushort(unsigned short *array_tar, const int size, const unsigned short val);
 void fill_vn_fl(float *array_tar, const int size, const float val);
index 743d1fc497b320600cc34a6314c75130b1acf44b..490ed2a99fb78726e9cb125546c3bdf55f6e6a18 100644 (file)
@@ -711,6 +711,19 @@ void msub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array
        }
 }
 
        }
 }
 
+void interp_vn_vn(float *array_tar, const float *array_src, const float t, const int size)
+{
+       const float s = 1.0f - t;
+       float *tar = array_tar + (size - 1);
+       const float *src = array_src + (size - 1);
+       int i = size;
+       while (i--) {
+               *(tar) = (s * *(tar)) + (t * *(src));
+               tar--;
+               src--;
+       }
+}
+
 void fill_vn_i(int *array_tar, const int size, const int val)
 {
        int *tar = array_tar + (size - 1);
 void fill_vn_i(int *array_tar, const int size, const int val)
 {
        int *tar = array_tar + (size - 1);
index 2f9da059fc0bfc768b8260db30b8848639d1227a..42ddbd8436854f968ae4c522e0cd228429fc517d 100644 (file)
@@ -1174,7 +1174,7 @@ typedef struct MeshCacheModifierData {
 
        char interp;
 
 
        char interp;
 
-       char pad[4];
+       float factor;
 
        /* play_mode == MOD_MESHCACHE_PLAY_CFEA */
        float frame_start;
 
        /* play_mode == MOD_MESHCACHE_PLAY_CFEA */
        float frame_start;
index 653e77f529c220baa9ea1343ad9f471b5682b143..0d88cbf2f27186c19a99fe347ecd408c0e2df81e 100644 (file)
@@ -3558,6 +3558,12 @@ static void rna_def_modifier_meshcache(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "File Path", "Path to external displacements file");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        RNA_def_property_ui_text(prop, "File Path", "Path to external displacements file");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "factor");
+       RNA_def_property_range(prop, 0.0f, 1.0f);
+       RNA_def_property_ui_text(prop, "Influence", "Influence of the deformation");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
        /* -------------------------------------------------------------------- */
        /* Axis Conversion */
        prop = RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
        /* -------------------------------------------------------------------- */
        /* Axis Conversion */
        prop = RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
index c722eda28ec877e03c3d815e79f8b5729091e9fb..d140b8909d4681ca97a324ba3cf35cf8fb31d4f6 100644 (file)
 #include "BLI_path_util.h"
 #include "BLI_math.h"
 
 #include "BLI_path_util.h"
 #include "BLI_math.h"
 
-
 #include "BKE_DerivedMesh.h"
 #include "BKE_scene.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_scene.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "MOD_meshcache_util.h"  /* utility functions */
 
 #include "MOD_modifiertypes.h"
 #include "MOD_meshcache_util.h"  /* utility functions */
 
 #include "MOD_modifiertypes.h"
@@ -99,6 +100,8 @@ static void initData(ModifierData *md)
        mcmd->interp = MOD_MESHCACHE_INTERP_LINEAR;
        mcmd->frame_scale = 1.0f;
 
        mcmd->interp = MOD_MESHCACHE_INTERP_LINEAR;
        mcmd->frame_scale = 1.0f;
 
+       mcmd->factor = 1.0f;
+
        /* (Y, Z). Blender default */
        mcmd->forward_axis = 1;
        mcmd->up_axis      = 2;
        /* (Y, Z). Blender default */
        mcmd->forward_axis = 1;
        mcmd->up_axis      = 2;
@@ -124,6 +127,8 @@ static void copyData(ModifierData *md, ModifierData *target)
        tmcmd->frame_start = mcmd->frame_start;
        tmcmd->frame_scale = mcmd->frame_scale;
 
        tmcmd->frame_start = mcmd->frame_start;
        tmcmd->frame_scale = mcmd->frame_scale;
 
+       tmcmd->factor = mcmd->factor;
+
        tmcmd->eval_frame  = mcmd->eval_frame;
        tmcmd->eval_time   = mcmd->eval_time;
        tmcmd->eval_factor = mcmd->eval_factor;
        tmcmd->eval_frame  = mcmd->eval_frame;
        tmcmd->eval_time   = mcmd->eval_time;
        tmcmd->eval_factor = mcmd->eval_factor;
@@ -142,14 +147,19 @@ static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
        MeshCacheModifierData *mcmd = (MeshCacheModifierData *) md;
 
        /* leave it up to the modifier to check the file is valid on calculation */
        MeshCacheModifierData *mcmd = (MeshCacheModifierData *) md;
 
        /* leave it up to the modifier to check the file is valid on calculation */
-       return (mcmd->filepath[0] == '\0');
+       return (mcmd->factor <= 0.0f) || (mcmd->filepath[0] == '\0');
 }
 
 
 static void meshcache_do(
         MeshCacheModifierData *mcmd, Object *ob, DerivedMesh *UNUSED(dm),
 }
 
 
 static void meshcache_do(
         MeshCacheModifierData *mcmd, Object *ob, DerivedMesh *UNUSED(dm),
-        float (*vertexCos)[3], int numVerts)
+        float (*vertexCos_)[3], int numVerts)
 {
 {
+       float (*vertexCos_Store)[3] = (mcmd->factor < 1.0f) ?
+                                     MEM_mallocN(sizeof(*vertexCos_Store) * numVerts, __func__) : NULL;
+       float (*vertexCos_Real)[3] = vertexCos_;
+       float (*vertexCos)[3] = vertexCos_Store ? vertexCos_Store : vertexCos_Real;
+
        Scene *scene = mcmd->modifier.scene;
        const float fps = FPS;
 
        Scene *scene = mcmd->modifier.scene;
        const float fps = FPS;
 
@@ -263,6 +273,14 @@ static void meshcache_do(
                        }
                }
        }
                        }
                }
        }
+
+       if (vertexCos_Store) {
+               if (ok) {
+                       interp_vn_vn(*vertexCos_Real, *vertexCos_Store, mcmd->factor, numVerts * 3);
+               }
+
+               MEM_freeN(vertexCos_Store);
+       }
 }
 
 static void deformVerts(ModifierData *md, Object *ob,
 }
 
 static void deformVerts(ModifierData *md, Object *ob,