3d movement

This commit is contained in:
Asuro
2025-02-13 01:58:03 +01:00
parent 137d8fa539
commit 6e82678ade
7 changed files with 429 additions and 468 deletions

View File

@@ -1,5 +1,6 @@
#include "Global.h" #include "Global.h"
#include "bx/constants.h" #include "bx/bx.h"
#include "bx/float4x4_t.h"
#include "bx/math.h" #include "bx/math.h"
#include <cassert> #include <cassert>
@@ -9,89 +10,77 @@ namespace
Game::GameInstance* GameInst = nullptr; Game::GameInstance* GameInst = nullptr;
} // namespace } // namespace
void Vec2::Normalize() void Transform::CreateTransform(float* out, bx::Vec3 pos, bx::Quaternion rot, bx::Vec3 scale)
{
float len = bx::sqrt(X * X + Y * Y);
X /= len;
Y /= len;
}
void Vec3::Normalize()
{
float len = bx::sqrt(X * X + Y * Y + Z * Z);
X /= len;
Y /= len;
Z /= len;
}
Quat Quat::FromEuler(float x, float y, float z)
{
x *= bx::kPi / 180.0f;
y *= bx::kPi / 180.0f;
z *= bx::kPi / 180.0f;
float cX = bx::cos(x);
float cY = bx::cos(y);
float cZ = bx::cos(z);
float sX = bx::sin(x);
float sY = bx::sin(y);
float sZ = bx::sin(z);
return Quat{cX * cY * cZ - sX * sY * sZ,
sY * cX * cZ - sX * sZ * cY,
sX * sY * cZ + sZ * cX * cY,
sX * cY * cZ + sY * sZ * cX};
}
Quat Quat::FromEuler(Vec3 rot)
{
return Quat::FromEuler(rot.X, rot.Y, rot.Z);
}
void Mat4::CreateTransform(float* out, Vec3 pos, Quat rot, Vec3 scale)
{ {
if (out == nullptr) return; if (out == nullptr) return;
float rMat[16]{0}; float rMat[16]{0};
float tMat[16]{0}; float tMat[16]{0};
float sMat[16]{0}; float sMat[16]{0};
bx::mtxFromQuaternion(rMat, bx::Quaternion{rot.X, rot.Y, rot.Z, rot.W}); bx::mtxFromQuaternion(rMat, bx::Quaternion{rot.x, rot.y, rot.z, rot.w});
bx::mtxTranslate(tMat, pos.X, pos.Y, pos.Z); bx::mtxTranslate(tMat, pos.x, pos.y, pos.z);
bx::mtxScale(sMat, scale.X, scale.Y, scale.Z); bx::mtxScale(sMat, scale.x, scale.y, scale.z);
float buf[16]{0}; float buf[16]{0};
bx::mtxMul(buf, rMat, sMat); bx::mtxMul(buf, rMat, sMat);
bx::mtxMul(out, buf, tMat); bx::mtxMul(out, buf, tMat);
} }
void Mat4::TranslateLocal(Vec3 offset) void Transform::Translate(bx::Vec3 offset)
{ {
M[12] += offset.X; Position = bx::add(Position, offset);
M[13] += offset.Y;
M[14] += offset.Z;
} }
void Mat4::Rotate(Vec3 rotation) void Transform::TranslateLocal(bx::Vec3 offset)
{
UpdateMatrix();
float offsetPtr[4]{offset.x, offset.y, offset.z, 0.0f};
float localOffset[4]{0.0f};
bx::vec4MulMtx(localOffset, offsetPtr, MI.M);
Position = bx::add(Position, {localOffset[0], localOffset[1], localOffset[2]});
}
void Transform::Rotate(bx::Vec3 rotation)
{ {
float rot[16]{0}; float rot[16]{0};
bx::mtxRotateXYZ(rot, rotation.X, rotation.Y, rotation.Z); bx::mtxRotateXYZ(rot, rotation.x, rotation.y, rotation.z);
float temp[16]{0}; float temp[16]{0};
bx::mtxMul(temp, M, rot); bx::mtxMul(temp, rot, Rotation.M);
for (int32_t i = 0; i < 16; ++i) bx::memCopy(Rotation.M, temp, sizeof(temp));
M[i] = temp[i];
} }
Vec3 Mat4::Right() void Transform::RotateLocal(bx::Vec3 rotation)
{ {
return {M[0], M[1], M[2]}; float rot[16]{0};
bx::mtxRotateXYZ(rot, rotation.x, rotation.y, rotation.z);
float temp[16]{0};
bx::mtxMul(temp, Rotation.M, rot);
bx::memCopy(Rotation.M, temp, sizeof(temp));
} }
Vec3 Mat4::Up() bx::Vec3 Transform::Right() const
{ {
return {M[4], M[5], M[6]}; return {M.M[0], M.M[1], M.M[2]};
} }
Vec3 Mat4::Forward() bx::Vec3 Transform::Up() const
{ {
return {M[8], M[9], M[10]}; return {M.M[4], M.M[5], M.M[6]};
}
bx::Vec3 Transform::Forward() const
{
return {M.M[8], M.M[9], M.M[10]};
}
void Transform::UpdateMatrix()
{
Mat4 pos;
Mat4 scale;
bx::mtxTranslate(pos.M, Position.x, Position.y, Position.z);
bx::mtxScale(scale.M, Scale.x, Scale.y, Scale.z);
Mat4 temp;
bx::mtxMul(temp.M, scale.M, Rotation.M);
bx::mtxMul(M.M, pos.M, temp.M);
bx::mtxInverse(MI.M, M.M);
} }
namespace Game namespace Game

View File

@@ -1,53 +1,6 @@
#pragma once #pragma once
#include <bx/math.h>
#include <cstdint>
struct SharedData; #include "bx/math.h"
struct IVec2
{
int32_t X = 0;
int32_t Y = 0;
};
struct IVec3
{
int32_t X = 0;
int32_t Y = 0;
};
struct Vec2
{
float X = 0.0f;
float Y = 0.0f;
void Normalize();
};
struct Vec3
{
float X = 0.0f;
float Y = 0.0f;
float Z = 0.0f;
bx::Vec3 ToBX()
{
return {X, Y, Z};
};
void Normalize();
};
struct Quat
{
float X = 0.0f;
float Y = 0.0f;
float Z = 0.0f;
float W = 1.0f;
static Quat FromEuler(float x, float y, float z);
static Quat FromEuler(Vec3 rot);
};
struct Mat4 struct Mat4
{ {
@@ -69,15 +22,30 @@ struct Mat4
0.0, 0.0,
1.0, 1.0,
}; };
static void CreateTransform(float* out, Vec3 pos, Quat rot = {}, Vec3 scale = {1.0f, 1.0f, 1.0f});
void TranslateLocal(Vec3 offset);
void Rotate(Vec3 rotation);
Vec3 Right();
Vec3 Up();
Vec3 Forward();
}; };
struct Transform
{
Mat4 M;
Mat4 MI;
bx::Vec3 Position{0.0f, 0.0f, 0.0f};
Mat4 Rotation;
bx::Vec3 Scale{1.0f, 1.0f, 1.0f};
static void CreateTransform(float* out, bx::Vec3 pos, bx::Quaternion rot, bx::Vec3 scale);
void Translate(bx::Vec3 offset);
void TranslateLocal(bx::Vec3 offset);
void Rotate(bx::Vec3 rotation);
void RotateLocal(bx::Vec3 rotation);
bx::Vec3 Right() const;
bx::Vec3 Up() const;
bx::Vec3 Forward() const;
const float* GetPtr();
void UpdateMatrix();
};
struct SharedData;
namespace Game namespace Game
{ {
struct GameInstance; struct GameInstance;

View File

@@ -2,7 +2,7 @@
enum class ScanCode enum class ScanCode
{ {
SDL_SCANCODE_UNKNOWN = 0, UNKNOWN = 0,
/** /**
* \name Usage page 0x07 * \name Usage page 0x07
@@ -11,55 +11,55 @@ enum class ScanCode
*/ */
/* @{ */ /* @{ */
SDL_SCANCODE_A = 4, A = 4,
SDL_SCANCODE_B = 5, B = 5,
SDL_SCANCODE_C = 6, C = 6,
SDL_SCANCODE_D = 7, D = 7,
SDL_SCANCODE_E = 8, E = 8,
SDL_SCANCODE_F = 9, F = 9,
SDL_SCANCODE_G = 10, G = 10,
SDL_SCANCODE_H = 11, H = 11,
SDL_SCANCODE_I = 12, I = 12,
SDL_SCANCODE_J = 13, J = 13,
SDL_SCANCODE_K = 14, K = 14,
SDL_SCANCODE_L = 15, L = 15,
SDL_SCANCODE_M = 16, M = 16,
SDL_SCANCODE_N = 17, N = 17,
SDL_SCANCODE_O = 18, O = 18,
SDL_SCANCODE_P = 19, P = 19,
SDL_SCANCODE_Q = 20, Q = 20,
SDL_SCANCODE_R = 21, R = 21,
SDL_SCANCODE_S = 22, S = 22,
SDL_SCANCODE_T = 23, T = 23,
SDL_SCANCODE_U = 24, U = 24,
SDL_SCANCODE_V = 25, V = 25,
SDL_SCANCODE_W = 26, W = 26,
SDL_SCANCODE_X = 27, X = 27,
SDL_SCANCODE_Y = 28, Y = 28,
SDL_SCANCODE_Z = 29, Z = 29,
SDL_SCANCODE_1 = 30, _1 = 30,
SDL_SCANCODE_2 = 31, _2 = 31,
SDL_SCANCODE_3 = 32, _3 = 32,
SDL_SCANCODE_4 = 33, _4 = 33,
SDL_SCANCODE_5 = 34, _5 = 34,
SDL_SCANCODE_6 = 35, _6 = 35,
SDL_SCANCODE_7 = 36, _7 = 36,
SDL_SCANCODE_8 = 37, _8 = 37,
SDL_SCANCODE_9 = 38, _9 = 38,
SDL_SCANCODE_0 = 39, _0 = 39,
SDL_SCANCODE_RETURN = 40, RETURN = 40,
SDL_SCANCODE_ESCAPE = 41, ESCAPE = 41,
SDL_SCANCODE_BACKSPACE = 42, BACKSPACE = 42,
SDL_SCANCODE_TAB = 43, TAB = 43,
SDL_SCANCODE_SPACE = 44, SPACE = 44,
SDL_SCANCODE_MINUS = 45, MINUS = 45,
SDL_SCANCODE_EQUALS = 46, EQUALS = 46,
SDL_SCANCODE_LEFTBRACKET = 47, LEFTBRACKET = 47,
SDL_SCANCODE_RIGHTBRACKET = 48, RIGHTBRACKET = 48,
SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return BACKSLASH = 49, /**< Located at the lower left of the return
* key on ISO keyboards and at the right end * key on ISO keyboards and at the right end
* of the QWERTY row on ANSI keyboards. * of the QWERTY row on ANSI keyboards.
* Produces REVERSE SOLIDUS (backslash) and * Produces REVERSE SOLIDUS (backslash) and
@@ -73,21 +73,21 @@ enum class ScanCode
* layout, and ASTERISK and MICRO SIGN in a * layout, and ASTERISK and MICRO SIGN in a
* French Windows layout. * French Windows layout.
*/ */
SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code NONUSHASH = 50, /**< ISO USB keyboards actually use this code
* instead of 49 for the same key, but all * instead of 49 for the same key, but all
* OSes I've seen treat the two codes * OSes I've seen treat the two codes
* identically. So, as an implementor, unless * identically. So, as an implementor, unless
* your keyboard generates both of those * your keyboard generates both of those
* codes and your OS treats them differently, * codes and your OS treats them differently,
* you should generate SDL_SCANCODE_BACKSLASH * you should generate BACKSLASH
* instead of this code. As a user, you * instead of this code. As a user, you
* should not rely on this code because SDL * should not rely on this code because SDL
* will never generate it with most (all?) * will never generate it with most (all?)
* keyboards. * keyboards.
*/ */
SDL_SCANCODE_SEMICOLON = 51, SEMICOLON = 51,
SDL_SCANCODE_APOSTROPHE = 52, APOSTROPHE = 52,
SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI GRAVE = 53, /**< Located in the top left corner (on both ANSI
* and ISO keyboards). Produces GRAVE ACCENT and * and ISO keyboards). Produces GRAVE ACCENT and
* TILDE in a US Windows layout and in US and UK * TILDE in a US Windows layout and in US and UK
* Mac layouts on ANSI keyboards, GRAVE ACCENT * Mac layouts on ANSI keyboards, GRAVE ACCENT
@@ -104,60 +104,60 @@ enum class ScanCode
* SIGN in a Swiss German, German, or French Mac * SIGN in a Swiss German, German, or French Mac
* layout on ANSI keyboards. * layout on ANSI keyboards.
*/ */
SDL_SCANCODE_COMMA = 54, COMMA = 54,
SDL_SCANCODE_PERIOD = 55, PERIOD = 55,
SDL_SCANCODE_SLASH = 56, SLASH = 56,
SDL_SCANCODE_CAPSLOCK = 57, CAPSLOCK = 57,
SDL_SCANCODE_F1 = 58, F1 = 58,
SDL_SCANCODE_F2 = 59, F2 = 59,
SDL_SCANCODE_F3 = 60, F3 = 60,
SDL_SCANCODE_F4 = 61, F4 = 61,
SDL_SCANCODE_F5 = 62, F5 = 62,
SDL_SCANCODE_F6 = 63, F6 = 63,
SDL_SCANCODE_F7 = 64, F7 = 64,
SDL_SCANCODE_F8 = 65, F8 = 65,
SDL_SCANCODE_F9 = 66, F9 = 66,
SDL_SCANCODE_F10 = 67, F10 = 67,
SDL_SCANCODE_F11 = 68, F11 = 68,
SDL_SCANCODE_F12 = 69, F12 = 69,
SDL_SCANCODE_PRINTSCREEN = 70, PRINTSCREEN = 70,
SDL_SCANCODE_SCROLLLOCK = 71, SCROLLLOCK = 71,
SDL_SCANCODE_PAUSE = 72, PAUSE = 72,
SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but INSERT = 73, /**< insert on PC, help on some Mac keyboards (but
does send code 73, not 117) */ does send code 73, not 117) */
SDL_SCANCODE_HOME = 74, HOME = 74,
SDL_SCANCODE_PAGEUP = 75, PAGEUP = 75,
SDL_SCANCODE_DELETE = 76, DELETE = 76,
SDL_SCANCODE_END = 77, END = 77,
SDL_SCANCODE_PAGEDOWN = 78, PAGEDOWN = 78,
SDL_SCANCODE_RIGHT = 79, RIGHT = 79,
SDL_SCANCODE_LEFT = 80, LEFT = 80,
SDL_SCANCODE_DOWN = 81, DOWN = 81,
SDL_SCANCODE_UP = 82, UP = 82,
SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards
*/ */
SDL_SCANCODE_KP_DIVIDE = 84, KP_DIVIDE = 84,
SDL_SCANCODE_KP_MULTIPLY = 85, KP_MULTIPLY = 85,
SDL_SCANCODE_KP_MINUS = 86, KP_MINUS = 86,
SDL_SCANCODE_KP_PLUS = 87, KP_PLUS = 87,
SDL_SCANCODE_KP_ENTER = 88, KP_ENTER = 88,
SDL_SCANCODE_KP_1 = 89, KP_1 = 89,
SDL_SCANCODE_KP_2 = 90, KP_2 = 90,
SDL_SCANCODE_KP_3 = 91, KP_3 = 91,
SDL_SCANCODE_KP_4 = 92, KP_4 = 92,
SDL_SCANCODE_KP_5 = 93, KP_5 = 93,
SDL_SCANCODE_KP_6 = 94, KP_6 = 94,
SDL_SCANCODE_KP_7 = 95, KP_7 = 95,
SDL_SCANCODE_KP_8 = 96, KP_8 = 96,
SDL_SCANCODE_KP_9 = 97, KP_9 = 97,
SDL_SCANCODE_KP_0 = 98, KP_0 = 98,
SDL_SCANCODE_KP_PERIOD = 99, KP_PERIOD = 99,
SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO NONUSBACKSLASH = 100, /**< This is the additional key that ISO
* keyboards have over ANSI ones, * keyboards have over ANSI ones,
* located between left shift and Y. * located between left shift and Y.
* Produces GRAVE ACCENT and TILDE in a * Produces GRAVE ACCENT and TILDE in a
@@ -167,134 +167,134 @@ enum class ScanCode
* LESS-THAN SIGN and GREATER-THAN SIGN * LESS-THAN SIGN and GREATER-THAN SIGN
* in a Swiss German, German, or French * in a Swiss German, German, or French
* layout. */ * layout. */
SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ APPLICATION = 101, /**< windows contextual menu, compose */
SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, POWER = 102, /**< The USB document says this is a status flag,
* not a physical key - but some Mac keyboards * not a physical key - but some Mac keyboards
* do have a power key. */ * do have a power key. */
SDL_SCANCODE_KP_EQUALS = 103, KP_EQUALS = 103,
SDL_SCANCODE_F13 = 104, F13 = 104,
SDL_SCANCODE_F14 = 105, F14 = 105,
SDL_SCANCODE_F15 = 106, F15 = 106,
SDL_SCANCODE_F16 = 107, F16 = 107,
SDL_SCANCODE_F17 = 108, F17 = 108,
SDL_SCANCODE_F18 = 109, F18 = 109,
SDL_SCANCODE_F19 = 110, F19 = 110,
SDL_SCANCODE_F20 = 111, F20 = 111,
SDL_SCANCODE_F21 = 112, F21 = 112,
SDL_SCANCODE_F22 = 113, F22 = 113,
SDL_SCANCODE_F23 = 114, F23 = 114,
SDL_SCANCODE_F24 = 115, F24 = 115,
SDL_SCANCODE_EXECUTE = 116, EXECUTE = 116,
SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ HELP = 117, /**< AL Integrated Help Center */
SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ MENU = 118, /**< Menu (show menu) */
SDL_SCANCODE_SELECT = 119, SELECT = 119,
SDL_SCANCODE_STOP = 120, /**< AC Stop */ STOP = 120, /**< AC Stop */
SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ AGAIN = 121, /**< AC Redo/Repeat */
SDL_SCANCODE_UNDO = 122, /**< AC Undo */ UNDO = 122, /**< AC Undo */
SDL_SCANCODE_CUT = 123, /**< AC Cut */ CUT = 123, /**< AC Cut */
SDL_SCANCODE_COPY = 124, /**< AC Copy */ COPY = 124, /**< AC Copy */
SDL_SCANCODE_PASTE = 125, /**< AC Paste */ PASTE = 125, /**< AC Paste */
SDL_SCANCODE_FIND = 126, /**< AC Find */ FIND = 126, /**< AC Find */
SDL_SCANCODE_MUTE = 127, MUTE = 127,
SDL_SCANCODE_VOLUMEUP = 128, VOLUMEUP = 128,
SDL_SCANCODE_VOLUMEDOWN = 129, VOLUMEDOWN = 129,
/* not sure whether there's a reason to enable these */ /* not sure whether there's a reason to enable these */
/* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ /* LOCKINGCAPSLOCK = 130, */
/* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ /* LOCKINGNUMLOCK = 131, */
/* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ /* LOCKINGSCROLLLOCK = 132, */
SDL_SCANCODE_KP_COMMA = 133, KP_COMMA = 133,
SDL_SCANCODE_KP_EQUALSAS400 = 134, KP_EQUALSAS400 = 134,
SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see INTERNATIONAL1 = 135, /**< used on Asian keyboards, see
footnotes in USB doc */ footnotes in USB doc */
SDL_SCANCODE_INTERNATIONAL2 = 136, INTERNATIONAL2 = 136,
SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ INTERNATIONAL3 = 137, /**< Yen */
SDL_SCANCODE_INTERNATIONAL4 = 138, INTERNATIONAL4 = 138,
SDL_SCANCODE_INTERNATIONAL5 = 139, INTERNATIONAL5 = 139,
SDL_SCANCODE_INTERNATIONAL6 = 140, INTERNATIONAL6 = 140,
SDL_SCANCODE_INTERNATIONAL7 = 141, INTERNATIONAL7 = 141,
SDL_SCANCODE_INTERNATIONAL8 = 142, INTERNATIONAL8 = 142,
SDL_SCANCODE_INTERNATIONAL9 = 143, INTERNATIONAL9 = 143,
SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ LANG1 = 144, /**< Hangul/English toggle */
SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ LANG2 = 145, /**< Hanja conversion */
SDL_SCANCODE_LANG3 = 146, /**< Katakana */ LANG3 = 146, /**< Katakana */
SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ LANG4 = 147, /**< Hiragana */
SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ LANG5 = 148, /**< Zenkaku/Hankaku */
SDL_SCANCODE_LANG6 = 149, /**< reserved */ LANG6 = 149, /**< reserved */
SDL_SCANCODE_LANG7 = 150, /**< reserved */ LANG7 = 150, /**< reserved */
SDL_SCANCODE_LANG8 = 151, /**< reserved */ LANG8 = 151, /**< reserved */
SDL_SCANCODE_LANG9 = 152, /**< reserved */ LANG9 = 152, /**< reserved */
SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ ALTERASE = 153, /**< Erase-Eaze */
SDL_SCANCODE_SYSREQ = 154, SYSREQ = 154,
SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ CANCEL = 155, /**< AC Cancel */
SDL_SCANCODE_CLEAR = 156, CLEAR = 156,
SDL_SCANCODE_PRIOR = 157, PRIOR = 157,
SDL_SCANCODE_RETURN2 = 158, RETURN2 = 158,
SDL_SCANCODE_SEPARATOR = 159, SEPARATOR = 159,
SDL_SCANCODE_OUT = 160, OUT = 160,
SDL_SCANCODE_OPER = 161, OPER = 161,
SDL_SCANCODE_CLEARAGAIN = 162, CLEARAGAIN = 162,
SDL_SCANCODE_CRSEL = 163, CRSEL = 163,
SDL_SCANCODE_EXSEL = 164, EXSEL = 164,
SDL_SCANCODE_KP_00 = 176, KP_00 = 176,
SDL_SCANCODE_KP_000 = 177, KP_000 = 177,
SDL_SCANCODE_THOUSANDSSEPARATOR = 178, THOUSANDSSEPARATOR = 178,
SDL_SCANCODE_DECIMALSEPARATOR = 179, DECIMALSEPARATOR = 179,
SDL_SCANCODE_CURRENCYUNIT = 180, CURRENCYUNIT = 180,
SDL_SCANCODE_CURRENCYSUBUNIT = 181, CURRENCYSUBUNIT = 181,
SDL_SCANCODE_KP_LEFTPAREN = 182, KP_LEFTPAREN = 182,
SDL_SCANCODE_KP_RIGHTPAREN = 183, KP_RIGHTPAREN = 183,
SDL_SCANCODE_KP_LEFTBRACE = 184, KP_LEFTBRACE = 184,
SDL_SCANCODE_KP_RIGHTBRACE = 185, KP_RIGHTBRACE = 185,
SDL_SCANCODE_KP_TAB = 186, KP_TAB = 186,
SDL_SCANCODE_KP_BACKSPACE = 187, KP_BACKSPACE = 187,
SDL_SCANCODE_KP_A = 188, KP_A = 188,
SDL_SCANCODE_KP_B = 189, KP_B = 189,
SDL_SCANCODE_KP_C = 190, KP_C = 190,
SDL_SCANCODE_KP_D = 191, KP_D = 191,
SDL_SCANCODE_KP_E = 192, KP_E = 192,
SDL_SCANCODE_KP_F = 193, KP_F = 193,
SDL_SCANCODE_KP_XOR = 194, KP_XOR = 194,
SDL_SCANCODE_KP_POWER = 195, KP_POWER = 195,
SDL_SCANCODE_KP_PERCENT = 196, KP_PERCENT = 196,
SDL_SCANCODE_KP_LESS = 197, KP_LESS = 197,
SDL_SCANCODE_KP_GREATER = 198, KP_GREATER = 198,
SDL_SCANCODE_KP_AMPERSAND = 199, KP_AMPERSAND = 199,
SDL_SCANCODE_KP_DBLAMPERSAND = 200, KP_DBLAMPERSAND = 200,
SDL_SCANCODE_KP_VERTICALBAR = 201, KP_VERTICALBAR = 201,
SDL_SCANCODE_KP_DBLVERTICALBAR = 202, KP_DBLVERTICALBAR = 202,
SDL_SCANCODE_KP_COLON = 203, KP_COLON = 203,
SDL_SCANCODE_KP_HASH = 204, KP_HASH = 204,
SDL_SCANCODE_KP_SPACE = 205, KP_SPACE = 205,
SDL_SCANCODE_KP_AT = 206, KP_AT = 206,
SDL_SCANCODE_KP_EXCLAM = 207, KP_EXCLAM = 207,
SDL_SCANCODE_KP_MEMSTORE = 208, KP_MEMSTORE = 208,
SDL_SCANCODE_KP_MEMRECALL = 209, KP_MEMRECALL = 209,
SDL_SCANCODE_KP_MEMCLEAR = 210, KP_MEMCLEAR = 210,
SDL_SCANCODE_KP_MEMADD = 211, KP_MEMADD = 211,
SDL_SCANCODE_KP_MEMSUBTRACT = 212, KP_MEMSUBTRACT = 212,
SDL_SCANCODE_KP_MEMMULTIPLY = 213, KP_MEMMULTIPLY = 213,
SDL_SCANCODE_KP_MEMDIVIDE = 214, KP_MEMDIVIDE = 214,
SDL_SCANCODE_KP_PLUSMINUS = 215, KP_PLUSMINUS = 215,
SDL_SCANCODE_KP_CLEAR = 216, KP_CLEAR = 216,
SDL_SCANCODE_KP_CLEARENTRY = 217, KP_CLEARENTRY = 217,
SDL_SCANCODE_KP_BINARY = 218, KP_BINARY = 218,
SDL_SCANCODE_KP_OCTAL = 219, KP_OCTAL = 219,
SDL_SCANCODE_KP_DECIMAL = 220, KP_DECIMAL = 220,
SDL_SCANCODE_KP_HEXADECIMAL = 221, KP_HEXADECIMAL = 221,
SDL_SCANCODE_LCTRL = 224, LCTRL = 224,
SDL_SCANCODE_LSHIFT = 225, LSHIFT = 225,
SDL_SCANCODE_LALT = 226, /**< alt, option */ LALT = 226, /**< alt, option */
SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ LGUI = 227, /**< windows, command (apple), meta */
SDL_SCANCODE_RCTRL = 228, RCTRL = 228,
SDL_SCANCODE_RSHIFT = 229, RSHIFT = 229,
SDL_SCANCODE_RALT = 230, /**< alt gr, option */ RALT = 230, /**< alt gr, option */
SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ RGUI = 231, /**< windows, command (apple), meta */
SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered MODE = 257, /**< I'm not sure if this is really not covered
* by any of the above, but since there's a * by any of the above, but since there's a
* special SDL_KMOD_MODE for it I'm adding it here * special SDL_KMOD_MODE for it I'm adding it here
*/ */
@@ -312,39 +312,39 @@ enum class ScanCode
*/ */
/* @{ */ /* @{ */
SDL_SCANCODE_SLEEP = 258, /**< Sleep */ SLEEP = 258, /**< Sleep */
SDL_SCANCODE_WAKE = 259, /**< Wake */ WAKE = 259, /**< Wake */
SDL_SCANCODE_CHANNEL_INCREMENT = 260, /**< Channel Increment */ CHANNEL_INCREMENT = 260, /**< Channel Increment */
SDL_SCANCODE_CHANNEL_DECREMENT = 261, /**< Channel Decrement */ CHANNEL_DECREMENT = 261, /**< Channel Decrement */
SDL_SCANCODE_MEDIA_PLAY = 262, /**< Play */ MEDIA_PLAY = 262, /**< Play */
SDL_SCANCODE_MEDIA_PAUSE = 263, /**< Pause */ MEDIA_PAUSE = 263, /**< Pause */
SDL_SCANCODE_MEDIA_RECORD = 264, /**< Record */ MEDIA_RECORD = 264, /**< Record */
SDL_SCANCODE_MEDIA_FAST_FORWARD = 265, /**< Fast Forward */ MEDIA_FAST_FORWARD = 265, /**< Fast Forward */
SDL_SCANCODE_MEDIA_REWIND = 266, /**< Rewind */ MEDIA_REWIND = 266, /**< Rewind */
SDL_SCANCODE_MEDIA_NEXT_TRACK = 267, /**< Next Track */ MEDIA_NEXT_TRACK = 267, /**< Next Track */
SDL_SCANCODE_MEDIA_PREVIOUS_TRACK = 268, /**< Previous Track */ MEDIA_PREVIOUS_TRACK = 268, /**< Previous Track */
SDL_SCANCODE_MEDIA_STOP = 269, /**< Stop */ MEDIA_STOP = 269, /**< Stop */
SDL_SCANCODE_MEDIA_EJECT = 270, /**< Eject */ MEDIA_EJECT = 270, /**< Eject */
SDL_SCANCODE_MEDIA_PLAY_PAUSE = 271, /**< Play / Pause */ MEDIA_PLAY_PAUSE = 271, /**< Play / Pause */
SDL_SCANCODE_MEDIA_SELECT = 272, /* Media Select */ MEDIA_SELECT = 272, /* Media Select */
SDL_SCANCODE_AC_NEW = 273, /**< AC New */ AC_NEW = 273, /**< AC New */
SDL_SCANCODE_AC_OPEN = 274, /**< AC Open */ AC_OPEN = 274, /**< AC Open */
SDL_SCANCODE_AC_CLOSE = 275, /**< AC Close */ AC_CLOSE = 275, /**< AC Close */
SDL_SCANCODE_AC_EXIT = 276, /**< AC Exit */ AC_EXIT = 276, /**< AC Exit */
SDL_SCANCODE_AC_SAVE = 277, /**< AC Save */ AC_SAVE = 277, /**< AC Save */
SDL_SCANCODE_AC_PRINT = 278, /**< AC Print */ AC_PRINT = 278, /**< AC Print */
SDL_SCANCODE_AC_PROPERTIES = 279, /**< AC Properties */ AC_PROPERTIES = 279, /**< AC Properties */
SDL_SCANCODE_AC_SEARCH = 280, /**< AC Search */ AC_SEARCH = 280, /**< AC Search */
SDL_SCANCODE_AC_HOME = 281, /**< AC Home */ AC_HOME = 281, /**< AC Home */
SDL_SCANCODE_AC_BACK = 282, /**< AC Back */ AC_BACK = 282, /**< AC Back */
SDL_SCANCODE_AC_FORWARD = 283, /**< AC Forward */ AC_FORWARD = 283, /**< AC Forward */
SDL_SCANCODE_AC_STOP = 284, /**< AC Stop */ AC_STOP = 284, /**< AC Stop */
SDL_SCANCODE_AC_REFRESH = 285, /**< AC Refresh */ AC_REFRESH = 285, /**< AC Refresh */
SDL_SCANCODE_AC_BOOKMARKS = 286, /**< AC Bookmarks */ AC_BOOKMARKS = 286, /**< AC Bookmarks */
/* @} */ /* Usage page 0x0C */ /* @} */ /* Usage page 0x0C */
@@ -355,24 +355,24 @@ enum class ScanCode
*/ */
/* @{ */ /* @{ */
SDL_SCANCODE_SOFTLEFT = 287, /**< Usually situated below the display on phones and SOFTLEFT = 287, /**< Usually situated below the display on phones and
used as a multi-function feature key for selecting used as a multi-function feature key for selecting
a software defined function shown on the bottom left a software defined function shown on the bottom left
of the display. */ of the display. */
SDL_SCANCODE_SOFTRIGHT = 288, /**< Usually situated below the display on phones and SOFTRIGHT = 288, /**< Usually situated below the display on phones and
used as a multi-function feature key for selecting used as a multi-function feature key for selecting
a software defined function shown on the bottom right a software defined function shown on the bottom right
of the display. */ of the display. */
SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ CALL = 289, /**< Used for accepting phone calls. */
SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ ENDCALL = 290, /**< Used for rejecting phone calls. */
/* @} */ /* Mobile keys */ /* @} */ /* Mobile keys */
/* Add any other keys here. */ /* Add any other keys here. */
SDL_SCANCODE_RESERVED = 400, /**< 400-500 reserved for dynamic keycodes */ RESERVED = 400, /**< 400-500 reserved for dynamic keycodes */
SDL_SCANCODE_COUNT = 512 /**< not a key, just marks the number of scancodes for array bounds */ COUNT = 512 /**< not a key, just marks the number of scancodes for array bounds */
}; };
namespace Game namespace Game

View File

@@ -56,15 +56,18 @@ namespace Game
else else
{ {
float scale = 1.0f + TestX * 0.4f; float scale = 1.0f + TestX * 0.4f;
Mat4::CreateTransform(Transform.M, Transform::CreateTransform(
Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX}, Transform.M.M,
Quat::FromEuler(time * 10.0f + TestX, time * 5.0f * TestY, 0.0f), bx::Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX},
{scale, scale, scale}); bx::fromEuler(
{static_cast<float>(time * 10.0f + TestX), static_cast<float>(time * 5.0f * TestY), 0.0f}),
{scale, scale, scale});
} }
} }
else else
{ {
Mat4::CreateTransform(Transform.M, {0.0f, -30.0f, 100.0f}, {}, {100.0f, 10.0f, 100.0f}); Transform::CreateTransform(
Transform.M.M, {0.0f, -30.0f, 100.0f}, bx::Quaternion(0.0f, 0.0f, 0.0f, 1.0f), {100.0f, 10.0f, 100.0f});
} }
} }
} // namespace Game } // namespace Game

View File

@@ -1,91 +1,90 @@
#pragma once #pragma once
#include "Global.h"
#include "../engine/Shared.h" #include "../engine/Shared.h"
#include "Global.h"
#include "Log.h" #include "Log.h"
#include <bgfx/bgfx.h> #include <bgfx/bgfx.h>
namespace Game namespace Game
{ {
typedef uint16_t CubeHandle; typedef uint16_t CubeHandle;
struct Cube
{
int32_t TestX = -1;
int32_t TestY = -1;
Mat4 Transform;
uint16_t MaterialIdx = 0;
uint16_t ModelIdx = 0;
void Setup(); struct Cube
void Update(); {
}; int32_t TestX = -1;
int32_t TestY = -1;
Transform Transform;
uint16_t MaterialIdx = 0;
uint16_t ModelIdx = 0;
template<typename T, uint32_t C> void Setup();
class EntityManager void Update();
{ };
public:
uint16_t Count = 0;
T* Data = nullptr;
uint32_t EntitySize = 0;
public: template <typename T, uint32_t C> class EntityManager
uint64_t Setup(void* ptr) {
{ public:
if (EntitySize != sizeof(T)) uint16_t Count = 0;
{ T* Data = nullptr;
Count = 0; uint32_t EntitySize = 0;
}
EntitySize = sizeof(T);
Data = reinterpret_cast<T*>(ptr);
return C*sizeof(T);
}
T* New()
{
if (Data == nullptr)
{
Log("Accessed EntityManager before setup!");
return nullptr;
}
if (Count >= C)
{
Log("Too many entities!");
return nullptr;
}
Data[Count] = {};
Data[Count].Setup();
T* result = &Data[Count];
++Count;
return result;
}
T* Get(uint16_t idx) public:
{ uint64_t Setup(void* ptr)
if (idx > Count) {
{ if (EntitySize != sizeof(T))
Log("OOB Access!"); {
return nullptr; Count = 0;
} }
return &Data[idx]; EntitySize = sizeof(T);
} Data = reinterpret_cast<T*>(ptr);
return C * sizeof(T);
void Update() }
{
for (uint32_t i = 0; i < Count; ++i)
{
Data[i].Update();
}
}
};
class Level
{
public:
EntityManager<Cube, 1024> Cubes;
public: T* New()
void Setup(GameData& data); {
void Update(); if (Data == nullptr)
}; {
} Log("Accessed EntityManager before setup!");
return nullptr;
}
if (Count >= C)
{
Log("Too many entities!");
return nullptr;
}
Data[Count] = {};
Data[Count].Setup();
T* result = &Data[Count];
++Count;
return result;
}
T* Get(uint16_t idx)
{
if (idx > Count)
{
Log("OOB Access!");
return nullptr;
}
return &Data[idx];
}
void Update()
{
for (uint32_t i = 0; i < Count; ++i)
{
Data[i].Update();
}
}
};
class Level
{
public:
EntityManager<Cube, 1024> Cubes;
public:
void Setup(GameData& data);
void Update();
};
} // namespace Game

View File

@@ -6,6 +6,7 @@
#include "../Mesh.h" #include "../Mesh.h"
#include "Rendering.h" #include "Rendering.h"
#include "bgfx/defines.h" #include "bgfx/defines.h"
#include "bx/math.h"
#include "bx/timer.h" #include "bx/timer.h"
#include <bgfx/bgfx.h> #include <bgfx/bgfx.h>
#include <bx/file.h> #include <bx/file.h>
@@ -179,26 +180,24 @@ namespace Game
constexpr float moveSpeed = 10.0f; constexpr float moveSpeed = 10.0f;
constexpr float rotSpeed = 1.0f; constexpr float rotSpeed = 1.0f;
float forwardInput = float forwardInput = (GetKey(ScanCode::W) ? 1.0f : 0.0f) + (GetKey(ScanCode::S) ? -1.0f : 0.0f);
(GetKey(ScanCode::SDL_SCANCODE_W) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_S) ? -1.0f : 0.0f); float rightInput = (GetKey(ScanCode::D) ? 1.0f : 0.0f) + (GetKey(ScanCode::A) ? -1.0f : 0.0f);
float rightInput = bx::Vec3 moveInput = bx::Vec3{rightInput, forwardInput, 0.0f};
(GetKey(ScanCode::SDL_SCANCODE_D) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_A) ? -1.0f : 0.0f); moveInput = bx::normalize(moveInput);
Vec2 moveInput = Vec2{rightInput, forwardInput}; bx::Vec3 inputVec = {moveInput.x * delta * moveSpeed, 0.0f, moveInput.y * delta * moveSpeed};
moveInput.Normalize();
Vec3 inputVec = {moveInput.X * delta * moveSpeed, 0.0f, moveInput.Y * delta * moveSpeed};
Vec3 camForward = Cam.Transform.Forward(); bx::Vec3 camForward = Cam.Transform.Forward();
Vec3 camRight = Cam.Transform.Right(); bx::Vec3 camRight = Cam.Transform.Right();
Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f}; bx::Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f};
Cam.Transform.Rotate({0.0f, rotInput.Y, 0.0f}); Cam.FreelookXRot += rotInput.x;
// TODO: split transform into rot matrix and translation Cam.FreelookYRot += rotInput.y;
bx::mtxRotateY(Cam.Transform.Rotation.M, Cam.FreelookYRot);
Cam.Transform.RotateLocal({Cam.FreelookXRot, 0.0f, 0.0f});
// Cam.Transform.Translate(
// {camForward.X * forwardInput, camForward.Y * forwardInput, camForward.Z * forwardInput});
Cam.Transform.TranslateLocal({0.0f, 0.0f, -forwardInput}); Cam.Transform.TranslateLocal({0.0f, 0.0f, -forwardInput});
Cam.Transform.TranslateLocal({-rightInput, 0.0f, 0.0f}); Cam.Transform.TranslateLocal({-rightInput, 0.0f, 0.0f});
bgfx::dbgTextPrintf(1, 4, 0x0f, "Cam forward: %.2f %.2f %.2f", camForward.X, camForward.Y, camForward.Z); bgfx::dbgTextPrintf(1, 4, 0x0f, "Cam forward: %.2f %.2f %.2f", camForward.x, camForward.y, camForward.z);
} }
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
@@ -210,7 +209,8 @@ namespace Game
0.1f, 0.1f,
1000.0f, 1000.0f,
bgfx::getCaps()->homogeneousDepth); bgfx::getCaps()->homogeneousDepth);
bgfx::setViewTransform(0, Cam.Transform.M, proj); Cam.Transform.UpdateMatrix();
bgfx::setViewTransform(0, Cam.Transform.M.M, proj);
// Set view 0 default viewport. // Set view 0 default viewport.
bgfx::setViewRect(0, 0, 0, shared.Window.WindowWidth, shared.Window.WindowHeight); bgfx::setViewRect(0, 0, 0, shared.Window.WindowWidth, shared.Window.WindowHeight);
@@ -224,7 +224,7 @@ namespace Game
Cube* c = GetInstance().GameLevel.Cubes.Get(i); Cube* c = GetInstance().GameLevel.Cubes.Get(i);
if (c) if (c)
{ {
bgfx::setTransform(c->Transform.M); bgfx::setTransform(c->Transform.M.M);
Model& currentModel = Models[c->ModelIdx]; Model& currentModel = Models[c->ModelIdx];
Material& currentMaterial = Materials[c->MaterialIdx]; Material& currentMaterial = Materials[c->MaterialIdx];

View File

@@ -113,7 +113,9 @@ namespace Game
struct Camera struct Camera
{ {
Mat4 Transform; float FreelookXRot = 0.0f;
float FreelookYRot = 0.0f;
Transform Transform;
}; };
class GameRendering class GameRendering