#include #include #include "Morault_Resources.h" #include "Morault_Player.h" #include "Morault_Map.h" #include #include #include #define MORAULT_MAP_RENDER_SCALE 0.1f typedef enum { NONE = 0, GAME, EDITOR } EngineState; 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"); SetTargetFPS(60); SetExitKey(0); DisableCursor(); Morault::Gameplay::Player player; player.data.playerName = "TestPlayer0001"; player.data.hp = 100; player.data.xp = 0; bool gamePaused = false; EngineState eState = GAME; EditorSelection selection = { -1, SectorTriangleSelection::NA, SectorLineSelection::NOLINE }; bool inSelection = false; Morault::Maps::Map* map = new Morault::Maps::Map(); { using namespace Morault::Resources; Textures(load("data/textures/test.png")); } Vector2 editorOffset = { 0,0 }; while (!WindowShouldClose()) { switch(eState){ case GAME: { if (IsKeyPressed(KEY_E)) { eState = EDITOR; EnableCursor(); } player.controller.UpdatePlayerController(!gamePaused); BeginDrawing(); ClearBackground(BLACK); BeginMode3D(player.controller.camera); DrawGrid(100, 10); for (int i = 0; i < map->MapTriangles.size(); i++) { 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].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].heightFloor * MORAULT_MAP_RENDER_SCALE, map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE }, 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 ); } } EndMode3D(); DrawFPS(0, 0); 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)) { Morault::Maps::MapTriangle tri; tri.a = { -128, -128 }; tri.b = { 128,128 }; tri.c = { 128,-128 }; tri.floorTexture = "data/textures/test.png"; tri.heightFloor = 0; tri.heightCeiling = 128; tri.hasFloor = true; tri.hasCeiling = false; tri.wallAB = "data/textures/test.png"; tri.wallBC = "data/textures/test.png"; tri.wallCA = "data/textures/test.png"; map->MapTriangles.push_back(tri); } } if (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE)) editorOffset += GetMouseDelta(); if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { for (int i = 0; i < map->MapTriangles.size(); i++) { if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].a, 7)) { inSelection = true; selection = { i,A,SectorLineSelection::NOLINE }; } if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].b, 7)) { inSelection = true; selection = { i,B,SectorLineSelection::NOLINE }; } if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].c, 7)) { inSelection = true; 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) { case A: map->MapTriangles[selection.sector].a += GetMouseDelta(); break; case B: map->MapTriangles[selection.sector].b += GetMouseDelta(); break; case C: map->MapTriangles[selection.sector].c += GetMouseDelta(); break; } } } BeginDrawing(); ClearBackground(BLACK); 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); 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); } } EndDrawing(); }break; default: throw std::runtime_error("what the fuck?"); } } CloseWindow(); }