Commit: 722f7f95be6c77e4a5317e460063df18c00099b2
Author: Sebastián Barschkis
Date:   Tue Mar 15 20:09:47 2016 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rB722f7f95be6c77e4a5317e460063df18c00099b2

totally refactored, cleaned up manta object and its API

===================================================================

M       intern/mantaflow/intern/MANTA.cpp
M       intern/mantaflow/intern/MANTA.h
M       intern/mantaflow/intern/manta_smoke_API.cpp

===================================================================

diff --git a/intern/mantaflow/intern/MANTA.cpp 
b/intern/mantaflow/intern/MANTA.cpp
index 2845b3e..0815393 100644
--- a/intern/mantaflow/intern/MANTA.cpp
+++ b/intern/mantaflow/intern/MANTA.cpp
@@ -29,54 +29,125 @@
 
 #include "MANTA.h"
 
-MANTA::MANTA(int *res, float dx, float dtdef, int init_heat, int init_fire, 
int init_colors, SmokeModifierData *smd) :
-_xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
+bool MANTA::mantaInitialized = false;
+
+MANTA::MANTA(int *res, SmokeModifierData *smd)
 {
        std::cout << "MANTA" << std::endl;
-       // set simulation consts
-       _dt = dtdef;    // just in case. set in step from a RNA factor
-
-       _iterations = 100;
-       _tempAmb = 0; 
-       _heatDiffusion = 1e-3;
-       _totalTime = 0.0f;
-       _totalSteps = 0;
-       _maxRes = MAX3(_xRes, _yRes, _zRes);
-       
-       if (!dx)
-               _dx = 1.0f / (float)_maxRes;
-       else
-               _dx = dx;
-       _constantScaling = 64.0f / _maxRes;
-       _constantScaling = (_constantScaling < 1.0f) ? 1.0f : _constantScaling;
-       _vorticityEps = 2.0f / _constantScaling; // Just in case set a default 
value
-
-       _totalCells   = _xRes * _yRes * _zRes;
-
-       // allocate arrays
-       _manta_inflow = NULL;
-       _fuel_inflow = NULL;
-       _manta_flags = NULL;
-       _xVelocity = NULL;
-       _yVelocity = NULL;
-       _zVelocity = NULL;
-       _xVelocityOb = NULL;
-       _yVelocityOb = NULL;
-       _zVelocityOb = NULL;
-       _xForce = NULL;
-       _yForce = NULL;
-       _zForce = NULL;
-       _density = NULL;
-       _obstacles = new unsigned char[_totalCells]; // set 0 at end of step
-
-       _using_heat = false;
-       _using_fire = false;
-       _using_colors = false;
-       
-       MANTA::start_mantaflow();
-       
-       // Base setup low res
-       std::string setup_script =
+       smd->domain->fluid = this;
+       
+       // General variables used for low and high res
+       std::string tmpScript = "";
+       std::string finalScript = "";
+       mUsingHighRes = smd->domain->flags & MOD_SMOKE_HIGHRES;
+       
+       // Make sure that string vector does not contain any previous commands
+       mCommands.clear();
+
+       // simulation constants
+       mTempAmb                        = 0; // TODO: Maybe use this later for 
buoyancy calculation
+       mResX                           = res[0];
+       mResY                           = res[1];
+       mResZ                           = res[2];
+       int maxRes                      = MAX3(mResX, mResY, mResZ);
+       mConstantScaling        = 64.0f / maxRes;
+       mConstantScaling        = (mConstantScaling < 1.0f) ? 1.0f : 
mConstantScaling;
+       mTotalCells                     = mResX * mResY * mResZ;
+       
+       // low res grids
+       mDensity                = NULL;
+       mHeat                   = NULL;
+       mVelocityX              = NULL;
+       mVelocityY              = NULL;
+       mVelocityZ              = NULL;
+       mForceX                 = NULL;
+       mForceY                 = NULL;
+       mForceZ                 = NULL;
+       mFlame                  = NULL;
+       mFuel                   = NULL;
+       mReact                  = NULL;
+       mColorR                 = NULL;
+       mColorG                 = NULL;
+       mColorB                 = NULL;
+       mDensityInflow  = NULL;
+       mFuelInflow             = NULL;
+       mMantaFlags             = NULL;
+       mObVelocityX    = new float[mTotalCells];                               
// TODO in Mantaflow
+       mObVelocityY    = new float[mTotalCells];                               
// TODO in Mantaflow
+       mObVelocityZ    = new float[mTotalCells];                               
// TODO in Mantaflow
+       mObstacles              = new unsigned char[mTotalCells];               
// TODO in Mantaflow
+       mObstaclesAnim  = new unsigned char[mTotalCells];               // TODO 
in Mantaflow
+       
+       // high res grids
+       mDensityHigh    = NULL;
+       mFlameHigh              = NULL;
+       mFuelHigh               = NULL;
+       mReactHigh              = NULL;
+       mColorRHigh             = NULL;
+       mColorGHigh             = NULL;
+       mColorBHigh             = NULL;
+       
+       // TODO: Obstacle grid not mantaflow optimized
+       for (int x = 0; x < mTotalCells; x++)
+               mObstacles[x] = false;
+
+       if (!mantaInitialized)
+               startMantaflow();
+       
+       // Initialize Mantaflow variables in Python
+       initSetup(smd);
+       if (smd->domain->active_fields & SM_ACTIVE_HEAT)
+               initHeat(smd);
+       if (smd->domain->active_fields & SM_ACTIVE_FIRE)
+               initFire(smd);
+       if (smd->domain->active_fields & SM_ACTIVE_COLORS)
+               initColors(smd);
+       
+       updatePointers(smd); // Needs to be after heat, fire, color init
+       
+       if (smd->domain->flags & MOD_SMOKE_HIGHRES)
+       {               
+               // Make sure that string vector does not contain any previous 
commands
+               mCommands.clear();
+
+               // simulation constants
+               int amplify             = smd->domain->amplify + 1;
+               mResXHigh               = amplify * mResX;
+               mResYHigh               = amplify * mResY;
+               mResZHigh               = amplify * mResZ;
+               mTotalCellsHigh = mResXHigh * mResYHigh * mResZHigh;
+               
+               mTextureU = new float[mTotalCells];                             
        // TODO in Mantaflow
+               mTextureV = new float[mTotalCells];                             
        // TODO in Mantaflow
+               mTextureW = new float[mTotalCells];                             
        // TODO in Mantaflow
+               
+               const float dx = 1.0f/(float)(mResX);                           
// TODO in Mantaflow
+               const float dy = 1.0f/(float)(mResY);                           
// TODO in Mantaflow
+               const float dz = 1.0f/(float)(mResZ);                           
// TODO in Mantaflow
+               int index = 0;                                                  
                        // TODO in Mantaflow
+               for (int z = 0; z < mResZ; z++)                                 
        // TODO in Mantaflow
+                       for (int y = 0; y < mResY; y++)                         
        // TODO in Mantaflow
+                               for (int x = 0; x < mResX; x++, index++)        
// TODO in Mantaflow
+                               {
+                                       mTextureU[index] = x*dx;                
                // TODO in Mantaflow
+                                       mTextureV[index] = y*dy;                
                // TODO in Mantaflow
+                                       mTextureW[index] = z*dz;                
                // TODO in Mantaflow
+                               }
+               
+               // Initialize Mantaflow variables in Python
+               initSetupHigh(smd);
+               if (smd->domain->active_fields & SM_ACTIVE_FIRE)
+                       initFireHigh(smd);
+               if (smd->domain->active_fields & SM_ACTIVE_COLORS)
+                       initColorsHigh(smd);
+
+               updatePointersHigh(smd); // Needs to be after fire, color init
+       }
+}
+
+void MANTA::initSetup(SmokeModifierData *smd)
+{
+       std::string tmpString =
                manta_import +
                solver_setup_low +
                uv_setup +
@@ -85,226 +156,131 @@ _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
                flags +
                manta_step +
                smoke_step_low;
-       std::string final_script = MANTA::parse_script(setup_script, smd);
-       PyGILState_STATE gilstate = PyGILState_Ensure();
-       PyRun_SimpleString(final_script.c_str());
-       PyGILState_Release(gilstate);
-       
-       smd->domain->manta = this;
-       
-       /* heat */
-       _heat = NULL;
-       if (init_heat) {
-               initHeat();
-       }
-       // Fire simulation
-       _flame = NULL;
-       _fuel = NULL;
-       _react = NULL;
-       if (init_fire) {
-               initFire();
-       }
-       // Smoke color
-       _color_r = NULL;
-       _color_g = NULL;
-       _color_b = NULL;
-       if (init_colors) {
-               initColors(0.0f, 0.0f, 0.0f);
-       }
-       
-       MANTA::update_pointers();
-       
-       // High resolution
-       _xResBig = _amplify * _xRes;
-       _yResBig = _amplify * _yRes;
-       _zResBig = _amplify * _zRes;
-       _slabSizeBig = _xResBig * _yResBig;
-       _totalCellsBig = _slabSizeBig * _zResBig;
-       
-       // allocate high resolution density field
-       _densityBig = NULL;
-       _flameBig = NULL;
-       _fuelBig = NULL;
-       _reactBig = NULL;
-       
-       _color_rBig = NULL;
-       _color_gBig = NULL;
-       _color_bBig = NULL;
+       std::string finalString = parseScript(tmpString, smd);
+       mCommands.push_back(finalString);
        
-       // Base setup high res
-       std::string setup_script =
+       runPythonString(mCommands);
+}
+
+void MANTA::initSetupHigh(SmokeModifierData *smd)
+{
+       std::string tmpString =
                solver_setup_high +
                alloc_base_grids_high +
                prep_domain_high +
-               flags +
                wavelet_turbulence_noise +
                smoke_step_high;
-       std::string final_script = Manta_API::parse_script(setup_script);
-       PyGILState_STATE gilstate = PyGILState_Ensure();
-       PyRun_SimpleString(final_script.c_str());
-       PyGILState_Release(gilstate);
-       
-       // Fire grids
-       if (init_fire) {
-               initFireHigh();
-       }
-       
-       // Color grids
-       if (init_colors) {
-               initColorsHigh(0.0f, 0.0f, 0.0f);
-       }
-
-       // allocate & init texture coordinates
-       _tcU = NULL;
-       _tcV = NULL;
-       _tcW = NULL;
-       
-       MANTA::update_high_res_pointers();
+       std::string finalString = parseScript(tmpString, smd);
+       mCommands.push_back(finalString);
+               
+       runPythonString(mCommands);
 }
 
-void MANTA::initHeat()
-{
-       if (!_heat) {
-               _using_heat = true;
-               PyGILState_STATE gilstate = PyGILState_Ensure();
-               PyRun_SimpleString(alloc_heat_low.c_str());
-               PyRun_SimpleString(with_heat.c_str());
-               PyGILState_Release(gilstate);
-               MANTA::update_pointers();
-       }
-}
 
-void MANTA::initFire()
+void MANTA::initHeat(SmokeModifierData *smd)
 {
-       if (!_flame) {
-               _using_fire = true;
-               PyGILState_STATE gilstate = PyGILState_Ensure();
-               PyRun_SimpleString(alloc_fire_low.c_str());
-               PyRun_SimpleString(with_fire.c_str());
-               PyGILState_Release(gilstate);
-               MANTA::update_pointers();
+       if (!mHeat) {
+               mCommands.clear();
+               mCommands.push_back(alloc_heat_low);
+               mCommands.push_back(with_heat);
+               
+               runPythonString(mCommands);
        }
 }
 
-void MANTA::initFireHigh()
+void MANTA::initFire(SmokeModifierData *smd)
 {
-       if (!_fuelBig) {
-               using_fire = true;
-               PyGILState_STATE gilstate = PyGILState_Ensure();
-               PyRun_SimpleString(alloc_fire_high.c_str());
-               PyGILState_Release(gilstate);
-               MANTA::update_high_res_pointers();
+       if (!mFuel) {
+               mCommands.clear();
+               mCommands.push_back(alloc_fire_low);
+               mCommands.push_back(with_fire);
+
+               runPythonString(mCommands);
        }
 }
 
-void MANTA::initColors(float init_r, float init_g, float init_b)
+void MANTA::initFireHigh(SmokeModifierData *smd)
 {
-       if (!_color_r) {
-               _using_colors = true;
-               PyGILState_STATE gilstate = PyGILState_Ensure();
-               std::stringstream ss;
-               ss << "manta_color_r = " << init_r << endl;
-               ss << "manta_color_g = " << init_g << endl;
-               ss << "manta_color_b = " << init_b << endl;
-               PyRun_SimpleString(ss.str().c_str());
-               PyRun_SimpleString(alloc_colors_low.c_str());
-               PyRun_SimpleString(init_colors_low.c_str());
-               PyRun_SimpleString(with_colors.c_str());
-               PyGILState_Release(gilstate);
-               MANTA::update_pointers();
+       if (!mFuelHigh) {
+               mCommands.clear();
+               mCommands.push_back(alloc_fire_high);
+               mCommands.push_back(with_fire);
+
+               runPythonString(mCommands);
        }
 }
 
-void MANTA::initColorsHigh(float init_r, float init_g, float init_b)
+void MANTA::initColors(SmokeModifierData *smd)
 {
-       if (!_color_rBig) {
-               using_colors = true;
-               PyGILState_STATE gilstate = PyGILState_Ensure();
-               stringstream ss;
-               ss << "manta_color_r = " << init_r << endl;
-               ss << "manta_color_g = " << init_g << endl;
-               ss << "manta_color_b = " << init_b << endl;
-               PyRun_SimpleString(ss.str().c_str());
-               PyRun_SimpleString(alloc_colors_high.c_str());
-               PyRun_SimpleString(init_colors_high.c_str());
-               PyRun_SimpleString(with_fire.c_str());
-               PyGILState_Release(gilstate);
-               MANTA::update_high_res_pointers();
+       if (!mColorR) {
+               mCommands.clear();
+               std:: string colorCodes = parseScript(set_color_codes, smd);
+               mCommands.push_back(colorCodes);
+               mCommands.push_back(alloc_colors_low);
+               mCommands.push_back(init_colors_low);
+               mCommands.push_back(

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to