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.