diff --git a/Documentation/ScriptingAPI-Documentation.md b/Documentation/ScriptingAPI-Documentation.md
index 7a3c6d00d..48e975409 100644
--- a/Documentation/ScriptingAPI-Documentation.md
+++ b/Documentation/ScriptingAPI-Documentation.md
@@ -123,6 +123,8 @@ You can use the Renderer with the following functions, all of which are in the g
- SetShadowPropsCube(int resolution, int count)
- SetDebugPartitionTreeEnabled(bool enabled)
- SetDebugBonesEnabled(bool enabled)
+- SetDebugEittersEnabled(bool enabled)
+- SetDebugForceFieldsEnabled(bool enabled)
- SetVSyncEnabled(opt bool enabled)
- SetOcclusionCullingEnabled(bool enabled)
- SetPhysicsParams(opt bool rigidBodyPhysicsEnabled, opt bool softBodyPhysicsEnabled, opt int softBodyIterationCount)
diff --git a/Editor/RendererWindow.cpp b/Editor/RendererWindow.cpp
index 9d839d2ea..e47666dae 100644
--- a/Editor/RendererWindow.cpp
+++ b/Editor/RendererWindow.cpp
@@ -14,11 +14,11 @@ RendererWindow::RendererWindow(wiGUI* gui, Renderable3DComponent* component) : G
wiRenderer::SetToDrawGridHelper(true);
rendererWindow = new wiWindow(GUI, "Renderer Window");
- rendererWindow->SetSize(XMFLOAT2(400, 1000));
+ rendererWindow->SetSize(XMFLOAT2(640, 860));
rendererWindow->SetEnabled(true);
GUI->AddWidget(rendererWindow);
- float x = 250, y = 20, step = 30;
+ float x = 260, y = 20, step = 30;
vsyncCheckBox = new wiCheckBox("VSync: ");
vsyncCheckBox->SetTooltip("Toggle vertical sync");
@@ -127,36 +127,6 @@ RendererWindow::RendererWindow(wiGUI* gui, Renderable3DComponent* component) : G
});
rendererWindow->AddWidget(specularAASlider);
- partitionBoxesCheckBox = new wiCheckBox("SPTree visualizer: ");
- partitionBoxesCheckBox->SetTooltip("Visualize the world space partitioning tree as boxes");
- partitionBoxesCheckBox->SetScriptTip("SetDebugPartitionTreeEnabled(bool enabled)");
- partitionBoxesCheckBox->SetPos(XMFLOAT2(x, y += step));
- partitionBoxesCheckBox->OnClick([](wiEventArgs args) {
- wiRenderer::SetToDrawDebugPartitionTree(args.bValue);
- });
- partitionBoxesCheckBox->SetCheck(wiRenderer::GetToDrawDebugPartitionTree());
- rendererWindow->AddWidget(partitionBoxesCheckBox);
-
- boneLinesCheckBox = new wiCheckBox("Bone line visualizer: ");
- boneLinesCheckBox->SetTooltip("Visualize bones of armatures");
- boneLinesCheckBox->SetScriptTip("SetDebugBonesEnabled(bool enabled)");
- boneLinesCheckBox->SetPos(XMFLOAT2(x, y += step));
- boneLinesCheckBox->OnClick([](wiEventArgs args) {
- wiRenderer::SetToDrawDebugBoneLines(args.bValue);
- });
- boneLinesCheckBox->SetCheck(wiRenderer::GetToDrawDebugBoneLines());
- rendererWindow->AddWidget(boneLinesCheckBox);
-
- debugEmittersCheckBox = new wiCheckBox("Emitter visualizer: ");
- debugEmittersCheckBox->SetTooltip("Visualize emitters");
- debugEmittersCheckBox->SetScriptTip("SetDebugEmitters(bool enabled)");
- debugEmittersCheckBox->SetPos(XMFLOAT2(x, y += step));
- debugEmittersCheckBox->OnClick([](wiEventArgs args) {
- wiRenderer::SetToDrawDebugEmitters(args.bValue);
- });
- debugEmittersCheckBox->SetCheck(wiRenderer::GetToDrawDebugEmitters());
- rendererWindow->AddWidget(debugEmittersCheckBox);
-
wireFrameCheckBox = new wiCheckBox("Render Wireframe: ");
wireFrameCheckBox->SetTooltip("Visualize the scene as a wireframe");
wireFrameCheckBox->SetPos(XMFLOAT2(x, y += step));
@@ -204,24 +174,6 @@ RendererWindow::RendererWindow(wiGUI* gui, Renderable3DComponent* component) : G
rendererWindow->AddWidget(advancedRefractionsCheckBox);
advancedRefractionsCheckBox->SetEnabled(wiRenderer::GetDevice()->CheckCapability(wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_UNORDEREDACCESSTEXTURE_LOAD_FORMAT_EXT));
- envProbesCheckBox = new wiCheckBox("Env probe visualizer: ");
- envProbesCheckBox->SetTooltip("Toggle visualization of environment probes as reflective spheres");
- envProbesCheckBox->SetPos(XMFLOAT2(x, y += step));
- envProbesCheckBox->OnClick([](wiEventArgs args) {
- wiRenderer::SetToDrawDebugEnvProbes(args.bValue);
- });
- envProbesCheckBox->SetCheck(wiRenderer::GetToDrawDebugEnvProbes());
- rendererWindow->AddWidget(envProbesCheckBox);
-
- gridHelperCheckBox = new wiCheckBox("Grid helper: ");
- gridHelperCheckBox->SetTooltip("Toggle showing of unit visualizer grid in the world origin");
- gridHelperCheckBox->SetPos(XMFLOAT2(x, y += step));
- gridHelperCheckBox->OnClick([](wiEventArgs args) {
- wiRenderer::SetToDrawGridHelper(args.bValue);
- });
- gridHelperCheckBox->SetCheck(wiRenderer::GetToDrawGridHelper());
- rendererWindow->AddWidget(gridHelperCheckBox);
-
pickTypeObjectCheckBox = new wiCheckBox("Pick Objects: ");
pickTypeObjectCheckBox->SetTooltip("Enable if you want to pick objects with the pointer");
@@ -455,6 +407,69 @@ RendererWindow::RendererWindow(wiGUI* gui, Renderable3DComponent* component) : G
+ // Visualizer toggles:
+ x = 600, y = 20;
+
+ partitionBoxesCheckBox = new wiCheckBox("SPTree visualizer: ");
+ partitionBoxesCheckBox->SetTooltip("Visualize the world space partitioning tree as boxes");
+ partitionBoxesCheckBox->SetScriptTip("SetDebugPartitionTreeEnabled(bool enabled)");
+ partitionBoxesCheckBox->SetPos(XMFLOAT2(x, y += step));
+ partitionBoxesCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawDebugPartitionTree(args.bValue);
+ });
+ partitionBoxesCheckBox->SetCheck(wiRenderer::GetToDrawDebugPartitionTree());
+ rendererWindow->AddWidget(partitionBoxesCheckBox);
+
+ boneLinesCheckBox = new wiCheckBox("Bone line visualizer: ");
+ boneLinesCheckBox->SetTooltip("Visualize bones of armatures");
+ boneLinesCheckBox->SetScriptTip("SetDebugBonesEnabled(bool enabled)");
+ boneLinesCheckBox->SetPos(XMFLOAT2(x, y += step));
+ boneLinesCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawDebugBoneLines(args.bValue);
+ });
+ boneLinesCheckBox->SetCheck(wiRenderer::GetToDrawDebugBoneLines());
+ rendererWindow->AddWidget(boneLinesCheckBox);
+
+ debugEmittersCheckBox = new wiCheckBox("Emitter visualizer: ");
+ debugEmittersCheckBox->SetTooltip("Visualize emitters");
+ debugEmittersCheckBox->SetScriptTip("SetDebugEmittersEnabled(bool enabled)");
+ debugEmittersCheckBox->SetPos(XMFLOAT2(x, y += step));
+ debugEmittersCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawDebugEmitters(args.bValue);
+ });
+ debugEmittersCheckBox->SetCheck(wiRenderer::GetToDrawDebugEmitters());
+ rendererWindow->AddWidget(debugEmittersCheckBox);
+
+ debugForceFieldsCheckBox = new wiCheckBox("Force Field visualizer: ");
+ debugForceFieldsCheckBox->SetTooltip("Visualize force fields");
+ debugForceFieldsCheckBox->SetScriptTip("SetDebugForceFieldsEnabled(bool enabled)");
+ debugForceFieldsCheckBox->SetPos(XMFLOAT2(x, y += step));
+ debugForceFieldsCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawDebugForceFields(args.bValue);
+ });
+ debugForceFieldsCheckBox->SetCheck(wiRenderer::GetToDrawDebugForceFields());
+ rendererWindow->AddWidget(debugForceFieldsCheckBox);
+
+ envProbesCheckBox = new wiCheckBox("Env probe visualizer: ");
+ envProbesCheckBox->SetTooltip("Toggle visualization of environment probes as reflective spheres");
+ envProbesCheckBox->SetPos(XMFLOAT2(x, y += step));
+ envProbesCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawDebugEnvProbes(args.bValue);
+ });
+ envProbesCheckBox->SetCheck(wiRenderer::GetToDrawDebugEnvProbes());
+ rendererWindow->AddWidget(envProbesCheckBox);
+
+ gridHelperCheckBox = new wiCheckBox("Grid helper: ");
+ gridHelperCheckBox->SetTooltip("Toggle showing of unit visualizer grid in the world origin");
+ gridHelperCheckBox->SetPos(XMFLOAT2(x, y += step));
+ gridHelperCheckBox->OnClick([](wiEventArgs args) {
+ wiRenderer::SetToDrawGridHelper(args.bValue);
+ });
+ gridHelperCheckBox->SetCheck(wiRenderer::GetToDrawGridHelper());
+ rendererWindow->AddWidget(gridHelperCheckBox);
+
+
+
rendererWindow->Translate(XMFLOAT3(130, 20, 0));
rendererWindow->SetVisible(false);
}
diff --git a/Editor/RendererWindow.h b/Editor/RendererWindow.h
index c85af2f9e..be8123b48 100644
--- a/Editor/RendererWindow.h
+++ b/Editor/RendererWindow.h
@@ -31,6 +31,7 @@ public:
wiCheckBox* partitionBoxesCheckBox;
wiCheckBox* boneLinesCheckBox;
wiCheckBox* debugEmittersCheckBox;
+ wiCheckBox* debugForceFieldsCheckBox;
wiCheckBox* wireFrameCheckBox;
wiCheckBox* advancedLightCullingCheckBox;
wiCheckBox* debugLightCullingCheckBox;
diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp
index 7744981d8..926d93b97 100644
--- a/WickedEngine/Renderable3DComponent.cpp
+++ b/WickedEngine/Renderable3DComponent.cpp
@@ -435,6 +435,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende
wiRenderer::DrawDebugBoneLines(wiRenderer::getCamera(), threadID);
wiRenderer::DrawDebugLines(wiRenderer::getCamera(), threadID);
wiRenderer::DrawDebugBoxes(wiRenderer::getCamera(), threadID);
+ wiRenderer::DrawDebugForceFields(wiRenderer::getCamera(), threadID);
wiRenderer::DrawDebugEmitters(wiRenderer::getCamera(), threadID);
wiRenderer::DrawTranslators(wiRenderer::getCamera(), threadID);
wiRenderer::GetDevice()->EventEnd(threadID);
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj
index 2f56d485a..dd5964b7f 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj
@@ -176,6 +176,15 @@
Vertex
+
+ Pixel
+
+
+ Vertex
+
+
+ Vertex
+
Pixel
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
index b9ccb8698..793f09cb1 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
@@ -630,6 +630,15 @@
CS
+
+ VS
+
+
+ VS
+
+
+ PS
+
diff --git a/WickedEngine/forceFieldPlaneVisualizerVS.hlsl b/WickedEngine/forceFieldPlaneVisualizerVS.hlsl
new file mode 100644
index 000000000..57ecb860f
--- /dev/null
+++ b/WickedEngine/forceFieldPlaneVisualizerVS.hlsl
@@ -0,0 +1,28 @@
+#include "globals.hlsli"
+
+struct PSIn
+{
+ float4 pos : SV_POSITION;
+ float4 pos3D : TEXCOORD0;
+ float4 pos2D : TEXCOORD1;
+};
+
+PSIn main(uint vID : SV_VERTEXID)
+{
+ PSIn Out;
+
+ Out.pos = float4(CreateCube(vID) * 2 - 1, 1);
+
+ uint forceFieldID = g_xFrame_ForceFieldOffset + (uint)g_xColor.w;
+ ShaderEntityType forceField = EntityArray[forceFieldID];
+
+ Out.pos.xyz *= forceField.coneAngleCos; // range...
+ Out.pos.xyz += forceField.positionWS;
+
+ Out.pos3D = Out.pos;
+
+ Out.pos = mul(Out.pos, g_xTransform);
+ Out.pos2D = Out.pos;
+
+ return Out;
+}
\ No newline at end of file
diff --git a/WickedEngine/forceFieldPointVisualizerVS.hlsl b/WickedEngine/forceFieldPointVisualizerVS.hlsl
new file mode 100644
index 000000000..16465a0ca
--- /dev/null
+++ b/WickedEngine/forceFieldPointVisualizerVS.hlsl
@@ -0,0 +1,30 @@
+#include "globals.hlsli"
+#include "uvsphere.hlsli"
+
+struct PSIn
+{
+ float4 pos : SV_POSITION;
+ float4 pos3D : TEXCOORD0;
+ float4 pos2D : TEXCOORD1;
+};
+
+PSIn main(uint vID : SV_VERTEXID)
+{
+ PSIn Out;
+
+ Out.pos = UVSPHERE[vID];
+
+
+ uint forceFieldID = g_xFrame_ForceFieldOffset + (uint)g_xColor.w;
+ ShaderEntityType forceField = EntityArray[forceFieldID];
+
+ Out.pos.xyz *= forceField.coneAngleCos; // range...
+ Out.pos.xyz += forceField.positionWS;
+
+ Out.pos3D = Out.pos;
+
+ Out.pos = mul(Out.pos, g_xTransform);
+ Out.pos2D = Out.pos;
+
+ return Out;
+}
\ No newline at end of file
diff --git a/WickedEngine/forceFieldVisualizerPS.hlsl b/WickedEngine/forceFieldVisualizerPS.hlsl
new file mode 100644
index 000000000..8855a335c
--- /dev/null
+++ b/WickedEngine/forceFieldVisualizerPS.hlsl
@@ -0,0 +1,41 @@
+#include "globals.hlsli"
+
+struct PSIn
+{
+ float4 pos : SV_POSITION;
+ float4 pos3D : TEXCOORD0;
+ float4 pos2D : TEXCOORD1;
+};
+
+float4 main(PSIn input) : SV_TARGET
+{
+ uint forceFieldID = g_xFrame_ForceFieldOffset + (uint)g_xColor.w;
+ ShaderEntityType forceField = EntityArray[forceFieldID];
+
+ float4 color = forceField.energy < 0 ? float4(0, 0, 1, 1) : float4(1, 0, 0, 1);
+
+ if (forceField.type == ENTITY_TYPE_FORCEFIELD_POINT)
+ {
+ // point-like forcefield:
+ float3 centerToPos = normalize(input.pos3D.xyz - forceField.positionWS.xyz);
+ float3 eyeToCenter = normalize(forceField.positionWS.xyz - g_xColor.xyz);
+ color.a *= pow(saturate(dot(centerToPos, eyeToCenter)), 1.0f / max(0.0001f, abs(forceField.energy)));
+ }
+ else
+ {
+ // planar forcefield:
+ float3 dir = forceField.positionWS - input.pos3D.xyz;
+ float dist = dot(forceField.directionWS, dir);
+ color.a *= pow(1 - saturate(dist * forceField.range), 1.0f / max(0.0001f, abs(forceField.energy)));
+ }
+
+ float2 pTex = input.pos2D.xy / input.pos2D.w * float2(0.5f, -0.5f) + 0.5f;
+ float4 depthScene = (texture_lineardepth.GatherRed(sampler_linear_clamp, pTex));
+ float depthFragment = input.pos2D.w;
+ float fade = saturate(1.0 / forceField.coneAngleCos * abs(forceField.energy) * (max(max(depthScene.x, depthScene.y), max(depthScene.z, depthScene.w)) - depthFragment));
+ color.a *= fade;
+
+ color.a = saturate(color.a * 0.78f);
+
+ return color;
+}
\ No newline at end of file
diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h
index ea3db0666..795d797b0 100644
--- a/WickedEngine/wiEnums.h
+++ b/WickedEngine/wiEnums.h
@@ -134,6 +134,8 @@ enum VSTYPES
VSTYPE_CUBE,
VSTYPE_VOXELIZER,
VSTYPE_VOXEL,
+ VSTYPE_FORCEFIELDVISUALIZER_POINT,
+ VSTYPE_FORCEFIELDVISUALIZER_PLANE,
VSTYPE_LAST
};
// pixel shaders
@@ -203,6 +205,7 @@ enum PSTYPES
PSTYPE_CAPTUREIMPOSTOR,
PSTYPE_VOXELIZER,
PSTYPE_VOXEL,
+ PSTYPE_FORCEFIELDVISUALIZER,
PSTYPE_LAST
};
// geometry shaders
diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp
index 5db040076..4952ec329 100644
--- a/WickedEngine/wiRenderer.cpp
+++ b/WickedEngine/wiRenderer.cpp
@@ -56,7 +56,7 @@ float wiRenderer::GAMMA = 2.2f;
int wiRenderer::SHADOWRES_2D = 1024, wiRenderer::SHADOWRES_CUBE = 256, wiRenderer::SHADOWCOUNT_2D = 5 + 3 + 3, wiRenderer::SHADOWCOUNT_CUBE = 5, wiRenderer::SOFTSHADOWQUALITY_2D = 2;
bool wiRenderer::HAIRPARTICLEENABLED=true,wiRenderer::EMITTERSENABLED=true;
bool wiRenderer::wireRender = false, wiRenderer::debugSpheres = false, wiRenderer::debugBoneLines = false, wiRenderer::debugPartitionTree = false, wiRenderer::debugEmitters = false
-, wiRenderer::debugEnvProbes = false, wiRenderer::gridHelper = false, wiRenderer::voxelHelper = false, wiRenderer::requestReflectionRendering = false, wiRenderer::advancedLightCulling = true
+, wiRenderer::debugEnvProbes = false, wiRenderer::debugForceFields = false, wiRenderer::gridHelper = false, wiRenderer::voxelHelper = false, wiRenderer::requestReflectionRendering = false, wiRenderer::advancedLightCulling = true
, wiRenderer::advancedRefractions = false;
float wiRenderer::SPECULARAA = 0.0f;
float wiRenderer::renderTime = 0, wiRenderer::renderTime_Prev = 0, wiRenderer::deltaTime = 0;
@@ -809,6 +809,8 @@ void wiRenderer::LoadShaders()
vertexShaders[VSTYPE_WATER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
+ vertexShaders[VSTYPE_FORCEFIELDVISUALIZER_POINT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "forceFieldPointVisualizerVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
+ vertexShaders[VSTYPE_FORCEFIELDVISUALIZER_PLANE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "forceFieldPlaneVisualizerVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
pixelShaders[PSTYPE_OBJECT_DEFERRED] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_deferred.cso", wiResourceManager::PIXELSHADER));
@@ -873,6 +875,7 @@ void wiRenderer::LoadShaders()
pixelShaders[PSTYPE_TRAIL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailPS.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_voxelizer.cso", wiResourceManager::PIXELSHADER));
pixelShaders[PSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelPS.cso", wiResourceManager::PIXELSHADER));
+ pixelShaders[PSTYPE_FORCEFIELDVISUALIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "forceFieldVisualizerPS.cso", wiResourceManager::PIXELSHADER));
geometryShaders[GSTYPE_ENVMAP] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "envMapGS.cso", wiResourceManager::GEOMETRYSHADER));
@@ -1997,6 +2000,7 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID)
entityArray[entityCounter].positionWS = force->translation;
entityArray[entityCounter].energy = force->gravity;
entityArray[entityCounter].range = 1.0f / max(0.0001f, force->range); // avoid division in shader
+ entityArray[entityCounter].coneAngleCos = force->range; // this will be the real range in the less common shaders...
// The default planar force field is facing upwards, and thus the pull direction is downwards:
XMStoreFloat3(&entityArray[entityCounter].directionWS, XMVector3Normalize(XMVector3TransformNormal(XMVectorSet(0, -1, 0, 0), XMLoadFloat4x4(&force->world))));
@@ -2012,6 +2016,7 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID)
resourceBuffers[RBTYPE_ENTITYARRAY],
resourceBuffers[RBTYPE_MATRIXARRAY],
};
+ GetDevice()->BindResourcesVS(resources, SBSLOT_ENTITYARRAY, ARRAYSIZE(resources), threadID);
GetDevice()->BindResourcesPS(resources, SBSLOT_ENTITYARRAY, ARRAYSIZE(resources), threadID);
GetDevice()->BindResourcesCS(resources, SBSLOT_ENTITYARRAY, ARRAYSIZE(resources), threadID);
}
@@ -2794,6 +2799,52 @@ void wiRenderer::DrawDebugEmitters(Camera* camera, GRAPHICSTHREAD threadID)
GetDevice()->EventEnd(threadID);
}
}
+void wiRenderer::DrawDebugForceFields(Camera* camera, GRAPHICSTHREAD threadID)
+{
+ if (debugForceFields) {
+ GetDevice()->EventBegin("DebugForceFields", threadID);
+
+ GetDevice()->BindVertexLayout(nullptr, threadID);
+
+ GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_XRAY], STENCILREF_EMPTY, threadID);
+ GetDevice()->BindBlendState(blendStates[BSTYPE_TRANSPARENT], threadID);
+
+
+ GetDevice()->BindPS(pixelShaders[PSTYPE_FORCEFIELDVISUALIZER], threadID);
+
+ MiscCB sb;
+ uint32_t i = 0;
+ for (auto& model : GetScene().models)
+ {
+ for (ForceField* force : model->forces)
+ {
+ sb.mTransform = XMMatrixTranspose(camera->GetViewProjection());
+ sb.mColor = XMFLOAT4(camera->translation.x, camera->translation.y, camera->translation.z, (float)i);
+ GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
+
+ switch (force->type)
+ {
+ case ENTITY_TYPE_FORCEFIELD_POINT:
+ GetDevice()->BindRasterizerState(rasterizers[RSTYPE_BACK], threadID);
+ GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID);
+ GetDevice()->BindVS(vertexShaders[VSTYPE_FORCEFIELDVISUALIZER_POINT], threadID);
+ GetDevice()->Draw(2880, 0, threadID); // uv-sphere
+ break;
+ case ENTITY_TYPE_FORCEFIELD_PLANE:
+ GetDevice()->BindRasterizerState(rasterizers[RSTYPE_FRONT], threadID);
+ GetDevice()->BindPrimitiveTopology(TRIANGLESTRIP, threadID);
+ GetDevice()->BindVS(vertexShaders[VSTYPE_FORCEFIELDVISUALIZER_PLANE], threadID);
+ GetDevice()->Draw(14, 0, threadID); // box
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ GetDevice()->EventEnd(threadID);
+ }
+}
void wiRenderer::DrawSoftParticles(Camera* camera, GRAPHICSTHREAD threadID)
{
diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h
index ce4b4b390..973508490 100644
--- a/WickedEngine/wiRenderer.h
+++ b/WickedEngine/wiRenderer.h
@@ -206,7 +206,7 @@ protected:
- static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, debugEmitters, gridHelper, voxelHelper, advancedLightCulling, advancedRefractions;
+ static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, debugEmitters, debugForceFields, gridHelper, voxelHelper, advancedLightCulling, advancedRefractions;
static bool requestReflectionRendering;
@@ -295,6 +295,8 @@ public:
static void SetToDrawDebugEnvProbes(bool value) { debugEnvProbes = value; }
static void SetToDrawDebugEmitters(bool param) { debugEmitters = param; }
static bool GetToDrawDebugEmitters() { return debugEmitters; }
+ static void SetToDrawDebugForceFields(bool param) { debugForceFields = param; }
+ static bool GetToDrawDebugForceFields() { return debugForceFields; }
static bool GetToDrawGridHelper() { return gridHelper; }
static void SetToDrawGridHelper(bool value) { gridHelper = value; }
static bool GetToDrawVoxelHelper() { return voxelHelper; }
@@ -407,6 +409,7 @@ public:
static void DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID);
static void DrawDebugVoxels(Camera* camera, GRAPHICSTHREAD threadID);
static void DrawDebugEmitters(Camera* camera, GRAPHICSTHREAD threadID);
+ static void DrawDebugForceFields(Camera* camera, GRAPHICSTHREAD threadID);
static void DrawSoftParticles(Camera* camera, GRAPHICSTHREAD threadID);
static void DrawTrails(GRAPHICSTHREAD threadID, wiGraphicsTypes::Texture2D* refracRes);
static void DrawImagesAdd(GRAPHICSTHREAD threadID, wiGraphicsTypes::Texture2D* refracRes);
diff --git a/WickedEngine/wiRenderer_BindLua.cpp b/WickedEngine/wiRenderer_BindLua.cpp
index 764fa1996..689faac89 100644
--- a/WickedEngine/wiRenderer_BindLua.cpp
+++ b/WickedEngine/wiRenderer_BindLua.cpp
@@ -443,6 +443,24 @@ namespace wiRenderer_BindLua
}
return 0;
}
+ int SetDebugEmittersEnabled(lua_State* L)
+ {
+ int argc = wiLua::SGetArgCount(L);
+ if (argc > 0)
+ {
+ wiRenderer::SetToDrawDebugEmitters(wiLua::SGetBool(L, 1));
+ }
+ return 0;
+ }
+ int SetDebugForceFieldsEnabled(lua_State* L)
+ {
+ int argc = wiLua::SGetArgCount(L);
+ if (argc > 0)
+ {
+ wiRenderer::SetToDrawDebugForceFields(wiLua::SGetBool(L, 1));
+ }
+ return 0;
+ }
int SetVSyncEnabled(lua_State* L)
{
int argc = wiLua::SGetArgCount(L);
@@ -700,6 +718,8 @@ namespace wiRenderer_BindLua
wiLua::GetGlobal()->RegisterFunc("SetDebugBoxesEnabled", SetDebugBoxesEnabled);
wiLua::GetGlobal()->RegisterFunc("SetDebugPartitionTreeEnabled", SetDebugPartitionTreeEnabled);
wiLua::GetGlobal()->RegisterFunc("SetDebugBonesEnabled", SetDebugBonesEnabled);
+ wiLua::GetGlobal()->RegisterFunc("SetDebugEmittersEnabled", SetDebugEmittersEnabled);
+ wiLua::GetGlobal()->RegisterFunc("SetDebugForceFieldsEnabled", SetDebugForceFieldsEnabled);
wiLua::GetGlobal()->RegisterFunc("SetVSyncEnabled", SetVSyncEnabled);
wiLua::GetGlobal()->RegisterFunc("SetPhysicsParams", SetPhysicsParams);
wiLua::GetGlobal()->RegisterFunc("SetResolution", SetResolution);
diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp
index b4c71694e..b0eb527fd 100644
--- a/WickedEngine/wiVersion.cpp
+++ b/WickedEngine/wiVersion.cpp
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates
const int minor = 13;
// minor bug fixes, alterations, refactors, updates
- const int revision = 73;
+ const int revision = 74;
long GetVersion()