This commit is contained in:
Yggdrasil75
2025-11-19 11:00:42 -05:00
parent 8384bd044a
commit 8a2f41c45f

View File

@@ -14,6 +14,7 @@
#include "../imgui/backends/imgui_impl_glfw.h" #include "../imgui/backends/imgui_impl_glfw.h"
#include "../imgui/backends/imgui_impl_opengl3.h" #include "../imgui/backends/imgui_impl_opengl3.h"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include "../stb/stb_image.h"
#include <thread> #include <thread>
#include <atomic> #include <atomic>
@@ -24,6 +25,11 @@ std::mutex m;
std::atomic<bool> isGenerating{false}; std::atomic<bool> isGenerating{false};
std::future<void> generationFuture; std::future<void> generationFuture;
std::mutex previewMutex;
std::atomic<bool> updatePreview{false};
frame currentPreviewFrame;
GLuint previewTexture = 0;
struct AnimationConfig { struct AnimationConfig {
int width = 1024; int width = 1024;
int height = 1024; int height = 1024;
@@ -50,7 +56,7 @@ Grid2 setup(AnimationConfig config) {
return grid; return grid;
} }
void Preview(Grid2 grid) { void Preview(Grid2& grid) {
TIME_FUNCTION; TIME_FUNCTION;
int width; int width;
int height; int height;
@@ -63,6 +69,14 @@ void Preview(Grid2 grid) {
} }
} }
void livePreview(GLFWwindow* window, Grid2& grid) {
// frame Frame = grid.getGridAsFrame(frame::colormap::RGB);
// int image_width = Frame.getWidth();
// int image_height = Frame.getHeight();
// auto data = reinterpret_cast<char*>(Frame.getData());
// uint8_t* image_data = stbi_load_from_memory((const unsigned char*)data, (int)data.size(), &image_width, &image_height, 3, 4);
}
std::vector<std::tuple<size_t, Vec2, Vec4>> pickSeeds(Grid2 grid, AnimationConfig config) { std::vector<std::tuple<size_t, Vec2, Vec4>> pickSeeds(Grid2 grid, AnimationConfig config) {
TIME_FUNCTION; TIME_FUNCTION;
std::random_device rd; std::random_device rd;
@@ -187,12 +201,12 @@ bool exportavi(std::vector<frame> frames, AnimationConfig config) {
return success; return success;
} }
void mainLogic(const AnimationConfig& config) { void mainLogic(const AnimationConfig& config, Grid2& grid) {
isGenerating = true; isGenerating = true;
try { try {
Grid2 grid = setup(config); grid = setup(config);
Preview(grid); Preview(grid);
std::vector<std::tuple<size_t, Vec2, Vec4>> seeds = pickSeeds(grid,config); std::vector<std::tuple<size_t, Vec2, Vec4>> seeds = pickSeeds(grid, config);
std::vector<frame> frames; std::vector<frame> frames;
for (int i = 0; i < config.totalFrames; ++i){ for (int i = 0; i < config.totalFrames; ++i){
@@ -322,6 +336,7 @@ int main() {
static int i4 = 8; static int i4 = 8;
std::future<void> mainlogicthread; std::future<void> mainlogicthread;
Grid2 grid;
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
glfwPollEvents(); glfwPollEvents();
@@ -329,8 +344,6 @@ int main() {
ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame(); ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame(); ImGui::NewFrame();
{ {
ImGui::Begin("Gradient settings"); ImGui::Begin("Gradient settings");
@@ -348,7 +361,7 @@ int main() {
if (ImGui::Button("Generate Animation")) { if (ImGui::Button("Generate Animation")) {
AnimationConfig config = AnimationConfig(i1, i2, i3, f, i4); AnimationConfig config = AnimationConfig(i1, i2, i3, f, i4);
mainlogicthread = std::async(std::launch::async, mainLogic, config); mainlogicthread = std::async(std::launch::async, mainLogic, config, std::ref(grid));
} }
if (isGenerating) { if (isGenerating) {
@@ -367,6 +380,43 @@ int main() {
ImGui::End(); ImGui::End();
} }
// ImGui::NewFrame();
// {
// ImGui::Begin("Live Preview");
// if (previewTexture != 0) {
// // Get available space
// ImVec2 availableSize = ImGui::GetContentRegionAvail();
// // Maintain aspect ratio (assuming square or config width/height)
// float aspectRatio = static_cast<float>(currentPreviewFrame.getWidth()) /
// static_cast<float>(currentPreviewFrame.getHeight());
// ImVec2 imageSize;
// if (availableSize.x / aspectRatio <= availableSize.y) {
// imageSize.x = availableSize.x;
// imageSize.y = availableSize.x / aspectRatio;
// } else {
// imageSize.y = availableSize.y;
// imageSize.x = availableSize.y * aspectRatio;
// }
// ImGui::Image((ImTextureID)(intptr_t)previewTexture, imageSize);
// ImGui::Text("Frame: %dx%d", currentPreviewFrame.getWidth(), currentPreviewFrame.getHeight());
// if (isGenerating) {
// ImGui::TextColored(ImVec4(0, 1, 0, 1), "Generating...");
// } else {
// ImGui::Text("Ready");
// }
// } else {
// ImGui::Text("No preview available");
// ImGui::Text("Start generation to see live preview");
// }
// ImGui::End();
// }
ImGui::Render(); ImGui::Render();
int display_w, display_h; int display_w, display_h;
@@ -386,6 +436,10 @@ int main() {
ImGui::DestroyContext(); ImGui::DestroyContext();
glfwDestroyWindow(window); glfwDestroyWindow(window);
if (previewTexture != 0) {
glDeleteTextures(1, &previewTexture);
previewTexture = 0;
}
glfwTerminate(); glfwTerminate();
FunctionTimer::printStats(FunctionTimer::Mode::ENHANCED); FunctionTimer::printStats(FunctionTimer::Mode::ENHANCED);
return 0; return 0;