Blender  V2.93
MANTA_main.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2016 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #ifndef MANTA_A_H
25 #define MANTA_A_H
26 
27 #include <atomic>
28 #include <cassert>
29 #include <string>
30 #include <unordered_map>
31 #include <vector>
32 
33 using std::atomic;
34 using std::string;
35 using std::unordered_map;
36 using std::vector;
37 
38 struct MANTA {
39  public:
40  MANTA(int *res, struct FluidModifierData *fmd);
41  virtual ~MANTA();
42 
43  /* Mirroring Mantaflow structures for particle data (pVel also used for mesh vert vels). */
44  typedef struct PData {
45  float pos[3];
46  int flag;
47  } pData;
48  typedef struct PVel {
49  float pos[3];
50  } pVel;
51 
52  /* Mirroring Mantaflow structures for meshes. */
53  typedef struct Node {
54  int flags;
55  float pos[3], normal[3];
56  } Node;
57  typedef struct Triangle {
58  int c[3];
59  int flags;
61 
62  /* Grid initialization functions. */
63  bool initHeat(struct FluidModifierData *fmd = nullptr);
64  bool initFire(struct FluidModifierData *fmd = nullptr);
65  bool initColors(struct FluidModifierData *fmd = nullptr);
66  bool initFireHigh(struct FluidModifierData *fmd = nullptr);
67  bool initColorsHigh(struct FluidModifierData *fmd = nullptr);
68  bool initLiquid(FluidModifierData *fmd = nullptr);
69  bool initLiquidMesh(FluidModifierData *fmd = nullptr);
70  bool initLiquidViscosity(FluidModifierData *fmd = nullptr);
71  bool initObstacle(FluidModifierData *fmd = nullptr);
72  bool initCurvature(FluidModifierData *fmd = nullptr);
73  bool initGuiding(FluidModifierData *fmd = nullptr);
74  bool initFractions(FluidModifierData *fmd = nullptr);
75  bool initInVelocity(FluidModifierData *fmd = nullptr);
76  bool initOutflow(FluidModifierData *fmd = nullptr);
77  bool initSndParts(FluidModifierData *fmd = nullptr);
78  bool initLiquidSndParts(FluidModifierData *fmd = nullptr);
79 
80  /* Pointer transfer: Mantaflow -> Blender. Use flush to reset all pointers to nullptr. */
81  void updatePointers(FluidModifierData *fmd, bool flush = false);
82 
83  /* Write cache. */
84  bool writeConfiguration(FluidModifierData *fmd, int framenr);
85  bool writeData(FluidModifierData *fmd, int framenr);
86  bool writeNoise(FluidModifierData *fmd, int framenr);
87  /* Write calls for mesh and particles were left in bake calls for now. */
88 
89  /* Read cache (via Python). */
90  bool readConfiguration(FluidModifierData *fmd, int framenr);
91  bool readData(FluidModifierData *fmd, int framenr, bool resumable);
92  bool readNoise(FluidModifierData *fmd, int framenr, bool resumable);
93  bool readMesh(FluidModifierData *fmd, int framenr);
94  bool readParticles(FluidModifierData *fmd, int framenr, bool resumable);
95  bool readGuiding(FluidModifierData *fmd, int framenr, bool sourceDomain);
96 
97  /* Propagate variable changes from RNA to Python. */
99 
100  /* Bake cache. */
101  bool bakeData(FluidModifierData *fmd, int framenr);
102  bool bakeNoise(FluidModifierData *fmd, int framenr);
103  bool bakeMesh(FluidModifierData *fmd, int framenr);
104  bool bakeParticles(FluidModifierData *fmd, int framenr);
105  bool bakeGuiding(FluidModifierData *fmd, int framenr);
106 
107  /* IO for Mantaflow scene script. */
108  bool exportSmokeScript(struct FluidModifierData *fmd);
109  bool exportLiquidScript(struct FluidModifierData *fmd);
110 
111  /* Check cache status by frame. */
112  bool hasConfig(FluidModifierData *fmd, int framenr);
113  bool hasData(FluidModifierData *fmd, int framenr);
114  bool hasNoise(FluidModifierData *fmd, int framenr);
115  bool hasMesh(FluidModifierData *fmd, int framenr);
116  bool hasParticles(FluidModifierData *fmd, int framenr);
117  bool hasGuiding(FluidModifierData *fmd, int framenr, bool sourceDomain);
118 
119  inline size_t getTotalCells()
120  {
121  return mTotalCells;
122  }
123  inline size_t getTotalCellsHigh()
124  {
125  return mTotalCellsHigh;
126  }
127  inline bool usingNoise()
128  {
129  return mUsingNoise;
130  }
131  inline int getResX()
132  {
133  return mResX;
134  }
135  inline int getResY()
136  {
137  return mResY;
138  }
139  inline int getResZ()
140  {
141  return mResZ;
142  }
143  inline int getParticleResX()
144  {
145  return mResXParticle;
146  }
147  inline int getParticleResY()
148  {
149  return mResYParticle;
150  }
151  inline int getParticleResZ()
152  {
153  return mResZParticle;
154  }
155  inline int getMeshResX()
156  {
157  return mResXMesh;
158  }
159  inline int getMeshResY()
160  {
161  return mResYMesh;
162  }
163  inline int getMeshResZ()
164  {
165  return mResZMesh;
166  }
167  inline int getResXHigh()
168  {
169  return mResXNoise;
170  }
171  inline int getResYHigh()
172  {
173  return mResYNoise;
174  }
175  inline int getResZHigh()
176  {
177  return mResZNoise;
178  }
179  inline int getMeshUpres()
180  {
181  return mUpresMesh;
182  }
183  inline int getParticleUpres()
184  {
185  return mUpresParticle;
186  }
187 
188  /* Smoke getters. */
189  inline float *getDensity()
190  {
191  return mDensity;
192  }
193  inline float *getHeat()
194  {
195  return mHeat;
196  }
197  inline float *getVelocityX()
198  {
199  return mVelocityX;
200  }
201  inline float *getVelocityY()
202  {
203  return mVelocityY;
204  }
205  inline float *getVelocityZ()
206  {
207  return mVelocityZ;
208  }
209  inline float *getObVelocityX()
210  {
211  return mObVelocityX;
212  }
213  inline float *getObVelocityY()
214  {
215  return mObVelocityY;
216  }
217  inline float *getObVelocityZ()
218  {
219  return mObVelocityZ;
220  }
221  inline float *getGuideVelocityX()
222  {
223  return mGuideVelocityX;
224  }
225  inline float *getGuideVelocityY()
226  {
227  return mGuideVelocityY;
228  }
229  inline float *getGuideVelocityZ()
230  {
231  return mGuideVelocityZ;
232  }
233  inline float *getInVelocityX()
234  {
235  return mInVelocityX;
236  }
237  inline float *getInVelocityY()
238  {
239  return mInVelocityY;
240  }
241  inline float *getInVelocityZ()
242  {
243  return mInVelocityZ;
244  }
245  inline float *getForceX()
246  {
247  return mForceX;
248  }
249  inline float *getForceY()
250  {
251  return mForceY;
252  }
253  inline float *getForceZ()
254  {
255  return mForceZ;
256  }
257  inline int *getFlags()
258  {
259  return mFlags;
260  }
261  inline float *getNumObstacle()
262  {
263  return mNumObstacle;
264  }
265  inline float *getNumGuide()
266  {
267  return mNumGuide;
268  }
269  inline float *getFlame()
270  {
271  return mFlame;
272  }
273  inline float *getFuel()
274  {
275  return mFuel;
276  }
277  inline float *getReact()
278  {
279  return mReact;
280  }
281  inline float *getColorR()
282  {
283  return mColorR;
284  }
285  inline float *getColorG()
286  {
287  return mColorG;
288  }
289  inline float *getColorB()
290  {
291  return mColorB;
292  }
293  inline float *getShadow()
294  {
295  return mShadow;
296  }
297  inline float *getDensityIn()
298  {
299  return mDensityIn;
300  }
301  inline float *getHeatIn()
302  {
303  return mHeatIn;
304  }
305  inline float *getColorRIn()
306  {
307  return mColorRIn;
308  }
309  inline float *getColorGIn()
310  {
311  return mColorGIn;
312  }
313  inline float *getColorBIn()
314  {
315  return mColorBIn;
316  }
317  inline float *getFuelIn()
318  {
319  return mFuelIn;
320  }
321  inline float *getReactIn()
322  {
323  return mReactIn;
324  }
325  inline float *getEmissionIn()
326  {
327  return mEmissionIn;
328  }
329 
330  inline float *getDensityHigh()
331  {
332  return mDensityHigh;
333  }
334  inline float *getFlameHigh()
335  {
336  return mFlameHigh;
337  }
338  inline float *getFuelHigh()
339  {
340  return mFuelHigh;
341  }
342  inline float *getReactHigh()
343  {
344  return mReactHigh;
345  }
346  inline float *getColorRHigh()
347  {
348  return mColorRHigh;
349  }
350  inline float *getColorGHigh()
351  {
352  return mColorGHigh;
353  }
354  inline float *getColorBHigh()
355  {
356  return mColorBHigh;
357  }
358  inline float *getTextureU()
359  {
360  return mTextureU;
361  }
362  inline float *getTextureV()
363  {
364  return mTextureV;
365  }
366  inline float *getTextureW()
367  {
368  return mTextureW;
369  }
370  inline float *getTextureU2()
371  {
372  return mTextureU2;
373  }
374  inline float *getTextureV2()
375  {
376  return mTextureV2;
377  }
378  inline float *getTextureW2()
379  {
380  return mTextureW2;
381  }
382 
383  inline float *getPhiIn()
384  {
385  return mPhiIn;
386  }
387  inline float *getPhiStaticIn()
388  {
389  return mPhiStaticIn;
390  }
391  inline float *getPhiObsIn()
392  {
393  return mPhiObsIn;
394  }
395  inline float *getPhiObsStaticIn()
396  {
397  return mPhiObsStaticIn;
398  }
399  inline float *getPhiGuideIn()
400  {
401  return mPhiGuideIn;
402  }
403  inline float *getPhiOutIn()
404  {
405  return mPhiOutIn;
406  }
407  inline float *getPhiOutStaticIn()
408  {
409  return mPhiOutStaticIn;
410  }
411  inline float *getPhi()
412  {
413  return mPhi;
414  }
415  inline float *getPressure()
416  {
417  return mPressure;
418  }
419 
420  static atomic<int> solverID;
421  static int with_debug; /* On or off (1 or 0), also sets manta debug level. */
422 
423  /* Mesh getters. */
424  inline int getNumVertices()
425  {
426  return (mMeshNodes && !mMeshNodes->empty()) ? mMeshNodes->size() : 0;
427  }
428  inline int getNumNormals()
429  {
430  return (mMeshNodes && !mMeshNodes->empty()) ? mMeshNodes->size() : 0;
431  }
432  inline int getNumTriangles()
433  {
434  return (mMeshTriangles && !mMeshTriangles->empty()) ? mMeshTriangles->size() : 0;
435  }
436 
437  inline float getVertexXAt(int i)
438  {
439  assert(i >= 0);
440  if (mMeshNodes && !mMeshNodes->empty()) {
441  assert(i < mMeshNodes->size());
442  return (*mMeshNodes)[i].pos[0];
443  }
444  return 0.0f;
445  }
446  inline float getVertexYAt(int i)
447  {
448  assert(i >= 0);
449  if (mMeshNodes && !mMeshNodes->empty()) {
450  assert(i < mMeshNodes->size());
451  return (*mMeshNodes)[i].pos[1];
452  }
453  return 0.0f;
454  }
455  inline float getVertexZAt(int i)
456  {
457  assert(i >= 0);
458  if (mMeshNodes && !mMeshNodes->empty()) {
459  assert(i < mMeshNodes->size());
460  return (*mMeshNodes)[i].pos[2];
461  }
462  return 0.0f;
463  }
464 
465  inline float getNormalXAt(int i)
466  {
467  assert(i >= 0);
468  if (mMeshNodes && !mMeshNodes->empty()) {
469  assert(i < mMeshNodes->size());
470  return (*mMeshNodes)[i].normal[0];
471  }
472  return 0.0f;
473  }
474  inline float getNormalYAt(int i)
475  {
476  assert(i >= 0);
477  if (mMeshNodes && !mMeshNodes->empty()) {
478  assert(i < mMeshNodes->size());
479  return (*mMeshNodes)[i].normal[1];
480  }
481  return 0.0f;
482  }
483  inline float getNormalZAt(int i)
484  {
485  assert(i >= 0);
486  if (mMeshNodes && !mMeshNodes->empty()) {
487  assert(i < mMeshNodes->size());
488  return (*mMeshNodes)[i].normal[2];
489  }
490  return 0.0f;
491  }
492 
493  inline int getTriangleXAt(int i)
494  {
495  assert(i >= 0);
496  if (mMeshTriangles && !mMeshTriangles->empty()) {
497  assert(i < mMeshTriangles->size());
498  return (*mMeshTriangles)[i].c[0];
499  }
500  return 0;
501  }
502  inline int getTriangleYAt(int i)
503  {
504  assert(i >= 0);
505  if (mMeshTriangles && !mMeshTriangles->empty()) {
506  assert(i < mMeshTriangles->size());
507  return (*mMeshTriangles)[i].c[1];
508  }
509  return 0;
510  }
511  inline int getTriangleZAt(int i)
512  {
513  assert(i >= 0);
514  if (mMeshTriangles && !mMeshTriangles->empty()) {
515  assert(i < mMeshTriangles->size());
516  return (*mMeshTriangles)[i].c[2];
517  }
518  return 0;
519  }
520 
521  inline float getVertVelXAt(int i)
522  {
523  assert(i >= 0);
524  if (mMeshVelocities && !mMeshVelocities->empty()) {
525  assert(i < mMeshVelocities->size());
526  return (*mMeshVelocities)[i].pos[0];
527  }
528  return 0.0f;
529  }
530  inline float getVertVelYAt(int i)
531  {
532  assert(i >= 0);
533  if (mMeshVelocities && !mMeshVelocities->empty()) {
534  assert(i < mMeshVelocities->size());
535  return (*mMeshVelocities)[i].pos[1];
536  }
537  return 0.0f;
538  }
539  inline float getVertVelZAt(int i)
540  {
541  assert(i >= 0);
542  if (mMeshVelocities && !mMeshVelocities->empty()) {
543  assert(i < mMeshVelocities->size());
544  return (*mMeshVelocities)[i].pos[2];
545  }
546  return 0.0f;
547  }
548 
549  // Particle getters
550  inline int getFlipParticleFlagAt(int i)
551  {
552  assert(i >= 0);
553  if (mFlipParticleData && !mFlipParticleData->empty()) {
554  assert(i < mFlipParticleData->size());
555  return (*mFlipParticleData)[i].flag;
556  }
557  return 0;
558  }
559  inline int getSndParticleFlagAt(int i)
560  {
561  assert(i >= 0);
562  if (mParticleData && !mParticleData->empty()) {
563  assert(i < mParticleData->size());
564  return (*mParticleData)[i].flag;
565  }
566  return 0;
567  }
568 
569  inline float getFlipParticlePositionXAt(int i)
570  {
571  assert(i >= 0);
572  if (mFlipParticleData && !mFlipParticleData->empty()) {
573  assert(i < mFlipParticleData->size());
574  return (*mFlipParticleData)[i].pos[0];
575  }
576  return 0.0f;
577  }
578  inline float getFlipParticlePositionYAt(int i)
579  {
580  assert(i >= 0);
581  if (mFlipParticleData && !mFlipParticleData->empty()) {
582  assert(i < mFlipParticleData->size());
583  return (*mFlipParticleData)[i].pos[1];
584  }
585  return 0.0f;
586  }
587  inline float getFlipParticlePositionZAt(int i)
588  {
589  assert(i >= 0);
590  if (mFlipParticleData && !mFlipParticleData->empty()) {
591  assert(i < mFlipParticleData->size());
592  return (*mFlipParticleData)[i].pos[2];
593  }
594  return 0.0f;
595  }
596 
597  inline float getSndParticlePositionXAt(int i)
598  {
599  assert(i >= 0);
600  if (mParticleData && !mParticleData->empty()) {
601  assert(i < mParticleData->size());
602  return (*mParticleData)[i].pos[0];
603  }
604  return 0.0f;
605  }
606  inline float getSndParticlePositionYAt(int i)
607  {
608  assert(i >= 0);
609  if (mParticleData && !mParticleData->empty()) {
610  assert(i < mParticleData->size());
611  return (*mParticleData)[i].pos[1];
612  }
613  return 0.0f;
614  }
615  inline float getSndParticlePositionZAt(int i)
616  {
617  assert(i >= 0);
618  if (mParticleData && !mParticleData->empty()) {
619  assert(i < mParticleData->size());
620  return (*mParticleData)[i].pos[2];
621  }
622  return 0.0f;
623  }
624 
625  inline float getFlipParticleVelocityXAt(int i)
626  {
627  assert(i >= 0);
628  if (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) {
629  assert(i < mFlipParticleVelocity->size());
630  return (*mFlipParticleVelocity)[i].pos[0];
631  }
632  return 0.0f;
633  }
634  inline float getFlipParticleVelocityYAt(int i)
635  {
636  assert(i >= 0);
637  if (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) {
638  assert(i < mFlipParticleVelocity->size());
639  return (*mFlipParticleVelocity)[i].pos[1];
640  }
641  return 0.0f;
642  }
643  inline float getFlipParticleVelocityZAt(int i)
644  {
645  assert(i >= 0);
646  if (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) {
647  assert(i < mFlipParticleVelocity->size());
648  return (*mFlipParticleVelocity)[i].pos[2];
649  }
650  return 0.0f;
651  }
652 
653  inline float getSndParticleVelocityXAt(int i)
654  {
655  assert(i >= 0);
656  if (mParticleVelocity && !mParticleVelocity->empty()) {
657  assert(i < mParticleVelocity->size());
658  return (*mParticleVelocity)[i].pos[0];
659  }
660  return 0.0f;
661  }
662  inline float getSndParticleVelocityYAt(int i)
663  {
664  assert(i >= 0);
665  if (mParticleVelocity && !mParticleVelocity->empty()) {
666  assert(i < mParticleVelocity->size());
667  return (*mParticleVelocity)[i].pos[1];
668  }
669  return 0.0f;
670  }
671  inline float getSndParticleVelocityZAt(int i)
672  {
673  assert(i >= 0);
674  if (mParticleVelocity && !mParticleVelocity->empty()) {
675  assert(i < mParticleVelocity->size());
676  return (*mParticleVelocity)[i].pos[2];
677  }
678  return 0.0f;
679  }
680 
681  inline float *getFlipParticleData()
682  {
683  return (mFlipParticleData && !mFlipParticleData->empty()) ?
684  (float *)&mFlipParticleData->front() :
685  nullptr;
686  }
687  inline float *getSndParticleData()
688  {
689  return (mParticleData && !mParticleData->empty()) ? (float *)&mParticleData->front() : nullptr;
690  }
691 
692  inline float *getFlipParticleVelocity()
693  {
694  return (mFlipParticleVelocity && !mFlipParticleVelocity->empty()) ?
695  (float *)&mFlipParticleVelocity->front() :
696  nullptr;
697  }
698  inline float *getSndParticleVelocity()
699  {
700  return (mParticleVelocity && !mParticleVelocity->empty()) ?
701  (float *)&mParticleVelocity->front() :
702  nullptr;
703  }
704  inline float *getSndParticleLife()
705  {
706  return (mParticleLife && !mParticleLife->empty()) ? (float *)&mParticleLife->front() : nullptr;
707  }
708 
709  inline int getNumFlipParticles()
710  {
711  return (mFlipParticleData && !mFlipParticleData->empty()) ? mFlipParticleData->size() : 0;
712  }
713  inline int getNumSndParticles()
714  {
715  return (mParticleData && !mParticleData->empty()) ? mParticleData->size() : 0;
716  }
717 
718  inline bool usingFlipFromFile()
719  {
720  return mFlipFromFile;
721  }
722  inline bool usingMeshFromFile()
723  {
724  return mMeshFromFile;
725  }
726  inline bool usingParticleFromFile()
727  {
728  return mParticlesFromFile;
729  }
730 
731  /* Direct access to solver time attributes. */
732  int getFrame();
733  float getTimestep();
734  void adaptTimestep();
735 
736  bool needsRealloc(FluidModifierData *fmd);
737 
738  private:
739  /* Simulation constants. */
740  size_t mTotalCells;
741  size_t mTotalCellsHigh;
742  size_t mTotalCellsMesh;
743  size_t mTotalCellsParticles;
744 
745  unordered_map<string, string> mRNAMap;
746 
747  /* The ID of the solver objects will be incremented for every new object. */
748  const int mCurrentID;
749 
750  bool mUsingHeat;
751  bool mUsingColors;
752  bool mUsingFire;
753  bool mUsingObstacle;
754  bool mUsingGuiding;
755  bool mUsingFractions;
756  bool mUsingInvel;
757  bool mUsingOutflow;
758  bool mUsingNoise;
759  bool mUsingMesh;
760  bool mUsingDiffusion;
761  bool mUsingViscosity;
762  bool mUsingMVel;
763  bool mUsingLiquid;
764  bool mUsingSmoke;
765  bool mUsingDrops;
766  bool mUsingBubbles;
767  bool mUsingFloats;
768  bool mUsingTracers;
769 
770  bool mFlipFromFile;
771  bool mMeshFromFile;
772  bool mParticlesFromFile;
773  bool mSmokeFromFile;
774  bool mNoiseFromFile;
775 
776  int mResX;
777  int mResY;
778  int mResZ;
779  const int mMaxRes;
780 
781  int mResXNoise;
782  int mResYNoise;
783  int mResZNoise;
784  int mResXMesh;
785  int mResYMesh;
786  int mResZMesh;
787  int mResXParticle;
788  int mResYParticle;
789  int mResZParticle;
790  int *mResGuiding;
791 
792  int mUpresMesh;
793  int mUpresParticle;
794 
795  /* Fluid grids. */
796  float *mVelocityX;
797  float *mVelocityY;
798  float *mVelocityZ;
799  float *mObVelocityX;
800  float *mObVelocityY;
801  float *mObVelocityZ;
802  float *mGuideVelocityX;
803  float *mGuideVelocityY;
804  float *mGuideVelocityZ;
805  float *mInVelocityX;
806  float *mInVelocityY;
807  float *mInVelocityZ;
808  float *mForceX;
809  float *mForceY;
810  float *mForceZ;
811  int *mFlags;
812  float *mNumObstacle;
813  float *mNumGuide;
814  float *mPressure;
815 
816  /* Smoke grids. */
817  float *mDensity;
818  float *mHeat;
819  float *mFlame;
820  float *mFuel;
821  float *mReact;
822  float *mColorR;
823  float *mColorG;
824  float *mColorB;
825  float *mShadow;
826  float *mDensityIn;
827  float *mHeatIn;
828  float *mFuelIn;
829  float *mReactIn;
830  float *mEmissionIn;
831  float *mColorRIn;
832  float *mColorGIn;
833  float *mColorBIn;
834  float *mDensityHigh;
835  float *mFlameHigh;
836  float *mFuelHigh;
837  float *mReactHigh;
838  float *mColorRHigh;
839  float *mColorGHigh;
840  float *mColorBHigh;
841  float *mTextureU;
842  float *mTextureV;
843  float *mTextureW;
844  float *mTextureU2;
845  float *mTextureV2;
846  float *mTextureW2;
847 
848  /* Liquid grids. */
849  float *mPhiIn;
850  float *mPhiStaticIn;
851  float *mPhiObsIn;
852  float *mPhiObsStaticIn;
853  float *mPhiGuideIn;
854  float *mPhiOutIn;
855  float *mPhiOutStaticIn;
856  float *mPhi;
857 
858  /* Mesh fields. */
859  vector<Node> *mMeshNodes;
860  vector<Triangle> *mMeshTriangles;
861  vector<pVel> *mMeshVelocities;
862 
863  /* Particle fields. */
864  vector<pData> *mFlipParticleData;
865  vector<pVel> *mFlipParticleVelocity;
866 
867  vector<pData> *mParticleData;
868  vector<pVel> *mParticleVelocity;
869  vector<float> *mParticleLife;
870 
871  void initializeRNAMap(struct FluidModifierData *doRnaRefresh = nullptr);
872  bool initDomain(struct FluidModifierData *doRnaRefresh = nullptr);
873  bool initNoise(struct FluidModifierData *doRnaRefresh = nullptr);
874  bool initMesh(struct FluidModifierData *doRnaRefresh = nullptr);
875  bool initSmoke(struct FluidModifierData *doRnaRefresh = nullptr);
876  bool initSmokeNoise(struct FluidModifierData *doRnaRefresh = nullptr);
877  void initializeMantaflow();
878  void terminateMantaflow();
879  bool runPythonString(vector<string> commands);
880  string getRealValue(const string &varName);
881  string parseLine(const string &line);
882  string parseScript(const string &setup_string, FluidModifierData *fmd = nullptr);
883  string getDirectory(struct FluidModifierData *fmd, string subdirectory);
884  string getFile(struct FluidModifierData *fmd,
885  string subdirectory,
886  string fname,
887  string extension,
888  int framenr);
889 };
890 
891 #endif
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
std::vector< ElementType, Eigen::aligned_allocator< ElementType > > vector
Definition: vector.h:39
float pos[3]
Definition: MANTA_main.h:55
float normal[3]
Definition: MANTA_main.h:55
float pos[3]
Definition: MANTA_main.h:45
float pos[3]
Definition: MANTA_main.h:49
bool exportSmokeScript(struct FluidModifierData *fmd)
float * getTextureV2()
Definition: MANTA_main.h:374
float * getColorBHigh()
Definition: MANTA_main.h:354
int getMeshResX()
Definition: MANTA_main.h:155
float * getHeatIn()
Definition: MANTA_main.h:301
int getParticleResZ()
Definition: MANTA_main.h:151
float * getFlipParticleData()
Definition: MANTA_main.h:681
int getTriangleXAt(int i)
Definition: MANTA_main.h:493
float * getColorG()
Definition: MANTA_main.h:285
float * getFlipParticleVelocity()
Definition: MANTA_main.h:692
float * getObVelocityX()
Definition: MANTA_main.h:209
float * getGuideVelocityZ()
Definition: MANTA_main.h:229
float * getPhiStaticIn()
Definition: MANTA_main.h:387
float getVertexZAt(int i)
Definition: MANTA_main.h:455
int getNumVertices()
Definition: MANTA_main.h:424
float getFlipParticlePositionXAt(int i)
Definition: MANTA_main.h:569
float * getGuideVelocityX()
Definition: MANTA_main.h:221
bool bakeNoise(FluidModifierData *fmd, int framenr)
bool writeNoise(FluidModifierData *fmd, int framenr)
float getSndParticlePositionXAt(int i)
Definition: MANTA_main.h:597
bool initFireHigh(struct FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:369
bool hasNoise(FluidModifierData *fmd, int framenr)
float * getPressure()
Definition: MANTA_main.h:415
bool exportLiquidScript(struct FluidModifierData *fmd)
bool readData(FluidModifierData *fmd, int framenr, bool resumable)
int getNumFlipParticles()
Definition: MANTA_main.h:709
bool initOutflow(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:519
float getNormalZAt(int i)
Definition: MANTA_main.h:483
float * getNumGuide()
Definition: MANTA_main.h:265
size_t getTotalCells()
Definition: MANTA_main.h:119
float * getFuelIn()
Definition: MANTA_main.h:317
float * getGuideVelocityY()
Definition: MANTA_main.h:225
float getSndParticleVelocityYAt(int i)
Definition: MANTA_main.h:662
float * getInVelocityX()
Definition: MANTA_main.h:233
float * getColorGHigh()
Definition: MANTA_main.h:350
float * getColorR()
Definition: MANTA_main.h:281
float * getFuel()
Definition: MANTA_main.h:273
bool writeConfiguration(FluidModifierData *fmd, int framenr)
int getParticleUpres()
Definition: MANTA_main.h:183
float getSndParticleVelocityXAt(int i)
Definition: MANTA_main.h:653
int getSndParticleFlagAt(int i)
Definition: MANTA_main.h:559
float * getPhiObsStaticIn()
Definition: MANTA_main.h:395
bool initFire(struct FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:355
float * getColorGIn()
Definition: MANTA_main.h:309
float * getShadow()
Definition: MANTA_main.h:293
bool writeData(FluidModifierData *fmd, int framenr)
float getVertVelXAt(int i)
Definition: MANTA_main.h:521
float getSndParticlePositionZAt(int i)
Definition: MANTA_main.h:615
float * getVelocityZ()
Definition: MANTA_main.h:205
float getVertVelYAt(int i)
Definition: MANTA_main.h:530
float * getEmissionIn()
Definition: MANTA_main.h:325
float getFlipParticleVelocityYAt(int i)
Definition: MANTA_main.h:634
static int with_debug
Definition: MANTA_main.h:421
bool needsRealloc(FluidModifierData *fmd)
int getResZHigh()
Definition: MANTA_main.h:175
float * getDensityHigh()
Definition: MANTA_main.h:330
bool readParticles(FluidModifierData *fmd, int framenr, bool resumable)
float * getVelocityY()
Definition: MANTA_main.h:201
bool readMesh(FluidModifierData *fmd, int framenr)
bool readGuiding(FluidModifierData *fmd, int framenr, bool sourceDomain)
bool initLiquidViscosity(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:448
float getSndParticlePositionYAt(int i)
Definition: MANTA_main.h:606
bool bakeMesh(FluidModifierData *fmd, int framenr)
bool initLiquid(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:411
int getNumSndParticles()
Definition: MANTA_main.h:713
bool initFractions(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:496
bool initLiquidMesh(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:437
bool usingMeshFromFile()
Definition: MANTA_main.h:722
float * getColorRIn()
Definition: MANTA_main.h:305
float getVertexXAt(int i)
Definition: MANTA_main.h:437
int getMeshResY()
Definition: MANTA_main.h:159
float * getTextureV()
Definition: MANTA_main.h:362
bool hasMesh(FluidModifierData *fmd, int framenr)
float * getSndParticleVelocity()
Definition: MANTA_main.h:698
float * getForceX()
Definition: MANTA_main.h:245
int getTriangleZAt(int i)
Definition: MANTA_main.h:511
float * getForceY()
Definition: MANTA_main.h:249
float * getReactIn()
Definition: MANTA_main.h:321
int getMeshResZ()
Definition: MANTA_main.h:163
float getNormalXAt(int i)
Definition: MANTA_main.h:465
bool initGuiding(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:482
float * getForceZ()
Definition: MANTA_main.h:253
int getResYHigh()
Definition: MANTA_main.h:171
int getResZ()
Definition: MANTA_main.h:139
float * getFuelHigh()
Definition: MANTA_main.h:338
float * getInVelocityZ()
Definition: MANTA_main.h:241
bool readConfiguration(FluidModifierData *fmd, int framenr)
virtual ~MANTA()
Definition: MANTA_main.cpp:557
int getFlipParticleFlagAt(int i)
Definition: MANTA_main.h:550
float getFlipParticleVelocityXAt(int i)
Definition: MANTA_main.h:625
int getParticleResX()
Definition: MANTA_main.h:143
float * getReactHigh()
Definition: MANTA_main.h:342
bool bakeGuiding(FluidModifierData *fmd, int framenr)
size_t getTotalCellsHigh()
Definition: MANTA_main.h:123
float * getVelocityX()
Definition: MANTA_main.h:197
float getSndParticleVelocityZAt(int i)
Definition: MANTA_main.h:671
int getResX()
Definition: MANTA_main.h:131
float getFlipParticleVelocityZAt(int i)
Definition: MANTA_main.h:643
static atomic< int > solverID
Definition: MANTA_main.h:420
struct MANTA::Triangle Triangle
float * getTextureW2()
Definition: MANTA_main.h:378
bool hasParticles(FluidModifierData *fmd, int framenr)
float * getPhiObsIn()
Definition: MANTA_main.h:391
bool usingNoise()
Definition: MANTA_main.h:127
float * getTextureW()
Definition: MANTA_main.h:366
bool initColorsHigh(struct FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:397
bool initObstacle(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:469
float getTimestep()
bool initColors(struct FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:383
bool readNoise(FluidModifierData *fmd, int framenr, bool resumable)
float getVertVelZAt(int i)
Definition: MANTA_main.h:539
int getTriangleYAt(int i)
Definition: MANTA_main.h:502
bool initSndParts(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:532
float * getReact()
Definition: MANTA_main.h:277
float * getHeat()
Definition: MANTA_main.h:193
float * getSndParticleLife()
Definition: MANTA_main.h:704
struct MANTA::Node Node
bool initCurvature(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:459
bool hasGuiding(FluidModifierData *fmd, int framenr, bool sourceDomain)
float * getPhiOutIn()
Definition: MANTA_main.h:403
bool initHeat(struct FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:341
int getParticleResY()
Definition: MANTA_main.h:147
float * getPhiGuideIn()
Definition: MANTA_main.h:399
bool bakeParticles(FluidModifierData *fmd, int framenr)
MANTA(int *res, struct FluidModifierData *fmd)
Definition: MANTA_main.cpp:59
float * getPhiOutStaticIn()
Definition: MANTA_main.h:407
bool bakeData(FluidModifierData *fmd, int framenr)
float getNormalYAt(int i)
Definition: MANTA_main.h:474
float * getDensity()
Definition: MANTA_main.h:189
bool initInVelocity(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:506
float * getInVelocityY()
Definition: MANTA_main.h:237
float * getFlame()
Definition: MANTA_main.h:269
float * getNumObstacle()
Definition: MANTA_main.h:261
float * getColorRHigh()
Definition: MANTA_main.h:346
float * getPhi()
Definition: MANTA_main.h:411
int getNumNormals()
Definition: MANTA_main.h:428
int getNumTriangles()
Definition: MANTA_main.h:432
float * getTextureU()
Definition: MANTA_main.h:358
float * getObVelocityY()
Definition: MANTA_main.h:213
void adaptTimestep()
int getResY()
Definition: MANTA_main.h:135
float * getColorB()
Definition: MANTA_main.h:289
bool usingFlipFromFile()
Definition: MANTA_main.h:718
float * getDensityIn()
Definition: MANTA_main.h:297
float * getFlameHigh()
Definition: MANTA_main.h:334
float * getObVelocityZ()
Definition: MANTA_main.h:217
int getFrame()
int * getFlags()
Definition: MANTA_main.h:257
void updatePointers(FluidModifierData *fmd, bool flush=false)
int getMeshUpres()
Definition: MANTA_main.h:179
struct MANTA::PVel pVel
float getFlipParticlePositionYAt(int i)
Definition: MANTA_main.h:578
struct MANTA::PData pData
bool hasData(FluidModifierData *fmd, int framenr)
int getResXHigh()
Definition: MANTA_main.h:167
float getVertexYAt(int i)
Definition: MANTA_main.h:446
bool updateVariables(FluidModifierData *fmd)
float getFlipParticlePositionZAt(int i)
Definition: MANTA_main.h:587
float * getColorBIn()
Definition: MANTA_main.h:313
bool hasConfig(FluidModifierData *fmd, int framenr)
float * getTextureU2()
Definition: MANTA_main.h:370
float * getPhiIn()
Definition: MANTA_main.h:383
bool initLiquidSndParts(FluidModifierData *fmd=nullptr)
Definition: MANTA_main.cpp:542
bool usingParticleFromFile()
Definition: MANTA_main.h:726
float * getSndParticleData()
Definition: MANTA_main.h:687