aboutsummaryrefslogtreecommitdiff
path: root/demo/DemoApp/sceneSimpleSmoke.cpp
diff options
context:
space:
mode:
authorAndrew Reidmeyer <[email protected]>2017-03-15 09:28:59 -0600
committerAndrew Reidmeyer <[email protected]>2017-03-15 09:28:59 -0600
commitf5f6a899903a309f1fc93b31c0297fc7b3b5cf46 (patch)
treeed3dece338b579d5b51af494b2d543fb46c43fa3 /demo/DemoApp/sceneSimpleSmoke.cpp
downloadflow-1.0.0.tar.xz
flow-1.0.0.zip
Initial 1.0.0 binary releasev1.0.0
Diffstat (limited to 'demo/DemoApp/sceneSimpleSmoke.cpp')
-rw-r--r--demo/DemoApp/sceneSimpleSmoke.cpp399
1 files changed, 399 insertions, 0 deletions
diff --git a/demo/DemoApp/sceneSimpleSmoke.cpp b/demo/DemoApp/sceneSimpleSmoke.cpp
new file mode 100644
index 0000000..da5440d
--- /dev/null
+++ b/demo/DemoApp/sceneSimpleSmoke.cpp
@@ -0,0 +1,399 @@
+/*
+* Copyright (c) 2014-2017, NVIDIA CORPORATION. All rights reserved.
+*
+* NVIDIA CORPORATION and its licensors retain all intellectual property
+* and proprietary rights in and to this software, related documentation
+* and any modifications thereto. Any use, reproduction, disclosure or
+* distribution of this software and related documentation without an express
+* license agreement from NVIDIA CORPORATION is strictly prohibited.
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "loader.h"
+#include "imgui.h"
+#include "imguiser.h"
+
+namespace PresetSmoke
+{
+#include "presetSmoke.h"
+}
+namespace PresetFireBall
+{
+#include "PresetFireBall.h"
+}
+
+#include "scene.h"
+
+#include <SDL.h>
+
+void SceneSimpleSmoke::initParams()
+{
+ m_flowGridActor.initParams(AppGraphCtxDedicatedVideoMemory(m_appctx));
+
+ // set emitter defaults
+ NvFlowGridEmitParamsDefaults(&m_emitParams);
+
+ m_emitParams.bounds.x.x = 0.25f;
+ m_emitParams.bounds.y.y = 0.25f;
+ m_emitParams.bounds.z.z = 0.25f;
+ m_emitParams.velocityLinear.y = 8.f;
+ m_emitParams.fuel = 1.9f;
+ m_emitParams.smoke = 0.5f;
+
+ m_emitParams.allocationPredict = 0.3f;
+
+ // grid actor overrides
+ m_flowGridActor.m_renderParams.renderMode = eNvFlowVolumeRenderMode_colormap;
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 1.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 0.f;
+ m_flowGridActor.m_gridParams.gravity = NvFlowFloat3{ 0.f, -1.f, 0.f };
+
+ m_flowGridActor.m_enableVolumeShadow = true;
+
+ m_shouldLoadPreset = true;
+}
+
+void SceneSimpleSmoke::init(AppGraphCtx* appctx, int winw, int winh)
+{
+ m_appctx = appctx;
+
+ if (!m_shouldReset || m_isFirstRun)
+ {
+ initParams();
+ m_isFirstRun = false;
+ }
+
+ if (m_flowGridActor.m_enableVolumeShadow)
+ {
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 1.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 0.f;
+ }
+ else
+ {
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 0.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 1.f;
+ }
+
+ m_flowContext.init(appctx);
+
+ m_flowGridActor.init(&m_flowContext, appctx);
+
+ // create default color map
+ {
+ const int numPoints = 5;
+ const CurvePoint pts[numPoints] = {
+ { 0.f, 0.f,0.f,0.f,0.f },
+ { 0.05f, 0.f,0.f,0.f,0.5f },
+ { 0.6f, 213.f / 255.f,100.f / 255.f,30.f / 255.f,0.8f },
+ { 0.85f, 255.f / 255.f,240.f / 255.f,0.f,0.8f },
+ { 1.f, 1.f,1.f,1.f,0.7f }
+ };
+
+ auto& colorMap = m_flowGridActor.m_colorMap;
+ colorMap.initColorMap(m_flowContext.m_renderContext, pts, numPoints, (colorMap.m_curvePointsDefault.size() == 0));
+ }
+
+ m_projectile.init(m_appctx, m_flowContext.m_gridContext);
+
+ resize(winw, winh);
+}
+
+NvFlowFloat3 SceneSimpleSmoke::positionFunc(float theta)
+{
+ return NvFlowFloat3{
+ 3.f * cosf(theta),
+ 0.f,
+ 3.f * sinf(theta)
+ };
+}
+
+NvFlowFloat3 SceneSimpleSmoke::velocityFunc(float theta, float rate)
+{
+ return NvFlowFloat3{
+ -3.f * rate * sinf(theta),
+ 0.f,
+ +3.f * rate * cosf(theta)
+ };
+}
+
+void SceneSimpleSmoke::doUpdate(float dt)
+{
+ bool shouldUpdate = m_flowContext.updateBegin();
+ if (shouldUpdate)
+ {
+ AppGraphCtxProfileBegin(m_appctx, "Simulate");
+
+ m_flowGridActor.updatePreEmit(&m_flowContext, dt);
+
+ NvFlowShapeDesc shapeDesc;
+ shapeDesc.sphere.radius = 0.8f;
+
+ if (m_animate)
+ {
+ const float pi2 = 2.f * 3.14159265f;
+ const float emitterScale = 1.f;
+
+ theta += pi2 * rate * dt;
+
+ if (theta > pi2) theta -= pi2;
+
+ // get position and velocity
+ NvFlowFloat3 position = positionFunc(theta);
+ NvFlowFloat3 velocity = velocityFunc(theta, pi2 * rate);
+
+ // update emitter bounds
+ m_emitParams.bounds.x.x = 0.25f * emitterScale;
+ m_emitParams.bounds.y.y = 0.25f * emitterScale;
+ m_emitParams.bounds.z.z = 0.25f * emitterScale;
+
+ // modulate couple rate as a function of velocity and emitter width
+ const float defaultCoupleRate = 0.5f;
+
+ float emitWidth = m_emitParams.bounds.x.x;
+
+ float velMagn = sqrtf(velocity.x*velocity.x + velocity.y*velocity.y + velocity.z*velocity.z);
+ float coupleRate = fmaxf(coupleRateScale * fabsf(velMagn) / emitWidth, defaultCoupleRate);
+
+ m_emitParams.smokeCoupleRate = coupleRate;
+ m_emitParams.temperatureCoupleRate = coupleRate;
+ m_emitParams.fuelCoupleRate = coupleRate;
+ m_emitParams.velocityCoupleRate = { coupleRate, coupleRate, coupleRate };
+
+ m_emitParams.bounds.w.x = position.x;
+ m_emitParams.bounds.w.y = position.y;
+ m_emitParams.bounds.w.z = position.z;
+ m_emitParams.velocityLinear.x = velocity.x;
+ //m_emitParams.velocityLinear.y = velocity.y;
+ m_emitParams.velocityLinear.z = velocity.z;
+
+ m_emitParams.predictVelocityWeight = 1.f;
+ m_emitParams.predictVelocity.x = velocity.x;
+ //m_emitParams.predictVelocity.y = velocity.y;
+ m_emitParams.predictVelocity.z = velocity.z;
+ }
+ else if (m_animate != m_animateOld)
+ {
+ float coupleRate = 0.5f;
+
+ m_emitParams.smokeCoupleRate = coupleRate;
+ m_emitParams.temperatureCoupleRate = coupleRate;
+ m_emitParams.fuelCoupleRate = coupleRate;
+ m_emitParams.velocityCoupleRate = { coupleRate, coupleRate, coupleRate };
+
+ m_emitParams.bounds.w.x = 0.f;
+ m_emitParams.velocityLinear.x = 0.f;
+
+ m_emitParams.predictVelocityWeight = 0.f;
+ m_emitParams.predictVelocity.x = 0.f;
+ m_emitParams.predictVelocity.y = 0.f;
+ m_emitParams.predictVelocity.z = 0.f;
+ }
+ m_animateOld = m_animate;
+
+ m_emitParams.localToWorld = m_emitParams.bounds;
+ m_emitParams.shapeType = eNvFlowShapeTypeSphere;
+ m_emitParams.deltaTime = dt;
+
+ NvFlowGridEmit(m_flowGridActor.m_grid, &shapeDesc, 1u, &m_emitParams, 1u);
+
+ m_projectile.update(m_flowContext.m_gridContext, m_flowGridActor.m_grid, dt);
+
+ m_flowGridActor.updatePostEmit(&m_flowContext, dt, shouldUpdate, m_shouldGridReset);
+
+ m_shouldGridReset = false;
+
+ AppGraphCtxProfileEnd(m_appctx, "Simulate");
+ }
+ m_flowContext.updateEnd();
+}
+
+void SceneSimpleSmoke::preDraw()
+{
+ m_flowContext.preDrawBegin();
+
+ m_flowGridActor.preDraw(&m_flowContext);
+
+ m_flowContext.preDrawEnd();
+}
+
+void SceneSimpleSmoke::imguiFluidEmitterExtra()
+{
+ if (imguiserCheck("Animate", m_animate, true))
+ {
+ m_animate = !m_animate;
+ }
+}
+
+void SceneSimpleSmoke::imguiFluidRenderExtra()
+{
+}
+
+void SceneSimpleSmoke::draw(DirectX::CXMMATRIX projection, DirectX::CXMMATRIX view)
+{
+ m_projectile.draw(projection, view);
+
+ m_flowContext.drawBegin();
+
+ m_flowGridActor.draw(&m_flowContext, projection, view);
+
+ m_flowContext.drawEnd();
+}
+
+void SceneSimpleSmoke::release()
+{
+ m_projectile.release();
+
+ m_flowGridActor.release();
+
+ m_flowContext.release();
+}
+
+void SceneSimpleSmoke::imgui(int xIn, int yIn, int wIn, int hIn)
+{
+ SceneFluid::imgui(xIn, yIn, wIn, hIn);
+
+ if (m_shouldLoadPreset)
+ {
+ imguiserLoadC(PresetSmoke::g_root, sizeof(PresetSmoke::g_root));
+ m_shouldLoadPreset = false;
+ }
+}
+
+// ******************************* SceneSimpleFlameBall *************************
+
+void SceneSimpleFlameBall::initParams()
+{
+ SceneSimpleFlame::initParams();
+
+ m_flowGridActor.m_gridDesc.lowLatencyMapping = true;
+ m_flowGridActor.m_memoryLimit = 4.f;
+
+ m_flowGridActor.m_materialParams.smoke.allocWeight = 1.f;
+ m_flowGridActor.m_materialParams.smoke.allocThreshold = 0.02f;
+
+ m_flowGridActor.m_gridParams.gravity = { 0.f, -0.5f, 0.f };
+
+ m_flowGridActor.m_gridParams.bigEffectMode = true;
+
+ m_flowGridActor.m_materialParams.smoke.damping = 0.3f;
+ m_flowGridActor.m_materialParams.smoke.fade = 0.65f;
+ m_flowGridActor.m_materialParams.vorticityStrength = 20.f;
+
+ m_emitParams.fuel = 2.0f;
+ m_emitParams.temperature = 3.f;
+ m_emitParams.smoke = 0.5f;
+
+ m_emitParams.bounds.x.x = m_radius;
+ m_emitParams.bounds.y.y = m_radius;
+ m_emitParams.bounds.z.z = m_radius;
+
+ m_emitParams.bounds.w.y = -2.f;
+
+ m_emitParams.allocationScale = { 1.f, 1.f, 1.f };
+ m_emitParams.allocationPredict = 0.05f;
+
+ // grid actor overrides
+ m_flowGridActor.m_renderParams.renderMode = eNvFlowVolumeRenderMode_colormap;
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 1.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 0.f;
+
+ m_flowGridActor.m_shadowBlendCompMask = { -2.f, 0.f, 0.f, 0.f };
+ m_flowGridActor.m_shadowBlendBias = 1.f;
+
+ m_flowGridActor.m_enableVolumeShadow = true;
+
+ m_shouldLoadPreset = true;
+}
+
+void SceneSimpleFlameBall::init(AppGraphCtx* context, int winw, int winh)
+{
+ SceneSimpleFlame::init(context, winw, winh);
+
+ if (m_flowGridActor.m_enableVolumeShadow)
+ {
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 1.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 0.f;
+ }
+ else
+ {
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityCompMask = { 0.f, 0.f, 0.f, 0.f };
+ m_flowGridActor.m_renderMaterialDefaultParams.intensityBias = 1.f;
+ }
+}
+
+void SceneSimpleFlameBall::doUpdate(float dt)
+{
+ time += dt;
+
+ m_emitParams.bounds.x.x = m_radius;
+ m_emitParams.bounds.y.y = m_radius;
+ m_emitParams.bounds.z.z = m_radius;
+
+ if (time < 0.25f)
+ {
+ m_emitParams.fuelCoupleRate = 0.f;
+ m_emitParams.velocityCoupleRate = { 0.f, 0.f, 0.f };
+ m_emitParams.smokeCoupleRate = 0.f;
+ m_emitParams.temperatureCoupleRate = 0.f;
+ //m_emitParams.allocationScale = { 1.f, 1.f, 1.f };
+ }
+ else if (time < 0.75f)
+ {
+ const float coupleRate = 5.f;
+ m_emitParams.fuelCoupleRate = coupleRate;
+ m_emitParams.velocityCoupleRate = { coupleRate, coupleRate, coupleRate };
+ m_emitParams.smokeCoupleRate = coupleRate;
+ m_emitParams.temperatureCoupleRate = coupleRate;
+ //m_emitParams.allocationScale = { 1.f, 1.f, 1.f };
+ }
+ else if (time < 4.f)
+ {
+ m_emitParams.fuelCoupleRate = 0.f;
+ m_emitParams.velocityCoupleRate = { 0.f, 0.f, 0.f };
+ m_emitParams.smokeCoupleRate = 0.f;
+ m_emitParams.temperatureCoupleRate = 0.f;
+ //m_emitParams.allocationScale = { 0.f, 0.f, 0.f };
+ }
+ else
+ {
+ time = 0.f;
+ }
+
+ SceneSimpleFlame::doUpdate(dt);
+}
+
+void SceneSimpleFlameBall::draw(DirectX::CXMMATRIX projection, DirectX::CXMMATRIX view)
+{
+ SceneSimpleFlame::draw(projection, view);
+}
+
+void SceneSimpleFlameBall::release()
+{
+ SceneSimpleFlame::release();
+}
+
+void SceneSimpleFlameBall::imguiFluidEmitterExtra()
+{
+ imguiserSlider("Radius", &m_radius, 0.1f, 2.f, 0.05f, true);
+}
+
+void SceneSimpleFlameBall::imguiFluidRenderExtra()
+{
+}
+
+void SceneSimpleFlameBall::imguiFluidSimExtra()
+{
+}
+
+void SceneSimpleFlameBall::imgui(int xIn, int yIn, int wIn, int hIn)
+{
+ SceneFluid::imgui(xIn, yIn, wIn, hIn);
+
+ if (m_shouldLoadPreset)
+ {
+ imguiserLoadC(PresetFireBall::g_root, sizeof(PresetFireBall::g_root));
+ m_shouldLoadPreset = false;
+ }
+} \ No newline at end of file