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()