Compare commits

...

13 Commits

Author SHA1 Message Date
f65d1099c2 ci: uploading compiled binary
Some checks failed
Gol CI / build (pull_request) Failing after 3m52s
2026-04-22 11:46:14 +02:00
110ff7ed7e win_compat: Fix backend & file management
All checks were successful
Gol CI / build (push) Successful in 2m42s
This ensure the project builds on windows
2026-04-21 13:46:36 +02:00
0b70772009 README: Adding a preview
All checks were successful
Gol CI / build (push) Successful in 2m29s
2026-04-09 11:25:05 +02:00
2427601120 Update README.md
Some checks failed
Gol CI / build (push) Has been cancelled
2026-04-03 12:23:37 +00:00
c747dab1fc Merge pull request 'Improving CI usage' (#7) from improvin-ci into main
All checks were successful
Gol CI / build (push) Successful in 2m36s
Reviewed-on: #7
2026-04-03 12:16:54 +00:00
4c33da0ecd Merge branch 'main' into improvin-ci
All checks were successful
Gol CI / build (pull_request) Successful in 2m30s
2026-04-03 12:16:31 +00:00
f0284e7975 ci: Run on MR
All checks were successful
Gol CI / build (pull_request) Successful in 2m30s
This also adds the new dependencies
2026-04-03 14:12:23 +02:00
8f62ee83a6 Merge pull request 'Windows compatibility and CI integration' (#6) from lju/windows-compat into main
Some checks failed
Gol CI / build (push) Failing after 1m22s
Reviewed-on: #6
2026-04-03 11:57:27 +00:00
d16319084b ci: Add default build test 2026-04-03 13:56:32 +02:00
46c9bee008 gitignore: Adding windows build directory 2026-04-03 13:56:32 +02:00
1594e663eb project: create the windows toolchain
Some of the code is still linux only
2026-04-03 13:56:32 +02:00
c35097b3d3 Merge pull request 'grid: add a guide grid' (#5) from lju/adding-grid into main
Reviewed-on: #5
2026-01-15 08:14:32 +00:00
384c811a29 grid: add a guide grid 2026-01-15 09:13:53 +01:00
10 changed files with 256 additions and 5 deletions

28
.gitea/workflows/test.yml Normal file
View File

@@ -0,0 +1,28 @@
name: Gol CI
# Run on the merge of a pull request to the main branch
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libgl1-mesa-dev
- name: Build and test
run: |
mkdir build
cd build
cmake ..
make
- uses: actions/upload-artifact@v2
with:
name: gol-linux-build
path: /workspace/lejulien/GameOfLifeEditor/build/GameOfLifeEditor

2
.gitignore vendored
View File

@@ -1,4 +1,6 @@
build
build_linux
build_win
enc_temp_folder
out
_deps

View File

@@ -8,7 +8,8 @@ set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(WIN32)
set(IMGUI_BACKEND "imgui_impl_dx11.cpp") # DirectX 11 for Windows
#set(IMGUI_BACKEND "imgui_impl_dx11.cpp") # DirectX 11 for Windows
set(IMGUI_BACKEND "imgui_impl_opengl3.cpp") # OpenGL for Linux
elseif(APPLE)
set(IMGUI_BACKEND "imgui_impl_metal.mm") # Metal for macOS
elseif(UNIX)
@@ -69,6 +70,7 @@ include_directories(${imgui_SOURCE_DIR} ${rlImGui_SOURCE_DIR})
set(SRC_CXX_FILES "./src/main.cpp"
"./src/rules.cpp"
"./src/world.cpp"
"./src/grid.cpp"
"./src/render.cpp"
"./src/control_menu.cpp"
"./src/settings_menu.cpp"
@@ -90,3 +92,25 @@ add_executable(${NAME} ${SRC_CXX_FILES})
# Link raylib and raylib-cpp
target_link_libraries(${NAME} PUBLIC raylib nlohmann_json::nlohmann_json)
# Windows cross-compilation rule
if (NOT DEFINED CMAKE_CROSSCOMPILE_WINDOWS_HELPER_ADDED)
set(CMAKE_CROSSCOMPILE_WINDOWS_HELPER_ADDED TRUE)
set(WIN_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/toolchain-mingw-w64-x86_64.cmake" CACHE PATH "Toolchain for Win x86_64")
add_custom_target(cmake-win
COMMAND ${CMAKE_COMMAND} -E echo "Configuring Windows x86_64 build in: ${CMAKE_SOURCE_DIR}/build-win-x86_64"
COMMAND ${CMAKE_COMMAND}
-S ${CMAKE_SOURCE_DIR}
-B ${CMAKE_SOURCE_DIR}/build-win-x86_64
-G "Ninja"
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_TOOLCHAIN_FILE=${WIN_TOOLCHAIN_FILE}
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_SOURCE_DIR}/build-win-x86_64 -- -v
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Configure & build for Windows x86_64 (MinGW-w64)"
VERBATIM
)
endif()

View File

@@ -2,10 +2,16 @@
This is a simple Game Of Life editor written in C++ with raylib & dearImGUI
***
---
![preview](preview.png)
---
## How to compile the project
### Linux
Ensure you have g++, cmake and the dependencies of raylib
```shell
@@ -15,4 +21,17 @@ cmake ..
make
```
> As for now I will not make this program Windows compatible.
### Windows
If you're compiling for windows on linux, you can use mingw-w64
```shell
sudo apt install mingw-w64
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-ming-w64-x86_64.cmake
make
```
If you're compiling for windows on windows, use your usual cmake workflow

28
includes/grid.hpp Normal file
View File

@@ -0,0 +1,28 @@
/*
* File name: grid.hpp
* Author: lejulien
* Date created: 01-01-1970 00:59:59
// Date modified: 12-01-2026 21:30:10
* ------
*/
#pragma once
#include <context.hpp>
#include <memory>
#include <settings_menu.hpp>
#include <world.hpp>
namespace gol {
class Grid {
public:
Grid(std::shared_ptr<ctx>);
~Grid() = default;
void display();
private:
std::shared_ptr<ctx> context_;
};
}; // namespace gol

BIN
preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

27
src/grid.cpp Normal file
View File

@@ -0,0 +1,27 @@
/*
* File name: grid.cpp
* Author: lejulien
* Date created: 01-01-1970 00:59:59
// Date modified: 12-01-2026 21:30:10
* ------
*/
#include <raylib.h>
#include <grid.hpp>
namespace gol {
Grid::Grid(std::shared_ptr<ctx> context) : context_(context) {}
void Grid::display() {
auto cell_size = context_->settings_menu->getCellSize();
for (int j = 0; j < context_->world->getHeight(); j++) {
for (int i = 0; i < context_->world->getWidth(); i++) {
DrawRectangleLines(i * cell_size, j * cell_size, cell_size, cell_size,
GRAY);
}
}
}
} // namespace gol

View File

@@ -6,11 +6,84 @@
* ------
*/
#if defined(_WIN32)
// Prevent windows.h from defining many symbols that clash with raylib
#define NOGDICAPMASKS
#define NOVIRTUALKEYCODES
#define NOWINMESSAGES
#define NOWINSTYLES
#define NOSYSMETRICS
#define NOMENUS
#define NOICONS
#define NOKEYSTATES
#define NOSYSCOMMANDS
#define NORASTEROPS
#define NOSHOWWINDOW
#define OEMRESOURCE
#define NOATOM
#define NOCLIPBOARD
#define NOCOLOR
#define NOCTLMGR
#define NODRAWTEXT
#define NOGDI
#define NOKERNEL
#define NOUSER
#define NOMB
#define NOMEMMGR
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NOOPENFILE
#define NOSCROLL
#define NOSERVICE
#define NOSOUND
#define NOTEXTMETRIC
#define NOWH
#define NOWINOFFSETS
#define NOCOMM
#define NOKANJI
#define NOHELP
#define NOPROFILER
#define NODEFERWINDOWPOS
#define NOMCX
// Some code expects LPMSG; provide minimal typedef before windows.h
typedef struct tagMSG *LPMSG;
#include <windows.h>
#undef PlaySound
// Define a minimal BITMAPINFOHEADER if needed by downstream code
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
#include <objbase.h>
#include <mmreg.h>
#include <mmsystem.h>
#if defined(_MSC_VER) || defined(__TINYC__)
#include "propidl.h"
#endif
#else
#include <unistd.h>
#endif
#include <fstream>
#include <iostream>
#include <unistd.h>
#include <nlohmann/json.hpp>
#include <nlohmann/json.hpp>
#include <imgui.h>
#include <raylib.h>
#include <rlImGui.h>
@@ -26,6 +99,7 @@
#include <selection.hpp>
#include <paterns_menu.hpp>
#include <patern_preview.hpp>
#include <grid.hpp>
int main(int ac, char **av) {
std::shared_ptr<gol::ctx> context = std::make_shared<gol::ctx>();
@@ -85,11 +159,31 @@ int main(int ac, char **av) {
// Get program directory
char path_buf[1024];
#if defined(_WIN32)
std::wstring wbuf;
DWORD size = MAX_PATH;
for (;;) {
wbuf.resize(size);
DWORD result = GetModuleFileNameW(NULL, wbuf.data(), size);
if (result == 0) {
std::cerr << "Failed to determine program directory" << std::endl;
return 1;
}
if (result < size) {
wbuf.resize(result);
break;
}
size *= 2;
}
path_buf[0] = '\0';
WideCharToMultiByte(CP_UTF8, 0, wbuf.c_str(), -1, path_buf, sizeof(path_buf), NULL, NULL);
#else
ssize_t len = readlink("/proc/self/exe", path_buf, sizeof(path_buf)-1);
if (len == -1) {
std::cerr << "Failed to determine program directory" << std::endl;
return 1;
}
#endif
context->program_dir = std::filesystem::path(path_buf).parent_path();
InitWindow(context->config_json["screen_width"], context->config_json["screen_height"],
@@ -109,6 +203,7 @@ int main(int ac, char **av) {
context->selection = std::make_shared<gol::Selection>(context);
context->paterns_menu = std::make_shared<gol::PaternsMenu>(context);
context->patern_preview = std::make_shared<gol::PaternPreview>(context);
gol::Grid grid(context);
// Speed handling values
float sim_speed = 1.0f;
@@ -155,6 +250,7 @@ int main(int ac, char **av) {
}
BeginDrawing();
ClearBackground(BLACK);
grid.display();
context->render->display(context->world);
context->selection->display();
context->patern_preview->display();

View File

@@ -35,8 +35,14 @@ void PaternsMenu::refresh() {
std::filesystem::directory_iterator(paterns_path)) {
if (!std::filesystem::is_directory(entry) &&
entry.path().has_filename()) {
#if defined(_WIN32)
paterns_paths_list_[entry.path().filename().string()] =
entry.path().string();
paterns_name_list_.push_back(entry.path().filename().string());
#else
paterns_paths_list_[entry.path().filename()] = entry.path();
paterns_name_list_.push_back(entry.path().filename());
#endif
}
}
}

View File

@@ -0,0 +1,21 @@
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_CROSSCOMPILING TRUE)
set(MINGW_TRIPLET "x86_64-w64-mingw32")
set(CMAKE_C_COMPILER ${MINGW_TRIPLET}-gcc)
set(CMAKE_CXX_COMPILER ${MINGW_TRIPLET}-g++)
set(CMAKE_RC_COMPILER ${MINGW_TRIPLET}-windres)
set(CMAKE_AR ${MINGW_TRIPLET}-ar)
set(CMAKE_RANLIB ${MINGW_TRIPLET}-ranlib)
set(CMAKE_OBJCOPY ${MINGW_TRIPLET}-objcopy)
set(CMAKE_FIND_ROOT_PATH /usr/${MINGW_TRIPLET})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_C_FLAGS_INIT "-static -static-libgcc -static-libstdc++")
set(CMAKE_CXX_FLAGS_INIT "-static -static-libgcc -static-libstdc++")