PeriDyno 1.0.0
Loading...
Searching...
No Matches
CollisionDetectionBroadPhase.cpp
Go to the documentation of this file.
2#include "Catalyzer/VkScan.h"
4#include "VkTransfer.h"
5
6#define WORKGROUP_SIZE 64
7
8namespace dyno
9{
12 {
13 vkr = std::make_shared<VkReduce<int>>();
14 vks = std::make_shared<VkScan<int>>();
15
16 this->addKernel(
17 "CollisionCounterInBroadPhase",
18 std::make_shared<VkProgram>(
19 BUFFER(int), //number collided AABBs
20 BUFFER(AlignedBox3D), //AABB
21 BUFFER(uint32_t), //collision type
22 BUFFER(uint32_t), //shape type
23 CONSTANT(uint32_t)) //number of AABBs
24 );
25 kernel("CollisionCounterInBroadPhase")->load(getAssetPath() + "shaders/glsl/collision/CollisionCounterInBroadPhase.comp.spv");
26
27 this->addKernel(
28 "CollisionDetectionInBroadPhase",
29 std::make_shared<VkProgram>(
30 BUFFER(dyno::Vec2u), //collision pairs
31 BUFFER(int), //start index
32 BUFFER(AlignedBox3D), //AABB
33 BUFFER(uint32_t), //collision type
34 BUFFER(uint32_t), //shape type
35 CONSTANT(uint32_t)) //number of AABBs
36 );
37 kernel("CollisionDetectionInBroadPhase")->load(getAssetPath() + "shaders/glsl/collision/CollisionDetectionInBroadPhase.comp.spv");
38 }
39
43
45 {
46 uint num = this->inBoundingBox()->size();
47
48 if (counter.size() != num){
49 counter.resize(num);
50 startIndex.resize(num);
51 }
52
53 VkConstant<uint32_t> constAABBSize(num);
54
55 if (true)
56 {
57 kernel("CollisionCounterInBroadPhase")->begin();
58 kernel("CollisionCounterInBroadPhase")->enqueue(
60 counter.handle(),
61 this->inBoundingBox()->getDataPtr()->handle(),
62 this->inCollisionMask()->getDataPtr()->handle(),
63 this->inShapeType()->getDataPtr()->handle(),
64 &constAABBSize);
65 kernel("CollisionCounterInBroadPhase")->end();
66 }
67 kernel("CollisionCounterInBroadPhase")->update();
68
69 int totalSize = vkr->reduce(*counter.handle());
70
71 if (totalSize <= 0) {
72 this->outContacts()->clear();
73 return;
74 }
75
76 vks->scan(*startIndex.handle(), *counter.handle(), EXCLUSIVESCAN);
77
78 if (this->outContacts()->size() != totalSize) {
79 this->outContacts()->resize(totalSize);
80 }
81
82 if (true)
83 {
84 kernel("CollisionDetectionInBroadPhase")->begin();
85 kernel("CollisionDetectionInBroadPhase")->enqueue(
87 this->outContacts()->getDataPtr()->handle(),
88 startIndex.handle(),
89 this->inBoundingBox()->getDataPtr()->handle(),
90 this->inCollisionMask()->getDataPtr()->handle(),
91 this->inShapeType()->getDataPtr()->handle(),
92 &constAABBSize);
93 kernel("CollisionDetectionInBroadPhase")->end();
94 }
95 kernel("CollisionDetectionInBroadPhase")->update();
96 }
97
98}
#define WORKGROUP_SIZE
#define BUFFER(T)
Definition VkProgram.h:96
#define CONSTANT(T)
Definition VkProgram.h:100
#define EXCLUSIVESCAN
Definition VkScan.h:6
std::shared_ptr< VkReduce< int > > vkr
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
static dim3 vkDispatchSize(uint totalSize, uint blockSize)
Definition VkProgram.h:34
TAlignedBox3D< double > AlignedBox3D
Vector< uint32_t, 2 > Vec2u
Definition Vector2D.h:83
unsigned int uint
Definition VkProgram.h:14