SVN maintenance.
[blender.git] / source / blender / modifiers / intern / MOD_fluidsim.c
1 /*
2 * $Id$
3 *
4 * ***** BEGIN GPL LICENSE BLOCK *****
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software  Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 *
20 * The Original Code is Copyright (C) 2005 by the Blender Foundation.
21 * All rights reserved.
22 *
23 * Contributor(s): Daniel Dunbar
24 *                 Ton Roosendaal,
25 *                 Ben Batt,
26 *                 Brecht Van Lommel,
27 *                 Campbell Barton
28 *
29 * ***** END GPL LICENSE BLOCK *****
30 *
31 */
32
33 #include "stddef.h"
34 #include "string.h"
35 #include "stdarg.h"
36 #include "math.h"
37 #include "float.h"
38
39 #include "BLI_kdtree.h"
40 #include "BLI_rand.h"
41 #include "BLI_uvproject.h"
42
43 #include "MEM_guardedalloc.h"
44
45 #include "DNA_armature_types.h"
46 #include "DNA_camera_types.h"
47 #include "DNA_curve_types.h"
48 #include "DNA_key_types.h"
49 #include "DNA_material_types.h"
50 #include "DNA_object_fluidsim.h"
51
52
53 #include "BKE_action.h"
54 #include "BKE_bmesh.h"
55 #include "BKE_cloth.h"
56 #include "BKE_cdderivedmesh.h"
57 #include "BKE_displist.h"
58 #include "BKE_fluidsim.h"
59 #include "BKE_global.h"
60 #include "BKE_multires.h"
61 #include "BKE_key.h"
62 #include "BKE_lattice.h"
63 #include "BKE_material.h"
64 #include "BKE_mesh.h"
65 #include "BKE_modifier.h"
66 #include "BKE_object.h"
67 #include "BKE_paint.h"
68 #include "BKE_particle.h"
69 #include "BKE_pointcache.h"
70 #include "BKE_scene.h"
71 #include "BKE_smoke.h"
72 #include "BKE_softbody.h"
73 #include "BKE_subsurf.h"
74 #include "BKE_texture.h"
75
76 #include "depsgraph_private.h"
77 #include "BKE_deform.h"
78 #include "BKE_shrinkwrap.h"
79
80 #include "MOD_modifiertypes.h"
81 #include "MOD_fluidsim_util.h"
82
83
84 /* Fluidsim */
85 static void initData(ModifierData *md)
86 {
87         FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
88         
89         fluidsim_init(fluidmd);
90 }
91 static void freeData(ModifierData *md)
92 {
93         FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
94         
95         fluidsim_free(fluidmd);
96 }
97
98 static void copyData(ModifierData *md, ModifierData *target)
99 {
100         FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
101         FluidsimModifierData *tfluidmd= (FluidsimModifierData*) target;
102         
103         if(tfluidmd->fss)
104                 MEM_freeN(tfluidmd->fss);
105         
106         tfluidmd->fss = MEM_dupallocN(fluidmd->fss);
107 }
108
109
110
111 static DerivedMesh * applyModifier(
112                 ModifierData *md, Object *ob, DerivedMesh *derivedData,
113   int useRenderParams, int isFinalCalc)
114 {
115         FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
116         DerivedMesh *result = NULL;
117         
118         /* check for alloc failing */
119         if(!fluidmd->fss)
120         {
121                 initData(md);
122                 
123                 if(!fluidmd->fss)
124                         return derivedData;
125         }
126
127         result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
128
129         if(result) 
130         { 
131                 return result; 
132         }
133         
134         return derivedData;
135 }
136
137 static void updateDepgraph(
138                 ModifierData *md, DagForest *forest, Scene *scene,
139           Object *ob, DagNode *obNode)
140 {
141         FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
142         Base *base;
143
144         if(fluidmd && fluidmd->fss)
145         {
146                 if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN)
147                 {
148                         for(base = scene->base.first; base; base= base->next) 
149                         {
150                                 Object *ob1= base->object;
151                                 if(ob1 != ob)
152                                 {
153                                         FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim);
154                                         
155                                         // only put dependancies from NON-DOMAIN fluids in here
156                                         if(fluidmdtmp && fluidmdtmp->fss && (fluidmdtmp->fss->type!=OB_FLUIDSIM_DOMAIN))
157                                         {
158                                                 DagNode *curNode = dag_get_node(forest, ob1);
159                                                 dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Fluidsim Object");
160                                         }
161                                 }
162                         }
163                 }
164         }
165 }
166
167 static int dependsOnTime(ModifierData *md) 
168 {
169         return 1;
170 }
171
172
173 ModifierTypeInfo modifierType_Fluidsim = {
174         /* name */              "Fluidsim",
175         /* structName */        "FluidsimModifierData",
176         /* structSize */        sizeof(FluidsimModifierData),
177         /* type */              eModifierTypeType_Nonconstructive,
178
179         /* flags */             eModifierTypeFlag_AcceptsMesh
180                                                         | eModifierTypeFlag_RequiresOriginalData
181                                                         | eModifierTypeFlag_Single,
182
183         /* copyData */          copyData,
184         /* deformVerts */       0,
185         /* deformVertsEM */     0,
186         /* deformMatricesEM */  0,
187         /* applyModifier */     applyModifier,
188         /* applyModifierEM */   0,
189         /* initData */          initData,
190         /* requiredDataMask */  0,
191         /* freeData */          freeData,
192         /* isDisabled */        0,
193         /* updateDepgraph */    updateDepgraph,
194         /* dependsOnTime */     dependsOnTime,
195         /* foreachObjectLink */ 0,
196         /* foreachIDLink */     0,
197 };