this works now!

This commit is contained in:
Yggdrasil75
2025-11-19 09:25:03 -05:00
parent 957a6b9505
commit 377c28ec81
2 changed files with 93 additions and 42 deletions

View File

@@ -11,6 +11,6 @@ Pos=588,54
Size=550,680
[Window][Gradient settings]
Pos=173,209
Pos=176,208
Size=721,170

View File

@@ -15,6 +15,14 @@
#include "../imgui/backends/imgui_impl_opengl3.h"
#include <GLFW/glfw3.h>
#include <thread>
#include <atomic>
#include <future>
#include <mutex>
std::mutex m;
std::atomic<bool> isGenerating{false};
std::future<void> generationFuture;
struct AnimationConfig {
int width = 1024;
@@ -179,35 +187,55 @@ bool exportavi(std::vector<frame> frames, AnimationConfig config) {
return success;
}
void mainLogic(float f, int i1, int i2, int i3, int i4){
AnimationConfig config = AnimationConfig(i1, i2, i3, f, i4);
// std::cout << "g2c2175" << std::endl;
void mainLogic(const AnimationConfig& config) {
isGenerating = true;
try {
Grid2 grid = setup(config);
Preview(grid);
std::vector<std::tuple<size_t, Vec2, Vec4>> seeds = pickSeeds(grid,config);
std::vector<frame> frames;
Grid2 grid = setup(config);
// std::cout << "g2c2178" << std::endl;
Preview(grid);
std::vector<std::tuple<size_t, Vec2, Vec4>> seeds = pickSeeds(grid,config);
std::vector<frame> frames;
for (int i = 0; i < config.totalFrames; ++i){
// Check if we should stop the generation
if (!isGenerating) {
std::cout << "Generation cancelled at frame " << i << std::endl;
return;
}
for (int i = 0; i < config.totalFrames; ++i){
expandPixel(grid,config,seeds);
expandPixel(grid,config,seeds);
// Print compression info for this frame
if (i % 10 == 0 ) {
frame bgrframe;
std::cout << "Processing frame " << i + 1 << "/" << config.totalFrames << std::endl;
bgrframe = grid.getGridAsFrame(frame::colormap::BGR);
bgrframe.printCompressionStats();
//(bgrframe, i + 1);
frames.push_back(bgrframe);
//bgrframe.decompress();
//BMPWriter::saveBMP(std::format("output/grayscalesource.{}.bmp", i), bgrframe);
bgrframe.compressFrameLZ78();
// Print compression info for this frame
if (i % 10 == 0 ) {
frame bgrframe;
std::cout << "Processing frame " << i + 1 << "/" << config.totalFrames << std::endl;
bgrframe = grid.getGridAsFrame(frame::colormap::BGR);
bgrframe.printCompressionStats();
frames.push_back(bgrframe);
//bgrframe.decompress();
//BMPWriter::saveBMP(std::format("output/grayscalesource.{}.bmp", i), bgrframe);
bgrframe.compressFrameLZ78();
}
}
exportavi(frames,config);
}
catch (const std::exception& e) {
std::cerr << "errored at: " << e.what() << std::endl;
}
isGenerating = false;
}
exportavi(frames,config);
// Function to cancel ongoing generation
void cancelGeneration() {
if (isGenerating) {
isGenerating = false;
// Wait for the thread to finish (with timeout to avoid hanging)
if (generationFuture.valid()) {
auto status = generationFuture.wait_for(std::chrono::milliseconds(100));
if (status != std::future_status::ready) {
std::cout << "Waiting for generation thread to finish..." << std::endl;
}
}
}
}
static void glfw_error_callback(int error, const char* description)
@@ -287,8 +315,13 @@ int main() {
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
static float f = 30.0f;
static int i1 = 1024;
static int i2 = 1024;
static int i3 = 480;
static int i4 = 8;
std::future<void> mainlogicthread;
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
@@ -299,27 +332,37 @@ int main() {
{
static float f = 30.0f;
static int i1 = 1024;
static int i2 = 1024;
static int i3 = 480;
static int i4 = 8;
ImGui::Begin("Gradient settings"); // Create a window called "Hello, world!" and append into it.
ImGui::Begin("Gradient settings");
//ImGui::Text(""); // Display some text (you can use a format strings too)
//ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
//ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("fps", &f, 20.0f, 60.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("fps", &f, 20.0f, 60.0f);
ImGui::SliderInt("width", &i1, 256, 4096);
ImGui::SliderInt("height", &i2, 256, 4096);
ImGui::SliderInt("framecount", &i3, 10, 5000);
ImGui::SliderInt("numSeeds", &i4, 0, 10);
if (ImGui::Button("Generate Animation")) // Buttons return true when clicked (most widgets return true when edited/activated)
mainLogic(f,i1,i2,i3,i4);
ImGui::SameLine();
// Disable button while generating
if (isGenerating) {
ImGui::BeginDisabled();
}
if (ImGui::Button("Generate Animation")) {
AnimationConfig config = AnimationConfig(i1, i2, i3, f, i4);
mainlogicthread = std::async(std::launch::async, mainLogic, config);
}
if (isGenerating) {
ImGui::EndDisabled();
// Show cancel button and progress indicator
ImGui::SameLine();
if (ImGui::Button("Cancel")) {
cancelGeneration();
}
// Optional: Show a progress indicator
ImGui::Text("Generating...");
}
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
ImGui::End();
}
@@ -334,8 +377,16 @@ int main() {
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
//mainlogicthread.join();
}
//ImGui::End();
cancelGeneration();
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
FunctionTimer::printStats(FunctionTimer::Mode::ENHANCED);
return 0;
}