Skip to content
Snippets Groups Projects
Commit a2f7c6b7 authored by elom0n's avatar elom0n
Browse files

added nested events as well as a sparkler option

parent 711d2b88
No related branches found
No related tags found
1 merge request!106Created initial firework project
......@@ -10,12 +10,12 @@ struct event_t {
uint count;
uint index;
uint parent;
uint pad0;
uint continuous;
float lifetime;
float mass;
float size;
float pad1;
uint contCount;
};
#endif // EVENT_INC
\ No newline at end of file
......@@ -77,18 +77,35 @@ void main() {
for (uint i = 0; i < events.length(); i++) {
const float start = events[i].startTime;
if (((t - dt * 2) >= start) || (t < start)) {
if (events[i].continuous < 1 && (((t - dt * 2) >= start) || (t < start))) {
continue;
}
index = atomicAdd(events[i].index, 1);
if (events[i].count > index) {
event_id = i;
break;
} else {
atomicAdd(events[i].index, -1);
if(events[i].continuous < 1){
if (events[i].count > index) {
event_id = i;
break;
}else{
atomicAdd(events[i].index, -1);
}
}else{
if(events[i].continuous > index){
event_id = i;
break;
}else{
if(events[i].contCount > 0){
atomicAdd(events[i].contCount, -1);
events[i].index = 0;
}
atomicAdd(events[i].index, -1);
}
}
}
if (event_id >= events.length()) {
......@@ -115,8 +132,8 @@ void main() {
float size = events[event_id].size;
if (events[event_id].parent < events.length()) {
const uint spawnId = startIndex[events[event_id].parent];
const uint spawnId = startIndex[events[event_id].parent];// + int(int(events[events[event_id].parent].count * randomData[events[event_id].index % randomData.length()]) % events[events[event_id].parent].count);
if (spawnId < particlesCopy.length()) {
particles[id].position = particlesCopy[spawnId].position;
velocity += particlesCopy[spawnId].velocity;
......@@ -124,7 +141,7 @@ void main() {
}
}
if (0 == index) {
if (0 == index && events[event_id].continuous < 1) {
const uint sid = atomicAdd(smokeIndex, 1) % smokes.length();
smokes[sid].position = particles[id].position;
......
......@@ -36,7 +36,12 @@ void main() {
const float fading = 1.0f / (1.0f + friction);
position = position + velocity * dt;
velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
if(particles[id].mass > 0){
velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
}
else{
velocity = velocity * fading;
}
particles[id].position = position;
particles[id].lifetime = lifetime;
......
......@@ -31,7 +31,7 @@ void main() {
const float fading = 1.0f / (1.0f + friction);
position = position + velocity * dt;
velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
velocity = velocity * fading + vec3(0.0f, 0.2f, 0.0f) * dt; //smoke is lighter than air right? + vec3(0.0f, -g, 0.0f) * dt;
size = size + scaling * dt;
smokes[id].position = position;
......
......@@ -29,12 +29,12 @@ struct event_t {
uint32_t count;
uint32_t index;
uint32_t parent;
uint32_t pad0;
uint32_t continous;
float lifetime;
float mass;
float size;
float pad1;
uint32_t contCount;
};
struct smoke_t {
......@@ -79,7 +79,7 @@ struct draw_smoke_t {
#define RANDOM_DATA_LENGTH (1024)
#define POINT_COUNT (2048 * 256)
void initializeParticles(std::vector<particle_t> &particles) {
void InitializeParticles(std::vector<particle_t> &particles) {
for (size_t i = 0; i < particles.size(); i++) {
particle_t particle;
particle.position = glm::vec3(2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f,
......@@ -95,6 +95,96 @@ void initializeParticles(std::vector<particle_t> &particles) {
}
}
void InitializeFireworkEvents(std::vector<event_t>& events) {
events.emplace_back(glm::vec3(0, 1, 0), 0.5f, glm::vec3(0.0f, 1.0f, 0.0f), 12.5f,
1, 0, UINT_MAX, 0,
1.0f, 1.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 1.5f, glm::vec3(0.0f, 1.0f, 1.0f), 10.0f,
100, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
events.emplace_back(glm::vec3(0.5, 1, 0), 0.25f, glm::vec3(0.0f, 1.5f, 0.0f), 15.0f,
1, 0, UINT_MAX, 0,
0.5f, 1.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 0.75f, glm::vec3(0.0f, 1.5f, 1.0f), 8.0f,
150, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
events.emplace_back(glm::vec3(-2.5, 3, 0.5), 1.0f, glm::vec3(246.0f, 189.0f, 255.0f), 12.5f,
1, 0, UINT_MAX, 0,
1.0f, 1.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(235.0f, 137.0f, 250.0f), 8.0f,
75, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
}
void InitializeSparklerEvents(std::vector<event_t> &events) {
events.emplace_back(glm::vec3(0, 1, 0), 0.0f, glm::vec3(251.0f, 255.0f, 145.0f), 1.0f,
1, 0, UINT_MAX, 0,
8.0f, 0.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 0.0f, glm::vec3(251.0f, 255.0f, 145.0f), 10.0f,
1000, 1, events.size() - 1, 10,
0.5f, -1.0f, 0.0f, 100);
}
void InitializeNestedFireworkEvents(std::vector<event_t>& events) {
events.emplace_back(glm::vec3(0, 2, 0), 0.0f, glm::vec3(0.0f, 1.0f, 0.0f), 12.5f,
1, 0, UINT_MAX, 0,
1.0f, 1.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 1.0f, glm::vec3(0.0f, 1.0f, 1.0f), 7.0f,
100, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(0.0f, 0.0f, 0.0f), 10.0f,
100, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
events.emplace_back(glm::vec3(0.0f), 1.0f, glm::vec3(42.0f,0.0f, 1.0f), 12.5f,
100, 0, events.size() - 2, 0,
1.0f, 1.0f, 0.5f, 0);
events.emplace_back(glm::vec3(0.0f), 1.5f, glm::vec3(42.0f, 0.0f, 1.0f), 10.0f,
100, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(42.0f, 0.0f, 1.0f), 10.0f,
100, 0, events.size() - 1, 0,
10.0f, 1.0f, 0.0f, 0);
}
int main(int argc, const char **argv) {
vkcv::Features features;
......@@ -263,7 +353,7 @@ int main(int argc, const char **argv) {
std::vector<particle_t> particles;
particles.resize(PARTICLE_COUNT);
initializeParticles(particles);
InitializeParticles(particles);
vkcv::Buffer<particle_t> particleBuffer = core.createBuffer<particle_t>(
vkcv::BufferType::STORAGE,
......@@ -304,74 +394,7 @@ int main(int argc, const char **argv) {
randomBuffer.fill(randomData);
std::vector<event_t> events;
events.emplace_back(
glm::vec3(0, 1, 0),
0.5f,
glm::vec3(0.0f, 1.0f, 0.0f),
12.5f,
1,
0,
UINT_MAX,
0,
1.0f,
1.0f,
0.5f,
0.0f
);
events.emplace_back(
glm::vec3(0.0f),
1.5f,
glm::vec3(0.0f, 1.0f, 1.0f),
10.0f,
100,
0,
events.size() - 1,
0,
10.0f,
1.0f,
0.0f,
0.0f
);
events.emplace_back(
glm::vec3(0.5, 1, 0),
0.25f,
glm::vec3(0.0f, 1.5f, 0.0f),
15.0f,
1,
0,
UINT_MAX,
0,
0.5f,
1.0f,
0.5f,
0.0f
);
events.emplace_back(
glm::vec3(0.0f),
0.75f,
glm::vec3(0.0f, 1.5f, 1.0f),
8.0f,
150,
0,
events.size() - 1,
0,
10.0f,
1.0f,
0.0f,
0.0f
);
InitializeFireworkEvents(events);
vkcv::Buffer<event_t> eventBuffer = core.createBuffer<event_t>(
vkcv::BufferType::STORAGE,
......@@ -934,6 +957,11 @@ int main(int argc, const char **argv) {
gui.beginGUI();
ImGui::Begin("Settings");
bool listbox = ImGui::BeginListBox(" ");
bool firework = ImGui::Selectable("Firework");
bool sparkler = ImGui::Selectable("Sparkler");
bool nested = ImGui::Selectable("Nested Firework");
ImGui::EndListBox();
bool resetTime = ImGui::Button("Reset");
ImGui::End();
......@@ -961,10 +989,24 @@ int main(int argc, const char **argv) {
}
startIndexBuffer.fill(startingIndex);
if (firework) {
events.clear();
InitializeFireworkEvents(events);
resetTime = true;
} else if (sparkler) {
events.clear();
InitializeSparklerEvents(events);
resetTime = true;
} else if (nested) {
events.clear();
InitializeNestedFireworkEvents(events);
resetTime = true;
}
if (resetTime) {
start = std::chrono::system_clock::now();
initializeParticles(particles);
InitializeParticles(particles);
particleBuffer.fill(particles);
eventBuffer.fill(events);
smokeBuffer.fill(smokes);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment