diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index d9a55892..08cc897f 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -226,6 +226,8 @@ + + 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/GameClient/GameClientState/Buttons/EventButtonGUI.h b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h index c14d24f2..e598a790 100644 --- a/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h +++ b/Code/Game/GameClient/GameClientState/Buttons/EventButtonGUI.h @@ -113,7 +113,7 @@ namespace DanBias { if(buttonText.size() > 0) { - Oyster::Graphics::API::RenderText(buttonText, pos - Float3(size.x * 0.5f, size.y * 0.25f, -0.001f), size, size.y * 0.5f, textColor); + Oyster::Graphics::API::RenderText(buttonText, pos - Float3(size.x * 0.5f, size.y * 0.25f, +0.001f), size, size.y * 0.5f, textColor); } } diff --git a/Code/Game/GameClient/GameClientState/Buttons/Plane_UI.h b/Code/Game/GameClient/GameClientState/Buttons/Plane_UI.h new file mode 100644 index 00000000..8293eeb1 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Buttons/Plane_UI.h @@ -0,0 +1,51 @@ +#ifndef DANBIAS_CLIENT_PLANE_UI_H +#define DANBIAS_CLIENT_PLANE_UI_H + +#include "DllInterfaces/GFXAPI.h" + +namespace DanBias +{ + namespace Client + { + class Plane_UI + { + public: + Plane_UI( ) + { + pos = Oyster::Math::Float3::null; + size = Oyster::Math::Float2::null; + tintColor = Oyster::Math::Float4(1); + texture = NULL; + } + Plane_UI( std::wstring textureName, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, Oyster::Math::Float4 tintColor = Oyster::Math::Float4(1)) + : pos(pos), size(size), tintColor(tintColor) + { + CreateTexture(textureName); + } + virtual ~Plane_UI() + { + Oyster::Graphics::API::DeleteTexture(texture); + texture = NULL; + } + void CreateTexture(std::wstring textureName) + { + //Create texture + texture = Oyster::Graphics::API::CreateTexture(textureName); + } + + virtual void RenderTexture() const + { + if(texture) + Oyster::Graphics::API::RenderGuiElement(texture, pos, size, tintColor); + } + private: + Oyster::Math::Float3 pos; + Oyster::Math::Float2 size; + + Oyster::Graphics::API::Texture texture; + Oyster::Math::Float4 tintColor; + }; + } +} + +#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/Buttons/Text_UI.h b/Code/Game/GameClient/GameClientState/Buttons/Text_UI.h new file mode 100644 index 00000000..380c73e1 --- /dev/null +++ b/Code/Game/GameClient/GameClientState/Buttons/Text_UI.h @@ -0,0 +1,41 @@ +#ifndef DANBIAS_CLIENT_TEXT_UI_H +#define DANBIAS_CLIENT_TEXT_UI_H + +#include "DllInterfaces/GFXAPI.h" + +namespace DanBias +{ + namespace Client + { + class Text_UI + { + public: + Text_UI( ) + { + pos = Oyster::Math::Float3::null; + size = Oyster::Math::Float2::null; + text = L""; + textColor = Oyster::Math::Float4(1); + } + Text_UI(std::wstring text, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, Oyster::Math::Float4 textColor = Oyster::Math::Float4(1)) + : pos(pos), size(size), text(text), textColor(textColor) + { + } + void RenderText() const + { + if(text.size() > 0) + { + Oyster::Graphics::API::RenderText(text, pos, size, size.y * 0.5f, textColor); + } + } + private: + Oyster::Math::Float3 pos; + Oyster::Math::Float2 size; + + std::wstring text; + Oyster::Math::Float4 textColor; + }; + } +} + +#endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index ffc1d5da..9f3e8c31 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -9,6 +9,8 @@ #include "C_obj/C_DynamicObj.h" #include "C_obj/C_StaticObj.h" #include "Utilities.h" +#include "GamingUI.h" +#include "RespawnUI.h" using namespace ::DanBias::Client; using namespace ::Oyster; @@ -32,19 +34,6 @@ struct GameState::MyData ::std::map> *dynamicObjects; ::std::map> *lights; - bool key_forward; - bool key_backward; - bool key_strafeRight; - bool key_strafeLeft; - bool key_Shoot; - bool key_Jump; - - // DEGUG KEYS - bool key_Reload_Shaders; - bool key_Wireframe_Toggle; - bool renderWhireframe; - // !DEGUG KEYS - C_Player player; Camera_FPSV2 camera; @@ -75,11 +64,6 @@ bool GameState::Init( SharedStateContent &shared ) 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->mouseInput = shared.mouseDevice; @@ -95,16 +79,18 @@ bool GameState::Init( SharedStateContent &shared ) Float aspectRatio = gfxOp.Resolution.x / gfxOp.Resolution.y; this->privData->camera.SetPerspectiveProjection( Utility::Value::Radian(90.0f), aspectRatio, 0.1f, 1000.0f ); Graphics::API::SetProjection( this->privData->camera.GetProjectionMatrix() ); - gfxOp.AmbientValue = 1.0f; + gfxOp.AmbientValue = 0.5f; + gfxOp.GlobalGlowTint = Math::Float3(2,1,1); + gfxOp.GlobalTint = Math::Float3(1,1,1); Graphics::API::SetOptions(gfxOp); //tell server ready this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); // DEGUG KEYS - this->privData->key_Reload_Shaders = false; - this->privData->key_Wireframe_Toggle = false; - this->privData->renderWhireframe = false; + this->key_Reload_Shaders = false; + this->key_Wireframe_Toggle = false; + this->renderWhireframe = false; // !DEGUG KEYS auto light = this->privData->lights->begin(); @@ -113,6 +99,12 @@ bool GameState::Init( SharedStateContent &shared ) light->second->Render(); } + // create UI states + this->gameUI = new GamingUI(this->privData->input, this->privData->nwClient, &this->privData->camera); + this->respawnUI = new RespawnUI(this->privData->nwClient, 20); + this->currGameUI = gameUI; + ((GamingUI*)gameUI)->Init(); + // TODO init respawn return true; } @@ -146,8 +138,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa this->privData->camera.SetPosition( this->privData->player.getPos() ); Float3 offset = Float3( 0.0f ); // DEBUG position of camera so we can see the player model - offset.y = this->privData->player.getScale().y * 5.0f; - offset.z = this->privData->player.getScale().z * -5.0f; + //offset.y = this->privData->player.getScale().y * 5.0f; + //offset.z = this->privData->player.getScale().z * -5.0f; // !DEBUG this->privData->camera.SetHeadOffset( offset ); this->privData->camera.UpdateOrientation(); @@ -169,7 +161,25 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa GameClientState::ClientState GameState::Update( float deltaTime ) { - this->ReadKeyInput(); + GameStateUI::UIState UIstate = this->currGameUI->Update( deltaTime ); + switch (UIstate) + { + case DanBias::Client::GameStateUI::UIState_same: + break; + case DanBias::Client::GameStateUI::UIState_gaming: + break; + case DanBias::Client::GameStateUI::UIState_main_menu: + //this->privData->nextState = + break; + case DanBias::Client::GameStateUI::UIState_shut_down: + this->privData->nextState = ClientState_Quit; + break; + default: + break; + } + // DEBUG keybindings + ReadKeyInput(); + return this->privData->nextState; } @@ -194,19 +204,13 @@ bool GameState::Render() if( dynamicObject->second ) { dynamicObject->second->Render(); + } } - - /*auto light = this->privData->lights->begin(); - for( ; light != this->privData->lights->end(); ++light ) - { - light->second->Render(); - }*/ - #ifdef _DEBUG //RB DEBUG render wire frame - if(this->privData->renderWhireframe) + if(this->renderWhireframe) { Oyster::Graphics::API::StartRenderWireFrame(); @@ -248,6 +252,12 @@ bool GameState::Render() //!RB DEBUG #endif + // render current UI state + if(currGameUI->HaveGUIRender()) + currGameUI->RenderGUI(); + if(currGameUI->HaveTextRender()) + currGameUI->RenderText(); + Oyster::Graphics::API::EndFrame(); return true; } @@ -281,6 +291,22 @@ bool GameState::Release() privData = NULL; } + + if(respawnUI) + { + respawnUI->Release(); + delete respawnUI; + respawnUI = NULL; + } + + if(gameUI) + { + gameUI->Release(); + delete gameUI; + gameUI = NULL; + } + currGameUI = NULL; + return true; } @@ -331,6 +357,7 @@ void GameState::ReadKeyInput() //if( deltaPos.x != 0.0f ) //This made the camera reset to a specific rotation. Why? { this->privData->nwClient->Send( Protocol_PlayerLeftTurn(deltaPos.x * mouseSensitivity) ); +} } } @@ -369,28 +396,28 @@ void GameState::ReadKeyInput() // Reload shaders if( this->privData->keyboardInput_raw->IsKeyDown(::Input::Enum::SAKI_R) ) { - if( !this->privData->key_Reload_Shaders ) + if( !this->key_Reload_Shaders ) { Graphics::API::ReloadShaders(); - this->privData->key_Reload_Shaders = true; + this->key_Reload_Shaders = true; } } else - this->privData->key_Reload_Shaders = false; + this->key_Reload_Shaders = false; // toggle wire frame render if( this->privData->keyboardInput_raw->IsKeyDown(::Input::Enum::SAKI_T) ) { - if( !this->privData->key_Wireframe_Toggle ) + if( !this->key_Wireframe_Toggle ) { - this->privData->renderWhireframe = !this->privData->renderWhireframe; - this->privData->key_Wireframe_Toggle = true; + this->renderWhireframe = !this->renderWhireframe; + this->key_Wireframe_Toggle = true; } } else - this->privData->key_Wireframe_Toggle = false; + this->key_Wireframe_Toggle = false; #endif // !DEGUG KEYS } @@ -480,19 +507,21 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState this->privData->player.updateRBWorld(); // !RB DEBUG } - - C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; - - if( object ) + else { - object->setPos( position ); - object->setRot( rotation ); - object->updateWorld(); - // RB DEBUG - object->setRBPos ( position ); - object->setRBRot ( rotation ); - object->updateRBWorld(); - // !RB DEBUG + C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; + + if( object ) + { + object->setPos( position ); + object->setRot( rotation ); + object->updateWorld(); + // RB DEBUG + object->setRBPos ( position ); + object->setRBRot ( rotation ); + object->updateRBWorld(); + // !RB DEBUG + } } } return GameClientState::event_processed; @@ -549,8 +578,24 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState case protocol_Gameplay_ObjectLeaveTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectWeaponCooldown: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectWeaponEnergy: break; /** @todo TODO: implement */ - case protocol_Gameplay_ObjectRespawn: break; /** @todo TODO: implement */ - case protocol_Gameplay_ObjectDie: break; /** @todo TODO: implement */ + case protocol_Gameplay_ObjectRespawn: + this->currGameUI = this->gameUI; + return GameClientState::event_processed; + case protocol_Gameplay_ObjectDie: + this->currGameUI = this->respawnUI; + // set countdown + case protocol_Gameplay_ObjectDisconnectPlayer: + { + //Removes + Protocol_ObjectDisconnectPlayer decoded(data); + auto object = this->privData->dynamicObjects->find( decoded.objectID ); + if( object != this->privData->dynamicObjects->end() ) + { + object->second = nullptr; + this->privData->dynamicObjects->erase( object ); + } + } + return GameClientState::event_processed; default: break; } } diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 8c5ca64e..5a9519ad 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -3,6 +3,7 @@ #include "GameClientState.h" #include "OysterMath.h" #include +#include "GameStateUI.h" namespace DanBias { namespace Client { @@ -31,6 +32,13 @@ namespace DanBias { namespace Client private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; + GameStateUI *currGameUI, *gameUI, *respawnUI; + + // DEGUG KEYS + bool key_Reload_Shaders; + bool key_Wireframe_Toggle; + bool renderWhireframe; + // !DEGUG KEYS }; } } #endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/GameStateUI.h b/Code/Game/GameClient/GameClientState/GameStateUI.h index 40350211..152a7f04 100644 --- a/Code/Game/GameClient/GameClientState/GameStateUI.h +++ b/Code/Game/GameClient/GameClientState/GameStateUI.h @@ -1,5 +1,5 @@ -#ifndef DANBIAS_CLIENT_GAMECLIENTSTATE_H -#define DANBIAS_CLIENT_GAMECLIENTSTATE_H +#ifndef DANBIAS_CLIENT_GAMESTATEUI_H +#define DANBIAS_CLIENT_GAMESTATEUI_H #include "Utilities.h" #include "NetworkClient.h" diff --git a/Code/Game/GameClient/GameClientState/GamingUI.cpp b/Code/Game/GameClient/GameClientState/GamingUI.cpp index 7f1b9fb8..bf0cbeb5 100644 --- a/Code/Game/GameClient/GameClientState/GamingUI.cpp +++ b/Code/Game/GameClient/GameClientState/GamingUI.cpp @@ -6,6 +6,7 @@ using namespace ::DanBias::Client; using namespace ::Oyster::Network; using namespace ::GameLogic; using namespace ::Utility::Value; +using namespace ::Oyster::Math; using namespace ::Input; GamingUI::GamingUI() : @@ -16,6 +17,8 @@ GamingUI::GamingUI() : this->keyboardInput = nullptr; this->netClient = nullptr; this->camera = nullptr; + this->plane = nullptr; + this->text = nullptr; } GamingUI::GamingUI( Mouse *mouseInput, Keyboard *keyboardInput, NetworkClient *connection, Camera_FPSV2 *camera ) : @@ -28,35 +31,49 @@ GamingUI::GamingUI( Mouse *mouseInput, Keyboard *keyboardInput, NetworkClient *c } GamingUI::~GamingUI() { /* Do nothing */ } +bool GamingUI::Init() +{ + // add textures and text + this->plane = new Plane_UI(L"box_tex.png", Float3(0.5f, 0.0f, 0.5f), Float2(0.3f, 0.1f)); + this->text = new Text_UI(L"hej", Float3(0.5f,0.0f,0.1f), Float2(0.1f,0.1f)); + return true; +} GameStateUI::UIState GamingUI::Update( float deltaTime ) { + ReadKeyInput(); return this->nextState; } bool GamingUI::HaveGUIRender() const { - return false; // TODO: change to true when we want UI elements like a crosshair + return true; } bool GamingUI::HaveTextRender() const { - return false; // TODO: change to true when we want UI elements like a chat window + return true; } void GamingUI::RenderGUI() const { - // TODO: Render crosshairs and such here. Don't forget to adjust GamingUI::HaveGUIRender + Oyster::Graphics::API::StartGuiRender(); + this->plane->RenderTexture(); } void GamingUI::RenderText() const { - // TODO: Render chattext and such here. Don't forget to adjust GamingUI::HaveGUIRender + Oyster::Graphics::API::StartTextRender(); + this->text->RenderText(); } bool GamingUI::Release() { // TODO: Release UI components here. + if(this->plane) + delete this->plane; + if(this->text) + delete this->text; return true; } @@ -82,75 +99,78 @@ void GamingUI::ReadKeyInput() 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 +//send delta mouse movement { static const float mouseSensitivity = Radian( 1.0f ); this->camera->PitchDown( this->input->GetPitch() * mouseSensitivity ); - this->netClient->Send( Protocol_PlayerLeftTurn(this->input->GetYaw() * mouseSensitivity) ); + float yaw = this->input->GetYaw(); + //if( yaw != 0.0f ) //This made the camera reset to a specific rotation. + { + this->netClient->Send( Protocol_PlayerLeftTurn(yaw * mouseSensitivity) ); + } } // 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; + 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() ); + if(!this->key_Jump) + { + this->netClient->Send( Protocol_PlayerJump() ); + this->key_Jump = true; + } } -} \ No newline at end of file + else + this->key_Jump = false; + + if( this->input->IsKeyPressed(DIK_ESCAPE) ) + { + this->nextState = GameStateUI::UIState_shut_down; + } + // !DEGUG KEYS + // TODO: implement sub-menu +} + diff --git a/Code/Game/GameClient/GameClientState/GamingUI.h b/Code/Game/GameClient/GameClientState/GamingUI.h index 05eef65a..a1e68f2a 100644 --- a/Code/Game/GameClient/GameClientState/GamingUI.h +++ b/Code/Game/GameClient/GameClientState/GamingUI.h @@ -4,6 +4,8 @@ #include "GameStateUI.h" #include "Input.h" #include "Camera_FPSV2.h" +#include "Buttons\Text_UI.h" +#include "Buttons\Plane_UI.h" namespace DanBias { namespace Client { @@ -12,6 +14,7 @@ namespace DanBias { namespace Client public: GamingUI( ::Input::Mouse *mouseInput, ::Input::Keyboard *keyboardInput, ::Oyster::Network::NetworkClient *connection, Camera_FPSV2 *camera ); virtual ~GamingUI(); + bool Init(); UIState Update( float deltaTime ); bool HaveGUIRender() const; @@ -25,6 +28,15 @@ namespace DanBias { namespace Client ::Input::Keyboard *keyboardInput; ::Oyster::Network::NetworkClient *netClient; Camera_FPSV2 *camera; + Text_UI* text; + Plane_UI* plane; + + bool key_forward; + bool key_backward; + bool key_strafeRight; + bool key_strafeLeft; + bool key_Shoot; + bool key_Jump; GamingUI(); void ReadKeyInput(); diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index 3102b9f2..89de1f3e 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -106,6 +106,8 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float args.pushForce = pushForce; Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction); + + if(hitCone) delete hitCone; } /******************************************************** @@ -141,6 +143,8 @@ void AttatchmentMassDriver::ForcePull(const WEAPON_FIRE &usage, float dt) args.pushForce = -pushForce; Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction); + + if(hitCone) delete hitCone; } void AttatchmentMassDriver::PickUpObject(const WEAPON_FIRE &usage, float dt) @@ -150,5 +154,5 @@ void AttatchmentMassDriver::PickUpObject(const WEAPON_FIRE &usage, float dt) Oyster::Physics::API::Instance().ApplyEffect(hitSphere,this,AttemptPickUp); - delete hitSphere; + if(hitSphere) delete hitSphere; } diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 848c528a..5b855785 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -79,99 +79,133 @@ void Player::BeginFrame() Oyster::Math::Float maxSpeed = 30; + // Rotate player accordingly + this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized()); + Oyster::Math::Quaternion firstUp = this->rigidBody->GetState().quaternion; + this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp)); + Oyster::Math::Quaternion secondTurn = this->rigidBody->GetState().quaternion; + + this->rigidBody->SetRotation(secondTurn*firstUp); + + // Direction data Oyster::Math::Float4x4 xform; xform = this->rigidBody->GetState().GetOrientation(); - /* Handle turning */ - /*if (left) - m_turnAngle -= dt * m_turnVelocity; - if (right) - m_turnAngle += dt * m_turnVelocity; - - xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle));*/ - - Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity(); - Oyster::Math::Float speed = this->rigidBody->GetLinearVelocity().GetLength(); - Oyster::Math::Float3 forwardDir = xform.v[2]; + Oyster::Math::Float3 upDir = xform.v[1]; Oyster::Math::Float3 rightDir = xform.v[0]; forwardDir.Normalize(); + upDir.Normalize(); rightDir.Normalize(); + + // Previous velocities data + Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity(); + Oyster::Math::Float3 forwardVelocity = linearVelocity*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); + Oyster::Math::Float forwardSpeed = (linearVelocity*forwardDir).GetLength(); + Oyster::Math::Float3 rightVelocity = linearVelocity*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); + Oyster::Math::Float rightSpeed = (linearVelocity*rightDir).GetLength(); + Oyster::Math::Float3 upVelocity = linearVelocity*Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); + + // Walking data Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0); Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f; - if (key_forward > 0.001) + // Check for input + if(key_forward > 0.001) { key_forward -= gameInstance->GetFrameTime(); walkDirection += forwardDir; - walkDirection.Normalize(); } - if (key_backward > 0.001) + if(key_backward > 0.001) { key_backward -= gameInstance->GetFrameTime(); walkDirection -= forwardDir; - walkDirection.Normalize(); } - if (key_strafeRight > 0.001) + if(key_strafeRight > 0.001) { key_strafeRight -= gameInstance->GetFrameTime(); - walkDirection -= rightDir; - walkDirection.Normalize(); + walkDirection += rightDir; } - if (key_strafeLeft > 0.001) + if(key_strafeLeft > 0.001) { key_strafeLeft -= gameInstance->GetFrameTime(); - walkDirection += rightDir; - walkDirection.Normalize(); - maxSpeed = 40; + walkDirection -= rightDir; } - - 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 velocity if certain keys are not pressed + if(key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.9f) { - /* Dampen when on the ground and not being moved by the player */ - linearVelocity *= 0.2f; - this->rigidBody->SetLinearVelocity (linearVelocity); - } - else - { - if (speed < maxSpeed && this->rigidBody->GetLambda() < 1.0f) + if(key_forward <= 0.001 && key_backward <= 0.001) { - Oyster::Math::Float3 velocity = linearVelocity + walkDirection * walkSpeed; - this->rigidBody->SetLinearVelocity(velocity); + forwardVelocity *= Oyster::Math::Float3(0.2f*fabs(forwardDir.x), 0.2f*fabs(forwardDir.y), 0.2f*fabs(forwardDir.z)); } - else if(speed < maxSpeed) + if(key_strafeRight <= 0.001 && key_strafeLeft <= 0.001) { - Oyster::Math::Float3 velocity = linearVelocity + (walkDirection * walkSpeed)*0.2f; - this->rigidBody->SetLinearVelocity(velocity); + rightVelocity *= Oyster::Math::Float3(0.2f*fabs(rightDir.x), 0.2f*fabs(rightDir.y), 0.2f*fabs(rightDir.z)); + } + } + + // Walk if walkdirection is something + if(walkDirection != Oyster::Math::Float3::null) + { + walkDirection.Normalize(); + + // If on the ground, accelerate normally + if(this->rigidBody->GetLambda() < 0.9f) + { + if(forwardSpeed < maxSpeed) + { + forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed; + } + if(rightSpeed < maxSpeed) + { + rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), abs(rightDir.y), fabs(rightDir.z)) * walkSpeed; + } + } + // If in the air, accelerate slower + if(this->rigidBody->GetLambda() >= 0.9f) + { + if(forwardSpeed < maxSpeed) + { + forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed*0.2f; + } + if(rightSpeed < maxSpeed) + { + rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)) * walkSpeed*0.2f; + } } } - if (key_jump > 0.001) + // Adjust velocities so no squaring occurs + forwardVelocity *= Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); + rightVelocity *= Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); + upVelocity *= Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); + + this->rigidBody->SetLinearVelocity(forwardVelocity+rightVelocity+upVelocity); + + //Jump + if(key_jump > 0.001) { this->key_jump -= this->gameInstance->GetFrameTime(); - if(this->rigidBody->GetLambda() < 1.0f) + if(this->rigidBody->GetLambda() < 0.9f) { - Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1].GetNormalized(); + Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized(); this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20); this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING; } } - Oyster::Math::Float3 pos = this->rigidBody->GetState().centerPos; - if(pos == Oyster::Math::Float3(0,0,0)) - int i =0; + + + //this->weapon->Update(0.01f); } void Player::EndFrame() { - // snap to axis - Oyster::Math::Float4 rotation; - - this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized()); //Object::EndFrame(); + } void Player::Move(const PLAYER_MOVEMENT &movement) @@ -235,13 +269,10 @@ void Player::Rotate(const Oyster::Math3D::Float3& lookDir, const Oyster::Math3D: // this is the camera right vector this->lookDir = lookDir; - //Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1]; - //this->rigidBody->SetUpAndRight(up, right); } void Player::TurnLeft(Oyster::Math3D::Float deltaRadians) { this->rotationUp += deltaRadians; - this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp)); } void Player::Jump() diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index fc02a4bd..cae7c7f5 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -892,6 +892,38 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; + //#define protocol_Gameplay_ObjectDisconnectPlayer 367 + struct Protocol_ObjectDisconnectPlayer :public Oyster::Network::CustomProtocolObject + { + int objectID; + + Protocol_ObjectDisconnectPlayer() + { + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[0].value.netShort = protocol_Gameplay_ObjectDisconnectPlayer; + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->objectID = 0; + } + Protocol_ObjectDisconnectPlayer(int objectID) + { + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[0].value.netShort = protocol_Gameplay_ObjectDisconnectPlayer; + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->objectID = objectID; + } + Protocol_ObjectDisconnectPlayer(Oyster::Network::CustomNetProtocol& p) + { + this->objectID = p[1].value.netInt; + } + Oyster::Network::CustomNetProtocol GetProtocol() override + { + this->protocol[1].value = this->objectID; + return protocol; + } + + private: + Oyster::Network::CustomNetProtocol protocol; + }; } #endif // !GAMELOGIC_PLAYER_PROTOCOLS_H \ No newline at end of file diff --git a/Code/Game/GameProtocols/ProtocolIdentificationID.h b/Code/Game/GameProtocols/ProtocolIdentificationID.h index 4394a1a1..cb630012 100644 --- a/Code/Game/GameProtocols/ProtocolIdentificationID.h +++ b/Code/Game/GameProtocols/ProtocolIdentificationID.h @@ -69,6 +69,8 @@ #define protocol_Gameplay_ObjectWeaponEnergy 364 #define protocol_Gameplay_ObjectRespawn 365 #define protocol_Gameplay_ObjectDie 366 +//Disconnect +#define protocol_Gameplay_ObjectDisconnectPlayer 367 #define protocol_GameplayMAX 399 diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index e2a2961d..0c52dfff 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -61,8 +61,19 @@ using namespace DanBias; switch (e.args.type) { case NetworkClient::ClientEventArgs::EventType_Disconnect: + { + //Send disconnect message to all the other players so the player can be removed from the client. + Protocol_ObjectDisconnectPlayer dp(cl->GetClient()->GetID()); + for(int i = 0; i < this->gClients.Size(); i++) + { + if(this->gClients[i] && this->gClients[i] != cl) + { + this->gClients[i]->GetClient()->Send(dp); + } + } printf("\t(%i : %s) - EventType_Disconnect\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); this->gClients[temp]->Invalidate(); + } break; case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: break; diff --git a/Code/OysterGraphics/Definitions/GraphicalDefinition.h b/Code/OysterGraphics/Definitions/GraphicalDefinition.h index c9b42c00..f6a6431c 100644 --- a/Code/OysterGraphics/Definitions/GraphicalDefinition.h +++ b/Code/OysterGraphics/Definitions/GraphicalDefinition.h @@ -62,6 +62,9 @@ namespace Oyster struct PostData { float Amb; + Math::Float3 Tint; + Math::Float3 GlowTint; + float PAD; }; struct Text2D diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index 41063265..8f01bea4 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -123,6 +123,8 @@ namespace Oyster Definitions::PostData pd; pd.Amb = option.AmbientValue; + pd.Tint = option.GlobalTint; + pd.GlowTint = option.GlobalGlowTint; void* data = Render::Resources::Post::Data.Map(); memcpy(data,&pd,sizeof(Definitions::PostData)); diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.h b/Code/OysterGraphics/DllInterfaces/GFXAPI.h index 827f639f..795f649a 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.h +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.h @@ -30,6 +30,9 @@ namespace Oyster //between 0-1 float AmbientValue; + Math::Float3 GlobalTint; + Math::Float3 GlobalGlowTint; + Math::Float2 Resolution; //Bytes on the GPU diff --git a/Code/OysterGraphics/OysterGraphics.vcxproj.user b/Code/OysterGraphics/OysterGraphics.vcxproj.user index 9a0b0ae0..3f030911 100644 --- a/Code/OysterGraphics/OysterGraphics.vcxproj.user +++ b/Code/OysterGraphics/OysterGraphics.vcxproj.user @@ -1,6 +1,6 @@  - true + false \ No newline at end of file diff --git a/Code/OysterGraphics/Render/GuiRenderer.cpp b/Code/OysterGraphics/Render/GuiRenderer.cpp index b71be6d7..98642604 100644 --- a/Code/OysterGraphics/Render/GuiRenderer.cpp +++ b/Code/OysterGraphics/Render/GuiRenderer.cpp @@ -56,8 +56,8 @@ namespace Oyster //size.x = size.x / (text.length() * TEXT_SPACING /2); - pos *= 2; - pos -= 1; + pos.xy *= 2; + pos.xy -= 1; pos.y *= -1; diff --git a/Code/OysterGraphics/Shader/Passes/Gather/GatherPixel.hlsl b/Code/OysterGraphics/Shader/Passes/Gather/GatherPixel.hlsl index af095acf..11447238 100644 --- a/Code/OysterGraphics/Shader/Passes/Gather/GatherPixel.hlsl +++ b/Code/OysterGraphics/Shader/Passes/Gather/GatherPixel.hlsl @@ -41,8 +41,8 @@ PixelOut main(VertexOut input) { PixelOut output; float4 DiffGlow = Diffuse.Sample(S1, input.UV); - float3 tint = Color*(1-DiffGlow) + GlowColor * DiffGlow; - tint = tint / 2; + float3 tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w; + tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w; output.DiffuseGlow = DiffGlow * float4(tint,1); //NORMALIZE diff --git a/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl b/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl index 96b8ab69..89ed06d3 100644 --- a/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl +++ b/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl @@ -47,7 +47,7 @@ void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID ) DepthBase = DepthBase /4; Ambient[DTid.xy/2] = float4(DiffBase.xyz, AmbValue); Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy]; - Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w * 10 /* * (2-DepthBase) */,1); + Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w /* * (2-DepthBase) */,DiffBase.w); Ambient[DTid.xy/2 + Pixels/2] = float4(NormalSpec[DTid.xy].xyz * float3(1,1,-1),1); } diff --git a/Code/OysterGraphics/Shader/Passes/Light/SSAO.hlsli b/Code/OysterGraphics/Shader/Passes/Light/SSAO.hlsli index f2258905..c71cb4d5 100644 --- a/Code/OysterGraphics/Shader/Passes/Light/SSAO.hlsli +++ b/Code/OysterGraphics/Shader/Passes/Light/SSAO.hlsli @@ -1,7 +1,7 @@ #include "Defines.hlsli" #include "PosManipulation.hlsli" -static float Radius = 10; +static float Radius = 1; float GetSSAO(float3 pos, float2 uv, int2 texCoord2, uint2 rndID) { diff --git a/Code/OysterGraphics/Shader/Passes/Post/PostPass.hlsl b/Code/OysterGraphics/Shader/Passes/Post/PostPass.hlsl index 258d0f25..c3f7e69e 100644 --- a/Code/OysterGraphics/Shader/Passes/Post/PostPass.hlsl +++ b/Code/OysterGraphics/Shader/Passes/Post/PostPass.hlsl @@ -9,6 +9,8 @@ SamplerState S1 : register(s0); cbuffer Size : register(b0) { float AmbFactor; + float3 Color; + float3 GlowColor; } [numthreads(16, 16, 1)] @@ -26,9 +28,10 @@ void main( uint3 DTid : SV_DispatchThreadID ) SSAO = SSAO / 16; float4 Light = Diffuse[DTid.xy] + saturate(Specular[DTid.xy]); - float3 Amb = Ambient[DTid.xy/2].xyz * SSAO; + float3 Amb = Ambient[DTid.xy/2].xyz * SSAO * Color; - float3 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)].xyz; + float4 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)]; + Glow = float4(Glow.xyz * GlowColor, 1); float4 GUI; uint2 index = DTid.xy/2 + uint2((uint)Output.Length.x/(uint)2,0); @@ -40,4 +43,5 @@ void main( uint3 DTid : SV_DispatchThreadID ) //Output[DTid.xy] = float4(Ambient[DTid.xy/2 + uint2(Output.Length*0.5f)].xyz,1); //Output[DTid.xy] = SSAO * float4(1,1,1,1); + //Output[DTid.xy] = Ambient[DTid.xy]; } \ No newline at end of file diff --git a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp index ef003d7f..e2d87ce7 100644 --- a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp +++ b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.cpp @@ -168,9 +168,15 @@ void SimpleRigidBody::SetRotationAsAngularAxis(::Oyster::Math::Float4 angularAxi return; } + float s = sin(angularAxis.w/2); + float x = angularAxis.x * s; + float y = angularAxis.y * s; + float z = angularAxis.z * s; + float w = cos(angularAxis.w/2); + btTransform trans; btVector3 vector(angularAxis.x, angularAxis.y, angularAxis.z); - btQuaternion quaternion(vector, angularAxis.w); + btQuaternion quaternion(x,y,z,w); trans = this->rigidBody->getWorldTransform(); trans.setRotation(quaternion); @@ -263,22 +269,11 @@ Float4x4 SimpleRigidBody::GetRotation() const Float4 SimpleRigidBody::GetRotationAsAngularAxis() { Float4 axis = Float4::null; - Float s = sqrtf(1 - this->state.quaternion.real*this->state.quaternion.real); + btTransform trans; - axis.w = 2*acos(this->state.quaternion.real*this->state.quaternion.real); - - if(1 - this->state.quaternion.real > 0.001f) - { - axis.x = this->state.quaternion.imaginary.x/s; - axis.y = this->state.quaternion.imaginary.y/s; - axis.z = this->state.quaternion.imaginary.z/s; - } - else - { - axis.x = this->state.quaternion.imaginary.x; - axis.y = this->state.quaternion.imaginary.y; - axis.z = this->state.quaternion.imaginary.z; - } + trans = this->rigidBody->getWorldTransform(); + axis.xyz = trans.getRotation().getAxis(); + axis.w = trans.getRotation().getAngle(); return axis; } @@ -353,7 +348,8 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld) { btTransform xform; xform = this->rigidBody->getWorldTransform (); - btVector3 down = -xform.getBasis()[1]; + Float3 normalDown = -this->state.centerPos.GetNormalized(); + btVector3 down(normalDown.x, normalDown.y, normalDown.z); btVector3 forward = xform.getBasis()[2]; down.normalize (); forward.normalize(); @@ -361,12 +357,17 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld) this->raySource[0] = xform.getOrigin(); this->raySource[1] = xform.getOrigin(); + if(this->state.reach.y < 1.0f) + + Float angle = acos(Float3(0, 1, 0).Dot(this->state.centerPos.GetNormalized())); - down.setZ(-down.z()); - down.setX(-down.x()); + //down.setZ(-down.z()); btVector3 targetPlus = down * this->state.reach.y * btScalar(1.1); - + if(this->state.mass == 40) + { + const char* breakpoint = "STOP"; + } this->rayTarget[0] = this->raySource[0] + targetPlus; this->rayTarget[1] = this->raySource[1] + forward * this->state.reach.y * btScalar(1.1); @@ -383,7 +384,6 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld) { if (rayResult.m_collisionObject == m_me) return 1.0; - return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace); } protected: @@ -412,4 +412,14 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld) float SimpleRigidBody::GetLambda() const { return this->rayLambda[0]; +} + +void SimpleRigidBody::MoveToLimbo() +{ + this->rigidBody->setCollisionFlags(this->rigidBody->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); +} + +void SimpleRigidBody::ReleaseFromLimbo() +{ + this->rigidBody->setCollisionFlags(btCollisionObject::CF_KINEMATIC_OBJECT); } \ No newline at end of file diff --git a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.h b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.h index effd123d..4290b540 100644 --- a/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.h +++ b/Code/Physics/GamePhysics/Implementation/SimpleRigidBody.h @@ -69,6 +69,9 @@ namespace Oyster float GetLambda() const; + void MoveToLimbo(); + void ReleaseFromLimbo(); + private: btCollisionShape* collisionShape; diff --git a/Code/Physics/GamePhysics/PhysicsAPI.h b/Code/Physics/GamePhysics/PhysicsAPI.h index 72d4a8c6..33dc24a8 100644 --- a/Code/Physics/GamePhysics/PhysicsAPI.h +++ b/Code/Physics/GamePhysics/PhysicsAPI.h @@ -169,6 +169,9 @@ namespace Oyster virtual void CallSubscription_AfterCollisionResponse(ICustomBody* bodyA, ICustomBody* bodyB, Math::Float kineticEnergyLoss) = 0; virtual void CallSubscription_Move() = 0; + virtual void MoveToLimbo() = 0; + virtual void ReleaseFromLimbo() = 0; + /******************************************************** * @return the void pointer set by SetCustomTag. * nullptr if none is set.