diff --git a/src/game/Global.cpp b/src/game/Global.cpp index 271699b..9476d58 100644 --- a/src/game/Global.cpp +++ b/src/game/Global.cpp @@ -1,5 +1,6 @@ #include "Global.h" -#include "bx/constants.h" +#include "bx/bx.h" +#include "bx/float4x4_t.h" #include "bx/math.h" #include @@ -9,89 +10,77 @@ namespace Game::GameInstance* GameInst = nullptr; } // namespace -void Vec2::Normalize() -{ - 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) +void Transform::CreateTransform(float* out, bx::Vec3 pos, bx::Quaternion rot, bx::Vec3 scale) { if (out == nullptr) return; float rMat[16]{0}; float tMat[16]{0}; float sMat[16]{0}; - bx::mtxFromQuaternion(rMat, bx::Quaternion{rot.X, rot.Y, rot.Z, rot.W}); - bx::mtxTranslate(tMat, pos.X, pos.Y, pos.Z); - bx::mtxScale(sMat, scale.X, scale.Y, scale.Z); + bx::mtxFromQuaternion(rMat, bx::Quaternion{rot.x, rot.y, rot.z, rot.w}); + bx::mtxTranslate(tMat, pos.x, pos.y, pos.z); + bx::mtxScale(sMat, scale.x, scale.y, scale.z); float buf[16]{0}; bx::mtxMul(buf, rMat, sMat); bx::mtxMul(out, buf, tMat); } -void Mat4::TranslateLocal(Vec3 offset) +void Transform::Translate(bx::Vec3 offset) { - M[12] += offset.X; - M[13] += offset.Y; - M[14] += offset.Z; + Position = bx::add(Position, offset); } -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}; - bx::mtxRotateXYZ(rot, rotation.X, rotation.Y, rotation.Z); + bx::mtxRotateXYZ(rot, rotation.x, rotation.y, rotation.z); float temp[16]{0}; - bx::mtxMul(temp, M, rot); - for (int32_t i = 0; i < 16; ++i) - M[i] = temp[i]; + bx::mtxMul(temp, rot, Rotation.M); + bx::memCopy(Rotation.M, temp, sizeof(temp)); } -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 diff --git a/src/game/Global.h b/src/game/Global.h index 8f83d58..1029a3e 100644 --- a/src/game/Global.h +++ b/src/game/Global.h @@ -1,53 +1,6 @@ #pragma once -#include -#include -struct SharedData; - -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); -}; +#include "bx/math.h" struct Mat4 { @@ -69,15 +22,30 @@ struct Mat4 0.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 { struct GameInstance; diff --git a/src/game/Input.h b/src/game/Input.h index dd35a1a..f7a724b 100644 --- a/src/game/Input.h +++ b/src/game/Input.h @@ -2,7 +2,7 @@ enum class ScanCode { - SDL_SCANCODE_UNKNOWN = 0, + UNKNOWN = 0, /** * \name Usage page 0x07 @@ -11,55 +11,55 @@ enum class ScanCode */ /* @{ */ - SDL_SCANCODE_A = 4, - SDL_SCANCODE_B = 5, - SDL_SCANCODE_C = 6, - SDL_SCANCODE_D = 7, - SDL_SCANCODE_E = 8, - SDL_SCANCODE_F = 9, - SDL_SCANCODE_G = 10, - SDL_SCANCODE_H = 11, - SDL_SCANCODE_I = 12, - SDL_SCANCODE_J = 13, - SDL_SCANCODE_K = 14, - SDL_SCANCODE_L = 15, - SDL_SCANCODE_M = 16, - SDL_SCANCODE_N = 17, - SDL_SCANCODE_O = 18, - SDL_SCANCODE_P = 19, - SDL_SCANCODE_Q = 20, - SDL_SCANCODE_R = 21, - SDL_SCANCODE_S = 22, - SDL_SCANCODE_T = 23, - SDL_SCANCODE_U = 24, - SDL_SCANCODE_V = 25, - SDL_SCANCODE_W = 26, - SDL_SCANCODE_X = 27, - SDL_SCANCODE_Y = 28, - SDL_SCANCODE_Z = 29, + A = 4, + B = 5, + C = 6, + D = 7, + E = 8, + F = 9, + G = 10, + H = 11, + I = 12, + J = 13, + K = 14, + L = 15, + M = 16, + N = 17, + O = 18, + P = 19, + Q = 20, + R = 21, + S = 22, + T = 23, + U = 24, + V = 25, + W = 26, + X = 27, + Y = 28, + Z = 29, - SDL_SCANCODE_1 = 30, - SDL_SCANCODE_2 = 31, - SDL_SCANCODE_3 = 32, - SDL_SCANCODE_4 = 33, - SDL_SCANCODE_5 = 34, - SDL_SCANCODE_6 = 35, - SDL_SCANCODE_7 = 36, - SDL_SCANCODE_8 = 37, - SDL_SCANCODE_9 = 38, - SDL_SCANCODE_0 = 39, + _1 = 30, + _2 = 31, + _3 = 32, + _4 = 33, + _5 = 34, + _6 = 35, + _7 = 36, + _8 = 37, + _9 = 38, + _0 = 39, - SDL_SCANCODE_RETURN = 40, - SDL_SCANCODE_ESCAPE = 41, - SDL_SCANCODE_BACKSPACE = 42, - SDL_SCANCODE_TAB = 43, - SDL_SCANCODE_SPACE = 44, + RETURN = 40, + ESCAPE = 41, + BACKSPACE = 42, + TAB = 43, + SPACE = 44, - SDL_SCANCODE_MINUS = 45, - SDL_SCANCODE_EQUALS = 46, - SDL_SCANCODE_LEFTBRACKET = 47, - SDL_SCANCODE_RIGHTBRACKET = 48, - SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + MINUS = 45, + EQUALS = 46, + LEFTBRACKET = 47, + RIGHTBRACKET = 48, + BACKSLASH = 49, /**< Located at the lower left of the return * key on ISO keyboards and at the right end * of the QWERTY row on ANSI keyboards. * Produces REVERSE SOLIDUS (backslash) and @@ -73,21 +73,21 @@ enum class ScanCode * layout, and ASTERISK and MICRO SIGN in a * 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 * OSes I've seen treat the two codes * identically. So, as an implementor, unless * your keyboard generates both of those * 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 * should not rely on this code because SDL * will never generate it with most (all?) * keyboards. */ - SDL_SCANCODE_SEMICOLON = 51, - SDL_SCANCODE_APOSTROPHE = 52, - SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + SEMICOLON = 51, + APOSTROPHE = 52, + GRAVE = 53, /**< Located in the top left corner (on both ANSI * and ISO keyboards). Produces GRAVE ACCENT and * TILDE in a US Windows layout and in US and UK * Mac layouts on ANSI keyboards, GRAVE ACCENT @@ -104,60 +104,60 @@ enum class ScanCode * SIGN in a Swiss German, German, or French Mac * layout on ANSI keyboards. */ - SDL_SCANCODE_COMMA = 54, - SDL_SCANCODE_PERIOD = 55, - SDL_SCANCODE_SLASH = 56, + COMMA = 54, + PERIOD = 55, + SLASH = 56, - SDL_SCANCODE_CAPSLOCK = 57, + CAPSLOCK = 57, - SDL_SCANCODE_F1 = 58, - SDL_SCANCODE_F2 = 59, - SDL_SCANCODE_F3 = 60, - SDL_SCANCODE_F4 = 61, - SDL_SCANCODE_F5 = 62, - SDL_SCANCODE_F6 = 63, - SDL_SCANCODE_F7 = 64, - SDL_SCANCODE_F8 = 65, - SDL_SCANCODE_F9 = 66, - SDL_SCANCODE_F10 = 67, - SDL_SCANCODE_F11 = 68, - SDL_SCANCODE_F12 = 69, + F1 = 58, + F2 = 59, + F3 = 60, + F4 = 61, + F5 = 62, + F6 = 63, + F7 = 64, + F8 = 65, + F9 = 66, + F10 = 67, + F11 = 68, + F12 = 69, - SDL_SCANCODE_PRINTSCREEN = 70, - SDL_SCANCODE_SCROLLLOCK = 71, - SDL_SCANCODE_PAUSE = 72, - SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + PRINTSCREEN = 70, + SCROLLLOCK = 71, + PAUSE = 72, + INSERT = 73, /**< insert on PC, help on some Mac keyboards (but does send code 73, not 117) */ - SDL_SCANCODE_HOME = 74, - SDL_SCANCODE_PAGEUP = 75, - SDL_SCANCODE_DELETE = 76, - SDL_SCANCODE_END = 77, - SDL_SCANCODE_PAGEDOWN = 78, - SDL_SCANCODE_RIGHT = 79, - SDL_SCANCODE_LEFT = 80, - SDL_SCANCODE_DOWN = 81, - SDL_SCANCODE_UP = 82, + HOME = 74, + PAGEUP = 75, + DELETE = 76, + END = 77, + PAGEDOWN = 78, + RIGHT = 79, + LEFT = 80, + DOWN = 81, + 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, - SDL_SCANCODE_KP_MULTIPLY = 85, - SDL_SCANCODE_KP_MINUS = 86, - SDL_SCANCODE_KP_PLUS = 87, - SDL_SCANCODE_KP_ENTER = 88, - SDL_SCANCODE_KP_1 = 89, - SDL_SCANCODE_KP_2 = 90, - SDL_SCANCODE_KP_3 = 91, - SDL_SCANCODE_KP_4 = 92, - SDL_SCANCODE_KP_5 = 93, - SDL_SCANCODE_KP_6 = 94, - SDL_SCANCODE_KP_7 = 95, - SDL_SCANCODE_KP_8 = 96, - SDL_SCANCODE_KP_9 = 97, - SDL_SCANCODE_KP_0 = 98, - SDL_SCANCODE_KP_PERIOD = 99, + KP_DIVIDE = 84, + KP_MULTIPLY = 85, + KP_MINUS = 86, + KP_PLUS = 87, + KP_ENTER = 88, + KP_1 = 89, + KP_2 = 90, + KP_3 = 91, + KP_4 = 92, + KP_5 = 93, + KP_6 = 94, + KP_7 = 95, + KP_8 = 96, + KP_9 = 97, + KP_0 = 98, + 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, * located between left shift and Y. * Produces GRAVE ACCENT and TILDE in a @@ -167,134 +167,134 @@ enum class ScanCode * LESS-THAN SIGN and GREATER-THAN SIGN * in a Swiss German, German, or French * layout. */ - SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ - SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + APPLICATION = 101, /**< windows contextual menu, compose */ + POWER = 102, /**< The USB document says this is a status flag, * not a physical key - but some Mac keyboards * do have a power key. */ - SDL_SCANCODE_KP_EQUALS = 103, - SDL_SCANCODE_F13 = 104, - SDL_SCANCODE_F14 = 105, - SDL_SCANCODE_F15 = 106, - SDL_SCANCODE_F16 = 107, - SDL_SCANCODE_F17 = 108, - SDL_SCANCODE_F18 = 109, - SDL_SCANCODE_F19 = 110, - SDL_SCANCODE_F20 = 111, - SDL_SCANCODE_F21 = 112, - SDL_SCANCODE_F22 = 113, - SDL_SCANCODE_F23 = 114, - SDL_SCANCODE_F24 = 115, - SDL_SCANCODE_EXECUTE = 116, - SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ - SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ - SDL_SCANCODE_SELECT = 119, - SDL_SCANCODE_STOP = 120, /**< AC Stop */ - SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ - SDL_SCANCODE_UNDO = 122, /**< AC Undo */ - SDL_SCANCODE_CUT = 123, /**< AC Cut */ - SDL_SCANCODE_COPY = 124, /**< AC Copy */ - SDL_SCANCODE_PASTE = 125, /**< AC Paste */ - SDL_SCANCODE_FIND = 126, /**< AC Find */ - SDL_SCANCODE_MUTE = 127, - SDL_SCANCODE_VOLUMEUP = 128, - SDL_SCANCODE_VOLUMEDOWN = 129, + KP_EQUALS = 103, + F13 = 104, + F14 = 105, + F15 = 106, + F16 = 107, + F17 = 108, + F18 = 109, + F19 = 110, + F20 = 111, + F21 = 112, + F22 = 113, + F23 = 114, + F24 = 115, + EXECUTE = 116, + HELP = 117, /**< AL Integrated Help Center */ + MENU = 118, /**< Menu (show menu) */ + SELECT = 119, + STOP = 120, /**< AC Stop */ + AGAIN = 121, /**< AC Redo/Repeat */ + UNDO = 122, /**< AC Undo */ + CUT = 123, /**< AC Cut */ + COPY = 124, /**< AC Copy */ + PASTE = 125, /**< AC Paste */ + FIND = 126, /**< AC Find */ + MUTE = 127, + VOLUMEUP = 128, + VOLUMEDOWN = 129, /* not sure whether there's a reason to enable these */ - /* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ - /* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ - /* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ - SDL_SCANCODE_KP_COMMA = 133, - SDL_SCANCODE_KP_EQUALSAS400 = 134, + /* LOCKINGCAPSLOCK = 130, */ + /* LOCKINGNUMLOCK = 131, */ + /* LOCKINGSCROLLLOCK = 132, */ + KP_COMMA = 133, + KP_EQUALSAS400 = 134, - SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + INTERNATIONAL1 = 135, /**< used on Asian keyboards, see footnotes in USB doc */ - SDL_SCANCODE_INTERNATIONAL2 = 136, - SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ - SDL_SCANCODE_INTERNATIONAL4 = 138, - SDL_SCANCODE_INTERNATIONAL5 = 139, - SDL_SCANCODE_INTERNATIONAL6 = 140, - SDL_SCANCODE_INTERNATIONAL7 = 141, - SDL_SCANCODE_INTERNATIONAL8 = 142, - SDL_SCANCODE_INTERNATIONAL9 = 143, - SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ - SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ - SDL_SCANCODE_LANG3 = 146, /**< Katakana */ - SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ - SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ - SDL_SCANCODE_LANG6 = 149, /**< reserved */ - SDL_SCANCODE_LANG7 = 150, /**< reserved */ - SDL_SCANCODE_LANG8 = 151, /**< reserved */ - SDL_SCANCODE_LANG9 = 152, /**< reserved */ + INTERNATIONAL2 = 136, + INTERNATIONAL3 = 137, /**< Yen */ + INTERNATIONAL4 = 138, + INTERNATIONAL5 = 139, + INTERNATIONAL6 = 140, + INTERNATIONAL7 = 141, + INTERNATIONAL8 = 142, + INTERNATIONAL9 = 143, + LANG1 = 144, /**< Hangul/English toggle */ + LANG2 = 145, /**< Hanja conversion */ + LANG3 = 146, /**< Katakana */ + LANG4 = 147, /**< Hiragana */ + LANG5 = 148, /**< Zenkaku/Hankaku */ + LANG6 = 149, /**< reserved */ + LANG7 = 150, /**< reserved */ + LANG8 = 151, /**< reserved */ + LANG9 = 152, /**< reserved */ - SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ - SDL_SCANCODE_SYSREQ = 154, - SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ - SDL_SCANCODE_CLEAR = 156, - SDL_SCANCODE_PRIOR = 157, - SDL_SCANCODE_RETURN2 = 158, - SDL_SCANCODE_SEPARATOR = 159, - SDL_SCANCODE_OUT = 160, - SDL_SCANCODE_OPER = 161, - SDL_SCANCODE_CLEARAGAIN = 162, - SDL_SCANCODE_CRSEL = 163, - SDL_SCANCODE_EXSEL = 164, + ALTERASE = 153, /**< Erase-Eaze */ + SYSREQ = 154, + CANCEL = 155, /**< AC Cancel */ + CLEAR = 156, + PRIOR = 157, + RETURN2 = 158, + SEPARATOR = 159, + OUT = 160, + OPER = 161, + CLEARAGAIN = 162, + CRSEL = 163, + EXSEL = 164, - SDL_SCANCODE_KP_00 = 176, - SDL_SCANCODE_KP_000 = 177, - SDL_SCANCODE_THOUSANDSSEPARATOR = 178, - SDL_SCANCODE_DECIMALSEPARATOR = 179, - SDL_SCANCODE_CURRENCYUNIT = 180, - SDL_SCANCODE_CURRENCYSUBUNIT = 181, - SDL_SCANCODE_KP_LEFTPAREN = 182, - SDL_SCANCODE_KP_RIGHTPAREN = 183, - SDL_SCANCODE_KP_LEFTBRACE = 184, - SDL_SCANCODE_KP_RIGHTBRACE = 185, - SDL_SCANCODE_KP_TAB = 186, - SDL_SCANCODE_KP_BACKSPACE = 187, - SDL_SCANCODE_KP_A = 188, - SDL_SCANCODE_KP_B = 189, - SDL_SCANCODE_KP_C = 190, - SDL_SCANCODE_KP_D = 191, - SDL_SCANCODE_KP_E = 192, - SDL_SCANCODE_KP_F = 193, - SDL_SCANCODE_KP_XOR = 194, - SDL_SCANCODE_KP_POWER = 195, - SDL_SCANCODE_KP_PERCENT = 196, - SDL_SCANCODE_KP_LESS = 197, - SDL_SCANCODE_KP_GREATER = 198, - SDL_SCANCODE_KP_AMPERSAND = 199, - SDL_SCANCODE_KP_DBLAMPERSAND = 200, - SDL_SCANCODE_KP_VERTICALBAR = 201, - SDL_SCANCODE_KP_DBLVERTICALBAR = 202, - SDL_SCANCODE_KP_COLON = 203, - SDL_SCANCODE_KP_HASH = 204, - SDL_SCANCODE_KP_SPACE = 205, - SDL_SCANCODE_KP_AT = 206, - SDL_SCANCODE_KP_EXCLAM = 207, - SDL_SCANCODE_KP_MEMSTORE = 208, - SDL_SCANCODE_KP_MEMRECALL = 209, - SDL_SCANCODE_KP_MEMCLEAR = 210, - SDL_SCANCODE_KP_MEMADD = 211, - SDL_SCANCODE_KP_MEMSUBTRACT = 212, - SDL_SCANCODE_KP_MEMMULTIPLY = 213, - SDL_SCANCODE_KP_MEMDIVIDE = 214, - SDL_SCANCODE_KP_PLUSMINUS = 215, - SDL_SCANCODE_KP_CLEAR = 216, - SDL_SCANCODE_KP_CLEARENTRY = 217, - SDL_SCANCODE_KP_BINARY = 218, - SDL_SCANCODE_KP_OCTAL = 219, - SDL_SCANCODE_KP_DECIMAL = 220, - SDL_SCANCODE_KP_HEXADECIMAL = 221, + KP_00 = 176, + KP_000 = 177, + THOUSANDSSEPARATOR = 178, + DECIMALSEPARATOR = 179, + CURRENCYUNIT = 180, + CURRENCYSUBUNIT = 181, + KP_LEFTPAREN = 182, + KP_RIGHTPAREN = 183, + KP_LEFTBRACE = 184, + KP_RIGHTBRACE = 185, + KP_TAB = 186, + KP_BACKSPACE = 187, + KP_A = 188, + KP_B = 189, + KP_C = 190, + KP_D = 191, + KP_E = 192, + KP_F = 193, + KP_XOR = 194, + KP_POWER = 195, + KP_PERCENT = 196, + KP_LESS = 197, + KP_GREATER = 198, + KP_AMPERSAND = 199, + KP_DBLAMPERSAND = 200, + KP_VERTICALBAR = 201, + KP_DBLVERTICALBAR = 202, + KP_COLON = 203, + KP_HASH = 204, + KP_SPACE = 205, + KP_AT = 206, + KP_EXCLAM = 207, + KP_MEMSTORE = 208, + KP_MEMRECALL = 209, + KP_MEMCLEAR = 210, + KP_MEMADD = 211, + KP_MEMSUBTRACT = 212, + KP_MEMMULTIPLY = 213, + KP_MEMDIVIDE = 214, + KP_PLUSMINUS = 215, + KP_CLEAR = 216, + KP_CLEARENTRY = 217, + KP_BINARY = 218, + KP_OCTAL = 219, + KP_DECIMAL = 220, + KP_HEXADECIMAL = 221, - SDL_SCANCODE_LCTRL = 224, - SDL_SCANCODE_LSHIFT = 225, - SDL_SCANCODE_LALT = 226, /**< alt, option */ - SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ - SDL_SCANCODE_RCTRL = 228, - SDL_SCANCODE_RSHIFT = 229, - SDL_SCANCODE_RALT = 230, /**< alt gr, option */ - SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ + LCTRL = 224, + LSHIFT = 225, + LALT = 226, /**< alt, option */ + LGUI = 227, /**< windows, command (apple), meta */ + RCTRL = 228, + RSHIFT = 229, + RALT = 230, /**< alt gr, option */ + 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 * special SDL_KMOD_MODE for it I'm adding it here */ @@ -312,39 +312,39 @@ enum class ScanCode */ /* @{ */ - SDL_SCANCODE_SLEEP = 258, /**< Sleep */ - SDL_SCANCODE_WAKE = 259, /**< Wake */ + SLEEP = 258, /**< Sleep */ + WAKE = 259, /**< Wake */ - SDL_SCANCODE_CHANNEL_INCREMENT = 260, /**< Channel Increment */ - SDL_SCANCODE_CHANNEL_DECREMENT = 261, /**< Channel Decrement */ + CHANNEL_INCREMENT = 260, /**< Channel Increment */ + CHANNEL_DECREMENT = 261, /**< Channel Decrement */ - SDL_SCANCODE_MEDIA_PLAY = 262, /**< Play */ - SDL_SCANCODE_MEDIA_PAUSE = 263, /**< Pause */ - SDL_SCANCODE_MEDIA_RECORD = 264, /**< Record */ - SDL_SCANCODE_MEDIA_FAST_FORWARD = 265, /**< Fast Forward */ - SDL_SCANCODE_MEDIA_REWIND = 266, /**< Rewind */ - SDL_SCANCODE_MEDIA_NEXT_TRACK = 267, /**< Next Track */ - SDL_SCANCODE_MEDIA_PREVIOUS_TRACK = 268, /**< Previous Track */ - SDL_SCANCODE_MEDIA_STOP = 269, /**< Stop */ - SDL_SCANCODE_MEDIA_EJECT = 270, /**< Eject */ - SDL_SCANCODE_MEDIA_PLAY_PAUSE = 271, /**< Play / Pause */ - SDL_SCANCODE_MEDIA_SELECT = 272, /* Media Select */ + MEDIA_PLAY = 262, /**< Play */ + MEDIA_PAUSE = 263, /**< Pause */ + MEDIA_RECORD = 264, /**< Record */ + MEDIA_FAST_FORWARD = 265, /**< Fast Forward */ + MEDIA_REWIND = 266, /**< Rewind */ + MEDIA_NEXT_TRACK = 267, /**< Next Track */ + MEDIA_PREVIOUS_TRACK = 268, /**< Previous Track */ + MEDIA_STOP = 269, /**< Stop */ + MEDIA_EJECT = 270, /**< Eject */ + MEDIA_PLAY_PAUSE = 271, /**< Play / Pause */ + MEDIA_SELECT = 272, /* Media Select */ - SDL_SCANCODE_AC_NEW = 273, /**< AC New */ - SDL_SCANCODE_AC_OPEN = 274, /**< AC Open */ - SDL_SCANCODE_AC_CLOSE = 275, /**< AC Close */ - SDL_SCANCODE_AC_EXIT = 276, /**< AC Exit */ - SDL_SCANCODE_AC_SAVE = 277, /**< AC Save */ - SDL_SCANCODE_AC_PRINT = 278, /**< AC Print */ - SDL_SCANCODE_AC_PROPERTIES = 279, /**< AC Properties */ + AC_NEW = 273, /**< AC New */ + AC_OPEN = 274, /**< AC Open */ + AC_CLOSE = 275, /**< AC Close */ + AC_EXIT = 276, /**< AC Exit */ + AC_SAVE = 277, /**< AC Save */ + AC_PRINT = 278, /**< AC Print */ + AC_PROPERTIES = 279, /**< AC Properties */ - SDL_SCANCODE_AC_SEARCH = 280, /**< AC Search */ - SDL_SCANCODE_AC_HOME = 281, /**< AC Home */ - SDL_SCANCODE_AC_BACK = 282, /**< AC Back */ - SDL_SCANCODE_AC_FORWARD = 283, /**< AC Forward */ - SDL_SCANCODE_AC_STOP = 284, /**< AC Stop */ - SDL_SCANCODE_AC_REFRESH = 285, /**< AC Refresh */ - SDL_SCANCODE_AC_BOOKMARKS = 286, /**< AC Bookmarks */ + AC_SEARCH = 280, /**< AC Search */ + AC_HOME = 281, /**< AC Home */ + AC_BACK = 282, /**< AC Back */ + AC_FORWARD = 283, /**< AC Forward */ + AC_STOP = 284, /**< AC Stop */ + AC_REFRESH = 285, /**< AC Refresh */ + AC_BOOKMARKS = 286, /**< AC Bookmarks */ /* @} */ /* 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 a software defined function shown on the bottom left 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 a software defined function shown on the bottom right of the display. */ - SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ - SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ + CALL = 289, /**< Used for accepting phone calls. */ + ENDCALL = 290, /**< Used for rejecting phone calls. */ /* @} */ /* Mobile keys */ /* 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 diff --git a/src/game/Level.cpp b/src/game/Level.cpp index fa841fe..a34e60e 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -56,15 +56,18 @@ namespace Game else { float scale = 1.0f + TestX * 0.4f; - Mat4::CreateTransform(Transform.M, - Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX}, - Quat::FromEuler(time * 10.0f + TestX, time * 5.0f * TestY, 0.0f), - {scale, scale, scale}); + Transform::CreateTransform( + Transform.M.M, + bx::Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX}, + bx::fromEuler( + {static_cast(time * 10.0f + TestX), static_cast(time * 5.0f * TestY), 0.0f}), + {scale, scale, scale}); } } 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 diff --git a/src/game/Level.h b/src/game/Level.h index 579ef6a..b2495a2 100644 --- a/src/game/Level.h +++ b/src/game/Level.h @@ -1,91 +1,90 @@ #pragma once -#include "Global.h" #include "../engine/Shared.h" +#include "Global.h" #include "Log.h" #include namespace Game { - typedef uint16_t CubeHandle; - - struct Cube - { - int32_t TestX = -1; - int32_t TestY = -1; - Mat4 Transform; - uint16_t MaterialIdx = 0; - uint16_t ModelIdx = 0; + typedef uint16_t CubeHandle; - void Setup(); - void Update(); - }; + struct Cube + { + int32_t TestX = -1; + int32_t TestY = -1; + Transform Transform; + uint16_t MaterialIdx = 0; + uint16_t ModelIdx = 0; - template - class EntityManager - { - public: - uint16_t Count = 0; - T* Data = nullptr; - uint32_t EntitySize = 0; + void Setup(); + void Update(); + }; - public: - uint64_t Setup(void* ptr) - { - if (EntitySize != sizeof(T)) - { - Count = 0; - } - EntitySize = sizeof(T); - Data = reinterpret_cast(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; - } + template class EntityManager + { + public: + uint16_t Count = 0; + T* Data = nullptr; + uint32_t EntitySize = 0; - 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 Cubes; + public: + uint64_t Setup(void* ptr) + { + if (EntitySize != sizeof(T)) + { + Count = 0; + } + EntitySize = sizeof(T); + Data = reinterpret_cast(ptr); + return C * sizeof(T); + } - public: - void Setup(GameData& data); - void Update(); - }; -} + 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) + { + 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 Cubes; + + public: + void Setup(GameData& data); + void Update(); + }; +} // namespace Game diff --git a/src/game/rendering/Rendering.cpp b/src/game/rendering/Rendering.cpp index 95fb5d6..67dfbbd 100644 --- a/src/game/rendering/Rendering.cpp +++ b/src/game/rendering/Rendering.cpp @@ -6,6 +6,7 @@ #include "../Mesh.h" #include "Rendering.h" #include "bgfx/defines.h" +#include "bx/math.h" #include "bx/timer.h" #include #include @@ -179,26 +180,24 @@ namespace Game constexpr float moveSpeed = 10.0f; constexpr float rotSpeed = 1.0f; - float forwardInput = - (GetKey(ScanCode::SDL_SCANCODE_W) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_S) ? -1.0f : 0.0f); - float rightInput = - (GetKey(ScanCode::SDL_SCANCODE_D) ? 1.0f : 0.0f) + (GetKey(ScanCode::SDL_SCANCODE_A) ? -1.0f : 0.0f); - Vec2 moveInput = Vec2{rightInput, forwardInput}; - moveInput.Normalize(); - Vec3 inputVec = {moveInput.X * delta * moveSpeed, 0.0f, moveInput.Y * delta * moveSpeed}; + float forwardInput = (GetKey(ScanCode::W) ? 1.0f : 0.0f) + (GetKey(ScanCode::S) ? -1.0f : 0.0f); + float rightInput = (GetKey(ScanCode::D) ? 1.0f : 0.0f) + (GetKey(ScanCode::A) ? -1.0f : 0.0f); + bx::Vec3 moveInput = bx::Vec3{rightInput, forwardInput, 0.0f}; + moveInput = bx::normalize(moveInput); + bx::Vec3 inputVec = {moveInput.x * delta * moveSpeed, 0.0f, moveInput.y * delta * moveSpeed}; - Vec3 camForward = Cam.Transform.Forward(); - Vec3 camRight = Cam.Transform.Right(); + bx::Vec3 camForward = Cam.Transform.Forward(); + bx::Vec3 camRight = Cam.Transform.Right(); - Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f}; - Cam.Transform.Rotate({0.0f, rotInput.Y, 0.0f}); - // TODO: split transform into rot matrix and translation + bx::Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f}; + Cam.FreelookXRot += rotInput.x; + 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({-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. @@ -210,7 +209,8 @@ namespace Game 0.1f, 1000.0f, 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. bgfx::setViewRect(0, 0, 0, shared.Window.WindowWidth, shared.Window.WindowHeight); @@ -224,7 +224,7 @@ namespace Game Cube* c = GetInstance().GameLevel.Cubes.Get(i); if (c) { - bgfx::setTransform(c->Transform.M); + bgfx::setTransform(c->Transform.M.M); Model& currentModel = Models[c->ModelIdx]; Material& currentMaterial = Materials[c->MaterialIdx]; diff --git a/src/game/rendering/Rendering.h b/src/game/rendering/Rendering.h index 0692427..9090fc1 100644 --- a/src/game/rendering/Rendering.h +++ b/src/game/rendering/Rendering.h @@ -113,7 +113,9 @@ namespace Game struct Camera { - Mat4 Transform; + float FreelookXRot = 0.0f; + float FreelookYRot = 0.0f; + Transform Transform; }; class GameRendering