From 6d5141cf436a54f2adfeaa45a6b78414306eee9a Mon Sep 17 00:00:00 2001 From: kotofyt Date: Mon, 16 Mar 2026 15:35:31 +0200 Subject: [PATCH] work on world --- build.cpp | 1 + funnyassets/maps/test/test.fmap | 9 +- funnyassets/maps/test/test0.fmdl | 5 ++ funnyassets/maps/test/test0.fmesh_c | Bin 23808 -> 23808 bytes funnyassets/maps/test/test0.fpx | 4 + game/client/assetmgr.cpp | 38 +++++---- game/client/baseentity.h | 6 +- game/client/basemodelentity.cpp | 52 ++++++++++-- game/client/basemodelentity.h | 15 ++-- game/client/entitysystem.cpp | 10 +++ game/client/milmoba/player.cpp | 1 - game/client/worldrender.cpp | 9 +- game/client/worldsystem.cpp | 0 game/client/worldsystem.h | 0 game/server/assetmgr.cpp | 5 ++ game/server/baseentity.cpp | 2 +- game/server/baseentity.h | 6 +- game/server/basemodelentity.cpp | 31 +++++++ game/server/basemodelentity.h | 8 ++ game/server/build.cpp | 1 + game/server/entitysystem.cpp | 2 + game/server/game.cpp | 12 ++- game/server/physicsprop.cpp | 14 +++- game/server/physicsprop.h | 3 +- game/server/worldsystem.cpp | 124 ++++++++++++++++++++++++++++ game/server/worldsystem.h | 16 ++++ game/shared/datamap.h | 6 +- game/shared/netmap.h | 8 ++ game/shared/netprotocol.h | 23 +++--- public/iphysics.h | 9 ++ rapier/physics.cpp | 5 ++ rapier/physics.rs | 85 +++++++++++++------ tools/blender_funnyasset.py | 6 +- 33 files changed, 416 insertions(+), 100 deletions(-) create mode 100644 funnyassets/maps/test/test0.fmdl create mode 100644 funnyassets/maps/test/test0.fpx delete mode 100644 game/client/worldsystem.cpp delete mode 100644 game/client/worldsystem.h diff --git a/build.cpp b/build.cpp index 8ec7822..dfbc53e 100755 --- a/build.cpp +++ b/build.cpp @@ -36,6 +36,7 @@ DECLARE_BUILD_STAGE(install_game) filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(config, "steam_lib")); } filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(launcher, "launcher")); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/maps"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/models"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/meshes"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/materials"); diff --git a/funnyassets/maps/test/test.fmap b/funnyassets/maps/test/test.fmap index b9c68d9..c965de8 100644 --- a/funnyassets/maps/test/test.fmap +++ b/funnyassets/maps/test/test.fmap @@ -1,17 +1,14 @@ [ { "classname": "prop_physics", - "mesh": "game/core/maps/test/test0.fmesh_c", - "material": "game/core/materials", - "physics_type": "triangles", - "physics_mesh": "game/core/maps/test/test0.fmesh_c", + "model": "game/core/maps/test/test0.fmdl", "physics": "static" }, { "classname": "prop_physics", - "model": "game/core/meshes/cube.fmdl", + "model": "game/core/models/cube.fmdl", "physics": "dynamic", - "origin": [ 0, 15, 0 ] + "origin": [ 0, 3, 0 ] } ] diff --git a/funnyassets/maps/test/test0.fmdl b/funnyassets/maps/test/test0.fmdl new file mode 100644 index 0000000..8b9342c --- /dev/null +++ b/funnyassets/maps/test/test0.fmdl @@ -0,0 +1,5 @@ +{ + "Mesh": "game/core/maps/test/test0.fmesh_c", + "Material": "game/core/materials/cube.fmat", + "Physics": "game/core/maps/test/test0.fpx" +} diff --git a/funnyassets/maps/test/test0.fmesh_c b/funnyassets/maps/test/test0.fmesh_c index de79f66bca86e625a638b97a786102db8e7bda9f..ee7216bbda74df39a07c133b0813ebae19f48493 100644 GIT binary patch literal 23808 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 x?pIyE#U~EF=p(zBfy|e9SH;i-k literal 23808 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 UoIl|CeDeBb{TiS3gYWbGKMZM-jsO4v diff --git a/funnyassets/maps/test/test0.fpx b/funnyassets/maps/test/test0.fpx new file mode 100644 index 0000000..1e86f19 --- /dev/null +++ b/funnyassets/maps/test/test0.fpx @@ -0,0 +1,4 @@ +{ + "Type": "Triangles", + "Mesh": "game/core/maps/test/test0.fpx" +} diff --git a/game/client/assetmgr.cpp b/game/client/assetmgr.cpp index bcf3816..f3a8276 100644 --- a/game/client/assetmgr.cpp +++ b/game/client/assetmgr.cpp @@ -151,29 +151,29 @@ uint32_t CAssetManager::LoadModel( const char *szName ) switch (pRoot->GetType()) { case JSON_PARAMETER_OBJECT: + { + pMainObject = pRoot->GetObject(); + if (!pMainObject) { - pMainObject = pRoot->GetObject(); - if (!pMainObject) - { - V_printf("Failed to load properties\n"); - return 0; + V_printf("Failed to load properties\n"); + return 0; - } - IJSONValue *pMesh = pMainObject->GetValue("Mesh"); - IJSONValue *pMaterial = pMainObject->GetValue("Material"); - IJSONValue *pPhysics = pMainObject->GetValue("Physics"); - if (pMesh) - pModel->m_hMesh = LoadMesh(pMesh->GetStringValue()); - if (pMaterial) - pModel->m_hMaterial = LoadMaterial(pMaterial->GetStringValue()); - if (pPhysics) - pModel->m_hPhysics = LoadPhysics(pPhysics->GetStringValue()); + } + IJSONValue *pMesh = pMainObject->GetValue("Mesh"); + IJSONValue *pMaterial = pMainObject->GetValue("Material"); + IJSONValue *pPhysics = pMainObject->GetValue("Physics"); + if (pMesh) + pModel->m_hMesh = LoadMesh(pMesh->GetStringValue()); + if (pMaterial) + pModel->m_hMaterial = LoadMaterial(pMaterial->GetStringValue()); + if (pPhysics) + pModel->m_hPhysics = LoadPhysics(pPhysics->GetStringValue()); - return hModel; - } - break; + return hModel; + } + break; default: return 0; } @@ -317,6 +317,7 @@ HFunnyPhysics CAssetManager::LoadPhysics( const char *szName ) IJSONValue *pRoot = JSONManager()->ReadString(szProperties); if (!pRoot) return 0; + V_printf("PHYSICS %s\n", szName); IJSONObject *pMainObject; switch (pRoot->GetType()) @@ -339,6 +340,7 @@ HFunnyPhysics CAssetManager::LoadPhysics( const char *szName ) return 0; } CUtlString szType = pTypeValue->GetStringValue(); + V_printf("szType\n"); if (szType == "Sphere") { pPhysics->m_hShape = g_pPhysics->CreateBall({1.0}); diff --git a/game/client/baseentity.h b/game/client/baseentity.h index 8ffd63f..efe7e31 100644 --- a/game/client/baseentity.h +++ b/game/client/baseentity.h @@ -78,9 +78,9 @@ public: fnThink m_pfnThink = NULL; CUtlString m_szClassName; private: - Vector m_vPosition; - Quat m_vRotation; - Vector m_vScale; + Vector m_vPosition = {}; + Quat m_vRotation = {}; + Vector m_vScale = {1,1,1}; uint64_t m_uSlot; }; diff --git a/game/client/basemodelentity.cpp b/game/client/basemodelentity.cpp index 2718db5..9940658 100644 --- a/game/client/basemodelentity.cpp +++ b/game/client/basemodelentity.cpp @@ -12,32 +12,68 @@ void C_BaseModelEntity::Spawn() void C_BaseModelEntity::Think( float fDelta ) { - m_pInstance->SetPosition(GetAbsOrigin()); - m_pInstance->SetRotation(GetAbsAngles()); - m_pInstance->SetScale({GetScale(),GetScale(),GetScale()}); + UpdateModel(); + if (m_pInstance) + { + m_pInstance->SetPosition(GetAbsOrigin()); + m_pInstance->SetRotation(GetAbsAngles()); + m_pInstance->SetScale({GetScale(),GetScale(),GetScale()}); + } } void C_BaseModelEntity::SetModel( const char *szName ) { + V_memset(m_szModel, 0, 256); + V_strncpy(m_szModel, szName, 255); +} + +void C_BaseModelEntity::UpdateModel() +{ + if (!V_strncmp(m_szModel, m_szCurrentModel, 256)) + return; + + V_memset(m_szCurrentModel, 0, 256); + V_strncpy(m_szCurrentModel, m_szModel, 255); + if (m_hModelHandle) { g_pAssetManager->UnrefModel(m_hModelHandle); + g_pWorldRenderer->DestroyMeshInstance( + g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh)->m_pMesh, + m_pInstance); } - m_hModelHandle = g_pAssetManager->LoadModel(szName); + m_hModelHandle = g_pAssetManager->LoadModel(m_szCurrentModel); m_pModel = g_pAssetManager->GetModelByIndex(m_hModelHandle); + if (!m_pModel) + { + V_printf("Failed to load %u %s\n", V_strnlen(m_szCurrentModel,255), m_szCurrentModel); + m_pInstance = NULL; + return; + } FunnyMesh_t *pMesh = g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh); m_pInstance = g_pWorldRenderer->CreateInstance(pMesh->m_pMesh); + } C_BaseModelEntity::~C_BaseModelEntity() { - FunnyMesh_t *pMesh = g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh); - g_pWorldRenderer->DestroyMeshInstance(pMesh->m_pMesh, m_pInstance); - g_pAssetManager->UnrefModel(m_hModelHandle); + if (m_pInstance) + { + FunnyMesh_t *pMesh = g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh); + g_pWorldRenderer->DestroyMeshInstance(pMesh->m_pMesh, m_pInstance); + g_pAssetManager->UnrefModel(m_hModelHandle); + } } BEGIN_DATADESC(C_BaseModelEntity) - + DEFINE_KEYFIELD(m_szModel, FIELD_STRING, "model") END_DATADESC() + +IMPLEMENT_RECV_DT(C_BaseModelEntity) + NetPropString(m_szModel) +END_RECV_DT() +IMPLEMENT_EMPTY_SEND_DT(C_BaseModelEntity) + +LINK_ENTITY_TO_CLASS(prop_physics, C_BaseModelEntity) diff --git a/game/client/basemodelentity.h b/game/client/basemodelentity.h index 8cb4176..e6f0258 100644 --- a/game/client/basemodelentity.h +++ b/game/client/basemodelentity.h @@ -9,8 +9,9 @@ class C_BaseModelEntity: public C_BaseEntity { public: - DECLARE_CLASS(C_BaseModelEntity, C_BaseEntity); - DECLARE_DATADESC(); + DECLARE_CLASS(C_BaseModelEntity, C_BaseEntity) + DECLARE_DATADESC() + DECLARE_CLIENTCLASS() virtual ~C_BaseModelEntity() override; virtual void Precache() override; @@ -20,9 +21,13 @@ public: void SetModel( const char *szName ); private: - HFunnyModel m_hModelHandle; - FunnyModel_t *m_pModel; - IMeshInstance *m_pInstance; + void UpdateModel(); + char m_szCurrentModel[256] = {}; + char m_szModel[256] = {}; + + HFunnyModel m_hModelHandle = 0; + FunnyModel_t *m_pModel = NULL; + IMeshInstance *m_pInstance = NULL; }; #endif diff --git a/game/client/entitysystem.cpp b/game/client/entitysystem.cpp index fd3a434..ffd4f89 100644 --- a/game/client/entitysystem.cpp +++ b/game/client/entitysystem.cpp @@ -229,6 +229,16 @@ void CEntitySystem::NetRecvPacket( NetPacket_t *pPacket ) if (pPlayerPacket->m_setLocalEntity.m_uIndex > MAX_EDICTS) break; s_pLocalEntity = m_pEntities[pPlayerPacket->m_setLocalEntity.m_uIndex]; + break; + case k_EMessage_ResetEntities: + { + C_BaseEntity **ppEntities = m_pEntities; + for ( int i = 0; i < MAX_EDICTS; i++ ) + { + DestroyEntityByIndex(i); + } + } + break; default: break; } diff --git a/game/client/milmoba/player.cpp b/game/client/milmoba/player.cpp index a6cb3f0..a3addee 100644 --- a/game/client/milmoba/player.cpp +++ b/game/client/milmoba/player.cpp @@ -5,7 +5,6 @@ void C_MOBAPlayer::Precache() { - SetModel("game/core/models/cube.fmdl"); } diff --git a/game/client/worldrender.cpp b/game/client/worldrender.cpp index 5cef572..4e98dcf 100644 --- a/game/client/worldrender.cpp +++ b/game/client/worldrender.cpp @@ -103,6 +103,7 @@ void CFunnyMeshInstance::Frame() v[2] = m_vScale.z; glm_scale_make(m, v); glm_mat4_mul(m_data.m_matTranslation, m, m_data.m_matTranslation); + m_data.m_uAlbedo = 1; } @@ -223,12 +224,6 @@ void CFunnyWorldRenderer::Frame( float fDelta ) glm_translate(matCamera2, m_vPos); glm_perspective(glm_rad(60), uWidth/(float)uHeight, 0.01, 10000, matCamera); glm_mul(matCamera, matCamera2, matCamera); - /* - V_printf("%f %f %f %f\n", matCamera[0][0], matCamera[0][1], matCamera[0][2], matCamera[0][3]); - V_printf("%f %f %f %f\n", matCamera[1][0], matCamera[1][1], matCamera[1][2], matCamera[1][3]); - V_printf("%f %f %f %f\n", matCamera[2][0], matCamera[2][1], matCamera[2][2], matCamera[2][3]); - V_printf("%f %f %f %f\n", matCamera[3][0], matCamera[3][1], matCamera[3][2], matCamera[3][3]); - */ m_pViewBufferData = (ViewBuffer_t*)m_pViewBuffer->Map(); m_pViewBuffer->Lock(); V_memcpy(&m_pViewBufferData->m_matCameraProjection, matCamera, sizeof(matCamera)); @@ -308,11 +303,11 @@ void CFunnyWorldRenderer::Frame( float fDelta ) m_pRasterMaterial->PSSetTextureArray(1, m_pTextures); g_pRenderContext->DestroyBuffer(pDataBuffer); } + m_pRasterCommandList->SetMaterial(m_pRasterMaterial); for ( auto mesh: m_pMeshes) { if (mesh->m_instances.GetSize()==0) continue; - m_pRasterCommandList->SetMaterial(m_pRasterMaterial); m_pRasterCommandList->SetVertexBuffer(0, mesh->m_pVertexBuffer); m_pRasterCommandList->DrawPrimitives(mesh->m_pVertexBuffer->GetSize()/32, 0, mesh->m_instances.GetSize(), 0); } diff --git a/game/client/worldsystem.cpp b/game/client/worldsystem.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/game/client/worldsystem.h b/game/client/worldsystem.h deleted file mode 100644 index e69de29..0000000 diff --git a/game/server/assetmgr.cpp b/game/server/assetmgr.cpp index bdd8ebc..8aa7a2c 100644 --- a/game/server/assetmgr.cpp +++ b/game/server/assetmgr.cpp @@ -195,6 +195,7 @@ HFunnyPhysics CAssetManager::LoadPhysics( const char *szName ) if (!bHasBeenCreated) return hPhysics; FunnyPhysics_t *pPhysics = m_physics.GetObjectPtr(hPhysics); + *pPhysics = {}; IFileHandle *pHandle = filesystem->Open(szName, FILEMODE_READ); if (!pHandle) @@ -225,10 +226,14 @@ HFunnyPhysics CAssetManager::LoadPhysics( const char *szName ) return 0; } CUtlString szType = pTypeValue->GetStringValue(); + V_printf("%s\n", szType.GetString()); if (szType == "Sphere") { pPhysics->m_hShape = g_pPhysics->CreateBall({1.0}); } + if (szType == "Triangles") + { + } return hPhysics; } diff --git a/game/server/baseentity.cpp b/game/server/baseentity.cpp index 82f140c..185c309 100644 --- a/game/server/baseentity.cpp +++ b/game/server/baseentity.cpp @@ -128,7 +128,7 @@ lookforname: BEGIN_DATADESC_NOBASE(CBaseEntity) DEFINE_KEYFIELD(m_vPosition, FIELD_FLOAT3, "origin") DEFINE_KEYFIELD(m_vRotation, FIELD_QUATERNION, "angles") - DEFINE_KEYFIELD(m_vScale, FIELD_FLOAT3, "scales") + DEFINE_KEYFIELD(m_vScale, FIELD_FLOAT3, "scale") END_DATADESC() IMPLEMENT_SEND_DT_NOBASE(CBaseEntity) diff --git a/game/server/baseentity.h b/game/server/baseentity.h index a554f81..8069055 100644 --- a/game/server/baseentity.h +++ b/game/server/baseentity.h @@ -81,9 +81,9 @@ public: const char *m_szClassName; uint64_t m_ullOwner; private: - Vector m_vPosition; - Quat m_vRotation; - Vector m_vScale; + Vector m_vPosition = {}; + Quat m_vRotation = {}; + Vector m_vScale = {1,1,1}; }; diff --git a/game/server/basemodelentity.cpp b/game/server/basemodelentity.cpp index 7bb14b8..16b52db 100644 --- a/game/server/basemodelentity.cpp +++ b/game/server/basemodelentity.cpp @@ -1,6 +1,37 @@ #include "basemodelentity.h" #include "game.h" +void CBaseModelEntity::Spawn() +{ + SetThink(Think); +} + void CBaseModelEntity::SetModel( const char *szName ) { + V_memset(m_szModel, 0, 256); + V_strncpy(m_szModel, szName, 255); } + +void CBaseModelEntity::OnModelChanged( const char *szName ) +{ + +} + +void CBaseModelEntity::Think( float fDelta ) +{ + if (V_strncmp(m_szModel, m_szCurrentModel, 256)) + { + V_memset(m_szCurrentModel, 0, 256); + V_strncpy(m_szCurrentModel, m_szModel, 255); + OnModelChanged(m_szCurrentModel); + } +} + +IMPLEMENT_SEND_DT(CBaseModelEntity) + NetPropString(m_szModel) +END_RECV_DT() +IMPLEMENT_EMPTY_RECV_DT(CBaseModelEntity) + +BEGIN_DATADESC(CBaseModelEntity) + DEFINE_KEYFIELD(m_szModel, FIELD_STRING, "model") +END_DATADESC() diff --git a/game/server/basemodelentity.h b/game/server/basemodelentity.h index 63432db..3f90464 100644 --- a/game/server/basemodelentity.h +++ b/game/server/basemodelentity.h @@ -10,7 +10,15 @@ class CBaseModelEntity: public CBaseEntity public: DECLARE_CLASS(CBaseModelEntity, CBaseEntity); + DECLARE_DATADESC() + DECLARE_SERVERCLASS() + virtual void Spawn() override; virtual void SetModel( const char *szName ); + virtual void OnModelChanged( const char *szName ); + virtual void Think( float fDelta ); +private: + char m_szCurrentModel[256] = {}; + char m_szModel[256] = {}; }; #endif diff --git a/game/server/build.cpp b/game/server/build.cpp index 0ff55ff..1449d93 100644 --- a/game/server/build.cpp +++ b/game/server/build.cpp @@ -21,6 +21,7 @@ DECLARE_BUILD_STAGE(Server) "game.cpp", "assetmgr.cpp", + "worldsystem.cpp", "entitysystem.cpp", "baseentity.cpp", diff --git a/game/server/entitysystem.cpp b/game/server/entitysystem.cpp index 1902c35..198a01f 100644 --- a/game/server/entitysystem.cpp +++ b/game/server/entitysystem.cpp @@ -262,6 +262,8 @@ void CEntitySystem::NetSendThink( INetworkBase *pBase ) V_memcpy(pcCurrentData, pNetMap->m_pFields[u].m_uOffset+(char*)pEntity, pNetMap->m_pFields[u].m_uSize); + //if (pNetMap->m_pFields[u].m_eType == FIELD_STRING) + //V_printf("v: %s %u\n", pcCurrentData, pNetMap->m_pFields[u].m_uSize); pcCurrentData += (pNetMap->m_pFields[u].m_uSize+7) & ~7; x++; } diff --git a/game/server/game.cpp b/game/server/game.cpp index 6353dc2..103c568 100644 --- a/game/server/game.cpp +++ b/game/server/game.cpp @@ -3,10 +3,9 @@ #include "baseentity.h" #include "enginebridge.h" #include "game.h" -#include "inetworkserver.h" #include "netprotocol.h" -#include "tier1/utlvector.h" #include "iphysics.h" +#include "worldsystem.h" #ifdef STEAM #include "steam/isteamgameserver.h" #include "steam/steam_gameserver.h" @@ -91,9 +90,12 @@ void CFunnyGameBridge::Init() if (g_pEngineConstants->m_bIsSteam) { SteamErrMsg err = { 0 }; - if (SteamGameServer_InitEx(INADDR_ANY, FUNNY_SECURE_PORT, FUNNY_QUERY_PORT, eServerModeAuthentication, "0.0.0.0", &err)); + if (!SteamGameServer()) { - V_printf("SteamGameServer_InitEx: %s\n", err); + if (SteamGameServer_InitEx(INADDR_ANY, FUNNY_SECURE_PORT, FUNNY_QUERY_PORT, eServerModeAuthentication, "0.0.0.0", &err)) + { + V_printf("SteamGameServer_InitEx: %s\n", err); + } } SteamNetworkingUtils()->InitRelayNetworkAccess(); } @@ -118,6 +120,8 @@ void CFunnyGameBridge::Init() CreateInterfaceFn fnPhysicsFactory = Sys_GetFactory("RapierPhysics"); g_pPhysics = (IPhysics*)fnPhysicsFactory(PHYSICS_INTERFACE_VERSION, NULL); g_pPhysicsWorld = g_pPhysics->CreateWorld(); + + g_pWorldSystem->LoadMap("game/core/maps/test/test.fmap"); } diff --git a/game/server/physicsprop.cpp b/game/server/physicsprop.cpp index d58266d..b0a2a3f 100644 --- a/game/server/physicsprop.cpp +++ b/game/server/physicsprop.cpp @@ -11,12 +11,19 @@ void CPhysicsProp::Spawn() { CBaseEntity::Spawn(); SetThink(Think); + + V_printf("hi\n"); } void CPhysicsProp::Think( float fDelta ) { - BaseClass::SetAbsOrigin(m_pBody->GetPosition()); - BaseClass::SetAbsAngles(m_pBody->GetRotation()); + BaseClass::Think(fDelta); + if (m_pBody) + { + BaseClass::SetAbsOrigin(m_pBody->GetPosition()); + BaseClass::SetAbsAngles(m_pBody->GetRotation()); + } + V_printf("%f %f %f\n", GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z); } void CPhysicsProp::SetAbsAngles( Quat vQuat ) @@ -42,7 +49,7 @@ void CPhysicsProp::SetAbsOrigin( Vector origin ) m_pBody->SetPosition(m_pBody->GetPosition()); } -void CPhysicsProp::SetModel( const char *szName ) +void CPhysicsProp::OnModelChanged( const char *szName ) { if (m_hModel) { @@ -65,3 +72,4 @@ void CPhysicsProp::DisableMovement() } +LINK_ENTITY_TO_CLASS(prop_physics, CPhysicsProp) diff --git a/game/server/physicsprop.h b/game/server/physicsprop.h index 9ef277b..b5cc194 100644 --- a/game/server/physicsprop.h +++ b/game/server/physicsprop.h @@ -16,12 +16,13 @@ public: virtual void SetAbsQAngles( float fPitch, float fYaw, float fRoll ) override; virtual void SetAbsOrigin( Vector origin ) override; - virtual void SetModel( const char *szName ) override; + virtual void OnModelChanged( const char *szName ) override; virtual void EnableMovement(); virtual void DisableMovement(); void Think( float fDelta ); private: + EPhysicsBodyType m_ePhysicsType; HFunnyModel m_hModel = 0; FunnyModel_t *m_pModel = NULL; FunnyPhysics_t *m_pPhysics = NULL; diff --git a/game/server/worldsystem.cpp b/game/server/worldsystem.cpp index e69de29..67117dc 100644 --- a/game/server/worldsystem.cpp +++ b/game/server/worldsystem.cpp @@ -0,0 +1,124 @@ +#include "worldsystem.h" +#include "game.h" +#include "entitysystem.h" +#include "baseentity.h" +#include "netprotocol.h" + +void CWorldSystem::LoadEntity( IJSONValue *pObject ) +{ + if (pObject->GetType() != JSON_PARAMETER_OBJECT) + return; + IJSONObject *pObjectRoot = pObject->GetObject(); + + const char *szClassName = NULL; + + for ( int i = 0; i < pObjectRoot->GetCount(); i++) + { + if (V_strcmp(pObjectRoot->GetParameterName(i),"classname")) + continue; + + IJSONValue *pValue = pObjectRoot->GetParameter(i); + if (pValue->GetType() != JSON_PARAMETER_STRING) + { + V_printf("classname must be a string\n"); + break; + } + szClassName = pValue->GetStringValue(); + break; + } + if (szClassName == NULL) + return; + CBaseEntity *pEntity = EntitySystem()->CreateByClassname(szClassName, NULL); + if (!pEntity) + return; + for ( int i = 0; i < pObjectRoot->GetCount(); i++) + { + if (!V_strcmp(pObjectRoot->GetParameterName(i),"classname")) + continue; + + + IJSONValue *pValue = pObjectRoot->GetParameter(i); + typedescription_t *pDataMap = pEntity->FindDataByMapName(pObjectRoot->GetParameterName(i)); + if (!pDataMap) + continue; + union { + void *pData; + float *pfData; + Vector *pvData; + char *pcData; + }; + pData = (char*)pEntity+pDataMap->m_iFieldOffset; + switch (pDataMap->m_eFieldType) + { + case FIELD_STRING: + if (pValue->GetType() != JSON_PARAMETER_STRING) + continue; + V_strncpy(pcData, pValue->GetStringValue(), pDataMap->m_uFieldSize); + V_printf("loading %s %u\n", pValue->GetStringValue(), pDataMap->m_uFieldSize); + continue; + case FIELD_FLOAT3: + if (pValue->GetType() != JSON_PARAMETER_ARRAY) + continue; + if (pValue->GetArray()->GetCount() == 3) + { + if ( pValue->GetArray()->GetParameter(0)->GetType() + == JSON_PARAMETER_NUMBER ) + pvData->x = pValue->GetArray()->GetParameter(0)->GetNumberValue(); + if ( pValue->GetArray()->GetParameter(1)->GetType() + == JSON_PARAMETER_NUMBER ) + pvData->y = pValue->GetArray()->GetParameter(1)->GetNumberValue(); + if ( pValue->GetArray()->GetParameter(2)->GetType() + == JSON_PARAMETER_NUMBER ) + pvData->z = pValue->GetArray()->GetParameter(2)->GetNumberValue(); + + } + continue; + default: + break; + } + + } + pEntity->Spawn(); +} + +bool CWorldSystem::LoadMap( const char *szName ) +{ + V_printf("Loading %s\n", szName); + // unload the map + + IFileHandle *pHandle = filesystem->Open(szName, FILEMODE_READ); + if (!pHandle) + return 0; + + CUtlString szProperties = filesystem->ReadString(pHandle); + IJSONValue *pRoot = JSONManager()->ReadString(szProperties); + filesystem->Close(pHandle); + + if (!pRoot) + return 0; + + + // can't fail at this point + + + + switch (pRoot->GetType()) + { + case JSON_PARAMETER_ARRAY: + { + for ( uint32_t u = 0; u < pRoot->GetArray()->GetCount(); u++ ) + { + IJSONValue *pObjectValue = pRoot->GetArray()->GetParameter(u); + if ( !pObjectValue ) + continue; + LoadEntity(pObjectValue); + } + JSONManager()->FreeValue(pRoot); + return 1; + } + default: + return 0; + } +} +static CWorldSystem s_worldSystem; +CWorldSystem *g_pWorldSystem = &s_worldSystem; diff --git a/game/server/worldsystem.h b/game/server/worldsystem.h index e69de29..af4da1e 100644 --- a/game/server/worldsystem.h +++ b/game/server/worldsystem.h @@ -0,0 +1,16 @@ +#ifndef WORLD_SYSTEM_H +#define WORLD_SYSTEM_H + +#include "assetmgr.h" +#include "tier2/fileformats/json.h" + +class CWorldSystem +{ +public: + virtual bool LoadMap( const char *szName ); +private: + virtual void LoadEntity( IJSONValue *pObject); +}; +extern CWorldSystem *g_pWorldSystem; + +#endif diff --git a/game/shared/datamap.h b/game/shared/datamap.h index cfda34e..3198aba 100644 --- a/game/shared/datamap.h +++ b/game/shared/datamap.h @@ -98,9 +98,11 @@ struct datamap_t #define _class_offsetof( class, var ) ((size_t)&(((class*)0)->var)) #define _FIELD( name, fieldtype, count, flags, mapname, tolerance) { #name, mapname, fieldtype, _class_offsetof(ThisClass, name), count, sizeof(((ThisClass*)0)->name), flags }, -#define DEFINE_FIELD( name, fieldtype ) _FIELD( name, fieldtype, 1, FTYPEDESC_KEY, 0, 0) -#define DEFINE_KEYFIELD( name, fieldtype, mapname ) _FIELD( name, fieldtype, 1, FTYPEDESC_KEY, mapname, 0) +#define DEFINE_FIELD( name, fieldtype ) _FIELD( name, fieldtype, 1, FTYPEDESC_SAVE, 0, 0) +#define DEFINE_KEYFIELD( name, fieldtype, mapname ) _FIELD( name, fieldtype, 1, FTYPEDESC_KEY | FTYPEDESC_SAVE, mapname, 0) +#define FTYPEDESC_GLOBAL 0x0001 +#define FTYPEDESC_SAVE 0x0002 #define FTYPEDESC_KEY 0x0004 diff --git a/game/shared/netmap.h b/game/shared/netmap.h index 70aeab9..5728a47 100644 --- a/game/shared/netmap.h +++ b/game/shared/netmap.h @@ -4,6 +4,13 @@ #include "stdint.h" #include "datamap.h" +template +class CNetworkVarBase +{ + +}; + + struct netfield_t { const char *m_szName; @@ -20,6 +27,7 @@ struct netmap_t }; #define NetPropInt(name) { #name, FIELD_INT, _class_offsetof(ThisClass, name), sizeof(name)} +#define NetPropString(name) { #name, FIELD_STRING, _class_offsetof(ThisClass, name), sizeof(name)} #define NetPropFloat(name) { #name, FIELD_FLOAT, _class_offsetof(ThisClass, name), sizeof(name)} #define NetPropFloat3(name) \ NetPropFloat(name.x), \ diff --git a/game/shared/netprotocol.h b/game/shared/netprotocol.h index 42fac93..d321f96 100644 --- a/game/shared/netprotocol.h +++ b/game/shared/netprotocol.h @@ -5,11 +5,11 @@ #include "stdint.h" #include "tier0/network.h" -class CNetworkUInt32 +class CNetworkProtocolUInt32 { public: - CNetworkUInt32() : m_uValue(0) {} - CNetworkUInt32( uint32_t uValue ) : m_uValue(htonl(uValue)) {} + CNetworkProtocolUInt32() : m_uValue(0) {} + CNetworkProtocolUInt32( uint32_t uValue ) : m_uValue(htonl(uValue)) {} operator uint32_t() const { return htonl(m_uValue); } @@ -25,6 +25,7 @@ enum EMessageType: uint32_t MESSAGE_ENTITY_DATA_SYNC, k_EMessage_PlayerSetLocalEntity, + k_EMessage_ResetEntities, }; struct PlayerJoined_t @@ -36,39 +37,39 @@ struct PlayerJoined_t struct PlayerJoinedCallback_t { EMessageType m_eType; - CNetworkUInt32 m_uPlayerIndex; + CNetworkProtocolUInt32 m_uPlayerIndex; }; struct PlayerLeft_t { EMessageType m_eType; - CNetworkUInt32 m_uPlayerIndex; + CNetworkProtocolUInt32 m_uPlayerIndex; }; struct EntityClass_t { EMessageType m_eType; - CNetworkUInt32 m_uIndex; + CNetworkProtocolUInt32 m_uIndex; int8_t m_szEntityName[256]; }; struct EntityDataSync_t { EMessageType m_eType; - CNetworkUInt32 m_uIndex; - CNetworkUInt32 m_uCount; + CNetworkProtocolUInt32 m_uIndex; + CNetworkProtocolUInt32 m_uCount; }; struct EntityDataSyncValue_t { - CNetworkUInt32 m_uVariableIndex; - CNetworkUInt32 m_uVariableSize; + CNetworkProtocolUInt32 m_uVariableIndex; + CNetworkProtocolUInt32 m_uVariableSize; }; struct SetLocalEntity_t { EMessageType m_eType; - CNetworkUInt32 m_uIndex; + CNetworkProtocolUInt32 m_uIndex; }; union PlayerPacket_t diff --git a/public/iphysics.h b/public/iphysics.h index 4cadf2e..f3228bd 100644 --- a/public/iphysics.h +++ b/public/iphysics.h @@ -17,6 +17,14 @@ struct CuboidShape_t float m_fExtentZ; }; +struct TrianglesShape_t +{ + float *m_pfPositions; + uint32_t m_nPositionCount; + uint32_t *m_puIndicies; + uint32_t m_nIndiciesCount; +}; + enum EPhysicsBodyType { k_EPhysics_Static, @@ -58,6 +66,7 @@ abstract_class IPhysics public: virtual HShape CreateBall( BallShape_t ball ) = 0; virtual HShape CreateCube( CuboidShape_t ball ) = 0; + virtual HShape CreateTriangles( TrianglesShape_t shape ) = 0; virtual void DestroyShape( HShape hShape ) = 0; virtual HCollider CreateCollider( HShape hShape ) = 0; diff --git a/rapier/physics.cpp b/rapier/physics.cpp index ec134b6..611a18a 100644 --- a/rapier/physics.cpp +++ b/rapier/physics.cpp @@ -95,6 +95,11 @@ public: return CRapierPhysics_CreateCube(m_pRustHandle, ball); } + virtual HShape CreateTriangles( TrianglesShape_t shape ) override + { + return CRapierPhysics_CreateCube(m_pRustHandle, shape); + } + virtual void DestroyShape( HShape hShape ) override { diff --git a/rapier/physics.rs b/rapier/physics.rs index ae13914..4201df6 100644 --- a/rapier/physics.rs +++ b/rapier/physics.rs @@ -29,6 +29,7 @@ pub struct BallShape_t #[repr(C)] #[derive(Clone, Copy)] +#[derive(Debug)] pub struct CuboidShape_t { m_fExtentX: f32, @@ -36,12 +37,38 @@ pub struct CuboidShape_t m_fExtentZ: f32, } +#[derive(Clone)] +#[derive(Debug)] +pub enum RapierShapeType { + Ball(Ball), + Cuboid(Cuboid), + Capsule(Capsule), + Segment(Segment), + Triangle(Triangle), + Voxels(Voxels), + TriMesh(TriMesh), + Polyline(Polyline), + HalfSpace(HalfSpace), + HeightField(HeightField), + Compound(Compound), + ConvexPolyhedron(ConvexPolyhedron), + Cylinder(Cylinder), + Cone(Cone), + RoundCuboid(RoundCuboid), + RoundTriangle(RoundTriangle), + RoundCylinder(RoundCylinder), + RoundCone(RoundCone), + RoundConvexPolyhedron(RoundConvexPolyhedron), + #[allow(dead_code)] + Custom, +} + #[derive(Clone)] +#[derive(Debug)] pub struct RapierShape_t { - m_eType: ShapeType, - m_pShape: *mut dyn Shape, + m_shape: RapierShapeType, m_sharedShape: SharedShape, } @@ -57,6 +84,7 @@ pub enum EPhysicsBodyType #[derive(Clone)] +#[derive(Debug)] pub struct RapierCollider_t { m_collider: Collider, @@ -94,6 +122,14 @@ pub struct RapierPhysics_t } +struct TrianglesShape_t +{ + m_pfPositions: *const f32, + m_nPositionCount: const u32, + m_puIndicies, + m_nIndiciesCount, +}; + #[no_mangle] pub unsafe extern "C" fn CRapierPhysicsBody_SetPosition( this: *mut RapierPhysicsBody_t, fX: f32, fY: f32, fZ: f32 ) { @@ -201,51 +237,52 @@ pub unsafe extern "C" fn CRapierPhysics_New() -> *mut RapierPhysics_t { let physics = RapierPhysics_t {}; let pPhysics = V_malloc!(RapierPhysics_t, 1); - *pPhysics = physics; + *pPhysics = physics.clone(); pPhysics } #[no_mangle] pub unsafe extern "C" fn CRapierPhysics_CreateBall( this: *mut RapierPhysics_t, ball: BallShape_t ) -> *mut RapierShape_t { - let rapierShape = Ball::new(ball.m_fRadius); - let pRapierShapeMemory: *mut Ball = V_malloc!(Ball, 1); - *pRapierShapeMemory = rapierShape; - - let shape: RapierShape_t = RapierShape_t { - m_eType: ShapeType::Ball, - m_pShape: pRapierShapeMemory, - m_sharedShape: SharedShape::new(rapierShape) - }; let pShapeMemory: *mut RapierShape_t = V_malloc!(RapierShape_t, 1); - *pShapeMemory = shape; + std::ptr::write(&mut (*pShapeMemory).m_shape, RapierShapeType::Ball(Ball::new(ball.m_fRadius))); + match ((*pShapeMemory).m_shape) + { + RapierShapeType::Ball(b) => { + std::ptr::write(&mut (*pShapeMemory).m_sharedShape, SharedShape::new(b)); + } + _ => {} + } pShapeMemory } #[no_mangle] pub unsafe extern "C" fn CRapierPhysics_CreateCube( this: *mut RapierPhysics_t, cuboid: CuboidShape_t ) -> *mut RapierShape_t { - let rapierShape = Cuboid::new(vec3(cuboid.m_fExtentX, cuboid.m_fExtentY, cuboid.m_fExtentZ)); - let pRapierShapeMemory: *mut Cuboid = V_malloc!(Cuboid, 1); - *pRapierShapeMemory = rapierShape; - - let shape: RapierShape_t = RapierShape_t { - m_eType: ShapeType::Cuboid, - m_pShape: pRapierShapeMemory, - m_sharedShape: SharedShape::new(rapierShape) - }; let pShapeMemory: *mut RapierShape_t = V_malloc!(RapierShape_t, 1); - *pShapeMemory = shape; + std::ptr::write(&mut (*pShapeMemory).m_shape, RapierShapeType::Cuboid( + Cuboid::new(vec3(cuboid.m_fExtentX, cuboid.m_fExtentY, cuboid.m_fExtentZ))) + ); + match ((*pShapeMemory).m_shape) + { + RapierShapeType::Cuboid(b) => { + std::ptr::write(&mut (*pShapeMemory).m_sharedShape, SharedShape::new(b)); + } + _ => {} + } pShapeMemory } #[no_mangle] pub unsafe extern "C" fn CRapierPhysics_CreateCollider( this: *mut RapierPhysics_t, pShape: *mut RapierShape_t ) -> *mut RapierCollider_t { - let pRapierShape = (*pShape).m_pShape; + println!("this {:?}", pShape); let shape: &SharedShape = &(*pShape).m_sharedShape; + println!("this {:?}", pShape); let pCollider = V_malloc!(RapierCollider_t, 1); + println!("this {:?}", pShape); std::ptr::write(&mut (*pCollider).m_collider, ColliderBuilder::new(shape.clone()).build()); + println!("this {:?}", pShape); pCollider } diff --git a/tools/blender_funnyasset.py b/tools/blender_funnyasset.py index b421aa4..800f371 100644 --- a/tools/blender_funnyasset.py +++ b/tools/blender_funnyasset.py @@ -23,7 +23,7 @@ class ExportFunnyMesh(Operator, ExportHelper): filename_ext = ".fmesh_c" filter_glob: StringProperty( - default="*.map", + default="*.fmesh_c", options={'HIDDEN'}, ) @@ -44,8 +44,8 @@ def export_my_format(filepath): world_pos = obj.matrix_world @ vert.co world_normal = obj.matrix_world @ vert.normal f.write(struct.pack('f', world_pos.x)) - f.write(struct.pack('f', world_pos.y)) f.write(struct.pack('f', world_pos.z)) + f.write(struct.pack('f', world_pos.y)) if uv_layer: uv = uv_layer[loop_index].uv f.write(struct.pack('f', uv.x)) @@ -54,8 +54,8 @@ def export_my_format(filepath): f.write(struct.pack('f', 0)) f.write(struct.pack('f', 0)) f.write(struct.pack('f', world_normal.x)) - f.write(struct.pack('f', world_normal.y)) f.write(struct.pack('f', world_normal.z)) + f.write(struct.pack('f', world_normal.y)) return {'FINISHED'}