// This code contains NVIDIA Confidential Information and is disclosed to you // under a form of NVIDIA software license agreement provided separately to you. // // Notice // NVIDIA Corporation and its licensors retain all intellectual property and // proprietary rights in and to this software and 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. // // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. // // Information and code furnished is believed to be accurate and reliable. // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such // information or for any infringement of patents or other rights of third parties that may // result from its use. No license is granted by implication or otherwise under any patent // or patent rights of NVIDIA Corporation. Details are subject to change without notice. // This code supersedes and replaces all information previously supplied. // NVIDIA Corporation products are not authorized for use as critical // components in life support devices or systems without express written approval of // NVIDIA Corporation. // // Copyright (c) 2008-2018 NVIDIA Corporation. All rights reserved. #include "BlastAssetBoxes.h" #include "BlastFamilyBoxes.h" #include "NvBlastExtPxAsset.h" #include "PxPhysics.h" #include "cooking/PxCooking.h" BlastAssetBoxes::BlastAssetBoxes(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, Renderer& renderer, const Desc& desc) : BlastAsset(renderer) { // generate boxes slices procedurally CubeAssetGenerator::generate(m_generatorAsset, desc.generatorSettings); // asset desc / tk asset ExtPxAssetDesc assetDesc; assetDesc.chunkDescs = m_generatorAsset.solverChunks.data(); assetDesc.chunkCount = (uint32_t)m_generatorAsset.solverChunks.size(); assetDesc.bondDescs = m_generatorAsset.solverBonds.data(); assetDesc.bondCount = (uint32_t)m_generatorAsset.solverBonds.size(); std::vector bondFlags(assetDesc.bondCount); std::fill(bondFlags.begin(), bondFlags.end(), desc.jointAllBonds ? 1 : 0); assetDesc.bondFlags = bondFlags.data(); // box convex PxVec3 vertices[8] = { { -1, -1, -1 }, { -1, -1, 1 }, { -1, 1, -1 }, { -1, 1, 1 }, { 1, -1, -1 }, { 1, -1, 1 }, { 1, 1, -1 }, { 1, 1, 1 } }; PxConvexMeshDesc convexMeshDesc; convexMeshDesc.points.count = 8; convexMeshDesc.points.data = vertices; convexMeshDesc.points.stride = sizeof(PxVec3); convexMeshDesc.flags = PxConvexFlag::eCOMPUTE_CONVEX; m_boxMesh = cooking.createConvexMesh(convexMeshDesc, physics.getPhysicsInsertionCallback()); // prepare chunks const uint32_t chunkCount = (uint32_t)m_generatorAsset.solverChunks.size(); std::vector pxChunks(chunkCount); std::vector pxSubchunks; pxSubchunks.reserve(chunkCount); for (uint32_t i = 0; i < m_generatorAsset.solverChunks.size(); i++) { uint32_t chunkID = m_generatorAsset.solverChunks[i].userData; GeneratorAsset::BlastChunkCube& cube = m_generatorAsset.chunks[chunkID]; PxVec3 position = *reinterpret_cast(&cube.position); PxVec3 extents = *reinterpret_cast(&cube.extents); ExtPxAssetDesc::ChunkDesc& chunk = pxChunks[chunkID]; ExtPxAssetDesc::SubchunkDesc subchunk = { PxTransform(position), PxConvexMeshGeometry(m_boxMesh, PxMeshScale(extents / 2)) }; pxSubchunks.push_back(subchunk); chunk.subchunks = &pxSubchunks.back(); chunk.subchunkCount = 1; chunk.isStatic = (position.y - (extents.y - desc.generatorSettings.extents.y) / 2) <= desc.staticHeight; } // create asset assetDesc.pxChunks = pxChunks.data(); m_pxAsset = ExtPxAsset::create(assetDesc, framework); initialize(); } BlastAssetBoxes::~BlastAssetBoxes() { m_boxMesh->release(); m_pxAsset->release(); } BlastFamilyPtr BlastAssetBoxes::createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc) { return BlastFamilyPtr(new BlastFamilyBoxes(physXConroller, pxManager, m_renderer, *this, desc)); }