Skip to content

Commit 39addbd

Browse files
committed
feat: wire module switching, toolbar callbacks and fix Windows build
1 parent fcdab14 commit 39addbd

16 files changed

Lines changed: 241 additions & 119 deletions

CMakeLists.txt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,26 @@ FetchContent_Declare(
1515
FetchContent_MakeAvailable(googletest)
1616

1717
find_package(OpenGL QUIET)
18-
find_package(GLFW3 3.4 QUIET)
18+
19+
# Try vcpkg config-mode first (when toolchain is active), then fall back to custom finders
20+
find_package(glfw3 CONFIG QUIET)
21+
if(glfw3_FOUND AND NOT TARGET GLFW3::GLFW3)
22+
add_library(GLFW3::GLFW3 ALIAS glfw)
23+
set(GLFW3_FOUND TRUE)
24+
else()
25+
find_package(GLFW3 3.4 QUIET)
26+
endif()
27+
1928
find_package(GLAD QUIET)
2029
find_package(ImGui QUIET)
2130

2231
add_library(convoy_core)
23-
target_include_directories(convoy_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
32+
target_include_directories(convoy_core PUBLIC
33+
${CMAKE_CURRENT_SOURCE_DIR}/src
34+
${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui
35+
${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui/backends
36+
${CMAKE_CURRENT_SOURCE_DIR}/third_party/glad/include
37+
)
2438

2539
if(GLFW3_FOUND AND OpenGL_FOUND AND GLAD_FOUND AND ImGui_FOUND)
2640
target_sources(convoy_core PRIVATE
@@ -29,13 +43,13 @@ if(GLFW3_FOUND AND OpenGL_FOUND AND GLAD_FOUND AND ImGui_FOUND)
2943
src/core/ui/theme_manager.cpp
3044
src/core/ui/dockspace_manager.cpp
3145
src/core/ui/main_menu_bar.cpp
46+
src/core/ui/export_wizard.cpp
47+
src/core/ui/preferences_window.cpp
48+
src/core/ui/pressure_curve_editor.cpp
49+
src/core/ui/new_project_dialog.cpp
3250
src/core/input/input_handler.cpp
3351
src/core/gfx/render_texture.cpp
34-
)
35-
target_include_directories(convoy_core PRIVATE
36-
${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui
37-
${CMAKE_CURRENT_SOURCE_DIR}/third_party/imgui/backends
38-
${CMAKE_CURRENT_SOURCE_DIR}/third_party/glad/include
52+
src/core/keybind_manager.cpp
3953
)
4054
target_link_libraries(convoy_core PUBLIC
4155
GLFW3::GLFW3
@@ -46,6 +60,7 @@ if(GLFW3_FOUND AND OpenGL_FOUND AND GLAD_FOUND AND ImGui_FOUND)
4660
target_compile_definitions(convoy_core PRIVATE
4761
GLFW_INCLUDE_NONE
4862
IMGUI_IMPL_OPENGL_LOADER_GLAD
63+
_CRT_SECURE_NO_WARNINGS
4964
)
5065
else()
5166
target_sources(convoy_core PRIVATE src/core/event_bus.cpp)
@@ -59,6 +74,8 @@ target_sources(convoy_core PRIVATE
5974
src/core/plugins/plugin_registry.cpp
6075
src/core/plugins/hook_system.cpp
6176
src/core/export/caf_exporter.cpp
77+
src/core/settings_config.cpp
78+
src/core/project_template.cpp
6279
src/shared/brush.cpp
6380
)
6481

build.bat

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
@echo off
2+
set CONFIG=Release
3+
if "%1"=="Debug" set CONFIG=Debug
4+
if "%1"=="debug" set CONFIG=Debug
5+
6+
where cmake >nul 2>&1
7+
if not %errorlevel%==0 set "PATH=C:\Program Files\CMake\bin;%PATH%"
8+
9+
cmake --version >nul 2>&1
10+
if not %errorlevel%==0 (
11+
echo [ERROR] CMake not found
12+
pause
13+
exit /b 1
14+
)
15+
16+
echo.
17+
echo Building Convoy - %CONFIG%
18+
echo.
19+
20+
if not exist "build" mkdir build
21+
cd build
22+
23+
echo [CONFIGURE] Running CMake...
24+
cmake .. -DCMAKE_BUILD_TYPE=%CONFIG% -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static-md
25+
26+
if errorlevel 1 (
27+
echo [ERROR] CMake configure failed, wiping cache and retrying...
28+
cd ..
29+
rmdir /s /q build 2>nul
30+
mkdir build
31+
cd build
32+
cmake .. -DCMAKE_BUILD_TYPE=%CONFIG% -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static-md
33+
if errorlevel 1 (
34+
echo [ERROR] CMake configure failed
35+
pause
36+
exit /b 1
37+
)
38+
)
39+
40+
echo [BUILD] Compiling...
41+
cmake --build . --config %CONFIG% --parallel
42+
43+
if errorlevel 1 (
44+
echo [ERROR] Build failed
45+
pause
46+
exit /b 1
47+
)
48+
49+
echo.
50+
echo [SUCCESS] Build complete!
51+
echo Executable: build\Release\Convoy.exe
52+
pause

build.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
set -e
3+
4+
CONFIG="${1:-Release}"
5+
6+
echo "========================================"
7+
echo "Building Convoy - $CONFIG"
8+
echo "========================================"
9+
10+
if [ ! -d "build" ]; then
11+
echo "[CREATE] Creating build directory..."
12+
mkdir -p build
13+
fi
14+
15+
cd build
16+
17+
if command -v nproc &> /dev/null; then
18+
CORES=$(nproc)
19+
elif command -v sysctl &> /dev/null; then
20+
CORES=$(sysctl -n hw.ncpu)
21+
else
22+
CORES=4
23+
fi
24+
25+
echo "[CONFIGURE] Running CMake..."
26+
cmake .. -DCMAKE_BUILD_TYPE="$CONFIG"
27+
28+
echo "[BUILD] Compiling ($CORES cores)..."
29+
cmake --build . --config "$CONFIG" --parallel "$CORES"
30+
31+
echo ""
32+
echo "========================================"
33+
echo "[SUCCESS] Build complete!"
34+
echo "========================================"
35+
echo ""
36+
echo "Executable: build/Convoy"

src/convoy/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include "core/window_manager.h"
55

6-
int main(int argc, char* argv[])
6+
int main(int /*argc*/, char* /*argv*/[])
77
{
88
try
99
{

src/core/plugins/plugin_interface.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ class IBrushPlugin : public IConvoyPlugin
3535
virtual void on_stroke_update(float x, float y, float pressure) = 0;
3636
virtual void on_stroke_end() = 0;
3737

38-
virtual std::vector<uint8_t> generate_mask(int size, float pressure, float angle) const { return {}; }
38+
virtual std::vector<uint8_t> generate_mask(int size, float pressure, float angle) const {
39+
(void)size; (void)pressure; (void)angle;
40+
return {};
41+
}
3942

4043
virtual BrushShape get_shape() const { return BrushShape::Custom; }
4144

src/core/ui/dockspace_manager.cpp

Lines changed: 38 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,15 @@ void DockSpaceManager::begin_frame() {
1919
ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse |
2020
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove |
2121
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus |
22-
ImGuiWindowFlags_NoBackground;
22+
ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoInputs;
2323

2424
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
2525
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
2626
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
2727
ImGui::Begin("##ConvoyShell", nullptr, flags);
2828
ImGui::PopStyleVar(3);
2929

30-
if (!initialized_) {
31-
build_initial_layout();
32-
}
30+
render_snap_zone_overlays();
3331
}
3432

3533
void DockSpaceManager::end_frame() {
@@ -38,92 +36,33 @@ void DockSpaceManager::end_frame() {
3836

3937
ImGuiID DockSpaceManager::get_zone_id(DockZone zone) const {
4038
switch (zone) {
41-
case DockZone::Toolbar: return zone_toolbar_;
42-
case DockZone::Canvas: return zone_canvas_;
39+
case DockZone::Toolbar: return zone_toolbar_;
40+
case DockZone::Canvas: return zone_canvas_;
4341
case DockZone::Inspector: return zone_inspect_;
44-
case DockZone::Bottom: return zone_bottom_;
42+
case DockZone::Bottom: return zone_bottom_;
4543
}
4644
return 0;
4745
}
4846

4947
void DockSpaceManager::build_initial_layout() {
50-
ImGuiID main_id = ImGui::GetMainViewport()->ID;
51-
ImGui::DockBuilderRemoveNode(main_id);
52-
ImGui::DockBuilderAddNode(main_id, ImGuiDockNodeFlags_DockSpace);
53-
root_id_ = main_id;
54-
55-
build_artisan_layout();
48+
current_preset_ = LayoutPreset::Artisan;
5649
initialized_ = true;
5750
}
5851

5952
void DockSpaceManager::build_artisan_layout() {
60-
ImGuiID remaining = root_id_;
61-
62-
ImGuiID id_right = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Right, 0.20f, nullptr, &remaining);
63-
ImGuiID id_left = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Left, 0.10f, nullptr, &remaining);
64-
ImGuiID id_bottom = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Down, 0.15f, nullptr, &remaining);
65-
66-
ImGui::DockBuilderDockWindow("Architect", remaining);
67-
ImGui::DockBuilderDockWindow("Inspector", id_right);
68-
ImGui::DockBuilderDockWindow("Toolbar", id_left);
69-
ImGui::DockBuilderDockWindow("Console", id_bottom);
70-
71-
ImGui::DockBuilderFinish(root_id_);
72-
73-
zone_toolbar_ = id_left;
74-
zone_canvas_ = remaining;
75-
zone_inspect_ = id_right;
76-
zone_bottom_ = id_bottom;
7753
current_preset_ = LayoutPreset::Artisan;
7854
}
7955

8056
void DockSpaceManager::build_level_design_layout() {
81-
ImGui::DockBuilderRemoveNode(root_id_);
82-
ImGui::DockBuilderAddNode(root_id_, ImGuiDockNodeFlags_DockSpace);
83-
84-
ImGuiID remaining = root_id_;
85-
86-
ImGuiID id_left = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Left, 0.20f, nullptr, &remaining);
87-
ImGuiID id_right = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Right, 0.20f, nullptr, &remaining);
88-
89-
ImGui::DockBuilderDockWindow("Layers", id_left);
90-
ImGui::DockBuilderDockWindow("Canvas", remaining);
91-
ImGui::DockBuilderDockWindow("Tiles", id_right);
92-
93-
ImGui::DockBuilderFinish(root_id_);
94-
95-
zone_toolbar_ = id_left;
96-
zone_canvas_ = remaining;
97-
zone_inspect_ = id_right;
98-
zone_bottom_ = 0;
9957
current_preset_ = LayoutPreset::LevelDesign;
10058
}
10159

10260
void DockSpaceManager::build_debugging_layout() {
103-
ImGui::DockBuilderRemoveNode(root_id_);
104-
ImGui::DockBuilderAddNode(root_id_, ImGuiDockNodeFlags_DockSpace);
105-
106-
ImGuiID remaining = root_id_;
107-
108-
ImGuiID id_bottom = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Down, 0.30f, nullptr, &remaining);
109-
ImGuiID id_right = ImGui::DockBuilderSplitNode(remaining, ImGuiDir_Right, 0.25f, nullptr, &remaining);
110-
111-
ImGui::DockBuilderDockWindow("Canvas", remaining);
112-
ImGui::DockBuilderDockWindow("Properties", id_right);
113-
ImGui::DockBuilderDockWindow("Console", id_bottom);
114-
115-
ImGui::DockBuilderFinish(root_id_);
116-
117-
zone_toolbar_ = 0;
118-
zone_canvas_ = remaining;
119-
zone_inspect_ = id_right;
120-
zone_bottom_ = id_bottom;
12161
current_preset_ = LayoutPreset::Debugging;
12262
}
12363

12464
void DockSpaceManager::switch_preset(LayoutPreset preset) {
12565
if (current_preset_ == preset) return;
126-
12766
switch (preset) {
12867
case LayoutPreset::Artisan: build_artisan_layout(); break;
12968
case LayoutPreset::LevelDesign: build_level_design_layout(); break;
@@ -142,4 +81,35 @@ void DockSpaceManager::load_layout() {
14281
initialized_ = false;
14382
}
14483

145-
} // namespace
84+
void DockSpaceManager::render_snap_zone_overlays() {
85+
if (!show_snap_zones_) return;
86+
87+
ImGuiViewport* vp = ImGui::GetMainViewport();
88+
float menu_h = ImGui::GetFrameHeight();
89+
float x0 = vp->WorkPos.x;
90+
float y0 = vp->WorkPos.y + menu_h;
91+
float w = vp->WorkSize.x;
92+
float h = vp->WorkSize.y - menu_h;
93+
94+
float toolbar_w = w * 0.10f;
95+
float inspector_w = w * 0.20f;
96+
float bottom_h = h * 0.15f;
97+
98+
ImU32 zone_col = IM_COL32(64, 160, 255, 140);
99+
ImU32 label_col = IM_COL32(64, 160, 255, 210);
100+
101+
ImDrawList* dl = ImGui::GetForegroundDrawList();
102+
float t = 2.0f;
103+
104+
dl->AddRect({x0, y0}, {x0 + toolbar_w, y0 + h - bottom_h}, zone_col, 0.0f, 0, t);
105+
dl->AddRect({x0 + toolbar_w, y0}, {x0 + w - inspector_w, y0 + h - bottom_h}, zone_col, 0.0f, 0, t);
106+
dl->AddRect({x0 + w - inspector_w, y0}, {x0 + w, y0 + h - bottom_h}, zone_col, 0.0f, 0, t);
107+
dl->AddRect({x0, y0 + h - bottom_h}, {x0 + w, y0 + h}, zone_col, 0.0f, 0, t);
108+
109+
dl->AddText({x0 + 4, y0 + 4}, label_col, "Toolbar");
110+
dl->AddText({x0 + toolbar_w + 4, y0 + 4}, label_col, "Canvas");
111+
dl->AddText({x0 + w - inspector_w + 4, y0 + 4}, label_col, "Inspector");
112+
dl->AddText({x0 + 4, y0 + h - bottom_h + 4}, label_col, "Console");
113+
}
114+
115+
} // namespace convoy

0 commit comments

Comments
 (0)