small-projects/cpp-voxel-engine/main.cpp

94 lines
2.3 KiB
C++
Raw Normal View History

2025-04-06 02:03:23 +00:00
#include <iostream>
2025-04-06 02:09:28 +00:00
#include <GL/glew.h>
2025-04-06 02:03:23 +00:00
#include <GLFW/glfw3.h>
#include "VoxelGame.h"
// ImGui headers (make sure these files are available in your include path)
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
// Initialize GLFW and create a window
GLFWwindow* initWindow(int width, int height, const char* title) {
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW\n";
return nullptr;
}
// Request OpenGL 3.3 Core Profile
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(width, height, title, nullptr, nullptr);
if (!window) {
std::cerr << "Failed to create GLFW window\n";
glfwTerminate();
return nullptr;
}
glfwMakeContextCurrent(window);
2025-04-06 02:09:28 +00:00
2025-04-06 02:03:23 +00:00
return window;
}
int main() {
GLFWwindow* window = initWindow(800, 600, "Voxel Game");
if (!window)
return -1;
// Setup ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO &io = ImGui::GetIO();
(void)io;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 330");
// Create game instance and initialize it
VoxelGame game;
if (!game.init()) {
std::cerr << "Failed to initialize game\n";
return -1;
}
// Main loop
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
// Update game logic (assume fixed deltaTime for demo)
game.update(0.016f);
// Start new ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// Draw debug UI from game
game.debugUI();
ImGui::Render();
// Clear the screen
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Render the voxel game (mesh drawing, etc.)
game.render();
// Render ImGui on top
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
// Cleanup ImGui and GLFW
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}