From 2112a7b3a1be9319ce8c5cf7caf51db84279ba58 Mon Sep 17 00:00:00 2001 From: Safariminer <74744603+Safariminer@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:05:01 -0400 Subject: [PATCH] Got fully 3D sectors now. And can glue them now. --- ProjectMorault/main.cpp | 220 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 211 insertions(+), 9 deletions(-) diff --git a/ProjectMorault/main.cpp b/ProjectMorault/main.cpp index 43d2dbb..d0150c4 100644 --- a/ProjectMorault/main.cpp +++ b/ProjectMorault/main.cpp @@ -5,11 +5,12 @@ #include "Morault_Map.h" #include #include +#include #define MORAULT_MAP_RENDER_SCALE 0.1f typedef enum { - NONE, + NONE = 0, GAME, EDITOR } EngineState; @@ -17,10 +18,14 @@ typedef enum { typedef enum { NA, A, B, C } SectorTriangleSelection; +typedef enum { + NOLINE, AB, BC, CA +} SectorLineSelection; struct EditorSelection { int sector; SectorTriangleSelection point; + SectorLineSelection line; }; int main(int argc, char** argv) { InitWindow(1280, 720, "ProjectMorault"); @@ -38,7 +43,8 @@ int main(int argc, char** argv) { bool gamePaused = false; EngineState eState = GAME; - EditorSelection selection = { -1, NA }; + EditorSelection selection = { -1, SectorTriangleSelection::NA, SectorLineSelection::NOLINE }; + bool inSelection = false; Morault::Maps::Map* map = new Morault::Maps::Map(); @@ -85,6 +91,134 @@ int main(int argc, char** argv) { }, RED ); + DrawTriangle3D( + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + RED + ); + + if (map->MapTriangles[i].wallAB != "pms:none") { + DrawTriangle3D({ + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + BLUE + ); + DrawTriangle3D({ + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + BLUE + ); + } + if (map->MapTriangles[i].wallBC != "pms:none") { + DrawTriangle3D({ + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + GREEN + ); + DrawTriangle3D({ + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + GREEN + ); + } + if (map->MapTriangles[i].wallCA != "pms:none") { + DrawTriangle3D({ + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + PURPLE + ); + DrawTriangle3D({ + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + PURPLE + ); + } + } @@ -95,12 +229,29 @@ int main(int argc, char** argv) { EndDrawing(); } break; case EDITOR: { + if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_J)) { + if (inSelection) { + Vector2 selectedPoint; + if (selection.point == A) selectedPoint = map->MapTriangles[selection.sector].a; + if (selection.point == B) selectedPoint = map->MapTriangles[selection.sector].b; + if (selection.point == C) selectedPoint = map->MapTriangles[selection.sector].c; + for (int i = 0; i < map->MapTriangles.size(); i++) { + if (i != selection.sector) { + + if (Vector2Distance(map->MapTriangles[i].a, selectedPoint) <= 3) map->MapTriangles[i].a = selectedPoint; + if (Vector2Distance(map->MapTriangles[i].b, selectedPoint) <= 3) map->MapTriangles[i].b = selectedPoint; + if (Vector2Distance(map->MapTriangles[i].c, selectedPoint) <= 3) map->MapTriangles[i].c = selectedPoint; + } + } + } + } if (IsKeyPressed(KEY_E)) { eState = GAME; DisableCursor(); } if (IsKeyPressed(KEY_ESCAPE)) { inSelection = false; + selection.line = SectorLineSelection::NOLINE; } if (IsKeyDown(KEY_LEFT_SHIFT)) { if (IsKeyPressed(KEY_N)) { @@ -125,19 +276,62 @@ int main(int argc, char** argv) { for (int i = 0; i < map->MapTriangles.size(); i++) { if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].a, 7)) { inSelection = true; - selection = { i,A }; + selection = { i,A,SectorLineSelection::NOLINE }; } if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].b, 7)) { inSelection = true; - selection = { i,B }; + selection = { i,B,SectorLineSelection::NOLINE }; } if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].c, 7)) { inSelection = true; - selection = { i,C }; + selection = { i,C,SectorLineSelection::NOLINE }; } } } + if (inSelection) { + if (IsKeyDown(KEY_RIGHT_SHIFT) && IsKeyDown(KEY_L)) { + switch (selection.point) { + case A: + if (IsKeyPressed(KEY_B)) { + selection.line = AB; + } + if (IsKeyPressed(KEY_C)) { + selection.line = CA; + } + break; + case B: + if (IsKeyPressed(KEY_A)) { + selection.line = AB; + } + if (IsKeyPressed(KEY_C)) { + selection.line = BC; + } + break; + case C: + if (IsKeyPressed(KEY_B)) { + selection.line = BC; + } + if (IsKeyPressed(KEY_A)) { + selection.line = CA; + } + break; + } + } + } + + if (IsKeyPressed(KEY_T) && selection.line != NOLINE) { + std::cout << "Texture for line " << selection.sector << ":" << (selection.line == AB ? "AB" : selection.line == BC ? "BC" : "CA") << "? (current texture is: " << (selection.line == AB ? map->MapTriangles[selection.sector].wallAB : selection.line == BC ? map->MapTriangles[selection.sector].wallBC : map->MapTriangles[selection.sector].wallCA) << ") >>>"; + + std::string texture; + std::getline(std::cin, texture); + if (texture != "") { + if (selection.line == AB) map->MapTriangles[selection.sector].wallAB = texture; + if (selection.line == BC) map->MapTriangles[selection.sector].wallBC = texture; + if (selection.line == CA) map->MapTriangles[selection.sector].wallCA = texture; + } + } + if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) { if (inSelection) { switch (selection.point) { @@ -159,13 +353,21 @@ int main(int argc, char** argv) { for (int i = 0; i < map->MapTriangles.size(); i++) { DrawTriangleLines(map->MapTriangles[i].a + editorOffset, map->MapTriangles[i].b + editorOffset, map->MapTriangles[i].c + editorOffset, YELLOW); + + DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 3, RED); + DrawText("A", (map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, WHITE); DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 3, RED); + DrawText("B", (map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, WHITE); DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 3, RED); - if(inSelection){ - if (selection.sector == i && selection.point == A) DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, GREEN); - if (selection.sector == i && selection.point == B) DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, GREEN); - if (selection.sector == i && selection.point == C) DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, GREEN); + DrawText("C", (map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, WHITE); + if(inSelection && selection.sector == i){ + if (selection.point == A) DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, GREEN); + if (selection.point == B) DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, GREEN); + if (selection.point == C) DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, GREEN); + if (selection.line == AB) DrawLineEx(map->MapTriangles[i].a + editorOffset, map->MapTriangles[i].b + editorOffset, 4, PURPLE); + if (selection.line == BC) DrawLineEx(map->MapTriangles[i].b + editorOffset, map->MapTriangles[i].c + editorOffset, 4, PURPLE); + if (selection.line == CA) DrawLineEx(map->MapTriangles[i].c + editorOffset, map->MapTriangles[i].a + editorOffset, 4, PURPLE); } }