diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/samples_v2/SampleDestructionImpactDamage | |
| download | physx-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/SampleDestructionImpactDamage')
5 files changed, 488 insertions, 0 deletions
diff --git a/APEX_1.4/samples_v2/SampleDestructionImpactDamage/Main.cpp b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/Main.cpp new file mode 100644 index 00000000..f33a5f4f --- /dev/null +++ b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/Main.cpp @@ -0,0 +1,51 @@ +#include "Utils.h" + +#include <DirectXMath.h> +#include "XInput.h" +#include "DXUTMisc.h" +#include "DXUTCamera.h" + + +#include "ApexController.h" +#include "ApexRenderer.h" +#include "CommonUIController.h" +#include "SampleUIController.h" +#include "SampleSceneController.h" + +#include "SampleManager.h" + +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) +{ + PX_UNUSED(hInstance); + PX_UNUSED(hPrevInstance); + PX_UNUSED(lpCmdLine); + PX_UNUSED(nCmdShow); + +// Enable run-time memory check for debug builds. +#if defined(DEBUG) | defined(_DEBUG) + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); + AllocConsole(); +#endif + + SampleManager* sampleManager = new SampleManager(L"APEX Destruction Sample: Impact Damage"); + + CFirstPersonCamera camera; + + auto apexController = ApexController(DestructionImpactDamageFilterShader, &camera); + auto apexRender = ApexRenderer(&camera, apexController); + auto sceneController = SampleSceneController(&camera, apexController); + auto commonUiController = CommonUIController(&camera, &apexRender, &apexController); + auto sampleUIController = SampleUIController(&sceneController, &commonUiController); + + sampleManager->addControllerToFront(&apexController); + sampleManager->addControllerToFront(&apexRender); + sampleManager->addControllerToFront(&sceneController); + sampleManager->addControllerToFront(&sampleUIController); + sampleManager->addControllerToFront(&commonUiController); + + int result = sampleManager->run(); + + delete sampleManager; + + return result; +} diff --git a/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.cpp b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.cpp new file mode 100644 index 00000000..e7f5771f --- /dev/null +++ b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.cpp @@ -0,0 +1,160 @@ +/* +* 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 "SampleSceneController.h" +#include "ApexRenderer.h" // for matrix conversion +#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 "PxPhysicsAPI.h" +#include "PxMath.h" +#include "PsString.h" + +#include "ApexResourceCallback.h" +#include "PhysXPrimitive.h" + + +using namespace physx; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SampleSceneController::SampleSceneController(CFirstPersonCamera* camera, ApexController& apex) + : mApex(apex), mCamera(camera), mActor(NULL), mLastImpactDamage(0), mCubesCount(0) +{ + mImpactDamageReport.setScene(this); +} + +SampleSceneController::~SampleSceneController() +{ +} + +void SampleSceneController::onSampleStart() +{ + // setup camera + DirectX::XMVECTORF32 lookAtPt = { 0, 10, 0, 0 }; + DirectX::XMVECTORF32 eyePt = { 0, 20, 60, 0 }; + mCamera->SetViewParams(eyePt, lookAtPt); + mCamera->SetRotateButtons(false, false, true, false); + mCamera->SetEnablePositionMovement(true); + + // set physics callback + mApex.getModuleDestructible()->setImpactDamageReportCallback(&mImpactDamageReport); + + // spawn actor + mActor = mApex.spawnDestructibleActor("Wall_PC"); + + // default destructible params: + DestructibleParameters params = mActor->getDestructibleParameters(); + params.forceToDamage = 0.01f; + params.flags &= ~DestructibleParametersFlag::ACCUMULATE_DAMAGE; + mActor->setDestructibleParameters(params); + + // default cube settings: + mCubeVelocity = 100; + mCubeMass = 10; + + // const damage threshold + DestructibleBehaviorGroupDesc desc; + mActor->getBehaviorGroup(desc, -1); + mDamageThreshold = desc.damageThreshold; +} + +void SampleSceneController::throwCube() +{ + PxVec3 eyePos = XMVECTORToPxVec4(mCamera->GetEyePt()).getXYZ(); + PxVec3 lookAtPos = XMVECTORToPxVec4(mCamera->GetLookAtPt()).getXYZ(); + PhysXPrimitive* box = mApex.spawnPhysXPrimitiveBox(PxTransform(eyePos)); + PxRigidDynamic* rigidDynamic = box->getActor()->is<PxRigidDynamic>(); + PxRigidBodyExt::setMassAndUpdateInertia(*rigidDynamic, mCubeMass, NULL, false); + float heaviness = mCubeMass / 1000.0f; + box->setColor(DirectX::XMFLOAT3(1, 1 - heaviness, 1 - heaviness)); + + physx::shdfnd::snprintf(mLastCubeName, 32, "box%d", mCubesCount++); + rigidDynamic->setName(mLastCubeName); + + PxVec3 dir = (lookAtPos - eyePos).getNormalized(); + rigidDynamic->setLinearVelocity(dir * mCubeVelocity); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SampleSceneController::SampleImpactDamageReport::onImpactDamageNotify(const ImpactDamageEventData* buffer, uint32_t bufferSize) +{ + if (!mScene) return; + for (uint32_t i = 0; i < bufferSize; i++) + { + if (buffer[i].impactDamageActor == NULL || buffer[i].impactDamageActor->getName() == NULL) + continue; + + if (physx::shdfnd::strcmp(buffer[i].impactDamageActor->getName(), mScene->mLastCubeName) == 0) + { + mScene->mLastImpactDamage = buffer[0].damage; + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +PxFilterFlags DestructionImpactDamageFilterShader( + PxFilterObjectAttributes attributes0, + PxFilterData filterData0, + PxFilterObjectAttributes attributes1, + PxFilterData filterData1, + PxPairFlags& pairFlags, + const void* constantBlock, + uint32_t constantBlockSize) +{ + PX_UNUSED(constantBlock); + PX_UNUSED(constantBlockSize); + // let triggers through + if (PxFilterObjectIsTrigger(attributes0) || PxFilterObjectIsTrigger(attributes1)) + { + pairFlags = PxPairFlag::eTRIGGER_DEFAULT; + return PxFilterFlags(); + } + + if ((PxFilterObjectIsKinematic(attributes0) || PxFilterObjectIsKinematic(attributes1)) && + (PxGetFilterObjectType(attributes0) == PxFilterObjectType::eRIGID_STATIC || PxGetFilterObjectType(attributes1) == PxFilterObjectType::eRIGID_STATIC)) + { + return PxFilterFlag::eSUPPRESS; + } + + // use a group-based mechanism if the first two filter data words are not 0 + uint32_t f0 = filterData0.word0 | filterData0.word1; + uint32_t f1 = filterData1.word0 | filterData1.word1; + if (f0 && f1 && !(filterData0.word0&filterData1.word1 || filterData1.word0&filterData0.word1)) + return PxFilterFlag::eSUPPRESS; + + pairFlags = PxPairFlag::eCONTACT_DEFAULT + | PxPairFlag::eNOTIFY_CONTACT_POINTS + | PxPairFlag::eNOTIFY_THRESHOLD_FORCE_PERSISTS + | PxPairFlag::eNOTIFY_THRESHOLD_FORCE_FOUND + | PxPairFlag::eNOTIFY_TOUCH_FOUND + | PxPairFlag::eNOTIFY_TOUCH_PERSISTS; + + // eSOLVE_CONTACT is invalid with kinematic pairs + if (PxFilterObjectIsKinematic(attributes0) && PxFilterObjectIsKinematic(attributes1)) + { + pairFlags &= ~PxPairFlag::eSOLVE_CONTACT; + } + + return PxFilterFlags(); +} diff --git a/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.h b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.h new file mode 100644 index 00000000..fd81bb51 --- /dev/null +++ b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleSceneController.h @@ -0,0 +1,78 @@ +/* +* 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. +*/ + +#ifndef SCENE_CONTROLLER_H +#define SCENE_CONTROLLER_H + +#include "ApexController.h" +#include "SampleManager.h" + +class CFirstPersonCamera; + +class SampleSceneController : public ISampleController +{ +public: + SampleSceneController(CFirstPersonCamera* camera, ApexController& apex); + virtual ~SampleSceneController(); + + DestructibleActor* getCurrentActor() { return mActor; } + + virtual void onSampleStart(); + + // commands + void throwCube(); + + // ui exposed settings: + float& getCubeVelocity() { return mCubeVelocity; } + float& getCubeMass() { return mCubeMass; } + const float* getDamageThreshold() { return &mDamageThreshold; } + const float getLastImpactDamage() { return mLastImpactDamage; } + +private: + SampleSceneController& operator= (SampleSceneController&); + + class SampleImpactDamageReport : public UserImpactDamageReport + { + public: + SampleImpactDamageReport() : mScene(0) {} + void setScene(SampleSceneController* scene) + { + mScene = scene; + } + void onImpactDamageNotify(const ImpactDamageEventData* buffer, uint32_t bufferSize); + private: + SampleImpactDamageReport& operator= (SampleImpactDamageReport&); + SampleSceneController* mScene; + }; + SampleImpactDamageReport mImpactDamageReport; + + ApexController& mApex; + CFirstPersonCamera* mCamera; + + DestructibleActor* mActor; + + float mCubeVelocity; + float mCubeMass; + float mDamageThreshold; + float mLastImpactDamage; + char mLastCubeName[32]; + int mCubesCount; +}; + +PxFilterFlags DestructionImpactDamageFilterShader( + PxFilterObjectAttributes attributes0, + PxFilterData filterData0, + PxFilterObjectAttributes attributes1, + PxFilterData filterData1, + PxPairFlags& pairFlags, + const void* constantBlock, + uint32_t constantBlockSize); + +#endif
\ No newline at end of file diff --git a/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.cpp b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.cpp new file mode 100644 index 00000000..ba44e90b --- /dev/null +++ b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.cpp @@ -0,0 +1,150 @@ +/* +* 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 "SampleUIController.h" +#include "SampleSceneController.h" +#include "CommonUIController.h" + +SampleUIController::SampleUIController(SampleSceneController* s, CommonUIController* c) : mScene(s), mCommonUIController(c) +{ +} + +void SampleUIController::onInitialize() +{ + TwBar* sampleBar = TwNewBar("Sample"); + PX_UNUSED(sampleBar); + TwDefine("Sample color='19 25 59' alpha=128 text=light size='380 200' iconified=false valueswidth=150 position='12 440' label='Setup Throw'"); + + TwAddVarRO(sampleBar, "damageThreshold", TW_TYPE_FLOAT, mScene->getDamageThreshold(), "group='Destructible Parameters' min=0 max=100 step=0.1 help='The damage amount which will cause a chunk to fracture (break free) from the destructible.'"); + TwAddVarCB(sampleBar, "forceToDamage", TW_TYPE_FLOAT, SampleUIController::setForceToDamage, + SampleUIController::getForceToDamage, this, "group='Destructible Parameters' min=0 max=1 step=0.001 help='Multiplier to calculate applied damage from an impact. applied damage = forceToDamage x impact force.'"); + TwAddVarCB(sampleBar, "damageCap", TW_TYPE_FLOAT, SampleUIController::setDamageCap, + SampleUIController::getDamageCap, this, "group='Destructible Parameters' min=0 max=100 step=0.1 help='Limits the amount of damage applied to a chunk.'"); + TwAddVarRW(sampleBar, "cube velocity", TW_TYPE_FLOAT, &(mScene->getCubeVelocity()), "group='Throw Parameteres' min=10 max=1000 step=1 help='Thrown cube initial velocity.'"); + TwAddVarRW(sampleBar, "cube mass", TW_TYPE_FLOAT, &(mScene->getCubeMass()), "group='Throw Parameteres' min=0.01 max=1000 step=0.01 help='Thrown cube mass'"); + + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eBODY_ANG_VELOCITY); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eBODY_LIN_VELOCITY); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eBODY_MASS_AXES); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_AABBS); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_SHAPES); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_AXES); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_COMPOUNDS); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_FNORMALS); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_EDGES); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_STATIC); + mCommonUIController->addPhysXDebugRenderParam(PxVisualizationParameter::eCOLLISION_DYNAMIC); + + mCommonUIController->addApexDebugRenderParam("LodBenefits"); + mCommonUIController->addApexDebugRenderParam("VISUALIZE_DESTRUCTIBLE_SUPPORT", "Destructible", 1.0f, "DestructibleSupport"); + mCommonUIController->addApexDebugRenderParam("RenderNormals"); + mCommonUIController->addApexDebugRenderParam("RenderTangents"); + mCommonUIController->addApexDebugRenderParam("Bounds"); + + mCommonUIController->addHintLine("Throw cube - LMB"); +} + +LRESULT SampleUIController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PX_UNUSED(hWnd); + PX_UNUSED(wParam); + PX_UNUSED(lParam); + + if(uMsg == WM_LBUTTONDOWN) + { + mScene->throwCube(); + } + + return 1; +} + +void SampleUIController::Render(ID3D11Device*, ID3D11DeviceContext*, ID3D11RenderTargetView*, ID3D11DepthStencilView*) +{ + { + char info[512]; + sprintf(info, "Last impact damage: %f", mScene->getLastImpactDamage()); + int tw, th; + TwMeasureTextLine(info, &tw, &th); + TwBeginText((int)mWidth - tw - 2, (int)mHeight - th - 2, 0, 0); + TwAddTextLine(info, 0xFF00FF99, 0xFF000000); + TwEndText(); + } + +} + +void SampleUIController::BackBufferResized(ID3D11Device* pDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc) +{ + PX_UNUSED(pDevice); + + mWidth = pBackBufferSurfaceDesc->Width; + mHeight = pBackBufferSurfaceDesc->Height; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// UI Callbacks +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// forceToDamage + +void TW_CALL SampleUIController::setForceToDamage(const void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleParameters params = controller->mScene->getCurrentActor()->getDestructibleParameters(); + params.forceToDamage = *static_cast<const float*>(value); + controller->mScene->getCurrentActor()->setDestructibleParameters(params); + +} + +void TW_CALL SampleUIController::getForceToDamage(void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleParameters params = controller->mScene->getCurrentActor()->getDestructibleParameters(); + *static_cast<float*>(value) = params.forceToDamage; +} + + +// damageThreshold + +void TW_CALL SampleUIController::setDamageThreshold(const void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleBehaviorGroupDesc desc; + controller->mScene->getCurrentActor()->getBehaviorGroup(desc, 1); + desc.damageThreshold = *static_cast<const float*>(value); + +} + +void TW_CALL SampleUIController::getDamageThreshold(void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleBehaviorGroupDesc desc; + controller->mScene->getCurrentActor()->getBehaviorGroup(desc, 1); + *static_cast<float*>(value) = desc.damageThreshold; +} + + +// damageCap + +void TW_CALL SampleUIController::setDamageCap(const void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleParameters params = controller->mScene->getCurrentActor()->getDestructibleParameters(); + params.damageCap = *static_cast<const float*>(value); + controller->mScene->getCurrentActor()->setDestructibleParameters(params); + +} + +void TW_CALL SampleUIController::getDamageCap(void* value, void* clientData) +{ + SampleUIController* controller = static_cast<SampleUIController*>(clientData); + DestructibleParameters params = controller->mScene->getCurrentActor()->getDestructibleParameters(); + *static_cast<float*>(value) = params.damageCap; +} + diff --git a/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.h b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.h new file mode 100644 index 00000000..4e523ccd --- /dev/null +++ b/APEX_1.4/samples_v2/SampleDestructionImpactDamage/SampleUIController.h @@ -0,0 +1,49 @@ +/* +* 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. +*/ + +#ifndef SAMPLE_UI_CONTROLLER_H +#define SAMPLE_UI_CONTROLLER_H + +#include "SampleManager.h" +#include <DirectXMath.h> +#include "AntTweakBar.h" + +class SampleSceneController; +class CommonUIController; + +class SampleUIController : public ISampleController +{ + public: + SampleUIController(SampleSceneController* s, CommonUIController* c); + + virtual void onInitialize(); + virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual void Render(ID3D11Device*, ID3D11DeviceContext*, ID3D11RenderTargetView*, ID3D11DepthStencilView*); + virtual void BackBufferResized(ID3D11Device* pDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc); + + static void TW_CALL setForceToDamage(const void* value, void* clientData); + static void TW_CALL getForceToDamage(void* value, void* clientData); + + static void TW_CALL setDamageThreshold(const void* value, void* clientData); + static void TW_CALL getDamageThreshold(void* value, void* clientData); + + static void TW_CALL setDamageCap(const void* value, void* clientData); + static void TW_CALL getDamageCap(void* value, void* clientData); + + private: + SampleSceneController* mScene; + CommonUIController* mCommonUIController; + TwBar* mSettingsBar; + + UINT mWidth; + UINT mHeight; +}; + +#endif
\ No newline at end of file |