diff --git a/CMakeLists.txt b/CMakeLists.txt index d5d186b..cc82bd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,70 +1,23 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.15) project(Prog3B) -# === Basis-Konfiguration === -set(EXECUTABLE_NAME Prog3B) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_CXX_STANDARD 17) -# Default-Build-Type (falls nicht angegeben) -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) -endif() +include(FetchContent) -# === Quell- und Header-Dateien === -set(SRC_FILES - ${CMAKE_CURRENT_LIST_DIR}/main.cpp - ${CMAKE_CURRENT_LIST_DIR}/gamecube.cpp +FetchContent_Declare( + raylib + GIT_REPOSITORY https://github.com/raysan5/raylib.git + GIT_TAG 5.0 ) -set(INCLUDE_DIRS - ${CMAKE_CURRENT_LIST_DIR}/mac_arm - ${CMAKE_CURRENT_LIST_DIR}/raylib +FetchContent_MakeAvailable(raylib) + +add_executable(Prog3B + main.cpp + gamecube.cpp + gamematrix.cpp ) -# === Betriebssystem automatisch erkennen === -if(WIN32) - set(OS_DIR "windows") -elseif(APPLE) - # Prüfen, ob ARM oder x86 - execute_process( - COMMAND uname -m - OUTPUT_VARIABLE ARCH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(ARCH STREQUAL "arm64") - set(OS_DIR "mac_arm") - else() - set(OS_DIR "mac_x86") - endif() -elseif(UNIX) - set(OS_DIR "linux") -else() - message(FATAL_ERROR "Unbekanntes Betriebssystem!") -endif() - - -# === Executable erstellen === -add_executable(${EXECUTABLE_NAME} ${SRC_FILES}) -target_include_directories(${EXECUTABLE_NAME} PRIVATE ${INCLUDE_DIRS}) - -# === Bibliotheken verlinken === -target_link_libraries(${EXECUTABLE_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/${OS_DIR}/libgamematrix.a - ${CMAKE_CURRENT_LIST_DIR}/${OS_DIR}/libraylib.a -) - -# Windows: zusätzliche Systemlib -if(WIN32) - target_link_libraries(${EXECUTABLE_NAME} PRIVATE winmm) -endif() - -# macOS: Frameworks -if(APPLE) - target_link_libraries(${EXECUTABLE_NAME} PRIVATE - "-framework IOKit" - "-framework Cocoa" - "-framework OpenGL" - ) -endif() - +target_include_directories(Prog3B PRIVATE .) +target_link_libraries(Prog3B raylib) \ No newline at end of file diff --git a/docs/gantt b/docs/gantt new file mode 100644 index 0000000..a144366 --- /dev/null +++ b/docs/gantt @@ -0,0 +1,66 @@ +======================================================== +GANTT-CHART – Projekt gamematrix (C++ Library) +Rolle: Projektleiter +======================================================== + +Gesamtdauer: 90 Minuten +Vorgehensmodell: Wasserfall +Datum: 03.11.2025 +Teammitglieder: (getBereturntrue) + +-------------------------------------------------------- +Legende: +█ = aktive Arbeitszeit +░ = Unterstützung / Wartezeit / Review +-------------------------------------------------------- + +Zeit: 0 10 20 30 40 50 60 70 80 90 + |----|----|----|----|----|----|----|----|----| + +-------------------------------------------------------- +1. ANFORDERUNGSANALYSE (0–10 min) +-------------------------------------------------------- +Projektleiter ██████████ +Architekt ████░░░░░░ +Entwickler ░░░░░░░░░░ +Tester ███░░░░░░░ + +-------------------------------------------------------- +2. DESIGN / ENTWURF (10–20 min) +-------------------------------------------------------- +Architekt ████████████ +Projektleiter ███░░░░░░░░░ +Entwickler ░░░░░░░░░░░░ +Tester ███░░░░░░░░░ + +-------------------------------------------------------- +3. IMPLEMENTIERUNG (20–50 min) +-------------------------------------------------------- +Entwickler ████████████████████████ +Projektleiter ███░░░░░░░░░░░░░░░░░░░░ +Architekt ░░░░░░░░░░░░░░░░░░░░░░░ +Tester ██░░░░░░░░░░░░░░░░░░░░░ + +-------------------------------------------------------- +4. TESTEN & VALIDIERUNG (50–70 min) +-------------------------------------------------------- +Tester ███████████████ +Entwickler ███░░░░░░░░░░░░ +Projektleiter ██░░░░░░░░░░░░░ +Architekt ░░░░░░░░░░░░░░ + +-------------------------------------------------------- +5. ABSCHLUSS / DOKUMENTATION (70–90 min) +-------------------------------------------------------- +Projektleiter ██████████████ +Architekt ██░░░░░░░░░░░░ +Entwickler ██░░░░░░░░░░░░ +Tester ██░░░░░░░░░░░░ + +-------------------------------------------------------- +Ergebnisse: +- Anforderungen abgeschlossen +- Design & Architektur dokumentiert +- Funktionen implementiert und getestet +- Merge & Abschlussdokumentation fertig +======================================================== diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..72b3ef9 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,59 @@ +======================================================== +Projekt: gamematrix (C++ Library) +Rolle: Projektleiter +Datei: requirements.txt +Datum: 03.11.2025 +Team: getBereturntrue(3 Personen) +======================================================== + +# ---------------------------- +# 1. Projektziel +# ---------------------------- +Ziel: Entwicklung einer C++-Bibliothek für 3D-Transformationen (4x4-Matrizen) +zur späteren Nutzung über pybind11 in Python sowie Integration in das +bestehende Spielprojekt. Bereitstellung von Funktionen für Translation, +Rotation und Matrixmultiplikation im 3D-Raum. + +# ---------------------------- +# 2. Funktionale Anforderungen +# ---------------------------- + +| Funktion | Eingabe | Ausgabe | Kurzbeschreibung | +|---------------|------------------------------------|-----------------------|----------------------------------------| +| matmul | 4x4 Matrix A, 4x4 Matrix B | 4x4 Matrix | Multiplikation zweier 4x4 Matrizen | +| translate | 3D Vektor (x,y,z) | 4x4 Matrix | Erzeugt Translationsmatrix | +| rot3D | Winkel in °, Rotationsachse (x/y/z)| 4x4 Matrix | Rotationsmatrix um Achse | +| identity | --- | 4x4 Matrix | Identitätsmatrix zurückgeben | +| apply | Matrix, Vec3 | Vec3 | Vektor mit Transformationsmatrix transformieren | + +# ---------------------------- +# 3. Nicht-funktionale Anforderungen +# ---------------------------- + +- Lesbarkeit & Wartbarkeit (klarer Namespace, Header-Trennung) +- Ausführung in Echtzeit-Spielumgebung (gute Performance) +- Kompatibilität mit pybind11 +- Keine dynamische Speicherallokation innerhalb der Matrixoperationen + +# ---------------------------- +# 4. Annahmen / Einschränkungen +# ---------------------------- + +- Alle Matrizen im homogenen Format 4x4 +- Winkelangabe in Grad +- Datentyp double +- Koordinatensystem: Rechtshändig + +# ---------------------------- +# 5. Abnahmekriterien +# ---------------------------- + +- Beispiel-Transformationen funktionieren korrekt +- Unit-Tests für alle Funktionen bestehen +- Vergleich mit bekannten Resultaten (z. B. 90°-Rotation) +- Bibliothek lässt sich erfolgreich in Python binden + +======================================================== +Hinweis: +Diese Datei wird vom Projektleiter gepflegt. +======================================================== diff --git a/gamecube.cpp b/gamecube.cpp index 6848d50..ba9aad5 100644 --- a/gamecube.cpp +++ b/gamecube.cpp @@ -14,7 +14,7 @@ void gamecube::Update(float flipSpeed) flippingForward = false; flipped = true; } - } + }// test else if (flippingBackward) { rotation -= flipSpeed; @@ -27,8 +27,8 @@ void gamecube::Update(float flipSpeed) } } -void gamecube::FlipForward() { flippingForward = true; } -void gamecube::FlipBackward() { flippingBackward = true; } +void gamecube::FlipForward() { flippingForward = true; } +void gamecube::FlipBackward() { flippingBackward = true; } bool gamecube::IsFlipped() const { return flipped; } bool gamecube::IsMatched() const { return matched; } @@ -38,18 +38,15 @@ void gamecube::Draw() const { rlPushMatrix(); - // Matrizen für Rotation und Translation erzeugen auto matrix_a = gameMatrix::translate({ position.x, position.y, position.z}); auto matrix_b = gameMatrix::rot3D(rotation, 'y'); - - // Matrizen multiplizieren (Translation * Rotation) auto model = gameMatrix::matmul(matrix_a, matrix_b); - // transform for raylib matrix float f[16]; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) f[j * 4 + i] = model[i][j]; + rlMultMatrixf(f); if (rotation < 90.0f) @@ -62,5 +59,5 @@ void gamecube::Draw() const rlPopMatrix(); } -Vec3 gamecube::GetPosition() const { return position; } -float gamecube::GetRotationY() const { return rotation; } \ No newline at end of file +Vec3 gamecube::GetPosition() const { return position; } +float gamecube::GetRotationY() const { return rotation; } diff --git a/gamecube.h b/gamecube.h index bbe0028..1e5b37b 100644 --- a/gamecube.h +++ b/gamecube.h @@ -3,22 +3,24 @@ #include "raylib.h" #include -struct Vec3 -{ +struct Vec3 { float x, y, z; }; -class gamecube -{ +class gamecube { public: gamecube(const Vec3 &pos, Color col); + void Update(float flipSpeed); void FlipForward(); void FlipBackward(); + bool IsFlipped() const; bool IsMatched() const; void SetMatched(bool m); + void Draw() const; + Vec3 GetPosition() const; float GetRotationY() const; Color GetColor() const { return color; } @@ -26,9 +28,12 @@ public: private: Vec3 position; Color color; + bool flipped = false; bool matched = false; + bool flippingForward = false; bool flippingBackward = false; + float rotation = 0.0f; -}; \ No newline at end of file +}; diff --git a/gamematrix.cpp b/gamematrix.cpp new file mode 100644 index 0000000..ffe8b12 --- /dev/null +++ b/gamematrix.cpp @@ -0,0 +1,43 @@ +#include "gamematrix.h" + +std::array,4> gameMatrix::matmul( + const std::array,4>& A, + const std::array,4>& B) +{ + std::array,4> R = {}; + + for(int i=0;i<4;i++) + for(int j=0;j<4;j++) + for(int k=0;k<4;k++) + R[i][j] += A[i][k] * B[k][j]; + + return R; +} + +std::array,4> gameMatrix::rot3D(double angle_deg, char axis) +{ + double a = angle_deg * M_PI / 180.0; + double c = cos(a); + double s = sin(a); + + std::array,4> M = {0}; + + M[3][3] = 1; + M[axis == 'x'][axis == 'y'] = 1; // init identity axis + + if(axis == 'x') M = {{{1,0,0,0},{0,c,-s,0},{0,s,c,0},{0,0,0,1}}}; + if(axis == 'y') M = {{{c,0,s,0},{0,1,0,0},{-s,0,c,0},{0,0,0,1}}}; + if(axis == 'z') M = {{{c,-s,0,0},{s,c,0,0},{0,0,1,0},{0,0,0,1}}}; + + return M; +} + +std::array,4> gameMatrix::translate(const std::array& p) +{ + return {{ + {1,0,0,p[0]}, + {0,1,0,p[1]}, + {0,0,1,p[2]}, + {0,0,0,1} + }}; +}