Skip to content
Snippets Groups Projects
Verified Commit dc5e3f81 authored by Tobias Frisch's avatar Tobias Frisch
Browse files

Added clean configurations for structured and random meshes

parent 97d977c5
No related branches found
No related tags found
1 merge request!103Added project wobble_bobble and refactored some parts of the framework
...@@ -25,6 +25,9 @@ struct Particle { ...@@ -25,6 +25,9 @@ struct Particle {
#define SIM_TYPE_HYPERELASTIC 0 #define SIM_TYPE_HYPERELASTIC 0
#define SIM_TYPE_FLUID 1 #define SIM_TYPE_FLUID 1
#define SIM_MODE_RANDOM 0
#define SIM_MODE_ORDERED 1
struct Simulation { struct Simulation {
float density; float density;
float size; float size;
...@@ -35,6 +38,7 @@ struct Simulation { ...@@ -35,6 +38,7 @@ struct Simulation {
float K; float K;
float E; float E;
float gamma; float gamma;
int mode;
}; };
const float PI = 3.1415926535897932384626433832795; const float PI = 3.1415926535897932384626433832795;
......
...@@ -25,6 +25,9 @@ struct Particle { ...@@ -25,6 +25,9 @@ struct Particle {
#define SIM_TYPE_HYPERELASTIC 0 #define SIM_TYPE_HYPERELASTIC 0
#define SIM_TYPE_FLUID 1 #define SIM_TYPE_FLUID 1
#define SIM_MODE_RANDOM 0
#define SIM_MODE_ORDERED 1
struct Simulation { struct Simulation {
float density; float density;
float size; float size;
...@@ -35,6 +38,7 @@ struct Simulation { ...@@ -35,6 +38,7 @@ struct Simulation {
float K; float K;
float E; float E;
float gamma; float gamma;
int mode;
}; };
struct Physics { struct Physics {
...@@ -66,26 +70,46 @@ float randomFloat(float min, float max) { ...@@ -66,26 +70,46 @@ float randomFloat(float min, float max) {
return min + (max - min) * dist(random_dev) / static_cast<float>(RAND_MAX); return min + (max - min) * dist(random_dev) / static_cast<float>(RAND_MAX);
} }
float mod(float x, float y) {
return x - std::floor(x / y) * y;
}
void distributeParticlesCube(Particle *particles, size_t count, const glm::vec3& center, float radius, void distributeParticlesCube(Particle *particles, size_t count, const glm::vec3& center, float radius,
float mass, const glm::vec3& velocity) { float mass, const glm::vec3& velocity, bool random) {
const float side = cube_radius(static_cast<float>(count)) * 2.0f;
float volume = 0.0f; float volume = 0.0f;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
glm::vec3 offset( glm::vec3 offset;
randomFloat(-1.0f, +1.0f),
randomFloat(-1.0f, +1.0f),
randomFloat(-1.0f, +1.0f)
);
offset *= radius; if (random) {
offset.x = randomFloat(-1.0f, +1.0f);
offset.y = randomFloat(-1.0f, +1.0f);
offset.z = randomFloat(-1.0f, +1.0f);
} else {
const float s = static_cast<float>(i) + 0.5f;
offset.x = 2.0f * mod(s, side) / side - 1.0f;
offset.y = 2.0f * mod(s / side, side) / side - 1.0f;
offset.z = 2.0f * mod(s / side / side, side) / side - 1.0f;
}
const float ax = std::abs(offset.x); offset *= radius;
const float ay = std::abs(offset.y);
const float az = std::abs(offset.z);
const float a = std::max(std::max(ax, ay), az); float size = 0.0f;
const float size = (radius - a); if (random) {
const float ax = std::abs(offset.x);
const float ay = std::abs(offset.y);
const float az = std::abs(offset.z);
const float a = std::max(std::max(ax, ay), az);
size = (radius - a);
} else {
size = 2.0f * radius / side;
}
particles[i].position = center + offset; particles[i].position = center + offset;
particles[i].size = size; particles[i].size = size;
...@@ -106,22 +130,45 @@ void distributeParticlesCube(Particle *particles, size_t count, const glm::vec3& ...@@ -106,22 +130,45 @@ void distributeParticlesCube(Particle *particles, size_t count, const glm::vec3&
} }
void distributeParticlesSphere(Particle *particles, size_t count, const glm::vec3& center, float radius, void distributeParticlesSphere(Particle *particles, size_t count, const glm::vec3& center, float radius,
float mass, const glm::vec3& velocity) { float mass, const glm::vec3& velocity, bool random) {
const float side = sphere_radius(static_cast<float>(count)) * 2.0f;
float volume = 0.0f; float volume = 0.0f;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
glm::vec3 offset ( glm::vec3 offset;
randomFloat(-1.0f, +1.0f),
randomFloat(-1.0f, +1.0f), if (random) {
randomFloat(-1.0f, +1.0f) offset.x = randomFloat(-1.0f, +1.0f);
); offset.y = randomFloat(-1.0f, +1.0f);
offset.z = randomFloat(-1.0f, +1.0f);
if (glm::length(offset) > 0.0f)
offset = glm::normalize(offset);
offset *= randomFloat(0.0f, 1.0f);
} else {
const float range = 0.5f * side;
const float s = static_cast<float>(i) + 0.5f;
float a = mod(s, range) / range;
float b = mod(s / range, M_PI * range);
float c = mod(s / range / M_PI / range, M_PI * range * 2.0f);
offset.x = a * std::sin(c) * std::sin(b);
offset.y = a * std::cos(b);
offset.z = a * std::cos(c) * std::sin(b);
}
if (glm::length(offset) > 0.0f) offset *= radius;
offset = glm::normalize(offset);
offset *= randomFloat(0.0f, radius); float size = 0.0f;
const float size = (radius - glm::length(offset)); if (random) {
size = (radius - glm::length(offset));
} else {
size = 2.0f * radius / side;
}
particles[i].position = center + offset; particles[i].position = center + offset;
particles[i].size = size; particles[i].size = size;
...@@ -186,7 +233,7 @@ vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader ...@@ -186,7 +233,7 @@ vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader
} }
void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity, void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity,
float density, float size, int form) { float density, float size, int form, int mode) {
std::vector<Particle> particles_vec (particles.getCount()); std::vector<Particle> particles_vec (particles.getCount());
switch (form) { switch (form) {
...@@ -197,7 +244,8 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity ...@@ -197,7 +244,8 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity
glm::vec3(0.5f), glm::vec3(0.5f),
size, size,
density * sphere_volume(size), density * sphere_volume(size),
velocity velocity,
(mode == 0)
); );
break; break;
case SIM_FORM_CUBE: case SIM_FORM_CUBE:
...@@ -207,7 +255,8 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity ...@@ -207,7 +255,8 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity
glm::vec3(0.5f), glm::vec3(0.5f),
size, size,
density * sphere_volume(size), density * sphere_volume(size),
velocity velocity,
(mode == 0)
); );
break; break;
default: default:
...@@ -298,8 +347,9 @@ int main(int argc, const char **argv) { ...@@ -298,8 +347,9 @@ int main(int argc, const char **argv) {
sim->K = 2.2f; sim->K = 2.2f;
sim->E = 35.0f; sim->E = 35.0f;
sim->gamma = 1.330f; sim->gamma = 1.330f;
sim->mode = SIM_MODE_RANDOM;
resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form); resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
vkcv::shader::GLSLCompiler compiler; vkcv::shader::GLSLCompiler compiler;
...@@ -760,8 +810,11 @@ int main(int argc, const char **argv) { ...@@ -760,8 +810,11 @@ int main(int argc, const char **argv) {
gui.beginGUI(); gui.beginGUI();
ImGui::Begin("Settings"); ImGui::Begin("Settings");
ImGui::BeginGroup();
ImGui::Combo("Mode", &(sim->mode), "Random\0Ordered", 2);
ImGui::Combo("Form", &(sim->form), "Sphere\0Cube", 2); ImGui::Combo("Form", &(sim->form), "Sphere\0Cube", 2);
ImGui::Combo("Type", &(sim->type), "Hyperelastic\0Fluid", 2); ImGui::Combo("Type", &(sim->type), "Hyperelastic\0Fluid", 2);
ImGui::EndGroup();
ImGui::Spacing(); ImGui::Spacing();
...@@ -797,7 +850,7 @@ int main(int argc, const char **argv) { ...@@ -797,7 +850,7 @@ int main(int argc, const char **argv) {
ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f); ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f);
ImGui::SameLine(0.0f, 10.0f); ImGui::SameLine(0.0f, 10.0f);
if (ImGui::Button("Reset##particle_velocity")) { if (ImGui::Button("Reset##particle_velocity")) {
resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form); resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
} }
ImGui::End(); ImGui::End();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment