| 46 | |
| 47 | |
| 48 | static void blast(std::set<NvBlastActor*>& actorsToDamage, GeneratorAsset* testAsset, GeneratorAsset::Vec3 localPos, float minRadius, float maxRadius, float compressiveDamage) |
| 49 | { |
| 50 | std::vector<NvBlastChunkFractureData> chunkEvents; /* num lower-support chunks + bonds */ |
| 51 | std::vector<NvBlastBondFractureData> bondEvents; /* num lower-support chunks + bonds */ |
| 52 | chunkEvents.resize(testAsset->solverChunks.size()); |
| 53 | bondEvents.resize(testAsset->solverBonds.size()); |
| 54 | |
| 55 | NvBlastFractureBuffers events = { static_cast<uint32_t>(bondEvents.size()), static_cast<uint32_t>(chunkEvents.size()), bondEvents.data(), chunkEvents.data() }; |
| 56 | |
| 57 | std::vector<float> scratch(chunkEvents.size() + bondEvents.size(), 0.0f); |
| 58 | |
| 59 | std::vector<char> splitScratch; |
| 60 | std::vector<NvBlastActor*> newActorsBuffer(testAsset->solverChunks.size()); |
| 61 | |
| 62 | NvBlastExtRadialDamageDesc damage = { |
| 63 | compressiveDamage, |
| 64 | { localPos.x, localPos.y, localPos.z }, |
| 65 | minRadius, |
| 66 | maxRadius |
| 67 | }; |
| 68 | |
| 69 | NvBlastExtProgramParams programParams = |
| 70 | { |
| 71 | &damage, |
| 72 | nullptr |
| 73 | }; |
| 74 | |
| 75 | NvBlastDamageProgram program = { |
| 76 | NvBlastExtFalloffGraphShader, |
| 77 | nullptr |
| 78 | }; |
| 79 | |
| 80 | size_t totalNewActorsCount = 0; |
| 81 | for (std::set<NvBlastActor*>::iterator k = actorsToDamage.begin(); k != actorsToDamage.end();) |
| 82 | { |
| 83 | NvBlastActor* actor = *k; |
| 84 | |
| 85 | NvBlastActorGenerateFracture(&events, actor, program, &programParams, nullptr, nullptr); |
| 86 | NvBlastActorApplyFracture(&events, actor, &events, nullptr, nullptr); |
| 87 | |
| 88 | bool removeActor = false; |
| 89 | |
| 90 | if (events.bondFractureCount + events.chunkFractureCount > 0) |
| 91 | { |
| 92 | NvBlastActorSplitEvent splitEvent; |
| 93 | splitEvent.newActors = &newActorsBuffer.data()[totalNewActorsCount]; |
| 94 | uint32_t newActorSize = (uint32_t)(newActorsBuffer.size() - totalNewActorsCount); |
| 95 | |
| 96 | splitScratch.resize((size_t)NvBlastActorGetRequiredScratchForSplit(actor, nullptr)); |
| 97 | const size_t newActorsCount = NvBlastActorSplit(&splitEvent, actor, newActorSize, splitScratch.data(), nullptr, nullptr); |
| 98 | totalNewActorsCount += newActorsCount; |
| 99 | removeActor = splitEvent.deletedActor != NULL; |
| 100 | } |
| 101 | |
| 102 | if (removeActor) |
| 103 | { |
| 104 | k = actorsToDamage.erase(k); |
| 105 | } |
no test coverage detected