aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp')
-rw-r--r--APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp404
1 files changed, 404 insertions, 0 deletions
diff --git a/APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp b/APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp
new file mode 100644
index 00000000..08be4392
--- /dev/null
+++ b/APEX_1.4/samples_v2/SampleBase/CommonUIController.cpp
@@ -0,0 +1,404 @@
+/*
+* Copyright (c) 2008-2015, 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 "CommonUIController.h"
+
+#include <DirectXMath.h>
+
+#include "XInput.h"
+#include "DXUTMisc.h"
+#pragma warning(push)
+#pragma warning(disable : 4481) // Suppress "nonstandard extension used" warning
+#include "DXUTCamera.h"
+#pragma warning(pop)
+
+#include "ApexRenderer.h"
+#include "ApexController.h"
+
+using namespace std;
+
+CommonUIController::CommonUIController(CFirstPersonCamera* cam, ApexRenderer* r, ApexController* a)
+: mCamera(cam)
+, mApexRenderer(r)
+, mApexController(a)
+, mShowHint(false)
+{
+ mHintOffLines.push_back("Press F1 to toggle hint");
+}
+
+HRESULT CommonUIController::DeviceCreated(ID3D11Device* pDevice)
+{
+ TwInit(TW_DIRECT3D11, pDevice);
+ TwDefine("GLOBAL fontstyle=fixed contained=true");
+
+ mSettingsBar = TwNewBar("Settings");
+ TwDefine(
+ "Settings color='19 25 19' alpha=128 text=light size='380 350' iconified=true valueswidth=65 position='12 80'");
+
+ TwAddVarCB(mSettingsBar, "WireFrame", TW_TYPE_BOOLCPP, CommonUIController::setWireframeEnabled,
+ CommonUIController::getWireframeEnabled, this, "group=Main key=o");
+ TwAddButton(mSettingsBar, "Reload Shaders", CommonUIController::onReloadShadersButton, this, "group=Main key=f5");
+ TwAddVarRW(mSettingsBar, "Ambient Color", TW_TYPE_COLOR3F, &(mApexRenderer->getAmbientColor()), "group='Scene'");
+ TwAddVarRW(mSettingsBar, "Point Light Color", TW_TYPE_COLOR3F, &(mApexRenderer->getPointLightColor()), "group='Scene'");
+ TwAddVarRW(mSettingsBar, "Point Light Pos", TW_TYPE_DIR3F, &(mApexRenderer->getPointLightPos()), "group='Scene'");
+ TwAddVarRW(mSettingsBar, "Dir Light Color", TW_TYPE_COLOR3F, &(mApexRenderer->getDirLightColor()), "group='Scene'");
+ TwAddVarRW(mSettingsBar, "Dir Light Dir", TW_TYPE_DIR3F, &(mApexRenderer->getDirLightDir()), "group='Scene'");
+ TwAddVarRW(mSettingsBar, "Specular Power", TW_TYPE_FLOAT, &(mApexRenderer->getSpecularPower()), "group='Scene' min=1 max=500 step=1");
+ TwAddVarRW(mSettingsBar, "Specular Intensity", TW_TYPE_FLOAT, &(mApexRenderer->getSpecularIntensity()), "group='Scene' min=0 max=2 step=0.05");
+
+ addPhysXDebugRenderParam(PxVisualizationParameter::eWORLD_AXES);
+ addPhysXDebugRenderParam(PxVisualizationParameter::eBODY_AXES);
+ addPhysXDebugRenderParam(PxVisualizationParameter::eACTOR_AXES);
+
+ addHintLine("Rotate camera - RMB");
+ addHintLine("Move camera - WASDQE(SHIFT)");
+ addHintLine("Play/Pause - P");
+ addHintLine("Reload shaders - F5");
+ addHintLine("Wireframe - O");
+
+
+ toggleCameraSpeed(false);
+
+ return S_OK;
+}
+
+void CommonUIController::DeviceDestroyed()
+{
+ TwTerminate();
+
+ for (std::list<IDebugRenderParam*>::iterator it = mDebugRenderParams.begin(); it != mDebugRenderParams.end(); it++)
+ {
+ delete (*it);
+ }
+ mDebugRenderParams.clear();
+}
+
+LRESULT CommonUIController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ PX_UNUSED(hWnd);
+ PX_UNUSED(wParam);
+ PX_UNUSED(lParam);
+
+ if(uMsg == WM_KEYDOWN || uMsg == WM_KEYUP)
+ {
+ // Camera overspeed event
+ int iKeyPressed = static_cast<int>(wParam);
+ if(iKeyPressed == VK_SHIFT)
+ {
+ toggleCameraSpeed(uMsg == WM_KEYDOWN);
+ }
+
+ // Play/Pause
+ if (iKeyPressed == 'P' && uMsg == WM_KEYDOWN)
+ {
+ mApexController->togglePlayPause();
+ }
+
+ // Hint show/hide
+ if (iKeyPressed == VK_F1 && uMsg == WM_KEYDOWN)
+ {
+ mShowHint = !mShowHint;
+ }
+ }
+
+ // TW events capture
+ if(TwEventWin(hWnd, uMsg, wParam, lParam))
+ {
+ return 0; // Event has been handled by AntTweakBar
+ }
+
+ // Camera events
+ mCamera->HandleMessages(hWnd, uMsg, wParam, lParam);
+
+ return 1;
+}
+
+void CommonUIController::Animate(double fElapsedTimeSeconds)
+{
+ mCamera->FrameMove((float)fElapsedTimeSeconds);
+}
+
+void CommonUIController::Render(ID3D11Device*, ID3D11DeviceContext*, ID3D11RenderTargetView*, ID3D11DepthStencilView*)
+{
+ // Render stats text
+ TwBeginText(2, 0, 0, 0);
+ char msg[256];
+ double averageTime = GetDeviceManager()->GetAverageFrameTime();
+ double fps = (averageTime > 0) ? 1.0 / averageTime : 0.0;
+ sprintf_s(msg, "FPS: %.1f", fps);
+ TwAddTextLine(msg, 0xFF9BD839, 0xFF000000);
+ sprintf_s(msg, "Simulation Time: %.5fs ", mApexController->getLastSimulationTime());
+ TwAddTextLine(msg, 0xFF9BD839, 0xFF000000);
+ TwEndText();
+
+ // Render hint text
+ list<string> lines = mShowHint ? mHintOnLines : mHintOffLines;
+ uint32_t lineNum = 0;
+ for (list<string>::iterator it = lines.begin(); it != lines.end(); it++)
+ {
+ int tw, th;
+ TwMeasureTextLine(it->c_str(), &tw, &th);
+ TwBeginText((int32_t)mWidth - tw - 2, th * (int32_t)lineNum, 0, 0);
+ TwAddTextLine(it->c_str(), 0xFFFFFF99, 0xFF000000);
+ TwEndText();
+
+ lineNum++;
+ }
+
+ TwDraw();
+}
+
+void CommonUIController::BackBufferResized(ID3D11Device* pDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc)
+{
+ PX_UNUSED(pDevice);
+
+ mWidth = pBackBufferSurfaceDesc->Width;
+ mHeight = pBackBufferSurfaceDesc->Height;
+
+ TwWindowSize((int32_t)mWidth, (int32_t)mHeight);
+}
+
+void CommonUIController::toggleCameraSpeed(bool overspeed)
+{
+ mCamera->SetScalers(0.002f, overspeed ? 150.f : 25.f);
+}
+
+void CommonUIController::addHintLine(std::string hintLine)
+{
+ mHintOnLines.push_back(hintLine);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// UI Callbacks
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void TW_CALL CommonUIController::setDebugRenderParam(const void* value, void* clientData)
+{
+ IDebugRenderParam* param = static_cast<IDebugRenderParam*>(clientData);
+ param->setParamEnabled(*static_cast<const bool*>(value));
+}
+
+void TW_CALL CommonUIController::getDebugRenderParam(void* value, void* clientData)
+{
+ IDebugRenderParam* param = static_cast<IDebugRenderParam*>(clientData);
+ *static_cast<bool*>(value) = param->isParamEnabled();
+}
+
+
+void TW_CALL CommonUIController::setWireframeEnabled(const void* value, void* clientData)
+{
+ CommonUIController* controller = static_cast<CommonUIController*>(clientData);
+ controller->mApexRenderer->setWireframeMode(*static_cast<const bool*>(value));
+}
+
+void TW_CALL CommonUIController::getWireframeEnabled(void* value, void* clientData)
+{
+ CommonUIController* controller = static_cast<CommonUIController*>(clientData);
+ *static_cast<bool*>(value) = controller->mApexRenderer->getWireframeMode();
+}
+
+
+void TW_CALL CommonUIController::onReloadShadersButton(void* clientData)
+{
+ CommonUIController* controller = static_cast<CommonUIController*>(clientData);
+ controller->mApexRenderer->reloadShaders();
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Debug Render Params
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+bool CommonUIController::ApexDebugRenderParam::isParamEnabled()
+{
+ Scene* scene = mController->mApexController->getApexScene();
+
+ NvParameterized::Interface* debugRenderInterface = scene->getDebugRenderParams();
+ if (!mModule.empty())
+ {
+ debugRenderInterface = scene->getModuleDebugRenderParams(mModule.c_str());
+ }
+
+ NvParameterized::Handle handle(*debugRenderInterface, mName.c_str());
+ PX_ASSERT(handle.isValid());
+
+ if (handle.parameterDefinition()->type() == NvParameterized::TYPE_F32)
+ {
+ float v;
+ handle.getParamF32(v);
+ return v == mValue;
+ }
+ else if (handle.parameterDefinition()->type() == NvParameterized::TYPE_U32)
+ {
+ uint32_t v;
+ handle.getParamU32(v);
+ return v == uint32_t(mValue);
+ }
+ else if (handle.parameterDefinition()->type() == NvParameterized::TYPE_BOOL)
+ {
+ bool v;
+ handle.getParamBool(v);
+ return v;
+ }
+ else
+ {
+ PX_ALWAYS_ASSERT();
+ return false;
+ }
+}
+
+void CommonUIController::ApexDebugRenderParam::setParamEnabled(bool enabled)
+{
+ Scene* scene = mController->mApexController->getApexScene();
+
+ NvParameterized::Interface* debugRenderInterface = scene->getDebugRenderParams();
+ NvParameterized::setParamBool(*debugRenderInterface, "Enable", true);
+ NvParameterized::setParamF32(*debugRenderInterface, "Scale", 1.0f);
+
+ if (!mModule.empty())
+ {
+ debugRenderInterface = scene->getModuleDebugRenderParams(mModule.c_str());
+ }
+
+ NvParameterized::Handle handle(*debugRenderInterface, mName.c_str());
+ PX_ASSERT(handle.isValid());
+
+ if (handle.parameterDefinition()->type() == NvParameterized::TYPE_F32)
+ {
+ handle.setParamF32(enabled ? mValue : 0);
+ }
+ else if (handle.parameterDefinition()->type() == NvParameterized::TYPE_U32)
+ {
+ handle.setParamU32(mValue ? uint32_t(mValue) : 0);
+ }
+ else if (handle.parameterDefinition()->type() == NvParameterized::TYPE_BOOL)
+ {
+ handle.setParamBool(enabled);
+ }
+}
+
+bool CommonUIController::PhysXDebugRenderParam::isParamEnabled()
+{
+ Scene* scene = mController->mApexController->getApexScene();
+ return scene->getPhysXScene()->getVisualizationParameter(mParameter) != 0;
+}
+
+void CommonUIController::PhysXDebugRenderParam::setParamEnabled(bool enabled)
+{
+ Scene* scene = mController->mApexController->getApexScene();
+ scene->getPhysXScene()->setVisualizationParameter(mParameter, enabled ? 1.0f : 0.0f);
+}
+
+static const char* getUINameForPhysXParam(physx::PxVisualizationParameter::Enum param)
+{
+ using physx::PxVisualizationParameter;
+
+ switch (param)
+ {
+ case PxVisualizationParameter::eSCALE:
+ return "Scale";
+ case PxVisualizationParameter::eBODY_AXES:
+ return "Body Axes";
+ case PxVisualizationParameter::eWORLD_AXES:
+ return "World Axes";
+ case PxVisualizationParameter::eBODY_MASS_AXES:
+ return "Body Mass Axes";
+ case PxVisualizationParameter::eBODY_LIN_VELOCITY:
+ return "Body Lin Velocity";
+ case PxVisualizationParameter::eBODY_ANG_VELOCITY:
+ return "Body Ang Velocity";
+ case PxVisualizationParameter::eBODY_JOINT_GROUPS:
+ return "Body Joint";
+ case PxVisualizationParameter::eCONTACT_POINT:
+ return "Contact Point";
+ case PxVisualizationParameter::eCONTACT_NORMAL:
+ return "Contact Normal";
+ case PxVisualizationParameter::eCONTACT_ERROR:
+ return "Contact Error";
+ case PxVisualizationParameter::eCONTACT_FORCE:
+ return "Contact Force";
+ case PxVisualizationParameter::eACTOR_AXES:
+ return "Actor Axes";
+ case PxVisualizationParameter::eCOLLISION_AABBS:
+ return "Collision AABBs";
+ case PxVisualizationParameter::eCOLLISION_SHAPES:
+ return "Collision Shapes";
+ case PxVisualizationParameter::eCOLLISION_AXES:
+ return "Collision Axes";
+ case PxVisualizationParameter::eCOLLISION_COMPOUNDS:
+ return "Collision Compounds";
+ case PxVisualizationParameter::eCOLLISION_FNORMALS:
+ return "Collision FNormals";
+ case PxVisualizationParameter::eCOLLISION_EDGES:
+ return "Collision Edges";
+ case PxVisualizationParameter::eCOLLISION_STATIC:
+ return "Collision Static";
+ case PxVisualizationParameter::eCOLLISION_DYNAMIC:
+ return "Collision Dynamic";
+ case PxVisualizationParameter::eJOINT_LOCAL_FRAMES:
+ return "Joint Local Frames";
+ case PxVisualizationParameter::eJOINT_LIMITS:
+ return "Joint Limits";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_POSITION:
+ return "PS Position";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_VELOCITY:
+ return "PS Velocity";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_COLLISION_NORMAL:
+ return "PS Collision Normal";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_BOUNDS:
+ return "PS Bounds";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_GRID:
+ return "PS Grid";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_BROADPHASE_BOUNDS:
+ return "PS Broadphase Bounds";
+ case PxVisualizationParameter::ePARTICLE_SYSTEM_MAX_MOTION_DISTANCE:
+ return "PS Max Motion Distance";
+ case PxVisualizationParameter::eCULL_BOX:
+ return "Cull Box";
+ case PxVisualizationParameter::eCLOTH_VERTICAL:
+ return "Cloth Vertical";
+ case PxVisualizationParameter::eCLOTH_HORIZONTAL:
+ return "Cloth Horizontal";
+ case PxVisualizationParameter::eCLOTH_BENDING:
+ return "Cloth Bending";
+ case PxVisualizationParameter::eCLOTH_SHEARING:
+ return "Cloth Shearing";
+ case PxVisualizationParameter::eCLOTH_VIRTUAL_PARTICLES:
+ return "Cloth Virtual Particles";
+ case PxVisualizationParameter::eMBP_REGIONS:
+ return "MBP Regions";
+ default:
+ PX_ALWAYS_ASSERT();
+ return "";
+ }
+}
+
+void CommonUIController::addApexDebugRenderParam(std::string name, std::string module, float value, std::string uiName)
+{
+ PX_ASSERT(mSettingsBar);
+
+ IDebugRenderParam* param = new ApexDebugRenderParam(this, name, module, value);
+ mDebugRenderParams.push_back(param);
+
+ TwAddVarCB(mSettingsBar, uiName.empty() ? name.c_str() : uiName.c_str(), TW_TYPE_BOOLCPP, CommonUIController::setDebugRenderParam,
+ CommonUIController::getDebugRenderParam, param, "group='Debug Render'");
+}
+
+void CommonUIController::addPhysXDebugRenderParam(physx::PxVisualizationParameter::Enum parameter)
+{
+ PX_ASSERT(mSettingsBar);
+
+ IDebugRenderParam* param = new PhysXDebugRenderParam(this, parameter);
+ mDebugRenderParams.push_back(param);
+
+ TwAddVarCB(mSettingsBar, getUINameForPhysXParam(parameter), TW_TYPE_BOOLCPP, CommonUIController::setDebugRenderParam,
+ CommonUIController::getDebugRenderParam, param, "group='Debug Render'");
+} \ No newline at end of file