From 9569555347cda5a58de2de47ea0e3c949c88a4e0 Mon Sep 17 00:00:00 2001 From: kotofyt Date: Mon, 27 Apr 2026 22:33:40 +0300 Subject: [PATCH] mouse controls, fixed texture loading --- engine/engine.cpp | 6 +++ engine/humandevice.cpp | 8 ++++ external/GameNetworkingSockets | 2 +- external/SDL | 2 +- external/Vulkan-Headers | 2 +- external/Vulkan-Utility-Libraries | 2 +- external/VulkanMemoryAllocator | 2 +- external/cglm | 2 +- external/funnystdlib | 2 +- external/slang | 2 +- external/stb | 2 +- external/volk | 2 +- external/xtool | 2 +- funnyassets/maps/test/test0.fmdl | 2 +- funnyassets/materials/nerd.fmat | 5 +++ funnyassets/textures/dev/tile128.png | Bin 0 -> 218 bytes funnyassets/textures/dev/tile32.png | Bin 0 -> 191 bytes funnyassets/textures/dev/tile64.png | Bin 0 -> 194 bytes game/client/assetmgr.cpp | 1 - game/client/milmoba/materials.cpp | 1 - game/client/milmoba/player.cpp | 35 ++++++++++++++++ game/client/milmoba/player.h | 3 ++ game/client/userinput.cpp | 9 ++++ game/client/worldrender.cpp | 1 + materialsystem/gamewindow_sdl.cpp | 44 ++++++++++---------- materialsystem/vulkan/material.cpp | 1 + materialsystem/vulkan/rendercommandlist.cpp | 4 ++ materialsystem/vulkan/rendercontext.cpp | 4 +- materialsystem/vulkan/vulkan_state.h | 4 +- public/icvar.h | 1 + public/ihumandevice.h | 1 + 31 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 funnyassets/materials/nerd.fmat create mode 100644 funnyassets/textures/dev/tile128.png create mode 100644 funnyassets/textures/dev/tile32.png create mode 100644 funnyassets/textures/dev/tile64.png diff --git a/engine/engine.cpp b/engine/engine.cpp index 9adc14d..34f74f6 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -31,6 +31,11 @@ static void CallKeyEvent( EInputDeviceType eDevice, EInputButton eButton, bool b g_pHumanDeviceManager->SetButtonUnpressed(eButton); } +static void CallAxisEvent( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) +{ + g_pHumanDeviceManager->AxisEventRelative(eDevice, eAxis, fValue ); +} + extern "C" void __cdecl SteamAPIDebug( ESteamNetworkingSocketsDebugOutputType nType, const char *pszMsg ) { V_printf("STEAM: %s\n", pszMsg); @@ -88,6 +93,7 @@ extern "C" void FunnyMain( int argc, char **argv ) pWindow = g_pWindowManager->CreateWindow(); pWindow->Init(); pWindow->SetKeyCallback(CallKeyEvent); + pWindow->SetAxisCallback(CallAxisEvent); g_pRenderContext = (IRenderContext*)pRenderSystemFactory(RENDER_CONTEXT_INTERFACE_VERSION, NULL); g_pRenderContext->SetMainWindowManager(g_pWindowManager); diff --git a/engine/humandevice.cpp b/engine/humandevice.cpp index 18acfdb..f5114ff 100644 --- a/engine/humandevice.cpp +++ b/engine/humandevice.cpp @@ -14,6 +14,7 @@ public: virtual void SetButtonPressed( EInputButton eButton ) override; virtual void SetButtonUnpressed( EInputButton eButton ) override; + virtual void AxisEventRelative( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) override; virtual void WriteUTF8( uint32_t uCode ) override; @@ -83,6 +84,13 @@ void CHumanDeviceManager::SetButtonUnpressed( EInputButton eButton ) pInput->OnButton(k_EInputDevice_Keyboard, eButton, false); } +void CHumanDeviceManager::AxisEventRelative( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) +{ + IHumanDeviceInput *pInput = GetCurrentInput(); + if (pInput) + pInput->OnGameAxisDiff(eDevice, eAxis, fValue); +} + void CHumanDeviceManager::WriteUTF8( uint32_t uCode ) { diff --git a/external/GameNetworkingSockets b/external/GameNetworkingSockets index 725e273..517fff0 160000 --- a/external/GameNetworkingSockets +++ b/external/GameNetworkingSockets @@ -1 +1 @@ -Subproject commit 725e273c7442bac7a8bc903c0b210b1c15c34d92 +Subproject commit 517fff0cf6866ba163f4f016b0ef28f365c06c05 diff --git a/external/SDL b/external/SDL index 7c11a8c..1d08131 160000 --- a/external/SDL +++ b/external/SDL @@ -1 +1 @@ -Subproject commit 7c11a8cb9f66a2cac63f9a24ab2f49f6d4bf12a0 +Subproject commit 1d081314a89eb6bfd22bbc0224b604533ae6156b diff --git a/external/Vulkan-Headers b/external/Vulkan-Headers index 2e0a6e6..29184b9 160000 --- a/external/Vulkan-Headers +++ b/external/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 2e0a6e699e35c9609bde2ca4abb0d380c0378639 +Subproject commit 29184b98984f6169a5e83e97557a77cff1e5b0ca diff --git a/external/Vulkan-Utility-Libraries b/external/Vulkan-Utility-Libraries index 4f4c0b6..c15a1ac 160000 --- a/external/Vulkan-Utility-Libraries +++ b/external/Vulkan-Utility-Libraries @@ -1 +1 @@ -Subproject commit 4f4c0b6c61223b703f1c753a404578d7d63932ad +Subproject commit c15a1ac31670cb2ce61c235f070fb40ec6e42612 diff --git a/external/VulkanMemoryAllocator b/external/VulkanMemoryAllocator index f0969e9..b3cbbb4 160000 --- a/external/VulkanMemoryAllocator +++ b/external/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit f0969e908b01104f66bec2f203103de2012354c9 +Subproject commit b3cbbb43ea3a506dffe10759e205a41c27c35ae2 diff --git a/external/cglm b/external/cglm index a886d6e..83d5b2c 160000 --- a/external/cglm +++ b/external/cglm @@ -1 +1 @@ -Subproject commit a886d6e170292a1d534a7a2c0471be5953b16455 +Subproject commit 83d5b2c97378e61a4666825fd3a5548955c83add diff --git a/external/funnystdlib b/external/funnystdlib index 4d39143..8f8343e 160000 --- a/external/funnystdlib +++ b/external/funnystdlib @@ -1 +1 @@ -Subproject commit 4d3914380b9414ea16c77d5376977c666e6fde87 +Subproject commit 8f8343e2506a7ec51b8cb644e050f789614a803e diff --git a/external/slang b/external/slang index 5d775e2..f267cb7 160000 --- a/external/slang +++ b/external/slang @@ -1 +1 @@ -Subproject commit 5d775e2829ceef5bd34ec89aa3eafa4968a74c8e +Subproject commit f267cb77a09b0f4cf083a9585bc1ddb3744c310a diff --git a/external/stb b/external/stb index 802cd45..e6cd956 160000 --- a/external/stb +++ b/external/stb @@ -1 +1 @@ -Subproject commit 802cd454f25469d3123e678af41364153c132c2a +Subproject commit e6cd9561ea6dae43d41633797745789d142b691e diff --git a/external/volk b/external/volk index d64d20b..e91ceff 160000 --- a/external/volk +++ b/external/volk @@ -1 +1 @@ -Subproject commit d64d20b4eaf2698296e085d9d9638c69af280e3e +Subproject commit e91ceff7db05f92ac8b498c9631235a6a73566e2 diff --git a/external/xtool b/external/xtool index 22655f3..f12a84e 160000 --- a/external/xtool +++ b/external/xtool @@ -1 +1 @@ -Subproject commit 22655f3e70b87bef9be736e9625984e21bf8c697 +Subproject commit f12a84e960fa9bced1249a8d233ab8eafca28f6f diff --git a/funnyassets/maps/test/test0.fmdl b/funnyassets/maps/test/test0.fmdl index 8b9342c..26205e4 100644 --- a/funnyassets/maps/test/test0.fmdl +++ b/funnyassets/maps/test/test0.fmdl @@ -1,5 +1,5 @@ { "Mesh": "game/core/maps/test/test0.fmesh_c", - "Material": "game/core/materials/cube.fmat", + "Material": "game/core/materials/nerd.fmat", "Physics": "game/core/maps/test/test0.fpx" } diff --git a/funnyassets/materials/nerd.fmat b/funnyassets/materials/nerd.fmat new file mode 100644 index 0000000..fb479a9 --- /dev/null +++ b/funnyassets/materials/nerd.fmat @@ -0,0 +1,5 @@ +{ + "shader": "funny_basic_pbr", + "AlbedoTexture": "game/core/textures/dev/tile64.png", + "AlbedoMultiplier": [1,1,1,1] +} diff --git a/funnyassets/textures/dev/tile128.png b/funnyassets/textures/dev/tile128.png new file mode 100644 index 0000000000000000000000000000000000000000..e484ae3bcaf2c716e0a72a52a900a0ba3fa99e94 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNBpBcm;@Z&Aux!~fUtizggI>Ns!7NV~$B>FSZ_n=LZ7>jE36vK!NmO)N zwSYrCMNDZCSGSc$ZR@y!7Q0^?~Lxc)I$ztaD0e0swOGHGlvB literal 0 HcmV?d00001 diff --git a/funnyassets/textures/dev/tile64.png b/funnyassets/textures/dev/tile64.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5a7a93eb22e27262e9163691e1bd3a40191cf0 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkNHD-B#I>QJVcD`}zP`S}2faYrf;?RuLn`JZr#LY7DE370YAF4e6qQ@R z;bNp^dd1d3v_hd>=KyEOM}0=mhUUPR@`ss28h5dUFq%ZWv4Y?W-3dnQz6z%qT_4CN epO6w^WMfeL?~(QRbQI8T1_n=8KbLh*2~7Y|Ycs9@ literal 0 HcmV?d00001 diff --git a/game/client/assetmgr.cpp b/game/client/assetmgr.cpp index 0c579db..2d16d9d 100644 --- a/game/client/assetmgr.cpp +++ b/game/client/assetmgr.cpp @@ -223,7 +223,6 @@ void CAssetManager::LoadMaterialData( CBaseMaterial *pMaterial, IJSONObject *pOb if ( pValue->GetArray()->GetParameter(3)->GetType() == JSON_PARAMETER_NUMBER ) data->w = pValue->GetArray()->GetParameter(3)->GetNumberValue(); - V_printf("%s %f %f %f %f\n", desc.m_szEditorName, data->x, data->y, data->z, data->w); break; } default: diff --git a/game/client/milmoba/materials.cpp b/game/client/milmoba/materials.cpp index 762303d..15731ad 100644 --- a/game/client/milmoba/materials.cpp +++ b/game/client/milmoba/materials.cpp @@ -11,7 +11,6 @@ public: virtual void SetUpMesh( MaterialData_t *pData ) override { pData->m_vAlbedoColor = m_vAlbedo; pData->m_uAlbedo = m_tAlbedo; - V_printf("SetUpMesh %f\n", pData->m_vAlbedoColor.x); }; diff --git a/game/client/milmoba/player.cpp b/game/client/milmoba/player.cpp index 681d986..25beb07 100644 --- a/game/client/milmoba/player.cpp +++ b/game/client/milmoba/player.cpp @@ -30,6 +30,9 @@ void C_MOBAPlayer::Think( float fDelta ) vCameraPos.z = 20; vCameraPos.y+=3; g_pWorldRenderer->SetCameraPosition(vCameraPos); + Quat vCameraRot; + glm_euler_yxz_quat((vec3){m_fPitch, m_fYaw, 0}, *(versor*)&vCameraRot); + g_pWorldRenderer->SetCameraRotation(vCameraRot); } BaseClass::Think(fDelta); }; @@ -127,3 +130,35 @@ static void IN_LeftUp( int c, char **v ) { ((C_MOBAPlayer*)pPlayer)->m_bIsLeft = false; } static ConCommand endleft("-left", IN_LeftUp); + +void Game_OnGameAxis( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) +{ + + +} + +static ConVar m_pitch("m_pitch", "0.022", FCVAR_CLIENTDLL); +static ConVar m_yaw("m_yaw", "0.022", FCVAR_CLIENTDLL); +static ConVar sens("sens", "3", FCVAR_CLIENTDLL); + +void Game_OnGameAxisDiff( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) +{ + C_BaseEntity *pPlayer = UTIL_GetLocalPlayer(); + if (!pPlayer) + return; + if (!dynamic_cast(pPlayer)) + return; + switch(eAxis) + { + case k_EInputAxis_MouseY: + ((C_MOBAPlayer*)pPlayer)->m_fPitch -= glm_rad(fValue * m_pitch.GetFloat() * sens.GetFloat()); + break; + case k_EInputAxis_MouseX: + ((C_MOBAPlayer*)pPlayer)->m_fYaw -= glm_rad(fValue * m_yaw.GetFloat() * sens.GetFloat()); + break; + default: + break; + } +} + + diff --git a/game/client/milmoba/player.h b/game/client/milmoba/player.h index 4842574..6b70e4f 100644 --- a/game/client/milmoba/player.h +++ b/game/client/milmoba/player.h @@ -24,6 +24,9 @@ public: float m_fFBWalkingDirection; float m_fLRWalkingDirection; + float m_fPitch= 0; + float m_fYaw = 0; + Vector m_vMovementVector; Vector m_vLocalMovementVector; Vector vCameraPos; diff --git a/game/client/userinput.cpp b/game/client/userinput.cpp index 6ebffef..ac01b18 100644 --- a/game/client/userinput.cpp +++ b/game/client/userinput.cpp @@ -1,6 +1,7 @@ #include "userinput.h" #include "tier1/utlstring.h" #include "game.h" +#include "baseentity.h" class CFunnyInput: public IHumanDeviceInput { @@ -48,12 +49,20 @@ void CFunnyInput::OnGameButton( EInputDeviceType eDevice, EInputButton eScancode } } + +void Game_OnGameAxis( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ); +void Game_OnGameAxisDiff( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ); + void CFunnyInput::OnGameAxis( EInputDeviceType eDevice, EInputAxis eAxis, float fValue) { + Game_OnGameAxis(eDevice, eAxis, fValue); + } + void CFunnyInput::OnGameAxisDiff( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) { + Game_OnGameAxisDiff(eDevice, eAxis, fValue); } diff --git a/game/client/worldrender.cpp b/game/client/worldrender.cpp index 1a49126..c13d73c 100644 --- a/game/client/worldrender.cpp +++ b/game/client/worldrender.cpp @@ -241,6 +241,7 @@ void CFunnyWorldRenderer::Frame( float fDelta ) glm_mat4_identity(matCamera); glm_mat4_identity(matCamera2); glm_translate(matCamera2, m_vPos); + glm_quat_rotate(matCamera2, m_vRot, matCamera2); glm_mat4_inv(matCamera2, matCamera2); glm_perspective(glm_rad(75), uWidth/(float)uHeight, 0.01, 10000, matCamera); glm_mul(matCamera, matCamera2, matCamera); diff --git a/materialsystem/gamewindow_sdl.cpp b/materialsystem/gamewindow_sdl.cpp index 63f126f..80bf20c 100644 --- a/materialsystem/gamewindow_sdl.cpp +++ b/materialsystem/gamewindow_sdl.cpp @@ -33,8 +33,8 @@ public: SDL_WindowID WindowID(); - KeyCallbackFn m_fnKeyCallback; - AxisCallbackFn m_fnAxisCallback; + KeyCallbackFn m_fnKeyCallback = NULL; + AxisCallbackFn m_fnAxisCallback = NULL; bool m_bWindowSizeUpdated; uint32_t m_uRenderWidth; @@ -55,6 +55,7 @@ void CSDLGameWindow::Init() Plat_FatalErrorFunc("SDL_CreateWindow: %s\n", SDL_GetError()); m_uRenderWidth = 1280; m_uRenderHeight = 720; + SDL_SetWindowRelativeMouseMode(m_pWindow, true); } void CSDLGameWindow::Shutdown() @@ -231,43 +232,40 @@ void CSDLGameWindowManager::Frame( float fDelta ) } while (SDL_PollEvent(&event)) { + for (auto a: m_pWindows) + { + if (a->WindowID() != event.window.windowID) + break; + pWindow = a; + break; + } switch (event.type) { case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: - for (auto a: m_pWindows) - { - if (a->WindowID() != event.window.windowID) - break; - pWindow = a; - break; - } + pWindow->m_bWindowSizeUpdated = true; pWindow->m_uRenderWidth = event.window.data1; pWindow->m_uRenderHeight = event.window.data2; break; case SDL_EVENT_KEY_UP: - for (auto a: m_pWindows) - { - if (a->WindowID() != event.window.windowID) - break; - pWindow = a; - break; - } + if (pWindow->m_fnKeyCallback) pWindow->m_fnKeyCallback(k_EInputDevice_Keyboard, GetKeyButton(event.key.key), false); break; case SDL_EVENT_KEY_DOWN: - for (auto a: m_pWindows) - { - if (a->WindowID() != event.window.windowID) - break; - pWindow = a; - break; - } if (pWindow->m_fnKeyCallback) pWindow->m_fnKeyCallback(k_EInputDevice_Keyboard, GetKeyButton(event.key.key), true); break; + case SDL_EVENT_MOUSE_MOTION: + if (pWindow->m_fnAxisCallback) + { + pWindow->m_fnAxisCallback(k_EInputDevice_Mouse, k_EInputAxis_MouseX, event.motion.xrel); + pWindow->m_fnAxisCallback(k_EInputDevice_Mouse, k_EInputAxis_MouseY, event.motion.yrel); + + } + + break; case SDL_EVENT_QUIT: Plat_Exit(0); break; diff --git a/materialsystem/vulkan/material.cpp b/materialsystem/vulkan/material.cpp index 5bdbc4e..7814f0c 100644 --- a/materialsystem/vulkan/material.cpp +++ b/materialsystem/vulkan/material.cpp @@ -142,6 +142,7 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi writes[1].descriptorCount = 128; writes[1].pImageInfo = stWrites; vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 2, writes, 0, 0); + m_pTextureArray = pArray; } } diff --git a/materialsystem/vulkan/rendercommandlist.cpp b/materialsystem/vulkan/rendercommandlist.cpp index a45e1ed..a1dba4a 100644 --- a/materialsystem/vulkan/rendercommandlist.cpp +++ b/materialsystem/vulkan/rendercommandlist.cpp @@ -109,6 +109,10 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial ) CVkSetShaderDataCommand *pSetShaderData = CREATE_COMMAND(m_pCommandBufferManager, SetShaderData); pSetShaderData->pShaderData = pMaterial; + { + CVkTextureArray *pArray = (CVkTextureArray*)((CVkMaterial*)pMaterial)->m_pTextureArray; + + } m_pCurrentMaterialBuffer->AddCommand(pSetShaderData); CVkSetScissorsCommand *pScissorsCommand = CREATE_COMMAND(m_pCommandBufferManager, SetScissors); diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index bdf4426..8fbde94 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -397,11 +397,11 @@ uint32_t CVkTextureArray::CreateTexture( uint32_t i, const char *szPath ) IBuffer *pBuffer = m_pRenderContext->CreateStorageBuffer(uWidth*uHeight*4); pBuffer->Lock(); void *pData = pBuffer->Map(); - V_memcpy(pData, pImg, uWidth*uHeight*uChannels); + V_memcpy(pData, pImg, uWidth*uHeight*4); pBuffer->Unmap(); pBuffer->Unlock(); + vkDeviceWaitIdle(s_vkDevice); IImage *pImage = m_pRenderContext->CreateTexture(uWidth, uHeight, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_NONE); - IImage *pCompressedImage = m_pRenderContext->CreateTexture(uWidth, uHeight, IMAGE_FORMAT_BC1, MULTISAMPLE_TYPE_NONE); m_pImages[i] = (CVkImage*)pImage; stbi_image_free(pImg); diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index 76f1dcf..3c58c19 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -338,6 +338,7 @@ private: }; CUtlVector m_callableShaders = {}; }; +#define MAX_TEXTURES 4096 class CVkTextureArray: public ITextureArray { @@ -357,7 +358,7 @@ public: IRenderContext *m_pRenderContext; IVkCommandBufferManager *m_pCommandBufferManager; VkSampler m_hSampler; - CVkImage *m_pImages[128]; + CVkImage *m_pImages[MAX_TEXTURES]; }; class CVkMaterial: public IMaterial @@ -377,6 +378,7 @@ public: CVkShader *m_pVkShader; CUtlVector m_hSets; + ITextureArray *m_pTextureArray; private: VkDescriptorPool m_hPool; CUtlVector m_writes = {}; diff --git a/public/icvar.h b/public/icvar.h index 031f607..4b2c254 100644 --- a/public/icvar.h +++ b/public/icvar.h @@ -106,6 +106,7 @@ inline ConVar::ConVar( const char *pName, const char *pDefaultValue, int flags, m_szName = pName; m_flags = flags; SetValue(pDefaultValue); + Console()->RegisterVar(this); } inline bool ConVar::IsFlagSet( int flag ) diff --git a/public/ihumandevice.h b/public/ihumandevice.h index d4fa8d2..5f77ec2 100644 --- a/public/ihumandevice.h +++ b/public/ihumandevice.h @@ -33,6 +33,7 @@ public: virtual void SetButtonPressed( EInputButton eButton ) = 0; virtual void SetButtonUnpressed( EInputButton eButton ) = 0; + virtual void AxisEventRelative( EInputDeviceType eDevice, EInputAxis eAxis, float fValue ) = 0; virtual void WriteUTF8( uint32_t uCode ) = 0; };