Commit: 9c7f7c6573d47fb98866a1010d02a4457afe9df1
Author: Roman Pogribnyi
Date: Mon Aug 25 14:43:17 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB9c7f7c6573d47fb98866a1010d02a4457afe9df1
more parameters for smoke scenario, writing out emitter fields
===================================================================
M intern/smoke/extern/smoke_API.h
M intern/smoke/intern/MANTA.cpp
M intern/smoke/intern/MANTA.h
M intern/smoke/intern/scenarios/smoke.h
M intern/smoke/intern/smoke_API.cpp
M source/blender/blenkernel/intern/smoke.c
M source/blender/python/manta_pp/plugin/initplugins.cpp
M source/blender/python/manta_pp/pwrapper/pymain.cpp
===================================================================
diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h
index f49c144..a270f75 100644
--- a/intern/smoke/extern/smoke_API.h
+++ b/intern/smoke/extern/smoke_API.h
@@ -120,6 +120,8 @@ void smoke_mantaflow_sim_step(struct Scene *scene, struct
SmokeModifierData *smd
void smoke_mantaflow_stop_sim();
void manta_write_effectors(struct Scene *s, struct SmokeModifierData *smd);
void manta_update_effectors(struct Scene *scene, struct Object *ob,struct
SmokeDomainSettings *sds, float dt);
+void manta_write_emitters(int min_x, int min_y, int min_z, int max_x, int
max_y, int max_z, int d_x, int d_y, int d_z,float *influence, float *vel);
+
#ifdef __cplusplus
}
#endif
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index a7237c9..ab319c0 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -369,7 +369,7 @@ void generate_manta_sim_file(Scene *scene,
SmokeModifierData *smd)
int num_sim_frames = smd->domain->manta_end_frame -
smd->domain->manta_start_frame + 1;
if(num_sim_frames < 1)
return;
-// ofstream manta_setup_file;
+ ofstream manta_setup_file;
// manta_setup_file.open("manta_scene.py", std::fstream::trunc);
stringstream ss; /*setup contents*/
@@ -426,7 +426,7 @@ void generate_manta_sim_file(Scene *scene,
SmokeModifierData *smd)
ss << "xl_source.load('manta_flow.obj')\n";
ss << "transform_back(xl_source, gs)\n";
- /*Obstacle handling*/
+ /*High-res obstacle handling*/
if (file_exists("manta_coll.obj"))
{
ss << "xl_obs = s.create(Mesh)\n";
@@ -548,7 +548,11 @@ void generate_manta_sim_file(Scene *scene,
SmokeModifierData *smd)
}
// manta_setup_file << ss.rdbuf();
// manta_setup_file.close();
- parseFile(smd, scene, smoke_setup);
+ /*constrcting final setup*/
+ string smoke_script = smoke_setup_low +
((wavelets)?smoke_setup_high:"") + smoke_step_low +
((wavelets)?smoke_step_high:"");
+ manta_setup_file << smoke_script ;
+ manta_setup_file.close();
+ parseFile(smd, scene, smoke_script);
vector<string> a;
a.push_back("manta_scene.py");
runMantaScript("",a);
@@ -581,6 +585,30 @@ std::string getRealValue(SmokeModifierData *smd, Scene *s,
const std::string& va
ss << smd->domain->noise_val_scale;
else if (varName == "NOISE_VALOFFSET")
ss << smd->domain->noise_val_offset;
+ else if (varName == "NOISE_TIMEANIM")
+ ss << smd->domain->noise_time_anim;
+ else if (varName == "HRESX")
+ ss << smd->domain->wt->getResBig()[0];
+ else if (varName == "HRESY")
+ ss << smd->domain->wt->getResBig()[1];
+ else if (varName == "HRESZ")
+ ss << smd->domain->wt->getResBig()[2];
+ else if (varName == "XL_TIMESTEP") /*add support*/
+ ss << smd->domain->noise_time_anim *
smd->domain->amplify+1;/*lowres time * upres*/
+ else if (varName == "USE_WAVELETS")
+ ss << (smd->domain->flags & MOD_SMOKE_HIGHRES)?"True":"False";
+ else if (varName == "BUYO_X")
+ ss << 0.;
+ else if (varName == "BUYO_Y")
+ ss << 0.;
+ else if (varName == "BUYO_Z")
+ ss << (-smd->domain->beta);
+ else if (varName == "ADVECT_ORDER")
+ ss << 2;
+ else if (varName == "ABS_FLOW")
+ ss << (smd->flow->flags &
MOD_SMOKE_FLOW_ABSOLUTE)?"True":"False";
+ else
+ cout<< "ERROR: Unknown option:"<< varName <<endl;
return ss.str();
}
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index f087805..715a344 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -14,6 +14,7 @@
#include "../../../source/blender/blenlib/BLI_path_util.h"
void export_force_fields(int size_x, int size_y, int size_z, float *f_x,
float*f_y, float*f_z);/*defined in pymain.cpp*/
+void export_em_fields(int min_x, int min_y, int min_z, int max_x, int max_y,
int max_z, int d_x, int d_y, int d_z, float *inf, float *vel);/*defined in
pymain.cpp*/
extern "C" void manta_write_effectors(struct Scene *s, struct
SmokeModifierData *smd); /*defined in smoke_api.cpp*/
/*for passing to detached thread*/
diff --git a/intern/smoke/intern/scenarios/smoke.h
b/intern/smoke/intern/scenarios/smoke.h
index 5be3b45..d69f8aa 100644
--- a/intern/smoke/intern/scenarios/smoke.h
+++ b/intern/smoke/intern/scenarios/smoke.h
@@ -1,20 +1,148 @@
#include <string>
using namespace std;
-const string smoke_setup = "\n\
-from manta import * \n\
+const string smoke_clean = "";
+
+const string smoke_setup_low ="from manta import * \n\
+import os, shutil, math, sys \n\
+def transform_back(obj, gs):\n\
+ obj.scale(gs/2)\n\
+ obj.offset(gs/2)\n\
+\n\
+uvs = $UVS_CNT$\n\
+solver_dim = $SOLVER_DIM$\n\
+velInflow = vec3(0, 0, 1)\n\
+if $USE_WAVELETS$:\n\
+ upres = $UPRES$\n\
+ wltStrength = $WLT_STR$\n\
+ if $UPRES$ > 0:\n\
+ octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+ else:\n\
+ octaves = 0\n\
+res = $RES$\n\
+gs = vec3($RESX$, $RESY$, $RESZ$) \n\
+s = Solver(name = 'main', gridSize = gs, dim = solver_dim) \n\
+s.timestep = 1 \n\
+noise = s.create(NoiseField, fixedSeed=256, loadFromFile=True) \n\
+noise.posScale = vec3(20) \n\
+noise.clamp = False \n\
+noise.clampNeg = $NOISE_CN$\n\
+noise.clampPos = $NOISE_CP$\n\
+noise.valScale = $NOISE_VALSCALE$\n\
+noise.valOffset = $NOISE_VALOFFSET$\n\
+noise.timeAnim = $NOISE_TIMEANIM$ \n\
+source = s.create(Mesh)\n\
+source.load('manta_flow.obj')\n\
+transform_back(source, gs)\n\
+sourceVel = s.create(Mesh)\n\
+sourceVel.load('manta_flow.obj')\n\
+transform_back(sourceVel, gs)\n\
+flags = s.create(FlagGrid) \n\
+flags.initDomain() \n\
+flags.fillGrid() \n\
+vel = s.create(MACGrid) \n\
+density = s.create(RealGrid) \n\
+pressure = s.create(RealGrid) \n\
+energy = s.create(RealGrid) \n\
+tempFlag = s.create(FlagGrid)\n\
+sdf_flow = s.create(LevelsetGrid)\n\
+forces = s.create(MACGrid)\n\
+source.meshSDF(source, sdf_flow, 1.1)\n\
+source_shape = s.create(Cylinder, center=gs*vec3(0.5,0.1,0.5),
radius=res*0.14, z=gs*vec3(0, 0.02, 0))\n\
+";
+
+const string smoke_setup_high = "xl_gs = vec3($HRESX$, $HRESY$, $HRESZ$) \n\
+xl = Solver(name = 'larger', gridSize = xl_gs, dim = solver_dim) \n\
+if $USE_WAVELETS$ and $UPRES$ > 0:\n\
+ xl.timestep = $XL_TIMESTEP$ \n\
+ xl_vel = xl.create(MACGrid) \n\
+ xl_density = xl.create(RealGrid) \n\
+ xl_flags = xl.create(FlagGrid) \n\
+ xl_flags.initDomain() \n\
+ xl_flags.fillGrid() \n\
+ xl_source = s.create(Mesh)\n\
+ xl_source.load('manta_flow.obj')\n\
+ transform_back(xl_source, gs)\n\
+ xl_noise = xl.create(NoiseField, fixedSeed=256, loadFromFile=True) \n\
+ xl_noise.posScale = vec3(20) \n\
+ xl_noise.clamp = False \n\
+ xl_noise.clampNeg = $NOISE_CN$ \n\
+ xl_noise.clampPos = $NOISE_CP$ \n\
+ xl_noise.valScale = $NOISE_VALSCALE$ \n\
+ xl_noise.valOffset = $NOISE_VALOFFSET$ \n\
+ xl_noise.timeAnim = $NOISE_TIMEANIM$ * $UPRES$ \n\
+ xl_wltnoise = s.create(NoiseField, loadFromFile=True) \n\
+ xl_wltnoise.posScale = vec3( int(1.0*gs.x) ) * 0.5 \n\
+ xl_wltnoise.posScale = xl_wltnoise.posScale * 0.5\n\
+ xl_wltnoise.timeAnim = 0.1 \n\
+";
+
+const string smoke_step_low = "def sim_step(t):\n\
+ forces.load('manta_forces.uni')\n\
+ addForceField(flags=flags, vel=vel,force=forces)\n\
+ addBuoyancy(density=density, vel=vel,
gravity=vec3($BUYO_X$,$BUYO_Y$,$BUYO_Z$), flags=flags) \n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=density, order=$ADVECT_ORDER$)
\n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=$ADVECT_ORDER$) \n\
+ for i in range(uvs): \n\
+ advectSemiLagrange(flags=flags, vel=vel, grid=uv[i], order=$ADVECT_ORDER$)
\n\
+ updateUvWeight( resetTime=16.5 , index=i, numUvs=uvs, uv=uv[i] )\n\
+ applyInflow=False\n\
+ if (t>=0 and t<75):\n\
+ if noise.valScale > 0.:\n\
+ densityInflowMeshNoise( flags=flags, density=density, noise=noise,
mesh=source, scale=3, sigma=0.5 )\n\
+ else:\n\
+ densityInflowMesh(flags=flags, density=density, mesh=source, value=1)\n\
+ applyInflow=True\n\
+ setWallBcs(flags=flags, vel=vel) \n\
+ vorticityConfinement( vel=vel, flags=flags, strength=0.2 ) \n\
+ solvePressure(flags=flags, vel=vel, pressure=pressure, useResNorm=True,
openBound='xXyYzZ', cgMaxIterFac=1, cgAccuracy=0.01) \n\
+ setWallBcs(flags=flags, vel=vel) \n\
+ computeEnergy(flags=flags, vel=vel, energy=energy)\n\
+ tempFlag.copyFrom(flags)\n\
+ extrapolateSimpleFlags( flags=flags, val=tempFlag, distance=2,
flagFrom=FlagObstacle, flagTo=FlagFluid )\n\
+ extrapolateSimpleFlags( flags=tempFlag, val=energy, distance=6,
flagFrom=FlagFluid, flagTo=FlagObstacle )\n\
+ computeWaveletCoeffs(energy)\n\
+ density.save('den%04d_temp.uni' % t) \n\
+ os.rename('den%04d_temp.uni' % t, 'den%04d.uni' % t) \n\
+ s.step()\n";
+
+const string smoke_step_high = " interpolateMACGrid( source=vel,
target=xl_vel ) \n\
+ sStr = 1.0 * wltStrength \n\
+ sPos = 2.0 \n\
+ for o in range(octaves): \n\
+ for i in range(uvs): \n\
+ uvWeight = getUvWeight(uv[i]) \n\
+ applyNoiseVec3( flags=xl_flags, target=xl_vel, noise=xl_wltnoise,
scale=sStr * uvWeight, scaleSpatial=sPos , weight=energy, uv=uv[i] ) \n\
+ sStr *= 0.06 # magic kolmogorov factor \n\
+ sPos *= 2.0 \n\
+ for substep in range(upres): \n\
+ advectSemiLagrange(flags=xl_flags, vel=xl_vel, grid=xl_density,
order=$ADVECT_ORDER$) \n\
+ if (applyInflow): \n\
+ if noise.valScale > 0.:\n\
+ densityInflowMeshNoise( flags=xl_flags, density=xl_density,
noise=xl_wltnoise, mesh=source, scale=3, sigma=0.5 )\n\
+ else:\n\
+ densityInflowMesh(flags=xl_flags, density=xl_density, mesh=source,
value=1)\n\
+ xl_density.save('densityXl_%04d.uni' % t)\n\
+ xl.step()\n";
+
+const string full_smoke_setup = "from manta import * \n\
import os, shutil, math, sys \n\
def transform_back(obj, gs):\n\
obj.scale(gs/2)\n\
obj.offset(gs/2)\n\
\n\
uvs = $UVS_CNT$\n\
+solver_dim = $SOLVER_DIM$\n\
velInflow = vec3(0, 0, 1)\n\
-upres = $UPRES$\n\
-wltStrength = $WLT_STR$\n\
-octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+if $USE_WAVELETS$:\n\
+ upres = $UPRES$\n\
+ wltStrength = $WLT_STR$\n\
+ if $UPRES$ > 0:\n\
+ octaves = int( math.log(upres)/ math.log(2.0) + 0.5 ) \n\
+ else:\n\
+ octaves = 0\n\
res = $RES$\n\
gs = vec3($RESX$, $RESY$, $RESZ$) \n\
-s = Solver(name = 'main', gridSize = gs, dim = $SOLVER_DIM$) \n\
+s = Solver(name = 'main', gridSize =
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs