| 33 | |
| 34 | |
| 35 | static void blast |
| 36 | ( |
| 37 | std::set<NvBlastActor*>& actorsToDamage, |
| 38 | GeneratorAsset* testAsset, |
| 39 | GeneratorAsset::Vec3 localPos, |
| 40 | float minRadius, float maxRadius, |
| 41 | float compressiveDamage, |
| 42 | NvBlastTimers& timers |
| 43 | ) |
| 44 | { |
| 45 | std::vector<NvBlastChunkFractureData> chunkEvents; /* num lower-support chunks + bonds */ |
| 46 | std::vector<NvBlastBondFractureData> bondEvents; /* num lower-support chunks + bonds */ |
| 47 | chunkEvents.resize(testAsset->solverChunks.size()); |
| 48 | bondEvents.resize(testAsset->solverBonds.size()); |
| 49 | |
| 50 | NvBlastExtRadialDamageDesc damage[] = { |
| 51 | compressiveDamage, |
| 52 | { localPos.x, localPos.y, localPos.z }, |
| 53 | minRadius, |
| 54 | maxRadius |
| 55 | }; |
| 56 | |
| 57 | NvBlastExtProgramParams programParams = |
| 58 | { |
| 59 | damage, |
| 60 | nullptr |
| 61 | }; |
| 62 | |
| 63 | NvBlastDamageProgram program = { |
| 64 | NvBlastExtFalloffGraphShader, |
| 65 | nullptr |
| 66 | }; |
| 67 | |
| 68 | std::vector<char> splitScratch; |
| 69 | std::vector<NvBlastActor*> newActors(testAsset->solverChunks.size()); |
| 70 | |
| 71 | size_t totalNewActorsCount = 0; |
| 72 | for (std::set<NvBlastActor*>::iterator k = actorsToDamage.begin(); k != actorsToDamage.end();) |
| 73 | { |
| 74 | NvBlastActor* actor = *k; |
| 75 | |
| 76 | NvBlastFractureBuffers events = { (uint32_t)bondEvents.size(), (uint32_t)chunkEvents.size(), bondEvents.data(), chunkEvents.data() }; |
| 77 | |
| 78 | NvBlastActorGenerateFracture(&events, actor, program, &programParams, nullptr, &timers); |
| 79 | NvBlastActorApplyFracture(&events, actor, &events, nullptr, &timers); |
| 80 | |
| 81 | bool removeActor = false; |
| 82 | |
| 83 | if (events.bondFractureCount + events.chunkFractureCount > 0) |
| 84 | { |
| 85 | splitScratch.resize((size_t)NvBlastActorGetRequiredScratchForSplit(actor, nullptr)); |
| 86 | NvBlastActorSplitEvent result; |
| 87 | result.deletedActor = nullptr; |
| 88 | result.newActors = &newActors[totalNewActorsCount]; |
| 89 | const size_t bufferSize = newActors.size() - totalNewActorsCount; |
| 90 | const size_t newActorsCount = NvBlastActorSplit(&result, actor, (uint32_t)bufferSize, splitScratch.data(), nullptr, &timers); |
| 91 | totalNewActorsCount += newActorsCount; |
| 92 | removeActor = newActorsCount > 0; |
no test coverage detected