From 3e27fb1bd4849b62a53d01b2fdeb26b15ee96cad Mon Sep 17 00:00:00 2001 From: kotofyt Date: Mon, 14 Jul 2025 14:59:41 +0300 Subject: [PATCH] improved server --- build.cpp | 12 ++- engine/__build.cpp | 1 + engine/brush.cpp | 2 +- engine/engine.cpp | 28 +----- engine/gamemode.cpp | 4 - engine/input.cpp | 1 - engine/mesh.cpp | 155 +++++++++++++++++++++++++++++++++ engine/ml_video.cpp | 2 +- engine/networking.cpp | 134 +++++++++++++++++++++++----- engine/server.cpp | 4 +- engine/vk_video.cpp | 20 ++--- engine/vk_videosdl.cpp | 9 +- fpc/library/ld.cpp | 20 ++--- funnyassets/default.cfg | 2 +- game/client/milmoba/player.cpp | 71 ++++++++++++++- launcher/__build.cpp | 4 +- public/filesystem.h | 1 - public/mesh.h | 20 +++-- public/networking.h | 1 + public/tier0/network.h | 6 ++ 20 files changed, 400 insertions(+), 97 deletions(-) diff --git a/build.cpp b/build.cpp index eda6760..1dc313f 100644 --- a/build.cpp +++ b/build.cpp @@ -37,6 +37,7 @@ extern "C" void Preinit() { case TARGET_KERNEL_WINDOWS: bSteam = true; + steam_lib = "external/steamworks/redistributable_bin/win64/steam_api64.dll"; break; case TARGET_KERNEL_LINUX: bSteam = true; @@ -50,8 +51,15 @@ extern "C" void Preinit() } if (bSteam) { - IFileSystem2::MakeDirectory(CUtlString("%s/bin", szOutputDir.GetString())); - IFileSystem2::CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), steam_lib); + if (bStaticBuild) + { + IFileSystem2::MakeDirectory(CUtlString("%s/bin", szOutputDir.GetString())); + IFileSystem2::CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), steam_lib); + } else + { + IFileSystem2::MakeDirectory(CUtlString("%s/bin", szOutputDir.GetString())); + IFileSystem2::CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), steam_lib); + } } }; diff --git a/engine/__build.cpp b/engine/__build.cpp index db0353c..1f25a68 100644 --- a/engine/__build.cpp +++ b/engine/__build.cpp @@ -17,6 +17,7 @@ CUtlVector engine_CompiledFiles = { "engine/input.cpp", "engine/networking.cpp", + "engine/mesh.cpp", /* entities */ "engine/baseentity.cpp", diff --git a/engine/brush.cpp b/engine/brush.cpp index 36a72f7..6e84661 100644 --- a/engine/brush.cpp +++ b/engine/brush.cpp @@ -113,7 +113,6 @@ void C_BrushEntity::Think( float fDelta ) g_BrushVertices.AppendTail(vertexBuffer); }; -IGraphicsPipeline *g_BrushPipeline; class CBrushRendering: public IRenderingPipelineStep { @@ -126,6 +125,7 @@ private: DECLARE_MESH_RENDERING_STAGE(CBrushRendering, brush_rasterizer); +IGraphicsPipeline *g_BrushPipeline; ITexture *bricks; void CBrushRendering::Init() { diff --git a/engine/engine.cpp b/engine/engine.cpp index 255e5e4..35c15c2 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -2,7 +2,6 @@ #include "fgui/fgui.h" #include "input.h" #include "networking.h" -#include "steam/isteamgameserver.h" #include "tier0/network.h" #include "tier0/platform.h" #include "tier1/commandline.h" @@ -17,6 +16,7 @@ #include "physics.h" #include "signal.h" #include "steam/steam_api.h" +#include "steam/isteamgameserver.h" #include "steam/steam_gameserver.h" #include "networking.h" @@ -109,14 +109,6 @@ void IEngine::Init() if (!ICommandLine::CheckParam("-dedicated")) { -#ifdef STEAM_ENABLED - // Log in into steam - if (!SteamUser()->BLoggedOn()) - { - SteamAPI_Shutdown(); - Plat_FatalErrorFunc("User must be logged in to Steam"); - } -#endif // Run local client g_localClient = new IIClient(); IIEngine::ConnectClient(g_localClient); @@ -126,21 +118,7 @@ void IEngine::Init() IInput::Init(); IInput::SetMouseMode(MOUSE_MODE_GAME); IFGUI::Init(); - } else { -#ifdef STEAM_ENABLED - // Run dedicated server with steam - SteamGameServer_Init(0, 27015, 27016, eServerModeAuthentication, "0.0.0.0"); - SteamGameServer()->SetProduct("funnygame"); - SteamGameServer()->SetGameDescription("not that funny but ok"); - SteamGameServer()->SetModDir("funnygame"); - SteamGameServer()->SetDedicatedServer(true); - - SteamGameServer()->LogOnAnonymous(); - int nMaxPlayers = atoi(ICommandLine::ParamValue("-maxplayers", "128")); - SteamGameServer()->SetMaxPlayerCount(nMaxPlayers); - SteamGameServer()->SetAdvertiseServerActive(true); -#endif - } + }; INetworking::Init(); @@ -164,8 +142,8 @@ void IEngine::Frame(float fDelta) #ifdef STEAM_ENABLED SteamAPI_RunCallbacks(); #endif - INetworking::Frame(); IServer::Think(fDelta); + INetworking::Frame(); if (!ICommandLine::CheckParam("-dedicated")) { IFGUI::Frame(); diff --git a/engine/gamemode.cpp b/engine/gamemode.cpp index 71f9215..25e3951 100644 --- a/engine/gamemode.cpp +++ b/engine/gamemode.cpp @@ -73,7 +73,6 @@ void IGameModeManager::Frame( void ) //----------------------------------------------------------------------------- void IGameModeManager::StartGameMode( const char *szName ) { - V_printf("starting game mode %s\n", szName); if (pCurrentMode) { pCurrentMode->RoundEnd(); @@ -112,13 +111,10 @@ void IGameModeManager::RestartCurrentGameMode( void ) PacketGameMode_t mode = {}; mode.type = PACKET_TYPE_GAMEMODE_START; V_memcpy(mode.szName,szCurrentModeName, min(szCurrentModeName.GetLenght(), 255)); - V_printf("%u clients connected\n",g_clients.GetSize()); for (auto &client: g_clients) { INetworking::SendData(&mode, sizeof(mode), client, MESSAGE_MODE_RELIABLE); - V_printf("sending to %u\n",client->playerHandle); }; - V_printf("restarting game mode\n"); }; pCurrentMode->RoundEnd(); pCurrentMode->RoundBegin(); diff --git a/engine/input.cpp b/engine/input.cpp index 0326ee6..8e0a55f 100644 --- a/engine/input.cpp +++ b/engine/input.cpp @@ -168,7 +168,6 @@ void IInput_Bind( int argc, char **argv ) g_bindings[key].AppendTail(argv[i]); g_bindings[key].AppendTail(" "); } - V_printf("%s\n",g_bindings[key].GetString()); }; //----------------------------------------------------------------------------- diff --git a/engine/mesh.cpp b/engine/mesh.cpp index e69de29..13e8a84 100644 --- a/engine/mesh.cpp +++ b/engine/mesh.cpp @@ -0,0 +1,155 @@ +#include "mesh.h" +#include "cglm/mat4.h" +#include "rendering.h" + + +CUtlVector g_meshes; +class CMeshInstance: public IMeshInstance +{ +public: + virtual void SetPosition( vec3 position ) override; + virtual void SetRotationEuler( vec3 angle ) override; + virtual void SetRotationQuat( vec4 quaternion) override; + virtual void SetMatrix( mat4 matrix ) override; + virtual void SetScale( vec3 scale ) override; + + virtual void Draw() override; + + mat4 m_matrix; + vec3 m_position; + + IVertexBuffer *m_pVertexBuffer; + IIndexBuffer *m_pIndexBuffer; + +}; +void CMeshInstance::SetPosition( vec3 position ) +{ + glm_vec3_copy(position, m_position); + +} + +void CMeshInstance::SetRotationEuler( vec3 angle ) +{ + +} + +void CMeshInstance::SetRotationQuat( vec4 quaternion) +{ + +} + +void CMeshInstance::SetMatrix( mat4 matrix ) +{ + glm_mat4_copy(matrix, m_matrix); +} + +void CMeshInstance::SetScale( vec3 scale ) +{ +} + +void CMeshInstance::Draw() +{ + g_meshes.AppendTail(this); +} + + + +class CMesh: public IMesh +{ +public: + virtual void SetVertexBuffer( IVertexBuffer *pBuffer ) override; + virtual void SetIndexBuffer( IIndexBuffer *pBuffer ) override; + + virtual IMeshInstance *CreateInstance() override; + + IVertexBuffer *m_pVertexBuffer = 0; + IIndexBuffer *m_pIndexBuffer = 0; +}; + +void CMesh::SetVertexBuffer( IVertexBuffer *pBuffer ) +{ + m_pVertexBuffer = pBuffer; +} + +void CMesh::SetIndexBuffer( IIndexBuffer *pBuffer ) +{ + m_pIndexBuffer = pBuffer; +} + +IMeshInstance *CMesh::CreateInstance() +{ + CMeshInstance *pInstance = new CMeshInstance; + pInstance->m_pVertexBuffer = m_pVertexBuffer; + pInstance->m_pIndexBuffer = m_pIndexBuffer; + return pInstance; +}; + + +IGraphicsPipeline *g_MeshPipeline; +class CMeshRendering: public IMeshRendering +{ + virtual void Init() override; + virtual void Frame( float fDelta ) override; + virtual void Deinit() override; +}; + +void CMeshRendering::Init() +{ + g_MeshPipeline = IRenderer::CreateGraphicsPipeline( + { + {"gfx/mesh_vert.shader", SHADER_TYPE_VERTEX}, + {"gfx/mesh_frag.shader", SHADER_TYPE_FRAGMENT}, + }, + { + {SHADER_INPUT_TYPE_UNIFORM_BUFFER,0}, + {SHADER_INPUT_TYPE_TEXTURES,1}, + }, + 80, + 20, + {{0,0,EVertexFormat::VERTEX_FORMAT_X32Y32Z32}, {12,1,EVertexFormat::VERTEX_FORMAT_X32Y32}}, + {EImageFormat::IMAGE_FORMAT_R8G8B8A8}, + true + ); +} + + +void CMeshRendering::Frame( float fDelta ) +{ + IRenderer::ResetState(); + IRenderer::SetDepthMode(DEPTH_MODE_LESS); + IRenderer::BindPipeline(g_MeshPipeline); + IRenderer::BindData(0, IRenderer::GetCameraMatrix(), 0); + IRenderer::PushBindings(); + for (auto &v: g_meshes) + { + CMeshInstance *pMesh = (CMeshInstance*)v; + struct { + mat4 i; + uint32_t a = 0; + uint32_t b = 0; + uint32_t c = 0; + } constants; + glm_mat4_copy(pMesh->m_matrix,constants.i); + constants.i[3][0] = pMesh->m_position[0]; + constants.i[3][1] = pMesh->m_position[1]; + constants.i[3][2] = pMesh->m_position[2]; + IRenderer::SetConstants(sizeof(constants), &constants); + IRenderer::Draw(pMesh->m_pVertexBuffer, pMesh->m_pIndexBuffer); + } + g_meshes = {}; +} + +void CMeshRendering::Deinit() +{ + +} + +IMesh *IMeshRendering::CreateMesh() +{ + CMesh *pMesh = new CMesh; + return pMesh; +}; + + + +DECLARE_MESH_RENDERING_STAGE(CMeshRendering, mesh_rendering) diff --git a/engine/ml_video.cpp b/engine/ml_video.cpp index 440dee8..0604423 100644 --- a/engine/ml_video.cpp +++ b/engine/ml_video.cpp @@ -614,7 +614,7 @@ void IMetal::Frame() { mat4 perspective; glm_mat4_inv(g_cameraView, g_cameraDataMap->viewprojection); - glm_perspective(glm_rad(90),(float)g_nWindowWidth/g_nWindowHeight, 0.01, 100, perspective); + glm_perspective(glm_rad(68),(float)g_nWindowWidth/g_nWindowHeight, 0.01, 10000, perspective); glm_rotate(perspective, glm_rad(90), (vec4){1,0,0,0}); glm_scale(perspective, (vec4){1,-1,1,1}); glm_rotate(perspective, glm_rad(90), (vec4){0,0,1,0}); diff --git a/engine/networking.cpp b/engine/networking.cpp index 9bb9271..faf8b3c 100644 --- a/engine/networking.cpp +++ b/engine/networking.cpp @@ -5,6 +5,9 @@ #include "server.h" #include "steam/isteamfriends.h" #include "steam/isteamnetworking.h" +#include "steam/isteamnetworkingsockets.h" +#include "steam/steam_api_common.h" +#include "steam/steamnetworkingtypes.h" #include "tier0/platform.h" #include "tier0/lib.h" #include "tier1/commandline.h" @@ -12,7 +15,10 @@ #include "tier1/utlvector.h" #include "baseplayer.h" +#include "steam/steam_api.h" +#include "steam/steam_gameserver.h" #include "steam/steamnetworkingsockets.h" +#include "steam/isteamgameserver.h" #include "steam/isteamnetworkingutils.h" #ifndef STEAMNETWORKINGSOCKETS_OPENSOURCE #include "steam/steam_api.h" @@ -23,40 +29,88 @@ HSteamNetConnection net_server = 0; HSteamListenSocket net_listenSocket = -1; CUtlVector net_clients; -class CNetworkingCallbacks +bool net_bIsServer = false; +static int net_nMaxPlayers = 0; +static uint64_t net_nLastSteamID = 90071992547409920; + +class CClientNetworkingCallbacks +{ + STEAM_CALLBACK(CClientNetworkingCallbacks, RelayNetworkStatusChanged, SteamRelayNetworkStatus_t); +}; +void CClientNetworkingCallbacks::RelayNetworkStatusChanged( SteamRelayNetworkStatus_t *pCallback ) { - STEAM_CALLBACK(CNetworkingCallbacks, ClientConnectedCallback, SteamNetConnectionStatusChangedCallback_t); }; -void CNetworkingCallbacks::ClientConnectedCallback( SteamNetConnectionStatusChangedCallback_t *pCallback ) +class CServerNetworkingCallbacks +{ + STEAM_GAMESERVER_CALLBACK(CServerNetworkingCallbacks, ClientConnected, SteamNetConnectionStatusChangedCallback_t); + STEAM_GAMESERVER_CALLBACK(CServerNetworkingCallbacks, SteamNetAuthenticated, SteamNetAuthenticationStatus_t); +}; + +void CServerNetworkingCallbacks::ClientConnected( SteamNetConnectionStatusChangedCallback_t *pCallback ) { INetworking::ClientConnectedCallback(pCallback); }; +void CServerNetworkingCallbacks::SteamNetAuthenticated( SteamNetAuthenticationStatus_t *pCallback ) +{ + if (net_nLastSteamID == SteamGameServer()->GetSteamID().ConvertToUint64()) + return; + net_nLastSteamID = SteamGameServer()->GetSteamID().ConvertToUint64(); + V_printf("-------------- SERVER INFO ----------------\n"); + V_printf(" STEAMID64:\t%llu\n", net_nLastSteamID); + V_printf(" MAX PLAYERS:\t%i\n", net_nMaxPlayers); + V_printf("-------------- TIPS -----------------------\n"); + V_printf(" players can join by using connect \n"); + V_printf("-------------------------------------------\n"); +}; - -bool net_bIsServer = false; -static CNetworkingCallbacks *pCallbacks; +static CServerNetworkingCallbacks *net_pServerCallbacks; +static CClientNetworkingCallbacks *net_pClientCallbacks; void INetworking::Init() { + Net_Init(); - SteamDatagramErrMsg errMsg = {}; #ifdef STEAMNETWORKINGSOCKETS_OPENSOURCE GameNetworkingSockets_Init(NULL, &errMsg) #endif - SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg, - [](ESteamNetworkingSocketsDebugOutputType severity, const char *szMessage) { - V_printf("Steam: %s\n", szMessage); - }); + if (ICommandLine::CheckParam("-steamdebug")) + { + SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg, + [](ESteamNetworkingSocketsDebugOutputType severity, const char *szMessage) { + V_printf("Steam: %s\n", szMessage); + }); + } if (ICommandLine::CheckParam("-dedicated")) { - pCallbacks = new CNetworkingCallbacks; - SteamNetworkingIPAddr localAddress = {}; - localAddress.Clear(); - localAddress.SetIPv4(0x7F000001, 27015); - net_listenSocket = SteamNetworkingSockets()->CreateListenSocketIP(localAddress, 0, NULL); + net_pServerCallbacks = new CServerNetworkingCallbacks; + + // Run dedicated server with steam + SteamGameServer_Init(0, 27015, 27016, eServerModeAuthentication, "0.0.0.0"); + SteamGameServer()->SetProduct("funnygame"); + SteamGameServer()->SetGameDescription("not that funny but ok"); + SteamGameServer()->SetModDir("funnygame"); + SteamGameServer()->SetDedicatedServer(true); + + SteamGameServer()->LogOnAnonymous(); + + + net_nMaxPlayers = atoi(ICommandLine::ParamValue("-maxplayers", "128")); + SteamGameServer()->SetMaxPlayerCount(net_nMaxPlayers); + SteamGameServer()->SetAdvertiseServerActive(true); + } else { + net_pClientCallbacks = new CClientNetworkingCallbacks; + } + + SteamDatagramErrMsg errMsg = {}; + + SteamNetworkingUtils()->InitRelayNetworkAccess(); + + if (ICommandLine::CheckParam("-dedicated")) + { + net_listenSocket = SteamGameServerNetworkingSockets()->CreateListenSocketP2P(0, 0, NULL); net_bIsServer = true; } } @@ -65,7 +119,7 @@ void INetworking::Deinit() if (net_listenSocket == -1) return; if (ICommandLine::CheckParam("-dedicated")) - SteamNetworkingSockets()->CloseListenSocket(net_listenSocket); + SteamGameServerNetworkingSockets()->CloseListenSocket(net_listenSocket); else SteamNetworkingSockets()->CloseConnection(net_listenSocket, 0, NULL, false); } @@ -86,17 +140,16 @@ bool INetworking::IsConnected() } void INetworking::Frame() -{ - SteamNetworkingSockets()->RunCallbacks(); - +{ if (IsServer()) { + SteamGameServer_RunCallbacks(); for (auto &client: g_clients) { SteamNetworkingMessage_t *pMessages[64]; while (true) { - int nMessages = SteamNetworkingSockets()->ReceiveMessagesOnConnection(client->playerHandle, pMessages, 64); + int nMessages = SteamGameServerNetworkingSockets()->ReceiveMessagesOnConnection(client->playerHandle, pMessages, 64); if ( nMessages <= 0 ) break; for ( int i = 0; i < nMessages; i++ ) @@ -106,6 +159,7 @@ void INetworking::Frame() } } } else { + SteamNetworkingSockets()->RunCallbacks(); SteamNetworkingMessage_t *pMessages[64]; while (true) { @@ -140,7 +194,7 @@ void INetworking::SendData( void *pData, uint32_t nSize, IIClient *pClient, EMes if (pClient == NULL) r = SteamNetworkingSockets()->SendMessageToConnection(net_server, pData, nSize, nSendFlags, NULL); else - r = SteamNetworkingSockets()->SendMessageToConnection(pClient->playerHandle, pData, nSize, nSendFlags, NULL); + r = SteamGameServerNetworkingSockets()->SendMessageToConnection(pClient->playerHandle, pData, nSize, nSendFlags, NULL); } void INetworking::SendDataEverybody( void *pData, uint32_t nSize, EMessageMode messageMode ) { @@ -211,6 +265,7 @@ void INetworking::ProcessPacket( void *pData, uint32_t nSize, IIClient *pClient .playerID = pPlayerPacket->playerID, .playerHandle = pPlayerPacket->playerHandle, }; + V_printf("%i\n",g_clients.GetSize()); IIEngine::ConnectClient(pNewClient); for (auto &client: g_clients) @@ -258,9 +313,9 @@ uint32_t INetworking_IPv4ToUint(const char *szIP) { void INetworking::JoinServer( const char *szIP ) { + g_clients = {}; if (net_connection) { - g_clients = {}; SteamNetworkingSockets()->CloseConnection(net_connection, 0, NULL, false); } SteamNetworkingIPAddr localAddress = {}; @@ -270,6 +325,21 @@ void INetworking::JoinServer( const char *szIP ) net_server = net_connection; } +void INetworking::JoinServer( uint64_t nSteamID ) +{ + g_clients = {}; + if (net_connection) + { + SteamNetworkingSockets()->CloseConnection(net_connection, 0, NULL, false); + } + SteamNetworkingIdentity remoteIdentity = {}; + remoteIdentity.Clear(); + remoteIdentity.SetSteamID64(nSteamID); + + net_connection = SteamNetworkingSockets()->ConnectP2P(remoteIdentity, 0, 0, 0); + net_server = net_connection; +} + void INetworking::ClientConnectedCallback( SteamNetConnectionStatusChangedCallback_t *pCallback ) { IIClient *pClient = new IIClient; @@ -353,4 +423,20 @@ void INetworking_Connect( int argc, char **argv ) INetworking::JoinServer(argv[1]); }; -ConCommand ConnectCmd("connect", INetworking_Connect); +void INetworking_ConnectFriend( int argc, char **argv ) +{ + if (ICommandLine::CheckParam("-dedicated")) + return; + if (argc != 2) + { + V_printf("connect_friend \n"); + return; + } + uint64_t nFriendID = 0; + V_sscanf(argv[1], "%llu\n", &nFriendID); + V_printf("Connecting to %llu\n",nFriendID); + + INetworking::JoinServer(nFriendID); +}; + +ConCommand ConnectCmd("connect", INetworking_ConnectFriend); diff --git a/engine/server.cpp b/engine/server.cpp index f4a46d3..c09e1f3 100644 --- a/engine/server.cpp +++ b/engine/server.cpp @@ -54,9 +54,6 @@ void IServer::Think( float fDelta ) /* tickrate */ while(g_fAccumulator>=fTickrate) { -#ifdef STEAM_ENABLED - SteamGameServer_RunCallbacks(); -#endif IInput::Frame(); IConsole::Execute(); g_fAccumulator-=fTickrate; @@ -66,6 +63,7 @@ void IServer::Think( float fDelta ) entity->Sync(0, 0); } px_frame(px, fTickrate); + INetworking::Frame(); } for (auto &entity: g_entities) { diff --git a/engine/vk_video.cpp b/engine/vk_video.cpp index e1b0983..cf1444f 100644 --- a/engine/vk_video.cpp +++ b/engine/vk_video.cpp @@ -191,7 +191,7 @@ void IVulkan::Frame() { mat4 perspective; glm_mat4_inv(g_cameraView, g_cameraDataMap->viewprojection); - glm_perspective(glm_rad(90),(float)g_nWindowWidth/g_nWindowHeight, 0.01, 100, perspective); + glm_perspective(glm_rad(68),(float)g_nWindowWidth/g_nWindowHeight, 0.01, 10000, perspective); glm_rotate(perspective, glm_rad(90), (vec4){1,0,0,0}); glm_scale(perspective, (vec4){1,-1,1,1}); glm_rotate(perspective, glm_rad(90), (vec4){0,0,1,0}); @@ -270,28 +270,26 @@ void IVulkan::Frame() } ); - VkImageCopy imageCopyRegion = {}; + VkImageBlit imageCopyRegion = {}; imageCopyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; imageCopyRegion.srcSubresource.mipLevel = 0; imageCopyRegion.srcSubresource.baseArrayLayer = 0; imageCopyRegion.srcSubresource.layerCount = 1; - imageCopyRegion.srcOffset = {0, 0, 0}; + imageCopyRegion.srcOffsets[0] = {0, 0, 0}; + imageCopyRegion.srcOffsets[1] = {(int)g_nWindowWidth, (int)g_nWindowHeight, 1}; imageCopyRegion.dstSubresource = imageCopyRegion.srcSubresource; - imageCopyRegion.dstOffset = {0, 0, 0}; + imageCopyRegion.dstOffsets[0] = {0, 0, 0}; + imageCopyRegion.dstOffsets[1] = {(int)g_nWindowWidth, (int)g_nWindowHeight, 1}; - imageCopyRegion.extent.width = g_nWindowWidth; - imageCopyRegion.extent.height = g_nWindowHeight; - imageCopyRegion.extent.depth = 1; - - vkCmdCopyImage( + vkCmdBlitImage( g_vkCommandBuffer, ((CVkImage*)g_meshColor)->m_image.m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, g_swapchainImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, - &imageCopyRegion + 1, &imageCopyRegion, + VK_FILTER_NEAREST ); for (auto &step: g_StepShading) step.pPipeline->Frame(0); diff --git a/engine/vk_videosdl.cpp b/engine/vk_videosdl.cpp index 8a0f16a..8e0eec5 100644 --- a/engine/vk_videosdl.cpp +++ b/engine/vk_videosdl.cpp @@ -74,8 +74,8 @@ void IVideo_SwapchainInit() vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vkPhysicalDevice, g_surface, &surfaceCapatibilities); const VkFormat preferedSurfaceFormats[] = { - VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM, + VK_FORMAT_R8G8B8A8_UNORM, }; uint32_t numSurfaceFormats = 0; @@ -88,9 +88,14 @@ void IVideo_SwapchainInit() { for (int i = 0; i < sizeof(preferedSurfaceFormats)/sizeof(VkFormat); i++) { - selectedFormat = surfaceFormats[i]; + if (format.format == preferedSurfaceFormats[i]) + { + selectedFormat = format; + goto formatPicked; + } } } +formatPicked: uint32_t numSurfacePresentModes = 0; vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, g_surface, &numSurfacePresentModes, NULL); diff --git a/fpc/library/ld.cpp b/fpc/library/ld.cpp index 25e76ae..c011c41 100644 --- a/fpc/library/ld.cpp +++ b/fpc/library/ld.cpp @@ -74,11 +74,6 @@ CUtlString CLDProject::Link( void ) "-target", m_target.GetTriplet(), }; - if (m_target.kernel == TARGET_KERNEL_WINDOWS) - { - args.AppendTail("-fuse-ld=lld"); - args.AppendTail("-Wl,--whole-archive"); - } if (m_target.kernel == TARGET_KERNEL_DARWIN) { args.AppendTail("-isysroot"); @@ -97,25 +92,24 @@ CUtlString CLDProject::Link( void ) args.AppendTail("-Wl,-all_load"); args.AppendTail("-w"); } + if (m_target.kernel == TARGET_KERNEL_WINDOWS) + { + args.AppendTail("-fuse-ld=ld"); + } if (m_target.kernel == TARGET_KERNEL_LINUX) { args.AppendTail("-rdynamic"); - args.AppendTail("-Wl,--whole-archive"); } if (linkType == ELINK_DYNAMIC_LIBRARY) { args.AppendTail("-shared"); } + if (m_target.kernel == TARGET_KERNEL_WINDOWS || m_target.kernel == TARGET_KERNEL_LINUX) + args.AppendTail("-Wl,--whole-archive"); for (auto object: objects) args.AppendTail(object.m_szObjectFile); - if (m_target.kernel == TARGET_KERNEL_WINDOWS) - { + if (m_target.kernel == TARGET_KERNEL_WINDOWS || m_target.kernel == TARGET_KERNEL_LINUX) args.AppendTail("-Wl,--no-whole-archive"); - } - if (m_target.kernel == TARGET_KERNEL_LINUX) - { - args.AppendTail("-Wl,--no-whole-archive"); - } for (auto lib: libraries) { args.AppendTail("-l"); diff --git a/funnyassets/default.cfg b/funnyassets/default.cfg index d5ff6cf..4ebbcfd 100644 --- a/funnyassets/default.cfg +++ b/funnyassets/default.cfg @@ -3,4 +3,4 @@ bind a +left; bind d +right; bind w +forward; bind s +back; -bind o connect 127.0.0.1; +bind o connect 90271142097538072; diff --git a/game/client/milmoba/player.cpp b/game/client/milmoba/player.cpp index 9640c79..0f0b3de 100644 --- a/game/client/milmoba/player.cpp +++ b/game/client/milmoba/player.cpp @@ -6,6 +6,7 @@ #include "input.h" #include "fgui/widget.h" #include "fgui/label.h" +#include "mesh.h" class C_MOBAPlayer: public C_BaseEntity { @@ -14,11 +15,13 @@ public: virtual void Spawn( void ) override; virtual void Destroy( void ) override; virtual void Think( float fDelta ) override; + + IMesh *m_pMesh; + IMeshInstance *m_pMeshInstance; }; void C_MOBAPlayer::Precache() { - } CFGUI_Label *pText = new CFGUI_Label(); void C_MOBAPlayer::Spawn() @@ -27,6 +30,67 @@ void C_MOBAPlayer::Spawn() pText->SetPosition(100, 100); pText->SetLabelSize(15); pText->SetLabel("Hello, world!"); + + + float cubeVertices[] = { + // Front face + -0.1f, -0.1f, 0.1f, 0, 0, + 0.1f, -0.1f, 0.1f, 1, 0, + 0.1f, 0.1f, 0.1f, 1, 1, + -0.1f, -0.1f, 0.1f, 0, 0, + 0.1f, 0.1f, 0.1f, 1, 1, + -0.1f, 0.1f, 0.1f, 0, 1, + + // Back face + 0.1f, -0.1f, -0.1f, 0, 0, + -0.1f, -0.1f, -0.1f, 1, 0, + -0.1f, 0.1f, -0.1f, 1, 1, + 0.1f, -0.1f, -0.1f, 0, 0, + -0.1f, 0.1f, -0.1f, 1, 1, + 0.1f, 0.1f, -0.1f, 0, 1, + + // Left face + -0.1f, -0.1f, -0.1f, 0, 0, + -0.1f, -0.1f, 0.1f, 1, 0, + -0.1f, 0.1f, 0.1f, 1, 1, + -0.1f, -0.1f, -0.1f, 0, 0, + -0.1f, 0.1f, 0.1f, 1, 1, + -0.1f, 0.1f, -0.1f, 0, 1, + + // Right face + 0.1f, -0.1f, 0.1f, 0, 0, + 0.1f, -0.1f, -0.1f, 1, 0, + 0.1f, 0.1f, -0.1f, 1, 1, + 0.1f, -0.1f, 0.1f, 0, 0, + 0.1f, 0.1f, -0.1f, 1, 1, + 0.1f, 0.1f, 0.1f, 0, 1, + + // Top face + -0.1f, 0.1f, 0.1f, 0, 0, + 0.1f, 0.1f, 0.1f, 1, 0, + 0.1f, 0.1f, -0.1f, 1, 1, + -0.1f, 0.1f, 0.1f, 0, 0, + 0.1f, 0.1f, -0.1f, 1, 1, + -0.1f, 0.1f, -0.1f, 0, 1, + + // Bottom face + -0.1f, -0.1f, -0.1f, 0, 0, + 0.1f, -0.1f, -0.1f, 1, 0, + 0.1f, -0.1f, 0.1f, 1, 1, + -0.1f, -0.1f, -0.1f, 0, 0, + 0.1f, -0.1f, 0.1f, 1, 1, + -0.1f, -0.1f, 0.1f, 0, 1 + }; + + IVertexBuffer *pVertexBuffer = IRenderer::CreateVertexBuffer(sizeof(cubeVertices)); + void *pMapping = pVertexBuffer->Map(); + V_memcpy(pMapping, cubeVertices, sizeof(cubeVertices)); + pVertexBuffer->Unmap(); + + m_pMesh = IMeshRendering::CreateMesh(); + m_pMesh->SetVertexBuffer(pVertexBuffer); + m_pMeshInstance = m_pMesh->CreateInstance(); + }; void C_MOBAPlayer::Destroy() @@ -48,6 +112,11 @@ void C_MOBAPlayer::Think( float fDelta ) g_cameraView[3][1] = pEntity->m_position[1]; g_cameraView[3][2] = pEntity->m_position[2]+0.7; } + mat4 m; + glm_mat4_identity(m); + m_pMeshInstance->SetMatrix(m); + m_pMeshInstance->SetPosition(pEntity->m_position); + m_pMeshInstance->Draw(); }; LINK_CLIENT_ENTITY(C_MOBAPlayer, CMOBAPlayer) diff --git a/launcher/__build.cpp b/launcher/__build.cpp index dba3ce2..d64afc0 100644 --- a/launcher/__build.cpp +++ b/launcher/__build.cpp @@ -9,6 +9,7 @@ CUtlVector launcher_CompiledFiles = { int launcher_build() { + IFileSystem2::MakeDirectory(CUtlString("%s/bin",szOutputDir.GetString())); CCProject compileProject = {}; CLDProject ldProject = {}; @@ -52,6 +53,8 @@ int launcher_build() ldProject.objects.AppendTail((CObject){"external/windows/libdbghelp.a"}); ldProject.objects.AppendTail((CObject){"external/windows/libpthread.a"}); ldProject.objects.AppendTail((CObject){"external/windows/libstdc++.a"}); + if (bSteam) + ldProject.objects.AppendTail((CObject){"external/steamworks/redistributable_bin/win64/steam_api64.dll"}); ldProject.libraries.AppendTail("ws2_32"); ldProject.libraries.AppendTail("ntdll"); ldProject.libraries.AppendTail("userenv"); @@ -70,7 +73,6 @@ int launcher_build() }; CUtlString outputProject = ldProject.Link(); - IFileSystem2::MakeDirectory(CUtlString("%s/bin",szOutputDir.GetString())); IFileSystem2::CopyFile(CUtlString("%s/bin/funnygame", szOutputDir.GetString()), outputProject); return 0; diff --git a/public/filesystem.h b/public/filesystem.h index 18592bd..bd56af1 100644 --- a/public/filesystem.h +++ b/public/filesystem.h @@ -3,7 +3,6 @@ #include "tier0/platform.h" #include "tier1/utlbuffer.h" #include "tier1/utlstring.h" -#include "engine.h" enum EFileOptions diff --git a/public/mesh.h b/public/mesh.h index 0311fe0..7fd7b04 100644 --- a/public/mesh.h +++ b/public/mesh.h @@ -1,14 +1,12 @@ #include "rendering.h" + //---------------------------------------------------------------------------- -// Mesh handler for the rendering +// Mesh instance used in rendering. //---------------------------------------------------------------------------- -abstract_class IMesh +abstract_class IMeshInstance { public: - virtual void SetVertexBuffer( IVertexBuffer *pBuffer ) = 0; - virtual void SetIndexBuffer( IIndexBuffer *pBuffer ) = 0; - virtual void SetPosition( vec3 position ) = 0; virtual void SetRotationEuler( vec3 angle ) = 0; virtual void SetRotationQuat( vec4 quaternion) = 0; @@ -18,10 +16,20 @@ public: virtual void Draw() = 0; }; + +abstract_class IMesh +{ +public: + virtual void SetVertexBuffer( IVertexBuffer *pBuffer ) = 0; + virtual void SetIndexBuffer( IIndexBuffer *pBuffer ) = 0; + + virtual IMeshInstance *CreateInstance() = 0; +}; + interface IMeshRendering: public IRenderingPipelineStep { public: - virtual IMesh *CreateMesh(); + static IMesh *CreateMesh(); }; interface IModelManager diff --git a/public/networking.h b/public/networking.h index 77960ce..aaf877e 100644 --- a/public/networking.h +++ b/public/networking.h @@ -61,6 +61,7 @@ public: static void CreateServer(); static void GetServerInfo(); static void JoinServer( const char *szIP ); + static void JoinServer( uint64_t nSteamID ); static void ClientConnectedCallback( SteamNetConnectionStatusChangedCallback_t *pCallback ); static bool IsServer(); diff --git a/public/tier0/network.h b/public/tier0/network.h index e437b83..7a80e23 100644 --- a/public/tier0/network.h +++ b/public/tier0/network.h @@ -3,7 +3,13 @@ #include "platform.h" #include "steam/isteamnetworkingsockets.h" +#ifdef __linux__ #include "arpa/inet.h" +#endif +#ifdef __WIN32__ +#include "winsock2.h" +#include "ws2tcpip.h" +#endif PLATFORM_INTERFACE void Net_Init();