From 4fa5a5374ae5062d9070b136bf873a50b7d8546f Mon Sep 17 00:00:00 2001
From: nathansmithsmith <thenathansmithsmith@gmail.com>
Date: Fri, 22 Dec 2023 15:36:56 -0700
Subject: Got a somewhat working preview

---
 src/screens/infoScreen.c | 83 +++++++++++++++++++++++++++++++++++++++++-------
 src/screens/infoScreen.h |  7 +++-
 2 files changed, 78 insertions(+), 12 deletions(-)

(limited to 'src/screens')

diff --git a/src/screens/infoScreen.c b/src/screens/infoScreen.c
index 98af36f..512ea42 100644
--- a/src/screens/infoScreen.c
+++ b/src/screens/infoScreen.c
@@ -7,44 +7,44 @@ const EntityUserInfo infoScreenEntityInfo[INFO_SCREEN_ENTITY_COUNT] = {
     (EntityUserInfo){
         .type = ENTITY_ANTIFA,
         .assetId = ANTIFA_SHIP_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "The player ship. Its a anti fascist ship and is completely bad ass."
     },
     (EntityUserInfo){
         .type = ENTITY_SOLDATO,
         .assetId = SOLDATO_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "A wippy little ship. It follows the other ships like ants."
     },
     (EntityUserInfo){
         .type = ENTITY_CAPORALE,
         .assetId = CAPORATE_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "A pretty normal space ship. Often acts as a leader for the soldato."
     },
     (EntityUserInfo){
         .type = ENTITY_SERGENTE,
         .assetId = SERGENTE_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "A funny little dude that packs a lot of power"
     },
     (EntityUserInfo){
         .type = ENTITY_MARESCIALLO,
         .assetId = MARESCIALLO_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "A sneaky little ship based on a stealth jet."
     },
     (EntityUserInfo)
     {
         .type = ENTITY_GENERALE,
         .assetId = GENERALE_ASSET,
-        .cameraPosition = (Vector3){10.0, 10.0, 10.0},
+        .cameraDistance = 15.0,
         .msg = "A ufo that goes zig zag and shoots its epic deadly laser.",
     },
     (EntityUserInfo){
         .type = ENTITY_MUSSOLINI,
         .assetId = MUSSOLINI_ASSET,
-        .cameraPosition = (Vector3){100.0, 100.0, 100.0},
+        .cameraDistance = 100.0,
         .msg = "A deadly mother fucker named after the Italian fascist dictator"
     }
 };
@@ -55,7 +55,7 @@ void initInfoScreen(Game * game) {
     infoScreen->goBackButton = (Rectangle){0.0, 25.0, 100.0, 50.0};
 
     infoScreen->camera = (Camera3D){
-        .position = infoScreenEntityInfo[0].cameraPosition,
+        .position = (Vector3){0.0, 0.0, infoScreenEntityInfo[0].cameraDistance},
         .target = Vector3Zero(),
         .up = (Vector3){0.0, 1.0, 0.0},
         .fovy = 90.0,
@@ -63,22 +63,83 @@ void initInfoScreen(Game * game) {
     };
 
     infoScreen->currentEntity = 0;
+
+    infoScreen->rotation = QuaternionIdentity();
+    infoScreen->resetMouse = true;
+    infoScreen->distance = infoScreenEntityInfo[0].cameraDistance;
+}
+
+void updateInfoScreenCamera(Game * game, InfoScreen * infoScreen) {
+    double t = GetFrameTime();
+    Camera3D * camera = &infoScreen->camera;
+
+    if (infoScreen->resetMouse) {
+        infoScreen->resetMouse = false;
+        SetMousePosition(0, 0);
+        infoScreen->lastMouse = Vector2Zero();
+    }
+
+    // Get mouse.
+    Vector2 mousePosition = GetMousePosition();
+    Vector2 mouseSpeed = Vector2Subtract(mousePosition, infoScreen->lastMouse);
+    mouseSpeed = Vector2Scale(mouseSpeed, 1.0 / t);
+    mouseSpeed = Vector2Scale(mouseSpeed, game->settings.previewMouseSensitivity);
+    infoScreen->lastMouse = mousePosition;
+
+    // Get mouse axis angle.
+    AxisAngle angle = AxisAngleIdentity();
+    angle.axis = (Vector3){mouseSpeed.y, mouseSpeed.x, 0.0};
+    angle.angle = Vector3Length(angle.axis);
+
+    if (IsMouseButtonDown(MOUSE_MIDDLE_BUTTON)) {
+        angle.axis.z = mouseSpeed.x;
+        angle.axis.y = 0.0;
+    }
+
+    // Apply rotation.
+    Quaternion rotationSpeed = QuaternionFromAxisAngle(angle.axis, angle.angle * t);
+    infoScreen->rotation = QuaternionMultiply(infoScreen->rotation, rotationSpeed);
+    infoScreen->rotation = QuaternionNormalize(infoScreen->rotation);
+
+    camera->position = (Vector3){0.0, 0.0, infoScreenEntityInfo[infoScreen->currentEntity].cameraDistance};
 }
 
 void updateInfoScreen(Game * game) {
     InfoScreen * infoScreen = &game->infoScreen;
     ClearBackground(BLACK);
 
-    if (GuiButton(infoScreen->goBackButton, "Back"))
-        game->screenId = SCREEN_MAIN_MENU;
+    // Reset.
+    if (IsKeyPressed(KEY_R)) {
+        infoScreen->resetMouse = true;
+        infoScreen->rotation = QuaternionIdentity();
+    }
+
+    // Handling hidding cursor and shit.
+    if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) {
+        DisableCursor();
+    } else if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON)) {
+        infoScreen->resetMouse = true;
+        EnableCursor();
+    }
+
+    // Switching modes.
+    if (IsMouseButtonDown(MOUSE_RIGHT_BUTTON)) {
+        updateInfoScreenCamera(game, infoScreen);
+    } else {
+         // Back button.
+        if (GuiButton(infoScreen->goBackButton, "Back"))
+            game->screenId = SCREEN_MAIN_MENU;
+    }
 
     EntityUserInfo info = infoScreenEntityInfo[infoScreen->currentEntity];
 
+    // Draw shit.
     BeginMode3D(infoScreen->camera);
 
+    game->assets.models[info.assetId].transform = QuaternionToMatrix(infoScreen->rotation);
     DrawModelWires(game->assets.models[info.assetId], Vector3Zero(), 1.0, GREEN);
 
-    DrawGrid(32, 5.0);
+    //DrawGrid(32, 5.0);
 
     EndMode3D();
 }
diff --git a/src/screens/infoScreen.h b/src/screens/infoScreen.h
index 128033a..4113420 100644
--- a/src/screens/infoScreen.h
+++ b/src/screens/infoScreen.h
@@ -11,7 +11,7 @@
 typedef struct EntityUserInfo {
     EntityType type;
     AssetId assetId;
-    Vector3 cameraPosition;
+    float cameraDistance;
     char msg[ENTITY_USER_INFO_MSG_MAX];
 } EntityUserInfo;
 
@@ -21,6 +21,11 @@ typedef struct InfoScreen {
     Rectangle goBackButton;
     Camera3D camera;
     int currentEntity;
+
+    Vector2 lastMouse;
+    Quaternion rotation;
+    bool resetMouse;
+    float distance;
 } InfoScreen;
 
 void initInfoScreen(Game * game);
-- 
cgit v1.2.3