diff --git a/src/Main.cpp b/src/Main.cpp index bf99552..26f9c03 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -7,12 +7,72 @@ #include "Shader.h" #include +#include 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 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& 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 distrib(0, 1); + + // scale, rotation, shear, translation + + std::vector 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 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"); @@ -211,7 +301,6 @@ int main() { // { // std::cout << "\t" << positions[i * 3] << " " << positions[i * 3 + 1] << " " << positions[i * 3 + 2] << "\n"; // } - fps++; }