commit 00507bc2693859d74182023766ad0804de3e9732 Author: illyum Date: Wed Sep 18 15:20:56 2024 -0600 Initial Commit: Working rendering and movement diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfd2159 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.cache/ +build/ +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5d2c221 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.29) +project(Cuber) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +include(FetchContent) + +FetchContent_Declare( + raylib + URL https://github.com/raysan5/raylib/archive/refs/tags/5.0.zip +) +FetchContent_MakeAvailable(raylib) +set(BUILD_EXAMPLES OF CACHE BOOL "" FORCE) +set(SUPPORT_EVENTS_WAITING ON CACHE BOOL "" FORCE) +set(SUPPORT_BUSY_WAIT_LOOP OFF CACHE BOOL "" FORCE) + +add_executable(Cuber main.cpp) +target_link_libraries(Cuber PRIVATE raylib) +target_include_directories(Cuber PRIVATE ${CMAKE_SOURCE_DIR}/raylib/include) diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..dfcdd7a --- /dev/null +++ b/main.cpp @@ -0,0 +1,151 @@ +#include +#include + +enum Faces { + FRONT = 0, + RIGHT, + BACK, + LEFT, + BOTTOM, + TOP +}; + +struct RubikCube { + Faces faces[6]; +}; + +void DrawCubeFace(Vector3 position, float size, Color color, Faces face); + +// Function to draw a quad using four vertices and a color +void DrawQuad(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Color color) { + rlSetTexture(0); // Disable textures + rlBegin(RL_QUADS); // Begin drawing quads + rlColor4ub(color.r, color.g, color.b, color.a); // Set quad color + + // Define the four vertices of the quad + rlVertex3f(v1.x, v1.y, v1.z); + rlVertex3f(v2.x, v2.y, v2.z); + rlVertex3f(v3.x, v3.y, v3.z); + rlVertex3f(v4.x, v4.y, v4.z); + + rlEnd(); // End drawing quads +} + +// Function to draw a smaller cube at a given position with different colored faces +void DrawRubikCubePart(Vector3 position, float size) { + // Draw individual colored faces for each side + DrawCubeFace(position, size, GREEN, FRONT); // FRONT face + DrawCubeFace(position, size, RED, BACK); // BACK face + DrawCubeFace(position, size, BLUE, RIGHT); // RIGHT face + DrawCubeFace(position, size, ORANGE, LEFT); // LEFT face + DrawCubeFace(position, size, YELLOW, TOP); // TOP face + DrawCubeFace(position, size, WHITE, BOTTOM); // BOTTOM face +} + +// Function to draw a colored face of the cube +void DrawCubeFace(Vector3 position, float size, Color color, Faces face) { + float halfSize = size / 2; + + switch (face) { + case FRONT: // Z is negative, facing front + DrawQuad( + (Vector3){ position.x - halfSize, position.y + halfSize, position.z - halfSize }, // Top-left + (Vector3){ position.x + halfSize, position.y + halfSize, position.z - halfSize }, // Top-right + (Vector3){ position.x + halfSize, position.y - halfSize, position.z - halfSize }, // Bottom-right + (Vector3){ position.x - halfSize, position.y - halfSize, position.z - halfSize }, // Bottom-left + color + ); + break; + case BACK: // Z is positive, facing back + DrawQuad( + (Vector3){ position.x + halfSize, position.y + halfSize, position.z + halfSize }, // Top-right + (Vector3){ position.x - halfSize, position.y + halfSize, position.z + halfSize }, // Top-left + (Vector3){ position.x - halfSize, position.y - halfSize, position.z + halfSize }, // Bottom-left + (Vector3){ position.x + halfSize, position.y - halfSize, position.z + halfSize }, // Bottom-right + color + ); + break; + case RIGHT: // X is positive, facing right + DrawQuad( + (Vector3){ position.x + halfSize, position.y + halfSize, position.z - halfSize }, // Top-front + (Vector3){ position.x + halfSize, position.y + halfSize, position.z + halfSize }, // Top-back + (Vector3){ position.x + halfSize, position.y - halfSize, position.z + halfSize }, // Bottom-back + (Vector3){ position.x + halfSize, position.y - halfSize, position.z - halfSize }, // Bottom-front + color + ); + break; + case LEFT: // X is negative, facing left + DrawQuad( + (Vector3){ position.x - halfSize, position.y + halfSize, position.z + halfSize }, // Top-back + (Vector3){ position.x - halfSize, position.y + halfSize, position.z - halfSize }, // Top-front + (Vector3){ position.x - halfSize, position.y - halfSize, position.z - halfSize }, // Bottom-front + (Vector3){ position.x - halfSize, position.y - halfSize, position.z + halfSize }, // Bottom-back + color + ); + break; + case TOP: // Y is positive, facing up + DrawQuad( + (Vector3){ position.x - halfSize, position.y + halfSize, position.z + halfSize }, // Back-left + (Vector3){ position.x + halfSize, position.y + halfSize, position.z + halfSize }, // Back-right + (Vector3){ position.x + halfSize, position.y + halfSize, position.z - halfSize }, // Front-right + (Vector3){ position.x - halfSize, position.y + halfSize, position.z - halfSize }, // Front-left + color + ); + break; + case BOTTOM: // Y is negative, facing down + DrawQuad( + (Vector3){ position.x - halfSize, position.y - halfSize, position.z - halfSize }, // Front-left + (Vector3){ position.x + halfSize, position.y - halfSize, position.z - halfSize }, // Front-right + (Vector3){ position.x + halfSize, position.y - halfSize, position.z + halfSize }, // Back-right + (Vector3){ position.x - halfSize, position.y - halfSize, position.z + halfSize }, // Back-left + color + ); + break; + } +} + +int main() { + InitWindow(1920, 1080, "Rubik's Cube"); + + Camera3D camera = { 0 }; + camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; + camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.fovy = 45.0f; + camera.projection = CAMERA_PERSPECTIVE; + + SetTargetFPS(60); + DisableCursor(); + + while (!WindowShouldClose()) { + // Update + UpdateCamera(&camera, CAMERA_FREE); + + BeginDrawing(); + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + // Draw the 3x3x3 Rubik's Cube + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Vector3 position = { x * 2.1f, y * 2.1f, z * 2.1f }; + DrawRubikCubePart(position, 2.0f); + } + } + } + + DrawGrid(10, 1.0f); // Optional grid for reference + + EndMode3D(); + + DrawText("Rubik's Cube", 10, 10, 20, DARKGRAY); + + EndDrawing(); + } + + CloseWindow(); + + return 0; +}