procedurally generated transformations

This commit is contained in:
2025-11-09 13:28:38 +01:00
parent b5f6e81a7b
commit bd81c632de

View File

@@ -7,12 +7,72 @@
#include "Shader.h"
#include <chrono>
#include <random>
constexpr int WORK_GROUP_SIZE = 64;
constexpr int PARTICLE_COUNT = WORK_GROUP_SIZE * 10000;
constexpr int SWAP_INTERVAL = 1;
constexpr int TRANSFORMATION_COUNT = 3;
static const std::vector<glm::mat4> SIERPINSKI_TRIANGLE = {
{
0.5f,
0.0f,
0.0f,
0.0f,
0.0f,
0.5f,
0.0f,
0.36f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f,
},
{
0.5f,
0.0f,
0.0f,
-0.5f,
0.0f,
0.5f,
0.0f,
-0.5f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f,
},
{
0.5f,
0.0f,
0.0f,
0.5f,
0.0f,
0.5f,
0.0f,
-0.5f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f,
},
};
class Timer {
public:
Timer() {
@@ -44,6 +104,54 @@ static void ErrorCallback(int error, const char* description) {
std::cerr << "Error: " << description << std::endl;
}
static void ApplyTransforms(const std::vector<glm::mat4>& transformations) {
glUseProgram(s_ComputeShader);
glUniformMatrix4fv(1, transformations.size(), true, glm::value_ptr(transformations[0]));
}
static void GenNewFractal() {
std::random_device randomDevice;
std::mt19937 generator(randomDevice());
std::uniform_real_distribution<float> distrib(0, 1);
// scale, rotation, shear, translation
std::vector<glm::mat4> transformations(TRANSFORMATION_COUNT);
for (std::size_t i = 0; i < transformations.size(); i++) {
float scaleX = distrib(generator);
float scaleY = distrib(generator);
float scaleZ = distrib(generator);
float rotX = distrib(generator) * 2 * 3.14;
float rotY = distrib(generator) * 2 * 3.14;
float rotZ = distrib(generator) * 2 * 3.14;
float shearXY = distrib(generator) * 0.2f - 0.1f;
float shearXZ = distrib(generator) * 0.2f - 0.1f;
float shearYX = distrib(generator) * 0.2f - 0.1f;
float shearYZ = distrib(generator) * 0.2f - 0.1f;
float shearZX = distrib(generator) * 0.2f - 0.1f;
float shearZY = distrib(generator) * 0.2f - 0.1f;
float translateX = distrib(generator) * 2.0f - 1.0f;
float translateY = distrib(generator) * 2.0f - 1.0f;
float translateZ = distrib(generator) * 2.0f - 1.0f;
auto scale = glm::scale(glm::mat4(1), {scaleX, scaleY, scaleZ});
auto rotateX = glm::rotate(scale, rotX, {1, 0, 0});
auto rotateY = glm::rotate(rotateX, rotY, {0, 1, 0});
auto rotateZ = glm::rotate(rotateY, rotZ, {0, 0, 1});
auto shear = glm::shear(rotateZ, {0, 0, 0}, {shearXY, shearXZ}, {shearYX, shearYZ}, {shearZX, shearZY});
auto translate = glm::translate(shear, {translateX, translateY, translateZ});
transformations[i] = translate;
}
glUseProgram(s_ComputeShader);
glUniformMatrix4fv(1, transformations.size(), false, glm::value_ptr(transformations[0]));
}
static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
if (action != GLFW_PRESS)
return;
@@ -55,6 +163,11 @@ static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, i
s_ComputeShader = ReloadComputeShader(s_ComputeShader, s_ComputeShaderPath);
s_GraphicsShader = ReloadGraphicsShader(s_GraphicsShader, s_VertexShaderPath, s_FragmentShaderPath);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * PARTICLE_COUNT * 3, nullptr, GL_DYNAMIC_COPY);
ApplyTransforms(SIERPINSKI_TRIANGLE);
}
if (key == GLFW_KEY_T) {
GenNewFractal();
}
}
@@ -140,30 +253,7 @@ int main() {
glBindVertexArray(vertexArray);
std::vector<glm::mat4> transformations = {
{
0.5f, 0.0f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f, 0.36f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
},
{
0.5f, 0.0f, 0.0f, -0.5f,
0.0f, 0.5f, 0.0f, -0.5f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
},
{
0.5f, 0.0f, 0.0f, 0.5f,
0.0f, 0.5f, 0.0f, -0.5f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f,
},
};
glUseProgram(s_ComputeShader);
glUniformMatrix4fv(1, transformations.size(), true, glm::value_ptr(transformations[0]));
ApplyTransforms(SIERPINSKI_TRIANGLE);
while (!glfwWindowShouldClose(window)) {
// ScopedTimer timer("Main Loop");
@@ -212,7 +302,6 @@ int main() {
// std::cout << "\t" << positions[i * 3] << " " << positions[i * 3 + 1] << " " << positions[i * 3 + 2] << "\n";
// }
fps++;
}