diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-11-11 10:25:45 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-11-11 10:25:45 +0400 |
commit | 92d35b74e79e63ae95732cf3161e84ace1e79e59 (patch) | |
tree | 19a8ecf74bfcae5187a4e25520f4e55384e7707b /source/blender/modifiers/intern | |
parent | 67386c003d5d4bd5355323acdfbef1aa9fa2b71d (diff) | |
parent | afeb0eeaf0e8caf5e46a5dd6fbea3786e9fb1354 (diff) |
svn merge -r41722:41723 ^/trunk/blender
Diffstat (limited to 'source/blender/modifiers/intern')
-rw-r--r-- | source/blender/modifiers/intern/MOD_dynamicpaint.c | 178 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_util.c | 22 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_util.h | 1 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_uvproject.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_wave.c | 2 |
5 files changed, 182 insertions, 23 deletions
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c new file mode 100644 index 00000000000..f697f149ce4 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -0,0 +1,178 @@ +/* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* Contributor(s): Miika Hämäläinen +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include <stddef.h> + +#include "DNA_dynamicpaint_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#include "MEM_guardedalloc.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_dynamicpaint.h" +#include "BKE_modifier.h" + +#include "depsgraph_private.h" + +#include "MOD_util.h" + + +static void initData(ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + pmd->canvas = NULL; + pmd->brush = NULL; + pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md; + DynamicPaintModifierData *tpmd = (DynamicPaintModifierData*)target; + + dynamicPaint_Modifier_copy(pmd, tpmd); +} + +static void freeData(ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + dynamicPaint_Modifier_free(pmd); +} + +static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md; + CustomDataMask dataMask = 0; + + if (pmd->canvas) { + DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + for(; surface; surface=surface->next) { + /* tface */ + if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ || + surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) { + dataMask |= (1 << CD_MTFACE); + } + /* mcol */ + if (surface->type == MOD_DPAINT_SURFACE_T_PAINT || + surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) { + dataMask |= (1 << CD_MCOL); + } + /* CD_MDEFORMVERT */ + if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) { + dataMask |= (1 << CD_MDEFORMVERT); + } + } + } + + if (pmd->brush) { + if (pmd->brush->flags & MOD_DPAINT_USE_MATERIAL) { + dataMask |= (1 << CD_MTFACE); + } + } + return dataMask; +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, + DerivedMesh *dm, + int useRenderParams, + int isFinalCalc) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + return dynamicPaint_Modifier_do(pmd, md->scene, ob, dm); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, + struct Scene *scene, + Object *ob, + DagNode *obNode) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + /* add relation from canvases to all brush objects */ + if(pmd && pmd->canvas) + { + Base *base = scene->base.first; + + for(; base; base = base->next) { + DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)modifiers_findByType(base->object, eModifierType_DynamicPaint); + + if(pmd2 && pmd2->brush && ob!=base->object) + { + DagNode *brushNode = dag_get_node(forest, base->object); + dag_add_relation(forest, brushNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Dynamic Paint Brush"); + } + } + } +} + +static int dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void foreachIDLink(ModifierData *md, Object *ob, + IDWalkFunc walk, void *userData) +{ + DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md; + + if(pmd->canvas) { + DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + + for(; surface; surface=surface->next) { + walk(userData, ob, (ID **)&surface->brush_group); + walk(userData, ob, (ID **)&surface->init_texture); + } + } + if (pmd->brush) { + walk(userData, ob, (ID **)&pmd->brush->mat); + } +} + +static void foreachTexLink(ModifierData *md, Object *ob, + TexWalkFunc walk, void *userData) +{ + //walk(userData, ob, md, ""); /* re-enable when possible */ +} + +ModifierTypeInfo modifierType_DynamicPaint = { + /* name */ "Dynamic Paint", + /* structName */ "DynamicPaintModifierData", + /* structSize */ sizeof(DynamicPaintModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_UsesPointCache + | eModifierTypeFlag_Single, + + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformMatrices */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ 0, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ foreachTexLink, +}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 8d83bbecaac..73d44487a15 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -105,7 +105,7 @@ void get_texture_coords(MappingInfoModifierData *dmd, Object *ob, char uvname[32]; MTFace *tf; - validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname); + CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname); tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); /* verts are given the UV from the first face that uses them */ @@ -176,25 +176,6 @@ void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3]) /* lattice/mesh modifier too */ } -void validate_layer_name(const CustomData *data, int type, char *name, char *outname) -{ - int index = -1; - - /* if a layer name was given, try to find that layer */ - if(name[0]) - index = CustomData_get_named_layer_index(data, type, name); - - if(index < 0) { - /* either no layer was specified, or the layer we want has been - * deleted, so assign the active layer to name - */ - index = CustomData_get_active_layer_index(data, type); - strcpy(outname, data->layers[index].name); - } - else - strcpy(outname, name); -} - /* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */ DerivedMesh *get_cddm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3]) { @@ -296,6 +277,7 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(WeightVGEdit); INIT_TYPE(WeightVGMix); INIT_TYPE(WeightVGProximity); + INIT_TYPE(DynamicPaint); INIT_TYPE(NgonInterp); #undef INIT_TYPE } diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h index 82e04468c86..abc36653082 100644 --- a/source/blender/modifiers/intern/MOD_util.h +++ b/source/blender/modifiers/intern/MOD_util.h @@ -47,7 +47,6 @@ struct TexResult; void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres); void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, float (*co)[3], float (*texco)[3], int numVerts); void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]); -void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname); struct DerivedMesh *get_cddm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]); struct DerivedMesh *get_dm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco); void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index); diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c index bbaab989a2b..20174740215 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.c +++ b/source/blender/modifiers/intern/MOD_uvproject.c @@ -174,7 +174,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd, if(!CustomData_has_layer(&dm->faceData, CD_MTFACE)) return dm; /* make sure we're using an existing layer */ - validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname); + CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname); /* calculate a projection matrix and normal for each projector */ for(i = 0; i < num_projectors; ++i) { diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c index 5d020cc8a03..8a5b322f54a 100644 --- a/source/blender/modifiers/intern/MOD_wave.c +++ b/source/blender/modifiers/intern/MOD_wave.c @@ -196,7 +196,7 @@ static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob, char uvname[32]; MTFace *tf; - validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname); + CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname); tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname); /* verts are given the UV from the first face that uses them */ |