gonna work on this more later. adding a fluid sim, gonna use it to create the planet by spawning in heavy particles and then slowly lighter and smaller over time until a sphere is formed.
This commit is contained in:
83
util/sim/fluidsim.cpp
Normal file
83
util/sim/fluidsim.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <cmath>
|
||||
#include <random>
|
||||
#include <algorithm>
|
||||
|
||||
#include "../util/grid/grid3eigen.hpp"
|
||||
#include "../util/output/bmpwriter.hpp"
|
||||
#include "../util/output/frame.hpp"
|
||||
#include "../util/timing_decorator.cpp"
|
||||
#include "../util/noise/pnoise2.hpp"
|
||||
#include "../util/noise/pnoise.cpp"
|
||||
#include "../util/output/aviwriter.hpp"
|
||||
|
||||
#include "../imgui/imgui.h"
|
||||
#include "../imgui/backends/imgui_impl_glfw.h"
|
||||
#include "../imgui/backends/imgui_impl_opengl3.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
#include "../stb/stb_image.h"
|
||||
|
||||
|
||||
struct fluidParticle {
|
||||
Eigen::Matrix<float, 3, 1> pos;
|
||||
Eigen::Matrix<float, 3, 1> velocity;
|
||||
Eigen::Matrix<float, 3, 1> acceleration;
|
||||
Eigen::Matrix<float, 3, 1> forceAccumulator;
|
||||
float pressure;
|
||||
float viscosity;
|
||||
float restitution;
|
||||
float mass;
|
||||
};
|
||||
|
||||
struct gridDefaults {
|
||||
float gridSizeCube = 1024;
|
||||
};
|
||||
|
||||
Eigen::Matrix<float, 3, 1> posGen() {
|
||||
static std::random_device rd;
|
||||
static std::mt19937 gen(rd());
|
||||
static std::normal_distribution<float> dist(0.0f, 1024.0f);
|
||||
|
||||
return Eigen::Matrix<float, 3, 1>(
|
||||
dist(gen),
|
||||
dist(gen),
|
||||
dist(gen)
|
||||
);
|
||||
}
|
||||
class fluidSim {
|
||||
std::unordered_map<size_t, Eigen::Matrix<float, 3, 1>> idposMap;
|
||||
Octree<fluidParticle> grid;
|
||||
|
||||
void spawnParticles(fluidParticle toSpawn, int count) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
Eigen::Matrix<float, 3, 1> pos = posGen();
|
||||
grid.set(toSpawn, pos, true, {toSpawn.mass / 1000, toSpawn.mass / 1000, toSpawn.mass / 1000}, 1, true, 1, false);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void applyPhysics() {
|
||||
for (auto& meh : idposMap) {
|
||||
std::shared_ptr<Octree<fluidParticle>::NodeData> mehdata = grid.find(meh.second);
|
||||
std::vector<std::shared_ptr<Octree<fluidParticle>::NodeData>> neighbors = grid.findInRadius(meh.second, mehdata->data.mass);
|
||||
///TODO:
|
||||
// apply velocity to have particle move
|
||||
// use mass of neighboring particles to change direction towards them
|
||||
// ressure pushes particles away if they are too close
|
||||
// resitution controls how much pressure builds up based on how close particles are
|
||||
// have to find a way to have a clump use their combined mass instead of individual mass.
|
||||
//if a particle leaves the grid, destroy it and spawn a new one
|
||||
|
||||
for (auto& neighbor : neighbors) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user