From 0a6cb9a43cd1f2947ef200d031020a7b37677ac7 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 11:27:43 +0100 Subject: [PATCH 01/46] Patch --- Code/Game/GameClient/DanBiasGame_Impl.cpp | 33 ++++---- .../GameClientState/Buttons/EventButtonGUI.h | 4 +- .../GameClient/GameClientState/C_Object.cpp | 6 +- .../GameClient/GameClientState/C_Object.h | 78 ++++++++++++------- .../GameClientState/GameClientState.cpp | 4 +- .../GameClientState/GameClientState.h | 11 ++- .../GameClient/GameClientState/GameState.cpp | 14 ++-- .../GameClient/GameClientState/GameState.h | 4 +- .../GameClientState/LanMenuState.cpp | 12 +-- .../GameClient/GameClientState/LanMenuState.h | 4 +- .../GameClientState/LevelLoader/LevelLoader.h | 2 +- .../GameClientState/LevelLoader/LevelParser.h | 2 +- .../GameClientState/LevelLoader/Loader.h | 2 +- .../GameClientState/LobbyAdminState.cpp | 12 +-- .../GameClientState/LobbyAdminState.h | 4 +- .../GameClient/GameClientState/LobbyState.cpp | 12 +-- .../GameClient/GameClientState/LobbyState.h | 8 +- .../GameClient/GameClientState/MainState.cpp | 16 ++-- .../GameClient/GameClientState/MainState.h | 14 ++-- .../GameClientState/NetLoadState.cpp | 17 +++- .../GameClient/GameClientState/NetLoadState.h | 4 +- .../GameClientState/SharedStateContent.h | 28 +++++++ 22 files changed, 182 insertions(+), 109 deletions(-) create mode 100644 Code/Game/GameClient/GameClientState/SharedStateContent.h diff --git a/Code/Game/GameClient/DanBiasGame_Impl.cpp b/Code/Game/GameClient/DanBiasGame_Impl.cpp index 21d5589f..244568c2 100644 --- a/Code/Game/GameClient/DanBiasGame_Impl.cpp +++ b/Code/Game/GameClient/DanBiasGame_Impl.cpp @@ -18,12 +18,15 @@ #include "WinTimer.h" #include "vld.h" -#include "EventHandler/EventHandler.h" +#include "../Misc/EventHandler/EventHandler.h" + +#include "GameClientState\SharedStateContent.h" using namespace ::Oyster; using namespace ::Oyster::Event; using namespace ::Oyster::Network; using namespace ::Utility::DynamicMemory; +using namespace ::DanBias::Client; void ClientEventFunction( NetEvent e ); @@ -32,15 +35,17 @@ namespace DanBias #pragma region Game Data class DanBiasGamePrivateData { - public: WindowShell* window; - InputClass* inputObj; + InputClass inputObj; Utility::WinTimer timer; - UniquePointer state; - NetworkClient networkClient; - bool serverOwner; + UniquePointer state; + SharedStateContent sharedStateContent; + NetworkClient networkClient; + + + bool serverOwner; float capFrame; DanBiasGamePrivateData() @@ -72,10 +77,13 @@ namespace DanBias data.networkClient.SetMessagePump( ClientEventFunction ); + data.sharedStateContent.network = &data.networkClient; + data.sharedStateContent.input = &data.inputObj; + // Start in main menu state data.state = new Client::MainState(); - if( !data.state->Init( &data.networkClient ) ) + if( !data.state->Init( data.sharedStateContent ) ) return DanBiasClientReturn_Error; data.timer.reset(); @@ -140,8 +148,7 @@ namespace DanBias //------------------------------------------------------------------------------------- HRESULT DanBiasGame::InitInput() { - data.inputObj = new InputClass; - if(!data.inputObj->Initialize(data.window->GetHINSTANCE(), data.window->GetHWND(), data.window->GetHeight(), data.window->GetWidth())) + if(!data.inputObj.Initialize(data.window->GetHINSTANCE(), data.window->GetHWND(), data.window->GetHeight(), data.window->GetWidth())) { MessageBox(0, L"Could not initialize the input object.", L"Error", MB_OK); return E_FAIL; @@ -164,7 +171,7 @@ namespace DanBias float mouseNormalisedY = (float)(mousePos.y - windowVertex.top); mouseNormalisedY /= (float)(windowVertex.bottom - windowVertex.top); - data.inputObj->Update( mouseNormalisedX, mouseNormalisedY ); + data.inputObj.Update( mouseNormalisedX, mouseNormalisedY ); } if( data.serverOwner ) @@ -174,7 +181,7 @@ namespace DanBias DanBias::Client::GameClientState::ClientState state = DanBias::Client::GameClientState::ClientState_Same; - state = data.state->Update( deltaTime, data.inputObj ); + state = data.state->Update( deltaTime ); if( state != Client::GameClientState::ClientState_Same ) { @@ -217,7 +224,7 @@ namespace DanBias if( stateChanged ) { - data.state->Init( &data.networkClient ); // send game client + data.state->Init( data.sharedStateContent ); // send game client } } return Result_continue; @@ -235,8 +242,6 @@ namespace DanBias if( data.networkClient.IsConnected() ) data.networkClient.Disconnect(); - delete data.inputObj; - data.state = nullptr; EventHandler::Instance().Clean(); Graphics::API::Clean(); diff --git a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h index c770cb9c..d4981c23 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h +++ b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h @@ -5,8 +5,8 @@ #ifndef DANBIAS_CLIENT_EVENT_BUTTON_GUI_H #define DANBIAS_CLIENT_EVENT_BUTTON_GUI_H -#include "EventHandler/EventButton.h" -#include "DllInterfaces/GFXAPI.h" +#include "../Misc/EventHandler/EventButton.h" +#include "../OysterGraphics/DllInterfaces/GFXAPI.h" diff --git a/Code/Game/GameClient/GameClientState/C_Object.cpp b/Code/Game/GameClient/GameClientState/C_Object.cpp index d44d9201..92b55c53 100644 --- a/Code/Game/GameClient/GameClientState/C_Object.cpp +++ b/Code/Game/GameClient/GameClientState/C_Object.cpp @@ -100,5 +100,9 @@ void C_Object::Render() } void C_Object::Release() { - Oyster::Graphics::API::DeleteModel(model); + if( this->model ) + { + Oyster::Graphics::API::DeleteModel(model); + this->model = nullptr; + } } \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/C_Object.h b/Code/Game/GameClient/GameClientState/C_Object.h index ae9dc3a5..20e0eb60 100644 --- a/Code/Game/GameClient/GameClientState/C_Object.h +++ b/Code/Game/GameClient/GameClientState/C_Object.h @@ -16,37 +16,55 @@ namespace DanBias bool visible; }; -class C_Object -{ -private: - Oyster::Math::Float4x4 world; - Oyster::Math::Float3 position; - Oyster::Math::Quaternion rotation; - Oyster::Math::Float3 scale; + class C_Object + { + private: + Oyster::Math::Float4x4 world; + Oyster::Math::Float3 position; + Oyster::Math::Quaternion rotation; + Oyster::Math::Float3 scale; - int id; - void updateWorld(); -protected: - Oyster::Graphics::Model::Model *model; -public: - C_Object(); - virtual ~C_Object(); - virtual bool Init(ModelInitData modelInit); + int id; + void updateWorld(); + protected: + Oyster::Graphics::Model::Model *model; + public: + C_Object(); + virtual ~C_Object(); + virtual bool Init(ModelInitData modelInit); - void setWorld(Oyster::Math::Float4x4 world); - Oyster::Math::Float4x4 getWorld() const; - void setPos(Oyster::Math::Float3 newPos); - Oyster::Math::Float3 getPos() const; - void addPos(Oyster::Math::Float3 deltaPos); - void setRot(Oyster::Math::Quaternion newRot); - Oyster::Math::Quaternion getRotation() const; - void addRot(Oyster::Math::Quaternion deltaRot); - void setScale(Oyster::Math::Float3 newScale); - void addScale(Oyster::Math::Float3 deltaScale); - Oyster::Math::Float3 getScale() const; + void setWorld(Oyster::Math::Float4x4 world); + Oyster::Math::Float4x4 getWorld() const; + void setPos(Oyster::Math::Float3 newPos); + Oyster::Math::Float3 getPos() const; + void addPos(Oyster::Math::Float3 deltaPos); + void setRot(Oyster::Math::Quaternion newRot); + Oyster::Math::Quaternion getRotation() const; + void addRot(Oyster::Math::Quaternion deltaRot); + void setScale(Oyster::Math::Float3 newScale); + void addScale(Oyster::Math::Float3 deltaScale); + Oyster::Math::Float3 getScale() const; + + virtual void Render(); + virtual void Release(); + virtual int GetId() const; + }; + } +} + +#include "Utilities.h" + +namespace Utility { namespace DynamicMemory +{ + template<> + inline void SafeDeleteInstance( ::DanBias::Client::C_Object *dynamicInstance ) + { + if( dynamicInstance ) + { + dynamicInstance->Release(); + delete dynamicInstance; + } + } +} } - virtual void Render(); - virtual void Release(); - virtual int GetId() const; -};};}; #endif diff --git a/Code/Game/GameClient/GameClientState/GameClientState.cpp b/Code/Game/GameClient/GameClientState/GameClientState.cpp index 9db00f9d..dab88b2e 100644 --- a/Code/Game/GameClient/GameClientState/GameClientState.cpp +++ b/Code/Game/GameClient/GameClientState/GameClientState.cpp @@ -3,9 +3,9 @@ using namespace DanBias::Client; using namespace ::Oyster::Network; -GameClientState::GameClientState(void) {} +GameClientState::GameClientState() {} -GameClientState::~GameClientState(void) {} +GameClientState::~GameClientState() {} void GameClientState::DataRecieved( NetEvent e ) { /* do nothing */ } \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameClientState.h b/Code/Game/GameClient/GameClientState/GameClientState.h index 9317413e..3822c7b0 100644 --- a/Code/Game/GameClient/GameClientState/GameClientState.h +++ b/Code/Game/GameClient/GameClientState/GameClientState.h @@ -2,8 +2,7 @@ #define DANBIAS_CLIENT_GAMECLIENTSTATE_H #define NOMINMAX -#include "L_inputClass.h" -#include "NetworkClient.h" +#include "SharedStateContent.h" namespace DanBias { namespace Client { @@ -24,10 +23,10 @@ namespace DanBias { namespace Client }; public: - GameClientState(void); - virtual ~GameClientState(void); - virtual bool Init(Oyster::Network::NetworkClient* nwClient) = 0; - virtual ClientState Update(float deltaTime, InputClass* KeyInput) = 0; + GameClientState(); + virtual ~GameClientState(); + virtual bool Init( SharedStateContent &shared ) = 0; + virtual ClientState Update( float deltaTime ) = 0; virtual bool Render() = 0; virtual bool Release() = 0; virtual void ChangeState( ClientState next ) = 0; diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 66ca6c12..349eaaeb 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -15,9 +15,10 @@ struct GameState::MyData MyData(){} GameClientState::ClientState nextState; NetworkClient *nwClient; + InputClass *input; } privData; -GameState::GameState(void) +GameState::GameState() { key_forward = false; key_backward = false; @@ -25,24 +26,25 @@ GameState::GameState(void) key_strafeLeft = false; } -GameState::~GameState(void) +GameState::~GameState() { if( this->privData ) this->Release(); } -bool GameState::Init(NetworkClient* nwClient) +bool GameState::Init( SharedStateContent &shared ) { // load models privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->input = shared.input; LoadGame(); //tell server ready - nwClient->Send( GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready) ); + this->privData->nwClient->Send( GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready) ); return true; } @@ -180,7 +182,7 @@ void GameState::InitiatePlayer(int id, std::wstring modelName, Float4x4 world) camera.UpdateOrientation(); } -GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState GameState::Update( float deltaTime ) { //switch (privData->state) //{ diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 6366bb8c..5a3b3c1a 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -25,8 +25,8 @@ namespace DanBias { namespace Client GameState(void); ~GameState(void); - bool Init(Oyster::Network::NetworkClient* nwClient); - GameClientState::ClientState Update(float deltaTime, InputClass* KeyInput) override; + bool Init( SharedStateContent &shared ); + GameClientState::ClientState Update( float deltaTime ) override; bool LoadModels(std::string mapFile); bool InitCamera(Oyster::Math::Float3 startPos) ; diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 6a836a36..7faf5d55 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -28,6 +28,7 @@ struct LanMenuState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; + InputClass *input; Graphics::API::Texture background; EventButtonCollection guiElements; @@ -46,12 +47,13 @@ LanMenuState::~LanMenuState() this->Release(); } -bool LanMenuState::Init(Network::NetworkClient* nwClient) +bool LanMenuState::Init( SharedStateContent &shared ) { this->privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->input = shared.input; this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); @@ -80,12 +82,12 @@ bool LanMenuState::Init(Network::NetworkClient* nwClient) return true; } -GameClientState::ClientState LanMenuState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState LanMenuState::Update( float deltaTime ) { MouseInput mouseState; { - KeyInput->GetMousePos( mouseState.x, mouseState.y ); - mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); + this->privData->input->GetMousePos( mouseState.x, mouseState.y ); + mouseState.mouseButtonPressed = this->privData->input->IsMousePressed(); } EventHandler::Instance().Update( mouseState ); diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.h b/Code/Game/GameClient/GameClientState/LanMenuState.h index 8f3e8e67..57889eee 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.h +++ b/Code/Game/GameClient/GameClientState/LanMenuState.h @@ -14,8 +14,8 @@ namespace DanBias LanMenuState(); virtual ~LanMenuState(); - virtual bool Init(Oyster::Network::NetworkClient* nwClient); - virtual ClientState Update(float deltaTime, InputClass* KeyInput); + bool Init( SharedStateContent &shared ); + virtual ClientState Update( float deltaTime ); virtual bool Render(); virtual bool Release(); diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h b/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h index aa67c4f5..184a7005 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h @@ -7,7 +7,7 @@ #include #include -#include "Utilities.h" +#include "../Misc/Utilities.h" #include "ObjectDefines.h" namespace GameLogic diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h index 8f2a9150..346b75b5 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h @@ -4,7 +4,7 @@ #include #include #include "ObjectDefines.h" -#include "Utilities.h" +#include "../Misc/Utilities.h" namespace GameLogic { diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h b/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h index 0433194e..198c2a87 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h @@ -5,7 +5,7 @@ #ifndef LOADER_H #define LOADER_H -#include "Resource\OysterResource.h" +#include "..\Misc\Resource\OysterResource.h" #include namespace GameLogic diff --git a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp index c157226e..6cc1f15f 100644 --- a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp @@ -22,6 +22,7 @@ struct LobbyAdminState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; + InputClass *input; Graphics::API::Texture background; EventButtonCollection guiElements; } privData; @@ -36,12 +37,13 @@ LobbyAdminState::~LobbyAdminState(void) this->Release(); } -bool LobbyAdminState::Init(NetworkClient* nwClient) +bool LobbyAdminState::Init( SharedStateContent &shared ) { privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->input = shared.input; this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); @@ -57,7 +59,7 @@ bool LobbyAdminState::Init(NetworkClient* nwClient) return true; } -GameClientState::ClientState LobbyAdminState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState LobbyAdminState::Update( float deltaTime ) { // Wishlist: // picking @@ -70,8 +72,8 @@ GameClientState::ClientState LobbyAdminState::Update(float deltaTime, InputClass MouseInput mouseState; { - KeyInput->GetMousePos( mouseState.x, mouseState.y ); - mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); + this->privData->input->GetMousePos( mouseState.x, mouseState.y ); + mouseState.mouseButtonPressed = this->privData->input->IsMousePressed(); } EventHandler::Instance().Update( mouseState ); diff --git a/Code/Game/GameClient/GameClientState/LobbyAdminState.h b/Code/Game/GameClient/GameClientState/LobbyAdminState.h index 06a9aced..49ae9274 100644 --- a/Code/Game/GameClient/GameClientState/LobbyAdminState.h +++ b/Code/Game/GameClient/GameClientState/LobbyAdminState.h @@ -24,8 +24,8 @@ namespace DanBias LobbyAdminState(); ~LobbyAdminState(); - bool Init( Oyster::Network::NetworkClient* nwClient ); - ClientState Update( float deltaTime, InputClass* KeyInput ); + bool Init( SharedStateContent &shared ); + ClientState Update( float deltaTime ); bool Render(); bool Release(); void ChangeState( ClientState next ); diff --git a/Code/Game/GameClient/GameClientState/LobbyState.cpp b/Code/Game/GameClient/GameClientState/LobbyState.cpp index 47a3cebb..6c5b2606 100644 --- a/Code/Game/GameClient/GameClientState/LobbyState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyState.cpp @@ -22,6 +22,7 @@ struct LobbyState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; + InputClass *input; Graphics::API::Texture background; EventButtonCollection guiElements; } privData; @@ -36,12 +37,13 @@ LobbyState::~LobbyState(void) this->Release(); } -bool LobbyState::Init(NetworkClient* nwClient) +bool LobbyState::Init( SharedStateContent &shared ) { privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->input = shared.input; this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); @@ -57,7 +59,7 @@ bool LobbyState::Init(NetworkClient* nwClient) return true; } -GameClientState::ClientState LobbyState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState LobbyState::Update( float deltaTime ) { // Wishlist: // picking @@ -70,8 +72,8 @@ GameClientState::ClientState LobbyState::Update(float deltaTime, InputClass* Key MouseInput mouseState; { - KeyInput->GetMousePos( mouseState.x, mouseState.y ); - mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); + this->privData->input->GetMousePos( mouseState.x, mouseState.y ); + mouseState.mouseButtonPressed = this->privData->input->IsMousePressed(); } EventHandler::Instance().Update( mouseState ); diff --git a/Code/Game/GameClient/GameClientState/LobbyState.h b/Code/Game/GameClient/GameClientState/LobbyState.h index 7b6e5909..694aaa38 100644 --- a/Code/Game/GameClient/GameClientState/LobbyState.h +++ b/Code/Game/GameClient/GameClientState/LobbyState.h @@ -23,11 +23,11 @@ namespace DanBias class LobbyState : public GameClientState { public: - LobbyState(void); - ~LobbyState(void); + LobbyState(); + ~LobbyState(); - bool Init( Oyster::Network::NetworkClient* nwClient ); - ClientState Update( float deltaTime, InputClass* KeyInput ); + bool Init( SharedStateContent &shared ); + ClientState Update( float deltaTime ); bool Render(); bool Release(); void ChangeState( ClientState next ); diff --git a/Code/Game/GameClient/GameClientState/MainState.cpp b/Code/Game/GameClient/GameClientState/MainState.cpp index 81794252..1fd1d813 100644 --- a/Code/Game/GameClient/GameClientState/MainState.cpp +++ b/Code/Game/GameClient/GameClientState/MainState.cpp @@ -24,6 +24,7 @@ struct MainState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; + InputClass *input; Graphics::API::Texture background; EventButtonCollection guiElements; }; @@ -32,20 +33,21 @@ void OnButtonInteract_Create( Oyster::Event::ButtonEvent& e ); void OnButtonInteract_Join( Oyster::Event::ButtonEvent& e ); void OnButtonInteract_Quit( Oyster::Event::ButtonEvent& e ); -MainState::MainState(void) {} +MainState::MainState() {} -MainState::~MainState(void) +MainState::~MainState() { if( this->privData ) this->Release(); } -bool MainState::Init( NetworkClient* nwClient ) +bool MainState::Init( SharedStateContent &shared ) { this->privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->input = shared.input; this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); @@ -67,12 +69,12 @@ bool MainState::Init( NetworkClient* nwClient ) return true; } -GameClientState::ClientState MainState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState MainState::Update( float deltaTime ) { MouseInput mouseState; { - KeyInput->GetMousePos( mouseState.x, mouseState.y ); - mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); + this->privData->input->GetMousePos( mouseState.x, mouseState.y ); + mouseState.mouseButtonPressed = this->privData->input->IsMousePressed(); } EventHandler::Instance().Update( mouseState ); diff --git a/Code/Game/GameClient/GameClientState/MainState.h b/Code/Game/GameClient/GameClientState/MainState.h index 7255e917..22589686 100644 --- a/Code/Game/GameClient/GameClientState/MainState.h +++ b/Code/Game/GameClient/GameClientState/MainState.h @@ -11,18 +11,18 @@ namespace DanBias { class MainState : public GameClientState { - private: - struct MyData; - ::Utility::DynamicMemory::UniquePointer privData; public: - MainState(void); - ~MainState(void); - bool Init( Oyster::Network::NetworkClient* nwClient ); - ClientState Update(float deltaTime, InputClass* KeyInput); + MainState(); + ~MainState(); + bool Init( SharedStateContent &shared ); + ClientState Update( float deltaTime ); bool Render(); bool Release(); void ChangeState( ClientState next ); + private: + struct MyData; + ::Utility::DynamicMemory::UniquePointer privData; }; } } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index c8fd1e64..ac7dd78b 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -13,6 +13,7 @@ struct NetLoadState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; + Graphics::API::Texture background; bool loading; }; @@ -24,28 +25,36 @@ NetLoadState::~NetLoadState(void) this->Release(); } -bool NetLoadState::Init( NetworkClient* nwClient ) +bool NetLoadState::Init( SharedStateContent &shared ) { this->privData = new MyData(); this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = nwClient; + this->privData->nwClient = shared.network; + this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); this->privData->loading = false; // we may assume that nwClient is properly connected to the server // signals querry to server for loading instructions - nwClient->Send( Protocol_QuerryGameType() ); + this->privData->nwClient->Send( Protocol_QuerryGameType() ); return true; } -GameClientState::ClientState NetLoadState::Update(float deltaTime, InputClass* KeyInput) +GameClientState::ClientState NetLoadState::Update( float deltaTime ) { return this->privData->nextState; } bool NetLoadState::Render() { + Graphics::API::NewFrame(); + Graphics::API::StartGuiRender(); + + Graphics::API::RenderGuiElement( this->privData->background, Float3(0.5f, 0.5f, 1.0f), Float2(1.0f) ); + + Graphics::API::EndFrame(); + return true; } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.h b/Code/Game/GameClient/GameClientState/NetLoadState.h index ff2d1acc..ea9f9f6a 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.h +++ b/Code/Game/GameClient/GameClientState/NetLoadState.h @@ -14,8 +14,8 @@ namespace DanBias NetLoadState( ); virtual ~NetLoadState( ); - bool Init( Oyster::Network::NetworkClient* nwClient ); - ClientState Update( float deltaTime, InputClass* KeyInput ); + bool Init( SharedStateContent &shared ); + ClientState Update( float deltaTime ); bool Render(); bool Release(); diff --git a/Code/Game/GameClient/GameClientState/SharedStateContent.h b/Code/Game/GameClient/GameClientState/SharedStateContent.h new file mode 100644 index 00000000..567be2fa --- /dev/null +++ b/Code/Game/GameClient/GameClientState/SharedStateContent.h @@ -0,0 +1,28 @@ +/******************************************************************** + * Created by Dan Andersson, 2014 + * Contains a shared memory struct. + * Whihc reference passed seamlessly between the game states + * at their Init calls. + ********************************************************************/ + +#ifndef SHAREDSTATECONTENT_H +#define SHAREDSTATECONTENT_H + +#include +#include "Utilities.h" +#include "C_Object.h" +#include "NetworkClient.h" +#include "L_inputClass.h" + +namespace DanBias { namespace Client +{ + struct SharedStateContent + { + public: + ::std::map> scene; + ::Oyster::Network::NetworkClient *network; + InputClass* input; + }; +} } + +#endif \ No newline at end of file From 752cb163caf00319a8c14f9c5a7fcbc7f4db5746 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 11:50:51 +0100 Subject: [PATCH 02/46] Fixed build errors in GameClient --- Code/Game/GameClient/DanBiasGame_Impl.cpp | 2 +- Code/Game/GameClient/GameClient.vcxproj | 18 ++++++++++++++---- Code/Game/GameClient/GameClient.vcxproj.user | 2 +- .../GameClientState/Buttons/EventButtonGUI.h | 6 ++---- .../GameClientState/LevelLoader/LevelLoader.h | 2 +- .../GameClientState/LevelLoader/LevelParser.h | 2 +- .../GameClientState/LevelLoader/Loader.h | 2 +- .../GameClientState/NetLoadState.cpp | 2 ++ 8 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Code/Game/GameClient/DanBiasGame_Impl.cpp b/Code/Game/GameClient/DanBiasGame_Impl.cpp index 244568c2..392e917f 100644 --- a/Code/Game/GameClient/DanBiasGame_Impl.cpp +++ b/Code/Game/GameClient/DanBiasGame_Impl.cpp @@ -18,7 +18,7 @@ #include "WinTimer.h" #include "vld.h" -#include "../Misc/EventHandler/EventHandler.h" +#include "EventHandler/EventHandler.h" #include "GameClientState\SharedStateContent.h" diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index 0691fef1..a87f61e4 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -111,7 +111,7 @@ Windows true - Misc\Misc_$(PlatformShortName)D.lib;WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) + %(AdditionalDependencies) NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -128,7 +128,7 @@ Windows true - Misc\Misc_$(PlatformShortName)D.lib;WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) + %(AdditionalDependencies) NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -149,7 +149,7 @@ true true true - Misc\Misc_$(PlatformShortName).lib;WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) + %(AdditionalDependencies) NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) @@ -170,14 +170,23 @@ true true true - Misc\Misc_$(PlatformShortName).lib;WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) + %(AdditionalDependencies) NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) + + {7e3990d2-3d94-465c-b58d-64a74b3ecf9b} + {f10cbc03-9809-4cba-95d8-327c287b18ee} + + {2ec4dded-8f75-4c86-a10b-e1e8eb29f3ee} + + + {35aea3c0-e0a7-4e1e-88cd-514aa5a442b1} + {460d625f-2ac9-4559-b809-0ba89ceaedf4} @@ -233,6 +242,7 @@ + diff --git a/Code/Game/GameClient/GameClient.vcxproj.user b/Code/Game/GameClient/GameClient.vcxproj.user index 2e28d6f7..4b847ee6 100644 --- a/Code/Game/GameClient/GameClient.vcxproj.user +++ b/Code/Game/GameClient/GameClient.vcxproj.user @@ -1,7 +1,7 @@  - true + false $(OutDir) diff --git a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h index d4981c23..04af2e5a 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h +++ b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h @@ -5,10 +5,8 @@ #ifndef DANBIAS_CLIENT_EVENT_BUTTON_GUI_H #define DANBIAS_CLIENT_EVENT_BUTTON_GUI_H -#include "../Misc/EventHandler/EventButton.h" -#include "../OysterGraphics/DllInterfaces/GFXAPI.h" - - +#include "EventHandler/EventButton.h" +#include "DllInterfaces/GFXAPI.h" namespace DanBias { diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h b/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h index 184a7005..aa67c4f5 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h @@ -7,7 +7,7 @@ #include #include -#include "../Misc/Utilities.h" +#include "Utilities.h" #include "ObjectDefines.h" namespace GameLogic diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h index 346b75b5..8f2a9150 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h @@ -4,7 +4,7 @@ #include #include #include "ObjectDefines.h" -#include "../Misc/Utilities.h" +#include "Utilities.h" namespace GameLogic { diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h b/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h index 198c2a87..0433194e 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h +++ b/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h @@ -5,7 +5,7 @@ #ifndef LOADER_H #define LOADER_H -#include "..\Misc\Resource\OysterResource.h" +#include "Resource\OysterResource.h" #include namespace GameLogic diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index ac7dd78b..3463182e 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -1,9 +1,11 @@ #include "NetLoadState.h" #include "NetworkClient.h" +#include "OysterMath.h" #include "../Game/GameProtocols/Protocols.h" using namespace ::DanBias::Client; using namespace ::Oyster; +using namespace ::Oyster::Math; using namespace ::Oyster::Network; using namespace ::GameLogic; From e815f57238e681a3ec3f1194e6f9e213212eb775 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 12:02:18 +0100 Subject: [PATCH 03/46] minor edit --- Code/Game/GameClient/GameClientState/GameState.cpp | 4 ++++ Code/Game/GameClient/GameClientState/SharedStateContent.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 349eaaeb..1691a470 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -16,6 +16,10 @@ struct GameState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; InputClass *input; + + ::std::map> *staticObjects; + ::std::map> *dynamicObjects; + } privData; GameState::GameState() diff --git a/Code/Game/GameClient/GameClientState/SharedStateContent.h b/Code/Game/GameClient/GameClientState/SharedStateContent.h index 567be2fa..2fabb1ac 100644 --- a/Code/Game/GameClient/GameClientState/SharedStateContent.h +++ b/Code/Game/GameClient/GameClientState/SharedStateContent.h @@ -19,7 +19,8 @@ namespace DanBias { namespace Client struct SharedStateContent { public: - ::std::map> scene; + ::std::map> staticObjects; + ::std::map> dynamicObjects; ::Oyster::Network::NetworkClient *network; InputClass* input; }; From 0cb569fdb744faa693c0870ce13157b12da04020 Mon Sep 17 00:00:00 2001 From: lanariel Date: Mon, 17 Feb 2014 13:05:35 +0100 Subject: [PATCH 04/46] Color is now Float4 with RGBA --- .../GameClientState/Buttons/ButtonEllipse.h | 8 ++++---- .../GameClientState/Buttons/ButtonRectangle.h | 8 ++++---- .../GameClientState/Buttons/EventButtonGUI.h | 14 +++++++------- .../GameClient/GameClientState/Buttons/TextField.h | 4 ++-- .../GameClient/GameClientState/LanMenuState.cpp | 6 +++--- .../GameClient/GameClientState/LobbyAdminState.cpp | 2 +- .../Game/GameClient/GameClientState/LobbyState.cpp | 2 +- Code/Game/GameClient/GameClientState/MainState.cpp | 6 +++--- Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 4 ++-- Code/OysterGraphics/DllInterfaces/GFXAPI.h | 4 ++-- Code/OysterGraphics/Render/GuiRenderer.cpp | 8 ++++---- Code/OysterGraphics/Render/GuiRenderer.h | 4 ++-- Code/OysterGraphics/Shader/Passes/2D/2DPixel.hlsl | 2 +- Code/OysterGraphics/Shader/Passes/2D/Header.hlsli | 2 +- 14 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/Buttons/ButtonEllipse.h b/Code/Game/GameClient/GameClientState/Buttons/ButtonEllipse.h index 694683e7..7d9a9a5d 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/ButtonEllipse.h +++ b/Code/Game/GameClient/GameClientState/Buttons/ButtonEllipse.h @@ -21,19 +21,19 @@ namespace DanBias ButtonEllipse() : EventButtonGUI(), radius(0) {} - ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, + ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, owner, pos, size, resize) {} - ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Oyster::Math::Float3 pos, + ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, pos, size, resize) {} - ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, + ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, owner, pos, size, resize) {} - ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, + ButtonEllipse(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, owner, userData, pos, size, resize) {} diff --git a/Code/Game/GameClient/GameClientState/Buttons/ButtonRectangle.h b/Code/Game/GameClient/GameClientState/Buttons/ButtonRectangle.h index 6afb77c1..f4dd69e1 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/ButtonRectangle.h +++ b/Code/Game/GameClient/GameClientState/Buttons/ButtonRectangle.h @@ -21,19 +21,19 @@ namespace DanBias ButtonRectangle() : EventButtonGUI(), width(0), height(0) {} - ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, + ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, owner, pos, size, resize) {} - ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Oyster::Math::Float3 pos, + ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, pos, size, resize) {} - ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, + ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, owner, pos, size, resize) {} - ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, + ButtonRectangle(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButtonGUI(textureName, buttonText, textColor, func, owner, userData, pos, size, resize) {} diff --git a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h index 04af2e5a..c6b54a7e 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h +++ b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h @@ -31,30 +31,30 @@ namespace DanBias { public: EventButtonGUI() - : EventButton(), pos(0, 0), size(0, 0), texture(NULL), buttonText(""), textColor(0, 0, 0) + : EventButton(), pos(0, 0), size(0, 0), texture(NULL), buttonText(""), textColor(1, 1, 1, 1) {} - EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, + EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButton(owner), pos(pos), size(size), texture(NULL), buttonText(buttonText), textColor(textColor) { CreateTexture(textureName); if(resize != ResizeAspectRatio_None) ResizeWithAspectRatio(resize); } - EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Oyster::Math::Float3 pos, + EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButton(func), pos(pos), size(size), texture(NULL), buttonText(buttonText), textColor(textColor) { CreateTexture(textureName); if(resize != ResizeAspectRatio_None) ResizeWithAspectRatio(resize); } - EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, + EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButton(func, owner), pos(pos), size(size), texture(NULL), buttonText(buttonText), textColor(textColor) { CreateTexture(textureName); if(resize != ResizeAspectRatio_None) ResizeWithAspectRatio(resize); } - EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float3 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) + EventButtonGUI(std::wstring textureName, std::wstring buttonText, Oyster::Math::Float4 textColor, EventFunc func, Owner owner, void* userData, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height) : EventButton(func, owner, userData), pos(pos), size(size), texture(NULL), buttonText(buttonText), textColor(textColor) { CreateTexture(textureName); @@ -77,7 +77,7 @@ namespace DanBias if(EventButton::Enabled()) { // let the using dev decide what is rendered - Oyster::Graphics::API::RenderGuiElement(texture, pos, size, Oyster::Math::Float3(1.0f, 1.0f, 1.0f)); + Oyster::Graphics::API::RenderGuiElement(texture, pos, size, Oyster::Math::Float4(1.0f, 1.0f, 1.0f, 1.0f)); //Render att xPos and yPos //With width and height @@ -125,7 +125,7 @@ namespace DanBias Oyster::Graphics::API::Texture texture; std::wstring buttonText; - Oyster::Math::Float3 textColor; + Oyster::Math::Float4 textColor; }; } } diff --git a/Code/Game/GameClient/GameClientState/Buttons/TextField.h b/Code/Game/GameClient/GameClientState/Buttons/TextField.h index af9c4346..c1fa79ac 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/TextField.h +++ b/Code/Game/GameClient/GameClientState/Buttons/TextField.h @@ -20,7 +20,7 @@ namespace DanBias { namespace Client { public: TextField(); - TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height ); + TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float4 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize = ResizeAspectRatio_Height ); virtual ~TextField(); virtual void RenderText(); @@ -62,7 +62,7 @@ namespace DanBias { namespace Client } template - TextField::TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize ) + TextField::TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float4 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize ) : ButtonRectangle( backgroundTexture, L"", textColor, owner, pos, size, resize ) { this->fontHeight = 0.025f; diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 7faf5d55..3051c097 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -58,7 +58,7 @@ bool LanMenuState::Init( SharedStateContent &shared ) this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); // create guiElements - this->privData->connectIP = new TextField( L"earth_md.png", Float3(1.0f), this, Float3(0.5f, 0.3f, 0.5f), Float2(0.8f, 0.09f), ResizeAspectRatio_None ); + this->privData->connectIP = new TextField( L"earth_md.png", Float4(1.0f), this, Float3(0.5f, 0.3f, 0.5f), Float2(0.8f, 0.09f), ResizeAspectRatio_None ); this->privData->connectIP->ReserveLines( 1 ); this->privData->connectIP->AppendText( L"127.0.0.1" ); this->privData->connectIP->SetFontHeight( 0.08f ); @@ -68,10 +68,10 @@ bool LanMenuState::Init( SharedStateContent &shared ) this->privData->guiElements.AddButton( this->privData->connectIP ); ButtonRectangle *guiElements; - guiElements = new ButtonRectangle( L"earth_md.png", L"Connect", Float3(1.0f), OnButtonInteract_Connect, this, Float3(0.5f, 0.4f, 0.5f), Float2(0.3f, 0.05f), ResizeAspectRatio_None ); + guiElements = new ButtonRectangle( L"earth_md.png", L"Connect", Float4(1.0f), OnButtonInteract_Connect, this, Float3(0.5f, 0.4f, 0.5f), Float2(0.3f, 0.05f), ResizeAspectRatio_None ); this->privData->guiElements.AddButton( guiElements ); - guiElements = new ButtonRectangle( L"earth_md.png", L"Exit", Float3(1.0f), OnButtonInteract_Exit, this, Float3(0.5f, 0.5f, 0.5f), Float2(0.3f, 0.05f), ResizeAspectRatio_None ); + guiElements = new ButtonRectangle( L"earth_md.png", L"Exit", Float4(1.0f), OnButtonInteract_Exit, this, Float3(0.5f, 0.5f, 0.5f), Float2(0.3f, 0.05f), ResizeAspectRatio_None ); this->privData->guiElements.AddButton( guiElements ); // bind guiElements collection to the singleton eventhandler diff --git a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp index 6cc1f15f..b05e90dc 100644 --- a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp @@ -50,7 +50,7 @@ bool LobbyAdminState::Init( SharedStateContent &shared ) // create buttons ButtonRectangle *button; - button = new ButtonRectangle( L"earth_md.png", L"Ready", Float3(1.0f), OnButtonInteract_Ready, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); + button = new ButtonRectangle( L"earth_md.png", L"Ready", Float4(1.0f), OnButtonInteract_Ready, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); this->privData->guiElements.AddButton( button ); // bind button collection to the singleton eventhandler diff --git a/Code/Game/GameClient/GameClientState/LobbyState.cpp b/Code/Game/GameClient/GameClientState/LobbyState.cpp index 6c5b2606..23b27e3f 100644 --- a/Code/Game/GameClient/GameClientState/LobbyState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyState.cpp @@ -50,7 +50,7 @@ bool LobbyState::Init( SharedStateContent &shared ) // create buttons ButtonRectangle *button; - button = new ButtonRectangle( L"earth_md.png", L"Ready", Float3(1.0f), OnButtonInteract_Ready, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); + button = new ButtonRectangle( L"earth_md.png", L"Ready", Float4(1.0f), OnButtonInteract_Ready, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); this->privData->guiElements.AddButton( button ); // bind button collection to the singleton eventhandler diff --git a/Code/Game/GameClient/GameClientState/MainState.cpp b/Code/Game/GameClient/GameClientState/MainState.cpp index 1fd1d813..d71b050e 100644 --- a/Code/Game/GameClient/GameClientState/MainState.cpp +++ b/Code/Game/GameClient/GameClientState/MainState.cpp @@ -54,13 +54,13 @@ bool MainState::Init( SharedStateContent &shared ) // create buttons ButtonRectangle *button; - button = new ButtonRectangle( L"earth_md.png", L"Create", Float3(1.0f), OnButtonInteract_Create, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); + button = new ButtonRectangle( L"earth_md.png", L"Create", Float4(1.0f), OnButtonInteract_Create, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); this->privData->guiElements.AddButton( button ); - button = new ButtonRectangle( L"skysphere_md.png", L"Join", Float3(1.0f), OnButtonInteract_Join, this, Float3(0.5f, 0.4f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); + button = new ButtonRectangle( L"skysphere_md.png", L"Join", Float4(1.0f), OnButtonInteract_Join, this, Float3(0.5f, 0.4f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); this->privData->guiElements.AddButton( button ); - button = new ButtonRectangle( L"plane_texture_md.png", L"Quit", Float3(1.0f), OnButtonInteract_Quit, this, Float3(0.5f, 0.8f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); + button = new ButtonRectangle( L"plane_texture_md.png", L"Quit", Float4(1.0f), OnButtonInteract_Quit, this, Float3(0.5f, 0.8f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); this->privData->guiElements.AddButton( button ); // bind button collection to the singleton eventhandler diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index f3bd12fd..f4ce303f 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -161,7 +161,7 @@ namespace Oyster Render::Gui::Begin2DRender(); } - void API::RenderGuiElement(API::Texture tex, Math::Float3 pos, Math::Float2 size, Math::Float3 color) + void API::RenderGuiElement(API::Texture tex, Math::Float3 pos, Math::Float2 size, Math::Float4 color) { Render::Gui::Render((ID3D11ShaderResourceView*)tex,pos,size,color); } @@ -196,7 +196,7 @@ namespace Oyster Render::Gui::Begin2DTextRender(); } - void API::RenderText(std::wstring text, Math::Float3 Pos, Math::Float2 Size, float FontSize, Math::Float3 color) + void API::RenderText(std::wstring text, Math::Float3 Pos, Math::Float2 Size, float FontSize, Math::Float4 color) { Render::Gui::RenderText(text, Pos, Size, FontSize, color); } diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.h b/Code/OysterGraphics/DllInterfaces/GFXAPI.h index e2cea318..eea53939 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.h +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.h @@ -57,13 +57,13 @@ namespace Oyster static void StartGuiRender(); //! @brief Renders a single GUI element using the texture provided and the Pos in the center, %based system - static void RenderGuiElement(Texture, Math::Float3 Pos, Math::Float2 Size, Math::Float3 Color = Math::Float3(1,1,1)); + static void RenderGuiElement(Texture, Math::Float3 Pos, Math::Float2 Size, Math::Float4 Color = Math::Float4(1,1,1,1)); //! @brief Configures Renderer to process 2D Text, data will be passed in to EndFrame() static void StartTextRender(); //! @brief Renders a single GUI string using the texture provided and the Pos in the center, %based system - static void RenderText(std::wstring, Math::Float3 Pos, Math::Float2 Size, float FontSize, Math::Float3 Color = Math::Float3(1,1,1)); + static void RenderText(std::wstring, Math::Float3 Pos, Math::Float2 Size, float FontSize, Math::Float4 Color = Math::Float4(1,1,1,1)); //! @brief Performs light calculations, post effects and presents the scene static void EndFrame(); diff --git a/Code/OysterGraphics/Render/GuiRenderer.cpp b/Code/OysterGraphics/Render/GuiRenderer.cpp index 8eda0bf5..b17fdfef 100644 --- a/Code/OysterGraphics/Render/GuiRenderer.cpp +++ b/Code/OysterGraphics/Render/GuiRenderer.cpp @@ -16,7 +16,7 @@ namespace Oyster Core::PipelineManager::SetRenderPass(Render::Resources::Gui::Pass); } - void Gui::Render(ID3D11ShaderResourceView* tex,Math::Float3 pos, Math::Float2 size, Math::Float3 color) + void Gui::Render(ID3D11ShaderResourceView* tex,Math::Float3 pos, Math::Float2 size, Math::Float4 color) { Core::deviceContext->PSSetShaderResources(0,1,&tex); @@ -37,7 +37,7 @@ namespace Oyster Render::Resources::Gui::Data.Unmap(); data = Render::Resources::Color.Map(); - memcpy(data,&color,sizeof(Math::Float3)); + memcpy(data,&color,sizeof(Math::Float4)); Render::Resources::Color.Unmap(); @@ -50,7 +50,7 @@ namespace Oyster Core::PipelineManager::SetRenderPass(Resources::Gui::Text::Pass); } - void Gui::RenderText(std::wstring text, Math::Float3 pos, Math::Float2 size, float FontSize, Math::Float3 color) + void Gui::RenderText(std::wstring text, Math::Float3 pos, Math::Float2 size, float FontSize, Math::Float4 color) { //size.x = size.x / (text.length() * TEXT_SPACING /2); @@ -81,7 +81,7 @@ namespace Oyster Definitions::Text2D tmpInst; data = Render::Resources::Color.Map(); - memcpy(data,&color,sizeof(Math::Float3)); + memcpy(data,&color,sizeof(Math::Float4)); Render::Resources::Color.Unmap(); void* dest = Resources::Gui::Text::Vertex.Map(); diff --git a/Code/OysterGraphics/Render/GuiRenderer.h b/Code/OysterGraphics/Render/GuiRenderer.h index 3e4a8de0..64d6fdd3 100644 --- a/Code/OysterGraphics/Render/GuiRenderer.h +++ b/Code/OysterGraphics/Render/GuiRenderer.h @@ -12,9 +12,9 @@ namespace Oyster { public: static void Begin2DRender(); - static void Render(ID3D11ShaderResourceView* tex, Math::Float3 pos, Math::Float2 size, Math::Float3 tint = Math::Float3(1,1,1)); + static void Render(ID3D11ShaderResourceView* tex, Math::Float3 pos, Math::Float2 size, Math::Float4 tint = Math::Float4(1,1,1,1)); static void Begin2DTextRender(); - static void RenderText(std::wstring text, Math::Float3 pos, Math::Float2 size, float FontSize, Math::Float3 tint = Math::Float3(1,1,1)); + static void RenderText(std::wstring text, Math::Float3 pos, Math::Float2 size, float FontSize, Math::Float4 tint = Math::Float4(1,1,1,1)); }; } } diff --git a/Code/OysterGraphics/Shader/Passes/2D/2DPixel.hlsl b/Code/OysterGraphics/Shader/Passes/2D/2DPixel.hlsl index c28fd642..0c8d3c68 100644 --- a/Code/OysterGraphics/Shader/Passes/2D/2DPixel.hlsl +++ b/Code/OysterGraphics/Shader/Passes/2D/2DPixel.hlsl @@ -2,5 +2,5 @@ float4 main(Pixel2DIn input) : SV_Target0 { - return Material.Sample(LinearSampler,input.Uv) * float4(Color,1); + return Material.Sample(LinearSampler,input.Uv) * Color; } \ No newline at end of file diff --git a/Code/OysterGraphics/Shader/Passes/2D/Header.hlsli b/Code/OysterGraphics/Shader/Passes/2D/Header.hlsli index 4b507644..f84483f5 100644 --- a/Code/OysterGraphics/Shader/Passes/2D/Header.hlsli +++ b/Code/OysterGraphics/Shader/Passes/2D/Header.hlsli @@ -10,7 +10,7 @@ cbuffer EveryObject2D : register(b0) cbuffer ColorData : register(b0) { - float3 Color; + float4 Color; }; struct Pixel2DIn From b0aea19b8a664207c78a09a8868c887defcfd4c8 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 14:33:11 +0100 Subject: [PATCH 05/46] Bunch of implementations --- .../GameClient/GameClientState/GameState.cpp | 413 ++++++------------ .../GameClient/GameClientState/GameState.h | 29 +- .../GameClientState/LanMenuState.cpp | 4 +- .../GameClientState/NetLoadState.cpp | 89 +++- .../GameClientState/SharedStateContent.h | 6 +- 5 files changed, 234 insertions(+), 307 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 1691a470..29cfec03 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -5,10 +5,16 @@ #include "Camera_FPS.h" #include +#include "C_obj/C_Player.h" +#include "C_obj/C_DynamicObj.h" +#include "C_obj/C_StaticObj.h" + using namespace ::DanBias::Client; using namespace ::Oyster; using namespace ::Oyster::Network; using namespace ::Oyster::Math3D; +using namespace ::GameLogic; +using namespace ::Utility::DynamicMemory; struct GameState::MyData { @@ -17,17 +23,26 @@ struct GameState::MyData NetworkClient *nwClient; InputClass *input; - ::std::map> *staticObjects; - ::std::map> *dynamicObjects; + ::std::map> *staticObjects; + ::std::map> *dynamicObjects; + + bool key_forward; + bool key_backward; + bool key_strafeRight; + bool key_strafeLeft; + bool key_Shoot; + bool key_Jump; + + C_Player player; + Camera_FPS camera; + + int myId; } privData; GameState::GameState() { - key_forward = false; - key_backward = false; - key_strafeRight = false; - key_strafeLeft = false; + this->privData = nullptr; } GameState::~GameState() @@ -38,202 +53,69 @@ GameState::~GameState() bool GameState::Init( SharedStateContent &shared ) { - // load models - privData = new MyData(); + // we may assume that shared.network is properly connected + // and there is content in shared.dynamicObjects and shared.staticObjects + + this->privData = new MyData(); + + this->privData->key_forward = false; + this->privData->key_backward = false; + this->privData->key_strafeRight = false; + this->privData->key_strafeLeft = false; this->privData->nextState = GameClientState::ClientState_Same; this->privData->nwClient = shared.network; this->privData->input = shared.input; - - LoadGame(); + this->privData->staticObjects = &shared.staticObjects; + this->privData->dynamicObjects = &shared.dynamicObjects; //tell server ready - this->privData->nwClient->Send( GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready) ); + this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); return true; } -GameState::gameStateState GameState::LoadGame() +void GameState::InitiatePlayer( int id, std::wstring modelName, Float4x4 world ) { - - return gameStateState_playing; -} - -bool GameState::LoadModels(std::string mapFile) -{ - GameLogic::LevelLoader levelLoader; - std::vector> objects; - objects = levelLoader.LoadLevel(mapFile); - - int objCount = objects.size(); - int modelId = 0; - ModelInitData modelData; - for (int i = 0; i < objCount; i++) - { - GameLogic::ObjectTypeHeader* obj = objects.at(i); - - switch (obj->typeID) - { - case GameLogic::ObjectType::ObjectType_LevelMetaData: - - break; - case GameLogic::ObjectType::ObjectType_Static: - { - GameLogic::ObjectHeader* staticObjData = ((GameLogic::ObjectHeader*)obj); - - modelData.modelPath.assign(staticObjData->ModelFile.begin(), staticObjData->ModelFile.end()); - modelData.visible = true; - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - modelData.id = modelId++; - - this->staticObjects.Push(new C_StaticObj()); - this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData); - } - break; - case GameLogic::ObjectType::ObjectType_Dynamic: - { - GameLogic::ObjectHeader* dynamicObjData = ((GameLogic::ObjectHeader*)obj); - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - modelData.modelPath.assign(dynamicObjData->ModelFile.begin(), dynamicObjData->ModelFile.end()); - modelData.visible = true; - modelData.id = modelId++; - - this->dynamicObjects.Push(new C_DynamicObj()); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); - } - break; - case GameLogic::ObjectType::ObjectType_Light: - { - GameLogic::BasicLight* lightData = ((GameLogic::BasicLight*)obj); - - switch( lightData->lightType ) - { - case GameLogic::LightType_PointLight: - { - //Oyster::Graphics::Definitions::Pointlight plight; - //plight.Pos = ((GameLogic::PointLight*)lightData)->position; - //plight.Color = lightData->diffuseColor; - //plight.Radius = 100; - //plight.Bright = 0.9f; - //Oyster::Graphics::API::AddLight(plight); - } - break; - default: break; - } - } - break; - default: - break; - } - } - myId += modelId++; - // add player model - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - - - modelData.visible = true; - modelData.modelPath = L"char_still_sizeref.dan"; - modelData.id = myId; - // load models - this->dynamicObjects.Push(new C_DynamicObj()); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); - - /*C_Player* obj = new C_Player(); - privData->object.push_back(obj); - privData->object[privData->object.size() -1 ]->Init(modelData); - */ - return true; - -} - -bool GameState::InitCamera(Float3 startPos) -{ - camera.SetHeadOffset( Float3(0.0f, 1.0f, 1.0f) ); - camera.SetPerspectiveProjection( pi / 4.0f, 1024.0f/768.0f, 1.0f, 1000.0f ); - camera.UpdateOrientation(); - Oyster::Graphics::API::SetProjection(camera.GetProjectionMatrix()); - - return true; -} - -void GameState::InitiatePlayer(int id, std::wstring modelName, Float4x4 world) -{ - myId = id; + this->privData->myId = id; ModelInitData modelData; - C_Object* obj; modelData.visible = true; - //modelData.world = world; modelData.position = Float3(world[12], world[13], world[14]); modelData.rotation = Quaternion(Float3(0,0,0), 1); modelData.scale = Float3(1,1,1); modelData.modelPath = modelName; - modelData.id = myId; - - obj = new C_Player(); - this->dynamicObjects.Push(obj); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); + modelData.id = this->privData->myId; + this->privData->player.Init( modelData ); - Float3 pos = Float3(world[12], world[13], world[14]); - - camera.SetPosition( pos ); - camera.UpdateOrientation(); + this->privData->camera.SetPosition( this->privData->player.getPos() ); + this->privData->camera.UpdateOrientation(); } GameClientState::ClientState GameState::Update( float deltaTime ) { - //switch (privData->state) - //{ - //case gameStateState_loading: //Will this ever happen in this scope?? - // { - // // load map - // // wait for all players - // LoadGame(); - // GameLogic::Protocol_General_Status gameStatus; - // gameStatus.status = GameLogic::Protocol_General_Status::States_ready; - // privData->nwClient->Send(gameStatus); - // privData->state = gameStateState_playing; - // } - // break; - //case gameStateState_playing: - // // read server data - // // update objects - // { - // readKeyInput(KeyInput); - // camera.UpdateOrientation(); - // } - // break; - //case gameStateState_end: - // return ClientState_Lobby; - // break; - //default: - // break; - //} - // - //// send key input to server. - //return ClientState_Same; - return this->privData->nextState; } bool GameState::Render() { - Oyster::Graphics::API::SetView( camera.GetViewMatrix() ); + Oyster::Graphics::API::SetView( this->privData->camera.GetViewMatrix() ); Oyster::Graphics::API::NewFrame(); - for (unsigned int i = 0; i < staticObjects.Size(); i++) + + // for debugging to be replaced with render weapon + this->privData->player.Render(); + + auto staticObject = this->privData->staticObjects->begin(); + for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) { - staticObjects[i]->Render(); + staticObject->second->Render(); } - for (unsigned int i = 0; i < dynamicObjects.Size(); i++) + + auto dynamicObject = this->privData->dynamicObjects->begin(); + for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) { - dynamicObjects[i]->Render(); + dynamicObject->second->Render(); } Oyster::Graphics::API::EndFrame(); @@ -242,8 +124,25 @@ bool GameState::Render() bool GameState::Release() { + if( privData ) + { + auto staticObject = this->privData->staticObjects->begin(); + for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) + { + staticObject->second = nullptr; + } - privData = NULL; + auto dynamicObject = this->privData->dynamicObjects->begin(); + for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) + { + dynamicObject->second = nullptr; + } + + this->privData->staticObjects->clear(); + this->privData->dynamicObjects->clear(); + + privData = NULL; + } return true; } @@ -252,138 +151,119 @@ void GameState::ChangeState( ClientState next ) this->privData->nextState = next; } -void GameState::readKeyInput(InputClass* KeyInput) +void GameState::ReadKeyInput() { - if(KeyInput->IsKeyPressed(DIK_W)) + if( this->privData->input->IsKeyPressed(DIK_W) ) { - if(!key_forward) + if(!this->privData->key_forward) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementForward()); - key_forward = true; + this->privData->nwClient->Send( Protocol_PlayerMovementForward() ); + this->privData->key_forward = true; } } else - key_forward = false; + this->privData->key_forward = false; - if(KeyInput->IsKeyPressed(DIK_S)) + if( this->privData->input->IsKeyPressed(DIK_S) ) { - if(!key_backward) + if( !this->privData->key_backward ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementBackward()); - key_backward = true; + this->privData->nwClient->Send( Protocol_PlayerMovementBackward() ); + this->privData->key_backward = true; } } else - key_backward = false; + this->privData->key_backward = false; - if(KeyInput->IsKeyPressed(DIK_A)) + if( this->privData->input->IsKeyPressed(DIK_A) ) { - if(!key_strafeLeft) + if( !this->privData->key_strafeLeft ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementLeft()); - key_strafeLeft = true; + this->privData->nwClient->Send( Protocol_PlayerMovementLeft() ); + this->privData->key_strafeLeft = true; } } else - key_strafeLeft = false; + this->privData->key_strafeLeft = false; - if(KeyInput->IsKeyPressed(DIK_D)) + if( this->privData->input->IsKeyPressed(DIK_D) ) { - if(!key_strafeRight) + if( !this->privData->key_strafeRight ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementRight()); - key_strafeRight = true; + this->privData->nwClient->Send( Protocol_PlayerMovementRight() ); + this->privData->key_strafeRight = true; } } else - key_strafeRight = false; + this->privData->key_strafeRight = false; //send delta mouse movement - //if (KeyInput->IsMousePressed()) { - camera.YawRight( -KeyInput->GetYaw() ); - camera.PitchUp( KeyInput->GetPitch() ); - camera.UpdateOrientation(); + this->privData->camera.YawRight( -this->privData->input->GetYaw() ); + this->privData->camera.PitchUp( this->privData->input->GetPitch() ); + this->privData->camera.UpdateOrientation(); - GameLogic::Protocol_PlayerLook playerLookDir; - Float4 look = camera.GetLook(); - - privData->nwClient->Send( playerLookDir ); + privData->nwClient->Send( Protocol_PlayerLook(this->privData->camera.GetLook(), this->privData->camera.GetRight()) ); } // shoot - if(KeyInput->IsKeyPressed(DIK_Z)) + if( this->privData->input->IsKeyPressed(DIK_Z) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = true; playerShot.secondaryPressed = false; playerShot.utilityPressed = false; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; - if(KeyInput->IsKeyPressed(DIK_X)) + this->privData->key_Shoot = false; + if( this->privData->input->IsKeyPressed(DIK_X) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = false; playerShot.secondaryPressed = true; playerShot.utilityPressed = false; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; - if(KeyInput->IsKeyPressed(DIK_C)) + this->privData->key_Shoot = false; + if( this->privData->input->IsKeyPressed(DIK_C) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = false; playerShot.secondaryPressed = false; playerShot.utilityPressed = true; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; + this->privData->key_Shoot = false; // jump - if(KeyInput->IsKeyPressed(DIK_SPACE)) + if( this->privData->input->IsKeyPressed(DIK_SPACE) ) { - if(!key_Jump) + if(!this->privData->key_Jump) { - privData->nwClient->Send(GameLogic::Protocol_PlayerJump()); - key_Jump = true; + this->privData->nwClient->Send( Protocol_PlayerJump() ); + this->privData->key_Jump = true; } } else - key_Jump = false; + this->privData->key_Jump = false; - // send event data - // - //if(KeyInput->IsKeyPressed(DIK_L)) - // privData->state = GameState::gameStateState_end; -} - -using namespace ::Oyster::Network; -using namespace ::Utility::DynamicMemory; - -// returns -1 if none found -int FindObject( const DynamicArray> &collection, int id ) -{ - int num = collection.Size(); - for( int i = 0; i < num; ++i ) if( id == collection[i]->GetId() ) - return i; - return -1; + // TODO: implement sub-menu } void GameState::DataRecieved( NetEvent e ) @@ -400,76 +280,67 @@ void GameState::DataRecieved( NetEventmyId == decoded.object_ID ) - camera.SetPosition( decoded.position ); + if( this->privData->myId == decoded.object_ID ) + this->privData->camera.SetPosition( decoded.position ); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setPos( decoded.position ); + (*this->privData->dynamicObjects)[decoded.object_ID]->setPos( decoded.position ); } break; case protocol_Gameplay_ObjectScale: { - GameLogic::Protocol_ObjectScale decoded(data); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setScale( decoded.scale ); + Protocol_ObjectScale decoded(data); + (*this->privData->dynamicObjects)[decoded.object_ID]->setScale( decoded.scale ); } break; case protocol_Gameplay_ObjectRotation: { - GameLogic::Protocol_ObjectRotation decoded(data); + Protocol_ObjectRotation decoded(data); Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); // if is this player. Remember to change camera - if( this->myId == decoded.object_ID ) - camera.SetAngular( AngularAxis(rotation) ); + if( this->privData->myId == decoded.object_ID ) + this->privData->camera.SetAngular( AngularAxis(rotation) ); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setRot( rotation ); + (*this->privData->dynamicObjects)[decoded.object_ID]->setRot( rotation ); } break; case protocol_Gameplay_ObjectPositionRotation: { - GameLogic::Protocol_ObjectPositionRotation decoded(data); + Protocol_ObjectPositionRotation decoded(data); Float3 position = decoded.position; Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); // if is this player. Remember to change camera - if( this->myId == decoded.object_ID ) + if( this->privData->myId == decoded.object_ID ) { - camera.SetPosition( position ); - camera.SetAngular( AngularAxis(rotation) ); + this->privData->camera.SetPosition( position ); + this->privData->camera.SetAngular( AngularAxis(rotation) ); } - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - { - this->dynamicObjects[i]->setPos( position ); - this->dynamicObjects[i]->setRot( rotation ); - } + C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object->setPos( position ); + object->setRot( rotation ); } break; case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectDisabled: { - GameLogic::Protocol_ObjectDisable decoded(data); + Protocol_ObjectDisable decoded(data); - int i = FindObject( this->dynamicObjects, decoded.objectID ); - if( i > -1 ) + auto object = this->privData->dynamicObjects->find( decoded.objectID ); + if( object != this->privData->dynamicObjects->end() ) { - this->dynamicObjects[i].Release(); - this->dynamicObjects.Pop(i); + object->second = nullptr; + this->privData->dynamicObjects->erase( object ); } } break; case protocol_Gameplay_ObjectCreate: { - GameLogic::Protocol_ObjectCreate decoded(data); + Protocol_ObjectCreate decoded(data); C_DynamicObj* object = new C_DynamicObj(); ModelInitData modelData; @@ -484,7 +355,7 @@ void GameState::DataRecieved( NetEventInit(modelData); - dynamicObjects.Push(object); + (*this->privData->dynamicObjects)[decoded.object_ID] = object; } break; diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 5a3b3c1a..29ea2f1e 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -4,13 +4,6 @@ #include "OysterMath.h" #include -#include "Camera_FPS.h" -#include "LevelLoader/LevelLoader.h" -#include "C_obj/C_Player.h" -#include "C_obj/C_DynamicObj.h" -#include "C_obj/C_StaticObj.h" -#include "DynamicArray.h" - namespace DanBias { namespace Client { class GameState : public GameClientState @@ -27,12 +20,8 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - - bool LoadModels(std::string mapFile); - bool InitCamera(Oyster::Math::Float3 startPos) ; - void InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Float4x4 world); - gameStateState LoadGame(); - void readKeyInput(InputClass* KeyInput); + void InitiatePlayer( int id, std::wstring modelName, Oyster::Math::Float4x4 world ); + void ReadKeyInput(); bool Render()override; bool Release()override; @@ -43,20 +32,6 @@ namespace DanBias { namespace Client private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; - - bool key_forward; - bool key_backward; - bool key_strafeRight; - bool key_strafeLeft; - bool key_Shoot; - bool key_Jump; - Camera_FPS camera; - - int myId; - - Utility::DynamicMemory::DynamicArray> staticObjects; - Utility::DynamicMemory::DynamicArray> dynamicObjects; - //Utility::DynamicMemory::DynamicArray> playObjects; }; } } #endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 3051c097..0615f209 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -123,8 +123,8 @@ void LanMenuState::ChangeState( ClientState next ) { case GameClientState::ClientState_Lobby: // attempt to connect to lobby - //if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) - // return; // TODO: temporary commented out + if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) + return; break; default: break; } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 3463182e..8274472d 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -1,13 +1,18 @@ #include "NetLoadState.h" #include "NetworkClient.h" #include "OysterMath.h" -#include "../Game/GameProtocols/Protocols.h" +#include "Protocols.h" +#include "LevelLoader\LevelLoader.h" +#include "Utilities.h" +#include "C_obj\C_StaticObj.h" +#include "C_obj\C_DynamicObj.h" using namespace ::DanBias::Client; using namespace ::Oyster; using namespace ::Oyster::Math; using namespace ::Oyster::Network; using namespace ::GameLogic; +using namespace ::Utility::String; struct NetLoadState::MyData { @@ -16,9 +21,17 @@ struct NetLoadState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; Graphics::API::Texture background; + ::std::map> *staticObjects; + ::std::map> *dynamicObjects; + bool loading; }; +inline Quaternion ArrayToQuaternion( float source[4] ) +{ + return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); +} + NetLoadState::NetLoadState(void) {} NetLoadState::~NetLoadState(void) @@ -31,9 +44,12 @@ bool NetLoadState::Init( SharedStateContent &shared ) { this->privData = new MyData(); - this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = shared.network; - this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); + this->privData->nextState = GameClientState::ClientState_Same; + this->privData->nwClient = shared.network; + this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); + this->privData->dynamicObjects = &shared.dynamicObjects; + this->privData->staticObjects = &shared.staticObjects; + this->privData->loading = false; // we may assume that nwClient is properly connected to the server @@ -82,6 +98,7 @@ void NetLoadState::DataRecieved( NetEventprivData->loading ) { this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName ); + this->ChangeState( ClientState_Game ); } } @@ -89,7 +106,69 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) { this->privData->loading = true; - // TODO: ask Sam about level loader + LevelLoader loader; + auto objects = loader.LoadLevel( fileName ); + auto object = objects.begin(); + ObjectHeader *oh; + + int objectID = 100; // first 100 is reserved for players. This is how the server does it. + + for( ; object != objects.end(); ++object ) + { + ++objectID; + oh = (ObjectHeader*)&*object; + switch( oh->typeID ) + { + case ObjectType::ObjectType_Static: + { + ModelInitData desc; + desc.id = objectID; + StringToWstring( oh->ModelFile, desc.modelPath ); + desc.position = oh->position; + desc.rotation = ArrayToQuaternion( oh->rotation ); + desc.scale = oh->scale; + desc.visible = true; + + C_StaticObj *staticObject = new C_StaticObj(); + if( staticObject->Init( desc ) ) + { + (*this->privData->staticObjects)[objectID] = staticObject; + } + else + { + delete staticObject; + } + } + break; + case ObjectType::ObjectType_Dynamic: + { + ModelInitData desc; + desc.id = objectID; + StringToWstring( oh->ModelFile, desc.modelPath ); + desc.position = oh->position; + desc.rotation = ArrayToQuaternion( oh->rotation ); + desc.scale = oh->scale; + desc.visible = true; + + C_DynamicObj *dynamicObject = new C_DynamicObj(); + if( dynamicObject->Init( desc ) ) + { + (*this->privData->dynamicObjects)[objectID] = dynamicObject; + } + else + { + delete dynamicObject; + } + } + break; + case ObjectType::ObjectType_Light: + { + /* TODO: implement light into the leveformat */ + } + break; + default: break; + } + } this->privData->nextState = ClientState::ClientState_Game; } diff --git a/Code/Game/GameClient/GameClientState/SharedStateContent.h b/Code/Game/GameClient/GameClientState/SharedStateContent.h index 2fabb1ac..da9dc759 100644 --- a/Code/Game/GameClient/GameClientState/SharedStateContent.h +++ b/Code/Game/GameClient/GameClientState/SharedStateContent.h @@ -11,6 +11,8 @@ #include #include "Utilities.h" #include "C_Object.h" +#include "C_obj\C_StaticObj.h" +#include "C_obj\C_DynamicObj.h" #include "NetworkClient.h" #include "L_inputClass.h" @@ -19,8 +21,8 @@ namespace DanBias { namespace Client struct SharedStateContent { public: - ::std::map> staticObjects; - ::std::map> dynamicObjects; + ::std::map> staticObjects; + ::std::map> dynamicObjects; ::Oyster::Network::NetworkClient *network; InputClass* input; }; From 43650befd65b20be547e3b744ef4df53a54b6f99 Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 17 Feb 2014 15:11:12 +0100 Subject: [PATCH 06/46] GameServer - added more features to object protocols --- Code/Game/GameClient/GameClient.vcxproj.user | 2 +- Code/Game/GameLogic/GameLogic.vcxproj.user | 2 +- Code/Game/GameProtocols/ObjectProtocols.h | 54 +++++++++++++++---- .../GameServer/Implementation/GameLobby.cpp | 3 -- .../GameServer/Implementation/GameServer.cpp | 4 -- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/Code/Game/GameClient/GameClient.vcxproj.user b/Code/Game/GameClient/GameClient.vcxproj.user index 4b847ee6..2e28d6f7 100644 --- a/Code/Game/GameClient/GameClient.vcxproj.user +++ b/Code/Game/GameClient/GameClient.vcxproj.user @@ -1,7 +1,7 @@  - false + true $(OutDir) diff --git a/Code/Game/GameLogic/GameLogic.vcxproj.user b/Code/Game/GameLogic/GameLogic.vcxproj.user index 2e28d6f7..4b847ee6 100644 --- a/Code/Game/GameLogic/GameLogic.vcxproj.user +++ b/Code/Game/GameLogic/GameLogic.vcxproj.user @@ -1,7 +1,7 @@  - true + false $(OutDir) diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 70e24883..e3449022 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -476,7 +476,21 @@ namespace GameLogic } Protocol_ObjectCreate( Oyster::Network::CustomNetProtocol& p ) { - /** @todo TODO: not implemented */ + this->object_ID = p[1].value.netInt; + this->name.assign(p[2].value.netCharPtr); + + this->position[0] = p[3].value.netFloat; + this->position[1] = p[4].value.netFloat; + this->position[2] = p[5].value.netFloat; + + this->rotationQ[0] = p[6].value.netFloat; + this->rotationQ[1] = p[7].value.netFloat; + this->rotationQ[2] = p[8].value.netFloat; + this->rotationQ[3] = p[9].value.netFloat; + + this->scale[0] = p[10].value.netFloat; + this->scale[1] = p[11].value.netFloat; + this->scale[2] = p[12].value.netFloat; } Protocol_ObjectCreate(float p[3], float r[4], float s[3], int id, char *path) { @@ -538,7 +552,7 @@ namespace GameLogic std::string name; std::string meshName; float position[3]; - float rotation[3]; + float rotationQ[4]; float scale[3]; Protocol_ObjectCreatePlayer() @@ -569,9 +583,25 @@ namespace GameLogic } Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { + this->object_ID = p[1].value.netInt; + this->teamId = this->protocol[2].value.netInt; + this->name.assign(p[3].value.netCharPtr); + this->meshName.assign(p[4].value.netCharPtr); + + this->position[0] = p[5].value.netFloat; + this->position[1] = p[6].value.netFloat; + this->position[2] = p[7].value.netFloat; + this->rotationQ[0] = p[8].value.netFloat; + this->rotationQ[1] = p[9].value.netFloat; + this->rotationQ[2] = p[10].value.netFloat; + this->rotationQ[3] = p[11].value.netFloat; + + this->scale[0] = p[12].value.netFloat; + this->scale[1] = p[13].value.netFloat; + this->scale[2] = p[14].value.netFloat; } - Protocol_ObjectCreatePlayer(float position[3], float rotation[3], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) + Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) { this->protocol[0].value = protocol_Gameplay_ObjectCreatePlayer; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; @@ -592,17 +622,18 @@ namespace GameLogic this->protocol[8].type = Oyster::Network::NetAttributeType_Float; this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[11].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; this->protocol[13].type = Oyster::Network::NetAttributeType_Float; + this->protocol[14].type = Oyster::Network::NetAttributeType_Float; this->object_ID = ObjectID; this->teamId = teamID; this->name = name; this->meshName = meshName; memcpy(&this->position[0], &position[0], sizeof(float)*3); - memcpy(&this->rotation[0], &rotation[0], sizeof(float)*3); + memcpy(&this->rotationQ[0], &rotation[0], sizeof(float)*4); memcpy(&this->scale[0], &scale[0], sizeof(float)*3); } Oyster::Network::CustomNetProtocol GetProtocol() override @@ -618,13 +649,14 @@ namespace GameLogic this->protocol[6].value = this->position[1]; this->protocol[7].value = this->position[2]; //ROTATION - this->protocol[8].value = this->rotation[0]; - this->protocol[9].value = this->rotation[1]; - this->protocol[10].value = this->rotation[2]; + this->protocol[8].value = this->rotationQ[0]; + this->protocol[9].value = this->rotationQ[1]; + this->protocol[10].value = this->rotationQ[2]; + this->protocol[11].value = this->rotationQ[3]; //SCALE - this->protocol[11].value = this->scale[0]; - this->protocol[12].value = this->scale[1]; - this->protocol[13].value = this->scale[2]; + this->protocol[12].value = this->scale[0]; + this->protocol[13].value = this->scale[1]; + this->protocol[14].value = this->scale[2]; return protocol; } diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 1b8b63ec..82599677 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -15,18 +15,15 @@ namespace DanBias { GameLobby::GameLobby() { } - GameLobby::~GameLobby() { this->clients.Clear(); } - void GameLobby::Release() { NetworkSession::CloseSession(true); this->gameSession.CloseSession(true); } - void GameLobby::Update() { this->ProcessClients(); diff --git a/Code/Game/GameServer/Implementation/GameServer.cpp b/Code/Game/GameServer/Implementation/GameServer.cpp index 4fd6e03c..087fa7ff 100644 --- a/Code/Game/GameServer/Implementation/GameServer.cpp +++ b/Code/Game/GameServer/Implementation/GameServer.cpp @@ -61,8 +61,6 @@ void GameServerAPI::ServerStart() { timer.reset(); server.Start(); - - } void GameServerAPI::ServerStop() { @@ -113,8 +111,6 @@ void GameServerAPI::NotifyWhenClientConnect(ClientConnectedNotify func) { if(!func) clientConnectedCallback = DefaultClientConnectedNotify; else clientConnectedCallback = func; - - } void GameServerAPI::NotifyWhenClientDisconnect(ClientDisconnectedNotify func) { From b4b5998a643f1a132871eafe47c52113607412d3 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 16:16:27 +0100 Subject: [PATCH 07/46] Bunch of implementations --- Code/Game/GameClient/DanBiasGame_Impl.cpp | 6 +-- Code/Game/GameClient/GameClient.vcxproj | 8 +-- .../GameClient/GameClientState/GameState.cpp | 50 ++++++++++++++----- .../GameClient/GameClientState/GameState.h | 3 +- .../GameClientState/NetLoadState.cpp | 13 +++-- 5 files changed, 54 insertions(+), 26 deletions(-) diff --git a/Code/Game/GameClient/DanBiasGame_Impl.cpp b/Code/Game/GameClient/DanBiasGame_Impl.cpp index 392e917f..81650049 100644 --- a/Code/Game/GameClient/DanBiasGame_Impl.cpp +++ b/Code/Game/GameClient/DanBiasGame_Impl.cpp @@ -99,9 +99,6 @@ namespace DanBias data.timer.reset(); Graphics::API::Update( dt ); - - if(data.networkClient.IsConnected()) - data.networkClient.Update(); data.capFrame += dt; if(data.capFrame > 0.03) @@ -118,6 +115,9 @@ namespace DanBias data.capFrame = 0; } + if(data.networkClient.IsConnected()) + data.networkClient.Update(); + } return DanBiasClientReturn_Success; } diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index a87f61e4..3daafff3 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -112,7 +112,7 @@ Windows true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;GameClient_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -129,7 +129,7 @@ Windows true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;GameClient_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -150,7 +150,7 @@ true true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;GameClient_$(PlatformShortName).dll;%(DelayLoadDLLs) @@ -171,7 +171,7 @@ true true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;GameClient_$(PlatformShortName).dll;%(DelayLoadDLLs) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 29cfec03..38ded541 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -8,6 +8,7 @@ #include "C_obj/C_Player.h" #include "C_obj/C_DynamicObj.h" #include "C_obj/C_StaticObj.h" +#include "Utilities.h" using namespace ::DanBias::Client; using namespace ::Oyster; @@ -15,6 +16,7 @@ using namespace ::Oyster::Network; using namespace ::Oyster::Math3D; using namespace ::GameLogic; using namespace ::Utility::DynamicMemory; +using namespace ::Utility::String; struct GameState::MyData { @@ -40,6 +42,11 @@ struct GameState::MyData } privData; +inline Quaternion ArrayToQuaternion( const float source[4] ) +{ + return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); +} + GameState::GameState() { this->privData = nullptr; @@ -75,21 +82,33 @@ bool GameState::Init( SharedStateContent &shared ) return true; } -void GameState::InitiatePlayer( int id, std::wstring modelName, Float4x4 world ) +void GameState::InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3], bool isMyPlayer ) { - this->privData->myId = id; - ModelInitData modelData; - modelData.visible = true; - modelData.position = Float3(world[12], world[13], world[14]); - modelData.rotation = Quaternion(Float3(0,0,0), 1); - modelData.scale = Float3(1,1,1); - modelData.modelPath = modelName; - modelData.id = this->privData->myId; - this->privData->player.Init( modelData ); + modelData.visible = true; + modelData.position = position; + modelData.rotation = ArrayToQuaternion( rotation ); + modelData.scale = scale; + StringToWstring( modelName, modelData.modelPath ); + modelData.id = id; - this->privData->camera.SetPosition( this->privData->player.getPos() ); - this->privData->camera.UpdateOrientation(); + if( isMyPlayer ) + { + if( this->privData->player.Init(modelData) ) + { + this->privData->myId = id; + this->privData->camera.SetPosition( this->privData->player.getPos() ); + this->privData->camera.UpdateOrientation(); + } + } + else + { + C_DynamicObj *p = new C_DynamicObj(); + if( p->Init(modelData) ) + { + (*this->privData->dynamicObjects)[id] = p; + } + } } GameClientState::ClientState GameState::Update( float deltaTime ) @@ -359,7 +378,12 @@ void GameState::DataRecieved( NetEventInitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotation, decoded.scale, decoded.owner ); + } + break; case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectLeaveTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectWeaponCooldown: break; /** @todo TODO: implement */ diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 29ea2f1e..e3ced125 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -20,9 +20,8 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - void InitiatePlayer( int id, std::wstring modelName, Oyster::Math::Float4x4 world ); + void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3] ); void ReadKeyInput(); - bool Render()override; bool Release()override; void ChangeState( ClientState next ); diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 8274472d..f50db40c 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -27,7 +27,7 @@ struct NetLoadState::MyData bool loading; }; -inline Quaternion ArrayToQuaternion( float source[4] ) +inline Quaternion ArrayToQuaternion( const float source[4] ) { return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); } @@ -99,6 +99,7 @@ void NetLoadState::DataRecieved( NetEventLoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName ); this->ChangeState( ClientState_Game ); + this->privData->loading = false; } } @@ -109,18 +110,20 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) LevelLoader loader; auto objects = loader.LoadLevel( fileName ); auto object = objects.begin(); - ObjectHeader *oh; + ObjectTypeHeader *oth; int objectID = 100; // first 100 is reserved for players. This is how the server does it. for( ; object != objects.end(); ++object ) { ++objectID; - oh = (ObjectHeader*)&*object; - switch( oh->typeID ) + oth = (ObjectTypeHeader*)(*object._Ptr); + switch( oth->typeID ) { case ObjectType::ObjectType_Static: { + ObjectHeader *oh = (ObjectHeader*)oth; + ModelInitData desc; desc.id = objectID; StringToWstring( oh->ModelFile, desc.modelPath ); @@ -142,6 +145,8 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) break; case ObjectType::ObjectType_Dynamic: { + ObjectHeader *oh = (ObjectHeader*)oth; + ModelInitData desc; desc.id = objectID; StringToWstring( oh->ModelFile, desc.modelPath ); From 5137404bb68b534d5d58aacd8ac2d82dfed1e693 Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 17 Feb 2014 16:17:07 +0100 Subject: [PATCH 08/46] Temp --- Code/Game/GameProtocols/ObjectProtocols.h | 93 +++---- Code/Game/GameServer/GameLobby.h | 3 +- .../GameServer/Implementation/GameLobby.cpp | 229 +++++++++--------- .../GameLobby_ProtocolParser.cpp | 31 ++- .../Implementation/GameSession_General.cpp | 1 + 5 files changed, 199 insertions(+), 158 deletions(-) diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index e3449022..ff6aa6e5 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -546,14 +546,14 @@ namespace GameLogic //#define protocol_Gameplay_ObjectCreatePlayer 359 struct Protocol_ObjectCreatePlayer :public Oyster::Network::CustomProtocolObject { - //ObjectType type; //ie player, box or whatever - int object_ID; - int teamId; - std::string name; - std::string meshName; - float position[3]; - float rotationQ[4]; - float scale[3]; + /*1*/ int object_ID; + /*2*/ int teamId; + /*3*/ bool owner; + /*4*/ std::string name; + /*5*/ std::string meshName; + /*6 - 8*/ float position[3]; + /*9 - 11*/ float rotationQ[4]; + /*12 - 14*/ float scale[3]; Protocol_ObjectCreatePlayer() { @@ -564,44 +564,47 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; + //OWNER + this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; //PLAYER-NAME - this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; - //MESH-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; + //MESH-NAME + this->protocol[5].type = Oyster::Network::NetAttributeType_CharArray; //POSITION - this->protocol[5].type = Oyster::Network::NetAttributeType_Float; this->protocol[6].type = Oyster::Network::NetAttributeType_Float; this->protocol[7].type = Oyster::Network::NetAttributeType_Float; - //ROTATION this->protocol[8].type = Oyster::Network::NetAttributeType_Float; + //ROTATION this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[11].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; this->protocol[13].type = Oyster::Network::NetAttributeType_Float; + this->protocol[14].type = Oyster::Network::NetAttributeType_Float; } Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { this->object_ID = p[1].value.netInt; this->teamId = this->protocol[2].value.netInt; - this->name.assign(p[3].value.netCharPtr); - this->meshName.assign(p[4].value.netCharPtr); + this->owner = this->protocol[3].value.netBool; + this->name.assign(p[4].value.netCharPtr); + this->meshName.assign(p[5].value.netCharPtr); - this->position[0] = p[5].value.netFloat; - this->position[1] = p[6].value.netFloat; - this->position[2] = p[7].value.netFloat; + this->position[0] = p[6].value.netFloat; + this->position[1] = p[7].value.netFloat; + this->position[2] = p[8].value.netFloat; - this->rotationQ[0] = p[8].value.netFloat; - this->rotationQ[1] = p[9].value.netFloat; - this->rotationQ[2] = p[10].value.netFloat; - this->rotationQ[3] = p[11].value.netFloat; + this->rotationQ[0] = p[9].value.netFloat; + this->rotationQ[1] = p[10].value.netFloat; + this->rotationQ[2] = p[11].value.netFloat; + this->rotationQ[3] = p[12].value.netFloat; - this->scale[0] = p[12].value.netFloat; - this->scale[1] = p[13].value.netFloat; - this->scale[2] = p[14].value.netFloat; + this->scale[0] = p[13].value.netFloat; + this->scale[1] = p[14].value.netFloat; + this->scale[2] = p[15].value.netFloat; } - Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) + Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, bool owner, int teamID, std::string name, std::string meshName) { this->protocol[0].value = protocol_Gameplay_ObjectCreatePlayer; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; @@ -610,26 +613,29 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; + //OWNER + this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; //PLAYER-NAME - this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; - //MESH-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; + //MESH-NAME + this->protocol[5].type = Oyster::Network::NetAttributeType_CharArray; //POSITION - this->protocol[5].type = Oyster::Network::NetAttributeType_Float; this->protocol[6].type = Oyster::Network::NetAttributeType_Float; this->protocol[7].type = Oyster::Network::NetAttributeType_Float; - //ROTATION this->protocol[8].type = Oyster::Network::NetAttributeType_Float; + //ROTATION this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; this->protocol[11].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[13].type = Oyster::Network::NetAttributeType_Float; this->protocol[14].type = Oyster::Network::NetAttributeType_Float; + this->protocol[15].type = Oyster::Network::NetAttributeType_Float; this->object_ID = ObjectID; this->teamId = teamID; + this->owner = owner; this->name = name; this->meshName = meshName; memcpy(&this->position[0], &position[0], sizeof(float)*3); @@ -641,22 +647,23 @@ namespace GameLogic this->protocol[1].value = this->object_ID; this->protocol[2].value = this->teamId; - this->protocol.Set(3, this->name); - this->protocol.Set(4, this->meshName); + this->protocol[3].value = this->owner; + this->protocol.Set(4, this->name); + this->protocol.Set(5, this->meshName); //POSITION - this->protocol[5].value = this->position[0]; - this->protocol[6].value = this->position[1]; - this->protocol[7].value = this->position[2]; + this->protocol[6].value = this->position[0]; + this->protocol[7].value = this->position[1]; + this->protocol[8].value = this->position[2]; //ROTATION - this->protocol[8].value = this->rotationQ[0]; - this->protocol[9].value = this->rotationQ[1]; - this->protocol[10].value = this->rotationQ[2]; - this->protocol[11].value = this->rotationQ[3]; + this->protocol[9].value = this->rotationQ[0]; + this->protocol[10].value = this->rotationQ[1]; + this->protocol[11].value = this->rotationQ[2]; + this->protocol[12].value = this->rotationQ[3]; //SCALE - this->protocol[12].value = this->scale[0]; - this->protocol[13].value = this->scale[1]; - this->protocol[14].value = this->scale[2]; + this->protocol[13].value = this->scale[0]; + this->protocol[14].value = this->scale[1]; + this->protocol[15].value = this->scale[2]; return protocol; } diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index 86cd498a..d0cbbcc3 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -41,11 +41,12 @@ namespace DanBias //void LobbyCreateGame(GameLogic::Protocol_LobbyCreateGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Create: void LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Start: //void LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Join: - void LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: + void LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: void LobbyRefresh(GameLogic::Protocol_LobbyRefresh& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Refresh: void LobbyGameData(GameLogic::Protocol_LobbyGameData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_GameData: void LobbyMainData(GameLogic::Protocol_LobbyClientData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_MainData: void LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_ClientReadyState: + void LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_QuerryGameType: private: void ClientEventCallback(Oyster::Network::NetEvent e) override; diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 82599677..6f4f0a47 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -11,127 +11,132 @@ using namespace Oyster::Network; using namespace Oyster; using namespace GameLogic; -namespace DanBias +using namespace DanBias; + +GameLobby::GameLobby() +{ } +GameLobby::~GameLobby() +{ + this->clients.Clear(); +} +void GameLobby::Release() +{ + NetworkSession::CloseSession(true); + this->gameSession.CloseSession(true); +} +void GameLobby::Update() { - GameLobby::GameLobby() - { } - GameLobby::~GameLobby() - { - this->clients.Clear(); - } - void GameLobby::Release() - { - NetworkSession::CloseSession(true); - this->gameSession.CloseSession(true); - } - void GameLobby::Update() + for (unsigned int i = 0; i < this->clients.Size(); i++) { - this->ProcessClients(); - } - void GameLobby::SetGameDesc(const LobbyLevelData& desc) - { - this->description.gameMode = desc.gameMode; - this->description.gameTime = desc.gameTime; - this->description.mapNumber = desc.mapNumber; - this->description.maxClients = desc.maxClients; - } - void GameLobby::GetGameDesc(LobbyLevelData& desc) - { - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; - desc.maxClients = this->description.maxClients; - } - bool GameLobby::StartGameSession( ) - { - //Check if all clients is ready - if(this->GetClientCount() && this->GetClientCount() == this->readyList.Size()) + if(this->clients[i]) { - GameSession::GameDescription desc; - desc.maxClients = this->description.maxClients; - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; - desc.owner = this; - desc.clients = this->clients; + this->clients[i]->Update(); + } + } +} +void GameLobby::SetGameDesc(const LobbyLevelData& desc) +{ + this->description.gameMode = desc.gameMode; + this->description.gameTime = desc.gameTime; + this->description.mapNumber = desc.mapNumber; + this->description.maxClients = desc.maxClients; +} +void GameLobby::GetGameDesc(LobbyLevelData& desc) +{ + desc.gameMode = this->description.gameMode; + desc.gameTime = this->description.gameTime; + desc.mapNumber = this->description.mapNumber; + desc.maxClients = this->description.maxClients; +} +bool GameLobby::StartGameSession( ) +{ +//Check if all clients is ready + if(this->GetClientCount() && this->GetClientCount() == this->readyList.Size()) + { + GameSession::GameDescription desc; + desc.maxClients = this->description.maxClients; + desc.gameMode = this->description.gameMode; + desc.gameTime = this->description.gameTime; + desc.mapNumber = this->description.mapNumber; + desc.owner = this; + desc.clients = this->clients; - if(desc.gameTime == 0.0f) - desc.gameTime = (int)(60.0f * 10.0f); //note: should be fetched from somewhere. + if(desc.gameTime == 0.0f) + desc.gameTime = (int)(60.0f * 10.0f); //note: should be fetched from somewhere. - if(desc.maxClients == 0) - desc.maxClients = 10; //note: should be fetched somewhere else.. + if(desc.maxClients == 0) + desc.maxClients = 10; //note: should be fetched somewhere else.. - this->clients.Clear(); //Remove clients from lobby list + this->clients.Clear(); //Remove clients from lobby list - if(this->gameSession.Create(desc)) - { - this->gameSession.Run(); + if(this->gameSession.Create(desc)) + { + this->gameSession.Run(); - return true; + return true; + } + } + else + { + //? + } + return false; +} + +void GameLobby::ClientEventCallback(NetEvent e) +{ + switch (e.args.type) + { + case NetworkClient::ClientEventArgs::EventType_Disconnect: + + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: + + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: + printf("\t(%i : %s) - EventType_ProtocolFailedToSend\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); + e.sender->Disconnect(); + this->readyList.Remove(e.sender); + this->clients.Remove(e.sender); + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: + printf("\t(%i : %s) - EventType_ProtocolRecieved\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); + this->ParseProtocol(e.args.data.protocol, e.sender); + break; + } +} +void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) +{ + printf("New client(%i) connected - %s \n", client->GetID(), client->GetIpAddress().c_str()); + + if(this->gameSession) + { + Attach(client); + } + else + { + Attach(client); + Protocol_LobbyClientData p1; + Protocol_LobbyGameData p2; + + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + if(this->clients[i]) + { + Protocol_LobbyClientData::PlayerData t; + t.id = this->clients[i]->GetID(); + t.ip = this->clients[i]->GetIpAddress(); + t.team = 0; + t.name = "Dennis är kung tycker Erik!"; + p1.list.Push(t); } } - else - { - //? - } - return false; + p2.majorVersion = 1; + p2.minorVersion = 0; + p2.mapName = "Dennis är kung tycker Erik!"; + + client->Send(p1.GetProtocol()); + client->Send(p2.GetProtocol()); } +} - void GameLobby::ClientEventCallback(NetEvent e) - { - switch (e.args.type) - { - case NetworkClient::ClientEventArgs::EventType_Disconnect: - - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: - - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: - printf("\t(%i : %s) - EventType_ProtocolFailedToSend\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); - e.sender->Disconnect(); - this->readyList.Remove(e.sender); - this->clients.Remove(e.sender); - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: - printf("\t(%i : %s) - EventType_ProtocolRecieved\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); - this->ParseProtocol(e.args.data.protocol, e.sender); - break; - } - } - void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) - { - printf("New client(%i) connected - %s \n", client->GetID(), client->GetIpAddress().c_str()); - - if(this->gameSession) - { - this->gameSession.Attach(client); - } - else - { - Attach(client); - Protocol_LobbyClientData p1; - Protocol_LobbyGameData p2; - - for (unsigned int i = 0; i < this->clients.Size(); i++) - { - if(this->clients[i]) - { - Protocol_LobbyClientData::PlayerData t; - t.id = this->clients[i]->GetID(); - t.ip = this->clients[i]->GetIpAddress(); - t.team = 0; - t.name = "Dennis är kung tycker Erik!"; - p1.list.Push(t); - } - } - p2.majorVersion = 1; - p2.minorVersion = 0; - p2.mapName = "Dennis är kung tycker Erik!"; - - client->Send(p1.GetProtocol()); - client->Send(p2.GetProtocol()); - } - } - -}//End namespace DanBias \ No newline at end of file diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index 7493cb5a..d49f83fc 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -18,11 +18,11 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie break; //case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c); //break; - case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); + case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); break; //case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c); //break; - case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c); + case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c); break; case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c); break; @@ -32,6 +32,8 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie break; case protocol_Lobby_ClientReadyState: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); break; + case protocol_Lobby_QuerryGameType: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); + break; } } @@ -112,4 +114,29 @@ void GameLobby::LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster: this->readyList.Remove(c); } } +void GameLobby::LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c) +{ + NetClient temp; + bool found = false; + //find client in waiting list + for (unsigned int i = 0; !found && i < this->clients.Size(); i++) + { + if(this->clients[i]->GetID() == c->GetID()) + { + temp = this->clients[i]; + found = true; + } + } + + //Something is wrong + if(!found) + { + c->Disconnect(); + } + else + { + //Send game data + this->gameSession.Attach(temp); + } +} diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 647cee4a..cf82cc61 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -209,6 +209,7 @@ namespace DanBias { IPlayerData* p = this->clients[i]->GetPlayer(); Protocol_ObjectCreate oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); + //Protocol_ObjectCreatePlayer oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); this->clients[i]->GetClient()->Send(oc); } } From 930a6ee2792357fc66742dc7138a56abbc06a673 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 16:18:21 +0100 Subject: [PATCH 09/46] Oops .. Forgot to save this one for the previous commit --- Code/Game/GameClient/GameClientState/GameState.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index e3ced125..035ad566 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -20,7 +20,7 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3] ); + void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3], bool isMyPlayer ); void ReadKeyInput(); bool Render()override; bool Release()override; From 5b4758d2ae478bd3b9d1913bd78a069e643b4592 Mon Sep 17 00:00:00 2001 From: Dennis Andersen Date: Tue, 18 Feb 2014 08:55:38 +0100 Subject: [PATCH 10/46] Broekn --- .../GameClientState/NetLoadState.cpp | 2 +- Code/Game/GameProtocols/LobbyProtocols.h | 68 ++-- Code/Game/GameServer/GameClient.h | 20 +- Code/Game/GameServer/GameLobby.h | 25 +- Code/Game/GameServer/GameSession.h | 14 +- .../GameServer/Implementation/GameClient.cpp | 55 +-- .../GameServer/Implementation/GameLobby.cpp | 8 +- .../GameLobby_ProtocolParser.cpp | 62 +-- .../Implementation/GameSession_Gameplay.cpp | 6 +- .../Implementation/GameSession_General.cpp | 354 ++++++++++-------- Code/Network/NetworkAPI/NetworkClient.h | 8 +- 11 files changed, 306 insertions(+), 316 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 3463182e..ab492797 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -81,7 +81,7 @@ void NetLoadState::DataRecieved( NetEventprivData->loading ) { - this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName ); + this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).mapName ); } } diff --git a/Code/Game/GameProtocols/LobbyProtocols.h b/Code/Game/GameProtocols/LobbyProtocols.h index 71202898..26909bbf 100644 --- a/Code/Game/GameProtocols/LobbyProtocols.h +++ b/Code/Game/GameProtocols/LobbyProtocols.h @@ -41,61 +41,41 @@ namespace GameLogic struct Protocol_LobbyCreateGame :public Oyster::Network::CustomProtocolObject { - short clientID; // The unuiqe id reprsenting a specific client - std::string modelName; - float worldMatrix[16]; - + char majorVersion; + char minorVersion; + std::string mapName; + Protocol_LobbyCreateGame() { - int c = 0; - this->protocol[c].value = protocol_Lobby_CreateGame; - this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; - - this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; - for (int i = 0; i <= 16; i++) - { - this->protocol[c++].type = Oyster::Network::NetAttributeType_Float; - } - this->protocol[c++].type = Oyster::Network::NetAttributeType_CharArray; + this->protocol[0].value = protocol_Lobby_CreateGame; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Char; + this->protocol[2].type = Oyster::Network::NetAttributeType_Char; + this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; } - Protocol_LobbyCreateGame(short _clientID, std::string name, float world[16]) + Protocol_LobbyCreateGame(char majorVersion, char minorVersion, std::string name) { - int c = 0; - this->protocol[c].value = protocol_Lobby_CreateGame; - this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; + this->protocol[0].value = protocol_Lobby_CreateGame; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Char; + this->protocol[2].type = Oyster::Network::NetAttributeType_Char; + this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; - this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; - for (int i = 0; i <= 16; i++) - { - this->protocol[c++].type = Oyster::Network::NetAttributeType_Float; - } - - this->protocol[c++].type = Oyster::Network::NetAttributeType_CharArray; - - clientID = _clientID; - modelName = name; - memcpy(&worldMatrix[0], &world[0], sizeof(float) * 16); + this->majorVersion = majorVersion; + this->minorVersion = minorVersion; + this->mapName = name; } Protocol_LobbyCreateGame(Oyster::Network::CustomNetProtocol o) { - int c = 1; - clientID = o[c++].value.netInt; - for (int i = 0; i <= 16; i++) - { - this->worldMatrix[i] = o[c++].value.netFloat; - } - modelName.assign(o[c++].value.netCharPtr); + this->majorVersion = o[1].value.netChar; + this->minorVersion = o[2].value.netChar; + this->mapName.assign(o[3].value.netCharPtr); } Oyster::Network::CustomNetProtocol GetProtocol() override { - int c = 1; - protocol[c++].value = clientID; - - for (int i = 0; i <= 16; i++) - { - this->protocol[c++].value = this->worldMatrix[i]; - } - protocol.Set(c++, this->modelName); + protocol[1].value = this->majorVersion; + protocol[2].value = this->minorVersion; + protocol.Set(3, this->mapName); return protocol; } diff --git a/Code/Game/GameServer/GameClient.h b/Code/Game/GameServer/GameClient.h index a9c33cf3..09b3bc40 100644 --- a/Code/Game/GameServer/GameClient.h +++ b/Code/Game/GameServer/GameClient.h @@ -25,19 +25,31 @@ namespace DanBias Utility::DynamicMemory::SmartPointer GetClient(); Utility::DynamicMemory::SmartPointer ReleaseClient(); - float GetSinceLastResponse() const; - bool IsReady() const; - bool Equals(const Oyster::Network::NetworkClient* c); + inline bool operator==(const GameLogic::IPlayerData* c) { return (this->player) ? (c->GetID() == this->player->GetID()) : false ; } + inline bool operator==(const Oyster::Network::NetworkClient* c) { return (c->GetID() == this->GetID()); } + inline float GetSinceLastResponse() const { return this->secondsSinceLastResponse; } + inline std::wstring GetAlias() const { return this->alias; } + inline std::wstring GetCharacter() const { return this->character; } + inline bool IsReady() const { return this->isReady; } + inline GameLogic::IPlayerData* GetPlayer() const { return this->player; } + + + void SetPlayer(GameLogic::IPlayerData* player); void SetReadyState(bool isReady); + void SetAlias(std::wstring alias); + void SetCharacter(std::wstring character); void SetSinceLastResponse(float seconds); private: GameLogic::IPlayerData* player; Utility::DynamicMemory::SmartPointer client; + bool isReady; float secondsSinceLastResponse; - }; + std::wstring alias; + std::wstring character; + }; }//End namespace DanBias #endif // !DANBIASSERVER_CLIENT_OBJECT_H diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index d0cbbcc3..ac4db486 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -36,25 +36,24 @@ namespace DanBias private: void ParseProtocol(Oyster::Network::CustomNetProtocol& p, Oyster::Network::NetworkClient* c); - void GeneralStatus(GameLogic::Protocol_General_Status& p, Oyster::Network::NetworkClient* c); //id = protocol_General_Status: - void GeneralText(GameLogic::Protocol_General_Text& p, Oyster::Network::NetworkClient* c); //id = protocol_General_Text: - //void LobbyCreateGame(GameLogic::Protocol_LobbyCreateGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Create: - void LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Start: - //void LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Join: - void LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: - void LobbyRefresh(GameLogic::Protocol_LobbyRefresh& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Refresh: - void LobbyGameData(GameLogic::Protocol_LobbyGameData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_GameData: - void LobbyMainData(GameLogic::Protocol_LobbyClientData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_MainData: - void LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_ClientReadyState: - void LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_QuerryGameType: + void GeneralStatus(GameLogic::Protocol_General_Status& p, Oyster::Network::NetworkClient* c); //id = protocol_General_Status: + void GeneralText(GameLogic::Protocol_General_Text& p, Oyster::Network::NetworkClient* c); //id = protocol_General_Text: + void LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Start: + void LobbyJoin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: + void LobbyRefresh(GameLogic::Protocol_LobbyRefresh& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Refresh: + void LobbyGameData(GameLogic::Protocol_LobbyGameData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_GameData: + void LobbyMainData(GameLogic::Protocol_LobbyClientData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_MainData: + void LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_ClientReadyState: + void LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_QuerryGameType: private: void ClientEventCallback(Oyster::Network::NetEvent e) override; void ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) override; private: - Utility::WinTimer timer; - float refreshFrequency; + //Utility::WinTimer timer; + //float refreshFrequency; + Utility::DynamicMemory::LinkedList readyList; GameSession gameSession; LobbyLevelData description; diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index 3d86ea78..8cd04048 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -31,10 +31,10 @@ namespace DanBias */ struct GameDescription { - int maxClients; - int mapNumber; - int gameMode; - int gameTime; + unsigned int maxClients; + std::string mapName; + std::string gameMode; + int gameTimeMinutes; Oyster::Network::NetworkSession* owner; Utility::DynamicMemory::DynamicArray clients; }; @@ -61,14 +61,14 @@ namespace DanBias //Private member functions private: - // TODO: find out what this method does.. + // Client event callback function void ClientEventCallback(Oyster::Network::NetEvent e) override; - //Sends a client to the owner, if obj is NULL then all clients is sent + //Sends a client to the owner, if param is NULL then all clients is sent void SendToOwner(DanBias::GameClient* obj); //Derived from IThreadObject - void ThreadEntry() override; + void ThreadEntry( ) override; bool DoWork ( ) override; diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index 3956fe57..6e68b1e8 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -12,51 +12,26 @@ using namespace DanBias; using namespace GameLogic; -GameClient::GameClient(SmartPointer client, GameLogic::IPlayerData* player) +GameClient::GameClient() { - this->client = client; - this->player = player; + this->player = 0; isReady = false; + this->character = L"Unknown"; + this->alias = L"Unknown"; + this->secondsSinceLastResponse = 0.0f; } GameClient::~GameClient() { - this->client->Disconnect(); this->player = 0; - isReady = false; + this->isReady = false; + this->character = L"Unknown"; + this->alias = L"Unknown"; + this->secondsSinceLastResponse = 0.0f; } -GameLogic::IPlayerData* GameClient::GetPlayer() +void GameClient::SetPlayer(GameLogic::IPlayerData* player) { - return this->player; -} -GameLogic::IPlayerData* GameClient::ReleasePlayer() -{ - GameLogic::IPlayerData *temp = this->player; - this->player = 0; - return temp; -} -SmartPointer GameClient::GetClient() -{ - return this->client; -} -SmartPointer GameClient::ReleaseClient() -{ - SmartPointer temp = this->client; - this->client = 0; - return temp; -} - -float GameClient::GetSinceLastResponse() const -{ - return this->secondsSinceLastResponse; -} -bool GameClient::IsReady() const -{ - return this->isReady; -} -bool GameClient::Equals(const NetworkClient* c) -{ - return (c->GetID() == this->client->GetID()); + this->player = player; } void GameClient::SetReadyState(bool r) { @@ -66,5 +41,13 @@ void GameClient::SetSinceLastResponse(float s) { this->secondsSinceLastResponse = s; } +void GameClient::SetAlias(std::wstring alias) +{ + this->alias = alias; +} +void GameClient::SetCharacter(std::wstring character) +{ + this->character = character; +} diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 6f4f0a47..2a297e2f 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -56,13 +56,13 @@ bool GameLobby::StartGameSession( ) GameSession::GameDescription desc; desc.maxClients = this->description.maxClients; desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; + desc.gameTimeMinutes = this->description.gameTime; + //desc.mapName = this->description.mapNumber; desc.owner = this; desc.clients = this->clients; - if(desc.gameTime == 0.0f) - desc.gameTime = (int)(60.0f * 10.0f); //note: should be fetched from somewhere. + if(desc.gameTimeMinutes == 0) + desc.gameTimeMinutes = 10; //note: should be fetched from somewhere. if(desc.maxClients == 0) desc.maxClients = 10; //note: should be fetched somewhere else.. diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index d49f83fc..81758480 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -12,27 +12,23 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie { switch (p[0].value.netShort) { - case protocol_General_Status: this->GeneralStatus (Protocol_General_Status (p), c); + case protocol_General_Status: this->GeneralStatus (Protocol_General_Status (p), c); break; - case protocol_General_Text: this->GeneralText (Protocol_General_Text (p), c); + case protocol_General_Text: this->GeneralText (Protocol_General_Text (p), c); break; - //case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c); - //break; - case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); + case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); break; - //case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c); - //break; - case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c); + case protocol_Lobby_JoinGame: this->LobbyJoin (Protocol_LobbyJoinGame (p), c); break; - case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c); + case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c); break; - case protocol_Lobby_GameData: this->LobbyGameData (Protocol_LobbyGameData (p), c); + case protocol_Lobby_GameData: this->LobbyGameData (Protocol_LobbyGameData (p), c); break; - case protocol_Lobby_ClientData: this->LobbyMainData (Protocol_LobbyClientData (p), c); + case protocol_Lobby_ClientData: this->LobbyMainData (Protocol_LobbyClientData (p), c); break; - case protocol_Lobby_ClientReadyState: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); + case protocol_Lobby_ClientReadyState: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); break; - case protocol_Lobby_QuerryGameType: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); + case protocol_Lobby_QuerryGameType: this->LobbyQuerryGameData (Protocol_QuerryGameType (), c); break; } } @@ -59,37 +55,40 @@ void GameLobby::GeneralStatus(GameLogic::Protocol_General_Status& p, Oyster::Net } void GameLobby::GeneralText(GameLogic::Protocol_General_Text& p, Oyster::Network::NetworkClient* c) { + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + if(this->clients[i]) + { + this->clients[i]->Send(p); + } + } printf(p.text.c_str()); } -//void GameLobby::LobbyCreateGame(GameLogic::Protocol_LobbyCreateGame& p, Oyster::Network::NetworkClient* c) -//{ -// -//} void GameLobby::LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c) { if(this->sessionOwner->GetClient()->GetID() == c->GetID()) { - + //Send countdown timer before lobby shuts down + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + this->clients[i]->Send(Protocol_LobbyStartGame(3.0f)); + } } else { //Someone else tried to start the server.. } } -//void GameLobby::LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c) -//{ -// //for (unsigned int i = 0; i < this->gameLobby.Size(); i++) -// //{ -// // if (this->gameLobby[i]->GetID() == p.value) -// // { -// // this->gameLobby[i]->Attach(Detach(c)); -// // return; -// // } -// //} -//} -void GameLobby::LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c) +void GameLobby::LobbyJoin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c) { - + //for (unsigned int i = 0; i < this->gameLobby.Size(); i++) + //{ + // if (this->gameLobby[i]->GetID() == p.value) + // { + // this->gameLobby[i]->Attach(Detach(c)); + // return; + // } + //} } void GameLobby::LobbyRefresh(GameLogic::Protocol_LobbyRefresh& p, Oyster::Network::NetworkClient* c) { @@ -112,6 +111,7 @@ void GameLobby::LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster: else { this->readyList.Remove(c); + } } void GameLobby::LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c) diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index ca1572a1..d0cf5190 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -19,11 +19,8 @@ using namespace Oyster; using namespace Oyster::Network; using namespace Oyster::Thread; using namespace GameLogic; +using namespace DanBias; -namespace DanBias -{ - Utility::WinTimer testTimer; - int testID = -1; bool GameSession::DoWork( ) { @@ -246,7 +243,6 @@ namespace DanBias printf("Message recieved from (%i):\t %s\n", c->GetClient()->GetID(), p.text.c_str()); } -}//End namespace DanBias diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index cf82cc61..cd89dc9a 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -24,217 +24,243 @@ using namespace Oyster; using namespace Oyster::Network; using namespace Oyster::Thread; using namespace GameLogic; +using namespace DanBias; -namespace DanBias +GameSession* GameSession::gameSession = nullptr; + +GameSession::GameSession() + :gameInstance(GameAPI::Instance()) { - GameSession* GameSession::gameSession = nullptr; + this->owner = 0; + this->isCreated = false; + this->isRunning = false; + this->gameSession = this; + this->logicFrameTime = DELTA_TIME_20; + this->networkFrameTime = DELTA_TIME_20; + this->networkTimer.reset(); + this->logicTimer.reset(); - GameSession::GameSession() - :gameInstance(GameAPI::Instance()) + memset(&this->description, 0, sizeof(GameDescription)); +} + +GameSession::~GameSession() +{ + this->worker.Terminate(); + this->clients.Clear(); + this->gameInstance; + this->owner = 0; + this->isCreated = false; + this->isRunning = false; +} + +bool GameSession::Create(GameDescription& desc) +{ + this->description = desc; +/* Do some error checking */ + if(desc.clients.Size() == 0) return false; + if(!desc.owner) return false; + if(this->isCreated) return false; + +/* standard initialization of some data */ + NetworkSession::clients = desc.clients; + NetworkSession::clients.Resize((unsigned int)desc.maxClients); + this->clients.Resize((unsigned int)desc.maxClients); + this->owner = desc.owner; + +/* Initiate the game instance */ + if(!this->gameInstance.Initiate()) { - this->owner = 0; - this->isCreated = false; - this->isRunning = false; - this->gameSession = this; - this->logicFrameTime = DELTA_TIME_20; - this->networkFrameTime = DELTA_TIME_20; - this->networkTimer.reset(); - this->logicTimer.reset(); - - memset(&this->description, 0, sizeof(GameDescription)); + printf("Failed to initiate the game instance\n"); } - GameSession::~GameSession() +/* Create the players in the game instance */ + GameLogic::IPlayerData* p = 0; + for (unsigned int i = 0; i < desc.clients.Size(); i++) { - this->worker.Terminate(); - this->clients.Clear(); - this->gameInstance; - this->owner = 0; - this->isCreated = false; - this->isRunning = false; - } - - bool GameSession::Create(GameDescription& desc) - { - this->description = desc; - /* Do some error checking */ - if(desc.clients.Size() == 0) return false; - if(!desc.owner) return false; - if(this->isCreated) return false; - - /* standard initialization of some data */ - NetworkSession::clients = desc.clients; - NetworkSession::clients.Resize((unsigned int)desc.maxClients); - this->clients.Resize((unsigned int)desc.maxClients); - this->owner = desc.owner; - - /* Initiate the game instance */ - if(!this->gameInstance.Initiate()) + if(desc.clients[i]) { - printf("Failed to initiate the game instance\n"); - } - - /* Create the players in the game instance */ - GameLogic::IPlayerData* p = 0; - for (unsigned int i = 0; i < desc.clients.Size(); i++) - { - if(desc.clients[i]) + if( (p = this->gameInstance.CreatePlayer()) ) { - if( (p = this->gameInstance.CreatePlayer()) ) - { - desc.clients[i]->SetOwner(this); - this->clients[i] = (new GameClient(desc.clients[i], p)); - } - else - { - printf("Failed to create player (%i)\n", i); - } + desc.clients[i]->SetOwner(this); + this->clients[i] = (new GameClient(desc.clients[i], p)); + } + else + { + printf("Failed to create player (%i)\n", i); } } - - /* Create the game level */ - if(!(this->levelData = this->gameInstance.CreateLevel())) - { - printf("Level not created!"); - return false; - } - - /* Set some game instance data options */ - this->gameInstance.SetSubscription(GameSession::ObjectMove); - this->gameInstance.SetSubscription(GameSession::ObjectDisabled); - this->gameInstance.SetFPS(60); - - this->description.clients.Clear(); - - this->isCreated = true; - - /* Create the worker thread */ - if(this->worker.Create(this, false) != OYSTER_THREAD_ERROR_SUCCESS) - return false; - - return this->isCreated; } - void GameSession::Run() +/* Create the game level */ + if(!(this->levelData = this->gameInstance.CreateLevel())) { - if(this->isRunning) return; - - if(this->clients.Size() > 0) - { - this->worker.Start(); - this->worker.SetPriority(OYSTER_THREAD_PRIORITY_1); - this->isRunning = true; - } + printf("Level not created!"); + return false; } - void GameSession::ThreadEntry( ) - { - //List with clients that we are waiting on.. - DynamicArray> readyList;// = this->clients; +/* Set some game instance data options */ + this->gameInstance.SetSubscription(GameSession::ObjectMove); + this->gameInstance.SetSubscription(GameSession::ObjectDisabled); + this->gameInstance.SetFPS(60); - //First we need to clean invalid clients, if any, and tell them to start loading game data - for (unsigned int i = 0; i < this->clients.Size(); i++) + this->description.clients.Clear(); + + this->isCreated = true; + + /* Create the worker thread */ + if(this->worker.Create(this, false) != OYSTER_THREAD_ERROR_SUCCESS) + return false; + + return this->isCreated; +} + +void GameSession::Run() +{ + if(this->isRunning) return; + + if(this->clients.Size() > 0) + { + this->worker.Start(); + this->worker.SetPriority(OYSTER_THREAD_PRIORITY_1); + this->isRunning = true; + } +} + +void GameSession::ThreadEntry( ) +{ +//List with clients that we are waiting on.. + DynamicArray> readyList;// = this->clients; + +//First we need to clean invalid clients, if any, and tell them to start loading game data + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + if(this->clients[i]) { - if(this->clients[i]) - { - if(this->clients[i]->IsReady()) - { - readyList.Push(this->clients[i]); - Protocol_LobbyCreateGame p(readyList[i]->GetPlayer()->GetID(), "char_white.dan", readyList[i]->GetPlayer()->GetOrientation()); - readyList[readyList.Size() - 1]->GetClient()->Send(p); - } - } + readyList.Push(this->clients[i]); + Protocol_LobbyCreateGame p((char)1, (char)0, this->description.mapName); + readyList[readyList.Size() - 1]->GetClient()->Send(p); } + } - unsigned int readyCounter = readyList.Size(); + unsigned int readyCounter = readyList.Size(); - //Sync with clients - while (readyCounter != 0) +//Sync with clients + while (readyCounter != 0) + { + this->ProcessClients(); + for (unsigned int i = 0; i < readyList.Size(); i++) { - this->ProcessClients(); - for (unsigned int i = 0; i < readyList.Size(); i++) + if(readyList[i] && readyList[i]->IsReady()) { - if(readyList[i] && readyList[i]->IsReady()) + //Need to send information about other players, to all players + for (unsigned int k = 0; k < this->clients.Size(); k++) { - //Need to send information about other players, to all players - for (unsigned int k = 0; k < this->clients.Size(); k++) + if((this->clients[k] && readyList[i]) && readyList[i]->GetClient()->GetID() != this->clients[k]->GetClient()->GetID()) { - if((this->clients[k] && readyList[i]) && readyList[i]->GetClient()->GetID() != this->clients[k]->GetClient()->GetID()) - { - //Protocol_ObjectCreatePlayer - Protocol_ObjectCreate p( this->clients[k]->GetPlayer()->GetPosition(), - this->clients[k]->GetPlayer()->GetRotation(), - this->clients[k]->GetPlayer()->GetScale(), - this->clients[k]->GetPlayer()->GetID(), "char_white.dan"); //The model name will be custom later.. - readyList[i]->GetClient()->Send(p); - } + IPlayerData* pl = this->clients[k]->GetPlayer(); + Protocol_ObjectCreatePlayer p( pl->GetPosition(), pl->GetRotation(), pl->GetScale(), + pl->GetID(), true, this->clients[k]->GetPlayer()->GetTeamID(), + /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + readyList[i]->GetClient()->Send(p); } - - readyCounter-- ; - readyList[i] = 0; } + + readyCounter-- ; + readyList[i] = 0; } - Sleep(5); //TODO: This might not be needed here. } + Sleep(5); //TODO: This might not be needed here. + } +//Sync with clients before starting countdown + + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + if(this->clients[i]) + { + this->clients[i]->GetClient()->Send(GameLogic::Protocol_LobbyStartGame(5)); + } + } +} + +bool GameSession::Attach(Utility::DynamicMemory::SmartPointer networkClient) +{ + if(!this->isCreated) return false; + if(this->GetClientCount() == this->clients.Capacity()) return false; + + networkClient->SetOwner(this); + + IPlayerData* playerData = this->gameInstance.CreatePlayer(); + if(!playerData) return false; + + SmartPointer gameClient = new GameClient(networkClient, playerData); + NetworkClient* nwClient = gameClient->GetClient(); + +// Send the level information + { + Protocol_LobbyCreateGame lcg((char)1, (char)0, this->description.mapName); + nwClient->Send(lcg); + } + +// Send the player data only + { + Protocol_ObjectCreatePlayer oc( playerData->GetPosition(), playerData->GetRotation(), playerData->GetScale(), + playerData->GetID(), true, playerData->GetTeamID(), + /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + nwClient->Send(oc); + } + +// Send information about other clients + { for (unsigned int i = 0; i < this->clients.Size(); i++) { - if(this->clients[i]) + if(clients[i]) { - this->clients[i]->GetClient()->Send(GameLogic::Protocol_LobbyStartGame(5)); + IPlayerData* temp = clients[i]->GetPlayer(); + Protocol_ObjectCreatePlayer oc( temp->GetPosition(), temp->GetRotation(), temp->GetScale(), + temp->GetID(), false, temp->GetTeamID(), + /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + nwClient->Send(oc); } } } - bool GameSession::Attach(Utility::DynamicMemory::SmartPointer client) +//TODO: Need to be able to get the current gameplay data from the logic, to sync it with the client { - if(!this->isCreated) return false; - if(this->GetClientCount() == this->clients.Capacity()) return false; - client->SetOwner(this); + } - IPlayerData* player = this->gameInstance.CreatePlayer(); - if(!player) return false; - - SmartPointer obj = new GameClient(client, player); - - // Send the chosen mesh name - Protocol_LobbyCreateGame lcg(obj->GetPlayer()->GetID(), "char_white.dan", obj->GetPlayer()->GetOrientation()); - obj->GetClient()->Send(lcg); - - // Send the player data only - for (unsigned int i = 0; i < this->clients.Capacity(); i++) - { - if(this->clients[i]) - { - IPlayerData* p = this->clients[i]->GetPlayer(); - Protocol_ObjectCreate oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); - //Protocol_ObjectCreatePlayer oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); - this->clients[i]->GetClient()->Send(oc); - } - } - - obj->GetClient()->Send(GameLogic::Protocol_LobbyStartGame(0)); - - for (unsigned int i = 0; i < this->clients.Size(); i++) +// Insert the new client to the update list + { + bool added = false; + for (unsigned int i = 0; !added && i < this->clients.Size(); i++) { if(!clients[i]) { - NetworkSession::clients[i] = client; - clients[i] = obj; - return true; + NetworkSession::clients[i] = networkClient; + clients[i] = gameClient; + added = true; } } - - return true; + if(!added) + { + NetworkSession::clients.Push( networkClient ); + clients.Push( gameClient ); + } } - - void GameSession::CloseSession( bool dissconnectClients ) +// Send the start signal { - this->worker.Terminate(); - NetworkSession::CloseSession(true); - this->clients.Clear(); + nwClient->Send(GameLogic::Protocol_LobbyStartGame(0)); } -}//End namespace DanBias + return true; +} + +void GameSession::CloseSession( bool dissconnectClients ) +{ + this->worker.Terminate(); + NetworkSession::CloseSession(true); + this->clients.Clear(); +} + diff --git a/Code/Network/NetworkAPI/NetworkClient.h b/Code/Network/NetworkAPI/NetworkClient.h index 58d81360..6f037117 100644 --- a/Code/Network/NetworkAPI/NetworkClient.h +++ b/Code/Network/NetworkAPI/NetworkClient.h @@ -133,13 +133,7 @@ namespace Oyster */ virtual void DataRecieved(NetEvent e); - /** ! Deprecate ! - * Do not use this furthermore, instead use void DataRecieved(NetEvent e); - * @see DataRecieved - */ - //virtual void NetworkCallback(Oyster::Network::CustomNetProtocol& p); - - virtual std::string GetIpAddress(); + std::string GetIpAddress(); private: NetworkClient(const NetworkClient& obj); From a36a26721deb35b47242e3f21ac71f7839d1d2cc Mon Sep 17 00:00:00 2001 From: Robin Engman Date: Tue, 18 Feb 2014 10:12:21 +0100 Subject: [PATCH 11/46] Added pre support for loading mesh shapes Will be used for triangle collision --- .../BulletFileLoader/CMakeLists.txt | 49 + .../BulletFileLoader/autogenerated/bullet.h | 1228 +++++++++++ .../Bullet Source/BulletFileLoader/bChunk.cpp | 75 + .../Bullet Source/BulletFileLoader/bChunk.h | 92 + .../Bullet Source/BulletFileLoader/bCommon.h | 39 + .../Bullet Source/BulletFileLoader/bDNA.cpp | 644 ++++++ .../Bullet Source/BulletFileLoader/bDNA.h | 110 + .../Bullet Source/BulletFileLoader/bDefines.h | 140 ++ .../Bullet Source/BulletFileLoader/bFile.cpp | 1757 +++++++++++++++ .../Bullet Source/BulletFileLoader/bFile.h | 165 ++ .../BulletFileLoader/btBulletFile.cpp | 423 ++++ .../BulletFileLoader/btBulletFile.h | 83 + .../BulletFileLoader/premake4.lua | 12 + .../BulletWorldImporter/CMakeLists.txt | 40 + .../btBulletWorldImporter.cpp | 362 ++++ .../btBulletWorldImporter.h | 68 + .../BulletWorldImporter/btWorldImporter.cpp | 1922 +++++++++++++++++ .../BulletWorldImporter/btWorldImporter.h | 212 ++ .../BulletWorldImporter/premake4.lua | 13 + Code/Physics/GamePhysics/GamePhysics.vcxproj | 8 +- .../Implementation/PhysicsAPI_Impl.cpp | 66 +- .../Implementation/PhysicsAPI_Impl.h | 2 + .../Implementation/SimpleRigidBody.cpp | 6 +- Code/Physics/GamePhysics/PhysicsAPI.h | 2 + 24 files changed, 7504 insertions(+), 14 deletions(-) create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/CMakeLists.txt create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/autogenerated/bullet.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bChunk.cpp create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bChunk.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bCommon.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bDNA.cpp create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bDNA.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bDefines.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bFile.cpp create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/bFile.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.cpp create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.h create mode 100644 Code/Physics/Bullet Source/BulletFileLoader/premake4.lua create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/CMakeLists.txt create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.cpp create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.h create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.cpp create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.h create mode 100644 Code/Physics/Bullet Source/BulletWorldImporter/premake4.lua diff --git a/Code/Physics/Bullet Source/BulletFileLoader/CMakeLists.txt b/Code/Physics/Bullet Source/BulletFileLoader/CMakeLists.txt new file mode 100644 index 00000000..51e33e44 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/CMakeLists.txt @@ -0,0 +1,49 @@ +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src +) + +SET(BulletFileLoader_SRCS +bChunk.cpp +bDNA.cpp +bFile.cpp +btBulletFile.cpp +) + +SET(BulletFileLoader_HDRS +bChunk.h +bCommon.h +bDefines.h +bDNA.h +bFile.h +btBulletFile.h +) + +ADD_LIBRARY(BulletFileLoader ${BulletFileLoader_SRCS} ${BulletFileLoader_HDRS}) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(BulletFileLoader LinearMath) +ENDIF (BUILD_SHARED_LIBS) + +SET_TARGET_PROPERTIES(BulletFileLoader PROPERTIES VERSION ${BULLET_VERSION}) +SET_TARGET_PROPERTIES(BulletFileLoader PROPERTIES SOVERSION ${BULLET_VERSION}) + +IF (INSTALL_EXTRA_LIBS) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + #FILES_MATCHING requires CMake 2.6 + IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletFileLoader DESTINATION .) + ELSE (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletFileLoader DESTINATION lib${LIB_SUFFIX}) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.h" PATTERN +".svn" EXCLUDE PATTERN "CMakeFiles" EXCLUDE) + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + SET_TARGET_PROPERTIES(BulletFileLoader PROPERTIES FRAMEWORK true) + SET_TARGET_PROPERTIES(BulletFileLoader PROPERTIES PUBLIC_HEADER "${BulletFileLoader_HDRS}") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF (INSTALL_EXTRA_LIBS) diff --git a/Code/Physics/Bullet Source/BulletFileLoader/autogenerated/bullet.h b/Code/Physics/Bullet Source/BulletFileLoader/autogenerated/bullet.h new file mode 100644 index 00000000..2fe1d7fc --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/autogenerated/bullet.h @@ -0,0 +1,1228 @@ +/* Copyright (C) 2011 Erwin Coumans & Charlie C +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ +// Auto generated from Bullet/Extras/HeaderGenerator/bulletGenerate.py +#ifndef __BULLET_H__ +#define __BULLET_H__ +namespace Bullet { + +// put an empty struct in the case +typedef struct bInvalidHandle { + int unused; +}bInvalidHandle; + + class PointerArray; + class btPhysicsSystem; + class ListBase; + class btVector3FloatData; + class btVector3DoubleData; + class btMatrix3x3FloatData; + class btMatrix3x3DoubleData; + class btTransformFloatData; + class btTransformDoubleData; + class btBvhSubtreeInfoData; + class btOptimizedBvhNodeFloatData; + class btOptimizedBvhNodeDoubleData; + class btQuantizedBvhNodeData; + class btQuantizedBvhFloatData; + class btQuantizedBvhDoubleData; + class btCollisionShapeData; + class btStaticPlaneShapeData; + class btConvexInternalShapeData; + class btPositionAndRadius; + class btMultiSphereShapeData; + class btIntIndexData; + class btShortIntIndexData; + class btShortIntIndexTripletData; + class btCharIndexTripletData; + class btMeshPartData; + class btStridingMeshInterfaceData; + class btTriangleMeshShapeData; + class btScaledTriangleMeshShapeData; + class btCompoundShapeChildData; + class btCompoundShapeData; + class btCylinderShapeData; + class btConeShapeData; + class btCapsuleShapeData; + class btTriangleInfoData; + class btTriangleInfoMapData; + class btGImpactMeshShapeData; + class btConvexHullShapeData; + class btCollisionObjectDoubleData; + class btCollisionObjectFloatData; + class btDynamicsWorldDoubleData; + class btDynamicsWorldFloatData; + class btRigidBodyFloatData; + class btRigidBodyDoubleData; + class btConstraintInfo1; + class btTypedConstraintFloatData; + class btTypedConstraintData; + class btTypedConstraintDoubleData; + class btPoint2PointConstraintFloatData; + class btPoint2PointConstraintDoubleData2; + class btPoint2PointConstraintDoubleData; + class btHingeConstraintDoubleData; + class btHingeConstraintFloatData; + class btHingeConstraintDoubleData2; + class btConeTwistConstraintDoubleData; + class btConeTwistConstraintData; + class btGeneric6DofConstraintData; + class btGeneric6DofConstraintDoubleData2; + class btGeneric6DofSpringConstraintData; + class btGeneric6DofSpringConstraintDoubleData2; + class btSliderConstraintData; + class btSliderConstraintDoubleData; + class btGearConstraintFloatData; + class btGearConstraintDoubleData; + class btContactSolverInfoDoubleData; + class btContactSolverInfoFloatData; + class SoftBodyMaterialData; + class SoftBodyNodeData; + class SoftBodyLinkData; + class SoftBodyFaceData; + class SoftBodyTetraData; + class SoftRigidAnchorData; + class SoftBodyConfigData; + class SoftBodyPoseData; + class SoftBodyClusterData; + class btSoftBodyJointData; + class btSoftBodyFloatData; +// -------------------------------------------------- // + class PointerArray + { + public: + int m_size; + int m_capacity; + void *m_data; + }; + + +// -------------------------------------------------- // + class btPhysicsSystem + { + public: + PointerArray m_collisionShapes; + PointerArray m_collisionObjects; + PointerArray m_constraints; + }; + + +// -------------------------------------------------- // + class ListBase + { + public: + void *first; + void *last; + }; + + +// -------------------------------------------------- // + class btVector3FloatData + { + public: + float m_floats[4]; + }; + + +// -------------------------------------------------- // + class btVector3DoubleData + { + public: + double m_floats[4]; + }; + + +// -------------------------------------------------- // + class btMatrix3x3FloatData + { + public: + btVector3FloatData m_el[3]; + }; + + +// -------------------------------------------------- // + class btMatrix3x3DoubleData + { + public: + btVector3DoubleData m_el[3]; + }; + + +// -------------------------------------------------- // + class btTransformFloatData + { + public: + btMatrix3x3FloatData m_basis; + btVector3FloatData m_origin; + }; + + +// -------------------------------------------------- // + class btTransformDoubleData + { + public: + btMatrix3x3DoubleData m_basis; + btVector3DoubleData m_origin; + }; + + +// -------------------------------------------------- // + class btBvhSubtreeInfoData + { + public: + int m_rootNodeIndex; + int m_subtreeSize; + short m_quantizedAabbMin[3]; + short m_quantizedAabbMax[3]; + }; + + +// -------------------------------------------------- // + class btOptimizedBvhNodeFloatData + { + public: + btVector3FloatData m_aabbMinOrg; + btVector3FloatData m_aabbMaxOrg; + int m_escapeIndex; + int m_subPart; + int m_triangleIndex; + char m_pad[4]; + }; + + +// -------------------------------------------------- // + class btOptimizedBvhNodeDoubleData + { + public: + btVector3DoubleData m_aabbMinOrg; + btVector3DoubleData m_aabbMaxOrg; + int m_escapeIndex; + int m_subPart; + int m_triangleIndex; + char m_pad[4]; + }; + + +// -------------------------------------------------- // + class btQuantizedBvhNodeData + { + public: + short m_quantizedAabbMin[3]; + short m_quantizedAabbMax[3]; + int m_escapeIndexOrTriangleIndex; + }; + + +// -------------------------------------------------- // + class btQuantizedBvhFloatData + { + public: + btVector3FloatData m_bvhAabbMin; + btVector3FloatData m_bvhAabbMax; + btVector3FloatData m_bvhQuantization; + int m_curNodeIndex; + int m_useQuantization; + int m_numContiguousLeafNodes; + int m_numQuantizedContiguousNodes; + btOptimizedBvhNodeFloatData *m_contiguousNodesPtr; + btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; + btBvhSubtreeInfoData *m_subTreeInfoPtr; + int m_traversalMode; + int m_numSubtreeHeaders; + }; + + +// -------------------------------------------------- // + class btQuantizedBvhDoubleData + { + public: + btVector3DoubleData m_bvhAabbMin; + btVector3DoubleData m_bvhAabbMax; + btVector3DoubleData m_bvhQuantization; + int m_curNodeIndex; + int m_useQuantization; + int m_numContiguousLeafNodes; + int m_numQuantizedContiguousNodes; + btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr; + btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr; + int m_traversalMode; + int m_numSubtreeHeaders; + btBvhSubtreeInfoData *m_subTreeInfoPtr; + }; + + +// -------------------------------------------------- // + class btCollisionShapeData + { + public: + char *m_name; + int m_shapeType; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btStaticPlaneShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btVector3FloatData m_localScaling; + btVector3FloatData m_planeNormal; + float m_planeConstant; + char m_pad[4]; + }; + + +// -------------------------------------------------- // + class btConvexInternalShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btVector3FloatData m_localScaling; + btVector3FloatData m_implicitShapeDimensions; + float m_collisionMargin; + int m_padding; + }; + + +// -------------------------------------------------- // + class btPositionAndRadius + { + public: + btVector3FloatData m_pos; + float m_radius; + }; + + +// -------------------------------------------------- // + class btMultiSphereShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + btPositionAndRadius *m_localPositionArrayPtr; + int m_localPositionArraySize; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btIntIndexData + { + public: + int m_value; + }; + + +// -------------------------------------------------- // + class btShortIntIndexData + { + public: + short m_value; + char m_pad[2]; + }; + + +// -------------------------------------------------- // + class btShortIntIndexTripletData + { + public: + short m_values[3]; + char m_pad[2]; + }; + + +// -------------------------------------------------- // + class btCharIndexTripletData + { + public: + char m_values[3]; + char m_pad; + }; + + +// -------------------------------------------------- // + class btMeshPartData + { + public: + btVector3FloatData *m_vertices3f; + btVector3DoubleData *m_vertices3d; + btIntIndexData *m_indices32; + btShortIntIndexTripletData *m_3indices16; + btCharIndexTripletData *m_3indices8; + btShortIntIndexData *m_indices16; + int m_numTriangles; + int m_numVertices; + }; + + +// -------------------------------------------------- // + class btStridingMeshInterfaceData + { + public: + btMeshPartData *m_meshPartsPtr; + btVector3FloatData m_scaling; + int m_numMeshParts; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btTriangleMeshShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btStridingMeshInterfaceData m_meshInterface; + btQuantizedBvhFloatData *m_quantizedFloatBvh; + btQuantizedBvhDoubleData *m_quantizedDoubleBvh; + btTriangleInfoMapData *m_triangleInfoMap; + float m_collisionMargin; + char m_pad3[4]; + }; + + +// -------------------------------------------------- // + class btScaledTriangleMeshShapeData + { + public: + btTriangleMeshShapeData m_trimeshShapeData; + btVector3FloatData m_localScaling; + }; + + +// -------------------------------------------------- // + class btCompoundShapeChildData + { + public: + btTransformFloatData m_transform; + btCollisionShapeData *m_childShape; + int m_childShapeType; + float m_childMargin; + }; + + +// -------------------------------------------------- // + class btCompoundShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btCompoundShapeChildData *m_childShapePtr; + int m_numChildShapes; + float m_collisionMargin; + }; + + +// -------------------------------------------------- // + class btCylinderShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + int m_upAxis; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btConeShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + int m_upIndex; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btCapsuleShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + int m_upAxis; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btTriangleInfoData + { + public: + int m_flags; + float m_edgeV0V1Angle; + float m_edgeV1V2Angle; + float m_edgeV2V0Angle; + }; + + +// -------------------------------------------------- // + class btTriangleInfoMapData + { + public: + int *m_hashTablePtr; + int *m_nextPtr; + btTriangleInfoData *m_valueArrayPtr; + int *m_keyArrayPtr; + float m_convexEpsilon; + float m_planarEpsilon; + float m_equalVertexThreshold; + float m_edgeDistanceThreshold; + float m_zeroAreaThreshold; + int m_nextSize; + int m_hashTableSize; + int m_numValues; + int m_numKeys; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btGImpactMeshShapeData + { + public: + btCollisionShapeData m_collisionShapeData; + btStridingMeshInterfaceData m_meshInterface; + btVector3FloatData m_localScaling; + float m_collisionMargin; + int m_gimpactSubType; + }; + + +// -------------------------------------------------- // + class btConvexHullShapeData + { + public: + btConvexInternalShapeData m_convexInternalShapeData; + btVector3FloatData *m_unscaledPointsFloatPtr; + btVector3DoubleData *m_unscaledPointsDoublePtr; + int m_numUnscaledPoints; + char m_padding3[4]; + }; + + +// -------------------------------------------------- // + class btCollisionObjectDoubleData + { + public: + void *m_broadphaseHandle; + void *m_collisionShape; + btCollisionShapeData *m_rootCollisionShape; + char *m_name; + btTransformDoubleData m_worldTransform; + btTransformDoubleData m_interpolationWorldTransform; + btVector3DoubleData m_interpolationLinearVelocity; + btVector3DoubleData m_interpolationAngularVelocity; + btVector3DoubleData m_anisotropicFriction; + double m_contactProcessingThreshold; + double m_deactivationTime; + double m_friction; + double m_rollingFriction; + double m_restitution; + double m_hitFraction; + double m_ccdSweptSphereRadius; + double m_ccdMotionThreshold; + int m_hasAnisotropicFriction; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + int m_internalType; + int m_checkCollideWith; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btCollisionObjectFloatData + { + public: + void *m_broadphaseHandle; + void *m_collisionShape; + btCollisionShapeData *m_rootCollisionShape; + char *m_name; + btTransformFloatData m_worldTransform; + btTransformFloatData m_interpolationWorldTransform; + btVector3FloatData m_interpolationLinearVelocity; + btVector3FloatData m_interpolationAngularVelocity; + btVector3FloatData m_anisotropicFriction; + float m_contactProcessingThreshold; + float m_deactivationTime; + float m_friction; + float m_rollingFriction; + float m_restitution; + float m_hitFraction; + float m_ccdSweptSphereRadius; + float m_ccdMotionThreshold; + int m_hasAnisotropicFriction; + int m_collisionFlags; + int m_islandTag1; + int m_companionId; + int m_activationState1; + int m_internalType; + int m_checkCollideWith; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btDynamicsWorldDoubleData + { + public: + btContactSolverInfoDoubleData m_solverInfo; + btVector3DoubleData m_gravity; + }; + + +// -------------------------------------------------- // + class btDynamicsWorldFloatData + { + public: + btContactSolverInfoFloatData m_solverInfo; + btVector3FloatData m_gravity; + }; + + +// -------------------------------------------------- // + class btRigidBodyFloatData + { + public: + btCollisionObjectFloatData m_collisionObjectData; + btMatrix3x3FloatData m_invInertiaTensorWorld; + btVector3FloatData m_linearVelocity; + btVector3FloatData m_angularVelocity; + btVector3FloatData m_angularFactor; + btVector3FloatData m_linearFactor; + btVector3FloatData m_gravity; + btVector3FloatData m_gravity_acceleration; + btVector3FloatData m_invInertiaLocal; + btVector3FloatData m_totalForce; + btVector3FloatData m_totalTorque; + float m_inverseMass; + float m_linearDamping; + float m_angularDamping; + float m_additionalDampingFactor; + float m_additionalLinearDampingThresholdSqr; + float m_additionalAngularDampingThresholdSqr; + float m_additionalAngularDampingFactor; + float m_linearSleepingThreshold; + float m_angularSleepingThreshold; + int m_additionalDamping; + }; + + +// -------------------------------------------------- // + class btRigidBodyDoubleData + { + public: + btCollisionObjectDoubleData m_collisionObjectData; + btMatrix3x3DoubleData m_invInertiaTensorWorld; + btVector3DoubleData m_linearVelocity; + btVector3DoubleData m_angularVelocity; + btVector3DoubleData m_angularFactor; + btVector3DoubleData m_linearFactor; + btVector3DoubleData m_gravity; + btVector3DoubleData m_gravity_acceleration; + btVector3DoubleData m_invInertiaLocal; + btVector3DoubleData m_totalForce; + btVector3DoubleData m_totalTorque; + double m_inverseMass; + double m_linearDamping; + double m_angularDamping; + double m_additionalDampingFactor; + double m_additionalLinearDampingThresholdSqr; + double m_additionalAngularDampingThresholdSqr; + double m_additionalAngularDampingFactor; + double m_linearSleepingThreshold; + double m_angularSleepingThreshold; + int m_additionalDamping; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btConstraintInfo1 + { + public: + int m_numConstraintRows; + int nub; + }; + + +// -------------------------------------------------- // + class btTypedConstraintFloatData + { + public: + btRigidBodyFloatData *m_rbA; + btRigidBodyFloatData *m_rbB; + char *m_name; + int m_objectType; + int m_userConstraintType; + int m_userConstraintId; + int m_needsFeedback; + float m_appliedImpulse; + float m_dbgDrawSize; + int m_disableCollisionsBetweenLinkedBodies; + int m_overrideNumSolverIterations; + float m_breakingImpulseThreshold; + int m_isEnabled; + }; + + +// -------------------------------------------------- // + class btTypedConstraintData + { + public: + bInvalidHandle *m_rbA; + bInvalidHandle *m_rbB; + char *m_name; + int m_objectType; + int m_userConstraintType; + int m_userConstraintId; + int m_needsFeedback; + float m_appliedImpulse; + float m_dbgDrawSize; + int m_disableCollisionsBetweenLinkedBodies; + int m_overrideNumSolverIterations; + float m_breakingImpulseThreshold; + int m_isEnabled; + }; + + +// -------------------------------------------------- // + class btTypedConstraintDoubleData + { + public: + btRigidBodyDoubleData *m_rbA; + btRigidBodyDoubleData *m_rbB; + char *m_name; + int m_objectType; + int m_userConstraintType; + int m_userConstraintId; + int m_needsFeedback; + double m_appliedImpulse; + double m_dbgDrawSize; + int m_disableCollisionsBetweenLinkedBodies; + int m_overrideNumSolverIterations; + double m_breakingImpulseThreshold; + int m_isEnabled; + char padding[4]; + }; + + +// -------------------------------------------------- // + class btPoint2PointConstraintFloatData + { + public: + btTypedConstraintData m_typeConstraintData; + btVector3FloatData m_pivotInA; + btVector3FloatData m_pivotInB; + }; + + +// -------------------------------------------------- // + class btPoint2PointConstraintDoubleData2 + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btVector3DoubleData m_pivotInA; + btVector3DoubleData m_pivotInB; + }; + + +// -------------------------------------------------- // + class btPoint2PointConstraintDoubleData + { + public: + btTypedConstraintData m_typeConstraintData; + btVector3DoubleData m_pivotInA; + btVector3DoubleData m_pivotInB; + }; + + +// -------------------------------------------------- // + class btHingeConstraintDoubleData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + int m_useReferenceFrameA; + int m_angularOnly; + int m_enableAngularMotor; + float m_motorTargetVelocity; + float m_maxMotorImpulse; + float m_lowerLimit; + float m_upperLimit; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + }; + + +// -------------------------------------------------- // + class btHingeConstraintFloatData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + int m_useReferenceFrameA; + int m_angularOnly; + int m_enableAngularMotor; + float m_motorTargetVelocity; + float m_maxMotorImpulse; + float m_lowerLimit; + float m_upperLimit; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + }; + + +// -------------------------------------------------- // + class btHingeConstraintDoubleData2 + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + int m_useReferenceFrameA; + int m_angularOnly; + int m_enableAngularMotor; + double m_motorTargetVelocity; + double m_maxMotorImpulse; + double m_lowerLimit; + double m_upperLimit; + double m_limitSoftness; + double m_biasFactor; + double m_relaxationFactor; + char m_padding1[4]; + }; + + +// -------------------------------------------------- // + class btConeTwistConstraintDoubleData + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + double m_swingSpan1; + double m_swingSpan2; + double m_twistSpan; + double m_limitSoftness; + double m_biasFactor; + double m_relaxationFactor; + double m_damping; + }; + + +// -------------------------------------------------- // + class btConeTwistConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + float m_swingSpan1; + float m_swingSpan2; + float m_twistSpan; + float m_limitSoftness; + float m_biasFactor; + float m_relaxationFactor; + float m_damping; + char m_pad[4]; + }; + + +// -------------------------------------------------- // + class btGeneric6DofConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + btVector3FloatData m_linearUpperLimit; + btVector3FloatData m_linearLowerLimit; + btVector3FloatData m_angularUpperLimit; + btVector3FloatData m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; + + +// -------------------------------------------------- // + class btGeneric6DofConstraintDoubleData2 + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + btVector3DoubleData m_linearUpperLimit; + btVector3DoubleData m_linearLowerLimit; + btVector3DoubleData m_angularUpperLimit; + btVector3DoubleData m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; + + +// -------------------------------------------------- // + class btGeneric6DofSpringConstraintData + { + public: + btGeneric6DofConstraintData m_6dofData; + int m_springEnabled[6]; + float m_equilibriumPoint[6]; + float m_springStiffness[6]; + float m_springDamping[6]; + }; + + +// -------------------------------------------------- // + class btGeneric6DofSpringConstraintDoubleData2 + { + public: + btGeneric6DofConstraintDoubleData2 m_6dofData; + int m_springEnabled[6]; + double m_equilibriumPoint[6]; + double m_springStiffness[6]; + double m_springDamping[6]; + }; + + +// -------------------------------------------------- // + class btSliderConstraintData + { + public: + btTypedConstraintData m_typeConstraintData; + btTransformFloatData m_rbAFrame; + btTransformFloatData m_rbBFrame; + float m_linearUpperLimit; + float m_linearLowerLimit; + float m_angularUpperLimit; + float m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; + + +// -------------------------------------------------- // + class btSliderConstraintDoubleData + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btTransformDoubleData m_rbAFrame; + btTransformDoubleData m_rbBFrame; + double m_linearUpperLimit; + double m_linearLowerLimit; + double m_angularUpperLimit; + double m_angularLowerLimit; + int m_useLinearReferenceFrameA; + int m_useOffsetForConstraintFrame; + }; + + +// -------------------------------------------------- // + class btGearConstraintFloatData + { + public: + btTypedConstraintFloatData m_typeConstraintData; + btVector3FloatData m_axisInA; + btVector3FloatData m_axisInB; + float m_ratio; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btGearConstraintDoubleData + { + public: + btTypedConstraintDoubleData m_typeConstraintData; + btVector3DoubleData m_axisInA; + btVector3DoubleData m_axisInB; + double m_ratio; + }; + + +// -------------------------------------------------- // + class btContactSolverInfoDoubleData + { + public: + double m_tau; + double m_damping; + double m_friction; + double m_timeStep; + double m_restitution; + double m_maxErrorReduction; + double m_sor; + double m_erp; + double m_erp2; + double m_globalCfm; + double m_splitImpulsePenetrationThreshold; + double m_splitImpulseTurnErp; + double m_linearSlop; + double m_warmstartingFactor; + double m_maxGyroscopicForce; + double m_singleAxisRollingFrictionThreshold; + int m_numIterations; + int m_solverMode; + int m_restingContactRestitutionThreshold; + int m_minimumSolverBatchSize; + int m_splitImpulse; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class btContactSolverInfoFloatData + { + public: + float m_tau; + float m_damping; + float m_friction; + float m_timeStep; + float m_restitution; + float m_maxErrorReduction; + float m_sor; + float m_erp; + float m_erp2; + float m_globalCfm; + float m_splitImpulsePenetrationThreshold; + float m_splitImpulseTurnErp; + float m_linearSlop; + float m_warmstartingFactor; + float m_maxGyroscopicForce; + float m_singleAxisRollingFrictionThreshold; + int m_numIterations; + int m_solverMode; + int m_restingContactRestitutionThreshold; + int m_minimumSolverBatchSize; + int m_splitImpulse; + char m_padding[4]; + }; + + +// -------------------------------------------------- // + class SoftBodyMaterialData + { + public: + float m_linearStiffness; + float m_angularStiffness; + float m_volumeStiffness; + int m_flags; + }; + + +// -------------------------------------------------- // + class SoftBodyNodeData + { + public: + SoftBodyMaterialData *m_material; + btVector3FloatData m_position; + btVector3FloatData m_previousPosition; + btVector3FloatData m_velocity; + btVector3FloatData m_accumulatedForce; + btVector3FloatData m_normal; + float m_inverseMass; + float m_area; + int m_attach; + int m_pad; + }; + + +// -------------------------------------------------- // + class SoftBodyLinkData + { + public: + SoftBodyMaterialData *m_material; + int m_nodeIndices[2]; + float m_restLength; + int m_bbending; + }; + + +// -------------------------------------------------- // + class SoftBodyFaceData + { + public: + btVector3FloatData m_normal; + SoftBodyMaterialData *m_material; + int m_nodeIndices[3]; + float m_restArea; + }; + + +// -------------------------------------------------- // + class SoftBodyTetraData + { + public: + btVector3FloatData m_c0[4]; + SoftBodyMaterialData *m_material; + int m_nodeIndices[4]; + float m_restVolume; + float m_c1; + float m_c2; + int m_pad; + }; + + +// -------------------------------------------------- // + class SoftRigidAnchorData + { + public: + btMatrix3x3FloatData m_c0; + btVector3FloatData m_c1; + btVector3FloatData m_localFrame; + bInvalidHandle *m_rigidBody; + int m_nodeIndex; + float m_c2; + }; + + +// -------------------------------------------------- // + class SoftBodyConfigData + { + public: + int m_aeroModel; + float m_baumgarte; + float m_damping; + float m_drag; + float m_lift; + float m_pressure; + float m_volume; + float m_dynamicFriction; + float m_poseMatch; + float m_rigidContactHardness; + float m_kineticContactHardness; + float m_softContactHardness; + float m_anchorHardness; + float m_softRigidClusterHardness; + float m_softKineticClusterHardness; + float m_softSoftClusterHardness; + float m_softRigidClusterImpulseSplit; + float m_softKineticClusterImpulseSplit; + float m_softSoftClusterImpulseSplit; + float m_maxVolume; + float m_timeScale; + int m_velocityIterations; + int m_positionIterations; + int m_driftIterations; + int m_clusterIterations; + int m_collisionFlags; + }; + + +// -------------------------------------------------- // + class SoftBodyPoseData + { + public: + btMatrix3x3FloatData m_rot; + btMatrix3x3FloatData m_scale; + btMatrix3x3FloatData m_aqq; + btVector3FloatData m_com; + btVector3FloatData *m_positions; + float *m_weights; + int m_numPositions; + int m_numWeigts; + int m_bvolume; + int m_bframe; + float m_restVolume; + int m_pad; + }; + + +// -------------------------------------------------- // + class SoftBodyClusterData + { + public: + btTransformFloatData m_framexform; + btMatrix3x3FloatData m_locii; + btMatrix3x3FloatData m_invwi; + btVector3FloatData m_com; + btVector3FloatData m_vimpulses[2]; + btVector3FloatData m_dimpulses[2]; + btVector3FloatData m_lv; + btVector3FloatData m_av; + btVector3FloatData *m_framerefs; + int *m_nodeIndices; + float *m_masses; + int m_numFrameRefs; + int m_numNodes; + int m_numMasses; + float m_idmass; + float m_imass; + int m_nvimpulses; + int m_ndimpulses; + float m_ndamping; + float m_ldamping; + float m_adamping; + float m_matching; + float m_maxSelfCollisionImpulse; + float m_selfCollisionImpulseFactor; + int m_containsAnchor; + int m_collide; + int m_clusterIndex; + }; + + +// -------------------------------------------------- // + class btSoftBodyJointData + { + public: + void *m_bodyA; + void *m_bodyB; + btVector3FloatData m_refs[2]; + float m_cfm; + float m_erp; + float m_split; + int m_delete; + btVector3FloatData m_relPosition[2]; + int m_bodyAtype; + int m_bodyBtype; + int m_jointType; + int m_pad; + }; + + +// -------------------------------------------------- // + class btSoftBodyFloatData + { + public: + btCollisionObjectFloatData m_collisionObjectData; + SoftBodyPoseData *m_pose; + SoftBodyMaterialData **m_materials; + SoftBodyNodeData *m_nodes; + SoftBodyLinkData *m_links; + SoftBodyFaceData *m_faces; + SoftBodyTetraData *m_tetrahedra; + SoftRigidAnchorData *m_anchors; + SoftBodyClusterData *m_clusters; + btSoftBodyJointData *m_joints; + int m_numMaterials; + int m_numNodes; + int m_numLinks; + int m_numFaces; + int m_numTetrahedra; + int m_numAnchors; + int m_numClusters; + int m_numJoints; + SoftBodyConfigData m_config; + }; + + +} +#endif//__BULLET_H__ \ No newline at end of file diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bChunk.cpp b/Code/Physics/Bullet Source/BulletFileLoader/bChunk.cpp new file mode 100644 index 00000000..564e5507 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bChunk.cpp @@ -0,0 +1,75 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "bChunk.h" +#include "bDefines.h" +#include "bFile.h" + +#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) +#include +#endif +#include + + +using namespace bParse; + + +// ----------------------------------------------------- // +short ChunkUtils::swapShort(short sht) +{ + SWITCH_SHORT(sht); + return sht; +} + +// ----------------------------------------------------- // +int ChunkUtils::swapInt(int inte) +{ + SWITCH_INT(inte); + return inte; +} + +// ----------------------------------------------------- // +long64 ChunkUtils::swapLong64(long64 lng) +{ + SWITCH_LONGINT(lng); + return lng; +} + +// ----------------------------------------------------- // +int ChunkUtils::getOffset(int flags) +{ + // if the file is saved in a + // different format, get the + // file's chunk size + int res = CHUNK_HEADER_LEN; + + if (VOID_IS_8) + { + if (flags &FD_BITS_VARIES) + res = sizeof(bChunkPtr4); + } + else + { + if (flags &FD_BITS_VARIES) + res = sizeof(bChunkPtr8); + } + return res; +} + + + + + +//eof diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bChunk.h b/Code/Physics/Bullet Source/BulletFileLoader/bChunk.h new file mode 100644 index 00000000..77039bcf --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bChunk.h @@ -0,0 +1,92 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BCHUNK_H__ +#define __BCHUNK_H__ + +#if defined (_WIN32) && ! defined (__MINGW32__) + #define long64 __int64 +#elif defined (__MINGW32__) + #include + #define long64 int64_t +#else + #define long64 long long +#endif + + +namespace bParse { + + + // ----------------------------------------------------- // + class bChunkPtr4 + { + public: + bChunkPtr4(){} + int code; + int len; + union + { + int m_uniqueInt; + }; + int dna_nr; + int nr; + }; + + // ----------------------------------------------------- // + class bChunkPtr8 + { + public: + bChunkPtr8(){} + int code, len; + union + { + long64 oldPrev; + int m_uniqueInts[2]; + }; + int dna_nr, nr; + }; + + // ----------------------------------------------------- // + class bChunkInd + { + public: + bChunkInd(){} + int code, len; + void *oldPtr; + int dna_nr, nr; + }; + + + // ----------------------------------------------------- // + class ChunkUtils + { + public: + + // file chunk offset + static int getOffset(int flags); + + // endian utils + static short swapShort(short sht); + static int swapInt(int inte); + static long64 swapLong64(long64 lng); + + }; + + + const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd))); + const bool VOID_IS_8 = ((sizeof(void*)==8)); +} + +#endif//__BCHUNK_H__ diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bCommon.h b/Code/Physics/Bullet Source/BulletFileLoader/bCommon.h new file mode 100644 index 00000000..b01d2b89 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bCommon.h @@ -0,0 +1,39 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BCOMMON_H__ +#define __BCOMMON_H__ + + +#include +//#include "bLog.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btHashMap.h" + +namespace bParse { + + class bMain; + class bFileData; + class bFile; + class bDNA; + + // delete void* undefined + typedef struct bStructHandle {int unused;}bStructHandle; + typedef btAlignedObjectArray bListBasePtr; + typedef btHashMap bPtrMap; +} + + +#endif//__BCOMMON_H__ diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bDNA.cpp b/Code/Physics/Bullet Source/BulletFileLoader/bDNA.cpp new file mode 100644 index 00000000..a362767b --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bDNA.cpp @@ -0,0 +1,644 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include + +#include "bDNA.h" +#include "bChunk.h" +#include +#include +#include + +//this define will force traversal of structures, to check backward (and forward) compatibility +//#define TEST_BACKWARD_FORWARD_COMPATIBILITY + + +using namespace bParse; + + +// ----------------------------------------------------- // +bDNA::bDNA() + : mPtrLen(0) +{ + // -- +} + +// ----------------------------------------------------- // +bDNA::~bDNA() +{ + // -- +} + +// ----------------------------------------------------- // +bool bDNA::lessThan(bDNA *file) +{ + return ( m_Names.size() < file->m_Names.size()); +} + +// ----------------------------------------------------- // +char *bDNA::getName(int ind) +{ + assert(ind <= (int)m_Names.size()); + return m_Names[ind].m_name; +} + + +// ----------------------------------------------------- // +char *bDNA::getType(int ind) +{ + assert(ind<= (int)mTypes.size()); + return mTypes[ind]; +} + + +// ----------------------------------------------------- // +short *bDNA::getStruct(int ind) +{ + assert(ind <= (int)mStructs.size()); + return mStructs[ind]; +} + + +// ----------------------------------------------------- // +short bDNA::getLength(int ind) +{ + assert(ind <= (int)mTlens.size()); + return mTlens[ind]; +} + + +// ----------------------------------------------------- // +int bDNA::getReverseType(short type) +{ + + int* intPtr = mStructReverse.find(type); + if (intPtr) + return *intPtr; + + return -1; +} + +// ----------------------------------------------------- // +int bDNA::getReverseType(const char *type) +{ + + btHashString key(type); + int* valuePtr = mTypeLookup.find(key); + if (valuePtr) + return *valuePtr; + + return -1; +} + +// ----------------------------------------------------- // +int bDNA::getNumStructs() +{ + return (int)mStructs.size(); +} + +// ----------------------------------------------------- // +bool bDNA::flagNotEqual(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + return mCMPFlags[dna_nr] == FDF_STRUCT_NEQU; +} + +// ----------------------------------------------------- // +bool bDNA::flagEqual(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + int flag = mCMPFlags[dna_nr]; + return flag == FDF_STRUCT_EQU; +} + +// ----------------------------------------------------- // +bool bDNA::flagNone(int dna_nr) +{ + assert(dna_nr <= (int)mCMPFlags.size()); + return mCMPFlags[dna_nr] == FDF_NONE; +} + +// ----------------------------------------------------- // +int bDNA::getPointerSize() +{ + return mPtrLen; +} + +// ----------------------------------------------------- // +void bDNA::initRecurseCmpFlags(int iter) +{ + // iter is FDF_STRUCT_NEQU + + short *oldStrc = mStructs[iter]; + short type = oldStrc[0]; + + for (int i=0; i<(int)mStructs.size(); i++) + { + if (i != iter && mCMPFlags[i] == FDF_STRUCT_EQU ) + { + short *curStruct = mStructs[i]; + int eleLen = curStruct[1]; + curStruct+=2; + + for (int j=0; jgetReverseType(typeName); + if (newLookup == -1) + { + mCMPFlags[i] = FDF_NONE; + continue; + } + short *curStruct = memDNA->mStructs[newLookup]; +#else + // memory for file + + if (oldLookup < memDNA->mStructs.size()) + { + short *curStruct = memDNA->mStructs[oldLookup]; +#endif + + + + // rebuild... + mCMPFlags[i] = FDF_STRUCT_NEQU; + +#ifndef TEST_BACKWARD_FORWARD_COMPATIBILITY + + if (curStruct[1] == oldStruct[1]) + { + // type len same ... + if (mTlens[oldStruct[0]] == memDNA->mTlens[curStruct[0]]) + { + bool isSame = true; + int elementLength = oldStruct[1]; + + + curStruct+=2; + oldStruct+=2; + + + for (int j=0; jmTypes[curStruct[0]])!=0) + { + isSame=false; + break; + } + + // name the same + if (strcmp(m_Names[oldStruct[1]].m_name, memDNA->m_Names[curStruct[1]].m_name)!=0) + { + isSame=false; + break; + } + } + // flag valid == + if (isSame) + mCMPFlags[i] = FDF_STRUCT_EQU; + } + } +#endif + } + } + + + + + + // recurse in + for ( i=0; i<(int)mStructs.size(); i++) + { + if (mCMPFlags[i] == FDF_STRUCT_NEQU) + initRecurseCmpFlags(i); + } +} + + + + +static int name_is_array(char* name, int* dim1, int* dim2) { + int len = strlen(name); + /*fprintf(stderr,"[%s]",name);*/ + /*if (len >= 1) { + if (name[len-1] != ']') + return 1; + } + return 0;*/ + char *bp; + int num; + if (dim1) { + *dim1 = 1; + } + if (dim2) { + *dim2 = 1; + } + bp = strchr(name, '['); + if (!bp) { + return 0; + } + num = 0; + while (++bp < name+len-1) { + const char c = *bp; + if (c == ']') { + break; + } + if (c <= '9' && c >= '0') { + num *= 10; + num += (c - '0'); + } else { + printf("array parse error.\n"); + return 0; + } + } + if (dim2) { + *dim2 = num; + } + + /* find second dim, if any. */ + bp = strchr(bp, '['); + if (!bp) { + return 1; /* at least we got the first dim. */ + } + num = 0; + while (++bp < name+len-1) { + const char c = *bp; + if (c == ']') { + break; + } + if (c <= '9' && c >= '0') { + num *= 10; + num += (c - '0'); + } else { + printf("array2 parse error.\n"); + return 1; + } + } + if (dim1) { + if (dim2) { + *dim1 = *dim2; + *dim2 = num; + } else { + *dim1 = num; + } + } + + return 1; +} + + +// ----------------------------------------------------- // +void bDNA::init(char *data, int len, bool swap) +{ + int *intPtr=0;short *shtPtr=0; + char *cp = 0;int dataLen =0;long nr=0; + intPtr = (int*)data; + + /* + SDNA (4 bytes) (magic number) + NAME (4 bytes) + (4 bytes) amount of names (int) + + + */ + + if (strncmp(data, "SDNA", 4)==0) + { + // skip ++ NAME + intPtr++; intPtr++; + } + + + + // Parse names + if (swap) + { + *intPtr = ChunkUtils::swapInt(*intPtr); + } + dataLen = *intPtr; + intPtr++; + + cp = (char*)intPtr; + int i; + for ( i=0; i amount of types (int) + + + */ + + intPtr = (int*)cp; + assert(strncmp(cp, "TYPE", 4)==0); intPtr++; + + if (swap) + { + *intPtr = ChunkUtils::swapInt(*intPtr); + } + dataLen = *intPtr; + intPtr++; + + cp = (char*)intPtr; + for ( i=0; i (short) the lengths of types + + */ + + // Parse type lens + intPtr = (int*)cp; + assert(strncmp(cp, "TLEN", 4)==0); intPtr++; + + dataLen = (int)mTypes.size(); + + shtPtr = (short*)intPtr; + for ( i=0; i amount of structs (int) + + + + + + + */ + + intPtr = (int*)shtPtr; + cp = (char*)intPtr; + assert(strncmp(cp, "STRC", 4)==0); intPtr++; + + if (swap) + { + *intPtr = ChunkUtils::swapInt(*intPtr); + } + dataLen = *intPtr; + intPtr++; + + + shtPtr = (short*)intPtr; + for ( i=0; itypes_count; ++i) { + /* if (!bf->types[i].is_struct)*/ + { + printf("%3d: sizeof(%s%s)=%d", + i, + bf->types[i].is_struct ? "struct " : "atomic ", + bf->types[i].name, bf->types[i].size); + if (bf->types[i].is_struct) { + int j; + printf(", %d fields: { ", bf->types[i].fieldtypes_count); + for (j=0; jtypes[i].fieldtypes_count; ++j) { + printf("%s %s", + bf->types[bf->types[i].fieldtypes[j]].name, + bf->names[bf->types[i].fieldnames[j]]); + if (j == bf->types[i].fieldtypes_count-1) { + printf(";}"); + } else { + printf("; "); + } + } + } + printf("\n\n"); + + } + } +#endif + +} + + + + +//eof + + diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bDNA.h b/Code/Physics/Bullet Source/BulletFileLoader/bDNA.h new file mode 100644 index 00000000..691080bf --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bDNA.h @@ -0,0 +1,110 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BDNA_H__ +#define __BDNA_H__ + + +#include "bCommon.h" + +namespace bParse { + + struct bNameInfo + { + char* m_name; + bool m_isPointer; + int m_dim0; + int m_dim1; + }; + + class bDNA + { + public: + bDNA(); + ~bDNA(); + + void init(char *data, int len, bool swap=false); + + int getArraySize(char* str); + int getArraySizeNew(short name) + { + const bNameInfo& nameInfo = m_Names[name]; + return nameInfo.m_dim0*nameInfo.m_dim1; + } + int getElementSize(short type, short name) + { + const bNameInfo& nameInfo = m_Names[name]; + int size = nameInfo.m_isPointer ? mPtrLen*nameInfo.m_dim0*nameInfo.m_dim1 : mTlens[type]*nameInfo.m_dim0*nameInfo.m_dim1; + return size; + } + + int getNumNames() const + { + return m_Names.size(); + } + + char *getName(int ind); + char *getType(int ind); + short *getStruct(int ind); + short getLength(int ind); + int getReverseType(short type); + int getReverseType(const char *type); + + + int getNumStructs(); + + // + bool lessThan(bDNA* other); + + void initCmpFlags(bDNA *memDNA); + bool flagNotEqual(int dna_nr); + bool flagEqual(int dna_nr); + bool flagNone(int dna_nr); + + + int getPointerSize(); + + void dumpTypeDefinitions(); + + + private: + enum FileDNAFlags + { + FDF_NONE=0, + FDF_STRUCT_NEQU, + FDF_STRUCT_EQU + }; + + void initRecurseCmpFlags(int i); + + btAlignedObjectArray mCMPFlags; + + btAlignedObjectArray m_Names; + btAlignedObjectArray mTypes; + btAlignedObjectArray mStructs; + btAlignedObjectArray mTlens; + btHashMap mStructReverse; + btHashMap mTypeLookup; + + int mPtrLen; + + + + + }; +} + + +#endif//__BDNA_H__ diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bDefines.h b/Code/Physics/Bullet Source/BulletFileLoader/bDefines.h new file mode 100644 index 00000000..238df7d4 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bDefines.h @@ -0,0 +1,140 @@ +/* Copyright (C) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef __B_DEFINES_H__ +#define __B_DEFINES_H__ + + +// MISC defines, see BKE_global.h, BKE_utildefines.h +#define SIZEOFBLENDERHEADER 12 + + +// ------------------------------------------------------------ +#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) +#else +# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) +#endif + + +// ------------------------------------------------------------ +#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +# define MAKE_ID2(c, d) ( (c)<<8 | (d) ) +# define MOST_SIG_BYTE 0 +# define BBIG_ENDIAN +#else +# define MAKE_ID2(c, d) ( (d)<<8 | (c) ) +# define MOST_SIG_BYTE 1 +# define BLITTLE_ENDIAN +#endif + +// ------------------------------------------------------------ +#define ID_SCE MAKE_ID2('S', 'C') +#define ID_LI MAKE_ID2('L', 'I') +#define ID_OB MAKE_ID2('O', 'B') +#define ID_ME MAKE_ID2('M', 'E') +#define ID_CU MAKE_ID2('C', 'U') +#define ID_MB MAKE_ID2('M', 'B') +#define ID_MA MAKE_ID2('M', 'A') +#define ID_TE MAKE_ID2('T', 'E') +#define ID_IM MAKE_ID2('I', 'M') +#define ID_IK MAKE_ID2('I', 'K') +#define ID_WV MAKE_ID2('W', 'V') +#define ID_LT MAKE_ID2('L', 'T') +#define ID_SE MAKE_ID2('S', 'E') +#define ID_LF MAKE_ID2('L', 'F') +#define ID_LA MAKE_ID2('L', 'A') +#define ID_CA MAKE_ID2('C', 'A') +#define ID_IP MAKE_ID2('I', 'P') +#define ID_KE MAKE_ID2('K', 'E') +#define ID_WO MAKE_ID2('W', 'O') +#define ID_SCR MAKE_ID2('S', 'R') +#define ID_VF MAKE_ID2('V', 'F') +#define ID_TXT MAKE_ID2('T', 'X') +#define ID_SO MAKE_ID2('S', 'O') +#define ID_SAMPLE MAKE_ID2('S', 'A') +#define ID_GR MAKE_ID2('G', 'R') +#define ID_ID MAKE_ID2('I', 'D') +#define ID_AR MAKE_ID2('A', 'R') +#define ID_AC MAKE_ID2('A', 'C') +#define ID_SCRIPT MAKE_ID2('P', 'Y') +#define ID_FLUIDSIM MAKE_ID2('F', 'S') +#define ID_NT MAKE_ID2('N', 'T') +#define ID_BR MAKE_ID2('B', 'R') + + +#define ID_SEQ MAKE_ID2('S', 'Q') +#define ID_CO MAKE_ID2('C', 'O') +#define ID_PO MAKE_ID2('A', 'C') +#define ID_NLA MAKE_ID2('N', 'L') + +#define ID_VS MAKE_ID2('V', 'S') +#define ID_VN MAKE_ID2('V', 'N') + + +// ------------------------------------------------------------ +#define FORM MAKE_ID('F','O','R','M') +#define DDG1 MAKE_ID('3','D','G','1') +#define DDG2 MAKE_ID('3','D','G','2') +#define DDG3 MAKE_ID('3','D','G','3') +#define DDG4 MAKE_ID('3','D','G','4') +#define GOUR MAKE_ID('G','O','U','R') +#define BLEN MAKE_ID('B','L','E','N') +#define DER_ MAKE_ID('D','E','R','_') +#define V100 MAKE_ID('V','1','0','0') +#define DATA MAKE_ID('D','A','T','A') +#define GLOB MAKE_ID('G','L','O','B') +#define IMAG MAKE_ID('I','M','A','G') +#define TEST MAKE_ID('T','E','S','T') +#define USER MAKE_ID('U','S','E','R') + + +// ------------------------------------------------------------ +#define DNA1 MAKE_ID('D','N','A','1') +#define REND MAKE_ID('R','E','N','D') +#define ENDB MAKE_ID('E','N','D','B') +#define NAME MAKE_ID('N','A','M','E') +#define SDNA MAKE_ID('S','D','N','A') +#define TYPE MAKE_ID('T','Y','P','E') +#define TLEN MAKE_ID('T','L','E','N') +#define STRC MAKE_ID('S','T','R','C') + + +// ------------------------------------------------------------ +#define SWITCH_INT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; } + +// ------------------------------------------------------------ +#define SWITCH_SHORT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; } + +// ------------------------------------------------------------ +#define SWITCH_LONGINT(a) { \ + char s_i, *p_i; \ + p_i= (char *)&(a); \ + s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \ + s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \ + s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \ + s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; } + +#endif//__B_DEFINES_H__ diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bFile.cpp b/Code/Physics/Bullet Source/BulletFileLoader/bFile.cpp new file mode 100644 index 00000000..c0e256fc --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bFile.cpp @@ -0,0 +1,1757 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "bFile.h" +#include "bCommon.h" +#include "bChunk.h" +#include "bDNA.h" +#include +#include +#include +#include "bDefines.h" +#include "LinearMath/btSerializer.h" +#include "LinearMath/btAlignedAllocator.h" +#include "LinearMath/btMinMax.h" + +#define SIZEOFBLENDERHEADER 12 +#define MAX_ARRAY_LENGTH 512 +using namespace bParse; +#define MAX_STRLEN 1024 + +const char* getCleanName(const char* memName, char* buffer) +{ + int slen = strlen(memName); + assert(slen 0) + { + if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0) + dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags)); + else dna.oldPtr = 0; + } + else dna.oldPtr = 0; + } + // Some Bullet files are missing the DNA1 block + // In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME + // In Bullet tests its SDNA + NAME + else if (strncmp(tempBuffer, "SDNANAME", 8) ==0) + { + dna.oldPtr = blenderData + i; + dna.len = mFileLen-i; + + // Also no REND block, so exit now. + if (mVersion==276) break; + } + + if (mDataStart && dna.oldPtr) break; + tempBuffer++; + } + if (!dna.oldPtr || !dna.len) + { + //printf("Failed to find DNA1+SDNA pair\n"); + mFlags &= ~FD_OK; + return; + } + + + mFileDNA = new bDNA(); + + + ///mFileDNA->init will convert part of DNA file endianness to current CPU endianness if necessary + mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0); + + + if (mVersion==276) + { + int i; + for (i=0;igetNumNames();i++) + { + if (strcmp(mFileDNA->getName(i),"int")==0) + { + mFlags |= FD_BROKEN_DNA; + } + } + if ((mFlags&FD_BROKEN_DNA)!=0) + { + //printf("warning: fixing some broken DNA version\n"); + } + } + + + + if (verboseMode & FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS) + mFileDNA->dumpTypeDefinitions(); + + mMemoryDNA = new bDNA(); + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + mMemoryDNA->init(memDna,memDnaLength,littleEndian==0); + + + + + ///@todo we need a better version check, add version/sub version info from FileGlobal into memory DNA/header files + if (mMemoryDNA->getNumNames() != mFileDNA->getNumNames()) + { + mFlags |= FD_VERSION_VARIES; + //printf ("Warning, file DNA is different than built in, performance is reduced. Best to re-export file with a matching version/platform"); + } + + // as long as it kept up to date it will be ok!! + if (mMemoryDNA->lessThan(mFileDNA)) + { + //printf ("Warning, file DNA is newer than built in."); + } + + + mFileDNA->initCmpFlags(mMemoryDNA); + + parseData(); + + resolvePointers(verboseMode); + + updateOldPointers(); + + +} + + + +// ----------------------------------------------------- // +void bFile::swap(char *head, bChunkInd& dataChunk, bool ignoreEndianFlag) +{ + char *data = head; + short *strc = mFileDNA->getStruct(dataChunk.dna_nr); + + + + const char s[] = "SoftBodyMaterialData"; + int szs = sizeof(s); + if (strncmp((char*)&dataChunk.code,"ARAY",4)==0) + { + short *oldStruct = mFileDNA->getStruct(dataChunk.dna_nr); + char *oldType = mFileDNA->getType(oldStruct[0]); + if (strncmp(oldType,s,szs)==0) + { + return; + } + } + + + int len = mFileDNA->getLength(strc[0]); + + for (int i=0; icode & 0xFFFF)==0) + c->code >>=16; + SWITCH_INT(c->len); + SWITCH_INT(c->dna_nr); + SWITCH_INT(c->nr); + } else + { + bChunkPtr8* c = (bChunkPtr8*) dataPtr; + if ((c->code & 0xFFFF)==0) + c->code >>=16; + SWITCH_INT(c->len); + SWITCH_INT(c->dna_nr); + SWITCH_INT(c->nr); + + } + } else + { + if (mFlags &FD_BITS_VARIES) + { + bChunkPtr8*c = (bChunkPtr8*) dataPtr; + if ((c->code & 0xFFFF)==0) + c->code >>=16; + SWITCH_INT(c->len); + SWITCH_INT(c->dna_nr); + SWITCH_INT(c->nr); + + } else + { + bChunkPtr4* c = (bChunkPtr4*) dataPtr; + if ((c->code & 0xFFFF)==0) + c->code >>=16; + SWITCH_INT(c->len); + + SWITCH_INT(c->dna_nr); + SWITCH_INT(c->nr); + + } + } + +} + + +void bFile::swapDNA(char* ptr) +{ + bool swap = ((mFlags & FD_ENDIAN_SWAP)!=0); + + char* data = &ptr[20]; +// void bDNA::init(char *data, int len, bool swap) + int *intPtr=0;short *shtPtr=0; + char *cp = 0;int dataLen =0;long nr=0; + intPtr = (int*)data; + + /* + SDNA (4 bytes) (magic number) + NAME (4 bytes) + (4 bytes) amount of names (int) + + + */ + + if (strncmp(data, "SDNA", 4)==0) + { + // skip ++ NAME + intPtr++; intPtr++; + } + + + + // Parse names + if (swap) + dataLen = ChunkUtils::swapInt(*intPtr); + else + dataLen = *intPtr; + + *intPtr = ChunkUtils::swapInt(*intPtr); + intPtr++; + + cp = (char*)intPtr; + int i; + for ( i=0; i amount of types (int) + + + */ + + intPtr = (int*)cp; + assert(strncmp(cp, "TYPE", 4)==0); intPtr++; + + if (swap) + dataLen = ChunkUtils::swapInt(*intPtr); + else + dataLen = *intPtr; + + *intPtr = ChunkUtils::swapInt(*intPtr); + + intPtr++; + + cp = (char*)intPtr; + for ( i=0; i (short) the lengths of types + + */ + + // Parse type lens + intPtr = (int*)cp; + assert(strncmp(cp, "TLEN", 4)==0); intPtr++; + + + shtPtr = (short*)intPtr; + for ( i=0; i amount of structs (int) + + + + + + + */ + + intPtr = (int*)shtPtr; + cp = (char*)intPtr; + assert(strncmp(cp, "STRC", 4)==0); + intPtr++; + + if (swap) + dataLen = ChunkUtils::swapInt(*intPtr); + else + dataLen = *intPtr; + + *intPtr = ChunkUtils::swapInt(*intPtr); + + intPtr++; + + + shtPtr = (short*)intPtr; + for ( i=0; i=0) + { + swap(dataPtrHead, dataChunk,ignoreEndianFlag); + } else + { + printf("unknown chunk\n"); + } + } + + // next please! + dataPtr += seek; + + seek = getNextBlock(&dataChunk, dataPtr, mFlags); + if (seek < 0) + break; + } + + if (mFlags & FD_ENDIAN_SWAP) + { + mFlags &= ~FD_ENDIAN_SWAP; + } else + { + mFlags |= FD_ENDIAN_SWAP; + } + + + +} + + +// ----------------------------------------------------- // +char* bFile::readStruct(char *head, bChunkInd& dataChunk) +{ + bool ignoreEndianFlag = false; + + if (mFlags & FD_ENDIAN_SWAP) + swap(head, dataChunk, ignoreEndianFlag); + + + + if (!mFileDNA->flagEqual(dataChunk.dna_nr)) + { + // Ouch! need to rebuild the struct + short *oldStruct,*curStruct; + char *oldType, *newType; + int oldLen, curLen, reverseOld; + + + oldStruct = mFileDNA->getStruct(dataChunk.dna_nr); + oldType = mFileDNA->getType(oldStruct[0]); + + oldLen = mFileDNA->getLength(oldStruct[0]); + + if ((mFlags&FD_BROKEN_DNA)!=0) + { + if ((strcmp(oldType,"btQuantizedBvhNodeData")==0)&&oldLen==20) + { + return 0; + } + if ((strcmp(oldType,"btShortIntIndexData")==0)) + { + int allocLen = 2; + char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; + memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); + short* dest = (short*) dataAlloc; + const short* src = (short*) head; + for (int i=0;igetReverseType(oldType); + + if ((reverseOld!=-1)) + { + // make sure it's here + //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); + + // + curStruct = mMemoryDNA->getStruct(reverseOld); + newType = mMemoryDNA->getType(curStruct[0]); + curLen = mMemoryDNA->getLength(curStruct[0]); + + + + // make sure it's the same + assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); + + + numallocs++; + // numBlocks * length + + int allocLen = (curLen); + char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; + memset(dataAlloc, 0, (dataChunk.nr*allocLen)); + + // track allocated + addDataBlock(dataAlloc); + + char *cur = dataAlloc; + char *old = head; + for (int block=0; blockgetStruct(dataChunk.dna_nr); + oldType = mFileDNA->getType(oldStruct[0]); + printf("%s equal structure, just memcpy\n",oldType); +#endif // + } + + + char *dataAlloc = new char[(dataChunk.len)+1]; + memset(dataAlloc, 0, dataChunk.len+1); + + + // track allocated + addDataBlock(dataAlloc); + + memcpy(dataAlloc, head, dataChunk.len); + return dataAlloc; + +} + + +// ----------------------------------------------------- // +void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers) +{ + if (old_dna == -1) return; + if (new_dna == -1) return; + + //disable this, because we need to fixup pointers/ListBase + if (0)//mFileDNA->flagEqual(old_dna)) + { + short *strc = mFileDNA->getStruct(old_dna); + int len = mFileDNA->getLength(strc[0]); + + memcpy(strcPtr, dtPtr, len); + return; + } + + // Ok, now build the struct + char *memType, *memName, *cpc, *cpo; + short *fileStruct, *filePtrOld, *memoryStruct, *firstStruct; + int elementLength, size, revType, old_nr, new_nr, fpLen; + short firstStructType; + + + // File to memory lookup + memoryStruct = mMemoryDNA->getStruct(new_dna); + fileStruct = mFileDNA->getStruct(old_dna); + firstStruct = fileStruct; + + + filePtrOld = fileStruct; + firstStructType = mMemoryDNA->getStruct(0)[0]; + + // Get number of elements + elementLength = memoryStruct[1]; + memoryStruct+=2; + + cpc = strcPtr; cpo = 0; + for (int ele=0; elegetType(memoryStruct[0]); + memName = mMemoryDNA->getName(memoryStruct[1]); + + + size = mMemoryDNA->getElementSize(memoryStruct[0], memoryStruct[1]); + revType = mMemoryDNA->getReverseType(memoryStruct[0]); + + if (revType != -1 && memoryStruct[0]>=firstStructType && memName[0] != '*') + { + cpo = getFileElement(firstStruct, memName, memType, dtPtr, &filePtrOld); + if (cpo) + { + int arrayLen = mFileDNA->getArraySizeNew(filePtrOld[1]); + old_nr = mFileDNA->getReverseType(memType); + new_nr = revType; + fpLen = mFileDNA->getElementSize(filePtrOld[0], filePtrOld[1]); + if (arrayLen==1) + { + parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers); + } else + { + char* tmpCpc = cpc; + char* tmpCpo = cpo; + + for (int i=0;i3 && type <8) + { + char c; + char *cp = data; + for (int i=0; igetPointerSize(); + int ptrMem = mMemoryDNA->getPointerSize(); + + if (!src && !dst) + return; + + + if (ptrFile == ptrMem) + { + memcpy(dst, src, ptrMem); + } + else if (ptrMem==4 && ptrFile==8) + { + btPointerUid* oldPtr = (btPointerUid*)src; + btPointerUid* newPtr = (btPointerUid*)dst; + + if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) + { + //Bullet stores the 32bit unique ID in both upper and lower part of 64bit pointers + //so it can be used to distinguish between .blend and .bullet + newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; + } else + { + //deal with pointers the Blender .blend style way, see + //readfile.c in the Blender source tree + long64 longValue = *((long64*)src); + //endian swap for 64bit pointer otherwise truncation will fail due to trailing zeros + if (mFlags & FD_ENDIAN_SWAP) + SWITCH_LONGINT(longValue); + *((int*)dst) = (int)(longValue>>3); + } + + } + else if (ptrMem==8 && ptrFile==4) + { + btPointerUid* oldPtr = (btPointerUid*)src; + btPointerUid* newPtr = (btPointerUid*)dst; + if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1]) + { + newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0]; + newPtr->m_uniqueIds[1] = 0; + } else + { + *((long64*)dst)= *((int*)src); + } + } + else + { + printf ("%d %d\n", ptrFile,ptrMem); + assert(0 && "Invalid pointer len"); + } + + +} + + +// ----------------------------------------------------- // +void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers) +{ + // find the matching memory dna data + // to the file being loaded. Fill the + // memory with the file data... + + int len = dna_addr[1]; + dna_addr+=2; + + for (int i=0; igetType(dna_addr[0]); + const char* name = mFileDNA->getName(dna_addr[1]); + + + + int eleLen = mFileDNA->getElementSize(dna_addr[0], dna_addr[1]); + + if ((mFlags&FD_BROKEN_DNA)!=0) + { + if ((strcmp(type,"short")==0)&&(strcmp(name,"int")==0)) + { + eleLen = 0; + } + } + + if (strcmp(lookupName, name)==0) + { + //int arrayLenold = mFileDNA->getArraySize((char*)name.c_str()); + int arrayLen = mFileDNA->getArraySizeNew(dna_addr[1]); + //assert(arrayLenold == arrayLen); + + if (name[0] == '*') + { + // cast pointers + int ptrFile = mFileDNA->getPointerSize(); + int ptrMem = mMemoryDNA->getPointerSize(); + safeSwapPtr(strcData,data); + + if (fixupPointers) + { + if (arrayLen > 1) + { + //void **sarray = (void**)strcData; + //void **darray = (void**)data; + + char *cpc, *cpo; + cpc = (char*)strcData; + cpo = (char*)data; + + for (int a=0; agetStruct(old_nr); + int elementLength = old[1]; + old+=2; + + for (int i=0; igetType(old[0]); + char* name = mFileDNA->getName(old[1]); + int len = mFileDNA->getElementSize(old[0], old[1]); + + if (strcmp(lookupName, name)==0) + { + if (strcmp(type, lookupType)==0) + { + if (foundPos) + *foundPos = old; + return data; + } + return 0; + } + data+=len; + } + return 0; +} + + +// ----------------------------------------------------- // +void bFile::swapStruct(int dna_nr, char *data,bool ignoreEndianFlag) +{ + if (dna_nr == -1) return; + + short *strc = mFileDNA->getStruct(dna_nr); + //short *firstStrc = strc; + + int elementLen= strc[1]; + strc+=2; + + short first = mFileDNA->getStruct(0)[0]; + + char *buf = data; + for (int i=0; igetType(strc[0]); + char *name = mFileDNA->getName(strc[1]); + + int size = mFileDNA->getElementSize(strc[0], strc[1]); + if (strc[0] >= first && name[0]!='*') + { + int old_nr = mFileDNA->getReverseType(type); + int arrayLen = mFileDNA->getArraySizeNew(strc[1]); + if (arrayLen==1) + { + swapStruct(old_nr,buf,ignoreEndianFlag); + } else + { + char* tmpBuf = buf; + for (int i=0;igetArraySize(name); + int arrayLen = mFileDNA->getArraySizeNew(strc[1]); + //assert(arrayLenOld == arrayLen); + swapData(buf, strc[0], arrayLen,ignoreEndianFlag); + } + buf+=size; + } +} + +void bFile::resolvePointersMismatch() +{ +// printf("resolvePointersStructMismatch\n"); + + int i; + + for (i=0;i< m_pointerFixupArray.size();i++) + { + char* cur = m_pointerFixupArray.at(i); + void** ptrptr = (void**) cur; + void* ptr = *ptrptr; + ptr = findLibPointer(ptr); + if (ptr) + { + //printf("Fixup pointer!\n"); + *(ptrptr) = ptr; + } else + { +// printf("pointer not found: %x\n",cur); + } + } + + + for (i=0; igetPointerSize(); + int ptrFile = mFileDNA->getPointerSize(); + + + int blockLen = block->len / ptrFile; + + void *onptr = findLibPointer(*ptrptr); + if (onptr) + { + char *newPtr = new char[blockLen * ptrMem]; + addDataBlock(newPtr); + memset(newPtr, 0, blockLen * ptrMem); + + void **onarray = (void**)onptr; + char *oldPtr = (char*)onarray; + + int p = 0; + while (blockLen-- > 0) + { + btPointerUid dp = {0}; + safeSwapPtr((char*)dp.m_uniqueIds, oldPtr); + + void **tptr = (void**)(newPtr + p * ptrMem); + *tptr = findLibPointer(dp.m_ptr); + + oldPtr += ptrFile; + ++p; + } + + *ptrptr = newPtr; + } + } + } +} + + +///this loop only works fine if the Blender DNA structure of the file matches the headerfiles +void bFile::resolvePointersChunk(const bChunkInd& dataChunk, int verboseMode) +{ + bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; + + short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr); + short oldLen = fileDna->getLength(oldStruct[0]); + //char* structType = fileDna->getType(oldStruct[0]); + + char* cur = (char*)findLibPointer(dataChunk.oldPtr); + for (int block=0; blockgetStruct(0)[0]; + + + char* elemPtr= strcPtr; + + short int* oldStruct = fileDna->getStruct(dna_nr); + + int elementLength = oldStruct[1]; + oldStruct+=2; + + int totalSize = 0; + + for (int ele=0; elegetType(oldStruct[0]); + memName = fileDna->getName(oldStruct[1]); + + + + int arrayLen = fileDna->getArraySizeNew(oldStruct[1]); + if (memName[0] == '*') + { + if (arrayLen > 1) + { + void **array= (void**)elemPtr; + for (int a=0; a ",&memName[1]); + printf("%d ", array[a]); + printf("\n",&memName[1]); + } + + array[a] = findLibPointer(array[a]); + } + } + else + { + void** ptrptr = (void**) elemPtr; + void* ptr = *ptrptr; + if (verboseMode & FD_VERBOSE_EXPORT_XML) + { + for (int i=0;i ",&memName[1]); + printf("%d ", ptr); + printf("\n",&memName[1]); + } + ptr = findLibPointer(ptr); + + if (ptr) + { + // printf("Fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr); + *(ptrptr) = ptr; + if (memName[1] == '*' && ptrptr && *ptrptr) + { + // This will only work if the given **array is continuous + void **array= (void**)*(ptrptr); + void *np= array[0]; + int n=0; + while (np) + { + np= findLibPointer(array[n]); + if (np) array[n]= np; + n++; + } + } + } else + { + // printf("Cannot fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr); + } + } + } else + { + int revType = fileDna->getReverseType(oldStruct[0]); + if (oldStruct[0]>=firstStructType) //revType != -1 && + { + char cleanName[MAX_STRLEN]; + getCleanName(memName,cleanName); + + int arrayLen = fileDna->getArraySizeNew(oldStruct[1]); + int byteOffset = 0; + + if (verboseMode & FD_VERBOSE_EXPORT_XML) + { + for (int i=0;i1) + { + printf("<%s type=\"%s\" count=%d>\n",cleanName,memType, arrayLen); + } else + { + printf("<%s type=\"%s\">\n",cleanName,memType); + } + } + + for (int i=0;i\n",cleanName); + } + } else + { + //export a simple type + if (verboseMode & FD_VERBOSE_EXPORT_XML) + { + + if (arrayLen>MAX_ARRAY_LENGTH) + { + printf("too long\n"); + } else + { + //printf("%s %s\n",memType,memName); + + bool isIntegerType = (strcmp(memType,"char")==0) || (strcmp(memType,"int")==0) || (strcmp(memType,"short")==0); + + if (isIntegerType) + { + const char* newtype="int"; + int dbarray[MAX_ARRAY_LENGTH]; + int* dbPtr = 0; + char* tmp = elemPtr; + dbPtr = &dbarray[0]; + if (dbPtr) + { + char cleanName[MAX_STRLEN]; + getCleanName(memName,cleanName); + + int i; + getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); + for (i=0;i",cleanName,memType); + else + printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen); + for (i=0;i\n",cleanName); + } + } else + { + const char* newtype="double"; + double dbarray[MAX_ARRAY_LENGTH]; + double* dbPtr = 0; + char* tmp = elemPtr; + dbPtr = &dbarray[0]; + if (dbPtr) + { + int i; + getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr); + for (i=0;i",memName,memType); + } + else + { + printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen); + } + for (i=0;i\n",cleanName); + } + } + } + + } + } + } + + int size = fileDna->getElementSize(oldStruct[0], oldStruct[1]); + totalSize += size; + elemPtr+=size; + + } + + return totalSize; +} + + +///Resolve pointers replaces the original pointers in structures, and linked lists by the new in-memory structures +void bFile::resolvePointers(int verboseMode) +{ + bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; + + //char *dataPtr = mFileBuffer+mDataStart; + + if (1) //mFlags & (FD_BITS_VARIES | FD_VERSION_VARIES)) + { + resolvePointersMismatch(); + } + + { + + if (verboseMode & FD_VERBOSE_EXPORT_XML) + { + printf("\n"); + int numitems = m_chunks.size(); + printf("\n", btGetVersion(), numitems); + } + for (int i=0;iflagEqual(dataChunk.dna_nr)) + { + //dataChunk.len + short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr); + char* oldType = fileDna->getType(oldStruct[0]); + + if (verboseMode & FD_VERBOSE_EXPORT_XML) + printf(" <%s pointer=%d>\n",oldType,dataChunk.oldPtr); + + resolvePointersChunk(dataChunk, verboseMode); + + if (verboseMode & FD_VERBOSE_EXPORT_XML) + printf(" \n",oldType); + } else + { + //printf("skipping mStruct\n"); + } + } + if (verboseMode & FD_VERBOSE_EXPORT_XML) + { + printf("\n"); + } + } + + +} + + +// ----------------------------------------------------- // +void* bFile::findLibPointer(void *ptr) +{ + + bStructHandle** ptrptr = getLibPointers().find(ptr); + if (ptrptr) + return *ptrptr; + return 0; +} + + +void bFile::updateOldPointers() +{ + int i; + + for (i=0;igetStruct(dataChunk.dna_nr); + char* typeName = dna->getType(newStruct[0]); + printf("%3d: %s ",i,typeName); + + printf("code=%s ",codestr); + + printf("ptr=%p ",dataChunk.oldPtr); + printf("len=%d ",dataChunk.len); + printf("nr=%d ",dataChunk.nr); + if (dataChunk.nr!=1) + { + printf("not 1\n"); + } + printf("\n"); + + + + + } + +#if 0 + IDFinderData ifd; + ifd.success = 0; + ifd.IDname = NULL; + ifd.just_print_it = 1; + for (i=0; im_blocks.size(); ++i) + { + BlendBlock* bb = bf->m_blocks[i]; + printf("tag='%s'\tptr=%p\ttype=%s\t[%4d]", bb->tag, bb,bf->types[bb->type_index].name,bb->m_array_entries_.size()); + block_ID_finder(bb, bf, &ifd); + printf("\n"); + } +#endif + +} + + +void bFile::writeChunks(FILE* fp, bool fixupPointers) +{ + bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA; + + for (int i=0;igetStruct(dataChunk.dna_nr); + oldType = fileDna->getType(oldStruct[0]); + oldLen = fileDna->getLength(oldStruct[0]); + ///don't try to convert Link block data, just memcpy it. Other data can be converted. + reverseOld = mMemoryDNA->getReverseType(oldType); + + + if ((reverseOld!=-1)) + { + // make sure it's here + //assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!"); + // + curStruct = mMemoryDNA->getStruct(reverseOld); + newType = mMemoryDNA->getType(curStruct[0]); + // make sure it's the same + assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!"); + + + curLen = mMemoryDNA->getLength(curStruct[0]); + dataChunk.dna_nr = reverseOld; + if (strcmp("Link",oldType)!=0) + { + dataChunk.len = curLen * dataChunk.nr; + } else + { +// printf("keep length of link = %d\n",dataChunk.len); + } + + //write the structure header + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + + + + short int* curStruct1; + curStruct1 = mMemoryDNA->getStruct(dataChunk.dna_nr); + assert(curStruct1 == curStruct); + + char* cur = fixupPointers ? (char*)findLibPointer(dataChunk.oldPtr) : (char*)dataChunk.oldPtr; + + //write the actual contents of the structure(s) + fwrite(cur,dataChunk.len,1,fp); + } else + { + printf("serious error, struct mismatch: don't write\n"); + } + } + +} + + +// ----------------------------------------------------- // +int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags) +{ + bool swap = false; + bool varies = false; + + if (flags &FD_ENDIAN_SWAP) + swap = true; + if (flags &FD_BITS_VARIES) + varies = true; + + if (VOID_IS_8) + { + if (varies) + { + bChunkPtr4 head; + memcpy(&head, dataPtr, sizeof(bChunkPtr4)); + + + bChunkPtr8 chunk; + + chunk.code = head.code; + chunk.len = head.len; + chunk.m_uniqueInts[0] = head.m_uniqueInt; + chunk.m_uniqueInts[1] = 0; + chunk.dna_nr = head.dna_nr; + chunk.nr = head.nr; + + if (swap) + { + if ((chunk.code & 0xFFFF)==0) + chunk.code >>=16; + + SWITCH_INT(chunk.len); + SWITCH_INT(chunk.dna_nr); + SWITCH_INT(chunk.nr); + } + + + memcpy(dataChunk, &chunk, sizeof(bChunkInd)); + } + else + { + bChunkPtr8 c; + memcpy(&c, dataPtr, sizeof(bChunkPtr8)); + + if (swap) + { + if ((c.code & 0xFFFF)==0) + c.code >>=16; + + SWITCH_INT(c.len); + SWITCH_INT(c.dna_nr); + SWITCH_INT(c.nr); + } + + memcpy(dataChunk, &c, sizeof(bChunkInd)); + } + } + else + { + if (varies) + { + bChunkPtr8 head; + memcpy(&head, dataPtr, sizeof(bChunkPtr8)); + + + bChunkPtr4 chunk; + chunk.code = head.code; + chunk.len = head.len; + + if (head.m_uniqueInts[0]==head.m_uniqueInts[1]) + { + chunk.m_uniqueInt = head.m_uniqueInts[0]; + } else + { + long64 oldPtr =0; + memcpy(&oldPtr, &head.m_uniqueInts[0], 8); + if (swap) + SWITCH_LONGINT(oldPtr); + chunk.m_uniqueInt = (int)(oldPtr >> 3); + } + + + chunk.dna_nr = head.dna_nr; + chunk.nr = head.nr; + + if (swap) + { + if ((chunk.code & 0xFFFF)==0) + chunk.code >>=16; + + SWITCH_INT(chunk.len); + SWITCH_INT(chunk.dna_nr); + SWITCH_INT(chunk.nr); + } + + memcpy(dataChunk, &chunk, sizeof(bChunkInd)); + } + else + { + bChunkPtr4 c; + memcpy(&c, dataPtr, sizeof(bChunkPtr4)); + + if (swap) + { + if ((c.code & 0xFFFF)==0) + c.code >>=16; + + SWITCH_INT(c.len); + SWITCH_INT(c.dna_nr); + SWITCH_INT(c.nr); + } + memcpy(dataChunk, &c, sizeof(bChunkInd)); + } + } + + if (dataChunk->len < 0) + return -1; + +#if 0 + print ("----------"); + print (dataChunk->code); + print (dataChunk->len); + print (dataChunk->old); + print (dataChunk->dna_nr); + print (dataChunk->nr); +#endif + return (dataChunk->len+ChunkUtils::getOffset(flags)); +} + + + +//eof diff --git a/Code/Physics/Bullet Source/BulletFileLoader/bFile.h b/Code/Physics/Bullet Source/BulletFileLoader/bFile.h new file mode 100644 index 00000000..9df95adf --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/bFile.h @@ -0,0 +1,165 @@ +/* +bParse +Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BFILE_H__ +#define __BFILE_H__ + +#include "bCommon.h" +#include "bChunk.h" +#include + +namespace bParse { + + // ----------------------------------------------------- // + enum bFileFlags + { + FD_INVALID =0, + FD_OK =1, + FD_VOID_IS_8 =2, + FD_ENDIAN_SWAP =4, + FD_FILE_64 =8, + FD_BITS_VARIES =16, + FD_VERSION_VARIES = 32, + FD_DOUBLE_PRECISION =64, + FD_BROKEN_DNA = 128 + }; + + enum bFileVerboseMode + { + FD_VERBOSE_EXPORT_XML = 1, + FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS = 2, + FD_VERBOSE_DUMP_CHUNKS = 4, + FD_VERBOSE_DUMP_FILE_INFO=8, + }; + // ----------------------------------------------------- // + class bFile + { + protected: + + char m_headerString[7]; + + bool mOwnsBuffer; + char* mFileBuffer; + int mFileLen; + int mVersion; + + + bPtrMap mLibPointers; + + int mDataStart; + bDNA* mFileDNA; + bDNA* mMemoryDNA; + + btAlignedObjectArray m_pointerFixupArray; + btAlignedObjectArray m_pointerPtrFixupArray; + + btAlignedObjectArray m_chunks; + btHashMap m_chunkPtrPtrMap; + + // + + bPtrMap mDataPointers; + + + int mFlags; + + // //////////////////////////////////////////////////////////////////////////// + + // buffer offset util + int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags); + void safeSwapPtr(char *dst, const char *src); + + virtual void parseHeader(); + + virtual void parseData() = 0; + + void resolvePointersMismatch(); + void resolvePointersChunk(const bChunkInd& dataChunk, int verboseMode); + + int resolvePointersStructRecursive(char *strcPtr, int old_dna, int verboseMode, int recursion); + //void swapPtr(char *dst, char *src); + + void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers); + void getMatchingFileDNA(short* old, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers); + char* getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos); + + + void swap(char *head, class bChunkInd& ch, bool ignoreEndianFlag); + void swapData(char *data, short type, int arraySize, bool ignoreEndianFlag); + void swapStruct(int dna_nr, char *data, bool ignoreEndianFlag); + void swapLen(char *dataPtr); + void swapDNA(char* ptr); + + + char* readStruct(char *head, class bChunkInd& chunk); + char *getAsString(int code); + + void parseInternal(int verboseMode, char* memDna,int memDnaLength); + + public: + bFile(const char *filename, const char headerString[7]); + + //todo: make memoryBuffer const char + //bFile( const char *memoryBuffer, int len); + bFile( char *memoryBuffer, int len, const char headerString[7]); + virtual ~bFile(); + + bDNA* getFileDNA() + { + return mFileDNA; + } + + virtual void addDataBlock(char* dataBlock) = 0; + + int getFlags() const + { + return mFlags; + } + + bPtrMap& getLibPointers() + { + return mLibPointers; + } + + void* findLibPointer(void *ptr); + + bool ok(); + + virtual void parse(int verboseMode) = 0; + + virtual int write(const char* fileName, bool fixupPointers=false) = 0; + + virtual void writeChunks(FILE* fp, bool fixupPointers ); + + virtual void writeDNA(FILE* fp) = 0; + + void updateOldPointers(); + void resolvePointers(int verboseMode); + + void dumpChunks(bDNA* dna); + + int getVersion() const + { + return mVersion; + } + //pre-swap the endianness, so that data loaded on a target with different endianness doesn't need to be swapped + void preSwap(); + void writeFile(const char* fileName); + + }; +} + + +#endif//__BFILE_H__ diff --git a/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.cpp b/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.cpp new file mode 100644 index 00000000..3ecf8851 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.cpp @@ -0,0 +1,423 @@ +/* +bParse +Copyright (c) 2006-2010 Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletFile.h" +#include "bDefines.h" +#include "bDNA.h" + +#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__) +#include +#endif +#include + + +// 32 && 64 bit versions +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +#ifdef _WIN64 +extern char sBulletDNAstr64[]; +extern int sBulletDNAlen64; +#else +extern char sBulletDNAstr[]; +extern int sBulletDNAlen; +#endif //_WIN64 +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + +extern char sBulletDNAstr64[]; +extern int sBulletDNAlen64; +extern char sBulletDNAstr[]; +extern int sBulletDNAlen; + +#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + +using namespace bParse; + +btBulletFile::btBulletFile() +:bFile("", "BULLET ") +{ + mMemoryDNA = new bDNA(); //this memory gets released in the bFile::~bFile destructor,@todo not consistent with the rule 'who allocates it, has to deallocate it" + + m_DnaCopy = 0; + + +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +#ifdef _WIN64 + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); +#else//_WIN64 + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); +#endif//_WIN64 +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + m_DnaCopy = (char*) btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen64); + } + else + { + m_DnaCopy =(char*) btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + mMemoryDNA->init(m_DnaCopy,sBulletDNAlen); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +} + + + +btBulletFile::btBulletFile(const char* fileName) +:bFile(fileName, "BULLET ") +{ + m_DnaCopy = 0; +} + + + +btBulletFile::btBulletFile(char *memoryBuffer, int len) +:bFile(memoryBuffer,len, "BULLET ") +{ + m_DnaCopy = 0; +} + + +btBulletFile::~btBulletFile() +{ + if (m_DnaCopy) + btAlignedFree(m_DnaCopy); + + + while (m_dataBlocks.size()) + { + char* dataBlock = m_dataBlocks[m_dataBlocks.size()-1]; + delete[] dataBlock; + m_dataBlocks.pop_back(); + } + +} + + + +// ----------------------------------------------------- // +void btBulletFile::parseData() +{ +// printf ("Building datablocks"); +// printf ("Chunk size = %d",CHUNK_HEADER_LEN); +// printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags)); + + const bool brokenDNA = (mFlags&FD_BROKEN_DNA)!=0; + + //const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; + + + mDataStart = 12; + + char *dataPtr = mFileBuffer+mDataStart; + + bChunkInd dataChunk; + dataChunk.code = 0; + + + //dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags); + int seek = getNextBlock(&dataChunk, dataPtr, mFlags); + + + if (mFlags &FD_ENDIAN_SWAP) + swapLen(dataPtr); + + //dataPtr += ChunkUtils::getOffset(mFlags); + char *dataPtrHead = 0; + + while (dataChunk.code != DNA1) + { + if (!brokenDNA || (dataChunk.code != BT_QUANTIZED_BVH_CODE) ) + { + + // one behind + if (dataChunk.code == SDNA) break; + //if (dataChunk.code == DNA1) break; + + // same as (BHEAD+DATA dependency) + dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags); + if (dataChunk.dna_nr>=0) + { + char *id = readStruct(dataPtrHead, dataChunk); + + // lookup maps + if (id) + { + m_chunkPtrPtrMap.insert(dataChunk.oldPtr, dataChunk); + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)id); + + m_chunks.push_back(dataChunk); + // block it + //bListBasePtr *listID = mMain->getListBasePtr(dataChunk.code); + //if (listID) + // listID->push_back((bStructHandle*)id); + } + + if (dataChunk.code == BT_SOFTBODY_CODE) + { + m_softBodies.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_RIGIDBODY_CODE) + { + m_rigidBodies.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_DYNAMICSWORLD_CODE) + { + m_dynamicsWorldInfo.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_CONSTRAINT_CODE) + { + m_constraints.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_QUANTIZED_BVH_CODE) + { + m_bvhs.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_TRIANLGE_INFO_MAP) + { + m_triangleInfoMaps.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_COLLISIONOBJECT_CODE) + { + m_collisionObjects.push_back((bStructHandle*) id); + } + + if (dataChunk.code == BT_SHAPE_CODE) + { + m_collisionShapes.push_back((bStructHandle*) id); + } + + // if (dataChunk.code == GLOB) + // { + // m_glob = (bStructHandle*) id; + // } + } else + { + printf("unknown chunk\n"); + + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)dataPtrHead); + } + } else + { + printf("skipping BT_QUANTIZED_BVH_CODE due to broken DNA\n"); + } + + + dataPtr += seek; + + seek = getNextBlock(&dataChunk, dataPtr, mFlags); + if (mFlags &FD_ENDIAN_SWAP) + swapLen(dataPtr); + + if (seek < 0) + break; + } + +} + +void btBulletFile::addDataBlock(char* dataBlock) +{ + m_dataBlocks.push_back(dataBlock); + +} + + + + +void btBulletFile::writeDNA(FILE* fp) +{ + + bChunkInd dataChunk; + dataChunk.code = DNA1; + dataChunk.dna_nr = 0; + dataChunk.nr = 1; +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { +#ifdef _WIN64 + dataChunk.len = sBulletDNAlen64; + dataChunk.oldPtr = sBulletDNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); +#else + btAssert(0); +#endif + } + else + { +#ifndef _WIN64 + dataChunk.len = sBulletDNAlen; + dataChunk.oldPtr = sBulletDNAstr; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); +#else//_WIN64 + btAssert(0); +#endif//_WIN64 + } +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + dataChunk.len = sBulletDNAlen64; + dataChunk.oldPtr = sBulletDNAstr64; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr64, sBulletDNAlen64,1,fp); + } + else + { + dataChunk.len = sBulletDNAlen; + dataChunk.oldPtr = sBulletDNAstr; + fwrite(&dataChunk,sizeof(bChunkInd),1,fp); + fwrite(sBulletDNAstr, sBulletDNAlen,1,fp); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES +} + + +void btBulletFile::parse(int verboseMode) +{ +#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { +#ifdef _WIN64 + + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + parseInternal(verboseMode,(char*)sBulletDNAstr64,sBulletDNAlen64); +#else + btAssert(0); +#endif + } + else + { +#ifndef _WIN64 + + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + parseInternal(verboseMode,m_DnaCopy,sBulletDNAlen); +#else + btAssert(0); +#endif + } +#else//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + if (VOID_IS_8) + { + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen64,16); + memcpy(m_DnaCopy,sBulletDNAstr64,sBulletDNAlen64); + parseInternal(verboseMode,m_DnaCopy,sBulletDNAlen64); + } + else + { + if (m_DnaCopy) + delete m_DnaCopy; + m_DnaCopy = (char*)btAlignedAlloc(sBulletDNAlen,16); + memcpy(m_DnaCopy,sBulletDNAstr,sBulletDNAlen); + parseInternal(verboseMode,m_DnaCopy,sBulletDNAlen); + } +#endif//BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES + + //the parsing will convert to cpu endian + mFlags &=~FD_ENDIAN_SWAP; + + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + mFileBuffer[8] = littleEndian?'v':'V'; + +} + +// experimental +int btBulletFile::write(const char* fileName, bool fixupPointers) +{ + FILE *fp = fopen(fileName, "wb"); + if (fp) + { + char header[SIZEOFBLENDERHEADER] ; + memcpy(header, m_headerString, 7); + int endian= 1; + endian= ((char*)&endian)[0]; + + if (endian) + { + header[7] = '_'; + } else + { + header[7] = '-'; + } + if (VOID_IS_8) + { + header[8]='V'; + } else + { + header[8]='v'; + } + + header[9] = '2'; + header[10] = '7'; + header[11] = '5'; + + fwrite(header,SIZEOFBLENDERHEADER,1,fp); + + writeChunks(fp, fixupPointers); + + writeDNA(fp); + + fclose(fp); + + } else + { + printf("Error: cannot open file %s for writing\n",fileName); + return 0; + } + return 1; +} + + + +void btBulletFile::addStruct(const char* structType,void* data, int len, void* oldPtr, int code) +{ + + bParse::bChunkInd dataChunk; + dataChunk.code = code; + dataChunk.nr = 1; + dataChunk.len = len; + dataChunk.dna_nr = mMemoryDNA->getReverseType(structType); + dataChunk.oldPtr = oldPtr; + + ///Perform structure size validation + short* structInfo= mMemoryDNA->getStruct(dataChunk.dna_nr); + int elemBytes; + elemBytes= mMemoryDNA->getLength(structInfo[0]); +// int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]); + assert(len==elemBytes); + + mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data); + m_chunks.push_back(dataChunk); +} \ No newline at end of file diff --git a/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.h b/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.h new file mode 100644 index 00000000..c4d73562 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/btBulletFile.h @@ -0,0 +1,83 @@ +/* +bParse +Copyright (c) 2006-2010 Charlie C & Erwin Coumans http://gamekit.googlecode.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_BULLET_FILE_H +#define BT_BULLET_FILE_H + + +#include "bFile.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "bDefines.h" + +#include "LinearMath/btSerializer.h" + + + +namespace bParse { + + // ----------------------------------------------------- // + class btBulletFile : public bFile + { + + + protected: + + char* m_DnaCopy; + + public: + + btAlignedObjectArray m_softBodies; + + btAlignedObjectArray m_rigidBodies; + + btAlignedObjectArray m_collisionObjects; + + btAlignedObjectArray m_collisionShapes; + + btAlignedObjectArray m_constraints; + + btAlignedObjectArray m_bvhs; + + btAlignedObjectArray m_triangleInfoMaps; + + btAlignedObjectArray m_dynamicsWorldInfo; + + btAlignedObjectArray m_dataBlocks; + btBulletFile(); + + btBulletFile(const char* fileName); + + btBulletFile(char *memoryBuffer, int len); + + virtual ~btBulletFile(); + + virtual void addDataBlock(char* dataBlock); + + + // experimental + virtual int write(const char* fileName, bool fixupPointers=false); + + virtual void parse(int verboseMode); + + virtual void parseData(); + + virtual void writeDNA(FILE* fp); + + void addStruct(const char* structType,void* data, int len, void* oldPtr, int code); + + }; +}; + +#endif //BT_BULLET_FILE_H diff --git a/Code/Physics/Bullet Source/BulletFileLoader/premake4.lua b/Code/Physics/Bullet Source/BulletFileLoader/premake4.lua new file mode 100644 index 00000000..f4aad3da --- /dev/null +++ b/Code/Physics/Bullet Source/BulletFileLoader/premake4.lua @@ -0,0 +1,12 @@ + project "BulletFileLoader" + + kind "StaticLib" + targetdir "../../lib" + includedirs { + "../../../src" + } + + files { + "**.cpp", + "**.h" + } \ No newline at end of file diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/CMakeLists.txt b/Code/Physics/Bullet Source/BulletWorldImporter/CMakeLists.txt new file mode 100644 index 00000000..666ac21c --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/CMakeLists.txt @@ -0,0 +1,40 @@ +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src + ${BULLET_PHYSICS_SOURCE_DIR}/Extras/Serialize/BulletFileLoader +) + +ADD_LIBRARY( +BulletWorldImporter +btBulletWorldImporter.cpp +btBulletWorldImporter.h +btWorldImporter.cpp +btWorldImporter.h +) + +SET_TARGET_PROPERTIES(BulletWorldImporter PROPERTIES VERSION ${BULLET_VERSION}) +SET_TARGET_PROPERTIES(BulletWorldImporter PROPERTIES SOVERSION ${BULLET_VERSION}) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(BulletWorldImporter BulletDynamics BulletCollision BulletFileLoader LinearMath) +ENDIF (BUILD_SHARED_LIBS) + +IF (INSTALL_EXTRA_LIBS) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + #FILES_MATCHING requires CMake 2.6 + IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletWorldImporter DESTINATION .) + ELSE (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletWorldImporter DESTINATION lib${LIB_SUFFIX}) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.h" PATTERN +".svn" EXCLUDE PATTERN "CMakeFiles" EXCLUDE) + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + SET_TARGET_PROPERTIES(BulletWorldImporter PROPERTIES FRAMEWORK true) + SET_TARGET_PROPERTIES(BulletWorldImporter PROPERTIES PUBLIC_HEADER "btBulletWorldImporter.h") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF (INSTALL_EXTRA_LIBS) diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.cpp b/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.cpp new file mode 100644 index 00000000..3f3a3593 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.cpp @@ -0,0 +1,362 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "btBulletWorldImporter.h" +#include "../BulletFileLoader/btBulletFile.h" + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" + + + +//#define USE_INTERNAL_EDGE_UTILITY +#ifdef USE_INTERNAL_EDGE_UTILITY +#include "BulletCollision/CollisionDispatch/btInternalEdgeUtility.h" +#endif //USE_INTERNAL_EDGE_UTILITY + +btBulletWorldImporter::btBulletWorldImporter(btDynamicsWorld* world) + :btWorldImporter(world) +{ +} + +btBulletWorldImporter::~btBulletWorldImporter() +{ +} + + +bool btBulletWorldImporter::loadFile( const char* fileName, const char* preSwapFilenameOut) +{ + bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile(fileName); + + + bool result = loadFileFromMemory(bulletFile2); + //now you could save the file in 'native' format using + //bulletFile2->writeFile("native.bullet"); + if (result) + { + if (preSwapFilenameOut) + { + bulletFile2->preSwap(); + bulletFile2->writeFile(preSwapFilenameOut); + } + + } + delete bulletFile2; + + return result; + +} + + + +bool btBulletWorldImporter::loadFileFromMemory( char* memoryBuffer, int len) +{ + bParse::btBulletFile* bulletFile2 = new bParse::btBulletFile(memoryBuffer,len); + + bool result = loadFileFromMemory(bulletFile2); + + delete bulletFile2; + + return result; +} + + + + +bool btBulletWorldImporter::loadFileFromMemory( bParse::btBulletFile* bulletFile2) +{ + bool ok = (bulletFile2->getFlags()& bParse::FD_OK)!=0; + + if (ok) + bulletFile2->parse(m_verboseMode); + else + return false; + + if (m_verboseMode & bParse::FD_VERBOSE_DUMP_CHUNKS) + { + bulletFile2->dumpChunks(bulletFile2->getFileDNA()); + } + + return convertAllObjects(bulletFile2); + +} + +bool btBulletWorldImporter::convertAllObjects( bParse::btBulletFile* bulletFile2) +{ + + m_shapeMap.clear(); + m_bodyMap.clear(); + + int i; + + for (i=0;im_bvhs.size();i++) + { + btOptimizedBvh* bvh = createOptimizedBvh(); + + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btQuantizedBvhDoubleData* bvhData = (btQuantizedBvhDoubleData*)bulletFile2->m_bvhs[i]; + bvh->deSerializeDouble(*bvhData); + } else + { + btQuantizedBvhFloatData* bvhData = (btQuantizedBvhFloatData*)bulletFile2->m_bvhs[i]; + bvh->deSerializeFloat(*bvhData); + } + m_bvhMap.insert(bulletFile2->m_bvhs[i],bvh); + } + + + + + + for (i=0;im_collisionShapes.size();i++) + { + btCollisionShapeData* shapeData = (btCollisionShapeData*)bulletFile2->m_collisionShapes[i]; + btCollisionShape* shape = convertCollisionShape(shapeData); + if (shape) + { + // printf("shapeMap.insert(%x,%x)\n",shapeData,shape); + m_shapeMap.insert(shapeData,shape); + } + + if (shape&& shapeData->m_name) + { + char* newname = duplicateName(shapeData->m_name); + m_objectNameMap.insert(shape,newname); + m_nameShapeMap.insert(newname,shape); + } + } + + + + + + for (int i=0;im_dynamicsWorldInfo.size();i++) + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btDynamicsWorldDoubleData* solverInfoData = (btDynamicsWorldDoubleData*)bulletFile2->m_dynamicsWorldInfo[i]; + btContactSolverInfo solverInfo; + + btVector3 gravity; + gravity.deSerializeDouble(solverInfoData->m_gravity); + + solverInfo.m_tau = btScalar(solverInfoData->m_solverInfo.m_tau); + solverInfo.m_damping = btScalar(solverInfoData->m_solverInfo.m_damping); + solverInfo.m_friction = btScalar(solverInfoData->m_solverInfo.m_friction); + solverInfo.m_timeStep = btScalar(solverInfoData->m_solverInfo.m_timeStep); + + solverInfo.m_restitution = btScalar(solverInfoData->m_solverInfo.m_restitution); + solverInfo.m_maxErrorReduction = btScalar(solverInfoData->m_solverInfo.m_maxErrorReduction); + solverInfo.m_sor = btScalar(solverInfoData->m_solverInfo.m_sor); + solverInfo.m_erp = btScalar(solverInfoData->m_solverInfo.m_erp); + + solverInfo.m_erp2 = btScalar(solverInfoData->m_solverInfo.m_erp2); + solverInfo.m_globalCfm = btScalar(solverInfoData->m_solverInfo.m_globalCfm); + solverInfo.m_splitImpulsePenetrationThreshold = btScalar(solverInfoData->m_solverInfo.m_splitImpulsePenetrationThreshold); + solverInfo.m_splitImpulseTurnErp = btScalar(solverInfoData->m_solverInfo.m_splitImpulseTurnErp); + + solverInfo.m_linearSlop = btScalar(solverInfoData->m_solverInfo.m_linearSlop); + solverInfo.m_warmstartingFactor = btScalar(solverInfoData->m_solverInfo.m_warmstartingFactor); + solverInfo.m_maxGyroscopicForce = btScalar(solverInfoData->m_solverInfo.m_maxGyroscopicForce); + solverInfo.m_singleAxisRollingFrictionThreshold = btScalar(solverInfoData->m_solverInfo.m_singleAxisRollingFrictionThreshold); + + solverInfo.m_numIterations = solverInfoData->m_solverInfo.m_numIterations; + solverInfo.m_solverMode = solverInfoData->m_solverInfo.m_solverMode; + solverInfo.m_restingContactRestitutionThreshold = solverInfoData->m_solverInfo.m_restingContactRestitutionThreshold; + solverInfo.m_minimumSolverBatchSize = solverInfoData->m_solverInfo.m_minimumSolverBatchSize; + + solverInfo.m_splitImpulse = solverInfoData->m_solverInfo.m_splitImpulse; + + setDynamicsWorldInfo(gravity,solverInfo); + } else + { + btDynamicsWorldFloatData* solverInfoData = (btDynamicsWorldFloatData*)bulletFile2->m_dynamicsWorldInfo[i]; + btContactSolverInfo solverInfo; + + btVector3 gravity; + gravity.deSerializeFloat(solverInfoData->m_gravity); + + solverInfo.m_tau = solverInfoData->m_solverInfo.m_tau; + solverInfo.m_damping = solverInfoData->m_solverInfo.m_damping; + solverInfo.m_friction = solverInfoData->m_solverInfo.m_friction; + solverInfo.m_timeStep = solverInfoData->m_solverInfo.m_timeStep; + + solverInfo.m_restitution = solverInfoData->m_solverInfo.m_restitution; + solverInfo.m_maxErrorReduction = solverInfoData->m_solverInfo.m_maxErrorReduction; + solverInfo.m_sor = solverInfoData->m_solverInfo.m_sor; + solverInfo.m_erp = solverInfoData->m_solverInfo.m_erp; + + solverInfo.m_erp2 = solverInfoData->m_solverInfo.m_erp2; + solverInfo.m_globalCfm = solverInfoData->m_solverInfo.m_globalCfm; + solverInfo.m_splitImpulsePenetrationThreshold = solverInfoData->m_solverInfo.m_splitImpulsePenetrationThreshold; + solverInfo.m_splitImpulseTurnErp = solverInfoData->m_solverInfo.m_splitImpulseTurnErp; + + solverInfo.m_linearSlop = solverInfoData->m_solverInfo.m_linearSlop; + solverInfo.m_warmstartingFactor = solverInfoData->m_solverInfo.m_warmstartingFactor; + solverInfo.m_maxGyroscopicForce = solverInfoData->m_solverInfo.m_maxGyroscopicForce; + solverInfo.m_singleAxisRollingFrictionThreshold = solverInfoData->m_solverInfo.m_singleAxisRollingFrictionThreshold; + + solverInfo.m_numIterations = solverInfoData->m_solverInfo.m_numIterations; + solverInfo.m_solverMode = solverInfoData->m_solverInfo.m_solverMode; + solverInfo.m_restingContactRestitutionThreshold = solverInfoData->m_solverInfo.m_restingContactRestitutionThreshold; + solverInfo.m_minimumSolverBatchSize = solverInfoData->m_solverInfo.m_minimumSolverBatchSize; + + solverInfo.m_splitImpulse = solverInfoData->m_solverInfo.m_splitImpulse; + + setDynamicsWorldInfo(gravity,solverInfo); + } + } + + + for (i=0;im_rigidBodies.size();i++) + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btRigidBodyDoubleData* colObjData = (btRigidBodyDoubleData*)bulletFile2->m_rigidBodies[i]; + convertRigidBodyDouble(colObjData); + } else + { + btRigidBodyFloatData* colObjData = (btRigidBodyFloatData*)bulletFile2->m_rigidBodies[i]; + convertRigidBodyFloat(colObjData); + } + + + } + + for (i=0;im_collisionObjects.size();i++) + { + if (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION) + { + btCollisionObjectDoubleData* colObjData = (btCollisionObjectDoubleData*)bulletFile2->m_collisionObjects[i]; + btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f; + startTransform.deSerializeDouble(colObjData->m_worldTransform); + + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); + body->setFriction(btScalar(colObjData->m_friction)); + body->setRestitution(btScalar(colObjData->m_restitution)); + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + m_bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + + } else + { + btCollisionObjectFloatData* colObjData = (btCollisionObjectFloatData*)bulletFile2->m_collisionObjects[i]; + btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f; + startTransform.deSerializeFloat(colObjData->m_worldTransform); + + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name); + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + m_bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } + } + + } + + + for (i=0;im_constraints.size();i++) + { + btTypedConstraintData2* constraintData = (btTypedConstraintData2*)bulletFile2->m_constraints[i]; + btTypedConstraintFloatData* singleC = (btTypedConstraintFloatData*)bulletFile2->m_constraints[i]; + btTypedConstraintDoubleData* doubleC = (btTypedConstraintDoubleData*)bulletFile2->m_constraints[i]; + + btCollisionObject** colAptr = m_bodyMap.find(constraintData->m_rbA); + btCollisionObject** colBptr = m_bodyMap.find(constraintData->m_rbB); + + btRigidBody* rbA = 0; + btRigidBody* rbB = 0; + + if (colAptr) + { + rbA = btRigidBody::upcast(*colAptr); + if (!rbA) + rbA = &getFixedBody(); + } + if (colBptr) + { + rbB = btRigidBody::upcast(*colBptr); + if (!rbB) + rbB = &getFixedBody(); + } + if (!rbA && !rbB) + continue; + + bool isDoublePrecisionData = (bulletFile2->getFlags() & bParse::FD_DOUBLE_PRECISION)!=0; + + if (isDoublePrecisionData) + { + if (bulletFile2->getVersion()>=282) + { + btTypedConstraintDoubleData* dc = (btTypedConstraintDoubleData*)constraintData; + convertConstraintDouble(dc, rbA,rbB, bulletFile2->getVersion()); + } else + { + //double-precision constraints were messed up until 2.82, try to recover data... + + btTypedConstraintData* oldData = (btTypedConstraintData*)constraintData; + + convertConstraintBackwardsCompatible281(oldData, rbA,rbB, bulletFile2->getVersion()); + + } + } + else + { + btTypedConstraintFloatData* dc = (btTypedConstraintFloatData*)constraintData; + convertConstraintFloat(dc, rbA,rbB, bulletFile2->getVersion()); + } + + + } + + return true; +} + diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.h b/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.h new file mode 100644 index 00000000..27c1e7e3 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/btBulletWorldImporter.h @@ -0,0 +1,68 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#ifndef BULLET_WORLD_IMPORTER_H +#define BULLET_WORLD_IMPORTER_H + + +#include "btWorldImporter.h" + + +class btBulletFile; + + + + +namespace bParse +{ + class btBulletFile; + +}; + + + +///The btBulletWorldImporter is a starting point to import .bullet files. +///note that not all data is converted yet. You are expected to override or modify this class. +///See Bullet/Demos/SerializeDemo for a derived class that extract btSoftBody objects too. +class btBulletWorldImporter : public btWorldImporter +{ + + +public: + + btBulletWorldImporter(btDynamicsWorld* world=0); + + virtual ~btBulletWorldImporter(); + + ///if you pass a valid preSwapFilenameOut, it will save a new file with a different endianness + ///this pre-swapped file can be loaded without swapping on a target platform of different endianness + bool loadFile(const char* fileName, const char* preSwapFilenameOut=0); + + ///the memoryBuffer might be modified (for example if endian swaps are necessary) + bool loadFileFromMemory(char *memoryBuffer, int len); + + bool loadFileFromMemory(bParse::btBulletFile* file); + + //call make sure bulletFile2 has been parsed, either using btBulletFile::parse or btBulletWorldImporter::loadFileFromMemory + virtual bool convertAllObjects(bParse::btBulletFile* file); + + + + +}; + +#endif //BULLET_WORLD_IMPORTER_H + diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.cpp b/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.cpp new file mode 100644 index 00000000..982931e0 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.cpp @@ -0,0 +1,1922 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btWorldImporter.h" +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" + +btWorldImporter::btWorldImporter(btDynamicsWorld* world) +:m_dynamicsWorld(world), +m_verboseMode(0) +{ + +} + +btWorldImporter::~btWorldImporter() +{ +} + +void btWorldImporter::deleteAllData() +{ + int i; + for (i=0;iremoveConstraint(m_allocatedConstraints[i]); + delete m_allocatedConstraints[i]; + } + m_allocatedConstraints.clear(); + + + for (i=0;iremoveRigidBody(btRigidBody::upcast(m_allocatedRigidBodies[i])); + delete m_allocatedRigidBodies[i]; + } + + m_allocatedRigidBodies.clear(); + + + for (i=0;im_numMeshParts;a++) + { + btMeshPartData* curPart = &curData->m_meshPartsPtr[a]; + if(curPart->m_vertices3f) + delete [] curPart->m_vertices3f; + + if(curPart->m_vertices3d) + delete [] curPart->m_vertices3d; + + if(curPart->m_indices32) + delete [] curPart->m_indices32; + + if(curPart->m_3indices16) + delete [] curPart->m_3indices16; + + if(curPart->m_indices16) + delete [] curPart->m_indices16; + + if (curPart->m_3indices8) + delete [] curPart->m_3indices8; + + } + delete [] curData->m_meshPartsPtr; + delete curData; + } + m_allocatedbtStridingMeshInterfaceDatas.clear(); + + for (i=0;im_shapeType) + { + case STATIC_PLANE_PROXYTYPE: + { + btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData; + btVector3 planeNormal,localScaling; + planeNormal.deSerializeFloat(planeData->m_planeNormal); + localScaling.deSerializeFloat(planeData->m_localScaling); + shape = createPlaneShape(planeNormal,planeData->m_planeConstant); + shape->setLocalScaling(localScaling); + + break; + } + case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + btScaledTriangleMeshShapeData* scaledMesh = (btScaledTriangleMeshShapeData*) shapeData; + btCollisionShapeData* colShapeData = (btCollisionShapeData*) &scaledMesh->m_trimeshShapeData; + colShapeData->m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE; + btCollisionShape* childShape = convertCollisionShape(colShapeData); + btBvhTriangleMeshShape* meshShape = (btBvhTriangleMeshShape*)childShape; + btVector3 localScaling; + localScaling.deSerializeFloat(scaledMesh->m_localScaling); + + shape = createScaledTrangleMeshShape(meshShape, localScaling); + break; + } + case GIMPACT_SHAPE_PROXYTYPE: + { + btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData; + if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE) + { + btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&gimpactData->m_meshInterface); + btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData); + + + btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface); + btVector3 localScaling; + localScaling.deSerializeFloat(gimpactData->m_localScaling); + gimpactShape->setLocalScaling(localScaling); + gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin)); + gimpactShape->updateBound(); + shape = gimpactShape; + } else + { + printf("unsupported gimpact sub type\n"); + } + break; + } + + case CYLINDER_SHAPE_PROXYTYPE: + case CONE_SHAPE_PROXYTYPE: + case CAPSULE_SHAPE_PROXYTYPE: + case BOX_SHAPE_PROXYTYPE: + case SPHERE_SHAPE_PROXYTYPE: + case MULTI_SPHERE_SHAPE_PROXYTYPE: + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData; + btVector3 implicitShapeDimensions; + implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions); + btVector3 localScaling; + localScaling.deSerializeFloat(bsd->m_localScaling); + btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin); + switch (shapeData->m_shapeType) + { + case BOX_SHAPE_PROXYTYPE: + { + btBoxShape* box= (btBoxShape*)createBoxShape(implicitShapeDimensions/localScaling+margin); + //box->initializePolyhedralFeatures(); + shape = box; + + break; + } + case SPHERE_SHAPE_PROXYTYPE: + { + shape = createSphereShape(implicitShapeDimensions.getX()); + break; + } + case CAPSULE_SHAPE_PROXYTYPE: + { + btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData; + switch (capData->m_upAxis) + { + case 0: + { + shape = createCapsuleShapeX(implicitShapeDimensions.getY()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getX()); + break; + } + case 1: + { + shape = createCapsuleShapeY(implicitShapeDimensions.getX()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getY()); + break; + } + case 2: + { + shape = createCapsuleShapeZ(implicitShapeDimensions.getX()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getZ()); + break; + } + default: + { + printf("error: wrong up axis for btCapsuleShape\n"); + } + bsd->m_collisionMargin = 0.f; + + }; + + break; + } + case CYLINDER_SHAPE_PROXYTYPE: + { + btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData; + btVector3 halfExtents = implicitShapeDimensions+margin; + switch (cylData->m_upAxis) + { + case 0: + { + shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX()); + break; + } + case 1: + { + shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY()); + break; + } + case 2: + { + shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ()); + break; + } + default: + { + printf("unknown Cylinder up axis\n"); + } + + }; + + + + break; + } + case CONE_SHAPE_PROXYTYPE: + { + btConeShapeData* conData = (btConeShapeData*) shapeData; + btVector3 halfExtents = implicitShapeDimensions;//+margin; + switch (conData->m_upIndex) + { + case 0: + { + shape = createConeShapeX(halfExtents.getY(),halfExtents.getX()); + break; + } + case 1: + { + shape = createConeShapeY(halfExtents.getX(),halfExtents.getY()); + break; + } + case 2: + { + shape = createConeShapeZ(halfExtents.getX(),halfExtents.getZ()); + break; + } + default: + { + printf("unknown Cone up axis\n"); + } + + }; + + + + break; + } + case MULTI_SPHERE_SHAPE_PROXYTYPE: + { + btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd; + int numSpheres = mss->m_localPositionArraySize; + + btAlignedObjectArray tmpPos; + btAlignedObjectArray radii; + radii.resize(numSpheres); + tmpPos.resize(numSpheres); + int i; + for ( i=0;im_localPositionArrayPtr[i].m_pos); + radii[i] = mss->m_localPositionArrayPtr[i].m_radius; + } + shape = createMultiSphereShape(&tmpPos[0],&radii[0],numSpheres); + break; + } + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + // int sz = sizeof(btConvexHullShapeData); + // int sz2 = sizeof(btConvexInternalShapeData); + // int sz3 = sizeof(btCollisionShapeData); + btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd; + int numPoints = convexData->m_numUnscaledPoints; + + btAlignedObjectArray tmpPoints; + tmpPoints.resize(numPoints); + int i; + for ( i=0;im_unscaledPointsDoublePtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]); + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]); +#else + if (convexData->m_unscaledPointsFloatPtr) + tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]); + if (convexData->m_unscaledPointsDoublePtr) + tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]); +#endif //BT_USE_DOUBLE_PRECISION + } + btConvexHullShape* hullShape = createConvexHullShape(); + for (i=0;iaddPoint(tmpPoints[i]); + } + hullShape->setMargin(bsd->m_collisionMargin); + //hullShape->initializePolyhedralFeatures(); + shape = hullShape; + break; + } + default: + { + printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType); + } + } + + if (shape) + { + shape->setMargin(bsd->m_collisionMargin); + + btVector3 localScaling; + localScaling.deSerializeFloat(bsd->m_localScaling); + shape->setLocalScaling(localScaling); + + } + break; + } + case TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData; + btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&trimesh->m_meshInterface); + btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData); + if (!meshInterface->getNumSubParts()) + { + return 0; + } + + btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling); + meshInterface->setScaling(scaling); + + + btOptimizedBvh* bvh = 0; +#if 1 + if (trimesh->m_quantizedFloatBvh) + { + btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedFloatBvh); + if (bvhPtr && *bvhPtr) + { + bvh = *bvhPtr; + } else + { + bvh = createOptimizedBvh(); + bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh); + } + } + if (trimesh->m_quantizedDoubleBvh) + { + btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedDoubleBvh); + if (bvhPtr && *bvhPtr) + { + bvh = *bvhPtr; + } else + { + bvh = createOptimizedBvh(); + bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh); + } + } +#endif + + + btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh); + trimeshShape->setMargin(trimesh->m_collisionMargin); + shape = trimeshShape; + + if (trimesh->m_triangleInfoMap) + { + btTriangleInfoMap* map = createTriangleInfoMap(); + map->deSerialize(*trimesh->m_triangleInfoMap); + trimeshShape->setTriangleInfoMap(map); + +#ifdef USE_INTERNAL_EDGE_UTILITY + gContactAddedCallback = btAdjustInternalEdgeContactsCallback; +#endif //USE_INTERNAL_EDGE_UTILITY + + } + + //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin); + break; + } + case COMPOUND_SHAPE_PROXYTYPE: + { + btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData; + btCompoundShape* compoundShape = createCompoundShape(); + + btCompoundShapeChildData* childShapeDataArray = &compoundData->m_childShapePtr[0]; + + + btAlignedObjectArray childShapes; + for (int i=0;im_numChildShapes;i++) + { + btCompoundShapeChildData* ptr = &compoundData->m_childShapePtr[i]; + + btCollisionShapeData* cd = compoundData->m_childShapePtr[i].m_childShape; + + btCollisionShape* childShape = convertCollisionShape(cd); + if (childShape) + { + btTransform localTransform; + localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform); + compoundShape->addChildShape(localTransform,childShape); + } else + { +#ifdef _DEBUG + printf("error: couldn't create childShape for compoundShape\n"); +#endif + } + + } + shape = compoundShape; + + break; + } + case SOFTBODY_SHAPE_PROXYTYPE: + { + return 0; + } + default: + { +#ifdef _DEBUG + printf("unsupported shape type (%d)\n",shapeData->m_shapeType); +#endif + } + } + + return shape; + +} + + + +char* btWorldImporter::duplicateName(const char* name) +{ + if (name) + { + int l = (int)strlen(name); + char* newName = new char[l+1]; + memcpy(newName,name,l); + newName[l] = 0; + m_allocatedNames.push_back(newName); + return newName; + } + return 0; +} + +void btWorldImporter::convertConstraintBackwardsCompatible281(btTypedConstraintData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion) +{ + + btTypedConstraint* constraint = 0; + + switch (constraintData->m_objectType) + { + case POINT2POINT_CONSTRAINT_TYPE: + { + btPoint2PointConstraintDoubleData* p2pData = (btPoint2PointConstraintDoubleData*)constraintData; + if (rbA && rbB) + { + btVector3 pivotInA,pivotInB; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + pivotInB.deSerializeDouble(p2pData->m_pivotInB); + constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); + } else + { + btVector3 pivotInA; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + constraint = createPoint2PointConstraint(*rbA,pivotInA); + } + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = 0; + + btHingeConstraintDoubleData* hingeData = (btHingeConstraintDoubleData*)constraintData; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + rbBFrame.deSerializeDouble(hingeData->m_rbBFrame); + hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); + } + if (hingeData->m_enableAngularMotor) + { + hinge->enableAngularMotor(true,(btScalar)hingeData->m_motorTargetVelocity,(btScalar)hingeData->m_maxMotorImpulse); + } + hinge->setAngularOnly(hingeData->m_angularOnly!=0); + hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); + + constraint = hinge; + break; + + } + case CONETWIST_CONSTRAINT_TYPE: + { + btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData; + btConeTwistConstraint* coneTwist = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + rbBFrame.deSerializeFloat(coneData->m_rbBFrame); + coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + coneTwist = createConeTwistConstraint(*rbA,rbAFrame); + } + coneTwist->setLimit((btScalar)coneData->m_swingSpan1,(btScalar)coneData->m_swingSpan2,(btScalar)coneData->m_twistSpan,(btScalar)coneData->m_limitSoftness, + (btScalar)coneData->m_biasFactor,(btScalar)coneData->m_relaxationFactor); + coneTwist->setDamping((btScalar)coneData->m_damping); + + constraint = coneTwist; + break; + } + + case D6_SPRING_CONSTRAINT_TYPE: + { + + btGeneric6DofSpringConstraintData* dofData = (btGeneric6DofSpringConstraintData*)constraintData; + // int sz = sizeof(btGeneric6DofSpringConstraintData); + btGeneric6DofSpringConstraint* dof = 0; + + if (rbA && rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(dofData->m_6dofData.m_rbAFrame); + rbBFrame.deSerializeFloat(dofData->m_6dofData.m_rbBFrame); + dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n"); + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeFloat(dofData->m_6dofData.m_angularLowerLimit); + angUpperLimit.deSerializeFloat(dofData->m_6dofData.m_angularUpperLimit); + linLowerLimit.deSerializeFloat(dofData->m_6dofData.m_linearLowerLimit); + linUpperlimit.deSerializeFloat(dofData->m_6dofData.m_linearUpperLimit); + + angLowerLimit.setW(0.f); + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + + int i; + if (fileVersion>280) + { + for (i=0;i<6;i++) + { + dof->setStiffness(i,(btScalar)dofData->m_springStiffness[i]); + dof->setEquilibriumPoint(i,(btScalar)dofData->m_equilibriumPoint[i]); + dof->enableSpring(i,dofData->m_springEnabled[i]!=0); + dof->setDamping(i,(btScalar)dofData->m_springDamping[i]); + } + } + } + + constraint = dof; + break; + + } + case D6_CONSTRAINT_TYPE: + { + btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData; + btGeneric6DofConstraint* dof = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(dofData->m_rbAFrame); + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + if (rbB) + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n"); + } + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit); + angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit); + linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit); + linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit); + + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + } + + constraint = dof; + break; + } + case SLIDER_CONSTRAINT_TYPE: + { + btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData; + btSliderConstraint* slider = 0; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(sliderData->m_rbAFrame); + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } else + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } + slider->setLowerLinLimit((btScalar)sliderData->m_linearLowerLimit); + slider->setUpperLinLimit((btScalar)sliderData->m_linearUpperLimit); + slider->setLowerAngLimit((btScalar)sliderData->m_angularLowerLimit); + slider->setUpperAngLimit((btScalar)sliderData->m_angularUpperLimit); + slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0); + constraint = slider; + break; + } + + default: + { + printf("unknown constraint type\n"); + } + }; + + if (constraint) + { + constraint->setDbgDrawSize((btScalar)constraintData->m_dbgDrawSize); + ///those fields didn't exist and set to zero for pre-280 versions, so do a check here + if (fileVersion>=280) + { + constraint->setBreakingImpulseThreshold((btScalar)constraintData->m_breakingImpulseThreshold); + constraint->setEnabled(constraintData->m_isEnabled!=0); + constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations); + } + + if (constraintData->m_name) + { + char* newname = duplicateName(constraintData->m_name); + m_nameConstraintMap.insert(newname,constraint); + m_objectNameMap.insert(constraint,newname); + } + if(m_dynamicsWorld) + m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0); + } + +} + +void btWorldImporter::convertConstraintFloat(btTypedConstraintFloatData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion) +{ + btTypedConstraint* constraint = 0; + + switch (constraintData->m_objectType) + { + case POINT2POINT_CONSTRAINT_TYPE: + { + btPoint2PointConstraintFloatData* p2pData = (btPoint2PointConstraintFloatData*)constraintData; + if (rbA&& rbB) + { + btVector3 pivotInA,pivotInB; + pivotInA.deSerializeFloat(p2pData->m_pivotInA); + pivotInB.deSerializeFloat(p2pData->m_pivotInB); + constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); + + } else + { + btVector3 pivotInA; + pivotInA.deSerializeFloat(p2pData->m_pivotInA); + constraint = createPoint2PointConstraint(*rbA,pivotInA); + } + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = 0; + btHingeConstraintFloatData* hingeData = (btHingeConstraintFloatData*)constraintData; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); + rbBFrame.deSerializeFloat(hingeData->m_rbBFrame); + hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeFloat(hingeData->m_rbAFrame); + hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); + } + if (hingeData->m_enableAngularMotor) + { + hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse); + } + hinge->setAngularOnly(hingeData->m_angularOnly!=0); + hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); + + constraint = hinge; + break; + + } + case CONETWIST_CONSTRAINT_TYPE: + { + btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData; + btConeTwistConstraint* coneTwist = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + rbBFrame.deSerializeFloat(coneData->m_rbBFrame); + coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeFloat(coneData->m_rbAFrame); + coneTwist = createConeTwistConstraint(*rbA,rbAFrame); + } + coneTwist->setLimit(coneData->m_swingSpan1,coneData->m_swingSpan2,coneData->m_twistSpan,coneData->m_limitSoftness,coneData->m_biasFactor,coneData->m_relaxationFactor); + coneTwist->setDamping(coneData->m_damping); + + constraint = coneTwist; + break; + } + + case D6_SPRING_CONSTRAINT_TYPE: + { + + btGeneric6DofSpringConstraintData* dofData = (btGeneric6DofSpringConstraintData*)constraintData; + // int sz = sizeof(btGeneric6DofSpringConstraintData); + btGeneric6DofSpringConstraint* dof = 0; + + if (rbA && rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(dofData->m_6dofData.m_rbAFrame); + rbBFrame.deSerializeFloat(dofData->m_6dofData.m_rbBFrame); + dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n"); + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeFloat(dofData->m_6dofData.m_angularLowerLimit); + angUpperLimit.deSerializeFloat(dofData->m_6dofData.m_angularUpperLimit); + linLowerLimit.deSerializeFloat(dofData->m_6dofData.m_linearLowerLimit); + linUpperlimit.deSerializeFloat(dofData->m_6dofData.m_linearUpperLimit); + + angLowerLimit.setW(0.f); + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + + int i; + if (fileVersion>280) + { + for (i=0;i<6;i++) + { + dof->setStiffness(i,dofData->m_springStiffness[i]); + dof->setEquilibriumPoint(i,dofData->m_equilibriumPoint[i]); + dof->enableSpring(i,dofData->m_springEnabled[i]!=0); + dof->setDamping(i,dofData->m_springDamping[i]); + } + } + } + + constraint = dof; + break; + } + case D6_CONSTRAINT_TYPE: + { + btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData; + btGeneric6DofConstraint* dof = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(dofData->m_rbAFrame); + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + if (rbB) + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n"); + } + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit); + angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit); + linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit); + linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit); + + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + } + + constraint = dof; + break; + } + case SLIDER_CONSTRAINT_TYPE: + { + btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData; + btSliderConstraint* slider = 0; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeFloat(sliderData->m_rbAFrame); + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } else + { + btTransform rbBFrame; + rbBFrame.deSerializeFloat(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } + slider->setLowerLinLimit(sliderData->m_linearLowerLimit); + slider->setUpperLinLimit(sliderData->m_linearUpperLimit); + slider->setLowerAngLimit(sliderData->m_angularLowerLimit); + slider->setUpperAngLimit(sliderData->m_angularUpperLimit); + slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0); + constraint = slider; + break; + } + case GEAR_CONSTRAINT_TYPE: + { + btGearConstraintFloatData* gearData = (btGearConstraintFloatData*) constraintData; + btGearConstraint* gear = 0; + if (rbA&&rbB) + { + btVector3 axisInA,axisInB; + axisInA.deSerializeFloat(gearData->m_axisInA); + axisInB.deSerializeFloat(gearData->m_axisInB); + gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio); + } else + { + btAssert(0); + //perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized? + //btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f); + } + constraint = gear; + break; + } + default: + { + printf("unknown constraint type\n"); + } + }; + + if (constraint) + { + constraint->setDbgDrawSize(constraintData->m_dbgDrawSize); + ///those fields didn't exist and set to zero for pre-280 versions, so do a check here + if (fileVersion>=280) + { + constraint->setBreakingImpulseThreshold(constraintData->m_breakingImpulseThreshold); + constraint->setEnabled(constraintData->m_isEnabled!=0); + constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations); + } + + if (constraintData->m_name) + { + char* newname = duplicateName(constraintData->m_name); + m_nameConstraintMap.insert(newname,constraint); + m_objectNameMap.insert(constraint,newname); + } + if(m_dynamicsWorld) + m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0); + } + + +} + + + +void btWorldImporter::convertConstraintDouble(btTypedConstraintDoubleData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion) +{ + btTypedConstraint* constraint = 0; + + switch (constraintData->m_objectType) + { + case POINT2POINT_CONSTRAINT_TYPE: + { + btPoint2PointConstraintDoubleData2* p2pData = (btPoint2PointConstraintDoubleData2*)constraintData; + if (rbA && rbB) + { + btVector3 pivotInA,pivotInB; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + pivotInB.deSerializeDouble(p2pData->m_pivotInB); + constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB); + } else + { + btVector3 pivotInA; + pivotInA.deSerializeDouble(p2pData->m_pivotInA); + constraint = createPoint2PointConstraint(*rbA,pivotInA); + } + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = 0; + + btHingeConstraintDoubleData2* hingeData = (btHingeConstraintDoubleData2*)constraintData; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + rbBFrame.deSerializeDouble(hingeData->m_rbBFrame); + hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeDouble(hingeData->m_rbAFrame); + hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0); + } + if (hingeData->m_enableAngularMotor) + { + hinge->enableAngularMotor(true,(btScalar)hingeData->m_motorTargetVelocity,(btScalar)hingeData->m_maxMotorImpulse); + } + hinge->setAngularOnly(hingeData->m_angularOnly!=0); + hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor)); + + constraint = hinge; + break; + + } + case CONETWIST_CONSTRAINT_TYPE: + { + btConeTwistConstraintDoubleData* coneData = (btConeTwistConstraintDoubleData*)constraintData; + btConeTwistConstraint* coneTwist = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(coneData->m_rbAFrame); + rbBFrame.deSerializeDouble(coneData->m_rbBFrame); + coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame); + } else + { + btTransform rbAFrame; + rbAFrame.deSerializeDouble(coneData->m_rbAFrame); + coneTwist = createConeTwistConstraint(*rbA,rbAFrame); + } + coneTwist->setLimit((btScalar)coneData->m_swingSpan1,(btScalar)coneData->m_swingSpan2,(btScalar)coneData->m_twistSpan,(btScalar)coneData->m_limitSoftness, + (btScalar)coneData->m_biasFactor,(btScalar)coneData->m_relaxationFactor); + coneTwist->setDamping((btScalar)coneData->m_damping); + + constraint = coneTwist; + break; + } + + case D6_SPRING_CONSTRAINT_TYPE: + { + + btGeneric6DofSpringConstraintDoubleData2* dofData = (btGeneric6DofSpringConstraintDoubleData2*)constraintData; + // int sz = sizeof(btGeneric6DofSpringConstraintData); + btGeneric6DofSpringConstraint* dof = 0; + + if (rbA && rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(dofData->m_6dofData.m_rbAFrame); + rbBFrame.deSerializeDouble(dofData->m_6dofData.m_rbBFrame); + dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n"); + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeDouble(dofData->m_6dofData.m_angularLowerLimit); + angUpperLimit.deSerializeDouble(dofData->m_6dofData.m_angularUpperLimit); + linLowerLimit.deSerializeDouble(dofData->m_6dofData.m_linearLowerLimit); + linUpperlimit.deSerializeDouble(dofData->m_6dofData.m_linearUpperLimit); + + angLowerLimit.setW(0.f); + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + + int i; + if (fileVersion>280) + { + for (i=0;i<6;i++) + { + dof->setStiffness(i,(btScalar)dofData->m_springStiffness[i]); + dof->setEquilibriumPoint(i,(btScalar)dofData->m_equilibriumPoint[i]); + dof->enableSpring(i,dofData->m_springEnabled[i]!=0); + dof->setDamping(i,(btScalar)dofData->m_springDamping[i]); + } + } + } + + constraint = dof; + break; + } + case D6_CONSTRAINT_TYPE: + { + btGeneric6DofConstraintDoubleData2* dofData = (btGeneric6DofConstraintDoubleData2*)constraintData; + btGeneric6DofConstraint* dof = 0; + + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(dofData->m_rbAFrame); + rbBFrame.deSerializeDouble(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + if (rbB) + { + btTransform rbBFrame; + rbBFrame.deSerializeDouble(dofData->m_rbBFrame); + dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0); + } else + { + printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n"); + } + } + + if (dof) + { + btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit; + angLowerLimit.deSerializeDouble(dofData->m_angularLowerLimit); + angUpperLimit.deSerializeDouble(dofData->m_angularUpperLimit); + linLowerLimit.deSerializeDouble(dofData->m_linearLowerLimit); + linUpperlimit.deSerializeDouble(dofData->m_linearUpperLimit); + + dof->setAngularLowerLimit(angLowerLimit); + dof->setAngularUpperLimit(angUpperLimit); + dof->setLinearLowerLimit(linLowerLimit); + dof->setLinearUpperLimit(linUpperlimit); + } + + constraint = dof; + break; + } + case SLIDER_CONSTRAINT_TYPE: + { + btSliderConstraintDoubleData* sliderData = (btSliderConstraintDoubleData*)constraintData; + btSliderConstraint* slider = 0; + if (rbA&& rbB) + { + btTransform rbAFrame,rbBFrame; + rbAFrame.deSerializeDouble(sliderData->m_rbAFrame); + rbBFrame.deSerializeDouble(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } else + { + btTransform rbBFrame; + rbBFrame.deSerializeDouble(sliderData->m_rbBFrame); + slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0); + } + slider->setLowerLinLimit((btScalar)sliderData->m_linearLowerLimit); + slider->setUpperLinLimit((btScalar)sliderData->m_linearUpperLimit); + slider->setLowerAngLimit((btScalar)sliderData->m_angularLowerLimit); + slider->setUpperAngLimit((btScalar)sliderData->m_angularUpperLimit); + slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0); + constraint = slider; + break; + } + case GEAR_CONSTRAINT_TYPE: + { + btGearConstraintDoubleData* gearData = (btGearConstraintDoubleData*) constraintData; + btGearConstraint* gear = 0; + if (rbA&&rbB) + { + btVector3 axisInA,axisInB; + axisInA.deSerializeDouble(gearData->m_axisInA); + axisInB.deSerializeDouble(gearData->m_axisInB); + gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio); + } else + { + btAssert(0); + //perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized? + //btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f); + } + constraint = gear; + break; + } + default: + { + printf("unknown constraint type\n"); + } + }; + + if (constraint) + { + constraint->setDbgDrawSize((btScalar)constraintData->m_dbgDrawSize); + ///those fields didn't exist and set to zero for pre-280 versions, so do a check here + if (fileVersion>=280) + { + constraint->setBreakingImpulseThreshold((btScalar)constraintData->m_breakingImpulseThreshold); + constraint->setEnabled(constraintData->m_isEnabled!=0); + constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations); + } + + if (constraintData->m_name) + { + char* newname = duplicateName(constraintData->m_name); + m_nameConstraintMap.insert(newname,constraint); + m_objectNameMap.insert(constraint,newname); + } + if(m_dynamicsWorld) + m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0); + } + + +} + + + + + + + + + + +btTriangleIndexVertexArray* btWorldImporter::createMeshInterface(btStridingMeshInterfaceData& meshData) +{ + btTriangleIndexVertexArray* meshInterface = createTriangleMeshContainer(); + + for (int i=0;iaddIndexedMesh(meshPart,meshPart.m_indexType); + } + } + + return meshInterface; +} + + +btStridingMeshInterfaceData* btWorldImporter::createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData) +{ + //create a new btStridingMeshInterfaceData that is an exact copy of shapedata and store it in the WorldImporter + btStridingMeshInterfaceData* newData = new btStridingMeshInterfaceData; + + newData->m_scaling = interfaceData->m_scaling; + newData->m_numMeshParts = interfaceData->m_numMeshParts; + newData->m_meshPartsPtr = new btMeshPartData[newData->m_numMeshParts]; + + for(int i = 0;i < newData->m_numMeshParts;i++) + { + btMeshPartData* curPart = &interfaceData->m_meshPartsPtr[i]; + btMeshPartData* curNewPart = &newData->m_meshPartsPtr[i]; + + curNewPart->m_numTriangles = curPart->m_numTriangles; + curNewPart->m_numVertices = curPart->m_numVertices; + + if(curPart->m_vertices3f) + { + curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices]; + memcpy(curNewPart->m_vertices3f,curPart->m_vertices3f,sizeof(btVector3FloatData) * curNewPart->m_numVertices); + } + else + curNewPart->m_vertices3f = NULL; + + if(curPart->m_vertices3d) + { + curNewPart->m_vertices3d = new btVector3DoubleData[curNewPart->m_numVertices]; + memcpy(curNewPart->m_vertices3d,curPart->m_vertices3d,sizeof(btVector3DoubleData) * curNewPart->m_numVertices); + } + else + curNewPart->m_vertices3d = NULL; + + int numIndices = curNewPart->m_numTriangles * 3; + ///the m_3indices8 was not initialized in some Bullet versions, this can cause crashes at loading time + ///we catch it by only dealing with m_3indices8 if none of the other indices are initialized + bool uninitialized3indices8Workaround =false; + + if(curPart->m_indices32) + { + uninitialized3indices8Workaround=true; + curNewPart->m_indices32 = new btIntIndexData[numIndices]; + memcpy(curNewPart->m_indices32,curPart->m_indices32,sizeof(btIntIndexData) * numIndices); + } + else + curNewPart->m_indices32 = NULL; + + if(curPart->m_3indices16) + { + uninitialized3indices8Workaround=true; + curNewPart->m_3indices16 = new btShortIntIndexTripletData[curNewPart->m_numTriangles]; + memcpy(curNewPart->m_3indices16,curPart->m_3indices16,sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles); + } + else + curNewPart->m_3indices16 = NULL; + + if(curPart->m_indices16) + { + uninitialized3indices8Workaround=true; + curNewPart->m_indices16 = new btShortIntIndexData[numIndices]; + memcpy(curNewPart->m_indices16,curPart->m_indices16,sizeof(btShortIntIndexData) * numIndices); + } + else + curNewPart->m_indices16 = NULL; + + if(!uninitialized3indices8Workaround && curPart->m_3indices8) + { + curNewPart->m_3indices8 = new btCharIndexTripletData[curNewPart->m_numTriangles]; + memcpy(curNewPart->m_3indices8,curPart->m_3indices8,sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles); + } + else + curNewPart->m_3indices8 = NULL; + + } + + m_allocatedbtStridingMeshInterfaceDatas.push_back(newData); + + return(newData); +} + +#ifdef USE_INTERNAL_EDGE_UTILITY +extern ContactAddedCallback gContactAddedCallback; + +static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE); + //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED); + return true; +} +#endif //USE_INTERNAL_EDGE_UTILITY + + + + +btCollisionObject* btWorldImporter::createCollisionObject(const btTransform& startTransform,btCollisionShape* shape, const char* bodyName) +{ + return createRigidBody(false,0,startTransform,shape,bodyName); +} + +void btWorldImporter::setDynamicsWorldInfo(const btVector3& gravity, const btContactSolverInfo& solverInfo) +{ + if (m_dynamicsWorld) + { + m_dynamicsWorld->setGravity(gravity); + m_dynamicsWorld->getSolverInfo() = solverInfo; + } + +} + +btRigidBody* btWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName) +{ + btVector3 localInertia; + localInertia.setZero(); + + if (mass) + shape->calculateLocalInertia(mass,localInertia); + + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); + + if (m_dynamicsWorld) + m_dynamicsWorld->addRigidBody(body); + + if (bodyName) + { + char* newname = duplicateName(bodyName); + m_objectNameMap.insert(body,newname); + m_nameBodyMap.insert(newname,body); + } + m_allocatedRigidBodies.push_back(body); + return body; + +} + +btCollisionShape* btWorldImporter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant) +{ + btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal,planeConstant); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} +btCollisionShape* btWorldImporter::createBoxShape(const btVector3& halfExtents) +{ + btBoxShape* shape = new btBoxShape(halfExtents); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} +btCollisionShape* btWorldImporter::createSphereShape(btScalar radius) +{ + btSphereShape* shape = new btSphereShape(radius); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + + +btCollisionShape* btWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height) +{ + btCapsuleShapeX* shape = new btCapsuleShapeX(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height) +{ + btCapsuleShape* shape = new btCapsuleShape(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height) +{ + btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createCylinderShapeX(btScalar radius,btScalar height) +{ + btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height,radius,radius)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createCylinderShapeY(btScalar radius,btScalar height) +{ + btCylinderShape* shape = new btCylinderShape(btVector3(radius,height,radius)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createCylinderShapeZ(btScalar radius,btScalar height) +{ + btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius,radius,height)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createConeShapeX(btScalar radius,btScalar height) +{ + btConeShapeX* shape = new btConeShapeX(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createConeShapeY(btScalar radius,btScalar height) +{ + btConeShape* shape = new btConeShape(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* btWorldImporter::createConeShapeZ(btScalar radius,btScalar height) +{ + btConeShapeZ* shape = new btConeShapeZ(radius,height); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btTriangleIndexVertexArray* btWorldImporter::createTriangleMeshContainer() +{ + btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray(); + m_allocatedTriangleIndexArrays.push_back(in); + return in; +} + +btOptimizedBvh* btWorldImporter::createOptimizedBvh() +{ + btOptimizedBvh* bvh = new btOptimizedBvh(); + m_allocatedBvhs.push_back(bvh); + return bvh; +} + + +btTriangleInfoMap* btWorldImporter::createTriangleInfoMap() +{ + btTriangleInfoMap* tim = new btTriangleInfoMap(); + m_allocatedTriangleInfoMaps.push_back(tim); + return tim; +} + +btBvhTriangleMeshShape* btWorldImporter::createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh) +{ + if (bvh) + { + btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh,bvh->isQuantized(), false); + bvhTriMesh->setOptimizedBvh(bvh); + m_allocatedCollisionShapes.push_back(bvhTriMesh); + return bvhTriMesh; + } + + btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh,true); + m_allocatedCollisionShapes.push_back(ts); + return ts; + +} +btCollisionShape* btWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh) +{ + return 0; +} +btGImpactMeshShape* btWorldImporter::createGimpactShape(btStridingMeshInterface* trimesh) +{ + btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh); + m_allocatedCollisionShapes.push_back(shape); + return shape; + +} +btConvexHullShape* btWorldImporter::createConvexHullShape() +{ + btConvexHullShape* shape = new btConvexHullShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCompoundShape* btWorldImporter::createCompoundShape() +{ + btCompoundShape* shape = new btCompoundShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + + +btScaledBvhTriangleMeshShape* btWorldImporter::createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape,const btVector3& localScaling) +{ + btScaledBvhTriangleMeshShape* shape = new btScaledBvhTriangleMeshShape(meshShape,localScaling); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btMultiSphereShape* btWorldImporter::createMultiSphereShape(const btVector3* positions,const btScalar* radi,int numSpheres) +{ + btMultiSphereShape* shape = new btMultiSphereShape(positions, radi, numSpheres); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btRigidBody& btWorldImporter::getFixedBody() +{ + static btRigidBody s_fixed(0, 0,0); + s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.))); + return s_fixed; +} + +btPoint2PointConstraint* btWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB) +{ + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,rbB,pivotInA,pivotInB); + m_allocatedConstraints.push_back(p2p); + return p2p; +} + +btPoint2PointConstraint* btWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA) +{ + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,pivotInA); + m_allocatedConstraints.push_back(p2p); + return p2p; +} + + +btHingeConstraint* btWorldImporter::createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA) +{ + btHingeConstraint* hinge = new btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA); + m_allocatedConstraints.push_back(hinge); + return hinge; +} + +btHingeConstraint* btWorldImporter::createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA) +{ + btHingeConstraint* hinge = new btHingeConstraint(rbA,rbAFrame,useReferenceFrameA); + m_allocatedConstraints.push_back(hinge); + return hinge; +} + +btConeTwistConstraint* btWorldImporter::createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame) +{ + btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbB,rbAFrame,rbBFrame); + m_allocatedConstraints.push_back(cone); + return cone; +} + +btConeTwistConstraint* btWorldImporter::createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame) +{ + btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbAFrame); + m_allocatedConstraints.push_back(cone); + return cone; +} + + +btGeneric6DofConstraint* btWorldImporter::createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) +{ + btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(dof); + return dof; +} + +btGeneric6DofConstraint* btWorldImporter::createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB) +{ + btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbB,frameInB,useLinearReferenceFrameB); + m_allocatedConstraints.push_back(dof); + return dof; +} + +btGeneric6DofSpringConstraint* btWorldImporter::createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) +{ + btGeneric6DofSpringConstraint* dof = new btGeneric6DofSpringConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(dof); + return dof; +} + + +btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA) +{ + btSliderConstraint* slider = new btSliderConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(slider); + return slider; +} + +btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA) +{ + btSliderConstraint* slider = new btSliderConstraint(rbB,frameInB,useLinearReferenceFrameA); + m_allocatedConstraints.push_back(slider); + return slider; +} + +btGearConstraint* btWorldImporter::createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio) +{ + btGearConstraint* gear = new btGearConstraint(rbA,rbB,axisInA,axisInB,ratio); + m_allocatedConstraints.push_back(gear); + return gear; +} + + // query for data +int btWorldImporter::getNumCollisionShapes() const +{ + return m_allocatedCollisionShapes.size(); +} + +btCollisionShape* btWorldImporter::getCollisionShapeByIndex(int index) +{ + return m_allocatedCollisionShapes[index]; +} + +btCollisionShape* btWorldImporter::getCollisionShapeByName(const char* name) +{ + btCollisionShape** shapePtr = m_nameShapeMap.find(name); + if (shapePtr&& *shapePtr) + { + return *shapePtr; + } + return 0; +} + +btRigidBody* btWorldImporter::getRigidBodyByName(const char* name) +{ + btRigidBody** bodyPtr = m_nameBodyMap.find(name); + if (bodyPtr && *bodyPtr) + { + return *bodyPtr; + } + return 0; +} + +btTypedConstraint* btWorldImporter::getConstraintByName(const char* name) +{ + btTypedConstraint** constraintPtr = m_nameConstraintMap.find(name); + if (constraintPtr && *constraintPtr) + { + return *constraintPtr; + } + return 0; +} + +const char* btWorldImporter::getNameForPointer(const void* ptr) const +{ + const char*const * namePtr = m_objectNameMap.find(ptr); + if (namePtr && *namePtr) + return *namePtr; + return 0; +} + + +int btWorldImporter::getNumRigidBodies() const +{ + return m_allocatedRigidBodies.size(); +} + +btCollisionObject* btWorldImporter::getRigidBodyByIndex(int index) const +{ + return m_allocatedRigidBodies[index]; +} +int btWorldImporter::getNumConstraints() const +{ + return m_allocatedConstraints.size(); +} + +btTypedConstraint* btWorldImporter::getConstraintByIndex(int index) const +{ + return m_allocatedConstraints[index]; +} + +int btWorldImporter::getNumBvhs() const +{ + return m_allocatedBvhs.size(); +} + btOptimizedBvh* btWorldImporter::getBvhByIndex(int index) const +{ + return m_allocatedBvhs[index]; +} + +int btWorldImporter::getNumTriangleInfoMaps() const +{ + return m_allocatedTriangleInfoMaps.size(); +} + +btTriangleInfoMap* btWorldImporter::getTriangleInfoMapByIndex(int index) const +{ + return m_allocatedTriangleInfoMaps[index]; +} + + +void btWorldImporter::convertRigidBodyFloat( btRigidBodyFloatData* colObjData) +{ + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + colObjData->m_collisionObjectData.m_worldTransform.m_origin.m_floats[3] = 0.f; + startTransform.deSerializeFloat(colObjData->m_collisionObjectData.m_worldTransform); + + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (shape->isNonMoving()) + { + mass = 0.f; + } + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); + body->setFriction(colObjData->m_collisionObjectData.m_friction); + body->setRestitution(colObjData->m_collisionObjectData.m_restitution); + btVector3 linearFactor,angularFactor; + linearFactor.deSerializeFloat(colObjData->m_linearFactor); + angularFactor.deSerializeFloat(colObjData->m_angularFactor); + body->setLinearFactor(linearFactor); + body->setAngularFactor(angularFactor); + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + m_bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } +} + +void btWorldImporter::convertRigidBodyDouble( btRigidBodyDoubleData* colObjData) +{ + btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f); + btVector3 localInertia; + localInertia.setZero(); + btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape); + if (shapePtr && *shapePtr) + { + btTransform startTransform; + colObjData->m_collisionObjectData.m_worldTransform.m_origin.m_floats[3] = 0.f; + startTransform.deSerializeDouble(colObjData->m_collisionObjectData.m_worldTransform); + + // startTransform.setBasis(btMatrix3x3::getIdentity()); + btCollisionShape* shape = (btCollisionShape*)*shapePtr; + if (shape->isNonMoving()) + { + mass = 0.f; + } + if (mass) + { + shape->calculateLocalInertia(mass,localInertia); + } + bool isDynamic = mass!=0.f; + btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name); + body->setFriction(btScalar(colObjData->m_collisionObjectData.m_friction)); + body->setRestitution(btScalar(colObjData->m_collisionObjectData.m_restitution)); + btVector3 linearFactor,angularFactor; + linearFactor.deSerializeDouble(colObjData->m_linearFactor); + angularFactor.deSerializeDouble(colObjData->m_angularFactor); + body->setLinearFactor(linearFactor); + body->setAngularFactor(angularFactor); + + +#ifdef USE_INTERNAL_EDGE_UTILITY + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape; + if (trimesh->getTriangleInfoMap()) + { + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + } + } +#endif //USE_INTERNAL_EDGE_UTILITY + m_bodyMap.insert(colObjData,body); + } else + { + printf("error: no shape found\n"); + } +} diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.h b/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.h new file mode 100644 index 00000000..bcd6405d --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/btWorldImporter.h @@ -0,0 +1,212 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#ifndef BT_WORLD_IMPORTER_H +#define BT_WORLD_IMPORTER_H + +#include "LinearMath/btTransform.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btHashMap.h" + +class btCollisionShape; +class btCollisionObject; +class btRigidBody; +class btTypedConstraint; +class btDynamicsWorld; +struct ConstraintInput; +class btRigidBodyColladaInfo; +struct btCollisionShapeData; +class btTriangleIndexVertexArray; +class btStridingMeshInterface; +struct btStridingMeshInterfaceData; +class btGImpactMeshShape; +class btOptimizedBvh; +struct btTriangleInfoMap; +class btBvhTriangleMeshShape; +class btPoint2PointConstraint; +class btHingeConstraint; +class btConeTwistConstraint; +class btGeneric6DofConstraint; +class btGeneric6DofSpringConstraint; +class btSliderConstraint; +class btGearConstraint; +struct btContactSolverInfo; +struct btTypedConstraintData; +struct btTypedConstraintFloatData; +struct btTypedConstraintDoubleData; + +struct btRigidBodyDoubleData; +struct btRigidBodyFloatData; + +#ifdef BT_USE_DOUBLE_PRECISION +#define btRigidBodyData btRigidBodyDoubleData +#else +#define btRigidBodyData btRigidBodyFloatData +#endif//BT_USE_DOUBLE_PRECISION + + +class btWorldImporter +{ +protected: + btDynamicsWorld* m_dynamicsWorld; + + int m_verboseMode; + + btAlignedObjectArray m_allocatedCollisionShapes; + btAlignedObjectArray m_allocatedRigidBodies; + btAlignedObjectArray m_allocatedConstraints; + btAlignedObjectArray m_allocatedBvhs; + btAlignedObjectArray m_allocatedTriangleInfoMaps; + btAlignedObjectArray m_allocatedTriangleIndexArrays; + btAlignedObjectArray m_allocatedbtStridingMeshInterfaceDatas; + + btAlignedObjectArray m_allocatedNames; + + btAlignedObjectArray m_indexArrays; + btAlignedObjectArray m_shortIndexArrays; + btAlignedObjectArray m_charIndexArrays; + + btAlignedObjectArray m_floatVertexArrays; + btAlignedObjectArray m_doubleVertexArrays; + + + btHashMap m_bvhMap; + btHashMap m_timMap; + + btHashMap m_nameShapeMap; + btHashMap m_nameBodyMap; + btHashMap m_nameConstraintMap; + btHashMap m_objectNameMap; + + btHashMap m_shapeMap; + btHashMap m_bodyMap; + + + //methods + + static btRigidBody& getFixedBody(); + + char* duplicateName(const char* name); + + btCollisionShape* convertCollisionShape( btCollisionShapeData* shapeData ); + + void convertConstraintBackwardsCompatible281(btTypedConstraintData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); + void convertConstraintFloat(btTypedConstraintFloatData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); + void convertConstraintDouble(btTypedConstraintDoubleData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion); + void convertRigidBodyFloat(btRigidBodyFloatData* colObjData); + void convertRigidBodyDouble( btRigidBodyDoubleData* colObjData); + +public: + + btWorldImporter(btDynamicsWorld* world); + + virtual ~btWorldImporter(); + + ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load. + ///make sure you don't use the dynamics world containing objects after you call this method + virtual void deleteAllData(); + + void setVerboseMode(int verboseMode) + { + m_verboseMode = verboseMode; + } + + int getVerboseMode() const + { + return m_verboseMode; + } + + // query for data + int getNumCollisionShapes() const; + btCollisionShape* getCollisionShapeByIndex(int index); + int getNumRigidBodies() const; + btCollisionObject* getRigidBodyByIndex(int index) const; + int getNumConstraints() const; + btTypedConstraint* getConstraintByIndex(int index) const; + int getNumBvhs() const; + btOptimizedBvh* getBvhByIndex(int index) const; + int getNumTriangleInfoMaps() const; + btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const; + + // queris involving named objects + btCollisionShape* getCollisionShapeByName(const char* name); + btRigidBody* getRigidBodyByName(const char* name); + btTypedConstraint* getConstraintByName(const char* name); + const char* getNameForPointer(const void* ptr) const; + + ///those virtuals are called by load and can be overridden by the user + + virtual void setDynamicsWorldInfo(const btVector3& gravity, const btContactSolverInfo& solverInfo); + + //bodies + virtual btRigidBody* createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); + virtual btCollisionObject* createCollisionObject( const btTransform& startTransform, btCollisionShape* shape,const char* bodyName); + + ///shapes + + virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant); + virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); + virtual btCollisionShape* createSphereShape(btScalar radius); + virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height); + virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height); + virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height); + + virtual btCollisionShape* createCylinderShapeX(btScalar radius,btScalar height); + virtual btCollisionShape* createCylinderShapeY(btScalar radius,btScalar height); + virtual btCollisionShape* createCylinderShapeZ(btScalar radius,btScalar height); + virtual btCollisionShape* createConeShapeX(btScalar radius,btScalar height); + virtual btCollisionShape* createConeShapeY(btScalar radius,btScalar height); + virtual btCollisionShape* createConeShapeZ(btScalar radius,btScalar height); + virtual class btTriangleIndexVertexArray* createTriangleMeshContainer(); + virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh); + virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh); + virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh); + virtual btStridingMeshInterfaceData* createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData); + + virtual class btConvexHullShape* createConvexHullShape(); + virtual class btCompoundShape* createCompoundShape(); + virtual class btScaledBvhTriangleMeshShape* createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape,const btVector3& localScalingbtBvhTriangleMeshShape); + + virtual class btMultiSphereShape* createMultiSphereShape(const btVector3* positions,const btScalar* radi,int numSpheres); + + virtual btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData); + + ///acceleration and connectivity structures + virtual btOptimizedBvh* createOptimizedBvh(); + virtual btTriangleInfoMap* createTriangleInfoMap(); + + ///constraints + virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB); + virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA); + virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA=false); + virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA=false); + virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame); + virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame); + virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB); + virtual btGeneric6DofSpringConstraint* createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); + virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA); + virtual btGearConstraint* createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio); + + + + +}; + + +#endif //BT_WORLD_IMPORTER_H \ No newline at end of file diff --git a/Code/Physics/Bullet Source/BulletWorldImporter/premake4.lua b/Code/Physics/Bullet Source/BulletWorldImporter/premake4.lua new file mode 100644 index 00000000..d847c7a9 --- /dev/null +++ b/Code/Physics/Bullet Source/BulletWorldImporter/premake4.lua @@ -0,0 +1,13 @@ + project "BulletWorldImporter" + + kind "StaticLib" + targetdir "../../lib" + includedirs { + "../BulletFileLoader", + "../../../src" + } + + files { + "**.cpp", + "**.h" + } \ No newline at end of file diff --git a/Code/Physics/GamePhysics/GamePhysics.vcxproj b/Code/Physics/GamePhysics/GamePhysics.vcxproj index a368bedf..2c48611a 100644 --- a/Code/Physics/GamePhysics/GamePhysics.vcxproj +++ b/Code/Physics/GamePhysics/GamePhysics.vcxproj @@ -97,7 +97,7 @@ true - $(SolutionDir)Physics/lib/debug/BulletCollision_Debug.lib;$(SolutionDir)Physics/lib/debug/BulletDynamics_Debug.lib;$(SolutionDir)Physics/lib/debug/LinearMath_Debug.lib;%(AdditionalDependencies) + $(SolutionDir)Physics/lib/debug/BulletCollision_Debug.lib;$(SolutionDir)Physics/lib/debug/BulletDynamics_Debug.lib;$(SolutionDir)Physics/lib/debug/LinearMath_Debug.lib;$(SolutionDir)Physics/lib/debug/BulletFileLoader_Debug.lib;$(SolutionDir)Physics/lib/debug/BulletWorldImporter_Debug.lib;%(AdditionalDependencies) @@ -112,7 +112,7 @@ true - $(SolutionDir)Physics/lib/debug/BulletCollision_Debugx64.lib;$(SolutionDir)Physics/lib/debug/BulletDynamics_Debugx64.lib;$(SolutionDir)Physics/lib/debug/LinearMath_Debugx64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)Physics/lib/debug/BulletCollision_Debugx64.lib;$(SolutionDir)Physics/lib/debug/BulletDynamics_Debugx64.lib;$(SolutionDir)Physics/lib/debug/LinearMath_Debugx64.lib;$(SolutionDir)Physics/lib/debug/BulletWorldImporter_Debugx64.lib;$(SolutionDir)Physics/lib/debug/BulletFileLoader_Debugx64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -131,7 +131,7 @@ true - $(SolutionDir)Physics/lib/release/BulletCollision.lib;$(SolutionDir)Physics/lib/release/BulletDynamics.lib;$(SolutionDir)Physics/lib/release/LinearMath.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)Physics/lib/release/BulletCollision.lib;$(SolutionDir)Physics/lib/release/BulletDynamics.lib;$(SolutionDir)Physics/lib/release/LinearMath.lib;$(SolutionDir)Physics/lib/release/BulletFileLoader.lib;$(SolutionDir)Physics/lib/release/BulletWorldImporter.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -150,7 +150,7 @@ true - $(SolutionDir)Physics/lib/release/BulletCollisionx64.lib;$(SolutionDir)Physics/lib/release/BulletDynamicsx64.lib;$(SolutionDir)Physics/lib/release/LinearMathx64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(SolutionDir)Physics/lib/release/BulletCollisionx64.lib;$(SolutionDir)Physics/lib/release/BulletDynamicsx64.lib;$(SolutionDir)Physics/lib/release/LinearMathx64.lib;$(SolutionDir)Physics/lib/release/BulletWorldImporterx64.lib;$(SolutionDir)Physics/lib/release/BulletFileLoaderx64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) diff --git a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp index 9cd87d1d..f2f97280 100644 --- a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp +++ b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp @@ -1,6 +1,9 @@ #include "PhysicsAPI_Impl.h" #include "OysterPhysics3D.h" #include "SimpleRigidBody.h" +#include + +#include using namespace ::Oyster; using namespace ::Oyster::Physics; @@ -92,8 +95,8 @@ ICustomBody* API_Impl::AddCollisionSphere(float radius, ::Oyster::Math::Float4 r state.centerPos = position; state.reach = Float3(radius, radius, radius); - state.dynamicFrictionCoeff = 0.5f; - state.staticFrictionCoeff = 0.5f; + state.dynamicFrictionCoeff = dynamicFriction; + state.staticFrictionCoeff = staticFriction; state.quaternion = Quaternion(Float3(rotation.xyz), rotation.w); state.mass = mass; @@ -131,8 +134,8 @@ ICustomBody* API_Impl::AddCollisionBox(Float3 halfSize, ::Oyster::Math::Float4 r state.centerPos = position; state.reach = halfSize; - state.dynamicFrictionCoeff = 0.5f; - state.staticFrictionCoeff = 0.5f; + state.dynamicFrictionCoeff = dynamicFriction; + state.staticFrictionCoeff = staticFriction; state.quaternion = Quaternion(Float3(rotation.xyz), rotation.w); state.mass = mass; @@ -170,8 +173,8 @@ ICustomBody* API_Impl::AddCollisionCylinder(::Oyster::Math::Float3 halfSize, ::O state.centerPos = position; state.reach = halfSize; - state.dynamicFrictionCoeff = 0.5f; - state.staticFrictionCoeff = 0.5f; + state.dynamicFrictionCoeff = dynamicFriction; + state.staticFrictionCoeff = staticFriction; state.quaternion = Quaternion(Float3(rotation.xyz), rotation.w); state.mass = mass; @@ -211,8 +214,55 @@ ICustomBody* API_Impl::AddCharacter(::Oyster::Math::Float height, ::Oyster::Math state.centerPos = position; state.reach = Float3(radius, height, radius); - state.dynamicFrictionCoeff = 0.5f; - state.staticFrictionCoeff = 0.5f; + state.dynamicFrictionCoeff = dynamicFriction; + state.staticFrictionCoeff = staticFriction; + state.quaternion = Quaternion(Float3(rotation.xyz), rotation.w); + state.mass = mass; + + body->SetState(state); + + return body; +} + +ICustomBody* API_Impl::AddTriangleMesh(const std::wstring fileName, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) +{ + SimpleRigidBody* body = new SimpleRigidBody; + SimpleRigidBody::State state; + + btBulletWorldImporter bulletFile; + + typedef std::codecvt_utf8 convert_typeX; + std::wstring_convert converterX; + + std::string bulletPath = converterX.to_bytes(fileName); + + // Add collision shape + bulletFile.loadFile(bulletPath.c_str()); + btCollisionShape* collisionShape = bulletFile.getCollisionShapeByIndex(0); + body->SetCollisionShape(collisionShape); + + // Add motion state + btDefaultMotionState* motionState = new btDefaultMotionState(btTransform(btQuaternion(rotation.x, rotation.y, rotation.z, rotation.w),btVector3(position.x, position.y, position.z))); + body->SetMotionState(motionState); + + // Add rigid body + btVector3 fallInertia(0, 0, 0); + collisionShape->calculateLocalInertia(mass, fallInertia); + btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass, motionState, collisionShape, fallInertia); + btRigidBody* rigidBody = new btRigidBody(rigidBodyCI); + rigidBody->setFriction(staticFriction); + rigidBody->setRestitution(restitution); + rigidBody->setUserPointer(body); + body->SetRigidBody(rigidBody); + + // Add rigid body to world + this->dynamicsWorld->addRigidBody(rigidBody); + this->customBodies.push_back(body); + + state.centerPos = position; + state.reach = Float3(0, 0, 0); + state.dynamicFrictionCoeff = dynamicFriction; + state.staticFrictionCoeff = staticFriction; state.quaternion = Quaternion(Float3(rotation.xyz), rotation.w); state.mass = mass; diff --git a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.h b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.h index 002cb039..4f30110b 100644 --- a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.h +++ b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.h @@ -66,6 +66,8 @@ namespace Oyster ICustomBody* AddCharacter(::Oyster::Math::Float height, ::Oyster::Math::Float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction); + ICustomBody* AddTriangleMesh(const std::wstring fileName, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction); + void SetTimeStep(float timeStep); void UpdateWorld(); diff --git a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp index f7cf6cce..ef003d7f 100644 --- a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp +++ b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp @@ -300,11 +300,13 @@ Float4x4 SimpleRigidBody::GetView( const ::Oyster::Math::Float3 &offset ) const Float3 SimpleRigidBody::GetGravity() const { - return this->rigidBody->getGravity(); + btVector3 gravity = this->rigidBody->getGravity(); + return Float3(gravity.x(), gravity.y(), gravity.z()); } Float3 SimpleRigidBody::GetLinearVelocity() const { - return this->rigidBody->getLinearVelocity(); + btVector3 linearVelocity = this->rigidBody->getLinearVelocity(); + return Float3(linearVelocity.x(), linearVelocity.y(), linearVelocity.z()); } diff --git a/Code/Physics/GamePhysics/PhysicsAPI.h b/Code/Physics/GamePhysics/PhysicsAPI.h index 9bbde6e2..72d4a8c6 100644 --- a/Code/Physics/GamePhysics/PhysicsAPI.h +++ b/Code/Physics/GamePhysics/PhysicsAPI.h @@ -89,6 +89,8 @@ namespace Oyster virtual ICustomBody* AddCharacter(::Oyster::Math::Float height, ::Oyster::Math::Float radius, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) = 0; + virtual ICustomBody* AddTriangleMesh(const std::wstring fileName, ::Oyster::Math::Float4 rotation, ::Oyster::Math::Float3 position, float mass, float restitution, float staticFriction, float dynamicFriction) = 0; + virtual void SetTimeStep(float timeStep) = 0; virtual void UpdateWorld() = 0; From ef32e2f5acec86d21741a4e43269af8f04357b1e Mon Sep 17 00:00:00 2001 From: Robin Engman Date: Tue, 18 Feb 2014 10:39:46 +0100 Subject: [PATCH 12/46] Added new lib files for bullet --- .../lib/Debug/BulletFileLoader_Debug.lib | Bin 0 -> 444510 bytes .../lib/Debug/BulletFileLoader_Debugx64.lib | Bin 0 -> 614654 bytes .../lib/Debug/BulletWorldImporter_Debug.lib | Bin 0 -> 1036344 bytes .../Debug/BulletWorldImporter_Debugx64.lib | Bin 0 -> 1458764 bytes Code/Physics/lib/Release/BulletFileLoader.lib | Bin 0 -> 192098 bytes .../lib/Release/BulletFileLoaderx64.lib | Bin 0 -> 323882 bytes .../lib/Release/BulletWorldImporter.lib | Bin 0 -> 486966 bytes .../lib/Release/BulletWorldImporterx64.lib | Bin 0 -> 740576 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Code/Physics/lib/Debug/BulletFileLoader_Debug.lib create mode 100644 Code/Physics/lib/Debug/BulletFileLoader_Debugx64.lib create mode 100644 Code/Physics/lib/Debug/BulletWorldImporter_Debug.lib create mode 100644 Code/Physics/lib/Debug/BulletWorldImporter_Debugx64.lib create mode 100644 Code/Physics/lib/Release/BulletFileLoader.lib create mode 100644 Code/Physics/lib/Release/BulletFileLoaderx64.lib create mode 100644 Code/Physics/lib/Release/BulletWorldImporter.lib create mode 100644 Code/Physics/lib/Release/BulletWorldImporterx64.lib diff --git a/Code/Physics/lib/Debug/BulletFileLoader_Debug.lib b/Code/Physics/lib/Debug/BulletFileLoader_Debug.lib new file mode 100644 index 0000000000000000000000000000000000000000..fa5abf6e07aab9058f019655119ab6437d4ecb01 GIT binary patch literal 444510 zcmeEv31D1R)&C6*Axr{IAV6ge5Oye8N_W~MO-c(*NtcwxLdY_0(xypBCS8DHAb^BW zL_kmkEt~9%iY$WCLZN^~3syu$Kg24}$XI-#`C2q`^@bZEds*5iNXuq`a%8B^;UD>?k9nk^huZT|a-4 z@`?l$BA|N6ptGqu(jkSaE+O*QL&dzX0Wa254CYDSr zu9#CaV$`UK#bV(Ti|e(ePaIPmO;B33rju8AgHt1fZ&)wEDqM25hcPRbxM)8q&hnB zSKNZW-N1i61n&OgDt@psJJOt{@#3Nd>pOYl>sJLUf zM)8K7Z&95+9Xb}63Qg3nVoqwyK9i^S5ok)edPpqA^ikQwBy6Z_uWM+IEc0uQ>~+g4 zr*H_7h*V1^d17C&B+J56Cdnsu3dBy;60Ym;6NS_d4owRqn9{#;R{FN~Aem1suRNPh zL7QYl0Iis#q2?DVDv;i{XjY!Sej*WXPlZ@qy&@Bo)j14-(V9xeV8Nj=tUC!`m+5e{ z=(Myz6D5HhqmBiMj9e2Z^O3EKnGY4kn<>orXx8FD|-(Ss+MrL!I#47@@$i*M zlBwMSk!0ZuyXsmxF)WNuJIgC;r(}?4TqO%e@mjOy7p3M>-Kj z@WPmWwrgV+NF zoshkk1Px=aC`u$ziJfjiuW-0*gRQ?K3|m_qGx>4$HL`vrgZu=f+67Y*TB`|(1BICk z3oof?fhCtX>S0ARR;qwmwj~U#lTmb?2}sQhAc#z4mK34Cypl-nEvuvw#>mN}SX|fA zMU$!Jnnc^Y(wf@o%`K&!k;c-}nxbOgk5Cj(EmspQ4(t!+cht4iHng>NM(SE4rM1%w z3JVQo?ev7CSkKn^7Hiri9nDxe@bfoQu&7cyovPDx71OcUXH>&29Bv^RQly z1avx8&8?*{fpf~BfBY}hc<;4#$M895rQJg<(Sc-e!l+t;Qp7jqc&<(wj{@n|ktkKP zG;Z=#hbYzpx0b6{;siyM^N= zi^5Y|=e60&G6_9mgcTOtW3*&e+E1(3P2KEbL9@{X>(gQrpzP7OnImE&Wt}&81PJEQ z&5=4^T0eo7Vf8$2$4l3(K5|+(GAG>8+1%DjA0&%QLF*}|x8iW9A&AZ+M=fVPkV=r! zWrI3NW7nc~T?b5KVzj}rK{YB!Wfa@9nSKs)xxV1jCB_bb>7_Zv@y*At{w!*oF1&e9 zYp%DaHts6Jp75WgzywI|kFwL89$r%Fw#q4!4b>#5tChx2MROy7djWco3Ko?u;YH!r z2$^_ruvoAZhSH@4%u&Fsx@%vE)fhNkA$`7D)g ziZMdstcm3*uRw7s(2*N4Ob;)OnEeztJr?;K$|){ITHQ*J*YvJM6dkG%)9B5}C1_@b z29wML&XIAwaVg0rbT$_&tJbbXdMU26w6tVOnVQ&!?W36LqS@3=*OMAfrly4J8aacG zA*q4{ZHlR!Vz<_{xM-Lk#3pjmb1rKODu$IPqoQ!i6wyO_M|jo}EHT7p$fnE;J5U-w zHrmQ6Vmz9(dQ1)4S{8>*i}A2Edj{bo(@oJ;3>KCx(r%{37@+B5#pF=c+_{Jr=#g3~ z5koEYnHg^Ag0scUD7NOvQcF>mYdY)ZY4PxYKpY*6noXAl3Yr73J4|9E?$PNv62_~@ zDAFZ=QEDg1{o0|FmjrrB?qwX4jct(4v~a6;&2_aw;AbA%7^OH}?TuK7KC`7Uz$B zs|Fv;i5AN&2f#lBr*KXPWULlE{AUlsiFYuSM_rRj6;sh9QaEerCbxR88tKR^@i|B7 zUh@tuu^6J*zQwM(u+`+0hYU&!V>4rf@d^|D2KP>R`q9Kn-H$3*>i((xr0$o(N9vk9 z38}}>Ie9syUgRxxzxjhDAdbfqPBr4|TZZ9f3|6%1mz#?imd7(eE^IIhXT7!M(s%13 z7z2b0^qnm^DNW{1l+Ia?GxWgGXAKp0$NnujVi_(aNvxHTJa134O(l7Z=2EGZQ)upV zzPqIkcTZd6;SxQl)&loU1=6Uu*8_2#a)u1ZgVTBl$jQqiTJuisAd1UsV;RRt)-d%w zF_NhB;V|A|;S}5)86u4Gi%q=7VTm>|rFYfM zL@96`CBELtq;gf-N)m94h3?&)2hr{+_{fWcnnFP56GZP>dn-4u$b|gdEy$GIEvy85 zVx?piCrxl}=6BuWCZsN+PUB$IiFDu#_md@`kRNzKJFR@6yU&MChb zUd{;rayeZy&CJ-Yw@97D6k-bGUcyQ#d8}YkNE#ytN4n0S123j-GNej);3XAmUqK|5 zm&2$ znTc8abyY{E7&zn>H(aLy`z;+i=7c(FOifL?_=7qgS)*h1%{ZQcGaD9Mr*)r%-sHWO&J`!n%nUEau1lEK z8kd{BVjoCkX8YhJ<%wehucp-k3eRjDm8xlOEOJRxD&u|7Dc;`bYd!64zBdP_ZOM!; zdWb~plLi;Gs_t;uL1ZzWJ&4fPl~G^834OeIP$FmbqdkvK;Wj-k_nL)K#!p(*J{ip{ z-uOT_2ZtmqxyeFv*qgiz+R~=saU?8Wx0nIM>((4r@nGPrn>az2YE4p{$m^WlREKq5 zS5vH=9<54yTStV4_oN|DYFmUY1~ix$k<(kDG3bL62@fy9ZlpeXw3U$Du7DO-LUL_x z!r#od6DILAJWJ&9Th*|}Bv{7C$EvYQv$T|itencU_{8AAB*B?1BXKRj1f;h3k|FjL zTylv$M3hXzn94`bg$3=zNUh9FH;B-!AbTzyl*m;eE1L)|Gw9G8z1)?xw=vJ0H?K1s zDb>3jHIZhX2{xOJv&_q!+msXJO=!X1WRuwh`*Ghw zp?%*%x>Bm?GNr0NO;b-?nyw!Cc7__6rqpg~2tH}}%MW4e6OUsIY5CWJ(_+&4r6Dyb z<*!hYhn1@{PWTfO`!AYSQb~EO97!AHW>L6tR=FAPj*~K4JS;hQ(e)qatg}c^WWYKT z;y+4PB+L?8RDwy@rM4&~l+sW-?y_5S7KNn)@*;J#G?J5WAU3{+q7^Bb@FA7ZO1=`8 z4qQ6^Ngm`wDoLH{89vAKJ$`2^x-^jFQ9m^8=tMb)ADmFKgg)nAl1uL4m6J^v(#QxSm1`!5gk3=iY@HV>Z%P{BXDn?Yia5-n+rI0(Wbhyjr(nN z$F^~QDrXz_r}FXP4mIO+xL z6EGT;QesEWj>JB12>f5WsK+$~z_A5$K~K>84*$L1$Loa;++Fm!z4ixQH2FhO@b<|Q z>p@N`Q)%bxbt)^G7mOx4;pT~ll?2Ec2MLc`W0YD8n?Vb9Zs$0w-S&Q`Wpwx>U-wIFs6;zNq;)N7b=qjM}{^ zoNvXQ3pV1Cl0C8~?lDXaz_^pm z&(pG#PwX=5WD|PYbn=Ov2AyImW6gG|!8qC~)BnT=Tg4E}fvmuTtXA7dhNn+&tlL)N z^xpbUri^jpJ}fIH&d*!($)$`@dkRS`om)u;>0~cEI&+p*kLiL=^-4EqsQCq(#liIK z=4|?er-lPOL6nQ1r6eeer-@ixy&@Cxb9s#@uh@tLd^}Cb;^h^Yke}1QqKq8af~#mt}+Ce zXrhvNSYixwkN9Lt?s9W3mT?A~sFWUd8N<>eKABQFr@}6NvF4k&e41XHuook-ZC{PY zPaAZX;GL_JSY{1L5{oxA?mRJX-J4>XpEP$rD|DPc_nN>v>*Hl@DJ74!tQ3-ZSx`#J z9R`znI?MOj((W9rgZjook~%JL8%UDW>}*luB&h?n3pe{qYB^NRZjxgxBHl^_boiW`FNTS zhW%Wqid!A?<{keghO2|+WC{~&&!hE$H>{d%F_YTaA+iGvOsWmRS4dWYoDxrtrH534 zm__dma@_=?MT{|;zWs>roCLm5@>#x=^0~f;iRTzx?|4}6#5kfXFW?a+XYjSktk^^^ z(?oTMgU0ULQm_l#kKd);mLq4`zdpeH)nW zc`Q{~7aiO2|9$ZYE^Z(%9tEdONbAOq|eTpqMC;uTBytbPo@cOrg!oB?|W|Qt18uZ@v`f|2|ow zR>$?$*jAU|>g)trc`Dv36E8yepQK)IOYxRIbl)BaW_e4QUgXl(?4Dzm)D- zPxY<8z}o~9zU0O|CT%^t=$$~>1%!1bevTNx()0ac~7S+Li37({U?;V zYo=rAz>Q9Zl~)rqD)ov=j-}Im$FzIdJ5GU#@#ry31P3Plz3VdQdVOO(+9@P><&qOj z%YP&w)gyuAiBl*<0^?1l9$r?Mbj{p0mvlle>q;T9+r*NoXw1AjCa(m)8$d0aSFfRH z=N+i=Q?vhGm1=(H*13pn)?zq}3wj|}nu+xuZh%r`TRSO2-vP6=b01V7@1~JNzVXc> ziA3H_BB_Ki%^~>|mV32Qc)j|}SCL(2&WROtwX1KkWp9z_UFt-a-452v*78QSzP-dl z7&ruHe#au&n{%z7+xXA^!49n*_xhCo)xY`>yx%w+J(=_OJ^FuFaOmWd^JAW(k}<`j zib_TmkBmX*7n-j{r<`J-3qsLJ!n8Kt>pi@&xnpicxV~%tT;~j8cw7Af6-3JwyM#oL zM?xAcVoen~*($JAZl8J;6&8*hiMoy%IdXJ~roA9EE$v11ufvASI_%gq71<3h|Kl0n z*nwXNUmTWiO1%K!?L)0^CJg0(j`c5?WyP#NRjF?urc~Q`f_WQ3smdugbh9nGZUB4C zv%X2F={j(`bX^ob3-=CuIgYNhba*V8%0!Z1&yS`fRH_PB4R`V5-3ITv>2eB7-E_!S z{V9$v$CK_oFS-cUJXr|yEFP-VCeWR~L=Z0`$XC@D3@2T|Qj1J=LjE~lQmW@NL6tb^ zY$~Pp1AJMJ13|hR@N?;7JMcGy?z$_4c6S7&InalzeB`&v&+I+Qj@0TA|cL zeE9hBqx@!p=Hlyw&QBj~Zx0(9q4X}_Rz&^)boYEEnBOu){}MFS*9#r_d)2oPGx;5VgHm_l!zYN}-#~NZO+pvMZ#if_GIW0YMxcC?zoyhhHz($|0W?*& z2%R6l3h=ufG{66PVt(Vkq15B}@bTj}9{kd8h0MMwbV2pK6*T+aCUk!MSl-!dHwmcHdZzQ4* zeN?I0`0(-LM}0JbX6a)>=T|=RdjK@=7&ipV2C zx6e~T<);twt1vV{{I(%-F6gSCPR#FeLleZ0{_j@Med~vb`K>oJLHu?gauet_K9iW= z{?A&RB=nLW>pL8DNBk(5-$X>u2F;BQIxl_-^?eaEFa9_&zmGvP^0_FT7eC$JK(lmJ zl+LR^x*X9Dfab*2Lg#0HBT&9l&_te3%G&|l*%y0NFF>l0&j~_qkw+}RTy(M&h z_DuQx0yKyIO6dIfQNP8YDgSjaztM<}7#gAU9zSz_`4H$f{3bEKjJGXL5_OiaG+7il z9zXxmi0ChZ=DEFuj`@1&gZy^iJ5Ak)51$}@e*n#C>^SiR@mm3!gK~rUEk*P~(EMSa z#QcuiH%&c>4>PnH$gLm4H=JLeL1|D3Yx>dAat|? zFZ)}E=oz3n-NkhLc>L^-{2n$mnh<}y_|YxD2)Z8} zl9=Cnh9-!g0-K$n+j(eWenp1~O%Ol0NHrC7W%-HubsCx=eyndF=q^6o#jkT|%nls= z@xzA3;-_{iRKqn{bc5?J+?@-VTkEJv9h|*CGqd`+<=-gRTZN7bZb>C1~z&)4A$#5cvH7 zH0uprP(6MPnm@2g7{ zpNlR(KmX*(WmBh3om@3_R#n;TNmIriQCl@@Qth0|nWq+wDl9z0BYx`a%9&-e&zxCX zQCVJdTJ5yTIhE5+E%u^lyxj`QbK#GdW$z?Uu zW>1@1KK6)3or@dVJ0guPbk(dmlV;AYaAD7!h7$l)m9vh>rwBg4=OKJrRa!0rHEHbJ ziaA9iMva;)2My+yH@DVxG>1FqRxXWn)OF6C74B%RYr!!oL%=f!a%v$C5p;}UtQw!2 zmX9I5Vz%=zFtx&}=7x^8&bE1x{9|Vxmw#qEbk5d%nDGJv$j14vsmfV72T)4ed{ zDe5%KrnOa6xZ5lJ% zGTN&Ba0bD)%%#2pgPn~w$0<+^Lav<5LFjISM<5ML$87kx+u%j?5zeNRWE+&9N1EVF znL;DfsnH4tmVVR#(~lfr`cnp&e#8LNmkcm{@c`2o4KO|J`vZKwhmX5G(r(!v_dxi= z&#FBhVA^9l+VG zjb4XzT%xcZw$W2nw4b~VZPa({9QZp0fy3XRlm!Wfzkz8J41WXDCK&z(rcE&X4NRM0 z_#2ou!SFXQZGz!%VA=%3-@vp9hQEPnt#Iez%C zz3+{X-{}u;#K-LqnT9m^`1~l5T;A;}a2QjY&46{zv1RRsY)&U*@tara2mE7_LfG zfBg!HwkKv|Jyv%3ex*#PSn>T~3wx<-+k6n4(pOH#wmSvrIj9?EIuMF%Uh~qfc5^LB zCo;>*-G=nx9K^Ka=zr9bcSBvLOX+h#MeARTDPL2V@26m`CM)+Xpx7scTN|6}*ezwi zNXFzANg{OzW{dnzqvG?p`F;Qx^Z7Aqt?AA8W^m{CQuF;jLw}z6{=Gb&O|a*hn}m!0 zOTEw*4#c;&4Srsl>ZZ=-BdkD(d1W{2vk)QLlWIYTcB2*{ya-_%!fu2YB3yy61L0Q? zMiAbHa52J_2$v#!7~wL6k0QJn;j;)YMfeKBFClyrVK>4*AiNx58p?JB!hD37*LIIZ zcs0Umgx4UPiSSy4D2rNw5M@wbL5Mun^$6WI{4nqbgSXYP*oKcZ-zn}5__%GDX-LEH zxkNUsFD8gv6hLb0LE}x?P-9y9{xBf62^tW7Si8QhGhEfy7*-qw(ISa&X^uo%!j+bJ zotaA?a34O_!@5xKtPXX==LE=$^_+t67=))I#5#k*Iz#sv2&W+oBdkK$gK#>+l?b5= z?MtDH?nm$)uLpI%gm5;(cM#SfyBRfQ|M?pT5x?w+rn@w z7L=g`(VXSG@s_6|<=dd#2mXb9pnk1PQTOYCbx=-$ThZOY2BZ7VaCl*iKe`CAp*-=> zYppZsn;UJ%vlJs$K6DgxBu_ZLi{qgEtOOtHp-gE%ML^tS@G!h?%6l0?jwLQdi1jDc zjsJ5HUXBpsXw`#|cJyV0z^Q8xUXQR3A#L$Ggm)nXuKO{BHz0fw;mrttj__85n-P8! zA?tNJ!c3H5CBnTC-ifdfA$WAd_S8KH;mf#I-`$Q7HrfpzqP~mps|df3@P33(Ap9P} zrx3o15aXoopCkMc!p#U*A>4-Wd4$=!VapNWehAkhJPF~e2uC7Zhj2PVoWSco3*qYs z+Yr8m@Ir*YMtC*Cw-G*!@OKCwMfeWFmk@45_%nomLbwItdk8;42*2H(0lEJfVKzd@ zpnGqGTM+Jx@UIBn?S}0vUq$`h$}Ai+RQ!Qg8M9;|zQWaRnC2M7GyHL)cBA`j8ZpN! z%*lEz4~y>uZZBsv1wCnqC9pAN~)6TzckPIjT z+BsUGy4K)7L5(P%9SBcG_)ml*5&jF|sR(f@MfaP-;K!!m`+*2&AjFP$_t^-sQ{BB7 z;UNfN%L+Tg+U~If+kH2_AA#^egxHPM{bB*azu-G|<>K^vG|DytacH>uxi>r3FT&@> z`9-E-J7u^!k$y2ImHXVZf|-@|45nY)&nTEHYPdJHt0BTmKeby!h13uj6P+NOQ&uij z0av3Z^c+mF>Lh4uX{6)iz;2i!X<)xdYq1AhE#XDw%Oc@Ujg7Y1Dl@lgUu;TNS5<&RX6_mMQaf|@?5X8-o#9C>b)B91no5)|Gj}bDVsGbg=M`no z%-tPjx3Rj9g$=P33QD95qTYz?Uib@j;cTzY=+EcGH&hcRQrPAtN@fp+FCm! z`NyAFG;)F}0PXR}qP9~M#0_a|1&8I*k!fuWb&<9Xbu6gX??;a2mq^D81f87dWH~_> zxfXK4%0OL9xEYPKR@y6iuFTxSG>^Da2{YVMp^H=kLM=d#%xp0^g_wW*1a&eJtwg?^ zk;buOyRf~#td_gl6w3IBtrRR}T}MaVvf9@0l3F;g`H?1V z3lCZeV{#+Q_pO*{?G6F@hZb5VaMWo6*EDjUw4!6H5ktq4-Rw zggYBLn%mjFDcLn3E2xz_y{(7>m>y2Z=$^T@c!X|cCIF&?%p#GuAy5Oo2TBmp;8^UdiTQu66KdXAaS# zh_}||I0?)z(9C1)h9fQ8-9&AYdKr^QFU5sg4|#r#HrkMM5%veq$>8bg3l#g3kGw5W zOWQPij`MVvV~r^NIvuu{F1y>)>YU@zV#IMsqp>VB>i(=jp6-^7*<;{oTRxr8JZ*s1 zKpFm!qo@);4cbzUb?OroJ(ZrxxV@;%WjO1h1DHH@S|yH%VZcXkP`e0|F%F+U(1q|& zs&%6}{Fs={65DK`blsxpb!v^v zxaW%~h#B|5z36cd6u1qaRaoc3kXPlTr8OP3;^KoBL+_?7#gv*XxD7f=7*mxruA{-)MdsJF(i zsX60{dG%TAf4Q=8W2mSIBA)=gyz){bU;!>W_pY%}IOfpeO&(T>pdX zH>$bqZ{Kv$cI=I6{Nc4H-8}rSKVSUU^CSP-`v+-PWBpX)fBoAh=e{v>#-sPooKTw4 z9L9p!CmP=wp7pD*<}N+@mq)#K@u!#k1&bNwyOaOs6CU_vdTvE=@l}W2)Uo6_$mbf3 z|JK1Lm*&*}>wvv(Y*S;q&xP}NL*rll#etRg{OOZlW_2t-_rRrBK>i12kdKk#p`(M?QP*tZv{R)A;XxKN9-JFTQsB^4!kX zXKuKGi!6JP&+y;hwe_l1BPRd8XXYzuUN zclSMb_vN*hG+)#E`*SDc+^y8P8vloVhTi{;r><}LV#duUocZmGpTgRZ#$UYZgTiaB znEmYg5B#I#wakSFVVzjxoAz$H^O&EU^xCyQx#XHVZ#Zf!)^qnH|CeTWUwG)Zi#Htc z=0}g6-QM&h_Ovzr2fN=Ky5q=MeII@Ix&OWATmO3)54$@gzxpTFVa>z;nL==BrQ z(U?Bg_@9(aI^fM`pZW4P%L_i(zij$txQ;4B{y+J1-Hyjzeg9_*I$!a@*0(kOlso_V{+!1rZCbVDyb*uA28k#64;r(EwndBDT7_MEN89|4x<&cSpfms2 zrK3k4Hy3Xvm{a?Un>)MeTJk$1U5(9c`9(#;3+FCwnA?m~^IeVMxtLUiJ0b(;(}33< z!t*)@&IptE=C(m#Q`a(ZCRl80=<4VQw>B*691MPoVO*As2Ej-hnz~vS4!o9_B^QY~ z(a;BCOnQZ4;01y$E$J|}JqTiQw&jNQ_GDUfXGg=_mgd%QUB{xjNE6%v-mu~FTOF5L zxT-ktN`{*T&ZBclJ62&L^M*IKwhUBvn6qL*XW(U8q-8X4KJWuA&GiH4(}LHPB7@+U z!i%tIK^YCaNK0c`4T6cot-x9bp_ZwYEUuZ@UFsk-5IJ-!(oQ6zxPov2c2Qk>KU165 z-d4W=>uGvvxSxzV^}5f%Ed~qI18v`QWCJfqbiI3kUByzgZ&>X>Yt=9~Y=q0e#j^}I zdJjS?T)Hs4tf48~FbJJ{7dA`kuz8f60VgpsZfvasuY%cy`32$n_WV;3G`HvT`-uD# z^3T@@;E9kgo$_TgVo%NQcf$OF;u6iYWMuwHn)AR}jTmiMf%yo{{FLHBV_pQ7Qc#;a z*7OIB{VA3hZ0;iq2aWmQ6>|`4Tx8XF;EFF9Of_3lm$e^EuW|5pTJA5fM7Ij?yI9BB zLv02037{;!-b5&*Pj>8qRhTSwJZS)hR0E(4jpNxeLLr{o&~K1t@w|qHLh3hw(ly=x z7$~F;!1o~&J+2!+&F@Hb84ZZuFxzmbgtC@2fhh!F~@J+QK~6Wp^@ zmVrWQ5}cfkNt3K)D)MW}uL|1W=B~bsH$8o&hvet|W&Uj_=P zF<8&pOXE&8P)IEW#Itx=>JkHm)RTa+H0~J#h15rYLK^ppfkNsOtl#XZabpY=QeOwe z8fB^53=~pt0+PD@+CU+d591NK0t1EA*?=}`X94;AbH4!%EEl!p}h92Z*N>v(#h*fghke z;b$Q51GKO3Gf+q!ixnK!C`+AappcpeNb0u0Kq0lprhD0@+X3j0S{f(vOq%9gXrPd) z2XwT?%`;F)eGAZ08h59GLh9Fm3N-F_1`4VDalqOnxqYTTm+3aK9gI!5F8!T}-JJ$$9)QDC5us+PJUTxNq3Fdu-hOHjbOBQWl;mAQV!MVH0kXmc|YP!3?oh zPFzS;0^&*CEH%|Y@N0lh)VQ+^1m6zm1dW?-ppbeB5V>TjXAKlmP1tOCU+4C?fwI(7 z1`4S(YrM4ODgGd6Cmjr)m>d&kCYv~k@B;sr3d5sV`uyoae5y za6y$o@LYgS(YO;06jGxAjnKGp1`4SU0g-c-`p7^bm5l?Ng5$*wgwSRHmFcuA4Frn- zRIYK)8VEfiph+6{mVuB5pbCxq$Uq@A@euTb=)SYmBm;%iS%A>cfcv6>LJA$Mx=8J} z-_Nf9V9bR7Ilt=BkIzmYnYL#$*m*3DS@+E(F*nc)?$Kp*ecz1!nG&ox7Znu_Z*Qzu zfBW!*CG|Kz+|kk2F*d)UuC=u-lHb-IZq>`z`A2o;&ui<*=Lv8uM}<`9!shmN-Zq0% znloz3rq7;wZe>Mn`J5@Wlg_ND%x~-p=SSM|<+X==oNz=pgL^B+s<}9UJ_m0SjKHlD zqwuXTg{78S-R+PSLU@$Dp4jN=re@%JRvfxn~hUfT%JRO0@O2rzZ36W?YbWe48y zs{@Z_NH6T-IT=`TpQhSC)2OMLPb4O1i)uLDA#BG#oOA$XE8dbk6(Qk8pkIbmVdToE z9EVaXXXnR-Sov*jThf}Z*MQ*`RQH!~LL47FX*GRY7VK;y*mwv3R`+bld1@V=-pY-= zm797ixAazS)iEV6R$J)w`QlE{zRa-!_XJ5_MJ_x3~9W2*gHXBU% zl)Mo+YeCK(1gmx8o;A#~R}=KXE#p<7CjNzl`mScG8HOx-fim&YDCTi`yC&FNvrE`Q zUpQ*MlUY`6YwX2%M5%Ln)*L);i_W$0kLSIxZe5&x%vf8wmG+_Q>17jrm6_G3w&r1( z1jM9;q*d^_H3^7(?d6s>eWa5UmCp0&s(Se2KOkXA%cwfzy-kME)m79DRZN3*SAl{k8JDhl@6z{m=om;#EjCYdpj?`r} zmhqZq7}LIoMJ-s`H(K-#3cj~$#|qtccQ`}>#~7uD#Y2BRTTYyF){GU)H$088t_l2wc~>;9Jfuogx<<+Jk6UJzlEVZ)5G|y$lh)?!NJ) zl2=Up>UW1QevXM>{SLnFzH#x>I_)cazErW-#$v-LM8Z*qO%};c>DvZ*%~+7OAe*JK z%AaG(-?we(6P0Yi+h+9DZ100|w)a&J+xdna-B-B{vD^D{`KSEgo$I49NMo@}H`vXG zA-kGP=@_g?OI9VTHt(*BHnZ=w>J?g$T1aP~TYG+A)sB+ajL1%Os3=oiuiXfQ$M=gc zYt;|mK;mGIk9qCeybw;+M<1=9j?yM?h364$_HsRo6Sr5DtGieC5?U}s*dT6bqw zSu#<^UhN(3pa80y_}5NsTb@Kl@zRw^#u{6Vta{%46h-L0p77erZTPE|+-#J=`utM^fk$p|odsk=Y#Hlo<=S55Fvmxx*H*4)>dThDjnQ_|&?_2X zm_wha`Si*+B6|Tj14HwnS8(ozFS9_>wfp;}AhC;WX)k>Ut#3U?W<#&N1oSIv-bP8* zqnTNySl6?Bor;{(SG94*imElb>?B%IxrRiSt$qyU(Ad5z__^3VIOITiUPS>!$N{oyjUs3fq=^evc5X=;UnsvQ3kFBVDOft4dyCA4I zYgz?3umlgSsCkGsec5Vzhzf#9XHK7Gvbb+W)qRqMJ@N$sMFs+9arcVKyCn;IAPj=p zRb|yCie!HA|x|@&!~zKYY^?YbpAPzT+PCg@knb z%AaE#;ycb+k<%xxsM@GYiKzl@9b;s2HSPfpbGG=S-l|O)n2A1L&o0!(kGEQ<3Tz*t=a7x!(vSZ)k zB|9yz5!xTEdzx7}{E;Q3zRF>cqY+MDRSu-0T|C^?ly;-+t$kH_dN8&XE!}~C`)T%W z3tv%vHE$1nEWaqHHrwiuYqEQ5HeezL zGhL^%T~W0GBawA%HMT2&cJTGG)wU~$6B5m9ghNVsYQ7N5KnG zs8R+NBIFlbGt@*tSUCgkH2nP?Smmj+0G+1k!hlw4+!7n=wV`j?(8D(LoDIEhLw~TL zzXMvW`3=F}Wg5b(;_81j#0yTic$A^e21G}Zrxw__c0gQi%HZWGyf6i^*VwTvJ?i(S|;i|iqZUZExdc=l!#9VN1*bukI1ox2*WnxGmxC3qIL_kt1Zjwo< z76an;M~1o;kd*3sfTRT6Lc2_t>W_fv8uQf0Hnb-;zt(8nA%L#X&~QL6X^01_pV!cA zKzC?po((OvAs)1r*xPLA5gS@%Lp*pbbiW7mj^_6fAgRZ}Xf(7GXdjT^P6s44ItLIJ z^fFWfpyi;;P>XE3YXON}9f>WpOLgo?fP~958=7ZB9e_C0$WWKqxL!b<@?@y50HVcb zsBhS@4*@zx%lW&2I4;an&jI?ohF-Dh-U7s}jtsRC5I09M)K);;63I}rGqK>RQ`7>I zmKO%pt#M0i+;TwD^0>t(b^Dqf`w*bt>J&c%B>Z@sTiV+@fP~)%Htu6U(gwK|DE#&Y zBq@#pB>cVvh+7jG>Iy(o%j*G&Bv%6BW=4j32oSeAGSq=k3$7u6G{yn?m4?m+#Et1Z z^({a*YiKo~w>9)8per@B1<)@w^e-Ei3l%(}aYq8;1u1!|0?<7g3fs_CHgvBIaeGkc z-nXF;#=n9)!G=ZvI!tSNEFjTz1t6*A96(aOWqN9TWJ)zSM2PF0~8W6W)GSsPnqsHgHZ8HgvWP z&9kA14P6dMI_^F|(mi|&kaSgd0UD!?{ysqefc@kt&Y$1W(2oI0C%w*wer-dvM2Y># zhSHHvaQoO$z6})tl6*%38mIFe2T1ar1W59o0Z6#i+R!2!V)K{SUK_%lHwH)dF0tRY zAr5OK-&X*gs`LFRAj$VlK$0(8qNJq*5{Rds1lrq%IK&bhJ92?W+t6einhi)~9|j~P z;4pO}J{hVFf29PNNI4c}IS0ai3{8UL^#XjXhs%P*TMw@kgd5bj4-nphPrd7kEv6w2 zw|i&ukABkZSHz?5>_*?4=I;)~U1<`H#sx5b7l!6{M=uP$7PcJy@qrJKZ@y%%|FT@w z5HtS6=;W!uV1*u^i)ec&8aAOUY^n+r;>BhL_qL52H1RzRmRAIbkFO=m<0U?yw`}q|f!T?2{22WZ7Rs`~@!6FbysHaD0yQux#gxzvd-&hax;; zlN9@W53v`b4A#SPtwiI-^v!O)m%_3+&+o>6&Jiy|NK0Q0*@zkli5durr3;RhF1UWE zf%+3Q+@_&{sR6Hks>=h^u(wAGaSGbU=A8{B8S*3*wQr1~K1A93tEQEZov4YBsEJTW zZ3kDuvE2yHrKbM-bFTW7yTtAE=e%f4p6JiVST`v+F8WAPTtjmb`D=P#)Y|sfWyXrX z2Be6Gkcfv64laROaL*bDhxp>UyQ<9IOzHNp?&#$nI6))cauM#1?@Ndq>k<^x&^_R2 zmwMhID1CPe?jfKr;N=Cpk|4PbZ4tQW4vlvMW|A!=){f-%eU8ThX+6yUYPbRX2Y-2% zLtu0RbO&tyoVJMI2#Mebh14n&o2AwmC{A$3`^LN87r`M<=jrco3&7QqCcwBG#%~6$ z&LvT%p+s4OQaQBZ+Qt&R1>u$*`m)qf90SU9LR~m_5WhBn=m`I$E zNSu&3T*1-d3eIJ!z7oHC5G2l~(i0%@q5bx)-YW3(#YyTU#<>neBX`&uAtV|hB)(N} z^sRz}M*1qVy@$tal6UB17-WFPWRugV-5huZ0?_+u)mUX>rurLm` z$}){d$a0-(Y`4dj6d{omA@LT1TLXH*(RSxV&wKP>8FBd`*eUrgD4OuGw}h-C2>8Mf$Zt1et$4&wy&S)ecT$>IDbsC^5 zO;=^pon_Ot*$~zDcYF%)v7TiBi06k7SI&mw8^2T4kKl8LOVvy>6dzXp2-^svLwTqB z!b`mvlvq~q#q;7Cg_W^V&MD6xI0>$Mh-}kCa3bCcr#U9~a6o*li?7d+uljrRlGjp$ zWx(>%tzlUlM^EK>OsQ_x0ZQyHMhF#k&qersgsj)&2x)h`Y+BqLAu$y~A@!1p&Eh4} znhvj>*f>t_g>I{j+h*hZOzHtpBxh0&`cwX=n^gO*F{!LwZBqBcWN1=QqBbe0NSo9{ z2&vSE5z?ftw@r$Wm=qx~DZ$aC1V@t+98F4aG%3N+qy*<@QZVo&O=_2UsTWYWUF)S- z$>{-J>cj*lWe>7ac2xF=sy~iOcVeX|yY&pjQ*m)lJQX1^D?%al3fK$oH3NmzuWa0J zZ5)kB=r|dZw4Yn>!{&k@&Pn%5hUwsbCk4xW;Mve`2S3^TC^+8>gT)GtdbqdKW3X1 zAu%gLVpf8qSqbiK17)dqY#hx>=xA0#N3)8qH&}}aIEvcyP8v^(@30SfyElxm>PxBr z5k<(;iw3e!T>_l{3MN)X6ldYqOx(RDyaI7&yZi^!a8>Xme4cVB+PaF_@lzFJ$6g@! zH03vjabYB1Hf;>c72a(f$Hc7%fT4Mu>jCcHU*|k(i!FRYB78!6eYa;z=Gw~bJdGTc zBv)=CA;|G{oJro!cNDjS9B1dZW1rY(!F&`5GVyT==K%Bl1B5r?Q{@s4(~zc!ammg+ z^u2DgaLvD#2(yfToD#7o9{lkfl1K32&jiT&*oXL5=-|LIaSepaVFd<{b)#;Ua|%M1 zbt*y%_8D8Sgha4}qz@Jx`(VMrT0bjc-;GSq4-htQFpwwJ@p!7zw}<1N(jSQMZ?%O_ zNQ6%)#NQa>Zw~>t$v~f}rGE>Vy4`@&(qBwg_>NI(s$#bXsh(n&jr;yu{W@FlghcR! zaA62)E;y<{aG#;o-;7MF1FW96b;#pm^^Wmdssgu%Z@WO?57+`HBmyTSJ4k|Kmnpc| zP7yDwRc5Y!XSZrL1%)>yW7p0z@dGn(W?+_wyXk{EzmpN0jt@O3A9v?Rt3TZ(e5PUN z$Bju|(IQV&_+{2LrsJ{tEyq^0-0_y1MX15(7(wjv0LA_$4!7aWaUaQ`Mnd=CY1cfd|X+~nbkqOHMaIjmnT z#6Gg+t(kwsYUV?f+u1Lq(n7v&D~6CLhEPafHYYfa-38~N7%V>RayRu53gGUXor-xi zImK9AbH7w_La@^+LA2di2BMHxZG{jLg%AqyS5=kZwi?KN*2DB0Lw31B?nVLJowidU zbRF_|^&9qqntmx_daxqq43;8zG++7-LZS#l;<5xsmnFE^mZ9fjIk>|`ZcotN_~zY8 zR>k(?>H0k|_C0y(L~!z-#EwKP`*D8wxcl+105{duk24MX#G~>AkA9kEY(kiauo+YGVAWU)XEy+K=kpPtq($?4?;4B z798i$g6qFN*y{{bA9tY~=LP8F3J+i9)Q3;Mj^*MM6%;(H9#s8&%hnGe(GMZ%W~d^wSB+>`UWx z%B3Q`mu=}066q1b1;(hI;9fS+;7acXaCP^JPU($K)UvI;5Z8|djvbq#IJy1r5a)*| zSAT60KS6Is?1V&`gk)4AxVOMxaD&;3uLW0kALf*1XR^|C^kFH=@m{AK2O`A{wiF48 z6bZ?$pWry^7TjP;@d|Kt_cl%`wk49Hqqj*>diIVhJ>o#5_kCM>ghYCTq(uvkEn09c z>6sS?sxfi2-kEcSF%wAr0^JK>o`;|4RO-hX;)3uh4RQBUUaI3phX3SpB4ShRqL_wV zR1rRBChcfj@S9jkc2V=4<}6OO6nR+>^LI}spT=a7W%?n)!x27<@Hm7&M#yqLhmc(s z-+PgXJt0vMA?dONNB1kZK~Rw#<)eyjM>eu%|7{IXMe@Skz*NNf|GBPlno~t16SW+F zZ=QnA>nELoo_ge3^iM98|$LP)vv*}5krx+f&BAPbIX;RN@8 zNB3}BIJ*%08j@4@T?up_9p5IeetT@2y!z|mTKv?n=V$}fKQBd*wogd(Pbj2cG8J4p zz6IHf3zTgz}91CB`;|-_f*+W+2ZqvS;-rTaqf=sua?uU?%w)2jCfOE9g;Bx*3mMB2cc#$1wvv9 zgz#%7_$#LLzg)QRae!%X1#Y##XiQV!O=F??K+~>v^0qztY1eMeW>YBTfzxq^tz{ zh>fKLj$14xpqvBI!#8X_5E4BQ3hA@0g4=>T1ozqN;oHdDy&% zK{nDA6B4x$k_At}tub`*UGad_!k%WJYUx4I+^@eo)v`2!TI_|8lr=I_h;`(+7Iw~ z1RwW$JJXP+7$08iCy%$}t==Cmf40eX3v-KqoZBsS*Y8{{nb+Kb-4yFBj0iZi)Ol~O zXbrK9)1Qys^HWJGk;zyJOp6@K725?>}Hw1jF9EJ8X-pjUxqZqixCoy5R&x)!L2cLW(1H8jck+q zC*l+%>ga=F@SADJZbCwZAJ#o`Yi}3M*vLxGn9A)PyZ5}jbMu+lMB}fiX)6BME`KR= zXXF(A)}Ky4UdMn$xDI_{)s?Hd_BX#N*|S*jt0PvtzVOA?Gr%HkQiiYL@x?V%=fF9EjH;!26JjGL05_>lwfBWFbk#e+D_l>>y_H@)fUPPSx ztS!?Vh7aFt1wx#K?EX5!#}VF&@COJfmnRUiQcpq~VxNS>J_&^s z`&Pka8|XjVK6$40v$xOZAY=FGWv6|XC260Ip+c&bISpB8|JGm2{1A2ctnKnGXiMyp zkk}<5v<3VX95UW2J{KgO-OT;0?ZL7D3N_ftIKU$i0`;+Jgk3*xZzm@~Z5VFk|eT4RTC zmD`7|;IS_Yfh21y_26Lzej*LWw(M;r{30(h#7{8@dC~S2gYp8ybS|yecqHh47a~pQjGMU*UWLAW1RahNjuj`GEXKR85HGIGv7= z&&Ittij9t_Mj_sPQwP%&fc7keMf>Pv_+wf@vLmYb9c@cy*VVU#Wnj)SSdUefSckOE z8d6#J`*TQT-|xS_<481qB4CpBn%;hDi0uq%w38$go}k`pjk?r9jxkt6R|h?2ghkWW zs5v>Dht%7J1Kr{l!+`_2Idv^vVYtBz^TE3sY|Zxxwf;-Fu{BdUV&k-CvP3!>hrP7=uv1Z7h4!q`9>@ zlH_P{zGa+_MS>~F%X*mqN^~*K5jU1z^nmefg!>_$=SaC|fKj)8YwwE)S>Cw_DWo4k zn4%a$q8LK5NF}&6hR$Qez3T*i9Wr%qtUCo>;`9z4zj5Wiypw_k?9C9-z=tT)U@PD@ zTLFYb0fb~@U2q$aui$jwI?Ni$dk*7eMbB%HyWM$j5(e^mP4FOl(eKzz$OerjyD!w6 z`98-RdI&6NJu9{s9x;6YoeYspGP#neXSEq>J7*J{`l_~!tJ<{uIQ(RhV+H#Y3NZq_9Z|Z5#_0$0+Kv_W5;3)XU6ATt&ov=jt%7l`bejxv-vwd z1^8Ic@rW6QFWOTfoR0DN;VL>l-yiXD2TXxG9JF6RnC)y69M~p1K5uUA4C7ryPGXtA z^{|ZcI2X?zg%ERw?q-Dh zA#6oB4B;gRA=~b25FUt-xNA;-^0A*6ne zMo0lY0a%BZaW(V>jyv3}Z3u6t>p@ql$f^x(J`2zZs*{&5Ura2tEiV&_z(ib>J&nbBUd*tlr z1$fErXY2*oKd;2cdMJ380QLj)0dFFt z4|o?LeZWqH^Z~$WA3(iWKH!&t#Rm`)A3!LiUj-7}YyjCKxy z(NQ^n0Pw4bcfWbXG(+*Jz~_0Vae55i?9p<2TYGJNUBkk-5py(mXV+wpnE9K31;~gG zfAh~Vf*vhc{g-9p2%6kZH2CM0{309V+IjQ<#8u)?yH-bhFb}@;Byi?b^RomY_)fFHbw2nUc
  • (JAFth+at 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 literal 0 HcmV?d00001 diff --git a/Code/Physics/lib/Debug/BulletFileLoader_Debugx64.lib b/Code/Physics/lib/Debug/BulletFileLoader_Debugx64.lib new file mode 100644 index 0000000000000000000000000000000000000000..ee5da394e9930f5c56499b74f97c6ce7eddfb730 GIT binary patch literal 614654 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ⅇ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 literal 0 HcmV?d00001 diff --git a/Code/Physics/lib/Debug/BulletWorldImporter_Debug.lib b/Code/Physics/lib/Debug/BulletWorldImporter_Debug.lib new file mode 100644 index 0000000000000000000000000000000000000000..021e8935ff2adb8140b5f6c580a76a5d073d07b3 GIT binary patch literal 1036344 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­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

    NU;yBt~ib?aC$be$>&CydSGB(Y%-AW(KsI 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 literal 0 HcmV?d00001 diff --git a/Code/Physics/lib/Release/BulletFileLoader.lib b/Code/Physics/lib/Release/BulletFileLoader.lib new file mode 100644 index 0000000000000000000000000000000000000000..b1ff3742023e96109c7ac3532915ed30ef61e091 GIT binary patch literal 192098 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 K8f)Q1tL5LFuo-gz literal 0 HcmV?d00001 diff --git a/Code/Physics/lib/Release/BulletFileLoaderx64.lib b/Code/Physics/lib/Release/BulletFileLoaderx64.lib new file mode 100644 index 0000000000000000000000000000000000000000..d3b423fd2930ec1fe563cf98f31c3f8833a1720f GIT binary patch literal 323882 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
    + + @@ -8,4 +13,11 @@ + + + + .\..\Content\ + + + diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs index bd168c3c..73ef627c 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs @@ -36,7 +36,6 @@ this.label_listenPort = new System.Windows.Forms.Label(); this.panel_serverOptions = new System.Windows.Forms.Panel(); this.panel_commands = new System.Windows.Forms.Panel(); - this.mapName = new System.Windows.Forms.TextBox(); this.timeLimit = new System.Windows.Forms.NumericUpDown(); this.gameModes = new System.Windows.Forms.ComboBox(); this.label3 = new System.Windows.Forms.Label(); @@ -52,6 +51,22 @@ this.splitter1 = new System.Windows.Forms.Splitter(); this.clientInfoBox = new System.Windows.Forms.ListBox(); this.panel_CommanArea = new System.Windows.Forms.Panel(); + this.label5 = new System.Windows.Forms.Label(); + this.mapName = new System.Windows.Forms.ComboBox(); + this.panelServerCommands = new System.Windows.Forms.Panel(); + this.buttonExecuteSend = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.dataProtocolFields = new System.Windows.Forms.TableLayoutPanel(); + this.buttonAddNewDataField = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.buttonsAtBottom = new System.Windows.Forms.TableLayoutPanel(); ((System.ComponentModel.ISupportInitialize)(this.listenPort)).BeginInit(); this.panel_serverOptions.SuspendLayout(); this.panel_commands.SuspendLayout(); @@ -59,13 +74,20 @@ ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).BeginInit(); this.panel_clientArea.SuspendLayout(); this.panel_CommanArea.SuspendLayout(); + this.panelServerCommands.SuspendLayout(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + this.tableLayoutPanel1.SuspendLayout(); + this.dataProtocolFields.SuspendLayout(); + this.buttonsAtBottom.SuspendLayout(); this.SuspendLayout(); // // serverToggle // - this.serverToggle.Location = new System.Drawing.Point(9, 106); + this.serverToggle.Dock = System.Windows.Forms.DockStyle.Bottom; + this.serverToggle.Location = new System.Drawing.Point(0, 83); this.serverToggle.Name = "serverToggle"; - this.serverToggle.Size = new System.Drawing.Size(75, 23); + this.serverToggle.Size = new System.Drawing.Size(241, 20); this.serverToggle.TabIndex = 0; this.serverToggle.Text = "Start server"; this.serverToggle.UseVisualStyleBackColor = true; @@ -140,46 +162,40 @@ this.panel_serverOptions.Dock = System.Windows.Forms.DockStyle.Top; this.panel_serverOptions.Location = new System.Drawing.Point(0, 0); this.panel_serverOptions.Name = "panel_serverOptions"; - this.panel_serverOptions.Size = new System.Drawing.Size(200, 141); + this.panel_serverOptions.Size = new System.Drawing.Size(241, 103); this.panel_serverOptions.TabIndex = 6; // // panel_commands // - this.panel_commands.Controls.Add(this.mapName); this.panel_commands.Controls.Add(this.timeLimit); + this.panel_commands.Controls.Add(this.mapName); this.panel_commands.Controls.Add(this.gameModes); this.panel_commands.Controls.Add(this.label3); this.panel_commands.Controls.Add(this.forceStart); this.panel_commands.Controls.Add(this.label2); this.panel_commands.Controls.Add(this.label4); + this.panel_commands.Controls.Add(this.label5); this.panel_commands.Controls.Add(this.labelClientsConnected); this.panel_commands.Controls.Add(this.label1); this.panel_commands.Controls.Add(this.nrOfClients); this.panel_commands.Controls.Add(this.buttonStartGame); - this.panel_commands.Location = new System.Drawing.Point(3, 150); + this.panel_commands.Dock = System.Windows.Forms.DockStyle.Top; + this.panel_commands.Location = new System.Drawing.Point(0, 103); this.panel_commands.Name = "panel_commands"; - this.panel_commands.Size = new System.Drawing.Size(191, 202); + this.panel_commands.Size = new System.Drawing.Size(241, 188); this.panel_commands.TabIndex = 7; this.panel_commands.Visible = false; // - // mapName - // - this.mapName.Location = new System.Drawing.Point(75, 10); - this.mapName.Name = "mapName"; - this.mapName.Size = new System.Drawing.Size(113, 20); - this.mapName.TabIndex = 12; - this.mapName.Text = "2ofAll_updated.bias"; - // // timeLimit // - this.timeLimit.Location = new System.Drawing.Point(109, 94); + this.timeLimit.Location = new System.Drawing.Point(112, 89); this.timeLimit.Minimum = new decimal(new int[] { 5, 0, 0, 0}); this.timeLimit.Name = "timeLimit"; - this.timeLimit.Size = new System.Drawing.Size(68, 20); + this.timeLimit.Size = new System.Drawing.Size(123, 20); this.timeLimit.TabIndex = 11; this.timeLimit.ThousandsSeparator = true; this.timeLimit.Value = new decimal(new int[] { @@ -195,9 +211,9 @@ this.gameModes.Items.AddRange(new object[] { "Free-for-all", "Team death-match"}); - this.gameModes.Location = new System.Drawing.Point(78, 66); + this.gameModes.Location = new System.Drawing.Point(77, 61); this.gameModes.Name = "gameModes"; - this.gameModes.Size = new System.Drawing.Size(110, 21); + this.gameModes.Size = new System.Drawing.Size(158, 21); this.gameModes.TabIndex = 10; // // label3 @@ -242,11 +258,11 @@ // labelClientsConnected // this.labelClientsConnected.AutoSize = true; - this.labelClientsConnected.Location = new System.Drawing.Point(9, 149); + this.labelClientsConnected.Location = new System.Drawing.Point(131, 147); this.labelClientsConnected.Name = "labelClientsConnected"; - this.labelClientsConnected.Size = new System.Drawing.Size(104, 13); + this.labelClientsConnected.Size = new System.Drawing.Size(80, 13); this.labelClientsConnected.TabIndex = 8; - this.labelClientsConnected.Text = "Clients connected: 0"; + this.labelClientsConnected.Text = "Game clients: 0"; // // label1 // @@ -259,7 +275,7 @@ // // nrOfClients // - this.nrOfClients.Location = new System.Drawing.Point(78, 36); + this.nrOfClients.Location = new System.Drawing.Point(72, 34); this.nrOfClients.Maximum = new decimal(new int[] { 20, 0, @@ -271,7 +287,7 @@ 0, 0}); this.nrOfClients.Name = "nrOfClients"; - this.nrOfClients.Size = new System.Drawing.Size(39, 20); + this.nrOfClients.Size = new System.Drawing.Size(163, 20); this.nrOfClients.TabIndex = 7; this.nrOfClients.Value = new decimal(new int[] { 10, @@ -281,9 +297,10 @@ // // buttonStartGame // - this.buttonStartGame.Location = new System.Drawing.Point(9, 176); + this.buttonStartGame.Dock = System.Windows.Forms.DockStyle.Bottom; + this.buttonStartGame.Location = new System.Drawing.Point(0, 166); this.buttonStartGame.Name = "buttonStartGame"; - this.buttonStartGame.Size = new System.Drawing.Size(75, 23); + this.buttonStartGame.Size = new System.Drawing.Size(241, 22); this.buttonStartGame.TabIndex = 6; this.buttonStartGame.Text = "Start game"; this.buttonStartGame.UseVisualStyleBackColor = true; @@ -295,9 +312,9 @@ this.panel_clientArea.Controls.Add(this.splitter1); this.panel_clientArea.Controls.Add(this.clientInfoBox); this.panel_clientArea.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel_clientArea.Location = new System.Drawing.Point(200, 0); + this.panel_clientArea.Location = new System.Drawing.Point(241, 0); this.panel_clientArea.Name = "panel_clientArea"; - this.panel_clientArea.Size = new System.Drawing.Size(535, 616); + this.panel_clientArea.Size = new System.Drawing.Size(494, 616); this.panel_clientArea.TabIndex = 8; // // ServerInfoTextArea @@ -307,19 +324,19 @@ this.ServerInfoTextArea.Dock = System.Windows.Forms.DockStyle.Fill; this.ServerInfoTextArea.Font = new System.Drawing.Font("GulimChe", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.ServerInfoTextArea.ForeColor = System.Drawing.SystemColors.Info; - this.ServerInfoTextArea.Location = new System.Drawing.Point(0, 152); + this.ServerInfoTextArea.Location = new System.Drawing.Point(0, 269); this.ServerInfoTextArea.Name = "ServerInfoTextArea"; this.ServerInfoTextArea.ReadOnly = true; - this.ServerInfoTextArea.Size = new System.Drawing.Size(535, 464); + this.ServerInfoTextArea.Size = new System.Drawing.Size(494, 347); this.ServerInfoTextArea.TabIndex = 1; this.ServerInfoTextArea.Text = ""; // // splitter1 // this.splitter1.Dock = System.Windows.Forms.DockStyle.Top; - this.splitter1.Location = new System.Drawing.Point(0, 147); + this.splitter1.Location = new System.Drawing.Point(0, 264); this.splitter1.Name = "splitter1"; - this.splitter1.Size = new System.Drawing.Size(535, 5); + this.splitter1.Size = new System.Drawing.Size(494, 5); this.splitter1.TabIndex = 2; this.splitter1.TabStop = false; // @@ -329,19 +346,221 @@ this.clientInfoBox.FormattingEnabled = true; this.clientInfoBox.Location = new System.Drawing.Point(0, 0); this.clientInfoBox.Name = "clientInfoBox"; - this.clientInfoBox.Size = new System.Drawing.Size(535, 147); + this.clientInfoBox.Size = new System.Drawing.Size(494, 264); this.clientInfoBox.TabIndex = 0; // // panel_CommanArea // + this.panel_CommanArea.Controls.Add(this.panelServerCommands); this.panel_CommanArea.Controls.Add(this.panel_commands); this.panel_CommanArea.Controls.Add(this.panel_serverOptions); this.panel_CommanArea.Dock = System.Windows.Forms.DockStyle.Left; this.panel_CommanArea.Location = new System.Drawing.Point(0, 0); this.panel_CommanArea.Name = "panel_CommanArea"; - this.panel_CommanArea.Size = new System.Drawing.Size(200, 616); + this.panel_CommanArea.Size = new System.Drawing.Size(241, 616); this.panel_CommanArea.TabIndex = 9; // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(23, 147); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(81, 13); + this.label5.TabIndex = 8; + this.label5.Text = "Lobby clients: 0"; + // + // mapName + // + this.mapName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.mapName.FormattingEnabled = true; + this.mapName.IntegralHeight = false; + this.mapName.Items.AddRange(new object[] { + "Set default"}); + this.mapName.Location = new System.Drawing.Point(72, 7); + this.mapName.Name = "mapName"; + this.mapName.Size = new System.Drawing.Size(163, 21); + this.mapName.TabIndex = 10; + // + // panelServerCommands + // + this.panelServerCommands.Controls.Add(this.dataProtocolFields); + this.panelServerCommands.Dock = System.Windows.Forms.DockStyle.Top; + this.panelServerCommands.Location = new System.Drawing.Point(0, 291); + this.panelServerCommands.Name = "panelServerCommands"; + this.panelServerCommands.Size = new System.Drawing.Size(241, 85); + this.panelServerCommands.TabIndex = 8; + this.panelServerCommands.Visible = false; + // + // buttonExecuteSend + // + this.buttonExecuteSend.Dock = System.Windows.Forms.DockStyle.Fill; + this.buttonExecuteSend.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonExecuteSend.Location = new System.Drawing.Point(116, 0); + this.buttonExecuteSend.Margin = new System.Windows.Forms.Padding(0); + this.buttonExecuteSend.Name = "buttonExecuteSend"; + this.buttonExecuteSend.Size = new System.Drawing.Size(117, 21); + this.buttonExecuteSend.TabIndex = 0; + this.buttonExecuteSend.Text = "Send"; + this.buttonExecuteSend.UseVisualStyleBackColor = true; + // + // panel2 + // + this.panel2.Controls.Add(this.button2); + this.panel2.Controls.Add(this.textBox1); + this.panel2.Controls.Add(this.comboBox1); + this.panel2.Controls.Add(this.numericUpDown1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(4, 32); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(233, 21); + this.panel2.TabIndex = 0; + // + // comboBox1 + // + this.comboBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.IntegralHeight = false; + this.comboBox1.Items.AddRange(new object[] { + "netBool;", + "netChar;", + "netUChar;", + "netShort;", + "netUShort;", + "netInt;", + "netUInt;", + "netInt64;", + "netUInt64;", + "netFloat;", + "netDouble;", + "netCharPtr;"}); + this.comboBox1.Location = new System.Drawing.Point(42, 0); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(78, 21); + this.comboBox1.TabIndex = 10; + // + // numericUpDown1 + // + this.numericUpDown1.Dock = System.Windows.Forms.DockStyle.Left; + this.numericUpDown1.Location = new System.Drawing.Point(0, 0); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(42, 20); + this.numericUpDown1.TabIndex = 11; + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.textBox1.Location = new System.Drawing.Point(120, 0); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(64, 20); + this.textBox1.TabIndex = 12; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35.29412F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 64.70588F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 110F)); + this.tableLayoutPanel1.Controls.Add(this.label6, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.label7, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.label8, 2, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(4, 4); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 27.05882F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(233, 21); + this.tableLayoutPanel1.TabIndex = 9; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(4, 1); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(18, 13); + this.label6.TabIndex = 8; + this.label6.Text = "ID"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(46, 1); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(31, 13); + this.label7.TabIndex = 8; + this.label7.Text = "Type"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(123, 1); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(34, 13); + this.label8.TabIndex = 8; + this.label8.Text = "Value"; + // + // dataProtocolFields + // + this.dataProtocolFields.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.dataProtocolFields.ColumnCount = 1; + this.dataProtocolFields.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 21F)); + this.dataProtocolFields.Controls.Add(this.panel2, 0, 1); + this.dataProtocolFields.Controls.Add(this.tableLayoutPanel1, 0, 0); + this.dataProtocolFields.Controls.Add(this.buttonsAtBottom, 0, 2); + this.dataProtocolFields.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataProtocolFields.Location = new System.Drawing.Point(0, 0); + this.dataProtocolFields.Margin = new System.Windows.Forms.Padding(0); + this.dataProtocolFields.Name = "dataProtocolFields"; + this.dataProtocolFields.RowCount = 3; + this.dataProtocolFields.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.dataProtocolFields.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.dataProtocolFields.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.dataProtocolFields.Size = new System.Drawing.Size(241, 85); + this.dataProtocolFields.TabIndex = 9; + // + // buttonAddNewDataField + // + this.buttonAddNewDataField.Dock = System.Windows.Forms.DockStyle.Fill; + this.buttonAddNewDataField.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonAddNewDataField.Location = new System.Drawing.Point(0, 0); + this.buttonAddNewDataField.Margin = new System.Windows.Forms.Padding(0); + this.buttonAddNewDataField.Name = "buttonAddNewDataField"; + this.buttonAddNewDataField.Size = new System.Drawing.Size(116, 21); + this.buttonAddNewDataField.TabIndex = 1; + this.buttonAddNewDataField.Text = "Add field"; + this.buttonAddNewDataField.UseVisualStyleBackColor = true; + this.buttonAddNewDataField.Click += new System.EventHandler(this.buttonAddNewDataField_Click); + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button2.Location = new System.Drawing.Point(184, 0); + this.button2.Margin = new System.Windows.Forms.Padding(0); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(49, 21); + this.button2.TabIndex = 0; + this.button2.Text = "remove"; + this.button2.UseVisualStyleBackColor = true; + // + // buttonsAtBottom + // + this.buttonsAtBottom.ColumnCount = 2; + this.buttonsAtBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.buttonsAtBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.buttonsAtBottom.Controls.Add(this.buttonAddNewDataField, 0, 0); + this.buttonsAtBottom.Controls.Add(this.buttonExecuteSend, 1, 0); + this.buttonsAtBottom.Dock = System.Windows.Forms.DockStyle.Fill; + this.buttonsAtBottom.Location = new System.Drawing.Point(4, 60); + this.buttonsAtBottom.Name = "buttonsAtBottom"; + this.buttonsAtBottom.RowCount = 1; + this.buttonsAtBottom.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.buttonsAtBottom.Size = new System.Drawing.Size(233, 21); + this.buttonsAtBottom.TabIndex = 10; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -361,6 +580,14 @@ ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).EndInit(); this.panel_clientArea.ResumeLayout(false); this.panel_CommanArea.ResumeLayout(false); + this.panelServerCommands.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.dataProtocolFields.ResumeLayout(false); + this.buttonsAtBottom.ResumeLayout(false); this.ResumeLayout(false); } @@ -387,10 +614,25 @@ private System.Windows.Forms.NumericUpDown timeLimit; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox mapName; private System.Windows.Forms.CheckBox forceStart; private System.Windows.Forms.Label labelClientsConnected; private System.Windows.Forms.Panel panel_CommanArea; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox mapName; + private System.Windows.Forms.Panel panelServerCommands; + private System.Windows.Forms.Button buttonExecuteSend; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.TableLayoutPanel dataProtocolFields; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Button buttonAddNewDataField; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TableLayoutPanel buttonsAtBottom; } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.cs index 58deb2a9..8b7e9474 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.cs @@ -11,6 +11,7 @@ using System.Windows.Interop; using System.Runtime.InteropServices; using System.Threading; using System.Timers; +using System.IO; namespace StandAloneLauncher { @@ -18,12 +19,22 @@ namespace StandAloneLauncher { System.Windows.Interop.StandaloneGameServerCLI gameServer; bool serverIsRunning = false; + bool gameIsStarted = false; public Form1() { InitializeComponent(); + + string[] maps = Directory.GetFiles("..\\Content\\Worlds\\"); + + for (int i = 0; i < maps.Length; i++) + { + string temp = maps[i].Split('\\').Last() ; + this.mapName.Items.Add(temp); + } + this.gameModes.SelectedIndex = 0; - + this.mapName.SelectedIndex = 0; } public bool Initiate() @@ -55,6 +66,7 @@ namespace StandAloneLauncher this.serverToggle.Text = "Start server"; this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Server terminated!\n"); this.panel_commands.Visible = false; + this.panelServerCommands.Visible = false; } else { @@ -77,6 +89,7 @@ namespace StandAloneLauncher this.gameServer.ServerStart(); this.panel_commands.Visible = true; this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Server initiated!\n\tListening on port " + this.listenPort.Value.ToString() + "\n\tLocal IP: " + info.serverIp + "\n"); + this.panelServerCommands.Visible = true; } else { @@ -87,18 +100,38 @@ namespace StandAloneLauncher private void buttonStartGame_Click(object sender, EventArgs e) { - //this.gameServer.GameSetGameMode(this.gameModes.SelectedText); - this.gameServer.GameSetGameTime((int)this.timeLimit.Value); - this.gameServer.GameSetMapName(this.mapName.Text); - this.gameServer.GameSetMaxClients((int)this.nrOfClients.Value); - - if (!this.gameServer.GameStart( this.forceStart.Checked )) + if (!gameIsStarted) { - this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to start the game session!\n"); + //this.gameServer.GameSetGameMode(this.gameModes.SelectedText); + this.gameServer.GameSetGameTime((int)this.timeLimit.Value); + this.gameServer.GameSetMapName(this.mapName.Text); + this.gameServer.GameSetMaxClients((int)this.nrOfClients.Value); + + if (!(gameIsStarted = this.gameServer.GameStart(this.forceStart.Checked))) + { + this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to start the game session!\n"); + } + else + { + this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Game session started!\n"); + this.buttonStartGame.Text = "Stop Game"; + + this.mapName.Enabled = false; + this.nrOfClients.Enabled = false; + this.gameModes.Enabled = false; + this.timeLimit.Enabled = false; + this.forceStart.Enabled = false; + } } else { - this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Game session started!\n"); + this.gameIsStarted = false; + this.buttonStartGame.Text = "Start Game"; + this.mapName.Enabled = true; + this.nrOfClients.Enabled = true; + this.gameModes.Enabled = true; + this.timeLimit.Enabled = true; + this.forceStart.Enabled = true; } } @@ -109,5 +142,17 @@ namespace StandAloneLauncher this.gameServer.ServerStop(); } } + + private void buttonAddNewDataField_Click(object sender, EventArgs e) + { + this.dataProtocolFields.RowCount++; + this.dataProtocolFields.SetRow(this.buttonsAtBottom, this.dataProtocolFields.RowCount - 1); + + Panel p = new Panel(); + p = this.panel2; + + this.dataProtocolFields.RowStyles.Add(new RowStyle(SizeType.Absolute, 27)); + + } } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.Designer.cs b/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.Designer.cs index 18c7c5f4..5c383ce6 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.Designer.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.Designer.cs @@ -8,23 +8,31 @@ // //------------------------------------------------------------------------------ -namespace StandAloneLauncher.Properties -{ - - +namespace StandAloneLauncher.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute(".\\..\\Content\\")] + public string Dennis { + get { + return ((string)(this["Dennis"])); + } + set { + this["Dennis"] = value; + } + } } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.settings b/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.settings index 39645652..f260c659 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.settings +++ b/Code/Game/LanServer/StandAloneLauncher/Properties/Settings.settings @@ -1,7 +1,9 @@  - - - - - - + + + + + .\..\Content\ + + + \ No newline at end of file diff --git a/Code/Game/LanServer/StandAloneLauncher/StandAloneLauncher.csproj b/Code/Game/LanServer/StandAloneLauncher/StandAloneLauncher.csproj index 2d2c86fe..ec2a45b0 100644 --- a/Code/Game/LanServer/StandAloneLauncher/StandAloneLauncher.csproj +++ b/Code/Game/LanServer/StandAloneLauncher/StandAloneLauncher.csproj @@ -80,6 +80,7 @@ + From ca2695293f5ed7b795bdb8fad05a5865c4e9cca9 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Wed, 19 Feb 2014 09:25:40 +0100 Subject: [PATCH 34/46] Added reconnect (not tested). Added check for level parser not finding file. --- Code/Network/NetworkAPI/NetworkClient.cpp | 5 +++ Code/Network/NetworkAPI/NetworkClient.h | 5 +++ .../NetworkDependencies/Connection.cpp | 34 +++++++++++++++++++ Code/Network/NetworkDependencies/Connection.h | 6 ++++ .../Network/NetworkDependencies/IConnection.h | 3 ++ 5 files changed, 53 insertions(+) diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index 69872fc1..6f2998e9 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -317,6 +317,11 @@ bool NetworkClient::Connect(unsigned short port, std::wstring serverIP) return this->Connect(port, ip.c_str()); } +bool NetworkClient::Reconnect() +{ + return this->privateData->connection.Reconnect(); +} + void NetworkClient::Disconnect() { if(!privateData) return; diff --git a/Code/Network/NetworkAPI/NetworkClient.h b/Code/Network/NetworkAPI/NetworkClient.h index 6f037117..a7f3b0bb 100644 --- a/Code/Network/NetworkAPI/NetworkClient.h +++ b/Code/Network/NetworkAPI/NetworkClient.h @@ -93,6 +93,11 @@ namespace Oyster */ bool Connect(unsigned short port, std::wstring serverIP); + /**Tries to connect with the same port and ip it earlier used for Connect. + * + */ + bool Reconnect(); + /** * */ diff --git a/Code/Network/NetworkDependencies/Connection.cpp b/Code/Network/NetworkDependencies/Connection.cpp index 99cb8a71..a9abf75c 100644 --- a/Code/Network/NetworkDependencies/Connection.cpp +++ b/Code/Network/NetworkDependencies/Connection.cpp @@ -58,6 +58,9 @@ int Connection::Connect(unsigned short port , const char serverName[], bool bloc { if(this->socket == -1 || this->socket == 0) InitiateSocket(); + lastConnectPort = port; + lastConnectAddr = serverName; + struct hostent *hostEnt; if((hostEnt = gethostbyname(serverName)) == NULL) { @@ -83,6 +86,37 @@ int Connection::Connect(unsigned short port , const char serverName[], bool bloc return 0; } +int Connection::Reconnect() +{ + if(this->socket == -1 || this->socket == 0) InitiateSocket(); + + struct hostent *hostEnt; + if((hostEnt = gethostbyname(lastConnectAddr.c_str())) == NULL) + { + return WSAGetLastError(); + } + + struct sockaddr_in server; + server.sin_family = AF_INET; + server.sin_port = htons(lastConnectPort); + server.sin_addr.s_addr = *(unsigned long*) hostEnt->h_addr; + + SetBlockingMode(true); + + if(connect(this->socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) + { + return WSAGetLastError(); + } + + closed = false; + stillSending = true; + + SetBlockingMode(blocking); + + //connection succesfull! + return 0; +} + int Connection::InitiateServer(unsigned short port) { int errorCode = 0; diff --git a/Code/Network/NetworkDependencies/Connection.h b/Code/Network/NetworkDependencies/Connection.h index 0f46a599..054537fc 100644 --- a/Code/Network/NetworkDependencies/Connection.h +++ b/Code/Network/NetworkDependencies/Connection.h @@ -28,6 +28,7 @@ namespace Oyster virtual int Disconnect(); virtual int Connect(ConnectionInfo info, bool blocking = false); virtual int Connect(unsigned short port , const char serverName[], bool blocking = false); + virtual int Reconnect(); virtual ConnectionInfo Listen(); @@ -47,6 +48,11 @@ namespace Oyster bool stillSending; bool closed; std::string addr; + + std::string lastConnectAddr; + unsigned short lastConnectPort; + + bool blocking; }; } } diff --git a/Code/Network/NetworkDependencies/IConnection.h b/Code/Network/NetworkDependencies/IConnection.h index 7c92f318..debdfe7b 100644 --- a/Code/Network/NetworkDependencies/IConnection.h +++ b/Code/Network/NetworkDependencies/IConnection.h @@ -39,6 +39,9 @@ namespace Oyster //(servers uses Listen instead of connect) virtual int Connect( unsigned short port, const char serverName[] ) { return false; }; + //Tries to connect with the same port and ip used for Connect. + virtual int Reconnect() = 0; + //Disconnects the client or server TODO: optimize! virtual int Disconnect() = 0; }; From 6e80c1c60318e197068bea3142b0797e4a1bae4a Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Wed, 19 Feb 2014 09:39:19 +0100 Subject: [PATCH 35/46] LevelLoader - Added an if check to se if it found the map file. --- .../LevelLoader/LevelParser.cpp | 293 +++++++++--------- 1 file changed, 148 insertions(+), 145 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp index 39d2f625..2fbf5df3 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp @@ -33,184 +33,187 @@ std::vector> LevelParser::Parse(std::string filen Loader loader; char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) + if(buffer) { - //Returns an empty vector, because it will most likely fail to read the level format. - return objects; - } - - while(counter < bufferSize) - { - loadCgf = true; - //Get typeID - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - switch((int)typeID) + //Read format version + LevelLoaderInternal::FormatVersion levelFormatVersion; + ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); + counter += sizeof(levelFormatVersion); + if(this->formatVersion != levelFormatVersion) { - case ObjectType_LevelMetaData: + //Returns an empty vector, because it will most likely fail to read the level format. + return objects; + } + + while(counter < bufferSize) + { + loadCgf = true; + //Get typeID + ObjectType typeID; + ParseObject(&buffer[counter], &typeID, sizeof(typeID)); + switch((int)typeID) { - SmartPointer header = new LevelMetaData; - ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); - objects.push_back(header); - break; - } - - case ObjectType_SpawnPoint: - { - loadCgf = false; - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - SpawnPointAttributes* spawn = new SpawnPointAttributes; - - spawn->typeID = header->typeID; - - for(int i = 0; i < 3; i++) + case ObjectType_LevelMetaData: { - spawn->position[i] = header->position[i]; + SmartPointer header = new LevelMetaData; + ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); + objects.push_back(header); + break; } - delete header; - //objects.push_back(header); - objects.push_back(spawn); - break; - } - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - //Unless they are changed to not be the same. - case ObjectType_Static: case ObjectType_Dynamic: - { - //Get specialType. - ObjectSpecialType specialType; - ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); - - switch(specialType) + case ObjectType_SpawnPoint: { - //there is no difference when parsing these specialTypes. - case ObjectSpecialType_CrystalShard: - case ObjectSpecialType_CrystalFormation: - case ObjectSpecialType_Spike: - case ObjectSpecialType_SpikeBox: - case ObjectSpecialType_RedExplosiveBox: - case ObjectSpecialType_StandarsBox: - case ObjectSpecialType_Stone: - case ObjectSpecialType_Building: - { - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - objects.push_back(header); + loadCgf = false; + ObjectHeader* header = new ObjectHeader; + ParseObject(&buffer[counter], *header, counter, loadCgf); - break; + SpawnPointAttributes* spawn = new SpawnPointAttributes; + + spawn->typeID = header->typeID; + + for(int i = 0; i < 3; i++) + { + spawn->position[i] = header->position[i]; } - case ObjectSpecialType_JumpPad: + delete header; + //objects.push_back(header); + objects.push_back(spawn); + break; + } + + //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. + //Unless they are changed to not be the same. + case ObjectType_Static: case ObjectType_Dynamic: + { + //Get specialType. + ObjectSpecialType specialType; + ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); + + switch(specialType) { - JumpPadAttributes* header = new JumpPadAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + //there is no difference when parsing these specialTypes. + case ObjectSpecialType_CrystalShard: + case ObjectSpecialType_CrystalFormation: + case ObjectSpecialType_Spike: + case ObjectSpecialType_SpikeBox: + case ObjectSpecialType_RedExplosiveBox: + case ObjectSpecialType_StandarsBox: + case ObjectSpecialType_Stone: + case ObjectSpecialType_Building: + { + ObjectHeader* header = new ObjectHeader; + ParseObject(&buffer[counter], *header, counter, loadCgf); + objects.push_back(header); - //Read the spec - ParseObject(&buffer[counter], header->direction, 16); - counter += 16; - objects.push_back(header); + break; + } - break; - } + case ObjectSpecialType_JumpPad: + { + JumpPadAttributes* header = new JumpPadAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); + + //Read the spec + ParseObject(&buffer[counter], header->direction, 16); + counter += 16; + objects.push_back(header); + + break; + } - case ObjectSpecialType_Portal: - { - PortalAttributes* header = new PortalAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_Portal: + { + PortalAttributes* header = new PortalAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], header->destination, 12); - counter += 12; - objects.push_back(header); + ParseObject(&buffer[counter], header->destination, 12); + counter += 12; + objects.push_back(header); - break; - } + break; + } - case ObjectSpecialType_World: - { - WorldAttributes* header = new WorldAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_World: + { + WorldAttributes* header = new WorldAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], &header->worldSize, 8); - counter += 8; - objects.push_back(header); - break; - } + ParseObject(&buffer[counter], &header->worldSize, 8); + counter += 8; + objects.push_back(header); + break; + } - case ObjectSpecialType_Sky: - { - loadCgf = false; - SkyAttributes* header = new SkyAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_Sky: + { + loadCgf = false; + SkyAttributes* header = new SkyAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], &header->skySize, 4); - counter += 4; - objects.push_back(header); - break; - } - //this is a hotfix, fix so you only load the relevant data when the file is updated + ParseObject(&buffer[counter], &header->skySize, 4); + counter += 4; + objects.push_back(header); + break; + } + //this is a hotfix, fix so you only load the relevant data when the file is updated - default: - //Couldn't find specialType - break; + default: + //Couldn't find specialType + break; + } + break; } - break; - } - case ObjectType_Light: - { - LightType lightType; + case ObjectType_Light: + { + LightType lightType; - //Get Light type - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); + //Get Light type + ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - //We only support PointLight for now. - BasicLight* header = new BasicLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - /*switch(lightType) - { - case LightType_PointLight: - { - PointLight* header = new PointLight; + //We only support PointLight for now. + BasicLight* header = new BasicLight; ParseObject(&buffer[counter], header, sizeof(*header)); counter += sizeof(*header); objects.push_back(header); - break; - } - case LightType_DirectionalLight: - { - DirectionalLight* header = new DirectionalLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_SpotLight: - { - SpotLight* header = new SpotLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; + /*switch(lightType) + { + case LightType_PointLight: + { + PointLight* header = new PointLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + case LightType_DirectionalLight: + { + DirectionalLight* header = new DirectionalLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + case LightType_SpotLight: + { + SpotLight* header = new SpotLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + default: + //Undefined LightType. + break; + } + break;*/ } default: - //Undefined LightType. + //Couldn't find typeID. FAIL!!!!!! break; - } - break;*/ } - default: - //Couldn't find typeID. FAIL!!!!!! - break; } } From c2ef8350cfa7288bc3093c307952f3a41eb8ef9e Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Wed, 19 Feb 2014 10:15:52 +0100 Subject: [PATCH 36/46] GL - players created with unique ids --- Code/Game/GameLogic/Game.cpp | 39 +++++++++++++++++-------- Code/Game/GameLogic/Game_PlayerData.cpp | 18 +++++++++--- Code/Misc/Utilities/Utilities.h | 6 +--- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index ba294349..8b77dea4 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -68,12 +68,33 @@ void Game::GetAllPlayerPositions() const Game::PlayerData* Game::CreatePlayer() { // Find a free space in array or insert at end - int i = InsertObject(this->players, (PlayerData*)0); + int insert = InsertObject(this->players, (PlayerData*)0); + int freeID = 0; + bool found = false; - this->players[i] = new PlayerData(); - this->players[i]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove); + for(int i = 0; i < 100; i++) + { + found = true; + freeID = i; - return this->players[i]; + for(int j = 0; j < players.Size(); j++) + { + + if(this->players[j] && this->players[j]->GetID() == freeID) + { + found = false; + } + + if(!found) break; + } + + if(found) break; + } + + this->players[insert] = new PlayerData(freeID, 0); // user constructor with objectID and teamID + this->players[insert]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove); + + return this->players[insert]; } Game::LevelData* Game::CreateLevel(const wchar_t mapName[255]) @@ -95,21 +116,15 @@ bool Game::NewFrame() { for (unsigned int i = 0; i < this->players.Size(); i++) { - if(this->players[i]->player) this->players[i]->player->BeginFrame(); + if(this->players[i] && this->players[i]->player) this->players[i]->player->BeginFrame(); } API::Instance().UpdateWorld(); for (unsigned int i = 0; i < this->players.Size(); i++) { - if(this->players[i]->player) this->players[i]->player->EndFrame(); - gameInstance.onMoveFnc(this->players[i]); + if(this->players[i] && this->players[i]->player) this->players[i]->player->EndFrame(); } - for (unsigned int i = 0; i < this->level->level->dynamicObjects.Size(); i++) - { - gameInstance.onMoveFnc(this->level->level->dynamicObjects[i]); - } - return true; } diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index e7a77bbd..3858d370 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -21,13 +21,23 @@ Game::PlayerData::PlayerData() rigidBody->SetAngularFactor(0.0f); //create player with this rigid body this->player = new Player(rigidBody, Player::PlayerCollision, ObjectSpecialType_Player,0,0); - - //this->player->GetRigidBody()->SetCustomTag(this); - player->EndFrame(); } Game::PlayerData::PlayerData(int playerID,int teamID) { - this->player = new Player(); + Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(50,130,0); + + Oyster::Math::Float3 size = Oyster::Math::Float3(0.25f,2.0f,0.5f); + Oyster::Math::Float mass = 60; + Oyster::Math::Float restitutionCoeff = 0.5f; + Oyster::Math::Float frictionCoeff_Static = 0.4f; + Oyster::Math::Float frictionCoeff_Dynamic = 0.3f; + //sbDesc.quaternion = Oyster::Math::Float3(0, Oyster::Math::pi, 0); + + //create rigid body + Oyster::Physics::ICustomBody* rigidBody = Oyster::Physics::API::Instance().AddCollisionBox(size, Oyster::Math::Float4(0, 0, 0, 1), centerPosition, mass, 0.5f, 0.8f, 0.6f ); + rigidBody->SetAngularFactor(0.0f); + //create player with this rigid body + this->player = new Player(rigidBody, Player::PlayerCollision, ObjectSpecialType_Player,playerID,teamID); } Game::PlayerData::~PlayerData() { diff --git a/Code/Misc/Utilities/Utilities.h b/Code/Misc/Utilities/Utilities.h index b97d62d7..c259a845 100644 --- a/Code/Misc/Utilities/Utilities.h +++ b/Code/Misc/Utilities/Utilities.h @@ -337,11 +337,7 @@ namespace Utility template inline ValueType Clamp( const ValueType &value, const ValueType &min, const ValueType &max ) - { - if( value < min ) return min; - if( value > max ) return max; - return value; - } + { return value < min ? Max( value, max ) : min; } template inline ValueType Average( const ValueType &valueA, const ValueType &valueB ) From 0e23bcfc8271ce57f08b70aca7790971c8307323 Mon Sep 17 00:00:00 2001 From: dean11 Date: Wed, 19 Feb 2014 10:36:45 +0100 Subject: [PATCH 37/46] GameLogic - Modified some names and cleand up some junk --- Code/Game/GameLogic/CollisionManager.cpp | 4 +- Code/Game/GameLogic/Level.cpp | 36 +++++++++--------- Code/Game/GameLogic/Object.cpp | 47 ++---------------------- Code/Game/GameLogic/Object.h | 46 ++++++++++------------- 4 files changed, 43 insertions(+), 90 deletions(-) diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 0b817975..b740199c 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -46,7 +46,7 @@ using namespace GameLogic; break; case ObjectSpecialType::ObjectSpecialType_CrystalFormation: - PlayerVLethalObject(*player,*realObj, kineticEnergyLoss,realObj->getExtraDamageOnCollision()); + PlayerVLethalObject(*player,*realObj, kineticEnergyLoss,realObj->GetExtraDamageOnCollision()); //player->playerState = PLAYER_STATE::PLAYER_STATE_WALKING; break; } @@ -181,7 +181,7 @@ using namespace GameLogic; } } - Oyster::Physics::ICustomBody::SubscriptMessage Object::DefaultCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss) + Oyster::Physics::ICustomBody::SubscriptMessage Object::DefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss) { return Physics::ICustomBody::SubscriptMessage_none; } diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 030f0eca..10fb213f 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -26,14 +26,14 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) { case ObjectSpecialType_None: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_Sky: { float skySize = ((SkyAttributes*)obj)->skySize; - //gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + //gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_World: @@ -44,21 +44,21 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) float worldSize = ((WorldAttributes*)obj)->worldSize; float atmosphereSize = ((WorldAttributes*)obj)->atmoSphereSize; - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_Building: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } case ObjectSpecialType_Stone: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_StandardBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_RedExplosiveBox: @@ -75,24 +75,24 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) // break; case ObjectSpecialType_SpikeBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_Spike: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_CrystalFormation: { int dmg = 50; //gameObj = new Crystal(rigidBody); - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_CrystalShard: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; case ObjectSpecialType_JumpPad: @@ -122,12 +122,12 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_Generic: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; default: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID++); } break; } @@ -355,14 +355,14 @@ void Level::InitiateLevel(float radius) { rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(0, 605 + i*5, 10), 5, 0.5f, 0.8f, 0.6f); - this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox, Object::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++)); + this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox, Object::DefaultOnCollision, ObjectSpecialType_StandardBox, idCount++)); } /*offset += nrOfBoxex; for(int i =0; i< nrOfBoxex; i ++) { rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(0,5, -605 -( i*5)), 5); - this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); + this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultOnCollision, OBJECT_TYPE::OBJECT_TYPE_BOX)); rigidBody_TestBox->SetCustomTag(this->dynamicObjects[i+offset]); } @@ -371,7 +371,7 @@ void Level::InitiateLevel(float radius) { rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(200, 620 + ( i*7), 0), 5); - this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); + this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultOnCollision, OBJECT_TYPE::OBJECT_TYPE_BOX)); rigidBody_TestBox->SetCustomTag(this->dynamicObjects[i+offset]); } offset += nrOfBoxex; @@ -379,18 +379,18 @@ void Level::InitiateLevel(float radius) { rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(5, 605 + i*5, 0), 5); - this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); + this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultOnCollision, OBJECT_TYPE::OBJECT_TYPE_BOX)); rigidBody_TestBox->SetCustomTag(this->dynamicObjects[i]); }*/ // add crystal ICustomBody* rigidBody_Crystal = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(10, 605, 0), 5, 0.5f, 0.8f, 0.6f); - this->dynamicObjects.Push(new DynamicObject(rigidBody_Crystal, Object::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++)); + this->dynamicObjects.Push(new DynamicObject(rigidBody_Crystal, Object::DefaultOnCollision, ObjectSpecialType_StandardBox, idCount++)); // add house ICustomBody* rigidBody_House =API::Instance().AddCollisionBox(Oyster::Math::Float3(20, 20, 20), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(-50, 590, 0), 0, 0.5f, 0.8f, 0.6f); - this->staticObjects.Push(new StaticObject(rigidBody_House, Object::DefaultCollisionAfter, ObjectSpecialType_Generic, idCount++)); + this->staticObjects.Push(new StaticObject(rigidBody_House, Object::DefaultOnCollision, ObjectSpecialType_Generic, idCount++)); // add jumppad diff --git a/Code/Game/GameLogic/Object.cpp b/Code/Game/GameLogic/Object.cpp index 751dc454..1f43263b 100644 --- a/Code/Game/GameLogic/Object.cpp +++ b/Code/Game/GameLogic/Object.cpp @@ -15,11 +15,11 @@ const Game *Object::gameInstance = (Game*)(&Game::Instance()); Object::Object() { - this->rigidBody = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.0f, 0.0f, 0.0f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(0, 0, 0), 0, 0.5f, 0.8f, 0.6f); this->type = ObjectSpecialType_Unknown; this->objectID = -1; + this->scale = Float3(1.0f, 1.0f, 1.0f); } Object::Object(Oyster::Physics::ICustomBody *rigidBody, void (*collisionFuncAfter)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) @@ -48,39 +48,12 @@ Object::~Object(void) } -ObjectSpecialType Object::GetObjectType() const + +void Object::SetOnCollision(OnCollisionCallback func) { - return this->type; -} -int Object::GetID() const -{ - return this->objectID; + this->rigidBody->SetSubscription((Oyster::Physics::ICustomBody::EventAction_AfterCollisionResponse)(func)); } -Oyster::Physics::ICustomBody* Object::GetRigidBody() -{ - return this->rigidBody; -} - - -void Object::BeginFrame() -{ - -} -// update physic -void Object::EndFrame() -{ - -} - -void Object::setBeforeCollisonFunc(Oyster::Physics::ICustomBody::SubscriptMessage (*collisionFuncBefore)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter)) -{ - //this->rigidBody->SetSubscription((Oyster::Physics::ICustomBody::EventAction_BeforeCollisionResponse)(collisionFuncBefore)); -} -void Object::setAfterCollisonFunc(Oyster::Physics::ICustomBody::SubscriptMessage (*collisionFuncAfter)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss)) -{ - this->rigidBody->SetSubscription((Oyster::Physics::ICustomBody::EventAction_AfterCollisionResponse)(collisionFuncAfter)); -} Oyster::Math::Float3 Object::GetPosition() { @@ -94,21 +67,9 @@ Oyster::Math::Quaternion Object::GetRotation() state = this->rigidBody->GetState(); return state.quaternion; } -Oyster::Math::Float3 Object::GetScale() -{ - Oyster::Physics::ICustomBody::State state; - state = this->rigidBody->GetState(); - return Float3(); -} Oyster::Math::Float4x4 Object::GetOrientation() { Oyster::Physics::ICustomBody::State state; state = this->rigidBody->GetState(); return state.GetOrientation(); } - - -Oyster::Math::Float Object::getExtraDamageOnCollision() -{ - return this->extraDamageOnCollision; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/Object.h b/Code/Game/GameLogic/Object.h index 73853bd8..075236fe 100644 --- a/Code/Game/GameLogic/Object.h +++ b/Code/Game/GameLogic/Object.h @@ -16,47 +16,39 @@ namespace GameLogic class Object :public IObjectData { + public: + typedef Oyster::Physics::ICustomBody::SubscriptMessage (*OnCollisionCallback)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss); + public: Object(); - Object(Oyster::Physics::ICustomBody *rigidBody, void (*collisionFuncAfter)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID); Object(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustomBody::SubscriptMessage (*collisionFuncAfter)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID); ~Object(void); - ObjectSpecialType GetObjectType() const override; - int GetID() const override; - void setID(int id); - Oyster::Math::Float3 GetPosition() override; - Oyster::Math::Quaternion GetRotation() override; - Oyster::Math::Float3 GetScale() override; - Oyster::Math::Float4x4 GetOrientation() override; + inline ObjectSpecialType GetObjectType() const override { return this->type; } + inline int GetID() const override { return this->objectID; } + inline Oyster::Math::Float3 GetScale() override { return this->scale; } + inline Oyster::Math::Float3 GetPosition() override; + inline Oyster::Math::Quaternion GetRotation() override; + inline Oyster::Math::Float4x4 GetOrientation() override; + inline Oyster::Physics::ICustomBody* GetRigidBody() { return this->rigidBody; } + inline Oyster::Math::Float GetExtraDamageOnCollision() { return this->extraDamageOnCollision; } - Oyster::Math::Float getExtraDamageOnCollision(); + virtual void BeginFrame() { }; + virtual void EndFrame() { }; - // API overrides - - - - Oyster::Physics::ICustomBody* GetRigidBody(); - - virtual void BeginFrame(); - virtual void EndFrame(); - - void setBeforeCollisonFunc(Oyster::Physics::ICustomBody::SubscriptMessage (*collisionFuncBefore)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter)); - void setAfterCollisonFunc(Oyster::Physics::ICustomBody::SubscriptMessage (*collisionFuncAfter)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss)); - - static Oyster::Physics::ICustomBody::SubscriptMessage DefaultCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); - - - public: //TODO: Hax This should be private when level is dynamic + void SetOnCollision(OnCollisionCallback func); + static Oyster::Physics::ICustomBody::SubscriptMessage DefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); protected: Oyster::Physics::ICustomBody *rigidBody; static const Game* gameInstance; - Oyster::Math::Float3 currLook; - Oyster::Math::Float3 newLook; + + Oyster::Math::Float3 lookDirection; //The look direction for the camera + Oyster::Math::Float3 forwardDirection; //The forward direction of the rigid body + Oyster::Math::Float3 scale; //The scale of both rigid body and the mesh ObjectSpecialType type; int objectID; From fa95e6b8213d1aff707f02fa7fe18fbe3a551396 Mon Sep 17 00:00:00 2001 From: Robin Engman Date: Wed, 19 Feb 2014 10:55:59 +0100 Subject: [PATCH 38/46] Linda fixing some lvl loading stuff --- Code/Game/GameClient/GameClientRecieverFunc.h | 192 ------------------ .../GameClient/GameClientState/GameState.cpp | 12 +- .../GameClientState/LanMenuState.cpp | 4 +- .../GameClientState/NetLoadState.cpp | 10 +- Code/Game/GameLogic/Game_PlayerData.cpp | 2 +- Code/Game/GameLogic/Level.cpp | 39 ++-- 6 files changed, 37 insertions(+), 222 deletions(-) delete mode 100644 Code/Game/GameClient/GameClientRecieverFunc.h diff --git a/Code/Game/GameClient/GameClientRecieverFunc.h b/Code/Game/GameClient/GameClientRecieverFunc.h deleted file mode 100644 index 673cbdd1..00000000 --- a/Code/Game/GameClient/GameClientRecieverFunc.h +++ /dev/null @@ -1,192 +0,0 @@ -#ifndef DANBIAS_CLIENTRECIEVEROBJECT_H -#define DANBIAS_CLIENTRECIEVEROBJECT_H - -//WTF!? No headers included??? -#include "../DanBiasGame/Include/DanBiasGame.h" -#include "../GameProtocols/GeneralProtocols.h" -#include "../GameProtocols/Protocols.h" -#include "../Network/NetworkAPI/NetworkClient.h" -#include "GameClientState\GameClientState.h" -#include "GameClientState\GameState.h" - -#include - -namespace DanBias -{ - struct GameRecieverObject : public Oyster::Network::NetworkClient - { - Client::GameClientState* gameClientState; - - // receiver function for server messages - // parsing protocols and sending it to the gameState - //void NetworkCallback(Oyster::Network::CustomNetProtocol& p) override - void GameRecieverObject::DataRecieved( Oyster::Network::NetEvent e ) override - { - Oyster::Network::CustomNetProtocol p = e.args.data.protocol; - int pType = p[0].value.netInt; - - //printf("Message(%i) arrived at client(%i)\n", pType, this->GetID()); - - - switch (pType) - { - case protocol_General_Status: - { - GameLogic::Protocol_General_Status::States state; - state = (GameLogic::Protocol_General_Status::States)p[1].value.netShort; - if( state == GameLogic::Protocol_General_Status::States_disconected) - { - // server disconnected - DanBiasGame::Release(); - } - } - break; - case protocol_Gameplay_ObjectCreate: - { - Client::GameClientState::NewObj protocolData;// = new Client::GameClientState::NewObj; - protocolData.object_ID = p[1].value.netInt; - protocolData.path = p[2].value.netCharPtr; - for(int i = 0; i< 16; i++) - { - protocolData.worldPos[i] = p[i+3].value.netFloat; - } - - if(dynamic_cast(gameClientState)) - ((Client::GameState*)gameClientState)->Protocol(&protocolData); - - //delete p[2].value.netCharPtr; //delete char array - //delete protocolData; - //protocolData = NULL; - } - break; - case protocol_Gameplay_ObjectDisabled: - { - Client::GameClientState::RemoveObj* protocolData = new Client::GameClientState::RemoveObj; - protocolData->object_ID = p[1].value.netInt; - - if(dynamic_cast(gameClientState)) - ((Client::GameState*)gameClientState)->Protocol(protocolData); - - delete protocolData; - protocolData = NULL; - } - break; - case protocol_Gameplay_ObjectPosition: - { - // 0: reserved - // 1: objectID - // 2,3,4: position - // 5,6,7,8: rotation quaternion - - GameLogic::Protocol_ObjectPosition data(p); - - Client::GameClientState::ObjPos protocolData; - protocolData.object_ID = data.object_ID; - //protocolData.object_ID = p[1].value.netInt; - - for( int i = 0; i < 3; ++i ) - { - protocolData.position[i] = data.position[i]; - } - - //for(int i = 0; i< 16; i++) - //{ - // protocolData.worldPos[i] = p[i+2].value.netFloat; - //} - - if(dynamic_cast(gameClientState)) - ((Client::GameState*)gameClientState)->Protocol(&protocolData); - } - break; - case protocol_Gameplay_ObjectPositionRotation: - { - - Client::GameClientState::ObjPos protocolData; - protocolData.object_ID = p[1].value.netInt; - for(int i = 0; i< 16; i++) - { - protocolData.worldPos[i] = p[i+2].value.netFloat; - } - - if(dynamic_cast(gameClientState)) - ((Client::GameState*)gameClientState)->Protocol(&protocolData); - } - break; - case protocol_Lobby_Create: - { - if(dynamic_cast(gameClientState)) - { - int id = p.Get(1).value.netInt; - std::string name = p.Get(19).value.netCharPtr; - Oyster::Math::Float4x4 w; - for(int i = 0; i< 16; i++) - { - w[i] = p[i+2].value.netFloat; - } - - gameClientState->Release(); - delete gameClientState; - - gameClientState = new Client::GameState(); - gameClientState->Init(this); - std::wstring temp; - Utility::String::StringToWstring(name, temp); - ((Client::GameState*)gameClientState)->InitiatePlayer(id, temp, w); - - //Do some wait state? - } - } - break; - case protocol_Lobby_Start: - { - if(dynamic_cast(gameClientState)) - { - //Game state should start in n seconds - GameLogic::Protocol_LobbyStartGame p(p); - p.seconds; - - //Sleep((int)(p.seconds * 1000)); - } - } - break; - - default: - break; - } - - if(ProtocolIsLobby(p[0].value.netInt)) ParseLobbyProtocol(p); - } - - void ParseLobbyProtocol(Oyster::Network::CustomNetProtocol& p) - { - switch (p[0].value.netShort) - { - case protocol_General_Status: //this->GeneralStatus (Protocol_General_Status (p), c); - break; - case protocol_General_Text: //this->GeneralText (Protocol_General_Text (p), c); - break; - //case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c); - //break; - case protocol_Lobby_Start: //this->LobbyStartGame (Protocol_LobbyStartGame (p), c); - break; - //case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c); - //break; - case protocol_Lobby_Login: //this->LobbyLogin (Protocol_LobbyLogin (p), c); - break; - case protocol_Lobby_Refresh: //this->LobbyRefresh (Protocol_LobbyRefresh (p), c); - break; - case protocol_Lobby_GameData: //this->LobbyGameData (Protocol_LobbyGameData (p), c); - { - //GameLogic::Protocol_LobbyGameData temp(p); - //printf("%s, %i.%i\n", temp.mapName.c_str(), temp.majorVersion, temp.minorVersion); - } - break; - case protocol_Lobby_ClientData: //this->LobbyMainData (Protocol_LobbyClientData (p), c); - break; - //case protocol_Lobby_GameData: this->LobbyGameData (Protocol_LobbyGameData (p), c); - //break; - } - } - }; -} -#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index bfd15532..7c23a910 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -187,7 +187,7 @@ void GameState::ReadKeyInput() { if( this->privData->input->IsKeyPressed(DIK_W) ) { - if(!this->privData->key_forward) + //if(!this->privData->key_forward) { this->privData->nwClient->Send( Protocol_PlayerMovementForward() ); this->privData->key_forward = true; @@ -198,7 +198,7 @@ void GameState::ReadKeyInput() if( this->privData->input->IsKeyPressed(DIK_S) ) { - if( !this->privData->key_backward ) + //if( !this->privData->key_backward ) { this->privData->nwClient->Send( Protocol_PlayerMovementBackward() ); this->privData->key_backward = true; @@ -209,7 +209,7 @@ void GameState::ReadKeyInput() if( this->privData->input->IsKeyPressed(DIK_A) ) { - if( !this->privData->key_strafeLeft ) + //if( !this->privData->key_strafeLeft ) { this->privData->nwClient->Send( Protocol_PlayerMovementLeft() ); this->privData->key_strafeLeft = true; @@ -220,7 +220,7 @@ void GameState::ReadKeyInput() if( this->privData->input->IsKeyPressed(DIK_D) ) { - if( !this->privData->key_strafeRight ) + //if( !this->privData->key_strafeRight ) { this->privData->nwClient->Send( Protocol_PlayerMovementRight() ); this->privData->key_strafeRight = true; @@ -372,7 +372,9 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState if( this->privData->myId == decoded.object_ID ) { this->privData->camera.SetPosition( position ); - this->privData->camera.SetRotation( rotation ); + //this->privData->camera.SetRotation( rotation ); + this->privData->player.setPos( position ); + //this->privData->player.setRot( rotation ); } C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 11ca95da..8c096617 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -60,8 +60,8 @@ bool LanMenuState::Init( SharedStateContent &shared ) // create guiElements this->privData->connectIP = new TextField( L"color_white.png", Float4(1.0f), Float4(0.0f), this, Float3(0.5f, 0.3f, 0.5f), Float2(0.8f, 0.09f), ResizeAspectRatio_None ); this->privData->connectIP->ReserveLines( 1 ); - //this->privData->connectIP->AppendText( L"127.0.0.1" ); - this->privData->connectIP->AppendText( L"194.47.150.206" ); // HACK: connecting to Dennis's server + this->privData->connectIP->AppendText( L"127.0.0.1" ); + //this->privData->connectIP->AppendText( L"194.47.150.206" ); // HACK: connecting to Dennis's server this->privData->connectIP->SetFontHeight( 0.08f ); this->privData->connectIP->SetLineSpacing( 0.005f ); this->privData->connectIP->SetTopAligned(); diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 29906d77..fac7b00c 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -140,7 +140,15 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) desc.rotation = ArrayToQuaternion( oh->rotation ); desc.scale = oh->scale; desc.visible = true; - + + // HACK: untill the world is right in lvl format + if( oh->specialTypeID == ObjectSpecialType_World) + { + desc.position = Float3(0,0,0); + desc.rotation = Quaternion::identity; + desc.scale = Float3(300,300,300); + } + C_StaticObj *staticObject = new C_StaticObj(); if( staticObject->Init( desc ) ) { diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index e7a77bbd..f403c04c 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -7,7 +7,7 @@ Game::PlayerData::PlayerData() { //set some stats that are appropriate to a player - Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(50,130,0); + Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(-50,180,0); Oyster::Math::Float3 size = Oyster::Math::Float3(0.25f,2.0f,0.5f); Oyster::Math::Float mass = 60; diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 4106dabf..a5d42657 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -26,14 +26,14 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) { case ObjectSpecialType_None: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_Sky: { float skySize = ((SkyAttributes*)obj)->skySize; - //gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + //gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_World: @@ -44,21 +44,21 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) float worldSize = ((WorldAttributes*)obj)->worldSize; float atmosphereSize = ((WorldAttributes*)obj)->atmoSphereSize; - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_Building: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } case ObjectSpecialType_Stone: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_StandardBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_RedExplosiveBox: @@ -75,24 +75,24 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) // break; case ObjectSpecialType_SpikeBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_Spike: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_CrystalFormation: { int dmg = 50; //gameObj = new Crystal(rigidBody); - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_CrystalShard: { - gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new DynamicObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_JumpPad: @@ -100,13 +100,13 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) float power = 500; //((JumpPadAttributes*)obj)->power; Oyster::Math::Float3 dir = ((JumpPadAttributes*)obj)->direction; Oyster::Math::Float3 pushForce = dir * power; - gameObj = new JumpPad(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++ , pushForce); + gameObj = new JumpPad(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID , pushForce); } break; case ObjectSpecialType_Portal: { Oyster::Math::Float3 destination = ((PortalAttributes*)obj)->destination; - gameObj = new Portal(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, destination); + gameObj = new Portal(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID, destination); } break; //case ObjectSpecialType_SpawnPoint: @@ -122,12 +122,12 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_Generic: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; default: { - gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++); + gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID); } break; } @@ -213,6 +213,7 @@ bool Level::InitiateLevel(std::wstring levelPath) for (int i = 0; i < objCount; i++) { + ++this->objID; ObjectTypeHeader* obj = objects.at(i); switch (obj->typeID) { @@ -229,13 +230,10 @@ bool Level::InitiateLevel(std::wstring levelPath) staticObjData->ModelFile; ICustomBody* rigidBody_Static = NULL; - if((ObjectSpecialType)staticObjData->specialTypeID == ObjectSpecialType_Sky) - { - - } + + // HACK: untill the world is right in lvl format if((ObjectSpecialType)staticObjData->specialTypeID == ObjectSpecialType_World) { - Oyster::Math::Float3 rigidWorldPos; Oyster::Math::Float4 rigidWorldRotation; float rigidBodyMass; @@ -249,9 +247,8 @@ bool Level::InitiateLevel(std::wstring levelPath) rigidWorldRotation = Oyster::Math::Float4(0,0,0,1); - //mass scaled - rigidBodyMass = 100; + rigidBodyMass = 0; //Radius scaled rigidBodyRadius = 150; From 7f8c10292efd509b56e42f602d5b8957a566f939 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Wed, 19 Feb 2014 11:00:16 +0100 Subject: [PATCH 39/46] Moved LevelLoader to a seperate lib project. --- Code/DanBias.sln | 37 +++ Code/Game/GameClient/GameClient.vcxproj | 20 +- .../GameClientState/LanMenuState.cpp | 3 + .../GameClientState/NetLoadState.cpp | 2 +- Code/Game/GameLogic/GameAPI.h | 2 +- Code/Game/GameLogic/GameLogic.vcxproj | 20 +- Code/Game/GameLogic/Level.h | 2 +- .../GameLogic/LevelLoader/LevelLoader.cpp | 52 --- Code/Game/GameLogic/LevelLoader/LevelLoader.h | 56 ---- .../GameLogic/LevelLoader/LevelParser.cpp | 314 ------------------ Code/Game/GameLogic/LevelLoader/LevelParser.h | 31 -- Code/Game/GameLogic/LevelLoader/Loader.cpp | 22 -- Code/Game/GameLogic/LevelLoader/Loader.h | 28 -- .../GameLogic/LevelLoader/ObjectDefines.h | 274 --------------- .../GameLogic/LevelLoader/ParseFunctions.cpp | 183 ---------- .../GameLogic/LevelLoader/ParseFunctions.h | 28 -- .../LevelLoader/LevelLoader.cpp | 0 .../LevelLoader/LevelLoader.h | 0 Code/Game/LevelLoader/LevelLoader.vcxproj | 165 +++++++++ .../Game/LevelLoader/LevelLoader.vcxproj.user | 22 ++ .../LevelLoader/LevelParser.cpp | 2 +- .../LevelLoader/LevelParser.h | 0 .../LevelLoader/Loader.cpp | 0 .../GameClientState => }/LevelLoader/Loader.h | 0 .../LevelLoader/ObjectDefines.h | 3 +- .../LevelLoader/ParseFunctions.cpp | 2 +- .../LevelLoader/ParseFunctions.h | 0 Code/Network/NetworkAPI/NetworkClient.cpp | 18 +- 28 files changed, 265 insertions(+), 1021 deletions(-) delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelLoader.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelLoader.h delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelParser.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelParser.h delete mode 100644 Code/Game/GameLogic/LevelLoader/Loader.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/Loader.h delete mode 100644 Code/Game/GameLogic/LevelLoader/ObjectDefines.h delete mode 100644 Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/ParseFunctions.h rename Code/Game/{GameClient/GameClientState => }/LevelLoader/LevelLoader.cpp (100%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/LevelLoader.h (100%) create mode 100644 Code/Game/LevelLoader/LevelLoader.vcxproj create mode 100644 Code/Game/LevelLoader/LevelLoader.vcxproj.user rename Code/Game/{GameClient/GameClientState => }/LevelLoader/LevelParser.cpp (99%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/LevelParser.h (100%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/Loader.cpp (100%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/Loader.h (100%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/ObjectDefines.h (98%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/ParseFunctions.cpp (99%) rename Code/Game/{GameClient/GameClientState => }/LevelLoader/ParseFunctions.h (100%) diff --git a/Code/DanBias.sln b/Code/DanBias.sln index 80a76dea..e14d2c37 100644 --- a/Code/DanBias.sln +++ b/Code/DanBias.sln @@ -45,6 +45,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameClient", "Game\GameClie EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Utilities", "Misc\Utilities\Utilities.vcxproj", "{2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LevelLoader", "Game\LevelLoader\LevelLoader.vcxproj", "{6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -679,6 +681,40 @@ Global {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.RelWithDebInfo|x64.Build.0 = Release|x64 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.RelWithDebInfo|x86.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|Win32.ActiveCfg = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|Win32.Build.0 = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|x64.ActiveCfg = Debug|x64 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|x64.Build.0 = Debug|x64 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|x86.ActiveCfg = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Debug|x86.Build.0 = Debug|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|Any CPU.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|Mixed Platforms.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|Mixed Platforms.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|Win32.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|Win32.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|x64.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|x86.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.MinSizeRel|x86.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|Any CPU.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|Mixed Platforms.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|Win32.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|Win32.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|x64.ActiveCfg = Release|x64 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|x64.Build.0 = Release|x64 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|x86.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.Release|x86.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|Mixed Platforms.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|Mixed Platforms.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|Win32.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|Win32.Build.0 = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|x64.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63}.RelWithDebInfo|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -692,6 +728,7 @@ Global {C83A6FAD-E71F-4B1E-9D63-E93E61DDC012} = {20720CA7-795C-45AD-A302-9383A6DD503A} {8690FDDF-C5B7-4C42-A337-BD5243F29B85} = {20720CA7-795C-45AD-A302-9383A6DD503A} {2A1BC987-AF42-4500-802D-89CD32FC1309} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63} = {20720CA7-795C-45AD-A302-9383A6DD503A} {C4C76A8D-44C5-4452-9F61-39C7E01CBDB4} = {F156EEBC-0195-4020-8700-4433208DE12B} {3EA5F14D-2A71-4588-A69D-87C4571C580F} = {F156EEBC-0195-4020-8700-4433208DE12B} {7E3990D2-3D94-465C-B58D-64A74B3ECF9B} = {1322B12B-5E37-448A-AAAF-F637460DCB23} diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index 349a88ec..05c87021 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -106,7 +106,7 @@ Disabled DANBIAS_GAME_DLL_EXPORT;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;$(SolutionDir)Game\LevelLoader Windows @@ -123,7 +123,7 @@ Disabled DANBIAS_GAME_DLL_EXPORT;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;$(SolutionDir)Game\LevelLoader Windows @@ -142,7 +142,7 @@ true DANBIAS_GAME_DLL_EXPORT;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;$(SolutionDir)Game\LevelLoader Windows @@ -163,7 +163,7 @@ true DANBIAS_GAME_DLL_EXPORT;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\OysterMath;$(SolutionDir)Misc\Input;$(SolutionDir)OysterGraphics;$(SolutionDir)Misc\Utilities;$(SolutionDir)Game\LevelLoader Windows @@ -196,6 +196,9 @@ {143bd516-20a1-4890-a3e4-f8bfd02220e7} + + {6391e709-d9fa-4fef-a3b9-4343db5a0c63} + @@ -212,10 +215,6 @@ - - - - @@ -238,11 +237,6 @@ - - - - - diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 11ca95da..38a3446e 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -126,6 +126,9 @@ void LanMenuState::ChangeState( ClientState next ) // attempt to connect to lobby if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) return; + //this->privData->nwClient->Disconnect(); + //if( !this->privData->nwClient->Reconnect() ) + //return; break; default: break; } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 29906d77..44a14359 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -2,7 +2,7 @@ #include "NetworkClient.h" #include "OysterMath.h" #include "Protocols.h" -#include "LevelLoader\LevelLoader.h" +#include "LevelLoader.h" #include "Utilities.h" #include "C_obj\C_StaticObj.h" #include "C_obj\C_DynamicObj.h" diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 3325115f..1cc35444 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -12,7 +12,7 @@ #include "GameLogicDef.h" #include "GameLogicStates.h" #include -#include "LevelLoader\ObjectDefines.h" +#include "..\LevelLoader\ObjectDefines.h" #include "DynamicArray.h" diff --git a/Code/Game/GameLogic/GameLogic.vcxproj b/Code/Game/GameLogic/GameLogic.vcxproj index ad129c3b..52b7722b 100644 --- a/Code/Game/GameLogic/GameLogic.vcxproj +++ b/Code/Game/GameLogic/GameLogic.vcxproj @@ -99,7 +99,7 @@ Level3 Disabled true - $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;$(SolutionDir)Game\LevelLoader DANBIAS_GAMELOGIC_DLL_EXPORT;_WINDLL;%(PreprocessorDefinitions) @@ -113,7 +113,7 @@ Level3 Disabled true - $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;$(SolutionDir)Game\LevelLoader DANBIAS_GAMELOGIC_DLL_EXPORT;_WINDLL;%(PreprocessorDefinitions) @@ -129,7 +129,7 @@ true true true - $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;$(SolutionDir)Game\LevelLoader DANBIAS_GAMELOGIC_DLL_EXPORT;_WINDLL;%(PreprocessorDefinitions) @@ -147,7 +147,7 @@ true true true - $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;%(AdditionalIncludeDirectories) + $(SolutionDir)Misc\Utilities;$(SolutionDir)Misc\OysterMath;$(SolutionDir)Physics\OysterPhysics3D;$(SolutionDir)Physics\GamePhysics;$(SolutionDir)Game\LevelLoader DANBIAS_GAMELOGIC_DLL_EXPORT;_WINDLL;%(PreprocessorDefinitions) @@ -172,12 +172,7 @@ - - - - - @@ -198,11 +193,7 @@ - - - - @@ -223,6 +214,9 @@ {3ea5f14d-2a71-4588-a69d-87c4571c580f} + + {6391e709-d9fa-4fef-a3b9-4343db5a0c63} + diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 623d04b2..6149b2fb 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -14,7 +14,7 @@ #include "PhysicsAPI.h" #include "TeamManager.h" #include "DynamicArray.h" -#include "LevelLoader/LevelLoader.h" +#include "LevelLoader.h" namespace GameLogic { diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp b/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp deleted file mode 100644 index 8fe880f3..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp +++ /dev/null @@ -1,52 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "LevelLoader.h" -#include "LevelParser.h" - -using namespace GameLogic; -using namespace GameLogic::LevelFileLoader; - -struct LevelLoader::PrivData -{ - LevelParser parser; - std::string folderPath; -}; - -LevelLoader::LevelLoader() - : pData(new PrivData) -{ - //standard path - pData->folderPath = ""; -} - -LevelLoader::LevelLoader(std::string folderPath) - : pData(new PrivData) -{ - pData->folderPath = folderPath; -} - -LevelLoader::~LevelLoader() -{ -} - -std::vector> LevelLoader::LoadLevel(std::string fileName) -{ - return pData->parser.Parse(pData->folderPath + fileName); -} - -LevelMetaData LevelLoader::LoadLevelHeader(std::string fileName) -{ - return pData->parser.ParseHeader(pData->folderPath + fileName); -} - -std::string LevelLoader::GetFolderPath() -{ - return this->pData->folderPath; -} - -void LevelLoader::SetFolderPath(std::string folderPath) -{ - -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.h b/Code/Game/GameLogic/LevelLoader/LevelLoader.h deleted file mode 100644 index aa67c4f5..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.h +++ /dev/null @@ -1,56 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#ifndef LEVELLOADER_H -#define LEVELLOADER_H - -#include -#include -#include "Utilities.h" -#include "ObjectDefines.h" - -namespace GameLogic -{ - class LevelLoader - { - - public: - LevelLoader(); - /*********************************************************** - * Lets you set the standard folderpath for the levels - ********************************************************/ - LevelLoader(std::string folderPath); - ~LevelLoader(); - - /******************************************************** - * Loads the level and objects from file. - * @param fileName: Path/name to the level-file that you want to load. - * @return: Returns all structs with objects and information about the level. - ********************************************************/ - std::vector> LoadLevel(std::string fileName); - - /******************************************************** - * Just for fast access for the meta information about the level. - * @param fileName: Path to the level-file that you want to load. - * @return: Returns the meta information about the level. - ********************************************************/ - LevelMetaData LoadLevelHeader(std::string fileName); //. - - /*********************************************************** - * @return: Returns the current standard folder path - ********************************************************/ - std::string GetFolderPath(); - - /*********************************************************** - * Sets the standard folder path - ********************************************************/ - void SetFolderPath(std::string folderPath); - - private: - struct PrivData; - Utility::DynamicMemory::SmartPointer pData; - }; -} - -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp b/Code/Game/GameLogic/LevelLoader/LevelParser.cpp deleted file mode 100644 index 1e33361d..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp +++ /dev/null @@ -1,314 +0,0 @@ -///////////////////////////////////// -// Created by Pontus Fransson 2013 // -///////////////////////////////////// - -#include "LevelParser.h" -#include "Loader.h" -#include "ParseFunctions.h" - -using namespace GameLogic; -using namespace ::LevelFileLoader; -using namespace Utility::DynamicMemory; - -LevelParser::LevelParser() -{ - formatVersion.formatVersionMajor = 3; - formatVersion.formatVersionMinor = 0; -} - -LevelParser::~LevelParser() -{ -} - -std::vector> LevelParser::Parse(std::string filename) -{ - int bufferSize = 0; - int counter = 0; - bool loadCgf; - - std::vector> objects; - - //Read entire level file. - Loader loader; - char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) - { - //Returns an empty vector, because it will most likely fail to read the level format. - return objects; - } - - while(counter < bufferSize) - { - loadCgf = true; - //Get typeID - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - switch((int)typeID) - { - case ObjectType_LevelMetaData: - { - SmartPointer header = new LevelMetaData; - ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); - objects.push_back(header); - break; - } - - case ObjectType_SpawnPoint: - { - loadCgf = false; - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - SpawnPointAttributes* spawn = new SpawnPointAttributes; - - spawn->typeID = header->typeID; - - for(int i = 0; i < 3; i++) - { - spawn->position[i] = header->position[i]; - } - - delete header; - //objects.push_back(header); - objects.push_back(spawn); - break; - } - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - //Unless they are changed to not be the same. - case ObjectType_Static: case ObjectType_Dynamic: - { - //Get specialType. - ObjectSpecialType specialType; - ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); - - switch(specialType) - { - //there is no difference when parsing these specialTypes. - case ObjectSpecialType_CrystalShard: - case ObjectSpecialType_CrystalFormation: - case ObjectSpecialType_Spike: - case ObjectSpecialType_SpikeBox: - case ObjectSpecialType_RedExplosiveBox: - case ObjectSpecialType_StandardBox: - case ObjectSpecialType_Stone: - case ObjectSpecialType_Building: - { - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - objects.push_back(header); - - break; - } - - case ObjectSpecialType_JumpPad: - { - JumpPadAttributes* header = new JumpPadAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - //Read the spec - ParseObject(&buffer[counter], header->direction, 16); - counter += 16; - objects.push_back(header); - - break; - } - - case ObjectSpecialType_Portal: - { - PortalAttributes* header = new PortalAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], header->destination, 12); - counter += 12; - objects.push_back(header); - - break; - } - - case ObjectSpecialType_World: - { - WorldAttributes* header = new WorldAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], &header->worldSize, 8); - counter += 8; - objects.push_back(header); - break; - } - - case ObjectSpecialType_Sky: - { - loadCgf = false; - SkyAttributes* header = new SkyAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], &header->skySize, 4); - counter += 4; - objects.push_back(header); - break; - } - - default: - //Couldn't find specialType - break; - } - break; - } - - case ObjectType_Light: - { - LightType lightType; - - //Get Light type - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - - //We only support PointLight for now. - BasicLight* header = new BasicLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - /*switch(lightType) - { - case LightType_PointLight: - { - PointLight* header = new PointLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_DirectionalLight: - { - DirectionalLight* header = new DirectionalLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_SpotLight: - { - SpotLight* header = new SpotLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - default: - //Undefined LightType. - break; - } - break;*/ - } - default: - //Couldn't find typeID. FAIL!!!!!! - break; - } - } - - return objects; -} - -//för meta information om leveln. -LevelMetaData LevelParser::ParseHeader(std::string filename) -{ - int bufferSize = 0; - int counter = 0; - - LevelMetaData levelHeader; - levelHeader.typeID = ObjectType::ObjectType_Unknown; - - //Read entire level file. - Loader loader; - char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(formatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) - { - //Do something if it's not the same version - - //Returns an empty levelHeader with ObjectType_Unknown. - //Because it will not be able to read another version of the level format. - return levelHeader; - } - - //Find the header in the returned string. - while(counter < bufferSize) - { - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - - switch(typeID) - { - case ObjectType_LevelMetaData: - ParseLevelMetaData(&buffer[counter], levelHeader, counter); - return levelHeader; - break; - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - case ObjectType_Static: case ObjectType_Dynamic: - { - ObjectHeader header; - ParseObject(&buffer[counter], &header, counter); - - switch(header.specialTypeID) - { - case ObjectSpecialType_JumpPad: - counter += sizeof(16); - break; - case ObjectSpecialType_Portal: - counter += sizeof(12); - break; - default: - break; - } - break; - } - - case ObjectType_Light: - { - LightType lightType; - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - - //We only support pointlight for now. - counter += sizeof(BasicLight); - /* - switch(lightType) - { - case LightType_PointLight: - { - counter += sizeof(PointLight); - break; - } - case LightType_DirectionalLight: - { - counter += sizeof(DirectionalLight); - break; - } - case LightType_SpotLight: - { - counter += sizeof(SpotLight); - break; - } - default: - //Undefined LightType. - break; - }*/ - } - - default: - //Couldn't find typeID. FAIL!!!!!! - break; - } - } - - return levelHeader; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.h b/Code/Game/GameLogic/LevelLoader/LevelParser.h deleted file mode 100644 index 8f2a9150..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef LEVEL_PARSER_H -#define LEVEL_PARSER_H - -#include -#include -#include "ObjectDefines.h" -#include "Utilities.h" - -namespace GameLogic -{ - namespace LevelFileLoader - { - class LevelParser - { - public: - LevelParser(); - ~LevelParser(); - - // - std::vector> Parse(std::string filename); - - // - LevelMetaData ParseHeader(std::string filename); - - private: - LevelLoaderInternal::FormatVersion formatVersion; - - }; - } -} -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/Loader.cpp b/Code/Game/GameLogic/LevelLoader/Loader.cpp deleted file mode 100644 index 3e15315c..00000000 --- a/Code/Game/GameLogic/LevelLoader/Loader.cpp +++ /dev/null @@ -1,22 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "Loader.h" -#include - -using namespace GameLogic::LevelFileLoader; -using namespace Oyster::Resource; -using namespace std; - -char* Loader::LoadFile(std::string fileName, int &size) -{ - //convert from string to wstring - std::wstring temp(fileName.begin(), fileName.end()); - - //convert from wstring to wchar then loads the file - char* buffer = (char*)OysterResource::LoadResource(temp.c_str(), Oyster::Resource::ResourceType::ResourceType_Byte_Raw, -1 , false); - - size = OysterResource::GetResourceSize(buffer); - return buffer; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/Loader.h b/Code/Game/GameLogic/LevelLoader/Loader.h deleted file mode 100644 index 0433194e..00000000 --- a/Code/Game/GameLogic/LevelLoader/Loader.h +++ /dev/null @@ -1,28 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#ifndef LOADER_H -#define LOADER_H - -#include "Resource\OysterResource.h" -#include - -namespace GameLogic -{ - namespace LevelFileLoader - { - class Loader - { - public: - Loader (){}; - ~Loader(){}; - char* LoadFile(std::string fileName, int &size); - - //TODO: - //Add functionality to load physicsObjects (hitboxes) - }; - } -} - -#endif; \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h b/Code/Game/GameLogic/LevelLoader/ObjectDefines.h deleted file mode 100644 index 01d17c3e..00000000 --- a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h +++ /dev/null @@ -1,274 +0,0 @@ -#ifndef OBJECT_DEFINES_H -#define OBJECT_DEFINES_H - -#include -#include - -namespace GameLogic -{ - /************************************ - Enums - *************************************/ - - enum ObjectType - { - ObjectType_LevelMetaData, - ObjectType_Static, - ObjectType_Dynamic, - ObjectType_Light, - ObjectType_SpawnPoint, - //Etc - - ObjectType_NUM_OF_TYPES, - - ObjectType_Unknown = -1 - }; - - enum ObjectSpecialType - { - ObjectSpecialType_None, - ObjectSpecialType_Sky, - ObjectSpecialType_World, //Always the main celestial body - ObjectSpecialType_Building, - ObjectSpecialType_Stone, - ObjectSpecialType_StandardBox, - ObjectSpecialType_RedExplosiveBox, - ObjectSpecialType_SpikeBox, - ObjectSpecialType_Spike, - ObjectSpecialType_CrystalFormation, - ObjectSpecialType_CrystalShard, - ObjectSpecialType_JumpPad, - ObjectSpecialType_Portal, - ObjectSpecialType_Player, - ObjectSpecialType_Generic, - - - ObjectSpecialType_Count, - ObjectSpecialType_Unknown = -1 - }; - - enum CollisionGeometryType - { - CollisionGeometryType_Box, - CollisionGeometryType_Sphere, - CollisionGeometryType_Cylinder, - - CollisionGeometryType_Count, - CollisionGeometryType_Unknown = -1 - }; - - //Only supports Pointlight right now. - enum LightType - { - LightType_PointLight, - //LightType_DirectionalLight, - //LightType_SpotLight, - - LightType_Count, - LightType_Unknown = -1 - }; - - //Should this be moved somewhere else? - enum GameMode - { - GameMode_FreeForAll, - GameMode_TeamDeathMatch, - //Etc - - GameMode_Count, - GameMode_Unknown = -1 - }; - - enum WorldSize - { - WorldSize_Tiny, - WorldSize_Small, - WorldSize_Medium, - WorldSize_Big, - WorldSize_Humongous, - - WorldSize_Count, - WorldSize_Unknown = -1 - }; - - - /************************************ - Structs - *************************************/ - namespace LevelLoaderInternal - { - struct FormatVersion - { - unsigned int formatVersionMajor; - unsigned int formatVersionMinor; - - FormatVersion() - : formatVersionMajor(0), formatVersionMinor(0) - {} - - FormatVersion(unsigned int major, unsigned int minor) - : formatVersionMajor(major), formatVersionMinor(minor) - {} - - bool operator ==(const FormatVersion& obj) - { - return (this->formatVersionMajor == obj.formatVersionMajor && this->formatVersionMinor == obj.formatVersionMinor); - } - - bool operator !=(const FormatVersion& obj) - { - return !(*this == obj); - } - }; - } - - struct ObjectTypeHeader - { - ObjectType typeID; - - //Unless this is here the object destructor wont be called. - virtual ~ObjectTypeHeader(){} - }; - - namespace LevelLoaderInternal - { - const FormatVersion boundingVolumeVersion(2, 0); - - struct BoundingVolumeBase - { - CollisionGeometryType geoType; - float position[3]; - float rotation[4]; - float frictionCoeffStatic; - float frictionCoeffDynamic; - float restitutionCoeff; - float mass; - }; - - struct BoundingVolumeBox : public BoundingVolumeBase - { - float size[3]; - }; - - struct BoundingVolumeSphere : public BoundingVolumeBase - { - float radius; - }; - - struct BoundingVolumeCylinder : public BoundingVolumeBase - { - float length; - float radius; - }; - - struct BoundingVolume - { - CollisionGeometryType geoType; - union - { - LevelLoaderInternal::BoundingVolumeBox box; - LevelLoaderInternal::BoundingVolumeSphere sphere; - LevelLoaderInternal::BoundingVolumeCylinder cylinder; - }; - }; - - } - - struct LevelMetaData : public ObjectTypeHeader - { - std::string levelName; - unsigned int levelVersion; - std::string levelDescription; - std::string levelAuthor; - unsigned int maxNumberOfPlayer; - WorldSize worldSize; - std::string overviewPicturePath; - std::vector gameModesSupported; - - virtual ~LevelMetaData(){} - - }; - - struct ObjectHeader : public ObjectTypeHeader - { - //Special type id for special objects: portal, jumppad, exploding objects, etc. - ObjectSpecialType specialTypeID; - //Model, - std::string ModelFile; - //Position - float position[3]; - //Rotation Quaternion - float rotation[4]; - //Scale - float scale[3]; - - ::GameLogic::LevelLoaderInternal::BoundingVolume boundingVolume; - - virtual ~ObjectHeader(){} - }; - - struct SpawnPointAttributes : public ObjectTypeHeader - { - ObjectSpecialType specialTypeID; - float position[3]; - }; - /************************************ - Special objects - *************************************/ - - struct JumpPadAttributes : public ObjectHeader - { - float direction[3]; - float power; - }; - - struct PortalAttributes : public ObjectHeader - { - float destination[3]; - }; - - struct WorldAttributes : public ObjectHeader - { - float worldSize; - float atmoSphereSize; - }; - - struct SkyAttributes : public ObjectHeader - { - float skySize; - }; - - - - /************************************ - Lights - *************************************/ - - struct BasicLight : public ObjectTypeHeader - { - LightType lightType; //Is not used right now - float color[3]; - float position[3]; - float raduis; - float intensity; - }; - /* We only support pointlight right now. - struct PointLight : public BasicLight - { - float position[3]; - }; - - struct DirectionalLight : public BasicLight - { - float direction[3]; - }; - - struct SpotLight : public BasicLight - { - float direction[3]; - float range; - float attenuation[3]; - };*/ -} - -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp deleted file mode 100644 index 826a52be..00000000 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp +++ /dev/null @@ -1,183 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "ParseFunctions.h" -#include "Packing/Packing.h" -#include "Loader.h" -#include - -using namespace Oyster::Packing; -using namespace GameLogic::LevelFileLoader; -using namespace GameLogic; -using namespace std; - -namespace GameLogic -{ - namespace LevelFileLoader - { - //can parse any struct if the struct doesnt contain strings or char[] - void ParseObject(char* buffer, void *header, int size) - { - memcpy(header, buffer, size); - } - - void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf) - { - char tempName[128]; - unsigned int tempSize = 0; - int start = 0; - - memcpy(&header.typeID, &buffer[start], 4); - start += 4; - - memcpy(&header.specialTypeID, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.ModelFile.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - //The reset of the object struct - //3 float[3], 1 float - memcpy(&header.position, &buffer[start], 40); - start += 40; - - //if loadCgf : Read path for bounding volume - if(loadCgf) - { - ParseBoundingVolume(&buffer[start], header.boundingVolume, start); - } - - //else make sure the counter counts the name so we can jump over the string in the buffer. - else - { - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - - string fileName; - fileName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - } - - size += start; - } - - void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size) - { - int start = 0; - unsigned int tempSize; - char tempName[128]; - - memcpy(&header.typeID, &buffer[start], 4); - start += 4; - - memcpy(&tempSize , &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&header.levelVersion, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start +=4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelDescription.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelAuthor.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&header.maxNumberOfPlayer, &buffer[start], 4); - start += 4; - - memcpy(&header.worldSize, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.overviewPicturePath.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - int temp; - - for(int i = 0; i < tempSize; i++) - { - memcpy(&temp, &buffer[start], 4); - start += 4; - header.gameModesSupported.push_back((GameMode)temp); - } - - size += start; - } - - void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size) - { - int start = 0; - int tempSize = 0; - char tempName[128]; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - - string fileName; - fileName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - size += start; - - //Läs in filen. - int fileLength = 0; - Loader loader; - char* buf = loader.LoadFile("../Content/Worlds/cgf/"+ fileName, fileLength); - - start = 0; - LevelLoaderInternal::FormatVersion version; - memcpy(&version, &buf[0], sizeof(version)); - start += 8; - - memcpy(&volume.geoType, &buf[start], sizeof(volume.geoType)); - - switch(volume.geoType) - { - case CollisionGeometryType_Box: - memcpy(&volume.box, &buf[start], sizeof(volume.box)); - start += sizeof(volume.box); - break; - - case CollisionGeometryType_Sphere: - memcpy(&volume.sphere, &buf[start], sizeof(volume.sphere)); - start += sizeof(volume.sphere); - break; - - case CollisionGeometryType_Cylinder: - memcpy(&volume.cylinder, &buf[start], sizeof(volume.cylinder)); - start += sizeof(volume.cylinder); - break; - - default: - break; - } - } - } -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.h b/Code/Game/GameLogic/LevelLoader/ParseFunctions.h deleted file mode 100644 index 0fc6dbc6..00000000 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.h +++ /dev/null @@ -1,28 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#ifndef PARSERFUNCTIONS_H -#define PARSERFUNCTIONS_H -#include "ObjectDefines.h" - -namespace GameLogic -{ - namespace LevelFileLoader - { - /* - These functions will copy data from where the buffer pointer points. - header is the destination where the data will be copied. - size is either the size of the data to be copied (if it is NOT sent by reference). - Or the current index that is being used to parse the entire file (if it is sent by reference) this means you have to increase size with the appropiate size after you have copied. - - */ - void ParseObject(char* buffer, void *header, int size); - void ParseObject(char* buffer, ObjectHeader& header, int& size , bool loadCgf); - void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size); - void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size); - } -} - - -#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.cpp b/Code/Game/LevelLoader/LevelLoader.cpp similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.cpp rename to Code/Game/LevelLoader/LevelLoader.cpp diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h b/Code/Game/LevelLoader/LevelLoader.h similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/LevelLoader.h rename to Code/Game/LevelLoader/LevelLoader.h diff --git a/Code/Game/LevelLoader/LevelLoader.vcxproj b/Code/Game/LevelLoader/LevelLoader.vcxproj new file mode 100644 index 00000000..7f748c5f --- /dev/null +++ b/Code/Game/LevelLoader/LevelLoader.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {6391E709-D9FA-4FEF-A3B9-4343DB5A0C63} + LevelLoader + + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + v110 + true + Unicode + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(ProjectName)_$(PlatformShortName)D + $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ + + + $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(ProjectName)_$(PlatformShortName) + $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ + + + $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(ProjectName)_$(PlatformShortName)D + $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ + + + $(SolutionDir)..\External\Lib\$(ProjectName)\ + $(ProjectName)_$(PlatformShortName) + $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ + + + + Level3 + Disabled + true + $(SolutionDir)Misc\Utilities; + + + true + + + + + Level3 + Disabled + true + $(SolutionDir)Misc\Utilities; + + + true + + + + + Level3 + MaxSpeed + true + true + true + $(SolutionDir)Misc\Utilities; + + + true + true + true + + + + + + + + + Level3 + MaxSpeed + true + true + true + $(SolutionDir)Misc\Utilities; + + + true + true + true + + + + + + + + + + + + + + + + + + {2ec4dded-8f75-4c86-a10b-e1e8eb29f3ee} + + + + + + \ No newline at end of file diff --git a/Code/Game/LevelLoader/LevelLoader.vcxproj.user b/Code/Game/LevelLoader/LevelLoader.vcxproj.user new file mode 100644 index 00000000..2e28d6f7 --- /dev/null +++ b/Code/Game/LevelLoader/LevelLoader.vcxproj.user @@ -0,0 +1,22 @@ + + + + true + + + $(OutDir) + WindowsLocalDebugger + + + $(OutDir) + WindowsLocalDebugger + + + $(OutDir) + WindowsLocalDebugger + + + $(OutDir) + WindowsLocalDebugger + + \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp b/Code/Game/LevelLoader/LevelParser.cpp similarity index 99% rename from Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp rename to Code/Game/LevelLoader/LevelParser.cpp index 2fbf5df3..0c450f71 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp +++ b/Code/Game/LevelLoader/LevelParser.cpp @@ -98,7 +98,7 @@ std::vector> LevelParser::Parse(std::string filen case ObjectSpecialType_Spike: case ObjectSpecialType_SpikeBox: case ObjectSpecialType_RedExplosiveBox: - case ObjectSpecialType_StandarsBox: + case ObjectSpecialType_StandardBox: case ObjectSpecialType_Stone: case ObjectSpecialType_Building: { diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h b/Code/Game/LevelLoader/LevelParser.h similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.h rename to Code/Game/LevelLoader/LevelParser.h diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.cpp b/Code/Game/LevelLoader/Loader.cpp similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/Loader.cpp rename to Code/Game/LevelLoader/Loader.cpp diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/Loader.h b/Code/Game/LevelLoader/Loader.h similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/Loader.h rename to Code/Game/LevelLoader/Loader.h diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/ObjectDefines.h b/Code/Game/LevelLoader/ObjectDefines.h similarity index 98% rename from Code/Game/GameClient/GameClientState/LevelLoader/ObjectDefines.h rename to Code/Game/LevelLoader/ObjectDefines.h index bb2ae439..918fb4e6 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/ObjectDefines.h +++ b/Code/Game/LevelLoader/ObjectDefines.h @@ -31,7 +31,7 @@ namespace GameLogic ObjectSpecialType_World, //Always the main celestial body ObjectSpecialType_Building, ObjectSpecialType_Stone, - ObjectSpecialType_StandarsBox, + ObjectSpecialType_StandardBox, ObjectSpecialType_RedExplosiveBox, ObjectSpecialType_SpikeBox, ObjectSpecialType_Spike, @@ -40,6 +40,7 @@ namespace GameLogic ObjectSpecialType_JumpPad, ObjectSpecialType_Portal, ObjectSpecialType_Player, + ObjectSpecialType_Generic, ObjectSpecialType_Count, diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/ParseFunctions.cpp b/Code/Game/LevelLoader/ParseFunctions.cpp similarity index 99% rename from Code/Game/GameClient/GameClientState/LevelLoader/ParseFunctions.cpp rename to Code/Game/LevelLoader/ParseFunctions.cpp index 59f967de..b6b57d83 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/ParseFunctions.cpp +++ b/Code/Game/LevelLoader/ParseFunctions.cpp @@ -117,7 +117,7 @@ namespace GameLogic int temp; - for(int i = 0; i < tempSize; i++) + for(int i = 0; i < (int)tempSize; i++) { memcpy(&temp, &buffer[start], 4); start += 4; diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/ParseFunctions.h b/Code/Game/LevelLoader/ParseFunctions.h similarity index 100% rename from Code/Game/GameClient/GameClientState/LevelLoader/ParseFunctions.h rename to Code/Game/LevelLoader/ParseFunctions.h diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index 6f2998e9..5bd10165 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -319,7 +319,23 @@ bool NetworkClient::Connect(unsigned short port, std::wstring serverIP) bool NetworkClient::Reconnect() { - return this->privateData->connection.Reconnect(); + if(this->IsConnected()) + return false; + //if(this->privateData) + //return false; + if(!this->privateData) this->privateData = new PrivateData(); + + int result = this->privateData->connection.Reconnect(); + + if(result != 0) + { + return false; + } + this->privateData->owner = 0; + this->privateData->parent = this; + this->privateData->thread.Start(); + + return true; } void NetworkClient::Disconnect() From 0a664bd0dd675b599b8a6e4ee9a9597fe71bd067 Mon Sep 17 00:00:00 2001 From: dean11 Date: Wed, 19 Feb 2014 11:02:44 +0100 Subject: [PATCH 40/46] GameServer - Added dynamic player alias and model names --- Code/Game/GameServer/Implementation/GameClient.cpp | 4 ++-- .../GameServer/Implementation/GameSession_General.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index 81066450..9c04007f 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -17,7 +17,7 @@ GameClient::GameClient(Utility::DynamicMemory::SmartPointerclient = nwClient; this->player = 0; isReady = false; - this->character = L"Unknown"; + this->character = L"crate_colonists.dan"; this->alias = L"Unknown"; this->secondsSinceLastResponse = 0.0f; } @@ -25,7 +25,7 @@ GameClient::~GameClient() { this->player = 0; this->isReady = false; - this->character = L"Unknown"; + this->character = L"crate_colonists.dan"; this->alias = L"Unknown"; this->secondsSinceLastResponse = 0.0f; } diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 933807a4..30eabed2 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -165,7 +165,8 @@ void GameSession::ThreadEntry( ) IPlayerData* pl = this->gClients[k]->GetPlayer(); Protocol_ObjectCreatePlayer p( pl->GetPosition(), pl->GetRotation(), pl->GetScale(), pl->GetID(), true, this->gClients[k]->GetPlayer()->GetTeamID(), - /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + Utility::String::WStringToString(this->gClients[k]->GetAlias(), std::string()), + Utility::String::WStringToString(this->gClients[k]->GetCharacter(), std::string())); readyList[i]->GetClient()->Send(p); } } @@ -204,7 +205,8 @@ bool GameSession::Join(gClient gameClient) { Protocol_ObjectCreatePlayer oc( playerData->GetPosition(), playerData->GetRotation(), playerData->GetScale(), playerData->GetID(), true, playerData->GetTeamID(), - /*nwClient->GetAlias()*/"Unknown", /*playerData->GetMesh()*/"char_white.dan"); + Utility::String::WStringToString(gameClient->GetAlias(), std::string()), + Utility::String::WStringToString(gameClient->GetCharacter(), std::string())); nwClient->Send(oc); } @@ -217,7 +219,8 @@ bool GameSession::Join(gClient gameClient) IPlayerData* temp = this->gClients[i]->GetPlayer(); Protocol_ObjectCreatePlayer oc( temp->GetPosition(), temp->GetRotation(), temp->GetScale(), temp->GetID(), false, temp->GetTeamID(), - /*nwClient->GetAlias()*/"Unknown", /*playerData->GetMesh()*/"char_white.dan"); + Utility::String::WStringToString(this->gClients[i]->GetAlias(), std::string()), + Utility::String::WStringToString(this->gClients[i]->GetCharacter(), std::string())); nwClient->Send(oc); } } From 58117ad425d6a5e698a95bb04200afd473c8f687 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Wed, 19 Feb 2014 11:22:14 +0100 Subject: [PATCH 41/46] asd --- Code/Game/GameLogic/GameLogic.vcxproj.user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Game/GameLogic/GameLogic.vcxproj.user b/Code/Game/GameLogic/GameLogic.vcxproj.user index 4b847ee6..2e28d6f7 100644 --- a/Code/Game/GameLogic/GameLogic.vcxproj.user +++ b/Code/Game/GameLogic/GameLogic.vcxproj.user @@ -1,7 +1,7 @@  - false + true $(OutDir) From f1cd73425c37067b48471b98011fb04b602fadd6 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Wed, 19 Feb 2014 11:38:36 +0100 Subject: [PATCH 42/46] Removed old LevelLoader, it's now in a seperate project. --- .../GameLogic/LevelLoader/LevelLoader.cpp | 52 --- Code/Game/GameLogic/LevelLoader/LevelLoader.h | 56 --- .../GameLogic/LevelLoader/LevelParser.cpp | 320 ------------------ Code/Game/GameLogic/LevelLoader/LevelParser.h | 31 -- Code/Game/GameLogic/LevelLoader/Loader.cpp | 22 -- Code/Game/GameLogic/LevelLoader/Loader.h | 28 -- .../GameLogic/LevelLoader/ObjectDefines.h | 290 ---------------- .../GameLogic/LevelLoader/ParseFunctions.cpp | 195 ----------- Code/Game/LevelLoader/LevelLoader.cpp | 2 +- 9 files changed, 1 insertion(+), 995 deletions(-) delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelLoader.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelLoader.h delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelParser.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/LevelParser.h delete mode 100644 Code/Game/GameLogic/LevelLoader/Loader.cpp delete mode 100644 Code/Game/GameLogic/LevelLoader/Loader.h delete mode 100644 Code/Game/GameLogic/LevelLoader/ObjectDefines.h delete mode 100644 Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp b/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp deleted file mode 100644 index 205da712..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp +++ /dev/null @@ -1,52 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "LevelLoader.h" -#include "LevelParser.h" - -using namespace GameLogic; -using namespace GameLogic::LevelFileLoader; - -struct LevelLoader::PrivData -{ - LevelParser parser; - std::wstring folderPath; -}; - -LevelLoader::LevelLoader() - : pData(new PrivData) -{ - //standard path - pData->folderPath = L""; -} - -LevelLoader::LevelLoader(std::wstring folderPath) - : pData(new PrivData) -{ - pData->folderPath = folderPath; -} - -LevelLoader::~LevelLoader() -{ -} - -std::vector> LevelLoader::LoadLevel(std::wstring fileName) -{ - return pData->parser.Parse(pData->folderPath + fileName); -} - -LevelMetaData LevelLoader::LoadLevelHeader(std::wstring fileName) -{ - return pData->parser.ParseHeader(pData->folderPath + fileName); -} - -std::wstring LevelLoader::GetFolderPath() -{ - return this->pData->folderPath; -} - -void LevelLoader::SetFolderPath(std::wstring folderPath) -{ - this->pData->folderPath = folderPath; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.h b/Code/Game/GameLogic/LevelLoader/LevelLoader.h deleted file mode 100644 index c14e2c4c..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.h +++ /dev/null @@ -1,56 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#ifndef LEVELLOADER_H -#define LEVELLOADER_H - -#include -#include -#include "Utilities.h" -#include "ObjectDefines.h" - -namespace GameLogic -{ - class LevelLoader - { - - public: - LevelLoader(); - /*********************************************************** - * Lets you set the standard folderpath for the levels - ********************************************************/ - LevelLoader(std::wstring folderPath); - ~LevelLoader(); - - /******************************************************** - * Loads the level and objects from file. - * @param fileName: Path/name to the level-file that you want to load. - * @return: Returns all structs with objects and information about the level. - ********************************************************/ - std::vector> LoadLevel(std::wstring fileName); - - /******************************************************** - * Just for fast access for the meta information about the level. - * @param fileName: Path to the level-file that you want to load. - * @return: Returns the meta information about the level. - ********************************************************/ - LevelMetaData LoadLevelHeader(std::wstring fileName); //. - - /*********************************************************** - * @return: Returns the current standard folder path - ********************************************************/ - std::wstring GetFolderPath(); - - /*********************************************************** - * Sets the standard folder path - ********************************************************/ - void SetFolderPath(std::wstring folderPath); - - private: - struct PrivData; - Utility::DynamicMemory::SmartPointer pData; - }; -} - -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp b/Code/Game/GameLogic/LevelLoader/LevelParser.cpp deleted file mode 100644 index 2d23f069..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp +++ /dev/null @@ -1,320 +0,0 @@ -///////////////////////////////////// -// Created by Pontus Fransson 2013 // -///////////////////////////////////// - -#include "LevelParser.h" -#include "Loader.h" -#include "ParseFunctions.h" - -using namespace GameLogic; -using namespace ::LevelFileLoader; -using namespace Utility::DynamicMemory; - -LevelParser::LevelParser() -{ - formatVersion.formatVersionMajor = 3; - formatVersion.formatVersionMinor = 0; -} - -LevelParser::~LevelParser() -{ -} - -std::vector> LevelParser::Parse(std::wstring filename) -{ - int bufferSize = 0; - int counter = 0; - bool loadCgf; - - std::vector> objects; - - //Read entire level file. - Loader loader; - char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - - // Check if file was loaded, else return empty vector - if(!buffer) - { - return std::vector>(); - } - - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) - { - //Returns an empty vector, because it will most likely fail to read the level format. - return objects; - } - - while(counter < bufferSize) - { - loadCgf = true; - //Get typeID - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - switch((int)typeID) - { - case ObjectType_LevelMetaData: - { - SmartPointer header = new LevelMetaData; - ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); - objects.push_back(header); - break; - } - - case ObjectType_SpawnPoint: - { - loadCgf = false; - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - SpawnPointAttributes* spawn = new SpawnPointAttributes; - - spawn->typeID = header->typeID; - - for(int i = 0; i < 3; i++) - { - spawn->position[i] = header->position[i]; - } - - delete header; - //objects.push_back(header); - objects.push_back(spawn); - break; - } - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - //Unless they are changed to not be the same. - case ObjectType_Static: case ObjectType_Dynamic: - { - //Get specialType. - ObjectSpecialType specialType; - ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); - - switch(specialType) - { - //there is no difference when parsing these specialTypes. - case ObjectSpecialType_CrystalShard: - case ObjectSpecialType_CrystalFormation: - case ObjectSpecialType_Spike: - case ObjectSpecialType_SpikeBox: - case ObjectSpecialType_RedExplosiveBox: - case ObjectSpecialType_StandardBox: - case ObjectSpecialType_Stone: - case ObjectSpecialType_Building: - { - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - objects.push_back(header); - - break; - } - - case ObjectSpecialType_JumpPad: - { - JumpPadAttributes* header = new JumpPadAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - //Read the spec - ParseObject(&buffer[counter], header->direction, 16); - counter += 16; - objects.push_back(header); - - break; - } - - case ObjectSpecialType_Portal: - { - PortalAttributes* header = new PortalAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], header->destination, 12); - counter += 12; - objects.push_back(header); - - break; - } - - case ObjectSpecialType_World: - { - WorldAttributes* header = new WorldAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], &header->worldSize, 8); - counter += 8; - objects.push_back(header); - break; - } - - case ObjectSpecialType_Sky: - { - loadCgf = false; - SkyAttributes* header = new SkyAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - ParseObject(&buffer[counter], &header->skySize, 4); - counter += 4; - objects.push_back(header); - break; - } - - default: - //Couldn't find specialType - break; - } - break; - } - - case ObjectType_Light: - { - LightType lightType; - - //Get Light type - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - - //We only support PointLight for now. - BasicLight* header = new BasicLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - /*switch(lightType) - { - case LightType_PointLight: - { - PointLight* header = new PointLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_DirectionalLight: - { - DirectionalLight* header = new DirectionalLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_SpotLight: - { - SpotLight* header = new SpotLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - default: - //Undefined LightType. - break; - } - break;*/ - } - default: - //Couldn't find typeID. FAIL!!!!!! - break; - } - } - - return objects; -} - -//för meta information om leveln. -LevelMetaData LevelParser::ParseHeader(std::wstring filename) -{ - int bufferSize = 0; - int counter = 0; - - LevelMetaData levelHeader; - levelHeader.typeID = ObjectType::ObjectType_Unknown; - - //Read entire level file. - Loader loader; - char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(formatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) - { - //Do something if it's not the same version - - //Returns an empty levelHeader with ObjectType_Unknown. - //Because it will not be able to read another version of the level format. - return levelHeader; - } - - //Find the header in the returned string. - while(counter < bufferSize) - { - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - - switch(typeID) - { - case ObjectType_LevelMetaData: - ParseLevelMetaData(&buffer[counter], levelHeader, counter); - return levelHeader; - break; - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - case ObjectType_Static: case ObjectType_Dynamic: - { - ObjectHeader header; - ParseObject(&buffer[counter], &header, counter); - - switch(header.specialTypeID) - { - case ObjectSpecialType_JumpPad: - counter += sizeof(16); - break; - case ObjectSpecialType_Portal: - counter += sizeof(12); - break; - default: - break; - } - break; - } - - case ObjectType_Light: - { - LightType lightType; - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - - //We only support pointlight for now. - counter += sizeof(BasicLight); - /* - switch(lightType) - { - case LightType_PointLight: - { - counter += sizeof(PointLight); - break; - } - case LightType_DirectionalLight: - { - counter += sizeof(DirectionalLight); - break; - } - case LightType_SpotLight: - { - counter += sizeof(SpotLight); - break; - } - default: - //Undefined LightType. - break; - }*/ - } - - default: - //Couldn't find typeID. FAIL!!!!!! - break; - } - } - - return levelHeader; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.h b/Code/Game/GameLogic/LevelLoader/LevelParser.h deleted file mode 100644 index d0cb1f03..00000000 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef LEVEL_PARSER_H -#define LEVEL_PARSER_H - -#include -#include -#include "ObjectDefines.h" -#include "Utilities.h" - -namespace GameLogic -{ - namespace LevelFileLoader - { - class LevelParser - { - public: - LevelParser(); - ~LevelParser(); - - // - std::vector> Parse(std::wstring filename); - - // - LevelMetaData ParseHeader(std::wstring filename); - - private: - LevelLoaderInternal::FormatVersion formatVersion; - - }; - } -} -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/Loader.cpp b/Code/Game/GameLogic/LevelLoader/Loader.cpp deleted file mode 100644 index 19ffa0f1..00000000 --- a/Code/Game/GameLogic/LevelLoader/Loader.cpp +++ /dev/null @@ -1,22 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "Loader.h" -#include - -using namespace GameLogic::LevelFileLoader; -using namespace Oyster::Resource; -using namespace std; - -char* Loader::LoadFile(std::wstring fileName, int &size) -{ - //convert from string to wstring - //std::wstring temp(fileName.begin(), fileName.end()); - - //convert from wstring to wchar then loads the file - char* buffer = (char*)OysterResource::LoadResource(fileName.c_str(), Oyster::Resource::ResourceType::ResourceType_Byte_Raw, -1 , false); - - size = OysterResource::GetResourceSize(buffer); - return buffer; -} \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/Loader.h b/Code/Game/GameLogic/LevelLoader/Loader.h deleted file mode 100644 index 6deb8900..00000000 --- a/Code/Game/GameLogic/LevelLoader/Loader.h +++ /dev/null @@ -1,28 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#ifndef LOADER_H -#define LOADER_H - -#include "Resource\OysterResource.h" -#include - -namespace GameLogic -{ - namespace LevelFileLoader - { - class Loader - { - public: - Loader (){}; - ~Loader(){}; - char* LoadFile(std::wstring fileName, int &size); - - //TODO: - //Add functionality to load physicsObjects (hitboxes) - }; - } -} - -#endif; \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h b/Code/Game/GameLogic/LevelLoader/ObjectDefines.h deleted file mode 100644 index 131b2938..00000000 --- a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef OBJECT_DEFINES_H -#define OBJECT_DEFINES_H - -#include -#include - -namespace GameLogic -{ - /************************************ - Enums - *************************************/ - - enum ObjectType - { - ObjectType_LevelMetaData, - ObjectType_Static, - ObjectType_Dynamic, - ObjectType_Light, - ObjectType_SpawnPoint, - //Etc - - ObjectType_NUM_OF_TYPES, - - ObjectType_Unknown = -1 - }; - - enum ObjectSpecialType - { - ObjectSpecialType_None, - ObjectSpecialType_Sky, - ObjectSpecialType_World, //Always the main celestial body - ObjectSpecialType_Building, - ObjectSpecialType_Stone, - ObjectSpecialType_StandardBox, - ObjectSpecialType_RedExplosiveBox, - ObjectSpecialType_SpikeBox, - ObjectSpecialType_Spike, - ObjectSpecialType_CrystalFormation, - ObjectSpecialType_CrystalShard, - ObjectSpecialType_JumpPad, - ObjectSpecialType_Portal, - ObjectSpecialType_Player, - ObjectSpecialType_Generic, - - - ObjectSpecialType_Count, - ObjectSpecialType_Unknown = -1 - }; - - enum CollisionGeometryType - { - CollisionGeometryType_Box, - CollisionGeometryType_Sphere, - CollisionGeometryType_Cylinder, - CollisionGeometryType_TriangleMesh, - - CollisionGeometryType_Count, - CollisionGeometryType_Unknown = -1 - }; - - //Only supports Pointlight right now. - enum LightType - { - LightType_PointLight, - //LightType_DirectionalLight, - //LightType_SpotLight, - - LightType_Count, - LightType_Unknown = -1 - }; - - //Should this be moved somewhere else? - enum GameMode - { - GameMode_FreeForAll, - GameMode_TeamDeathMatch, - //Etc - - GameMode_Count, - GameMode_Unknown = -1 - }; - - enum WorldSize - { - WorldSize_Tiny, - WorldSize_Small, - WorldSize_Medium, - WorldSize_Big, - WorldSize_Humongous, - - WorldSize_Count, - WorldSize_Unknown = -1 - }; - - - /************************************ - Structs - *************************************/ - namespace LevelLoaderInternal - { - struct FormatVersion - { - unsigned int formatVersionMajor; - unsigned int formatVersionMinor; - - FormatVersion() - : formatVersionMajor(0), formatVersionMinor(0) - {} - - FormatVersion(unsigned int major, unsigned int minor) - : formatVersionMajor(major), formatVersionMinor(minor) - {} - - bool operator ==(const FormatVersion& obj) - { - return (this->formatVersionMajor == obj.formatVersionMajor && this->formatVersionMinor == obj.formatVersionMinor); - } - - bool operator !=(const FormatVersion& obj) - { - return !(*this == obj); - } - }; - } - - struct ObjectTypeHeader - { - ObjectType typeID; - - //Unless this is here the object destructor wont be called. - virtual ~ObjectTypeHeader(){} - }; - - namespace LevelLoaderInternal - { - const FormatVersion boundingVolumeVersion(2, 0); - - struct BoundingVolumeBase - { - CollisionGeometryType geoType; - float position[3]; - float rotation[4]; - float frictionCoeffStatic; - float frictionCoeffDynamic; - float restitutionCoeff; - float mass; - }; - - struct BoundingVolumeBox : public BoundingVolumeBase - { - float size[3]; - }; - - struct BoundingVolumeSphere : public BoundingVolumeBase - { - float radius; - }; - - struct BoundingVolumeCylinder : public BoundingVolumeBase - { - float length; - float radius; - }; - - struct BoundingVolumeTriangleMesh : public BoundingVolumeBase - { - //Null terminated - wchar_t* filename; - }; - - struct BoundingVolume - { - CollisionGeometryType geoType; - union - { - LevelLoaderInternal::BoundingVolumeBox box; - LevelLoaderInternal::BoundingVolumeSphere sphere; - LevelLoaderInternal::BoundingVolumeCylinder cylinder; - LevelLoaderInternal::BoundingVolumeTriangleMesh triangleMesh; - }; - - virtual ~BoundingVolume() - { - if(geoType == CollisionGeometryType_TriangleMesh) - { - delete[] triangleMesh.filename; - } - } - }; - - } - - struct LevelMetaData : public ObjectTypeHeader - { - std::string levelName; - unsigned int levelVersion; - std::string levelDescription; - std::string levelAuthor; - unsigned int maxNumberOfPlayer; - WorldSize worldSize; - std::string overviewPicturePath; - std::vector gameModesSupported; - - virtual ~LevelMetaData(){} - - }; - - struct ObjectHeader : public ObjectTypeHeader - { - //Special type id for special objects: portal, jumppad, exploding objects, etc. - ObjectSpecialType specialTypeID; - //Model, - std::string ModelFile; - //Position - float position[3]; - //Rotation Quaternion - float rotation[4]; - //Scale - float scale[3]; - - ::GameLogic::LevelLoaderInternal::BoundingVolume boundingVolume; - - virtual ~ObjectHeader(){} - }; - - struct SpawnPointAttributes : public ObjectTypeHeader - { - ObjectSpecialType specialTypeID; - float position[3]; - }; - /************************************ - Special objects - *************************************/ - - struct JumpPadAttributes : public ObjectHeader - { - float direction[3]; - float power; - }; - - struct PortalAttributes : public ObjectHeader - { - float destination[3]; - }; - - struct WorldAttributes : public ObjectHeader - { - float worldSize; - float atmoSphereSize; - }; - - struct SkyAttributes : public ObjectHeader - { - float skySize; - }; - - - - /************************************ - Lights - *************************************/ - - struct BasicLight : public ObjectTypeHeader - { - LightType lightType; //Is not used right now - float color[3]; - float position[3]; - float raduis; - float intensity; - }; - /* We only support pointlight right now. - struct PointLight : public BasicLight - { - float position[3]; - }; - - struct DirectionalLight : public BasicLight - { - float direction[3]; - }; - - struct SpotLight : public BasicLight - { - float direction[3]; - float range; - float attenuation[3]; - };*/ -} - -#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp deleted file mode 100644 index 76d7d6c3..00000000 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp +++ /dev/null @@ -1,195 +0,0 @@ -////////////////////////////////// -// Created by Sam Svensson 2013 // -////////////////////////////////// - -#include "ParseFunctions.h" -#include "Packing/Packing.h" -#include "Loader.h" -#include "Utilities.h" -#include - -using namespace Oyster::Packing; -using namespace GameLogic::LevelFileLoader; -using namespace GameLogic; -using namespace std; - -namespace GameLogic -{ - namespace LevelFileLoader - { - //can parse any struct if the struct doesnt contain strings or char[] - void ParseObject(char* buffer, void *header, int size) - { - memcpy(header, buffer, size); - } - - void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf) - { - char tempName[128]; - unsigned int tempSize = 0; - int start = 0; - - memcpy(&header.typeID, &buffer[start], 4); - start += 4; - - memcpy(&header.specialTypeID, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.ModelFile.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - //The reset of the object struct - //3 float[3], 1 float - memcpy(&header.position, &buffer[start], 40); - start += 40; - - //if loadCgf : Read path for bounding volume - if(loadCgf) - { - ParseBoundingVolume(&buffer[start], header.boundingVolume, start); - } - - //else make sure the counter counts the name so we can jump over the string in the buffer. - else - { - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - - string fileName; - fileName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - } - - size += start; - } - - void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size) - { - int start = 0; - unsigned int tempSize; - char tempName[128]; - - memcpy(&header.typeID, &buffer[start], 4); - start += 4; - - memcpy(&tempSize , &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&header.levelVersion, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start +=4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelDescription.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.levelAuthor.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&header.maxNumberOfPlayer, &buffer[start], 4); - start += 4; - - memcpy(&header.worldSize, &buffer[start], 4); - start += 4; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - header.overviewPicturePath.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - int temp; - - for(int i = 0; i < (int)tempSize; i++) - { - memcpy(&temp, &buffer[start], 4); - start += 4; - header.gameModesSupported.push_back((GameMode)temp); - } - - size += start; - } - - void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size) - { - int start = 0; - int tempSize = 0; - char tempName[128]; - - memcpy(&tempSize, &buffer[start], 4); - start += 4; - - memcpy(&tempName, &buffer[start], tempSize); - - string fileName; - fileName.assign(&tempName[0], &tempName[tempSize]); - start += tempSize; - - size += start; - - //Läs in filen. - int fileLength = 0; - Loader loader; - char* buf = loader.LoadFile(L"../Content/Worlds/cgf/" + Utility::String::StringToWstring(fileName, wstring()), fileLength); - - start = 0; - LevelLoaderInternal::FormatVersion version; - memcpy(&version, &buf[0], sizeof(version)); - start += 8; - - memcpy(&volume.geoType, &buf[start], sizeof(volume.geoType)); - - switch(volume.geoType) - { - case CollisionGeometryType_Box: - memcpy(&volume.box, &buf[start], sizeof(volume.box)); - start += sizeof(volume.box); - break; - - case CollisionGeometryType_Sphere: - memcpy(&volume.sphere, &buf[start], sizeof(volume.sphere)); - start += sizeof(volume.sphere); - break; - - case CollisionGeometryType_Cylinder: - memcpy(&volume.cylinder, &buf[start], sizeof(volume.cylinder)); - start += sizeof(volume.cylinder); - break; - - case CollisionGeometryType_TriangleMesh: - //Get string size - memcpy(&tempSize, &buf[start], sizeof(tempSize)); - start += sizeof(tempSize); - - //Get actual string - volume.triangleMesh.filename = new wchar_t[tempSize+1]; - memcpy(volume.triangleMesh.filename, &buf[start], tempSize); - volume.triangleMesh.filename[tempSize] = '\0'; - break; - - default: - break; - } - } - } -} \ No newline at end of file diff --git a/Code/Game/LevelLoader/LevelLoader.cpp b/Code/Game/LevelLoader/LevelLoader.cpp index 8fe880f3..82583696 100644 --- a/Code/Game/LevelLoader/LevelLoader.cpp +++ b/Code/Game/LevelLoader/LevelLoader.cpp @@ -48,5 +48,5 @@ std::string LevelLoader::GetFolderPath() void LevelLoader::SetFolderPath(std::string folderPath) { - + this->pData->folderPath = folderPath; } \ No newline at end of file From 932ef429c2e8e0e541a192c52e8bb899c7daf2bf Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Wed, 19 Feb 2014 12:09:42 +0100 Subject: [PATCH 43/46] GameClient - removed hardcoding for lvl, use 2ofAll map for correct world. Init player gets wrong scale and isMyPlayer. Need to verify camera on client --- .../GameClient/GameClientState/GameState.cpp | 6 +--- .../GameClientState/NetLoadState.cpp | 19 ------------- Code/Game/GameLogic/Game_PlayerData.cpp | 2 +- Code/Game/GameLogic/Level.cpp | 28 +------------------ 4 files changed, 3 insertions(+), 52 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 5d756cf4..41518db6 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -93,9 +93,6 @@ bool GameState::Init( SharedStateContent &shared ) //tell server ready this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); - // Debugg hack - this->InitiatePlayer( 0, "crate_generic.dan",Float3( 0,132, 10), Quaternion::identity, Float3(1), true ); - // end debug hack // DEGUG KEYS this->privData->key_Reload_Shaders = false; this->privData->key_Wireframe_Toggle = false; @@ -127,7 +124,6 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa RBData.rotation = ArrayToQuaternion( rotation ); RBData.scale = Float3( 1 ); // !RB DEBUG - if( isMyPlayer ) { if( this->privData->player.Init(modelData) ) @@ -483,7 +479,7 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState // if is this player. Remember to change camera if( this->privData->myId == decoded.object_ID ) { - this->privData->camera.SetPosition( position ); + //this->privData->camera.SetPosition( position ); //this->privData->camera.SetRotation( rotation ); this->privData->player.setPos( position ); //this->privData->player.setRot( rotation ); diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 1c4fbf65..b2475cc6 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -144,14 +144,6 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) desc.scale = oh->scale; desc.visible = true; - // HACK: untill the world is right in lvl format - if( oh->specialTypeID == ObjectSpecialType_World) - { - desc.position = Float3(0,0,0); - desc.rotation = Quaternion::identity; - desc.scale = Float3(300,300,300); - } - C_StaticObj *staticObject = new C_StaticObj(); if( staticObject->Init( desc ) ) { @@ -248,16 +240,5 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) } } - // DEBUG added a static light for testing - Graphics::Definitions::Pointlight pointLight; - pointLight.Color = Float3(1,1,0); - pointLight.Pos = Float3( 0,132, 10); - pointLight.Bright = 2; - pointLight.Radius = 50; - - C_Light *newLight = new C_Light( pointLight, objectID ); - - (*this->privData->lights)[objectID] = newLight; - this->privData->nextState = ClientState::ClientState_Game; } diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index ca0746e8..9ff82b2b 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -24,7 +24,7 @@ Game::PlayerData::PlayerData() } Game::PlayerData::PlayerData(int playerID,int teamID) { - Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(50,130,0); + Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(-50,180,0); Oyster::Math::Float3 size = Oyster::Math::Float3(0.25f,2.0f,0.5f); Oyster::Math::Float mass = 60; diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index a3a1c07f..b3a8b101 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -242,34 +242,8 @@ bool Level::InitiateLevel(std::wstring levelPath) ICustomBody* rigidBody_Static = NULL; - // HACK: untill the world is right in lvl format - if((ObjectSpecialType)staticObjData->specialTypeID == ObjectSpecialType_World) - { - Oyster::Math::Float3 rigidWorldPos; - Oyster::Math::Float4 rigidWorldRotation; - float rigidBodyMass; - float rigidBodyRadius; - - //offset the rigidPosition from modelspace to worldspace; - rigidWorldPos = Oyster::Math::Float3(0,0,0); - //scales the position so the collision geomentry is in the right place - - //offset the rigidRotation from modelspace to worldspace; - - rigidWorldRotation = Oyster::Math::Float4(0,0,0,1); - - //mass scaled - rigidBodyMass = 0; - - //Radius scaled - rigidBodyRadius = 150; - - //create the rigid body - rigidBody_Static = API::Instance().AddCollisionSphere( rigidBodyRadius , rigidWorldRotation , rigidWorldPos , rigidBodyMass, 1,1,1); - - } // collision shape - else if(staticObjData->boundingVolume.geoType == CollisionGeometryType_Sphere) + if(staticObjData->boundingVolume.geoType == CollisionGeometryType_Sphere) { rigidBody_Static = InitRigidBodySphere(staticObjData); } From 8a3cd796caaffdf441aa16caf2fa1c0ab9baf3f3 Mon Sep 17 00:00:00 2001 From: dean11 Date: Wed, 19 Feb 2014 12:46:05 +0100 Subject: [PATCH 44/46] GameServer - Pontus found idiot bug that dennis made --- Code/Game/GameLogic/Game.cpp | 1 + Code/Game/GameLogic/Player.cpp | 1 - Code/Game/GameProtocols/ObjectProtocols.h | 23 ++++++++++--------- .../Implementation/GameSession_Gameplay.cpp | 4 ++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index 8b77dea4..aee57be8 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -123,6 +123,7 @@ bool Game::NewFrame() for (unsigned int i = 0; i < this->players.Size(); i++) { + this->onMoveFnc(this->players[i]); if(this->players[i] && this->players[i]->player) this->players[i]->player->EndFrame(); } diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 80969b29..c87f7d74 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -160,7 +160,6 @@ void Player::EndFrame() this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized()); - Object::EndFrame(); } diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index ff6aa6e5..fc02a4bd 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -561,11 +561,11 @@ namespace GameLogic this->protocol[0].type = Oyster::Network::NetAttributeType_Short; //PLAYER_ID - this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->protocol[1].type = Oyster::Network::NetAttributeType_Bool; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; //OWNER - this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; + this->protocol[3].type = Oyster::Network::NetAttributeType_Int; //PLAYER-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; //MESH-NAME @@ -585,9 +585,10 @@ namespace GameLogic } Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { - this->object_ID = p[1].value.netInt; - this->teamId = this->protocol[2].value.netInt; - this->owner = this->protocol[3].value.netBool; + this->owner = p[1].value.netBool; + this->object_ID = p[2].value.netInt; + this->teamId = p[3].value.netInt; + this->name.assign(p[4].value.netCharPtr); this->meshName.assign(p[5].value.netCharPtr); @@ -610,11 +611,11 @@ namespace GameLogic this->protocol[0].type = Oyster::Network::NetAttributeType_Short; //PLAYER_ID - this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->protocol[1].type = Oyster::Network::NetAttributeType_Bool; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; //OWNER - this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; + this->protocol[3].type = Oyster::Network::NetAttributeType_Int; //PLAYER-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; //MESH-NAME @@ -644,10 +645,10 @@ namespace GameLogic } Oyster::Network::CustomNetProtocol GetProtocol() override { - - this->protocol[1].value = this->object_ID; - this->protocol[2].value = this->teamId; - this->protocol[3].value = this->owner; + this->protocol[1].value = this->owner; + this->protocol[2].value = this->object_ID; + this->protocol[3].value = this->teamId; + this->protocol.Set(4, this->name); this->protocol.Set(5, this->meshName); diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 6a9c09c2..4044cfdb 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -66,10 +66,10 @@ using namespace DanBias; break; case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: printf("\t(%i : %s) - EventType_ProtocolFailedToSend\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); - this->Detach(e.sender); + //this->Detach(e.sender); break; case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: - printf("\t(%i : %s) - EventType_ProtocolRecieved\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); + //printf("\t(%i : %s) - EventType_ProtocolRecieved\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); this->ParseProtocol(e.args.data.protocol, cl); break; } From 8816efafc83b234b9139756eb9690fbde58dc600 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Wed, 19 Feb 2014 13:15:19 +0100 Subject: [PATCH 45/46] GameState pre-work for subStates --- Code/Game/GameClient/GameClient.vcxproj | 6 + Code/Game/GameClient/GameClient.vcxproj.user | 2 +- .../GameClientState/GameClientState.h | 2 +- .../GameClientState/GameStateUI.cpp | 17 ++ .../GameClient/GameClientState/GameStateUI.h | 58 +++++++ .../GameClient/GameClientState/GamingUI.cpp | 153 ++++++++++++++++++ .../GameClient/GameClientState/GamingUI.h | 33 ++++ .../GameClient/GameClientState/RespawnUI.cpp | 58 +++++++ .../GameClient/GameClientState/RespawnUI.h | 29 ++++ Code/Misc/Input/L_inputClass.h | 1 + 10 files changed, 357 insertions(+), 2 deletions(-) create mode 100644 Code/Game/GameClient/GameClientState/GameStateUI.cpp create mode 100644 Code/Game/GameClient/GameClientState/GameStateUI.h create mode 100644 Code/Game/GameClient/GameClientState/GamingUI.cpp create mode 100644 Code/Game/GameClient/GameClientState/GamingUI.h create mode 100644 Code/Game/GameClient/GameClientState/RespawnUI.cpp create mode 100644 Code/Game/GameClient/GameClientState/RespawnUI.h diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index 349a88ec..082a9344 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -211,6 +211,8 @@ + + @@ -221,6 +223,7 @@ + @@ -237,6 +240,8 @@ + + @@ -246,6 +251,7 @@ + diff --git a/Code/Game/GameClient/GameClient.vcxproj.user b/Code/Game/GameClient/GameClient.vcxproj.user index 2e28d6f7..4b847ee6 100644 --- a/Code/Game/GameClient/GameClient.vcxproj.user +++ b/Code/Game/GameClient/GameClient.vcxproj.user @@ -1,7 +1,7 @@  - true + false $(OutDir) diff --git a/Code/Game/GameClient/GameClientState/GameClientState.h b/Code/Game/GameClient/GameClientState/GameClientState.h index 9891a16c..d336e196 100644 --- a/Code/Game/GameClient/GameClientState/GameClientState.h +++ b/Code/Game/GameClient/GameClientState/GameClientState.h @@ -35,7 +35,7 @@ namespace DanBias { namespace Client /****************************************************************** * @param message of the event - * @return message or GameClientState::event_processed. + * @return message or a reference to GameClientState::event_processed. ******************************************************************/ virtual const NetEvent & DataRecieved( const NetEvent &message ); }; diff --git a/Code/Game/GameClient/GameClientState/GameStateUI.cpp b/Code/Game/GameClient/GameClientState/GameStateUI.cpp new file mode 100644 index 00000000..6b8b7ed5 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/GameStateUI.cpp @@ -0,0 +1,17 @@ +#include "GameStateUI.h" + +using namespace ::DanBias::Client; +using namespace ::Oyster::Network; + +GameStateUI::GameStateUI() +{ + this->nextState = GameStateUI::UIState_same; +} + +GameStateUI::~GameStateUI() { /* Do nothing */ } + +const GameStateUI::NetEvent & GameStateUI::DataRecieved( const GameStateUI::NetEvent &message ) +{ + /* Do nothing */ + return message; +} \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameStateUI.h b/Code/Game/GameClient/GameClientState/GameStateUI.h new file mode 100644 index 00000000..40350211 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/GameStateUI.h @@ -0,0 +1,58 @@ +#ifndef DANBIAS_CLIENT_GAMECLIENTSTATE_H +#define DANBIAS_CLIENT_GAMECLIENTSTATE_H + +#include "Utilities.h" +#include "NetworkClient.h" + +namespace DanBias { namespace Client +{ + class GameStateUI + { + public: + enum UIState + { + UIState_same, + UIState_gaming, + + + UIState_main_menu, + UIState_shut_down + }; + + typedef ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> NetEvent; + static const NetEvent event_processed; + + GameStateUI(); + virtual ~GameStateUI(); + virtual UIState Update( float deltaTime ) = 0; + virtual bool HaveGUIRender() const = 0; + virtual bool HaveTextRender() const = 0; + virtual void RenderGUI() const = 0; + virtual void RenderText() const = 0; + virtual bool Release() = 0; + + /****************************************************************** + * @param message of the event + * @return message or a reference to GameStateUI::event_processed. + ******************************************************************/ + virtual const NetEvent & DataRecieved( const NetEvent &message ); + + protected: + UIState nextState; + }; +} } + +namespace Utility { namespace DynamicMemory +{ // template specializationto allowuse of dynamicmemory tools + template<> + inline void SafeDeleteInstance( ::DanBias::Client::GameStateUI *dynamicInstance ) + { + if( dynamicInstance ) + { + dynamicInstance->Release(); + delete dynamicInstance; + } + } +} } + +#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GamingUI.cpp b/Code/Game/GameClient/GameClientState/GamingUI.cpp new file mode 100644 index 00000000..a2edc28f --- /dev/null +++ b/Code/Game/GameClient/GameClientState/GamingUI.cpp @@ -0,0 +1,153 @@ +#include "GamingUI.h" +#include + +using namespace ::DanBias::Client; +using namespace ::Oyster::Network; +using namespace ::GameLogic; + +GamingUI::GamingUI() : + GameStateUI() +{ + /* Should never be called! */ + this->input = nullptr; + this->netClient = nullptr; + this->camera = nullptr; +} + +GamingUI::GamingUI( InputClass *input, NetworkClient *connection, Camera_FPSV2 *camera ) : + GameStateUI() +{ + this->input = input; + this->netClient = connection; + this->camera = camera; +} + +GamingUI::~GamingUI() { /* Do nothing */ } + +GameStateUI::UIState GamingUI::Update( float deltaTime ) +{ + return this->nextState; +} + +bool GamingUI::HaveGUIRender() const +{ + return false; // TODO: change to true when we want UI elements like a crosshair +} + +bool GamingUI::HaveTextRender() const +{ + return false; // TODO: change to true when we want UI elements like a chat window +} + +void GamingUI::RenderGUI() const +{ + // TODO: Render crosshairs and such here. Don't forget to adjust GamingUI::HaveGUIRender +} + +void GamingUI::RenderText() const +{ + // TODO: Render chattext and such here. Don't forget to adjust GamingUI::HaveGUIRender +} + +bool GamingUI::Release() +{ + // TODO: Release UI components here. + return true; +} + +void GamingUI::ReadKeyInput() +{ + if( this->input->IsKeyPressed(DIK_W) ) + { + this->netClient->Send( Protocol_PlayerMovementForward() ); + } + + if( this->input->IsKeyPressed(DIK_S) ) + { + this->netClient->Send( Protocol_PlayerMovementBackward() ); + } + + if( this->input->IsKeyPressed(DIK_A) ) + { + this->netClient->Send( Protocol_PlayerMovementLeft() ); + } + + if( this->input->IsKeyPressed(DIK_D) ) + { + this->netClient->Send( Protocol_PlayerMovementRight() ); + } + +// if( this->input->IsKeyPressed(DIK_R) ) +// { +// if( !this->key_Reload_Shaders ) +// { +//#ifdef _DEBUG +// Graphics::API::ReloadShaders(); +//#endif +// this->key_Reload_Shaders = true; +// } +// } +// else +// this->key_Reload_Shaders = false; + + //send delta mouse movement + { + this->camera->YawRight( this->input->GetYaw() * 0.017f ); + this->camera->PitchDown( this->input->GetPitch() * 0.017f ); + this->camera->UpdateOrientation(); + + this->netClient->Send( Protocol_PlayerLook(this->camera->GetLook(), this->camera->GetRight()) ); + } + + // shoot + //if( this->input->IsKeyPressed(DIK_Z) ) + //{ + // if( !this->key_Shoot ) + // { + // Protocol_PlayerShot playerShot; + // playerShot.primaryPressed = true; + // playerShot.secondaryPressed = false; + // playerShot.utilityPressed = false; + // this->netClient->Send( playerShot ); + // this->key_Shoot = true; + // } + //} + //else + // this->key_Shoot = false; + + //if( this->input->IsKeyPressed(DIK_X) ) + //{ + // if( !this->key_Shoot ) + // { + // Protocol_PlayerShot playerShot; + // playerShot.primaryPressed = false; + // playerShot.secondaryPressed = true; + // playerShot.utilityPressed = false; + // this->netClient->Send( playerShot ); + // this->key_Shoot = true; + // } + //} + //else + // this->key_Shoot = false; + + //if( this->input->IsKeyPressed(DIK_C) ) + //{ + // if( !this->key_Shoot ) + // { + // Protocol_PlayerShot playerShot; + // playerShot.primaryPressed = false; + // playerShot.secondaryPressed = false; + // playerShot.utilityPressed = true; + // this->netClient->Send( playerShot ); + // this->key_Shoot = true; + // } + //} + //else + // this->key_Shoot = false; + + // jump + if( this->input->IsKeyPressed(DIK_SPACE) ) + { + this->netClient->Send( Protocol_PlayerJump() ); + } +} \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GamingUI.h b/Code/Game/GameClient/GameClientState/GamingUI.h new file mode 100644 index 00000000..9f93674b --- /dev/null +++ b/Code/Game/GameClient/GameClientState/GamingUI.h @@ -0,0 +1,33 @@ +#ifndef DANBIAS_CLIENT_GAMING_UI_H +#define DANBIAS_CLIENT_GAMING_UI_H + +#include "GameStateUI.h" +#include "L_inputClass.h" +#include "Camera_FPSV2.h" + +namespace DanBias { namespace Client +{ + class GamingUI : public GameStateUI + { + public: + GamingUI( InputClass *input, ::Oyster::Network::NetworkClient *connection, Camera_FPSV2 *camera ); + virtual ~GamingUI(); + + UIState Update( float deltaTime ); + bool HaveGUIRender() const; + bool HaveTextRender() const; + void RenderGUI() const; + void RenderText() const; + bool Release(); + + private: + InputClass *input; + ::Oyster::Network::NetworkClient *netClient; + Camera_FPSV2 *camera; + + GamingUI(); + void ReadKeyInput(); + }; +} } + +#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/RespawnUI.cpp b/Code/Game/GameClient/GameClientState/RespawnUI.cpp new file mode 100644 index 00000000..4588d367 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/RespawnUI.cpp @@ -0,0 +1,58 @@ +#include "RespawnUI.h" + +using namespace ::DanBias::Client; +using namespace ::Oyster::Network; +using namespace ::Utility::Value; + +RespawnUI::RespawnUI() : + GameStateUI() +{ + /* Should never be called! */ + this->netClient = nullptr; + this->countDown = 0.0f; +} + +RespawnUI::RespawnUI( NetworkClient *connection, float delay ) : + GameStateUI() +{ + this->netClient = connection; + this->countDown = delay; +} + +RespawnUI::~RespawnUI() { /* Do nothing */ } + +GameStateUI::UIState RespawnUI::Update( float deltaTime ) +{ + this->countDown = Max( this->countDown - deltaTime, 0.0f ); + return this->nextState; +} + +bool RespawnUI::HaveGUIRender() const +{ + return false; // TODO: change to true when we want UI elements like a crosshair +} + +bool RespawnUI::HaveTextRender() const +{ + return false; // TODO: change to true when we want UI elements like a chat window +} + +void RespawnUI::RenderGUI() const +{ + // TODO: We need? +} + +void RespawnUI::RenderText() const +{ + // TODO: Text countdown somewhere on screen would be nice +} + +bool RespawnUI::Release() +{ + // TODO: Release UI components here. + return true; +} + + + + diff --git a/Code/Game/GameClient/GameClientState/RespawnUI.h b/Code/Game/GameClient/GameClientState/RespawnUI.h new file mode 100644 index 00000000..c45616b7 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/RespawnUI.h @@ -0,0 +1,29 @@ +#ifndef DANBIAS_CLIENT_RESPAWN_UI_H +#define DANBIAS_CLIENT_RESPAWN_UI_H + +#include "GameStateUI.h" + +namespace DanBias { namespace Client +{ + class RespawnUI : public GameStateUI + { + public: + RespawnUI( ::Oyster::Network::NetworkClient *connection, float delay ); + virtual ~RespawnUI(); + + UIState Update( float deltaTime ); + bool HaveGUIRender() const; + bool HaveTextRender() const; + void RenderGUI() const; + void RenderText() const; + bool Release(); + + private: + ::Oyster::Network::NetworkClient *netClient; + float countDown; + + RespawnUI(); + }; +} } + +#endif \ No newline at end of file diff --git a/Code/Misc/Input/L_inputClass.h b/Code/Misc/Input/L_inputClass.h index 8ed8e528..5511102a 100644 --- a/Code/Misc/Input/L_inputClass.h +++ b/Code/Misc/Input/L_inputClass.h @@ -7,6 +7,7 @@ #ifndef _INPUTCLASS_H_ #define _INPUTCLASS_H_ +#define NOMINMAX #define DIRECTINPUT_VERSION 0x0800 #pragma comment(lib, "dinput8.lib") From 3fe02213423f4e5625b7d0c26fdebb9e315fb430 Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Wed, 19 Feb 2014 13:41:05 +0100 Subject: [PATCH 46/46] GameClient - fixed render RB --- .../GameClient/GameClientState/GameState.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 41518db6..7ab0aeac 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -122,7 +122,7 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa RBInitData RBData; RBData.position = position; RBData.rotation = ArrayToQuaternion( rotation ); - RBData.scale = Float3( 1 ); + RBData.scale = scale; // !RB DEBUG if( isMyPlayer ) { @@ -216,13 +216,16 @@ bool GameState::Render() dynamicObject = this->privData->dynamicObjects->begin(); for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) { - if( dynamicObject->second->getBRtype() == RB_Type_Cube) + if( dynamicObject->second ) { - Oyster::Graphics::API::RenderDebugCube( dynamicObject->second->getRBWorld()); - } - if( dynamicObject->second->getBRtype() == RB_Type_Sphere) - { - Oyster::Graphics::API::RenderDebugSphere( dynamicObject->second->getRBWorld()); + if( dynamicObject->second->getBRtype() == RB_Type_Cube) + { + Oyster::Graphics::API::RenderDebugCube( dynamicObject->second->getRBWorld()); + } + if( dynamicObject->second->getBRtype() == RB_Type_Sphere) + { + Oyster::Graphics::API::RenderDebugSphere( dynamicObject->second->getRBWorld()); + } } } } @@ -479,8 +482,8 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState // if is this player. Remember to change camera if( this->privData->myId == decoded.object_ID ) { - //this->privData->camera.SetPosition( position ); - //this->privData->camera.SetRotation( rotation ); + this->privData->camera.SetPosition( position ); + this->privData->camera.SetRotation( rotation ); this->privData->player.setPos( position ); //this->privData->player.setRot( rotation ); }

    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 z%0A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 QubNpkqw;Fb%&iLiKi#t$)&Kwi literal 0 HcmV?d00001 From 06ddb86b17d19b35fd3fc107d4bb8c935001fc42 Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Tue, 18 Feb 2014 11:33:36 +0100 Subject: [PATCH 13/46] GL - GetAllDynamicObjects , dennis order --- Code/Game/GameLogic/Game.h | 2 ++ Code/Game/GameLogic/GameAPI.h | 2 ++ Code/Game/GameLogic/Game_LevelData.cpp | 12 ++++++++++++ 3 files changed, 16 insertions(+) diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index 93e130f5..b8f6d4b3 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -61,6 +61,8 @@ namespace GameLogic ObjectSpecialType GetObjectType() const override; int getNrOfDynamicObj()const override; IObjectData* GetObjectAt(int ID) const override; + Utility::DynamicMemory::DynamicArray GetAllDynamicObjects() const override; + Level *level; }; diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 30e86e8c..2a24c99e 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -13,6 +13,7 @@ #include "GameLogicStates.h" #include #include "LevelLoader\ObjectDefines.h" +#include "DynamicArray.h" namespace GameLogic @@ -107,6 +108,7 @@ namespace GameLogic public: virtual int getNrOfDynamicObj()const = 0; virtual IObjectData* GetObjectAt(int ID) const = 0; + virtual Utility::DynamicMemory::DynamicArray GetAllDynamicObjects() const = 0; }; class DANBIAS_GAMELOGIC_DLL GameAPI diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index b007ce01..4529e787 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -50,4 +50,16 @@ int Game::LevelData::getNrOfDynamicObj()const IObjectData* Game::LevelData::GetObjectAt(int ID) const { return this->level->GetObj(ID); +} + +Utility::DynamicMemory::DynamicArray Game::LevelData::GetAllDynamicObjects() const +{ + Utility::DynamicMemory::DynamicArray objects(level->dynamicObjects.Size()); + + for(int i = 0; i < level->dynamicObjects.Size(); i++) + { + objects[i] = level->dynamicObjects[i]; + } + + return objects; } \ No newline at end of file From f6f183d6e7453c399063160a45a833ebbd55fa16 Mon Sep 17 00:00:00 2001 From: dean11 Date: Tue, 18 Feb 2014 11:34:24 +0100 Subject: [PATCH 14/46] GameServer - Added inititiate protocols --- Code/Game/GameServer/GameClient.h | 34 ++++-- Code/Game/GameServer/GameLobby.h | 19 ++- Code/Game/GameServer/GameServerAPI.h | 17 +-- Code/Game/GameServer/GameSession.h | 19 +-- .../GameServer/Implementation/GameClient.cpp | 25 +++- .../GameServer/Implementation/GameLobby.cpp | 98 +++++++++++++--- .../GameLobby_ProtocolParser.cpp | 37 +++--- .../GameServer/Implementation/GameServer.cpp | 51 ++++---- .../Implementation/GameSession_Gameplay.cpp | 22 ++-- .../Implementation/GameSession_General.cpp | 110 ++++++++++-------- .../StandaloneGameServerCLI.cpp | 26 +++-- .../StandaloneGameServerCLI.h | 8 +- Code/Network/NetworkAPI/NetworkSession.h | 4 +- 13 files changed, 311 insertions(+), 159 deletions(-) diff --git a/Code/Game/GameServer/GameClient.h b/Code/Game/GameServer/GameClient.h index 09b3bc40..422df933 100644 --- a/Code/Game/GameServer/GameClient.h +++ b/Code/Game/GameServer/GameClient.h @@ -5,6 +5,7 @@ #define DANBIASSERVER_CLIENT_OBJECT_H #include +#include #include #include #include @@ -17,22 +18,21 @@ namespace DanBias class GameClient { public: - GameClient(Utility::DynamicMemory::SmartPointer client, GameLogic::IPlayerData* player); + GameClient(Utility::DynamicMemory::SmartPointer nwClient); virtual~GameClient(); - GameLogic::IPlayerData* GetPlayer(); - GameLogic::IPlayerData* ReleasePlayer(); - Utility::DynamicMemory::SmartPointer GetClient(); - Utility::DynamicMemory::SmartPointer ReleaseClient(); - inline bool operator==(const GameLogic::IPlayerData* c) { return (this->player) ? (c->GetID() == this->player->GetID()) : false ; } - inline bool operator==(const Oyster::Network::NetworkClient* c) { return (c->GetID() == this->GetID()); } + inline bool operator==(const Oyster::Network::NetworkClient* c) { return (c->GetID() == this->client->GetID()); } - inline float GetSinceLastResponse() const { return this->secondsSinceLastResponse; } - inline std::wstring GetAlias() const { return this->alias; } - inline std::wstring GetCharacter() const { return this->character; } - inline bool IsReady() const { return this->isReady; } - inline GameLogic::IPlayerData* GetPlayer() const { return this->player; } + inline bool Equals(const GameLogic::IPlayerData* c) { return (this->player) ? (c->GetID() == this->player->GetID()) : false ; } + inline bool Equals(const Oyster::Network::NetworkClient* c) { return (c->GetID() == this->client->GetID()); } + + inline float GetSinceLastResponse() const { return this->secondsSinceLastResponse; } + inline std::wstring GetAlias() const { return this->alias; } + inline std::wstring GetCharacter() const { return this->character; } + inline bool IsReady() const { return this->isReady; } + inline GameLogic::IPlayerData* GetPlayer() const { return this->player; } + Oyster::Network::NetClient GetClient() const { return this->client; } void SetPlayer(GameLogic::IPlayerData* player); @@ -41,6 +41,13 @@ namespace DanBias void SetCharacter(std::wstring character); void SetSinceLastResponse(float seconds); + GameLogic::IPlayerData* ReleasePlayer(); + Oyster::Network::NetClient ReleaseClient(); + + //NetworkSpecific + void SetOwner(Oyster::Network::NetworkSession* owner); + void UpdateClient(); + private: GameLogic::IPlayerData* player; Utility::DynamicMemory::SmartPointer client; @@ -52,4 +59,7 @@ namespace DanBias std::wstring character; }; }//End namespace DanBias + +typedef Utility::DynamicMemory::SmartPointer gClient; + #endif // !DANBIASSERVER_CLIENT_OBJECT_H diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index ac4db486..9281dcd6 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -15,11 +15,18 @@ namespace DanBias { struct LobbyLevelData { - int mapNumber; int maxClients; - int gameMode; - int gameTime; - std::string gameName; + int gameTimeInMinutes; + std::wstring gameMode; + std::wstring mapName; + std::wstring gameName; + LobbyLevelData() + : maxClients(10) + , gameTimeInMinutes(10) + , gameMode(L"unknown") + , mapName(L"unknown") + , gameName(L"unknown") + { } }; class GameLobby :public Oyster::Network::NetworkSession { @@ -49,6 +56,8 @@ namespace DanBias private: void ClientEventCallback(Oyster::Network::NetEvent e) override; void ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) override; + void ProcessClients() override; + bool Attach(Utility::DynamicMemory::SmartPointer client) override; private: //Utility::WinTimer timer; @@ -58,7 +67,7 @@ namespace DanBias GameSession gameSession; LobbyLevelData description; Utility::DynamicMemory::SmartPointer sessionOwner; - + Utility::DynamicMemory::DynamicArray> gClients; }; }//End namespace DanBias #endif // !DANBIASGAME_GAMELOBBY_H diff --git a/Code/Game/GameServer/GameServerAPI.h b/Code/Game/GameServer/GameServerAPI.h index a9e8c63f..eb5316c4 100644 --- a/Code/Game/GameServer/GameServerAPI.h +++ b/Code/Game/GameServer/GameServerAPI.h @@ -55,15 +55,18 @@ namespace DanBias static void NotifyWhenClientConnect(ClientConnectedNotify func); static void NotifyWhenClientDisconnect(ClientDisconnectedNotify func); - static void GameSetMapName(const wchar_t* val); - static void GameSetMaxClients(const int& val); - static void GameSetGameMode(const wchar_t* val); static void GameSetGameTime(const int& val); - static int GameGetMapId(); - static int GameGetMaxClients(); - static int GameGetGameMode(); + static void GameSetMaxClients(const int& val); + static void GameSetGameName(const wchar_t* val); + static void GameSetMapName(const wchar_t* val); + static void GameSetGameMode(const wchar_t* val); + static int GameGetGameTime(); - static const char* GameGetGameName(); + static int GameGetMaxClients(); + static const wchar_t* GameGetGameMode(); + static const wchar_t* GameGetGameName(); + static const wchar_t* GameGetMapName(); + static bool GameStart(); diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index 8cd04048..200bed9b 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -32,11 +32,11 @@ namespace DanBias struct GameDescription { unsigned int maxClients; - std::string mapName; - std::string gameMode; + std::wstring mapName; + std::wstring gameMode; int gameTimeMinutes; Oyster::Network::NetworkSession* owner; - Utility::DynamicMemory::DynamicArray clients; + Utility::DynamicMemory::DynamicArray> clients; }; public: @@ -52,17 +52,19 @@ namespace DanBias /** Join an existing/running game session * @param client The client to attach to the session */ - bool Attach(Oyster::Network::NetClient client) override; - void CloseSession( bool dissconnectClients ) override; + bool Join(gClient client); + + //void CloseSession( bool dissconnectClients ) override; inline bool IsCreated() const { return this->isCreated; } inline bool IsRunning() const { return this->isRunning; } - operator bool() { return (this->isCreated && this->isCreated); } + operator bool() { return (this->isCreated && this->isRunning); } //Private member functions private: // Client event callback function void ClientEventCallback(Oyster::Network::NetEvent e) override; + void ProcessClients() override; //Sends a client to the owner, if param is NULL then all clients is sent void SendToOwner(DanBias::GameClient* obj); @@ -98,8 +100,8 @@ namespace DanBias //Private member variables private: - Utility::DynamicMemory::DynamicArray> clients; - Utility::DynamicMemory::SmartPointer sessionOwner; + Utility::DynamicMemory::DynamicArray gClients; + gClient sessionOwner; Oyster::Thread::OysterThread worker; GameLogic::GameAPI& gameInstance; GameLogic::ILevelData *levelData; @@ -115,6 +117,7 @@ namespace DanBias //TODO: Remove this uggly hax static GameSession* gameSession; + };//End GameSession }//End namespace DanBias #endif // !DANBIASSERVER_GAME_SESSION_H \ No newline at end of file diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index 6e68b1e8..7ef4a338 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -12,8 +12,9 @@ using namespace DanBias; using namespace GameLogic; -GameClient::GameClient() +GameClient::GameClient(Utility::DynamicMemory::SmartPointer nwClient) { + this->client = nwClient; this->player = 0; isReady = false; this->character = L"Unknown"; @@ -51,3 +52,25 @@ void GameClient::SetCharacter(std::wstring character) } +void GameClient::SetOwner(Oyster::Network::NetworkSession* owner) +{ + this->client->SetOwner(owner); +} +void GameClient::UpdateClient() +{ + this->client->Update(); +} + + +IPlayerData* GameClient::ReleasePlayer() +{ + IPlayerData* temp = this->player; + this->player = 0; + return temp; +} +NetClient GameClient::ReleaseClient() +{ + NetClient temp = this->client; + this->client = 0; + return temp; +} diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 2a297e2f..f2467750 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -14,7 +14,7 @@ using namespace GameLogic; using namespace DanBias; GameLobby::GameLobby() -{ } +{ } GameLobby::~GameLobby() { this->clients.Clear(); @@ -37,16 +37,33 @@ void GameLobby::Update() void GameLobby::SetGameDesc(const LobbyLevelData& desc) { this->description.gameMode = desc.gameMode; - this->description.gameTime = desc.gameTime; - this->description.mapNumber = desc.mapNumber; + this->description.gameName = desc.gameName; + this->description.mapName = desc.mapName; + this->description.gameTimeInMinutes = desc.gameTimeInMinutes; this->description.maxClients = desc.maxClients; + + if(this->gClients.Size() > (unsigned int)desc.maxClients) + { + //Kick overflow + for (unsigned int i = (unsigned int)desc.maxClients - 1; i < this->gClients.Size(); i++) + { + if(this->gClients[i]) + { + this->gClients[i]->GetClient()->Disconnect(); + } + } + } + this->gClients.Resize((unsigned int)desc.maxClients); + } void GameLobby::GetGameDesc(LobbyLevelData& desc) { - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; + desc.gameTimeInMinutes = this->description.gameTimeInMinutes; desc.maxClients = this->description.maxClients; + desc.mapName = this->description.mapName; + desc.gameName = this->description.gameName; + desc.gameMode = this->description.gameMode; + } bool GameLobby::StartGameSession( ) { @@ -56,10 +73,10 @@ bool GameLobby::StartGameSession( ) GameSession::GameDescription desc; desc.maxClients = this->description.maxClients; desc.gameMode = this->description.gameMode; - desc.gameTimeMinutes = this->description.gameTime; + desc.gameTimeMinutes = this->description.gameTimeInMinutes; //desc.mapName = this->description.mapNumber; desc.owner = this; - desc.clients = this->clients; + desc.clients = this->gClients; if(desc.gameTimeMinutes == 0) desc.gameTimeMinutes = 10; //note: should be fetched from somewhere. @@ -67,7 +84,7 @@ bool GameLobby::StartGameSession( ) if(desc.maxClients == 0) desc.maxClients = 10; //note: should be fetched somewhere else.. - this->clients.Clear(); //Remove clients from lobby list + this->gClients.Clear(); //Remove clients from lobby list if(this->gameSession.Create(desc)) { @@ -96,8 +113,8 @@ void GameLobby::ClientEventCallback(NetEventGetID(), e.sender->GetIpAddress().c_str()); e.sender->Disconnect(); - this->readyList.Remove(e.sender); - this->clients.Remove(e.sender); + //this->readyList.Remove(e.sender); + //this->gClients.Remove(e.sender); break; case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: printf("\t(%i : %s) - EventType_ProtocolRecieved\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); @@ -111,21 +128,30 @@ void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointergameSession) { - Attach(client); + if(!this->Attach(client)) + { + client->Disconnect(); + } } else { - Attach(client); + if(!this->Attach(client)) + { + //Send message that lobby full + client->Disconnect(); + return; + } + Protocol_LobbyClientData p1; Protocol_LobbyGameData p2; - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]) + if(this->gClients[i]) { Protocol_LobbyClientData::PlayerData t; - t.id = this->clients[i]->GetID(); - t.ip = this->clients[i]->GetIpAddress(); + t.id = client->GetID(); + t.ip = client->GetIpAddress(); t.team = 0; t.name = "Dennis är kung tycker Erik!"; p1.list.Push(t); @@ -139,4 +165,42 @@ void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointerSend(p2.GetProtocol()); } } +void GameLobby::ProcessClients() +{ + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i]) + { + this->gClients[i]->UpdateClient(); + } + } +} +bool GameLobby::Attach(Utility::DynamicMemory::SmartPointer client) +{ + if(this->clientCount = this->description.maxClients) return false; + + bool added = false; + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(!this->gClients[i]) + { + added = true; + this->gClients[i] = new GameClient(client); + } + } + + if(!added) + { + this->gClients.Push(new GameClient(client)); + } + return true; +} + + + + + + + + diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index 81758480..ebcfb8bf 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -116,27 +116,34 @@ void GameLobby::LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster: } void GameLobby::LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c) { - NetClient temp; - bool found = false; - - //find client in waiting list - for (unsigned int i = 0; !found && i < this->clients.Size(); i++) + if(this->gameSession) { - if(this->clients[i]->GetID() == c->GetID()) + gClient temp; + bool found = false; + + //find client in waiting list + for (unsigned int i = 0; !found && i < this->clients.Size(); i++) { - temp = this->clients[i]; - found = true; + if(this->gClients[i]->GetClient()->GetID() == c->GetID()) + { + temp = this->gClients[i]; + found = true; + } } - } - //Something is wrong - if(!found) - { - c->Disconnect(); + //Something is wrong + if(!found) + { + c->Disconnect(); + } + else + { + //Send game data + this->gameSession.Join(temp); + } } else { - //Send game data - this->gameSession.Attach(temp); + } } diff --git a/Code/Game/GameServer/Implementation/GameServer.cpp b/Code/Game/GameServer/Implementation/GameServer.cpp index 087fa7ff..8fbf2111 100644 --- a/Code/Game/GameServer/Implementation/GameServer.cpp +++ b/Code/Game/GameServer/Implementation/GameServer.cpp @@ -118,65 +118,74 @@ void GameServerAPI::NotifyWhenClientDisconnect(ClientDisconnectedNotify func) else clientDisconnectedCallback = func; } -void GameServerAPI::GameSetMapName(const wchar_t* val) +void GameServerAPI::GameSetMapName(const wchar_t* val) { LobbyLevelData d; lobby.GetGameDesc(d); - //d.mapNumber = val; //TODO: implement + d.mapName = val; lobby.SetGameDesc(d); } -void GameServerAPI::GameSetMaxClients(const int& val) +void GameServerAPI::GameSetGameMode(const wchar_t* val) +{ + LobbyLevelData d; + lobby.GetGameDesc(d); + d.gameMode = val; + lobby.SetGameDesc(d); +} +void GameServerAPI::GameSetGameName(const wchar_t* val) +{ + LobbyLevelData d; + lobby.GetGameDesc(d); + d.gameName = val; + lobby.SetGameDesc(d); +} +void GameServerAPI::GameSetMaxClients(const int& val) { LobbyLevelData d; lobby.GetGameDesc(d); d.maxClients = val; lobby.SetGameDesc(d); } -void GameServerAPI::GameSetGameMode(const wchar_t* val) +void GameServerAPI::GameSetGameTime(const int& val) { LobbyLevelData d; lobby.GetGameDesc(d); - //d.gameMode = val; //TODO: implement + d.gameTimeInMinutes = val; lobby.SetGameDesc(d); } -void GameServerAPI::GameSetGameTime(const int& val) + +const wchar_t* GameServerAPI::GameGetMapName() { LobbyLevelData d; lobby.GetGameDesc(d); - d.gameTime = val; - lobby.SetGameDesc(d); + return d.mapName.c_str(); } -int GameServerAPI::GameGetMapId() -{ - LobbyLevelData d; - lobby.GetGameDesc(d); - return d.mapNumber; -} -int GameServerAPI::GameGetMaxClients() +int GameServerAPI::GameGetMaxClients() { LobbyLevelData d; lobby.GetGameDesc(d); return d.maxClients; } -int GameServerAPI::GameGetGameMode() +const wchar_t* GameServerAPI::GameGetGameMode() { LobbyLevelData d; lobby.GetGameDesc(d); - return d.gameMode; + return d.gameMode.c_str(); } -int GameServerAPI::GameGetGameTime() +int GameServerAPI::GameGetGameTime() { LobbyLevelData d; lobby.GetGameDesc(d); - return d.gameTime; + return d.gameTimeInMinutes; } -const char* GameServerAPI::GameGetGameName() +const wchar_t* GameServerAPI::GameGetGameName() { LobbyLevelData d; lobby.GetGameDesc(d); return d.gameName.c_str(); } -bool GameServerAPI::GameStart() + +bool GameServerAPI::GameStart() { if(lobby.StartGameSession()) { diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index d0cf5190..c3319eb3 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -43,9 +43,9 @@ using namespace DanBias; { int temp = -1; //Find the idiot - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]->Equals(e.sender)) + if(this->gClients[i]->Equals(e.sender)) { temp = i; } @@ -56,7 +56,7 @@ using namespace DanBias; this->Detach(e.sender)->Disconnect(); return; } - SmartPointer cl = this->clients[temp]; + SmartPointer cl = this->gClients[temp]; switch (e.args.type) { @@ -70,15 +70,21 @@ using namespace DanBias; break; case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: printf("\t(%i : %s) - EventType_ProtocolRecieved\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); - testID = 2; - if(cl->GetPlayer()->GetID() == testID)//TODO: TEST - { - testTimer.reset(); - } this->ParseProtocol(e.args.data.protocol, cl); break; } } + void GameSession::ProcessClients() + { + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i]) + { + this->gClients[i]->UpdateClient(); + } + } + } + void GameSession::ObjectMove(GameLogic::IObjectData* movedObject) { diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index cd89dc9a..d0ad30f4 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -3,6 +3,7 @@ ///////////////////////////////////////////////////////////////////// #include "..\GameSession.h" #include "..\GameClient.h" +#include "..\GameLobby.h" #include #include #include @@ -62,9 +63,16 @@ bool GameSession::Create(GameDescription& desc) if(this->isCreated) return false; /* standard initialization of some data */ - NetworkSession::clients = desc.clients; - NetworkSession::clients.Resize((unsigned int)desc.maxClients); - this->clients.Resize((unsigned int)desc.maxClients); + this->gClients.Resize((unsigned int)desc.maxClients); + for (unsigned int i = 0; i < desc.clients.Size(); i++) + { + if(desc.clients[i]) + { + this->clientCount++; + this->gClients[i] = desc.clients[i]; + this->gClients[i]->SetOwner(this); + } + } this->owner = desc.owner; /* Initiate the game instance */ @@ -75,14 +83,13 @@ bool GameSession::Create(GameDescription& desc) /* Create the players in the game instance */ GameLogic::IPlayerData* p = 0; - for (unsigned int i = 0; i < desc.clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(desc.clients[i]) + if(this->gClients[i]) { if( (p = this->gameInstance.CreatePlayer()) ) { - desc.clients[i]->SetOwner(this); - this->clients[i] = (new GameClient(desc.clients[i], p)); + this->gClients[i]->SetPlayer(p); } else { @@ -129,15 +136,15 @@ void GameSession::Run() void GameSession::ThreadEntry( ) { //List with clients that we are waiting on.. - DynamicArray> readyList;// = this->clients; + DynamicArray readyList;// = this->clients; //First we need to clean invalid clients, if any, and tell them to start loading game data - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]) + if(this->gClients[i]) { - readyList.Push(this->clients[i]); - Protocol_LobbyCreateGame p((char)1, (char)0, this->description.mapName); + readyList.Push(this->gClients[i]); + Protocol_LobbyCreateGame p((char)1, (char)0, Utility::String::WStringToString(this->description.mapName, std::string())); readyList[readyList.Size() - 1]->GetClient()->Send(p); } } @@ -153,13 +160,13 @@ void GameSession::ThreadEntry( ) if(readyList[i] && readyList[i]->IsReady()) { //Need to send information about other players, to all players - for (unsigned int k = 0; k < this->clients.Size(); k++) + for (unsigned int k = 0; k < this->gClients.Size(); k++) { - if((this->clients[k] && readyList[i]) && readyList[i]->GetClient()->GetID() != this->clients[k]->GetClient()->GetID()) + if((this->gClients[k] && readyList[i]) && readyList[i]->GetClient()->GetID() != this->gClients[k]->GetClient()->GetID()) { - IPlayerData* pl = this->clients[k]->GetPlayer(); + IPlayerData* pl = this->gClients[k]->GetPlayer(); Protocol_ObjectCreatePlayer p( pl->GetPosition(), pl->GetRotation(), pl->GetScale(), - pl->GetID(), true, this->clients[k]->GetPlayer()->GetTeamID(), + pl->GetID(), true, this->gClients[k]->GetPlayer()->GetTeamID(), /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); readyList[i]->GetClient()->Send(p); } @@ -173,32 +180,31 @@ void GameSession::ThreadEntry( ) } //Sync with clients before starting countdown - - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]) + if(this->gClients[i]) { - this->clients[i]->GetClient()->Send(GameLogic::Protocol_LobbyStartGame(5)); + this->gClients[i]->GetClient()->Send(GameLogic::Protocol_LobbyStartGame(5.0f)); } } } -bool GameSession::Attach(Utility::DynamicMemory::SmartPointer networkClient) +bool GameSession::Join(gClient gameClient) { if(!this->isCreated) return false; - if(this->GetClientCount() == this->clients.Capacity()) return false; + if(this->GetClientCount() == this->gClients.Capacity()) return false; - networkClient->SetOwner(this); + gameClient->SetOwner(this); IPlayerData* playerData = this->gameInstance.CreatePlayer(); if(!playerData) return false; - SmartPointer gameClient = new GameClient(networkClient, playerData); + gameClient->SetPlayer(playerData); NetworkClient* nwClient = gameClient->GetClient(); // Send the level information { - Protocol_LobbyCreateGame lcg((char)1, (char)0, this->description.mapName); + Protocol_LobbyCreateGame lcg((char)1, (char)0, Utility::String::WStringToString(this->description.mapName, std::string())); nwClient->Send(lcg); } @@ -212,11 +218,11 @@ bool GameSession::Attach(Utility::DynamicMemory::SmartPointer net // Send information about other clients { - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(clients[i]) + if(this->gClients[i]) { - IPlayerData* temp = clients[i]->GetPlayer(); + IPlayerData* temp = this->gClients[i]->GetPlayer(); Protocol_ObjectCreatePlayer oc( temp->GetPosition(), temp->GetRotation(), temp->GetScale(), temp->GetID(), false, temp->GetTeamID(), /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); @@ -227,40 +233,44 @@ bool GameSession::Attach(Utility::DynamicMemory::SmartPointer net //TODO: Need to be able to get the current gameplay data from the logic, to sync it with the client { - + } // Insert the new client to the update list + bool added = false; { - bool added = false; - for (unsigned int i = 0; !added && i < this->clients.Size(); i++) + for (unsigned int i = 0; !added && i < this->gClients.Size(); i++) { - if(!clients[i]) + if(!this->gClients[i]) { - NetworkSession::clients[i] = networkClient; - clients[i] = gameClient; + this->gClients[i] = gameClient; + // Send the start signal + { + nwClient->Send(GameLogic::Protocol_LobbyStartGame(0)); + } added = true; + this->clientCount++; } } - if(!added) - { - NetworkSession::clients.Push( networkClient ); - clients.Push( gameClient ); - } - } -// Send the start signal - { - nwClient->Send(GameLogic::Protocol_LobbyStartGame(0)); } - return true; + return added; } -void GameSession::CloseSession( bool dissconnectClients ) -{ - this->worker.Terminate(); - NetworkSession::CloseSession(true); - this->clients.Clear(); -} +//DynamicArray GameSession::CloseSession( bool dissconnectClients ) +//{ +// this->worker.Terminate(); +// //TODO: Send clients to lobby +// +// //for (unsigned int i = 0; i < this->gClients.Size(); i++) +// //{ +// // if(this->gClients[i]) +// // { +// // ((GameLobby*)this->owner)-> this->gClients[i] +// // } +// //} +// +// this->gClients.Clear(); +//} diff --git a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp index 3a10b6ce..0c913a56 100644 --- a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp +++ b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp @@ -72,26 +72,32 @@ void StandaloneGameServerCLI::GameSetMapName(String^ value) pin_ptr wch = PtrToStringChars(value); DanBias::GameServerAPI::GameSetMapName(wch); } +void StandaloneGameServerCLI::GameSetGameMode(String^ value) +{ + pin_ptr wch = PtrToStringChars(value); + DanBias::GameServerAPI::GameSetGameMode(wch); +} +void StandaloneGameServerCLI::GameSetGameName(String^ value) +{ + pin_ptr wch = PtrToStringChars(value); + DanBias::GameServerAPI::GameSetGameName(wch); +} void StandaloneGameServerCLI::GameSetMaxClients(const int val) { DanBias::GameServerAPI::GameSetMaxClients(val); } -void StandaloneGameServerCLI::GameSetGameMode(String^ value) -{ - pin_ptr wch = PtrToStringChars(value); - DanBias::GameServerAPI::GameSetGameMode(wch); -} + void StandaloneGameServerCLI::GameSetGameTime(const int val) { DanBias::GameServerAPI::GameSetGameTime(val); } -int StandaloneGameServerCLI::GameGetMapId() +String^ StandaloneGameServerCLI::GameGetMapName() { - return DanBias::GameServerAPI::GameGetMapId(); + return gcnew String( DanBias::GameServerAPI::GameGetMapName()); } int StandaloneGameServerCLI::GameGetMaxClients() @@ -99,9 +105,9 @@ int StandaloneGameServerCLI::GameGetMaxClients() return DanBias::GameServerAPI::GameGetMaxClients(); } -int StandaloneGameServerCLI::GameGetGameMode() +String^ StandaloneGameServerCLI::GameGetGameMode() { - return DanBias::GameServerAPI::GameGetGameMode(); + return gcnew String( DanBias::GameServerAPI::GameGetGameMode()); } int StandaloneGameServerCLI::GameGetGameTime() @@ -111,7 +117,7 @@ int StandaloneGameServerCLI::GameGetGameTime() String^ StandaloneGameServerCLI::GameGetGameName() { - return gcnew String(DanBias::GameServerAPI::GameGetGameName()); + return gcnew String( DanBias::GameServerAPI::GameGetGameName()); } bool StandaloneGameServerCLI::GameStart() diff --git a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h index 3fdd0713..d71a23b8 100644 --- a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h +++ b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h @@ -47,13 +47,15 @@ namespace System { namespace Windows { namespace Interop bool ServerIsRunning(); void GameSetMapName(String^ val); - void GameSetMaxClients(const int val); void GameSetGameMode(String^ val); + void GameSetGameName(String^ val); + void GameSetMaxClients(const int val); void GameSetGameTime(const int val); - int GameGetMapId(); + int GameGetMaxClients(); - int GameGetGameMode(); int GameGetGameTime(); + System::String^ GameGetMapName(); + System::String^ GameGetGameMode(); System::String^ GameGetGameName(); bool GameStart(); }; diff --git a/Code/Network/NetworkAPI/NetworkSession.h b/Code/Network/NetworkAPI/NetworkSession.h index f0677c77..b4e8e8fe 100644 --- a/Code/Network/NetworkAPI/NetworkSession.h +++ b/Code/Network/NetworkAPI/NetworkSession.h @@ -98,9 +98,9 @@ namespace Oyster protected: NetClientList clients; - - private: int clientCount; + + private: struct PrivateSessionData; PrivateSessionData* data; }; From 484b055338ba41254141983a112a393cea7a4bf7 Mon Sep 17 00:00:00 2001 From: dean11 Date: Tue, 18 Feb 2014 11:44:02 +0100 Subject: [PATCH 15/46] GL - Call by reference instead --- Code/Game/GameLogic/Game.h | 4 ++-- Code/Game/GameLogic/GameAPI.h | 2 +- Code/Game/GameLogic/Game_LevelData.cpp | 8 ++------ 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index b8f6d4b3..9c21ec1b 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -58,10 +58,10 @@ namespace GameLogic Oyster::Math::Float3 GetScale() override; Oyster::Math::Float4x4 GetOrientation() override; int GetID() const override; - ObjectSpecialType GetObjectType() const override; + ObjectSpecialType GetObjectType() const override; int getNrOfDynamicObj()const override; IObjectData* GetObjectAt(int ID) const override; - Utility::DynamicMemory::DynamicArray GetAllDynamicObjects() const override; + void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const override; Level *level; }; diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 2a24c99e..3325115f 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -108,7 +108,7 @@ namespace GameLogic public: virtual int getNrOfDynamicObj()const = 0; virtual IObjectData* GetObjectAt(int ID) const = 0; - virtual Utility::DynamicMemory::DynamicArray GetAllDynamicObjects() const = 0; + virtual void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& destMem) const = 0; }; class DANBIAS_GAMELOGIC_DLL GameAPI diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index 4529e787..80220d5f 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -52,14 +52,10 @@ IObjectData* Game::LevelData::GetObjectAt(int ID) const return this->level->GetObj(ID); } -Utility::DynamicMemory::DynamicArray Game::LevelData::GetAllDynamicObjects() const +void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const { - Utility::DynamicMemory::DynamicArray objects(level->dynamicObjects.Size()); - for(int i = 0; i < level->dynamicObjects.Size(); i++) { - objects[i] = level->dynamicObjects[i]; + mem[i] = level->dynamicObjects[i]; } - - return objects; } \ No newline at end of file From cec27408966d688d822a1ea906ba011d8f26ccd1 Mon Sep 17 00:00:00 2001 From: dean11 Date: Tue, 18 Feb 2014 11:56:36 +0100 Subject: [PATCH 16/46] GameServer - Fixed minor miss with inheritance --- Code/Game/GameServer/GameSession.h | 2 ++ .../Implementation/GameSession_Gameplay.cpp | 27 +++++++++++++++++++ .../Implementation/GameSession_General.cpp | 9 ++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index 200bed9b..e6c8a4f9 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -65,6 +65,8 @@ namespace DanBias // Client event callback function void ClientEventCallback(Oyster::Network::NetEvent e) override; void ProcessClients() override; + bool Send(Oyster::Network::CustomNetProtocol& message) override; + bool Send(Oyster::Network::CustomNetProtocol& protocol, int ID) override; //Sends a client to the owner, if param is NULL then all clients is sent void SendToOwner(DanBias::GameClient* obj); diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index c3319eb3..61ccf9c8 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -84,6 +84,33 @@ using namespace DanBias; } } } + bool GameSession::Send(Oyster::Network::CustomNetProtocol& message) + { + bool returnValue = false; + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i]) + { + this->gClients[i]->GetClient()->Send(message); + returnValue = true; + } + } + + return returnValue; + + } + bool GameSession::Send(Oyster::Network::CustomNetProtocol& protocol, int ID) + { + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i] && this->gClients[i]->GetClient()->GetID() == ID) + { + this->gClients[i]->GetClient()->Send(protocol); + return true; + } + } + return false; + } void GameSession::ObjectMove(GameLogic::IObjectData* movedObject) diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index d0ad30f4..43f088dd 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -233,7 +233,14 @@ bool GameSession::Join(gClient gameClient) //TODO: Need to be able to get the current gameplay data from the logic, to sync it with the client { - + DynamicArray objects; + this->levelData->GetAllDynamicObjects(objects); + for (unsigned int i = 0; i < objects.Size(); i++) + { + //Protocol_ObjectPosition p(movedObject->GetPosition(), id); + Protocol_ObjectPositionRotation p(objects[i]->GetPosition(), objects[i]->GetRotation(), objects[i]->GetID()); + GameSession::gameSession->Send(p.GetProtocol()); + } } // Insert the new client to the update list From 2e75d168a105b5676c6ce3f7deaebb8258fd5e55 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 12:03:54 +0100 Subject: [PATCH 17/46] New Cameras V2 is quaternion based --- Code/Game/GameClient/GameClient.vcxproj | 4 + .../GameClientState/Camera_BasicV2.cpp | 117 +++++++++++ .../GameClientState/Camera_BasicV2.h | 42 ++++ .../GameClientState/Camera_FPSV2.cpp | 182 ++++++++++++++++++ .../GameClient/GameClientState/Camera_FPSV2.h | 62 ++++++ Code/Misc/OysterMath/Quaternion.h | 7 + 6 files changed, 414 insertions(+) create mode 100644 Code/Game/GameClient/GameClientState/Camera_BasicV2.cpp create mode 100644 Code/Game/GameClient/GameClientState/Camera_BasicV2.h create mode 100644 Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp create mode 100644 Code/Game/GameClient/GameClientState/Camera_FPSV2.h diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index 3daafff3..349a88ec 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -201,7 +201,9 @@ + + @@ -226,7 +228,9 @@ + + diff --git a/Code/Game/GameClient/GameClientState/Camera_BasicV2.cpp b/Code/Game/GameClient/GameClientState/Camera_BasicV2.cpp new file mode 100644 index 00000000..8454b3bd --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Camera_BasicV2.cpp @@ -0,0 +1,117 @@ +#include "Camera_BasicV2.h" + +using namespace ::Oyster::Math3D; + +Camera_BasicV2::Camera_BasicV2() +{ + this->translation = Float3::null; + this->rotation = Quaternion::identity; + this->projection = Float4x4::identity; +} + +Camera_BasicV2::Camera_BasicV2( const Float3 &position, const Quaternion &rotation, const Float4x4 &projection ) +{ + this->translation = position; + this->rotation = rotation; + this->projection = projection; +} + +Camera_BasicV2::~Camera_BasicV2() {} + +Camera_BasicV2 & Camera_BasicV2::operator = ( const Camera_BasicV2 &camera ) +{ + this->translation = camera.translation; + this->rotation = camera.rotation; + this->projection = camera.projection; + return *this; +} + +void Camera_BasicV2::SetPosition( const Float3 &translation ) +{ + this->translation = translation; +} + +void Camera_BasicV2::SetRotation( const Quaternion &rotation ) +{ + this->rotation = rotation; +} + +void Camera_BasicV2::SetAngular( const Float3 &axis ) +{ + this->rotation = Rotation( axis ); +} + +void Camera_BasicV2::SetProjection( const Float4x4 &matrix ) +{ + this->projection = matrix; +} + +void Camera_BasicV2::SetOrthographicProjection( Float width, Float height, Float nearClip, Float farClip ) +{ + ProjectionMatrix_Orthographic( width, height, nearClip, farClip, this->projection ); +} + +void Camera_BasicV2::SetPerspectiveProjection( Float verticalFoV, Float aspectRatio, Float nearClip, Float farClip ) +{ + ProjectionMatrix_Perspective( verticalFoV, aspectRatio, nearClip, farClip, this->projection ); +} + +void Camera_BasicV2::Move( const Float3 &deltaPosition ) +{ + this->translation += deltaPosition; +} + +void Camera_BasicV2::Rotate( const Quaternion &deltaRotation ) +{ + this->rotation *= deltaRotation; +} + +void Camera_BasicV2::Rotate( const Float3 &deltaAngularAxis ) +{ + this->rotation *= Rotation( deltaAngularAxis ); +} + +const Float3 & Camera_BasicV2::GetPosition() const +{ + return this->translation; +} + +Float3 & Camera_BasicV2::GetAngularAxis( Float3 &targetMem ) const +{ + return targetMem = AngularAxis( this->rotation ); +} + +Float3 Camera_BasicV2::GetNormalOf( const Float3 &axis ) const +{ + return WorldAxisOf( this->rotation, axis ); +} + +const Quaternion & Camera_BasicV2::GetRotation() const +{ + return this->rotation; +} + +Float3x3 & Camera_BasicV2::GetRotationMatrix( Float3x3 &targetMem ) const +{ + return RotationMatrix( this->rotation, targetMem ); +} + +Float4x4 & Camera_BasicV2::GetRotationMatrix( Float4x4 &targetMem ) const +{ + return RotationMatrix( this->rotation, targetMem ); +} + +Float4x4 & Camera_BasicV2::GetViewMatrix( Float4x4 &targetMem ) const +{ + return ViewMatrix( this->rotation, this->translation, targetMem ); +} + +const Float4x4 & Camera_BasicV2::GetProjectionMatrix() const +{ + return this->projection; +} + +Float4x4 & Camera_BasicV2::GetViewsProjMatrix( Float4x4 &targetMem ) const +{ + return TransformMatrix( this->projection, this->GetViewMatrix(), targetMem ); +} \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/Camera_BasicV2.h b/Code/Game/GameClient/GameClientState/Camera_BasicV2.h new file mode 100644 index 00000000..aaa9d491 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Camera_BasicV2.h @@ -0,0 +1,42 @@ +#ifndef CAMERA_BASIC_V2_H +#define CAMERA_BASIC_V2_H + +#include "OysterMath.h" + +class Camera_BasicV2 +{ +public: + Camera_BasicV2(); + Camera_BasicV2( const ::Oyster::Math::Float3 &position, const ::Oyster::Math::Quaternion &rotation, const ::Oyster::Math::Float4x4 &projection ); + virtual ~Camera_BasicV2(); + + Camera_BasicV2 & operator = ( const Camera_BasicV2 &camera ); + + void SetPosition( const ::Oyster::Math::Float3 &translation ); + void SetRotation( const ::Oyster::Math::Quaternion &rotation ); + void SetAngular( const ::Oyster::Math::Float3 &axis ); + void SetProjection( const ::Oyster::Math::Float4x4 &matrix ); + void SetOrthographicProjection( ::Oyster::Math::Float width, ::Oyster::Math::Float height, ::Oyster::Math::Float nearClip, ::Oyster::Math::Float farClip ); + void SetPerspectiveProjection( ::Oyster::Math::Float verticalFoV, ::Oyster::Math::Float aspectRatio, ::Oyster::Math::Float nearClip, ::Oyster::Math::Float farClip ); + + void Move( const ::Oyster::Math::Float3 &deltaPosition ); + void Rotate( const ::Oyster::Math::Quaternion &deltaRotation ); + void Rotate( const ::Oyster::Math::Float3 &deltaAngularAxis ); + + const ::Oyster::Math::Float3 & GetPosition() const; + ::Oyster::Math::Float3 & GetAngularAxis( ::Oyster::Math::Float3 &targetMem = ::Oyster::Math::Float3() ) const; + ::Oyster::Math::Float3 GetNormalOf( const ::Oyster::Math::Float3 &axis ) const; + const ::Oyster::Math::Quaternion & GetRotation() const; + ::Oyster::Math::Float3x3 & GetRotationMatrix( ::Oyster::Math::Float3x3 &targetMem ) const; + ::Oyster::Math::Float4x4 & GetRotationMatrix( ::Oyster::Math::Float4x4 &targetMem ) const; + ::Oyster::Math::Float4x4 & GetViewMatrix( Oyster::Math::Float4x4 &targetMem = ::Oyster::Math::Float4x4() ) const; + const ::Oyster::Math::Float4x4 & GetProjectionMatrix() const; + ::Oyster::Math::Float4x4 & GetViewsProjMatrix( Oyster::Math::Float4x4 &targetMem = ::Oyster::Math::Float4x4() ) const; + + private: + ::Oyster::Math::Float3 translation; + mutable ::Oyster::Math::Quaternion rotation; + ::Oyster::Math::Float4x4 projection; +}; + +#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp new file mode 100644 index 00000000..b1863242 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp @@ -0,0 +1,182 @@ +#include "Camera_FPSV2.h" +#include "Utilities.h" + +using namespace ::Oyster::Math3D; +using namespace ::Utility::Value; + +Camera_FPSV2::Camera_FPSV2() +{ // this->head is default set to identity uniformprojection at origo + this->pitchUp = 0.0f; + this->headOffset = + this->body.translation = Float3::null; + this->body.rotation = Quaternion::identity; +} + +Camera_FPSV2::~Camera_FPSV2() {} + +Camera_FPSV2 & Camera_FPSV2::operator = ( const Camera_FPSV2 &camera ) +{ + this->head = camera.head; + this->pitchUp = camera.pitchUp; + this->headOffset = camera.headOffset; + this->body.translation = camera.body.translation; + this->body.rotation = camera.body.rotation; + return *this; +} + +void Camera_FPSV2::SetHeadOffset( const Float3 &translation ) +{ + this->head.Move( translation - this->headOffset ); + this->headOffset = translation; +} + +void Camera_FPSV2::SetPosition( const Float3 &translation ) +{ + this->head.Move( translation - this->body.translation ); + this->body.translation = translation; +} + +void Camera_FPSV2::SetAngular( const Float3 &axis ) +{ + this->body.rotation = Rotation( axis ); + this->head.SetRotation( this->body.rotation ); + this->pitchUp = 0.0f; +} + +void Camera_FPSV2::SetProjection( const Float4x4 &matrix ) +{ + this->head.SetProjection( matrix ); +} + +void Camera_FPSV2::SetOrthographicProjection( Float width, Float height, Float nearClip, Float farClip ) +{ + this->head.SetOrthographicProjection( width, height, nearClip, farClip ); +} + +void Camera_FPSV2::SetPerspectiveProjection( Float verticalFoV, Float aspectRatio, Float nearClip, Float farClip ) +{ + this->head.SetPerspectiveProjection( verticalFoV, aspectRatio, nearClip, farClip ); +} + +void Camera_FPSV2::UpdateOrientation() +{ + Float4x4 orientation; + OrientationMatrix( this->body.rotation, this->body.translation, orientation ); + + this->head.SetPosition( (orientation * Float4(this->headOffset, 1.0f)).xyz ); +} + +void Camera_FPSV2::SnapUpToNormal( const Float3 &normal ) +{ + this->body.rotation = Rotation( SnapAngularAxis(AngularAxis(this->body.rotation), WorldAxisOf(this->body.rotation, Float3::standard_unit_y), normal) ); + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp * Float3::standard_unit_x) ); +} + +void Camera_FPSV2::Move( const Float3 &deltaPosition ) +{ + this->head.Move( deltaPosition ); + this->body.translation += deltaPosition; +} + +void Camera_FPSV2::Rotate( const Quaternion &deltaRotation ) +{ + this->head.Rotate( deltaRotation ); + this->body.rotation *= deltaRotation; +} + +void Camera_FPSV2::Rotate( const Float3 &deltaAngularAxis ) +{ + this->Rotate( Rotation(deltaAngularAxis) ); +} + +void Camera_FPSV2::MoveForward( Float distance ) +{ + this->MoveBackward( -distance ); +} + +void Camera_FPSV2::MoveBackward( Float distance ) +{ + this->Move( distance * WorldAxisOf(this->body.rotation, Float3::standard_unit_z) ); +} + +void Camera_FPSV2::StrafeRight( Float distance ) +{ + this->Move( distance * WorldAxisOf(this->body.rotation, Float3::standard_unit_x) ); +} + +void Camera_FPSV2::StrafeLeft( Float distance ) +{ + this->StrafeRight( -distance ); +} + +void Camera_FPSV2::PitchUp( Float radian ) +{ + this->pitchUp = Clamp( this->pitchUp + radian, -0.48f * pi, 0.48f * pi ); + this->head.SetRotation( this->body.rotation * Rotation(this->pitchUp, Float3::standard_unit_x) ); +} + +void Camera_FPSV2::PitchDown( Float radian ) +{ + this->PitchUp( -radian ); +} + +void Camera_FPSV2::YawRight( Float radian ) +{ + this->YawLeft( -radian ); +} + +void Camera_FPSV2::YawLeft( Float radian ) +{ + Quaternion deltaRotation = Rotation( radian, WorldAxisOf(this->body.rotation, Float3::standard_unit_y) ); + this->Rotate( deltaRotation ); +} + +const Float3 & Camera_FPSV2::GetHeadOffset() const +{ + return this->headOffset; +} + +const Float3 & Camera_FPSV2::GetPosition() const +{ + return this->body.translation; +} + +Float4x4 & Camera_FPSV2::GetViewMatrix( Float4x4 &targetMem ) const +{ + return this->head.GetViewMatrix( targetMem ); +} + +const Float4x4 & Camera_FPSV2::GetProjectionMatrix() const +{ + return this->head.GetProjectionMatrix(); +} + +Float4x4 & Camera_FPSV2::GetViewsProjMatrix( Float4x4 &targetMem ) const +{ + return this->head.GetViewsProjMatrix( targetMem ); +} + +Float3 Camera_FPSV2::GetNormalOf( const Float3 &axis ) const +{ + return this->head.GetNormalOf( axis ); +} + +Float3 Camera_FPSV2::GetRight() const +{ + return WorldAxisOf( this->body.rotation, Float3::standard_unit_x ); +} + +Float3 Camera_FPSV2::GetUp() const +{ + return WorldAxisOf( this->body.rotation, Float3::standard_unit_y ); +} + +Float3 Camera_FPSV2::GetLook() const +{ + return this->head.GetNormalOf( -Float3::standard_unit_z ); +} + +Float3 Camera_FPSV2::GetForward() const +{ + return WorldAxisOf( this->body.rotation, -Float3::standard_unit_z ); +} \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.h b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h new file mode 100644 index 00000000..968053c7 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h @@ -0,0 +1,62 @@ +#ifndef CAMERA_FPSV2_H +#define CAMERA_FPSV2_H + +#include "OysterMath.h" +#include "Camera_BasicV2.h" + +class Camera_FPSV2 +{ +public: + Camera_FPSV2(); + virtual ~Camera_FPSV2(); + + Camera_FPSV2 & operator = ( const Camera_FPSV2 &camera ); + + void SetHeadOffset( const ::Oyster::Math::Float3 &translation ); + void SetPosition( const ::Oyster::Math::Float3 &translation ); + void SetAngular( const ::Oyster::Math::Float3 &axis ); + void SetProjection( const ::Oyster::Math::Float4x4 &matrix ); + void SetOrthographicProjection( ::Oyster::Math::Float width, ::Oyster::Math::Float height, ::Oyster::Math::Float nearClip, ::Oyster::Math::Float farClip ); + void SetPerspectiveProjection( ::Oyster::Math::Float verticalFoV, ::Oyster::Math::Float aspectRatio, ::Oyster::Math::Float nearClip, ::Oyster::Math::Float farClip ); + + void UpdateOrientation(); + + void SnapUpToNormal( const ::Oyster::Math::Float3 &normal ); + + void Move( const ::Oyster::Math::Float3 &deltaPosition ); + void Rotate( const ::Oyster::Math::Quaternion &deltaRotation ); + void Rotate( const ::Oyster::Math::Float3 &deltaAngularAxis ); + + void MoveForward( ::Oyster::Math::Float distance ); + void MoveBackward( ::Oyster::Math::Float distance ); + void StrafeRight( ::Oyster::Math::Float distance ); + void StrafeLeft( ::Oyster::Math::Float distance ); + + void PitchUp( ::Oyster::Math::Float radian ); + void PitchDown( ::Oyster::Math::Float radian ); + void YawRight( ::Oyster::Math::Float radian ); + void YawLeft( ::Oyster::Math::Float radian ); + + const ::Oyster::Math::Float3 & GetHeadOffset() const; + const ::Oyster::Math::Float3 & GetPosition() const; + ::Oyster::Math::Float4x4 & GetViewMatrix( Oyster::Math::Float4x4 &targetMem = ::Oyster::Math::Float4x4() ) const; + const ::Oyster::Math::Float4x4 & GetProjectionMatrix() const; + ::Oyster::Math::Float4x4 & GetViewsProjMatrix( Oyster::Math::Float4x4 &targetMem = ::Oyster::Math::Float4x4() ) const; + ::Oyster::Math::Float3 GetNormalOf( const ::Oyster::Math::Float3 &axis ) const; + ::Oyster::Math::Float3 GetRight() const; + ::Oyster::Math::Float3 GetUp() const; + ::Oyster::Math::Float3 GetLook() const; + ::Oyster::Math::Float3 GetForward() const; + +private: + Camera_BasicV2 head; + ::Oyster::Math::Float pitchUp; + ::Oyster::Math::Float3 headOffset; + struct + { + ::Oyster::Math::Float3 translation; + ::Oyster::Math::Quaternion rotation; + } body; +}; + +#endif \ No newline at end of file diff --git a/Code/Misc/OysterMath/Quaternion.h b/Code/Misc/OysterMath/Quaternion.h index da790f75..f5ea5951 100644 --- a/Code/Misc/OysterMath/Quaternion.h +++ b/Code/Misc/OysterMath/Quaternion.h @@ -36,6 +36,7 @@ namespace LinearAlgebra const ScalarType & operator [] ( int i ) const; Quaternion & operator = ( const Quaternion &quaternion ); + Quaternion & operator *= ( const Quaternion &quaternion ); Quaternion & operator *= ( const ScalarType &scalar ); Quaternion & operator /= ( const ScalarType &scalar ); Quaternion & operator += ( const Quaternion &quaternion ); @@ -112,6 +113,12 @@ namespace LinearAlgebra return *this; } + template + Quaternion & Quaternion::operator *= ( const Quaternion &quaternion ) + { + return *this = *this * quaternion; + } + template Quaternion & Quaternion::operator *= ( const ScalarType &scalar ) { From 500ac117a7429e64e17a7335c250daa3d7f936f2 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 12:59:51 +0100 Subject: [PATCH 18/46] removed debug lines --- Code/Game/GameClient/GameClientState/GameState.cpp | 8 ++------ Code/Game/GameClient/GameClientState/NetLoadState.cpp | 5 +---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 910afeb9..7118191e 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -85,11 +85,7 @@ bool GameState::Init( SharedStateContent &shared ) Graphics::API::SetProjection( this->privData->camera.GetProjectionMatrix() ); //tell server ready - //this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); - - // Debugg hack - this->InitiatePlayer( 0, "crate_generic.dan",Float3( 0,132, 10), Quaternion::identity, Float3(1), true ); - // end debug hack + this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); return true; } @@ -111,7 +107,7 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa this->privData->myId = id; this->privData->camera.SetPosition( this->privData->player.getPos() ); Float3 offset = Float3( 0.0f ); - offset.y = this->privData->player.getScale().y + 0.5f; // debug hack +0.5f + offset.y = this->privData->player.getScale().y * 0.9f; this->privData->camera.SetHeadOffset( offset ); this->privData->camera.UpdateOrientation(); } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 7443344e..f50db40c 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -54,11 +54,8 @@ bool NetLoadState::Init( SharedStateContent &shared ) // we may assume that nwClient is properly connected to the server // signals querry to server for loading instructions - //this->privData->nwClient->Send( Protocol_QuerryGameType() ); + this->privData->nwClient->Send( Protocol_QuerryGameType() ); - // debugg - this->LoadGame( "..//Content//Worlds//2ofAll_updated.bias"); - this->ChangeState( ClientState_Game ); return true; } From e00ddb30c9a606d3e9ab81c46947b942709cb79a Mon Sep 17 00:00:00 2001 From: dean11 Date: Tue, 18 Feb 2014 13:12:08 +0100 Subject: [PATCH 19/46] Fixed server-client communication --- Code/Game/GameClient/GameClient.vcxproj.user | 2 +- Code/Game/GameServer/GameLobby.h | 7 +- Code/Game/GameServer/GameServerAPI.h | 7 +- Code/Game/GameServer/GameSession.h | 4 +- .../GameServer/Implementation/GameLobby.cpp | 55 ++-- .../GameServer/Implementation/GameServer.cpp | 11 +- .../Implementation/GameSession_General.cpp | 18 +- .../StandaloneGameServerCLI.cpp | 13 +- .../StandaloneGameServerCLI.h | 3 +- .../StandAloneLauncher/Form1.Designer.cs | 271 ++++++++++-------- .../LanServer/StandAloneLauncher/Form1.cs | 13 +- 11 files changed, 234 insertions(+), 170 deletions(-) diff --git a/Code/Game/GameClient/GameClient.vcxproj.user b/Code/Game/GameClient/GameClient.vcxproj.user index 4b847ee6..2e28d6f7 100644 --- a/Code/Game/GameClient/GameClient.vcxproj.user +++ b/Code/Game/GameClient/GameClient.vcxproj.user @@ -1,7 +1,7 @@  - false + true $(OutDir) diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index 9281dcd6..7b9a46d7 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -38,7 +38,12 @@ namespace DanBias void SetGameDesc(const LobbyLevelData& desc); void GetGameDesc(LobbyLevelData& desc); - bool StartGameSession(); + /** + * If param is true, the server will start a game session regardless of clients connected. + */ + bool StartGameSession( bool forceStart ); + + int GetGameSessionClientCount(); private: void ParseProtocol(Oyster::Network::CustomNetProtocol& p, Oyster::Network::NetworkClient* c); diff --git a/Code/Game/GameServer/GameServerAPI.h b/Code/Game/GameServer/GameServerAPI.h index eb5316c4..0a5a8a88 100644 --- a/Code/Game/GameServer/GameServerAPI.h +++ b/Code/Game/GameServer/GameServerAPI.h @@ -66,8 +66,13 @@ namespace DanBias static const wchar_t* GameGetGameMode(); static const wchar_t* GameGetGameName(); static const wchar_t* GameGetMapName(); + static int GetConnectedClientCount(); - static bool GameStart(); + /* Starts a game + * @param forceStart If forceStart is true, server will start with or without clients. + * If there are clients not "ready" the will be stareted anyways. + */ + static bool GameStart(bool forceStart); };//End class DanBiasServer diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index e6c8a4f9..28e8bde3 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -44,7 +44,7 @@ namespace DanBias virtual~GameSession(); /** Initiates and creates a game session. */ - bool Create(GameDescription& desc); + bool Create(GameDescription& desc, bool forceStart); /** Runs the game session (ie starts the game loop). */ void Run(); @@ -58,7 +58,7 @@ namespace DanBias inline bool IsCreated() const { return this->isCreated; } inline bool IsRunning() const { return this->isRunning; } - operator bool() { return (this->isCreated && this->isRunning); } + operator bool() { return (this->isCreated && this->isRunning); } //Private member functions private: diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index f2467750..b95402e2 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -65,40 +65,47 @@ void GameLobby::GetGameDesc(LobbyLevelData& desc) desc.gameMode = this->description.gameMode; } -bool GameLobby::StartGameSession( ) +bool GameLobby::StartGameSession( bool forceStart ) { -//Check if all clients is ready - if(this->GetClientCount() && this->GetClientCount() == this->readyList.Size()) +//Check if all clients is ready, in not force start + if(!forceStart) { - GameSession::GameDescription desc; - desc.maxClients = this->description.maxClients; - desc.gameMode = this->description.gameMode; - desc.gameTimeMinutes = this->description.gameTimeInMinutes; - //desc.mapName = this->description.mapNumber; - desc.owner = this; - desc.clients = this->gClients; + if(!this->GetClientCount()) + { /*None connected*/ return false;} + else if( this->GetClientCount() != this->readyList.Size() ) + { /*Not enough connected*/ return false; } + } - if(desc.gameTimeMinutes == 0) - desc.gameTimeMinutes = 10; //note: should be fetched from somewhere. + GameSession::GameDescription desc; + desc.maxClients = this->description.maxClients; + desc.gameMode = this->description.gameMode; + desc.gameTimeMinutes = this->description.gameTimeInMinutes; + desc.mapName = this->description.mapName; + desc.owner = this; + desc.clients = this->gClients; - if(desc.maxClients == 0) - desc.maxClients = 10; //note: should be fetched somewhere else.. + if(desc.gameTimeMinutes == 0) + desc.gameTimeMinutes = 10; //note: should be fetched from somewhere. - this->gClients.Clear(); //Remove clients from lobby list + if(desc.maxClients == 0) + desc.maxClients = 10; //note: should be fetched somewhere else.. + + this->gClients.Clear(); //Remove clients from lobby list - if(this->gameSession.Create(desc)) - { - this->gameSession.Run(); - - return true; - } - } - else + if(this->gameSession.Create(desc, forceStart)) { - //? + this->gameSession.Run(); + + return true; } + + return false; } +int GameLobby::GetGameSessionClientCount() +{ + return this->gameSession.GetClientCount(); +} void GameLobby::ClientEventCallback(NetEvent e) { diff --git a/Code/Game/GameServer/Implementation/GameServer.cpp b/Code/Game/GameServer/Implementation/GameServer.cpp index 8fbf2111..f003fc50 100644 --- a/Code/Game/GameServer/Implementation/GameServer.cpp +++ b/Code/Game/GameServer/Implementation/GameServer.cpp @@ -184,12 +184,15 @@ const wchar_t* GameServerAPI::GameGetGameName() lobby.GetGameDesc(d); return d.gameName.c_str(); } - -bool GameServerAPI::GameStart() +int GameServerAPI::GetConnectedClientCount() { - if(lobby.StartGameSession()) + return lobby.GetGameSessionClientCount(); +} + +bool GameServerAPI::GameStart( bool forceStart ) +{ + if(lobby.StartGameSession( forceStart )) { - return true; } return false; diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 43f088dd..07d2dcd4 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -54,13 +54,13 @@ GameSession::~GameSession() this->isRunning = false; } -bool GameSession::Create(GameDescription& desc) +bool GameSession::Create(GameDescription& desc, bool forceStart) { this->description = desc; /* Do some error checking */ - if(desc.clients.Size() == 0) return false; - if(!desc.owner) return false; - if(this->isCreated) return false; + if(!forceStart && desc.clients.Size() == 0) return false; + if(!desc.owner) return false; + if(this->isCreated) return false; /* standard initialization of some data */ this->gClients.Resize((unsigned int)desc.maxClients); @@ -125,12 +125,10 @@ void GameSession::Run() { if(this->isRunning) return; - if(this->clients.Size() > 0) - { - this->worker.Start(); - this->worker.SetPriority(OYSTER_THREAD_PRIORITY_1); - this->isRunning = true; - } + this->worker.Start(); + this->worker.SetPriority(OYSTER_THREAD_PRIORITY_1); + this->isRunning = true; + } void GameSession::ThreadEntry( ) diff --git a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp index 0c913a56..1065a28a 100644 --- a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp +++ b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.cpp @@ -120,7 +120,14 @@ String^ StandaloneGameServerCLI::GameGetGameName() return gcnew String( DanBias::GameServerAPI::GameGetGameName()); } -bool StandaloneGameServerCLI::GameStart() +bool StandaloneGameServerCLI::GameStart(bool f) { - return DanBias::GameServerAPI::GameStart(); -} \ No newline at end of file + return DanBias::GameServerAPI::GameStart(f); +} +int StandaloneGameServerCLI::GetClientsConnectedCount() +{ + return DanBias::GameServerAPI::GetConnectedClientCount(); +} + + + diff --git a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h index d71a23b8..576a7433 100644 --- a/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h +++ b/Code/Game/LanServer/CLIStandaloneServer/StandaloneGameServerCLI.h @@ -57,7 +57,8 @@ namespace System { namespace Windows { namespace Interop System::String^ GameGetMapName(); System::String^ GameGetGameMode(); System::String^ GameGetGameName(); - bool GameStart(); + bool GameStart( bool forceStart ); + int GetClientsConnectedCount(); }; } } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs index df569295..103a047f 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs @@ -36,30 +36,32 @@ this.label_listenPort = new System.Windows.Forms.Label(); this.panel_serverOptions = new System.Windows.Forms.Panel(); this.panel_commands = new System.Windows.Forms.Panel(); + this.mapName = new System.Windows.Forms.TextBox(); + this.timeLimit = new System.Windows.Forms.NumericUpDown(); + this.gameModes = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.forceStart = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.nrOfClients = new System.Windows.Forms.NumericUpDown(); + this.buttonStartGame = new System.Windows.Forms.Button(); this.panel_clientArea = new System.Windows.Forms.Panel(); this.ServerInfoTextArea = new System.Windows.Forms.RichTextBox(); this.splitter1 = new System.Windows.Forms.Splitter(); this.clientInfoBox = new System.Windows.Forms.ListBox(); - this.buttonStartGame = new System.Windows.Forms.Button(); - this.nrOfClients = new System.Windows.Forms.NumericUpDown(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.gameModes = new System.Windows.Forms.ComboBox(); - this.timeLimit = new System.Windows.Forms.NumericUpDown(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.mapName = new System.Windows.Forms.TextBox(); + this.labelClientsConnected = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.listenPort)).BeginInit(); this.panel_serverOptions.SuspendLayout(); this.panel_commands.SuspendLayout(); - this.panel_clientArea.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.timeLimit)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).BeginInit(); + this.panel_clientArea.SuspendLayout(); this.SuspendLayout(); // // serverToggle // - this.serverToggle.Location = new System.Drawing.Point(9, 81); + this.serverToggle.Location = new System.Drawing.Point(9, 106); this.serverToggle.Name = "serverToggle"; this.serverToggle.Size = new System.Drawing.Size(75, 23); this.serverToggle.TabIndex = 0; @@ -111,7 +113,7 @@ this.listenPort.Size = new System.Drawing.Size(95, 20); this.listenPort.TabIndex = 5; this.listenPort.Value = new decimal(new int[] { - 2048, + 15151, 0, 0, 0}); @@ -135,7 +137,7 @@ this.panel_serverOptions.Controls.Add(this.label_serverName); this.panel_serverOptions.Location = new System.Drawing.Point(12, 12); this.panel_serverOptions.Name = "panel_serverOptions"; - this.panel_serverOptions.Size = new System.Drawing.Size(183, 113); + this.panel_serverOptions.Size = new System.Drawing.Size(183, 141); this.panel_serverOptions.TabIndex = 6; // // panel_commands @@ -144,17 +146,137 @@ this.panel_commands.Controls.Add(this.timeLimit); this.panel_commands.Controls.Add(this.gameModes); this.panel_commands.Controls.Add(this.label3); + this.panel_commands.Controls.Add(this.forceStart); this.panel_commands.Controls.Add(this.label2); this.panel_commands.Controls.Add(this.label4); + this.panel_commands.Controls.Add(this.labelClientsConnected); this.panel_commands.Controls.Add(this.label1); this.panel_commands.Controls.Add(this.nrOfClients); this.panel_commands.Controls.Add(this.buttonStartGame); - this.panel_commands.Location = new System.Drawing.Point(12, 131); + this.panel_commands.Location = new System.Drawing.Point(12, 159); this.panel_commands.Name = "panel_commands"; - this.panel_commands.Size = new System.Drawing.Size(183, 230); + this.panel_commands.Size = new System.Drawing.Size(183, 202); this.panel_commands.TabIndex = 7; this.panel_commands.Visible = false; // + // mapName + // + this.mapName.Location = new System.Drawing.Point(78, 7); + this.mapName.Name = "mapName"; + this.mapName.Size = new System.Drawing.Size(98, 20); + this.mapName.TabIndex = 12; + this.mapName.Text = "Unknown"; + // + // timeLimit + // + this.timeLimit.Location = new System.Drawing.Point(109, 94); + this.timeLimit.Minimum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.timeLimit.Name = "timeLimit"; + this.timeLimit.Size = new System.Drawing.Size(68, 20); + this.timeLimit.TabIndex = 11; + this.timeLimit.ThousandsSeparator = true; + this.timeLimit.Value = new decimal(new int[] { + 15, + 0, + 0, + 0}); + // + // gameModes + // + this.gameModes.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.gameModes.FormattingEnabled = true; + this.gameModes.Items.AddRange(new object[] { + "Free-for-all", + "Team death-match"}); + this.gameModes.Location = new System.Drawing.Point(78, 66); + this.gameModes.Name = "gameModes"; + this.gameModes.Size = new System.Drawing.Size(99, 21); + this.gameModes.TabIndex = 10; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(8, 96); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(95, 13); + this.label3.TabIndex = 9; + this.label3.Text = "Time limit (minutes)"; + // + // forceStart + // + this.forceStart.AutoSize = true; + this.forceStart.Checked = true; + this.forceStart.CheckState = System.Windows.Forms.CheckState.Checked; + this.forceStart.Location = new System.Drawing.Point(12, 120); + this.forceStart.Name = "forceStart"; + this.forceStart.Size = new System.Drawing.Size(115, 17); + this.forceStart.TabIndex = 1; + this.forceStart.Text = "Ignore empty lobby"; + this.forceStart.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(8, 69); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(64, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Game mode"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(9, 15); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(57, 13); + this.label4.TabIndex = 8; + this.label4.Text = "Map name"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(8, 38); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(53, 13); + this.label1.TabIndex = 8; + this.label1.Text = "Client limit"; + // + // nrOfClients + // + this.nrOfClients.Location = new System.Drawing.Point(78, 36); + this.nrOfClients.Maximum = new decimal(new int[] { + 20, + 0, + 0, + 0}); + this.nrOfClients.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.nrOfClients.Name = "nrOfClients"; + this.nrOfClients.Size = new System.Drawing.Size(39, 20); + this.nrOfClients.TabIndex = 7; + this.nrOfClients.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // buttonStartGame + // + this.buttonStartGame.Location = new System.Drawing.Point(9, 176); + this.buttonStartGame.Name = "buttonStartGame"; + this.buttonStartGame.Size = new System.Drawing.Size(75, 23); + this.buttonStartGame.TabIndex = 6; + this.buttonStartGame.Text = "Start game"; + this.buttonStartGame.UseVisualStyleBackColor = true; + this.buttonStartGame.Click += new System.EventHandler(this.buttonStartGame_Click); + // // panel_clientArea // this.panel_clientArea.Controls.Add(this.ServerInfoTextArea); @@ -197,110 +319,14 @@ this.clientInfoBox.Size = new System.Drawing.Size(303, 147); this.clientInfoBox.TabIndex = 0; // - // buttonStartGame + // labelClientsConnected // - this.buttonStartGame.Location = new System.Drawing.Point(53, 195); - this.buttonStartGame.Name = "buttonStartGame"; - this.buttonStartGame.Size = new System.Drawing.Size(75, 23); - this.buttonStartGame.TabIndex = 6; - this.buttonStartGame.Text = "Start game"; - this.buttonStartGame.UseVisualStyleBackColor = true; - this.buttonStartGame.Click += new System.EventHandler(this.buttonStartGame_Click); - // - // nrOfClients - // - this.nrOfClients.Location = new System.Drawing.Point(78, 36); - this.nrOfClients.Maximum = new decimal(new int[] { - 20, - 0, - 0, - 0}); - this.nrOfClients.Minimum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.nrOfClients.Name = "nrOfClients"; - this.nrOfClients.Size = new System.Drawing.Size(39, 20); - this.nrOfClients.TabIndex = 7; - this.nrOfClients.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(8, 38); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(53, 13); - this.label1.TabIndex = 8; - this.label1.Text = "Client limit"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 69); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(64, 13); - this.label2.TabIndex = 9; - this.label2.Text = "Game mode"; - // - // gameModes - // - this.gameModes.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.gameModes.FormattingEnabled = true; - this.gameModes.Items.AddRange(new object[] { - "Free-for-all", - "Team death-match"}); - this.gameModes.Location = new System.Drawing.Point(78, 66); - this.gameModes.Name = "gameModes"; - this.gameModes.Size = new System.Drawing.Size(99, 21); - this.gameModes.TabIndex = 10; - // - // timeLimit - // - this.timeLimit.Location = new System.Drawing.Point(109, 94); - this.timeLimit.Minimum = new decimal(new int[] { - 5, - 0, - 0, - 0}); - this.timeLimit.Name = "timeLimit"; - this.timeLimit.Size = new System.Drawing.Size(68, 20); - this.timeLimit.TabIndex = 11; - this.timeLimit.ThousandsSeparator = true; - this.timeLimit.Value = new decimal(new int[] { - 5, - 0, - 0, - 0}); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(8, 96); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(95, 13); - this.label3.TabIndex = 9; - this.label3.Text = "Time limit (minutes)"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(9, 15); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(57, 13); - this.label4.TabIndex = 8; - this.label4.Text = "Map name"; - // - // mapName - // - this.mapName.Location = new System.Drawing.Point(78, 7); - this.mapName.Name = "mapName"; - this.mapName.Size = new System.Drawing.Size(98, 20); - this.mapName.TabIndex = 12; + this.labelClientsConnected.AutoSize = true; + this.labelClientsConnected.Location = new System.Drawing.Point(9, 149); + this.labelClientsConnected.Name = "labelClientsConnected"; + this.labelClientsConnected.Size = new System.Drawing.Size(104, 13); + this.labelClientsConnected.TabIndex = 8; + this.labelClientsConnected.Text = "Clients connected: 0"; // // Form1 // @@ -312,14 +338,15 @@ this.Controls.Add(this.panel_serverOptions); this.Name = "Form1"; this.Text = "Form1"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormClosingEvent); ((System.ComponentModel.ISupportInitialize)(this.listenPort)).EndInit(); this.panel_serverOptions.ResumeLayout(false); this.panel_serverOptions.PerformLayout(); this.panel_commands.ResumeLayout(false); this.panel_commands.PerformLayout(); - this.panel_clientArea.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.timeLimit)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).EndInit(); + this.panel_clientArea.ResumeLayout(false); this.ResumeLayout(false); } @@ -347,6 +374,8 @@ private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox mapName; + private System.Windows.Forms.CheckBox forceStart; + private System.Windows.Forms.Label labelClientsConnected; } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.cs index 1240c333..28a83c72 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.cs @@ -20,7 +20,7 @@ namespace StandAloneLauncher public Form1() { InitializeComponent(); - + this.gameModes.SelectedIndex = 0; } @@ -38,6 +38,7 @@ namespace StandAloneLauncher //Do some stuff this.gameServer.ServerUpdate(); + this.labelClientsConnected.Text = "Clients connected: " + this.gameServer.GetClientsConnectedCount().ToString(); } } @@ -89,7 +90,7 @@ namespace StandAloneLauncher this.gameServer.GameSetGameTime((int)this.timeLimit.Value); //this.gameServer.GameSetMapId(0); this.gameServer.GameSetMaxClients((int)this.nrOfClients.Value); - if (!this.gameServer.GameStart()) + if (!this.gameServer.GameStart( this.forceStart.Checked )) { this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to start the game session!\n"); } @@ -98,5 +99,13 @@ namespace StandAloneLauncher this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Game session started!\n"); } } + + private void FormClosingEvent(object sender, FormClosingEventArgs e) + { + if (serverIsRunning) + { + this.gameServer.ServerStop(); + } + } } } From 3f4038a12daebcc5bcd060b7404de17311a1528f Mon Sep 17 00:00:00 2001 From: lanariel Date: Tue, 18 Feb 2014 13:43:32 +0100 Subject: [PATCH 20/46] Backface change and enable render wireframe --- Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 1 + Code/OysterGraphics/Render/Resources.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index bdfa0bde..96e2bbe2 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -197,6 +197,7 @@ namespace Oyster void API::StartRenderWireFrame() { Core::deviceContext->RSSetState(wire); + Core::deviceContext->OMSetRenderTargets(Render::Resources::Gather::Pass.RTV.size(),&Render::Resources::Gather::Pass.RTV[0],NULL); } void API::RenderDebugCube(Math::Matrix world) diff --git a/Code/OysterGraphics/Render/Resources.cpp b/Code/OysterGraphics/Render/Resources.cpp index 514960cf..124b1bf1 100644 --- a/Code/OysterGraphics/Render/Resources.cpp +++ b/Code/OysterGraphics/Render/Resources.cpp @@ -338,8 +338,8 @@ namespace Oyster dTDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; dTDesc.CPUAccessFlags=0; dTDesc.MiscFlags=0; - dTDesc.Height = Core::resolution.y; - dTDesc.Width = Core::resolution.x; + dTDesc.Height = (UINT)Core::resolution.y; + dTDesc.Width = (UINT)Core::resolution.x; dTDesc.SampleDesc.Count=1; dTDesc.SampleDesc.Quality=0; From be8b7537b5e570569fc5a1e51b956e3b9e3b68e0 Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Tue, 18 Feb 2014 13:47:40 +0100 Subject: [PATCH 21/46] GL - merging --- Code/Game/GameLogic/CollisionManager.cpp | 6 +++--- Code/Game/GameLogic/Game_LevelData.cpp | 4 +++- Code/Game/GameLogic/Game_PlayerData.cpp | 2 -- Code/Game/GameLogic/Level.cpp | 14 +++++++------- Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp | 2 +- Code/Game/GameLogic/Player.cpp | 4 ++-- .../GamePhysics/Implementation/SimpleRigidBody.cpp | 4 ++-- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 0b817975..5d1a95ec 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -170,12 +170,12 @@ using namespace GameLogic; void PlayerVLethalObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss, Oyster::Math::Float ExtraDamage) { - int damageDone = 0; - int forceThreashHold = 200000; + Oyster::Math::Float damageDone = 0; + Oyster::Math::Float forceThreashHold = 200000; if(kineticEnergyLoss > forceThreashHold) //should only take damage if the force is high enough { - damageDone = (int)(kineticEnergyLoss * 0.10f); + damageDone = (kineticEnergyLoss * 0.10f); damageDone += ExtraDamage; //player.DamageLife(damageDone); } diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index 80220d5f..e82a3834 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -54,8 +54,10 @@ IObjectData* Game::LevelData::GetObjectAt(int ID) const void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const { - for(int i = 0; i < level->dynamicObjects.Size(); i++) + + for(int i = 0; i < (int)level->dynamicObjects.Size(); i++) { mem[i] = level->dynamicObjects[i]; } + } \ No newline at end of file diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index 1b725b02..e7a77bbd 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -27,9 +27,7 @@ Game::PlayerData::PlayerData() } Game::PlayerData::PlayerData(int playerID,int teamID) { - Oyster::Physics::ICustomBody* rigidBody; this->player = new Player(); - } Game::PlayerData::~PlayerData() { diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 030f0eca..4d3cf703 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -63,9 +63,9 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_RedExplosiveBox: { - int dmg = 50; + Oyster::Math::Float dmg = 50; Oyster::Math::Float force = 50; - int radie = 50; + Oyster::Math::Float radie = 50; gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie); } break; @@ -353,7 +353,7 @@ void Level::InitiateLevel(float radius) int offset = 0; for(int i =0; i< nrOfBoxex; i ++) { - rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(0, 605 + i*5, 10), 5, 0.5f, 0.8f, 0.6f); + rigidBody_TestBox = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0.0f, 0.0f, 0.0f, 1.0f), Oyster::Math::Float3(0.0f, 605.0f + i*5.0f, 10.0f), 5.0f, 0.5f, 0.8f, 0.6f); this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox, Object::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++)); } @@ -385,16 +385,16 @@ void Level::InitiateLevel(float radius) }*/ // add crystal - ICustomBody* rigidBody_Crystal = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(10, 605, 0), 5, 0.5f, 0.8f, 0.6f); + ICustomBody* rigidBody_Crystal = API::Instance().AddCollisionBox(Oyster::Math::Float3(0.5f, 0.5f, 0.5f), Oyster::Math::Float4(0.0f, 0.0f, 0.0f, 1.0f), Oyster::Math::Float3(10.0f, 605.0f, 0.0f), 5.0f, 0.5f, 0.8f, 0.6f); this->dynamicObjects.Push(new DynamicObject(rigidBody_Crystal, Object::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++)); // add house - ICustomBody* rigidBody_House =API::Instance().AddCollisionBox(Oyster::Math::Float3(20, 20, 20), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(-50, 590, 0), 0, 0.5f, 0.8f, 0.6f); + ICustomBody* rigidBody_House =API::Instance().AddCollisionBox(Oyster::Math::Float3(20.0f, 20.0f, 20.0f), Oyster::Math::Float4(0.0f, 0.0f, 0.0f, 1.0f), Oyster::Math::Float3(-50.0f, 590.0f, 0.0f), 0.0f, 0.5f, 0.8f, 0.6f); this->staticObjects.Push(new StaticObject(rigidBody_House, Object::DefaultCollisionAfter, ObjectSpecialType_Generic, idCount++)); // add jumppad - ICustomBody* rigidBody_Jumppad = API::Instance().AddCollisionBox(Oyster::Math::Float3(1, 1, 1), Oyster::Math::Float4(0, 0, 0, 1), Oyster::Math::Float3(4, 600.3, 0), 5, 0.5f, 0.8f, 0.6f); + ICustomBody* rigidBody_Jumppad = API::Instance().AddCollisionBox(Oyster::Math::Float3(1.0f, 1.0f, 1.0f), Oyster::Math::Float4(0.0f, 0.0f, 0.0f, 1.0f), Oyster::Math::Float3(4.0f, 600.3f, 0.0f), 5.0f, 0.5f, 0.8f, 0.6f); this->staticObjects.Push(new JumpPad(rigidBody_Jumppad, ObjectSpecialType_JumpPad,idCount++ ,Oyster::Math::Float3(0,2000,0))); } @@ -419,7 +419,7 @@ int Level::getNrOfDynamicObj() } Object* Level::GetObj( int ID) const { - for (int i = 0; i < this->dynamicObjects.Size(); i++) + for (int i = 0; i < (int)this->dynamicObjects.Size(); i++) { if(this->dynamicObjects[i]->GetID() == ID) return this->dynamicObjects[i]; diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp index 826a52be..dfee72a7 100644 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp +++ b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp @@ -119,7 +119,7 @@ namespace GameLogic int temp; - for(int i = 0; i < tempSize; i++) + for(int i = 0; i < (int)tempSize; i++) { memcpy(&temp, &buffer[start], 4); start += 4; diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 79f34245..80969b29 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -90,7 +90,7 @@ void Player::BeginFrame() forwardDir.Normalize(); rightDir.Normalize(); Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0); - Oyster::Math::Float walkSpeed = this->moveSpeed*0.2; + Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f; if (key_forward > 0.001) { @@ -122,7 +122,7 @@ void Player::BeginFrame() if (key_forward <= 0.001 && key_backward <= 0.001 && key_strafeRight <= 0.001 && key_strafeLeft <= 0.001 && key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.7f) { /* Dampen when on the ground and not being moved by the player */ - linearVelocity *= 0.2; + linearVelocity *= 0.2f; this->rigidBody->SetLinearVelocity (linearVelocity); } else diff --git a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp index f7cf6cce..4cdb282d 100644 --- a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp +++ b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp @@ -300,11 +300,11 @@ Float4x4 SimpleRigidBody::GetView( const ::Oyster::Math::Float3 &offset ) const Float3 SimpleRigidBody::GetGravity() const { - return this->rigidBody->getGravity(); + return (Float3)this->rigidBody->getGravity(); } Float3 SimpleRigidBody::GetLinearVelocity() const { - return this->rigidBody->getLinearVelocity(); + return (Float3)this->rigidBody->getLinearVelocity(); } From e72f2224be66a3c9fa02193107c23b1afdb568be Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Tue, 18 Feb 2014 14:09:18 +0100 Subject: [PATCH 22/46] Removed Misc\Misc from additionalDependencies. --- Code/Game/GameClient/GameClient.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index 0691fef1..8e2cfe69 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -111,7 +111,7 @@ Windows true - Misc\Misc_$(PlatformShortName)D.lib;WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) + WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -128,7 +128,7 @@ Windows true - Misc\Misc_$(PlatformShortName)D.lib;WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) + WindowManager\WindowManager_$(PlatformShortName)D.lib;OysterGraphics_$(PlatformShortName)D.lib;Input\Input_$(PlatformShortName)D.lib;%(AdditionalDependencies) NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -149,7 +149,7 @@ true true true - Misc\Misc_$(PlatformShortName).lib;WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) + WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) @@ -170,7 +170,7 @@ true true true - Misc\Misc_$(PlatformShortName).lib;WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) + WindowManager\WindowManager_$(PlatformShortName).lib;OysterGraphics_$(PlatformShortName).lib;Input\Input_$(PlatformShortName).lib;%(AdditionalDependencies) NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) From 86ef521abd7422d435fea25e290e20869af8f833 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Tue, 18 Feb 2014 14:10:12 +0100 Subject: [PATCH 23/46] LevelLoader - Added new CollisionGeometry_TriangleMesh. --- Code/Game/GameLogic/LevelLoader/ObjectDefines.h | 16 ++++++++++++++++ .../GameLogic/LevelLoader/ParseFunctions.cpp | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h b/Code/Game/GameLogic/LevelLoader/ObjectDefines.h index 01d17c3e..131b2938 100644 --- a/Code/Game/GameLogic/LevelLoader/ObjectDefines.h +++ b/Code/Game/GameLogic/LevelLoader/ObjectDefines.h @@ -52,6 +52,7 @@ namespace GameLogic CollisionGeometryType_Box, CollisionGeometryType_Sphere, CollisionGeometryType_Cylinder, + CollisionGeometryType_TriangleMesh, CollisionGeometryType_Count, CollisionGeometryType_Unknown = -1 @@ -161,6 +162,12 @@ namespace GameLogic float radius; }; + struct BoundingVolumeTriangleMesh : public BoundingVolumeBase + { + //Null terminated + wchar_t* filename; + }; + struct BoundingVolume { CollisionGeometryType geoType; @@ -169,7 +176,16 @@ namespace GameLogic LevelLoaderInternal::BoundingVolumeBox box; LevelLoaderInternal::BoundingVolumeSphere sphere; LevelLoaderInternal::BoundingVolumeCylinder cylinder; + LevelLoaderInternal::BoundingVolumeTriangleMesh triangleMesh; }; + + virtual ~BoundingVolume() + { + if(geoType == CollisionGeometryType_TriangleMesh) + { + delete[] triangleMesh.filename; + } + } }; } diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp index dfee72a7..daa62752 100644 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp +++ b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp @@ -175,6 +175,17 @@ namespace GameLogic start += sizeof(volume.cylinder); break; + case CollisionGeometryType_TriangleMesh: + //Get string size + memcpy(&tempSize, &buf[start], sizeof(tempSize)); + start += sizeof(tempSize); + + //Get actual string + volume.triangleMesh.filename = new wchar_t[tempSize+1]; + memcpy(volume.triangleMesh.filename, &buf[start], tempSize); + volume.triangleMesh.filename[tempSize] = '\0'; + break; + default: break; } From 3218e7b8470481ed2bb3605b6eda19c8fb0c70df Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 15:08:47 +0100 Subject: [PATCH 24/46] Connect to Dennis --- Code/Game/GameClient/GameClientState/LanMenuState.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 6d3d991b..11ca95da 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -60,7 +60,8 @@ bool LanMenuState::Init( SharedStateContent &shared ) // create guiElements this->privData->connectIP = new TextField( L"color_white.png", Float4(1.0f), Float4(0.0f), this, Float3(0.5f, 0.3f, 0.5f), Float2(0.8f, 0.09f), ResizeAspectRatio_None ); this->privData->connectIP->ReserveLines( 1 ); - this->privData->connectIP->AppendText( L"127.0.0.1" ); + //this->privData->connectIP->AppendText( L"127.0.0.1" ); + this->privData->connectIP->AppendText( L"194.47.150.206" ); // HACK: connecting to Dennis's server this->privData->connectIP->SetFontHeight( 0.08f ); this->privData->connectIP->SetLineSpacing( 0.005f ); this->privData->connectIP->SetTopAligned(); From 996f66099054910769a7a2cbff25132055bbdd9a Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 15:09:01 +0100 Subject: [PATCH 25/46] Fixes and bugtraps --- Code/Game/GameClient/GameClientState/GameState.cpp | 10 +++++++--- Code/Game/GameClient/GameClientState/NetLoadState.cpp | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 7118191e..3576ae65 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -146,7 +146,8 @@ bool GameState::Render() auto dynamicObject = this->privData->dynamicObjects->begin(); for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) { - dynamicObject->second->Render(); + if( dynamicObject->second ) + dynamicObject->second->Render(); } Oyster::Graphics::API::EndFrame(); @@ -366,8 +367,11 @@ void GameState::DataRecieved( NetEventprivData->dynamicObjects)[decoded.object_ID]; - object->setPos( position ); - object->setRot( rotation ); + if( object ) + { + object->setPos( position ); + object->setRot( rotation ); + } } break; case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */ diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index d120cac2..9a88072c 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -101,13 +101,17 @@ void NetLoadState::DataRecieved( NetEventChangeState( ClientState_Game ); this->privData->loading = false; } + else + { // HACK: Debug trap + const char *breakPoint = "Being greedy."; + } } void NetLoadState::LoadGame( const ::std::string &fileName ) { this->privData->loading = true; - LevelLoader loader; + LevelLoader loader( "..\\Content\\Worlds\\" ); auto objects = loader.LoadLevel( fileName ); auto object = objects.begin(); ObjectTypeHeader *oth; From 22f9daf0d8d03c5ce74f92903abecdc7a0a7a890 Mon Sep 17 00:00:00 2001 From: dean11 Date: Tue, 18 Feb 2014 16:38:08 +0100 Subject: [PATCH 26/46] Connection between server and client is stable --- Code/Game/GameLogic/Game_LevelData.cpp | 1 + Code/Game/GameServer/GameClient.h | 13 +++- Code/Game/GameServer/GameLobby.h | 3 + .../GameServer/Implementation/GameClient.cpp | 11 ++- .../GameServer/Implementation/GameLobby.cpp | 14 ++-- .../GameLobby_ProtocolParser.cpp | 71 +++++++++++++------ .../Implementation/GameSession_Gameplay.cpp | 4 +- .../Implementation/GameSession_General.cpp | 12 ++-- .../StandAloneLauncher/Form1.Designer.cs | 63 +++++++++------- .../LanServer/StandAloneLauncher/Form1.cs | 10 +-- .../Utilities/Resource/OResourceHandler.cpp | 2 + Code/Network/NetworkAPI/NetworkClient.cpp | 4 ++ 12 files changed, 141 insertions(+), 67 deletions(-) diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index 80220d5f..62fb3cc5 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -54,6 +54,7 @@ IObjectData* Game::LevelData::GetObjectAt(int ID) const void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const { + mem.Resize(level->dynamicObjects.Size()); for(int i = 0; i < level->dynamicObjects.Size(); i++) { mem[i] = level->dynamicObjects[i]; diff --git a/Code/Game/GameServer/GameClient.h b/Code/Game/GameServer/GameClient.h index 422df933..6fcf6b05 100644 --- a/Code/Game/GameServer/GameClient.h +++ b/Code/Game/GameServer/GameClient.h @@ -17,6 +17,13 @@ namespace DanBias */ class GameClient { + public: + enum ClientState + { + ClientState_CreatingGame, + ClientState_Ready, + }; + public: GameClient(Utility::DynamicMemory::SmartPointer nwClient); virtual~GameClient(); @@ -33,6 +40,7 @@ namespace DanBias inline bool IsReady() const { return this->isReady; } inline GameLogic::IPlayerData* GetPlayer() const { return this->player; } Oyster::Network::NetClient GetClient() const { return this->client; } + ClientState GetState() const { return this->state; } void SetPlayer(GameLogic::IPlayerData* player); @@ -40,6 +48,7 @@ namespace DanBias void SetAlias(std::wstring alias); void SetCharacter(std::wstring character); void SetSinceLastResponse(float seconds); + void SetState(ClientState state); GameLogic::IPlayerData* ReleasePlayer(); Oyster::Network::NetClient ReleaseClient(); @@ -50,13 +59,15 @@ namespace DanBias private: GameLogic::IPlayerData* player; - Utility::DynamicMemory::SmartPointer client; + Oyster::Network::NetClient client; bool isReady; float secondsSinceLastResponse; std::wstring alias; std::wstring character; + + ClientState state; }; }//End namespace DanBias diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index 7b9a46d7..f62baa63 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -58,6 +58,9 @@ namespace DanBias void LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_ClientReadyState: void LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_QuerryGameType: + private: + int FindClient(Oyster::Network::NetworkClient* c); + private: void ClientEventCallback(Oyster::Network::NetEvent e) override; void ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) override; diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index 7ef4a338..81066450 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -50,6 +50,10 @@ void GameClient::SetCharacter(std::wstring character) { this->character = character; } +void GameClient::SetState(ClientState state) +{ + this->state = state; +} void GameClient::SetOwner(Oyster::Network::NetworkSession* owner) @@ -58,7 +62,12 @@ void GameClient::SetOwner(Oyster::Network::NetworkSession* owner) } void GameClient::UpdateClient() { - this->client->Update(); + switch (this->state) + { + case ClientState_Ready: + this->client->Update(); + break; + } } diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index b95402e2..cadfa53a 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -17,7 +17,7 @@ GameLobby::GameLobby() { } GameLobby::~GameLobby() { - this->clients.Clear(); + this->gClients.Clear(); } void GameLobby::Release() { @@ -26,11 +26,11 @@ void GameLobby::Release() } void GameLobby::Update() { - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]) + if(this->gClients[i]) { - this->clients[i]->Update(); + this->gClients[i]->GetClient()->Update(); } } } @@ -119,7 +119,7 @@ void GameLobby::ClientEventCallback(NetEventGetID(), e.sender->GetIpAddress().c_str()); - e.sender->Disconnect(); + //e.sender->Disconnect(); //this->readyList.Remove(e.sender); //this->gClients.Remove(e.sender); break; @@ -184,7 +184,9 @@ void GameLobby::ProcessClients() } bool GameLobby::Attach(Utility::DynamicMemory::SmartPointer client) { - if(this->clientCount = this->description.maxClients) return false; + if(this->clientCount == this->description.maxClients) return false; + + client->SetOwner(this); bool added = false; for (unsigned int i = 0; i < this->gClients.Size(); i++) diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index ebcfb8bf..2c4f148a 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -40,26 +40,46 @@ void GameLobby::GeneralStatus(GameLogic::Protocol_General_Status& p, Oyster::Net { case Protocol_General_Status::States_ready: { - + int temp = FindClient(c); + if(temp != -1 ) + { + switch (this->gClients[temp]->GetState()) + { + case GameClient::ClientState_CreatingGame: + { + this->gameSession.Join(this->gClients[temp]); + this->gClients[temp] = 0; + } + break; + } + } + else + { + c->Disconnect(); + } } + break; case Protocol_General_Status::States_idle: { } + break; case Protocol_General_Status::States_leave: + break; case Protocol_General_Status::States_disconected: { Detach(c)->Disconnect(); } + break; } } void GameLobby::GeneralText(GameLogic::Protocol_General_Text& p, Oyster::Network::NetworkClient* c) { - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->clients[i]) + if(this->gClients[i]) { - this->clients[i]->Send(p); + this->gClients[i]->GetClient()->Send(p); } } printf(p.text.c_str()); @@ -69,9 +89,9 @@ void GameLobby::LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Ne if(this->sessionOwner->GetClient()->GetID() == c->GetID()) { //Send countdown timer before lobby shuts down - for (unsigned int i = 0; i < this->clients.Size(); i++) + for (unsigned int i = 0; i < this->gClients.Size(); i++) { - this->clients[i]->Send(Protocol_LobbyStartGame(3.0f)); + this->gClients[i]->GetClient()->Send(Protocol_LobbyStartGame(3.0f)); } } else @@ -118,32 +138,41 @@ void GameLobby::LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyste { if(this->gameSession) { - gClient temp; - bool found = false; - - //find client in waiting list - for (unsigned int i = 0; !found && i < this->clients.Size(); i++) - { - if(this->gClients[i]->GetClient()->GetID() == c->GetID()) - { - temp = this->gClients[i]; - found = true; - } - } + int temp = FindClient(c); //Something is wrong - if(!found) + if(temp == -1) { c->Disconnect(); } else { //Send game data - this->gameSession.Join(temp); + Protocol_LobbyCreateGame lcg((char)1, (char)0, Utility::String::WStringToString(this->description.mapName, std::string())); + c->Send(lcg); + this->gClients[temp]->SetState(GameClient::ClientState_CreatingGame); } } else { - + // Nothing.- } } + + +int GameLobby::FindClient(Oyster::Network::NetworkClient* c) +{ + int temp = -1; + + //find client in waiting list + for (unsigned int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i]->GetClient()->GetID() == c->GetID()) + { + temp = i; + break; + } + } + + return temp; +} \ No newline at end of file diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 61ccf9c8..6a9c09c2 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -45,7 +45,7 @@ using namespace DanBias; //Find the idiot for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->gClients[i]->Equals(e.sender)) + if(this->gClients[i] && this->gClients[i]->Equals(e.sender)) { temp = i; } @@ -78,7 +78,7 @@ using namespace DanBias; { for (unsigned int i = 0; i < this->gClients.Size(); i++) { - if(this->gClients[i]) + if(this->gClients[i] ) { this->gClients[i]->UpdateClient(); } diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 07d2dcd4..8b5bd8cb 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -199,18 +199,12 @@ bool GameSession::Join(gClient gameClient) gameClient->SetPlayer(playerData); NetworkClient* nwClient = gameClient->GetClient(); - -// Send the level information - { - Protocol_LobbyCreateGame lcg((char)1, (char)0, Utility::String::WStringToString(this->description.mapName, std::string())); - nwClient->Send(lcg); - } // Send the player data only { Protocol_ObjectCreatePlayer oc( playerData->GetPosition(), playerData->GetRotation(), playerData->GetScale(), playerData->GetID(), true, playerData->GetTeamID(), - /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + /*nwClient->GetAlias()*/"Unknown", /*playerData->GetMesh()*/"char_white.dan"); nwClient->Send(oc); } @@ -223,7 +217,7 @@ bool GameSession::Join(gClient gameClient) IPlayerData* temp = this->gClients[i]->GetPlayer(); Protocol_ObjectCreatePlayer oc( temp->GetPosition(), temp->GetRotation(), temp->GetScale(), temp->GetID(), false, temp->GetTeamID(), - /*nwClient->GetAlias()*/"", /*playerData->GetMesh()*/"char_white.dan"); + /*nwClient->GetAlias()*/"Unknown", /*playerData->GetMesh()*/"char_white.dan"); nwClient->Send(oc); } } @@ -259,6 +253,8 @@ bool GameSession::Join(gClient gameClient) } } + gameClient->SetState(GameClient::ClientState_Ready); + return added; } diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs index 103a047f..bd168c3c 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.Designer.cs @@ -43,6 +43,7 @@ this.forceStart = new System.Windows.Forms.CheckBox(); this.label2 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); + this.labelClientsConnected = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.nrOfClients = new System.Windows.Forms.NumericUpDown(); this.buttonStartGame = new System.Windows.Forms.Button(); @@ -50,13 +51,14 @@ this.ServerInfoTextArea = new System.Windows.Forms.RichTextBox(); this.splitter1 = new System.Windows.Forms.Splitter(); this.clientInfoBox = new System.Windows.Forms.ListBox(); - this.labelClientsConnected = new System.Windows.Forms.Label(); + this.panel_CommanArea = new System.Windows.Forms.Panel(); ((System.ComponentModel.ISupportInitialize)(this.listenPort)).BeginInit(); this.panel_serverOptions.SuspendLayout(); this.panel_commands.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.timeLimit)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).BeginInit(); this.panel_clientArea.SuspendLayout(); + this.panel_CommanArea.SuspendLayout(); this.SuspendLayout(); // // serverToggle @@ -135,9 +137,10 @@ this.panel_serverOptions.Controls.Add(this.label_listenPort); this.panel_serverOptions.Controls.Add(this.lanBroadcast); this.panel_serverOptions.Controls.Add(this.label_serverName); - this.panel_serverOptions.Location = new System.Drawing.Point(12, 12); + this.panel_serverOptions.Dock = System.Windows.Forms.DockStyle.Top; + this.panel_serverOptions.Location = new System.Drawing.Point(0, 0); this.panel_serverOptions.Name = "panel_serverOptions"; - this.panel_serverOptions.Size = new System.Drawing.Size(183, 141); + this.panel_serverOptions.Size = new System.Drawing.Size(200, 141); this.panel_serverOptions.TabIndex = 6; // // panel_commands @@ -153,19 +156,19 @@ this.panel_commands.Controls.Add(this.label1); this.panel_commands.Controls.Add(this.nrOfClients); this.panel_commands.Controls.Add(this.buttonStartGame); - this.panel_commands.Location = new System.Drawing.Point(12, 159); + this.panel_commands.Location = new System.Drawing.Point(3, 150); this.panel_commands.Name = "panel_commands"; - this.panel_commands.Size = new System.Drawing.Size(183, 202); + this.panel_commands.Size = new System.Drawing.Size(191, 202); this.panel_commands.TabIndex = 7; this.panel_commands.Visible = false; // // mapName // - this.mapName.Location = new System.Drawing.Point(78, 7); + this.mapName.Location = new System.Drawing.Point(75, 10); this.mapName.Name = "mapName"; - this.mapName.Size = new System.Drawing.Size(98, 20); + this.mapName.Size = new System.Drawing.Size(113, 20); this.mapName.TabIndex = 12; - this.mapName.Text = "Unknown"; + this.mapName.Text = "2ofAll_updated.bias"; // // timeLimit // @@ -194,7 +197,7 @@ "Team death-match"}); this.gameModes.Location = new System.Drawing.Point(78, 66); this.gameModes.Name = "gameModes"; - this.gameModes.Size = new System.Drawing.Size(99, 21); + this.gameModes.Size = new System.Drawing.Size(110, 21); this.gameModes.TabIndex = 10; // // label3 @@ -236,6 +239,15 @@ this.label4.TabIndex = 8; this.label4.Text = "Map name"; // + // labelClientsConnected + // + this.labelClientsConnected.AutoSize = true; + this.labelClientsConnected.Location = new System.Drawing.Point(9, 149); + this.labelClientsConnected.Name = "labelClientsConnected"; + this.labelClientsConnected.Size = new System.Drawing.Size(104, 13); + this.labelClientsConnected.TabIndex = 8; + this.labelClientsConnected.Text = "Clients connected: 0"; + // // label1 // this.label1.AutoSize = true; @@ -282,9 +294,10 @@ this.panel_clientArea.Controls.Add(this.ServerInfoTextArea); this.panel_clientArea.Controls.Add(this.splitter1); this.panel_clientArea.Controls.Add(this.clientInfoBox); - this.panel_clientArea.Location = new System.Drawing.Point(202, 12); + this.panel_clientArea.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel_clientArea.Location = new System.Drawing.Point(200, 0); this.panel_clientArea.Name = "panel_clientArea"; - this.panel_clientArea.Size = new System.Drawing.Size(303, 349); + this.panel_clientArea.Size = new System.Drawing.Size(535, 616); this.panel_clientArea.TabIndex = 8; // // ServerInfoTextArea @@ -297,7 +310,7 @@ this.ServerInfoTextArea.Location = new System.Drawing.Point(0, 152); this.ServerInfoTextArea.Name = "ServerInfoTextArea"; this.ServerInfoTextArea.ReadOnly = true; - this.ServerInfoTextArea.Size = new System.Drawing.Size(303, 197); + this.ServerInfoTextArea.Size = new System.Drawing.Size(535, 464); this.ServerInfoTextArea.TabIndex = 1; this.ServerInfoTextArea.Text = ""; // @@ -306,7 +319,7 @@ this.splitter1.Dock = System.Windows.Forms.DockStyle.Top; this.splitter1.Location = new System.Drawing.Point(0, 147); this.splitter1.Name = "splitter1"; - this.splitter1.Size = new System.Drawing.Size(303, 5); + this.splitter1.Size = new System.Drawing.Size(535, 5); this.splitter1.TabIndex = 2; this.splitter1.TabStop = false; // @@ -316,26 +329,26 @@ this.clientInfoBox.FormattingEnabled = true; this.clientInfoBox.Location = new System.Drawing.Point(0, 0); this.clientInfoBox.Name = "clientInfoBox"; - this.clientInfoBox.Size = new System.Drawing.Size(303, 147); + this.clientInfoBox.Size = new System.Drawing.Size(535, 147); this.clientInfoBox.TabIndex = 0; // - // labelClientsConnected + // panel_CommanArea // - this.labelClientsConnected.AutoSize = true; - this.labelClientsConnected.Location = new System.Drawing.Point(9, 149); - this.labelClientsConnected.Name = "labelClientsConnected"; - this.labelClientsConnected.Size = new System.Drawing.Size(104, 13); - this.labelClientsConnected.TabIndex = 8; - this.labelClientsConnected.Text = "Clients connected: 0"; + this.panel_CommanArea.Controls.Add(this.panel_commands); + this.panel_CommanArea.Controls.Add(this.panel_serverOptions); + this.panel_CommanArea.Dock = System.Windows.Forms.DockStyle.Left; + this.panel_CommanArea.Location = new System.Drawing.Point(0, 0); + this.panel_CommanArea.Name = "panel_CommanArea"; + this.panel_CommanArea.Size = new System.Drawing.Size(200, 616); + this.panel_CommanArea.TabIndex = 9; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(517, 373); + this.ClientSize = new System.Drawing.Size(735, 616); this.Controls.Add(this.panel_clientArea); - this.Controls.Add(this.panel_commands); - this.Controls.Add(this.panel_serverOptions); + this.Controls.Add(this.panel_CommanArea); this.Name = "Form1"; this.Text = "Form1"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormClosingEvent); @@ -347,6 +360,7 @@ ((System.ComponentModel.ISupportInitialize)(this.timeLimit)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nrOfClients)).EndInit(); this.panel_clientArea.ResumeLayout(false); + this.panel_CommanArea.ResumeLayout(false); this.ResumeLayout(false); } @@ -376,6 +390,7 @@ private System.Windows.Forms.TextBox mapName; private System.Windows.Forms.CheckBox forceStart; private System.Windows.Forms.Label labelClientsConnected; + private System.Windows.Forms.Panel panel_CommanArea; } } diff --git a/Code/Game/LanServer/StandAloneLauncher/Form1.cs b/Code/Game/LanServer/StandAloneLauncher/Form1.cs index 28a83c72..58deb2a9 100644 --- a/Code/Game/LanServer/StandAloneLauncher/Form1.cs +++ b/Code/Game/LanServer/StandAloneLauncher/Form1.cs @@ -9,6 +9,8 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Interop; using System.Runtime.InteropServices; +using System.Threading; +using System.Timers; namespace StandAloneLauncher { @@ -30,18 +32,17 @@ namespace StandAloneLauncher return true; } + public void Run() { while (this.Created) { Application.DoEvents(); - - //Do some stuff this.gameServer.ServerUpdate(); this.labelClientsConnected.Text = "Clients connected: " + this.gameServer.GetClientsConnectedCount().ToString(); } } - + private void button1_serverToggle_Click(object sender, EventArgs e) { if (this.serverIsRunning) @@ -88,8 +89,9 @@ namespace StandAloneLauncher { //this.gameServer.GameSetGameMode(this.gameModes.SelectedText); this.gameServer.GameSetGameTime((int)this.timeLimit.Value); - //this.gameServer.GameSetMapId(0); + this.gameServer.GameSetMapName(this.mapName.Text); this.gameServer.GameSetMaxClients((int)this.nrOfClients.Value); + if (!this.gameServer.GameStart( this.forceStart.Checked )) { this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to start the game session!\n"); diff --git a/Code/Misc/Utilities/Resource/OResourceHandler.cpp b/Code/Misc/Utilities/Resource/OResourceHandler.cpp index 52d93af0..cc297f67 100644 --- a/Code/Misc/Utilities/Resource/OResourceHandler.cpp +++ b/Code/Misc/Utilities/Resource/OResourceHandler.cpp @@ -52,6 +52,8 @@ OHRESOURCE OysterResource::LoadResource(const wchar_t* filename, ResourceType ty } } + if(!resourceData) return 0; + return resourceData->GetResourceHandle(); } OHRESOURCE OysterResource::LoadResource(const wchar_t filename[], CustomLoadFunction loadFnc, int customId, bool force) diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index 96d149f3..69872fc1 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -96,6 +96,10 @@ struct NetworkClient::PrivateData : public IThreadObject //printf("\t(%i)\n", this->sendQueue.Size()); OysterByte temp; CustomNetProtocol p = this->sendQueue.Pop(); + + if(p[0].value.netShort == 304) + int i = 0; + this->translator.Pack(temp, p); errorCode = this->connection.Send(temp); From a6f740e1f80dec8fb096a0e959fa00ac46933e69 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 16:44:38 +0100 Subject: [PATCH 27/46] bunch of stuff --- Code/Game/GameClient/GameClientState/GameState.cpp | 9 ++++++++- Code/Game/GameClient/GameClientState/LanMenuState.cpp | 10 ++++++++++ Code/Game/GameClient/GameClientState/LanMenuState.h | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 3576ae65..9a0bd4db 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -314,9 +314,16 @@ void GameState::ReadKeyInput() void GameState::DataRecieved( NetEvent e ) { + if( e.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) + { // TODO: Reconnect + const char *breakpoint = "temp trap"; + this->privData->nwClient->Disconnect(); + this->ChangeState( GameClientState::ClientState_Main ); + } + CustomNetProtocol data = e.args.data.protocol; short ID = data[0].value.netShort; // fetching the id data. - + if( ProtocolIsGameplay(ID) ) { switch(ID) diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 11ca95da..178739d3 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -133,6 +133,16 @@ void LanMenuState::ChangeState( ClientState next ) this->privData->nextState = next; } +void LanMenuState::DataRecieved( NetEvent e ) +{ + if( e.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) + { // TODO: Reconnect + const char *breakpoint = "temp trap"; + this->privData->nwClient->Disconnect(); + this->ChangeState( GameClientState::ClientState_Same ); + } +} + void OnButtonInteract_Connect( Oyster::Event::ButtonEvent& e ) { switch( e.state ) diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.h b/Code/Game/GameClient/GameClientState/LanMenuState.h index 57889eee..9c6a8ec4 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.h +++ b/Code/Game/GameClient/GameClientState/LanMenuState.h @@ -21,6 +21,8 @@ namespace DanBias virtual bool Release(); void ChangeState( ClientState next ); + void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); + private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; From 02b467be18e6ded0dbbb7bfa32cee89ae97bb923 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 17:04:27 +0100 Subject: [PATCH 28/46] const related edits in CustomNetProtocol Should be none impact besides positive ones --- Code/Network/NetworkAPI/CustomNetProtocol.cpp | 23 +++++++++++++++++-- Code/Network/NetworkAPI/CustomNetProtocol.h | 8 ++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Code/Network/NetworkAPI/CustomNetProtocol.cpp b/Code/Network/NetworkAPI/CustomNetProtocol.cpp index ecb57bf9..90fb100d 100644 --- a/Code/Network/NetworkAPI/CustomNetProtocol.cpp +++ b/Code/Network/NetworkAPI/CustomNetProtocol.cpp @@ -40,12 +40,13 @@ CustomNetProtocol::CustomNetProtocol() { this->privateData = new PrivateData(); } -CustomNetProtocol::CustomNetProtocol(CustomNetProtocol& o) +CustomNetProtocol::CustomNetProtocol(const CustomNetProtocol& o) { this->privateData = new PrivateData(); this->privateData->attributes = o.privateData->attributes; } -const CustomNetProtocol& CustomNetProtocol::operator=(CustomNetProtocol& o) + +CustomNetProtocol& CustomNetProtocol::operator=(const CustomNetProtocol& o) { if(this->privateData) { @@ -56,11 +57,29 @@ const CustomNetProtocol& CustomNetProtocol::operator=(CustomNetProtocol& o) this->privateData->attributes = o.privateData->attributes; return *this; } + CustomNetProtocol::~CustomNetProtocol() { delete this->privateData; this->privateData = 0; } + +const NetAttributeContainer& CustomNetProtocol::operator[](int ID) const +{ + //if(!this->privateData) this->privateData = new PrivateData(); + if((unsigned int)ID >= this->privateData->attributes.Size()) + { + NetAttributeContainer temp; + + temp.type = NetAttributeType_UNKNOWN; + memset(&temp.value, 0, sizeof(NetAttributeValue)); + + this->privateData->attributes.Push(ID, temp); + } + + return this->privateData->attributes[ID]; +} + NetAttributeContainer& CustomNetProtocol::operator[](int ID) { //if(!this->privateData) this->privateData = new PrivateData(); diff --git a/Code/Network/NetworkAPI/CustomNetProtocol.h b/Code/Network/NetworkAPI/CustomNetProtocol.h index 48feb3a9..24df6ebf 100644 --- a/Code/Network/NetworkAPI/CustomNetProtocol.h +++ b/Code/Network/NetworkAPI/CustomNetProtocol.h @@ -130,10 +130,12 @@ namespace Oyster public: CustomNetProtocol(); ~CustomNetProtocol(); - CustomNetProtocol(CustomNetProtocol& o); - const CustomNetProtocol& operator=(CustomNetProtocol& o); + CustomNetProtocol( const CustomNetProtocol& o); + CustomNetProtocol& operator=(const CustomNetProtocol& o); + + const NetAttributeContainer& operator[](int ID) const; + NetAttributeContainer& operator[](int ID); - NetAttributeContainer& operator[](int ID); void Set(int id, Oyster::Network::NetAttributeValue val, Oyster::Network::NetAttributeType type); void Set(int ID, std::string s); const NetAttributeContainer& Get(int id); From a85b803e5cbfea72144ea478db457c560fb092ae Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 17:28:24 +0100 Subject: [PATCH 29/46] GameClientState Patch virtual void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); changed to virtual const NetEvent & DataRecieved( const NetEvent &message ); /****************************************************************** * @param message of the event * @return message or GameClientState::event_processed. ******************************************************************/ --- .../GameClientState/GameClientState.cpp | 9 +++++-- .../GameClientState/GameClientState.h | 10 +++++-- .../GameClient/GameClientState/GameState.cpp | 26 +++++++++++-------- .../GameClient/GameClientState/GameState.h | 2 +- .../GameClientState/LanMenuState.cpp | 10 ------- .../GameClient/GameClientState/LanMenuState.h | 2 -- .../GameClientState/LobbyAdminState.cpp | 7 ++--- .../GameClientState/LobbyAdminState.h | 4 +-- .../GameClient/GameClientState/LobbyState.cpp | 8 +++--- .../GameClient/GameClientState/LobbyState.h | 2 +- .../GameClientState/NetLoadState.cpp | 17 +++++++----- .../GameClient/GameClientState/NetLoadState.h | 2 +- 12 files changed, 55 insertions(+), 44 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameClientState.cpp b/Code/Game/GameClient/GameClientState/GameClientState.cpp index dab88b2e..add8c15b 100644 --- a/Code/Game/GameClient/GameClientState/GameClientState.cpp +++ b/Code/Game/GameClient/GameClientState/GameClientState.cpp @@ -3,9 +3,14 @@ using namespace DanBias::Client; using namespace ::Oyster::Network; +const GameClientState::NetEvent GameClientState::event_processed = GameClientState::NetEvent(); + GameClientState::GameClientState() {} GameClientState::~GameClientState() {} -void GameClientState::DataRecieved( NetEvent e ) -{ /* do nothing */ } \ No newline at end of file +const GameClientState::NetEvent & GameClientState::DataRecieved( const GameClientState::NetEvent &message ) +{ + /* do nothing */ + return message; +} \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameClientState.h b/Code/Game/GameClient/GameClientState/GameClientState.h index 3822c7b0..9891a16c 100644 --- a/Code/Game/GameClient/GameClientState/GameClientState.h +++ b/Code/Game/GameClient/GameClientState/GameClientState.h @@ -22,7 +22,9 @@ namespace DanBias { namespace Client ClientState_Quit }; - public: + typedef ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> NetEvent; + static const NetEvent event_processed; + GameClientState(); virtual ~GameClientState(); virtual bool Init( SharedStateContent &shared ) = 0; @@ -31,7 +33,11 @@ namespace DanBias { namespace Client virtual bool Release() = 0; virtual void ChangeState( ClientState next ) = 0; - virtual void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); + /****************************************************************** + * @param message of the event + * @return message or GameClientState::event_processed. + ******************************************************************/ + virtual const NetEvent & DataRecieved( const NetEvent &message ); }; } } diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 9a0bd4db..c6d77f76 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -312,20 +312,22 @@ void GameState::ReadKeyInput() // TODO: implement sub-menu } -void GameState::DataRecieved( NetEvent e ) +const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState::NetEvent &message ) { - if( e.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) + if( message.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) { // TODO: Reconnect const char *breakpoint = "temp trap"; this->privData->nwClient->Disconnect(); this->ChangeState( GameClientState::ClientState_Main ); } - CustomNetProtocol data = e.args.data.protocol; - short ID = data[0].value.netShort; // fetching the id data. + // fetching the id data. + short ID = message.args.data.protocol[0].value.netShort; if( ProtocolIsGameplay(ID) ) { + CustomNetProtocol data = message.args.data.protocol; + switch(ID) { case protocol_Gameplay_ObjectPickup: break; /** @todo TODO: implement */ @@ -341,13 +343,13 @@ void GameState::DataRecieved( NetEventprivData->dynamicObjects)[decoded.object_ID]->setPos( decoded.position ); } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectScale: { Protocol_ObjectScale decoded(data); (*this->privData->dynamicObjects)[decoded.object_ID]->setScale( decoded.scale ); } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectRotation: { Protocol_ObjectRotation decoded(data); @@ -359,7 +361,7 @@ void GameState::DataRecieved( NetEventprivData->dynamicObjects)[decoded.object_ID]->setRot( rotation ); } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectPositionRotation: { Protocol_ObjectPositionRotation decoded(data); @@ -380,7 +382,7 @@ void GameState::DataRecieved( NetEventsetRot( rotation ); } } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectDisabled: { @@ -393,7 +395,7 @@ void GameState::DataRecieved( NetEventprivData->dynamicObjects->erase( object ); } } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectCreate: { Protocol_ObjectCreate decoded(data); @@ -414,13 +416,13 @@ void GameState::DataRecieved( NetEventprivData->dynamicObjects)[decoded.object_ID] = object; } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectCreatePlayer: { Protocol_ObjectCreatePlayer decoded(data); this->InitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotationQ, decoded.scale, decoded.owner ); } - break; + return GameClientState::event_processed; case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectLeaveTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectWeaponCooldown: break; /** @todo TODO: implement */ @@ -439,4 +441,6 @@ void GameState::DataRecieved( NetEvent e ); + const NetEvent & DataRecieved( const NetEvent &message ); private: struct MyData; diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 178739d3..11ca95da 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -133,16 +133,6 @@ void LanMenuState::ChangeState( ClientState next ) this->privData->nextState = next; } -void LanMenuState::DataRecieved( NetEvent e ) -{ - if( e.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) - { // TODO: Reconnect - const char *breakpoint = "temp trap"; - this->privData->nwClient->Disconnect(); - this->ChangeState( GameClientState::ClientState_Same ); - } -} - void OnButtonInteract_Connect( Oyster::Event::ButtonEvent& e ) { switch( e.state ) diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.h b/Code/Game/GameClient/GameClientState/LanMenuState.h index 9c6a8ec4..57889eee 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.h +++ b/Code/Game/GameClient/GameClientState/LanMenuState.h @@ -21,8 +21,6 @@ namespace DanBias virtual bool Release(); void ChangeState( ClientState next ); - void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); - private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; diff --git a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp index 070d8b48..43419e88 100644 --- a/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyAdminState.cpp @@ -112,10 +112,10 @@ void LobbyAdminState::ChangeState( ClientState next ) using namespace ::Oyster::Network; -void LobbyAdminState::DataRecieved( NetEvent e ) +const GameClientState::NetEvent & LobbyAdminState::DataRecieved( const GameClientState::NetEvent &message ) { - CustomNetProtocol data = e.args.data.protocol; - short ID = data[0].value.netShort; // fetching the id data. + // fetching the id data. + short ID = message.args.data.protocol[0].value.netShort; // Block irrelevant messages. if( ProtocolIsLobby(ID) ) @@ -141,6 +141,7 @@ void LobbyAdminState::DataRecieved( NetEvent& e ) diff --git a/Code/Game/GameClient/GameClientState/LobbyAdminState.h b/Code/Game/GameClient/GameClientState/LobbyAdminState.h index 49ae9274..7e201e94 100644 --- a/Code/Game/GameClient/GameClientState/LobbyAdminState.h +++ b/Code/Game/GameClient/GameClientState/LobbyAdminState.h @@ -29,8 +29,8 @@ namespace DanBias bool Render(); bool Release(); void ChangeState( ClientState next ); - void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); - + const NetEvent & DataRecieved( const NetEvent &message ); + private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; diff --git a/Code/Game/GameClient/GameClientState/LobbyState.cpp b/Code/Game/GameClient/GameClientState/LobbyState.cpp index a6d03527..0b117016 100644 --- a/Code/Game/GameClient/GameClientState/LobbyState.cpp +++ b/Code/Game/GameClient/GameClientState/LobbyState.cpp @@ -112,10 +112,10 @@ void LobbyState::ChangeState( ClientState next ) using namespace ::Oyster::Network; -void LobbyState::DataRecieved( NetEvent e ) +const GameClientState::NetEvent & LobbyState::DataRecieved( const GameClientState::NetEvent &message ) { - CustomNetProtocol data = e.args.data.protocol; - short ID = data[0].value.netShort; // fetching the id data. + // fetching the id data. + short ID = message.args.data.protocol[0].value.netShort; // Block irrelevant messages. if( ProtocolIsLobby(ID) ) @@ -141,6 +141,8 @@ void LobbyState::DataRecieved( NetEvent& e ) diff --git a/Code/Game/GameClient/GameClientState/LobbyState.h b/Code/Game/GameClient/GameClientState/LobbyState.h index 694aaa38..496c54ed 100644 --- a/Code/Game/GameClient/GameClientState/LobbyState.h +++ b/Code/Game/GameClient/GameClientState/LobbyState.h @@ -31,7 +31,7 @@ namespace DanBias bool Render(); bool Release(); void ChangeState( ClientState next ); - void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); + const NetEvent & DataRecieved( const NetEvent &message ); private: struct MyData; diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 9a88072c..29906d77 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -90,20 +90,25 @@ void NetLoadState::ChangeState( ClientState next ) this->privData->nextState = next; } -void NetLoadState::DataRecieved( NetEvent e ) +const GameClientState::NetEvent & NetLoadState::DataRecieved( const GameClientState::NetEvent &message ) { // fetching the id data. - short ID = e.args.data.protocol[0].value.netShort; + short ID = message.args.data.protocol[0].value.netShort; - if( ID == protocol_Lobby_CreateGame && !this->privData->loading ) + if( ID == protocol_Lobby_CreateGame ) { - this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).mapName ); - this->ChangeState( ClientState_Game ); - this->privData->loading = false; + if( !this->privData->loading ) + { + this->LoadGame( Protocol_LobbyCreateGame(message.args.data.protocol).mapName ); + this->ChangeState( ClientState_Game ); + this->privData->loading = false; + } + return GameClientState::event_processed; } else { // HACK: Debug trap const char *breakPoint = "Being greedy."; + return message; } } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.h b/Code/Game/GameClient/GameClientState/NetLoadState.h index ea9f9f6a..16e32867 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.h +++ b/Code/Game/GameClient/GameClientState/NetLoadState.h @@ -21,7 +21,7 @@ namespace DanBias bool Release(); void ChangeState( ClientState next ); - void DataRecieved( ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> e ); + const NetEvent & DataRecieved( const NetEvent &message ); private: struct MyData; From 00fe2e6aa74a7d3f308040cb172764231f18bc2b Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 17:42:00 +0100 Subject: [PATCH 30/46] Camera swap Trying the quaternion based one instead --- Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp | 10 +++++++--- Code/Game/GameClient/GameClientState/Camera_FPSV2.h | 1 + Code/Game/GameClient/GameClientState/GameState.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp index b1863242..12506d3c 100644 --- a/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.cpp @@ -36,11 +36,15 @@ void Camera_FPSV2::SetPosition( const Float3 &translation ) this->body.translation = translation; } +void Camera_FPSV2::SetRotation( const Quaternion &rotation ) +{ + this->body.rotation = rotation; + this->head.SetRotation( rotation * Rotation(this->pitchUp, this->GetNormalOf(Float3::standard_unit_x) ) ); +} + void Camera_FPSV2::SetAngular( const Float3 &axis ) { - this->body.rotation = Rotation( axis ); - this->head.SetRotation( this->body.rotation ); - this->pitchUp = 0.0f; + this->SetRotation( Rotation(axis) ); } void Camera_FPSV2::SetProjection( const Float4x4 &matrix ) diff --git a/Code/Game/GameClient/GameClientState/Camera_FPSV2.h b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h index 968053c7..7f66b185 100644 --- a/Code/Game/GameClient/GameClientState/Camera_FPSV2.h +++ b/Code/Game/GameClient/GameClientState/Camera_FPSV2.h @@ -14,6 +14,7 @@ public: void SetHeadOffset( const ::Oyster::Math::Float3 &translation ); void SetPosition( const ::Oyster::Math::Float3 &translation ); + void SetRotation( const ::Oyster::Math::Quaternion &rotation ); void SetAngular( const ::Oyster::Math::Float3 &axis ); void SetProjection( const ::Oyster::Math::Float4x4 &matrix ); void SetOrthographicProjection( ::Oyster::Math::Float width, ::Oyster::Math::Float height, ::Oyster::Math::Float nearClip, ::Oyster::Math::Float farClip ); diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index c6d77f76..bfd15532 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -2,7 +2,7 @@ #include "DllInterfaces/GFXAPI.h" #include #include "NetworkClient.h" -#include "Camera_FPS.h" +#include "Camera_FPSV2.h" #include #include "C_obj/C_Player.h" @@ -39,7 +39,7 @@ struct GameState::MyData bool key_Reload_Shaders; C_Player player; - Camera_FPS camera; + Camera_FPSV2 camera; int myId; @@ -357,7 +357,7 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState // if is this player. Remember to change camera if( this->privData->myId == decoded.object_ID ) - this->privData->camera.SetAngular( AngularAxis(rotation) ); + this->privData->camera.SetRotation( rotation ); (*this->privData->dynamicObjects)[decoded.object_ID]->setRot( rotation ); } @@ -372,7 +372,7 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState if( this->privData->myId == decoded.object_ID ) { this->privData->camera.SetPosition( position ); - this->privData->camera.SetAngular( AngularAxis(rotation) ); + this->privData->camera.SetRotation( rotation ); } C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; From 8a0dbe969c15cefa47d20d9bfacabac9c27788fc Mon Sep 17 00:00:00 2001 From: Dennis Andersen Date: Tue, 18 Feb 2014 21:24:21 +0100 Subject: [PATCH 31/46] GameLogic - Added filename to paramater when initiating a level, Also changed some string to wstrings --- Code/Game/GameLogic/Game.cpp | 6 ++---- Code/Game/GameLogic/Game.h | 2 +- Code/Game/GameLogic/GameAPI.h | 2 +- Code/Game/GameLogic/Level.cpp | 2 +- Code/Game/GameLogic/Level.h | 2 +- Code/Game/GameLogic/LevelLoader/LevelLoader.cpp | 16 ++++++++-------- Code/Game/GameLogic/LevelLoader/LevelLoader.h | 10 +++++----- Code/Game/GameLogic/LevelLoader/LevelParser.cpp | 10 ++++++++-- Code/Game/GameLogic/LevelLoader/LevelParser.h | 4 ++-- Code/Game/GameLogic/LevelLoader/Loader.cpp | 6 +++--- Code/Game/GameLogic/LevelLoader/Loader.h | 2 +- .../GameLogic/LevelLoader/ParseFunctions.cpp | 3 ++- 12 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index 900799e3..ba294349 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -76,14 +76,12 @@ Game::PlayerData* Game::CreatePlayer() return this->players[i]; } -Game::LevelData* Game::CreateLevel() +Game::LevelData* Game::CreateLevel(const wchar_t mapName[255]) { if(this->level) return this->level; this->level = new LevelData(); - //this->level->level->InitiateLevel(1000); - this->level->level->InitiateLevel("../Content/Worlds/ccc.bias"); - + this->level->level->InitiateLevel(mapName); return this->level; } diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index 9c21ec1b..6623756f 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -72,7 +72,7 @@ namespace GameLogic void GetAllPlayerPositions() const override; PlayerData* CreatePlayer() override; - LevelData* CreateLevel() override; + LevelData* CreateLevel(const wchar_t mapName[255] ) override; void CreateTeam() override; bool NewFrame() override; void SetFPS( int FPS ) override; diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 3325115f..65d606d8 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -139,7 +139,7 @@ namespace GameLogic /** Creates a level * @return Returns a ILevelData container to use for level manipulation */ - virtual ILevelData* CreateLevel( void ) = 0; + virtual ILevelData* CreateLevel( const wchar_t mapName[255] ) = 0; /** Creates a team * @return ? diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 4d3cf703..3c289766 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -197,7 +197,7 @@ ICustomBody* Level::InitRigidBodySphere( const ObjectHeader* obj) rigidBody = API::Instance().AddCollisionSphere( rigidBodyRadius , rigidWorldRotation , rigidWorldPos , rigidBodyMass, obj->boundingVolume.sphere.restitutionCoeff , obj->boundingVolume.sphere.frictionCoeffStatic , obj->boundingVolume.sphere.frictionCoeffDynamic); return rigidBody; } -void Level::InitiateLevel(std::string levelPath) +void Level::InitiateLevel(std::wstring levelPath) { LevelLoader ll; std::vector> objects; diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 623d04b2..18d650e8 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -30,7 +30,7 @@ namespace GameLogic * Initiates a level for players to play on * @param levelPath: Path to a file that contains all information on the level ********************************************************/ - void InitiateLevel(std::string levelPath); + void InitiateLevel(std::wstring levelPath); void InitiateLevel(float radius); Oyster::Physics::ICustomBody* InitRigidBodyCube( const ObjectHeader* obj); Oyster::Physics::ICustomBody* InitRigidBodySphere( const ObjectHeader* obj); diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp b/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp index 8fe880f3..205da712 100644 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp +++ b/Code/Game/GameLogic/LevelLoader/LevelLoader.cpp @@ -11,17 +11,17 @@ using namespace GameLogic::LevelFileLoader; struct LevelLoader::PrivData { LevelParser parser; - std::string folderPath; + std::wstring folderPath; }; LevelLoader::LevelLoader() : pData(new PrivData) { //standard path - pData->folderPath = ""; + pData->folderPath = L""; } -LevelLoader::LevelLoader(std::string folderPath) +LevelLoader::LevelLoader(std::wstring folderPath) : pData(new PrivData) { pData->folderPath = folderPath; @@ -31,22 +31,22 @@ LevelLoader::~LevelLoader() { } -std::vector> LevelLoader::LoadLevel(std::string fileName) +std::vector> LevelLoader::LoadLevel(std::wstring fileName) { return pData->parser.Parse(pData->folderPath + fileName); } -LevelMetaData LevelLoader::LoadLevelHeader(std::string fileName) +LevelMetaData LevelLoader::LoadLevelHeader(std::wstring fileName) { return pData->parser.ParseHeader(pData->folderPath + fileName); } -std::string LevelLoader::GetFolderPath() +std::wstring LevelLoader::GetFolderPath() { return this->pData->folderPath; } -void LevelLoader::SetFolderPath(std::string folderPath) +void LevelLoader::SetFolderPath(std::wstring folderPath) { - + this->pData->folderPath = folderPath; } \ No newline at end of file diff --git a/Code/Game/GameLogic/LevelLoader/LevelLoader.h b/Code/Game/GameLogic/LevelLoader/LevelLoader.h index aa67c4f5..c14e2c4c 100644 --- a/Code/Game/GameLogic/LevelLoader/LevelLoader.h +++ b/Code/Game/GameLogic/LevelLoader/LevelLoader.h @@ -20,7 +20,7 @@ namespace GameLogic /*********************************************************** * Lets you set the standard folderpath for the levels ********************************************************/ - LevelLoader(std::string folderPath); + LevelLoader(std::wstring folderPath); ~LevelLoader(); /******************************************************** @@ -28,24 +28,24 @@ namespace GameLogic * @param fileName: Path/name to the level-file that you want to load. * @return: Returns all structs with objects and information about the level. ********************************************************/ - std::vector> LoadLevel(std::string fileName); + std::vector> LoadLevel(std::wstring fileName); /******************************************************** * Just for fast access for the meta information about the level. * @param fileName: Path to the level-file that you want to load. * @return: Returns the meta information about the level. ********************************************************/ - LevelMetaData LoadLevelHeader(std::string fileName); //. + LevelMetaData LoadLevelHeader(std::wstring fileName); //. /*********************************************************** * @return: Returns the current standard folder path ********************************************************/ - std::string GetFolderPath(); + std::wstring GetFolderPath(); /*********************************************************** * Sets the standard folder path ********************************************************/ - void SetFolderPath(std::string folderPath); + void SetFolderPath(std::wstring folderPath); private: struct PrivData; diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp b/Code/Game/GameLogic/LevelLoader/LevelParser.cpp index 1e33361d..061e2c08 100644 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.cpp +++ b/Code/Game/GameLogic/LevelLoader/LevelParser.cpp @@ -20,7 +20,7 @@ LevelParser::~LevelParser() { } -std::vector> LevelParser::Parse(std::string filename) +std::vector> LevelParser::Parse(std::wstring filename) { int bufferSize = 0; int counter = 0; @@ -32,6 +32,12 @@ std::vector> LevelParser::Parse(std::string filen Loader loader; char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); + // Check if file was loaded, else return empty vector + if(bufferSize == 0) + { + return std::vector>(); + } + //Read format version LevelLoaderInternal::FormatVersion levelFormatVersion; ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); @@ -215,7 +221,7 @@ std::vector> LevelParser::Parse(std::string filen } //för meta information om leveln. -LevelMetaData LevelParser::ParseHeader(std::string filename) +LevelMetaData LevelParser::ParseHeader(std::wstring filename) { int bufferSize = 0; int counter = 0; diff --git a/Code/Game/GameLogic/LevelLoader/LevelParser.h b/Code/Game/GameLogic/LevelLoader/LevelParser.h index 8f2a9150..d0cb1f03 100644 --- a/Code/Game/GameLogic/LevelLoader/LevelParser.h +++ b/Code/Game/GameLogic/LevelLoader/LevelParser.h @@ -17,10 +17,10 @@ namespace GameLogic ~LevelParser(); // - std::vector> Parse(std::string filename); + std::vector> Parse(std::wstring filename); // - LevelMetaData ParseHeader(std::string filename); + LevelMetaData ParseHeader(std::wstring filename); private: LevelLoaderInternal::FormatVersion formatVersion; diff --git a/Code/Game/GameLogic/LevelLoader/Loader.cpp b/Code/Game/GameLogic/LevelLoader/Loader.cpp index 3e15315c..19ffa0f1 100644 --- a/Code/Game/GameLogic/LevelLoader/Loader.cpp +++ b/Code/Game/GameLogic/LevelLoader/Loader.cpp @@ -9,13 +9,13 @@ using namespace GameLogic::LevelFileLoader; using namespace Oyster::Resource; using namespace std; -char* Loader::LoadFile(std::string fileName, int &size) +char* Loader::LoadFile(std::wstring fileName, int &size) { //convert from string to wstring - std::wstring temp(fileName.begin(), fileName.end()); + //std::wstring temp(fileName.begin(), fileName.end()); //convert from wstring to wchar then loads the file - char* buffer = (char*)OysterResource::LoadResource(temp.c_str(), Oyster::Resource::ResourceType::ResourceType_Byte_Raw, -1 , false); + char* buffer = (char*)OysterResource::LoadResource(fileName.c_str(), Oyster::Resource::ResourceType::ResourceType_Byte_Raw, -1 , false); size = OysterResource::GetResourceSize(buffer); return buffer; diff --git a/Code/Game/GameLogic/LevelLoader/Loader.h b/Code/Game/GameLogic/LevelLoader/Loader.h index 0433194e..6deb8900 100644 --- a/Code/Game/GameLogic/LevelLoader/Loader.h +++ b/Code/Game/GameLogic/LevelLoader/Loader.h @@ -17,7 +17,7 @@ namespace GameLogic public: Loader (){}; ~Loader(){}; - char* LoadFile(std::string fileName, int &size); + char* LoadFile(std::wstring fileName, int &size); //TODO: //Add functionality to load physicsObjects (hitboxes) diff --git a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp index daa62752..76d7d6c3 100644 --- a/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp +++ b/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp @@ -5,6 +5,7 @@ #include "ParseFunctions.h" #include "Packing/Packing.h" #include "Loader.h" +#include "Utilities.h" #include using namespace Oyster::Packing; @@ -149,7 +150,7 @@ namespace GameLogic //Läs in filen. int fileLength = 0; Loader loader; - char* buf = loader.LoadFile("../Content/Worlds/cgf/"+ fileName, fileLength); + char* buf = loader.LoadFile(L"../Content/Worlds/cgf/" + Utility::String::StringToWstring(fileName, wstring()), fileLength); start = 0; LevelLoaderInternal::FormatVersion version; From af15157283dbfb99d55394ee255013ac6129ad74 Mon Sep 17 00:00:00 2001 From: Dennis Andersen Date: Wed, 19 Feb 2014 00:20:01 +0100 Subject: [PATCH 32/46] GameLogic - Added default path to level data --- Code/Game/GameLogic/Level.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 969d332d..4106dabf 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -200,6 +200,7 @@ ICustomBody* Level::InitRigidBodySphere( const ObjectHeader* obj) bool Level::InitiateLevel(std::wstring levelPath) { LevelLoader ll; + ll.SetFolderPath(L"..\\Content\\Worlds\\"); std::vector> objects; objects = ll.LoadLevel(levelPath); From 7af1c18dcfea0d086b1f28a154e0272052b09833 Mon Sep 17 00:00:00 2001 From: Dennis Andersen Date: Wed, 19 Feb 2014 02:10:13 +0100 Subject: [PATCH 33/46] GameServer - Some minor features to Standalone server --- .../LanServer/StandAloneLauncher/App.config | 12 + .../StandAloneLauncher/Form1.Designer.cs | 312 ++++++++++++++++-- .../LanServer/StandAloneLauncher/Form1.cs | 63 +++- .../Properties/Settings.Designer.cs | 32 +- .../Properties/Settings.settings | 14 +- .../StandAloneLauncher.csproj | 1 + 6 files changed, 372 insertions(+), 62 deletions(-) diff --git a/Code/Game/LanServer/StandAloneLauncher/App.config b/Code/Game/LanServer/StandAloneLauncher/App.config index 32412984..efeb1570 100644 --- a/Code/Game/LanServer/StandAloneLauncher/App.config +++ b/Code/Game/LanServer/StandAloneLauncher/App.config @@ -1,5 +1,10 @@  + + +