GameServer - merged with Camera

This commit is contained in:
Dennis Andersen 2014-02-16 01:28:34 +01:00
commit 97f9bfcb96
54 changed files with 773 additions and 1018 deletions

View File

@ -215,6 +215,7 @@
<ClCompile Include="GameClientState\LobbyState.cpp" /> <ClCompile Include="GameClientState\LobbyState.cpp" />
<ClCompile Include="GameClientState\C_Object.cpp" /> <ClCompile Include="GameClientState\C_Object.cpp" />
<ClCompile Include="GameClientState\MainState.cpp" /> <ClCompile Include="GameClientState\MainState.cpp" />
<ClCompile Include="GameClientState\NetLoadState.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="GameClientState\Camera_Basic.h" /> <ClInclude Include="GameClientState\Camera_Basic.h" />
@ -237,6 +238,7 @@
<ClInclude Include="GameClientState\LevelLoader\ParseFunctions.h" /> <ClInclude Include="GameClientState\LevelLoader\ParseFunctions.h" />
<ClInclude Include="GameClientState\LobbyAdminState.h" /> <ClInclude Include="GameClientState\LobbyAdminState.h" />
<ClInclude Include="GameClientState\MainState.h" /> <ClInclude Include="GameClientState\MainState.h" />
<ClInclude Include="GameClientState\NetLoadState.h" />
<ClInclude Include="Include\DanBiasGame.h" /> <ClInclude Include="Include\DanBiasGame.h" />
<ClInclude Include="GameClientState\LobbyState.h" /> <ClInclude Include="GameClientState\LobbyState.h" />
<ClInclude Include="GameClientState\C_Object.h" /> <ClInclude Include="GameClientState\C_Object.h" />

View File

@ -8,6 +8,7 @@
#include "GameClientState\LobbyAdminState.h" #include "GameClientState\LobbyAdminState.h"
#include "GameClientState\MainState.h" #include "GameClientState\MainState.h"
#include "GameClientState\LanMenuState.h" #include "GameClientState\LanMenuState.h"
#include "GameClientState\NetLoadState.h"
#include <Protocols.h> #include <Protocols.h>
#include "NetworkClient.h" #include "NetworkClient.h"
#include <GameServerAPI.h> #include <GameServerAPI.h>
@ -56,7 +57,6 @@ namespace DanBias
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
DanBiasClientReturn DanBiasGame::Initiate(DanBiasGameDesc& desc) DanBiasClientReturn DanBiasGame::Initiate(DanBiasGameDesc& desc)
{ {
WindowShell::CreateConsoleWindow(); WindowShell::CreateConsoleWindow();
//if(! data.window->CreateWin(WindowShell::WINDOW_INIT_DESC(L"Window", cPOINT(1600, 900), cPOINT()))) //if(! data.window->CreateWin(WindowShell::WINDOW_INIT_DESC(L"Window", cPOINT(1600, 900), cPOINT())))
if(! data.window->CreateWin(WindowShell::WINDOW_INIT_DESC())) if(! data.window->CreateWin(WindowShell::WINDOW_INIT_DESC()))
@ -151,7 +151,21 @@ namespace DanBias
DanBiasGame::Result DanBiasGame::Update(float deltaTime) DanBiasGame::Result DanBiasGame::Update(float deltaTime)
{ {
data.inputObj->Update(); { // updating mouse input
POINT mousePos;
GetCursorPos( &mousePos );
RECT windowVertex;
GetWindowRect( data.window->GetHWND(), &windowVertex );
float mouseNormalisedX = (float)(mousePos.x - windowVertex.left);
mouseNormalisedX /= (float)(windowVertex.right - windowVertex.left);
float mouseNormalisedY = (float)(mousePos.y - windowVertex.top);
mouseNormalisedY /= (float)(windowVertex.bottom - windowVertex.top);
data.inputObj->Update( mouseNormalisedX, mouseNormalisedY );
}
if( data.serverOwner ) if( data.serverOwner )
{ {
@ -169,8 +183,8 @@ namespace DanBias
switch (state) switch (state)
{ {
case Client::GameClientState::ClientState_LobbyCreate: case Client::GameClientState::ClientState_Main:
data.state = new Client::LobbyAdminState(); data.state = new Client::MainState();
stateChanged = true; stateChanged = true;
break; break;
case Client::GameClientState::ClientState_Lan: case Client::GameClientState::ClientState_Lan:
@ -181,10 +195,18 @@ namespace DanBias
data.state = new Client::LobbyState(); data.state = new Client::LobbyState();
stateChanged = true; stateChanged = true;
break; break;
case Client::GameClientState::ClientState_LobbyCreate:
data.state = new Client::LobbyAdminState();
stateChanged = true;
break;
case Client::GameClientState::ClientState_Game: case Client::GameClientState::ClientState_Game:
data.state = new Client::GameState(); data.state = new Client::GameState();
stateChanged = true; stateChanged = true;
break; break;
case Client::GameClientState::ClientState_NetLoad:
data.state = new Client::NetLoadState();
stateChanged = true;
break;
case Client::GameClientState::ClientState_Quit: case Client::GameClientState::ClientState_Quit:
data.state->Release(); data.state->Release();
return Result_quit; return Result_quit;

View File

@ -78,21 +78,24 @@ namespace DanBias
{ {
if(EventButton<Owner>::Enabled()) if(EventButton<Owner>::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));
//Render att xPos and yPos //Render att xPos and yPos
//With width and height //With width and height
if(EventButton<Owner>::GetState() == ButtonState_None) //if(EventButton<Owner>::GetState() == ButtonState_None)
{ //{
//Oyster::Graphics::API::RenderGuiElement(texture, pos.xy, size, Oyster::Math::Float3(1.0f, 1.0f, 1.0f)); // Oyster::Graphics::API::RenderGuiElement(texture, pos, size, Oyster::Math::Float3(1.0f, 1.0f, 1.0f));
} //}
else if(EventButton<Owner>::GetState() == ButtonState_Hover) //else if(EventButton<Owner>::GetState() == ButtonState_Hover)
{ //{
//Oyster::Graphics::API::RenderGuiElement(texture, pos.xy, size, Oyster::Math::Float3(0.0f, 1.0f, 0.0f)); // Oyster::Graphics::API::RenderGuiElement(texture, pos, size, Oyster::Math::Float3(0.0f, 1.0f, 0.0f));
} //}
else //else
{ //{
//Oyster::Graphics::API::RenderGuiElement(texture, pos.xy, size, Oyster::Math::Float3(1.0f, 0.0f, 0.0f)); // Oyster::Graphics::API::RenderGuiElement(texture, pos, size, Oyster::Math::Float3(1.0f, 0.0f, 0.0f));
} //}
} }
} }
@ -101,7 +104,7 @@ namespace DanBias
{ {
if(buttonText.size() > 0) if(buttonText.size() > 0)
{ {
//Oyster::Graphics::API::RenderText(buttonText, pos.xy, size, textColor); Oyster::Graphics::API::RenderText(buttonText, pos - Float3(size.x * 0.5f, size.y * 0.25f, 0.0f), size*2.0f, size.y * 0.5f, textColor);
} }
} }

View File

@ -28,7 +28,7 @@ namespace DanBias { namespace Client
const ::std::wstring & operator[]( unsigned int i ) const; const ::std::wstring & operator[]( unsigned int i ) const;
::std::wstring & operator[]( unsigned int i ); ::std::wstring & operator[]( unsigned int i );
void SetTextHeight( ::Oyster::Math::Float h ); void SetFontHeight( ::Oyster::Math::Float h );
void SetLineSpacing( ::Oyster::Math::Float ls ); void SetLineSpacing( ::Oyster::Math::Float ls );
void SetBottomAligned(); void SetBottomAligned();
@ -46,7 +46,7 @@ namespace DanBias { namespace Client
private: private:
bool isBottomAligned; bool isBottomAligned;
::Oyster::Math::Float textHeight, lineSpacing; ::Oyster::Math::Float fontHeight, lineSpacing;
::std::vector<::std::wstring> lines; ::std::vector<::std::wstring> lines;
}; };
@ -56,7 +56,7 @@ namespace DanBias { namespace Client
TextField<Owner>::TextField() TextField<Owner>::TextField()
: ButtonRectangle() : ButtonRectangle()
{ {
this->textHeight = 0.025f; this->fontHeight = 0.025f;
this->lineSpacing = 0.001f; this->lineSpacing = 0.001f;
this->isBottomAligned = true; this->isBottomAligned = true;
} }
@ -65,7 +65,7 @@ namespace DanBias { namespace Client
TextField<Owner>::TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize ) TextField<Owner>::TextField( ::std::wstring backgroundTexture, ::Oyster::Math::Float3 textColor, Owner owner, Oyster::Math::Float3 pos, Oyster::Math::Float2 size, ResizeAspectRatio resize )
: ButtonRectangle( backgroundTexture, L"", textColor, owner, pos, size, resize ) : ButtonRectangle( backgroundTexture, L"", textColor, owner, pos, size, resize )
{ {
this->textHeight = 0.025f; this->fontHeight = 0.025f;
this->lineSpacing = 0.001f; this->lineSpacing = 0.001f;
this->isBottomAligned = true; this->isBottomAligned = true;
} }
@ -76,38 +76,37 @@ namespace DanBias { namespace Client
template<typename Owner> template<typename Owner>
void TextField<Owner>::RenderText() void TextField<Owner>::RenderText()
{ {
::Oyster::Math::Float lineStep = this->textHeight + this->lineSpacing; ::Oyster::Math::Float lineStep = this->fontHeight + this->lineSpacing;
::Oyster::Math::Float2 rowSize = ::Oyster::Math::Float2( this->size.x, this->textHeight ); ::Oyster::Math::Float2 rowSize = ::Oyster::Math::Float2( this->size.x, this->fontHeight );
::Oyster::Math::Float3 fieldTopLeft = this->pos - Float3( this->size * 0.25f, 0.0f );
::Oyster::Math::Float3 topLeft = fieldTopLeft;
if( this->isBottomAligned ) if( this->isBottomAligned )
{ {
::Oyster::Math::Float2 topLeft = this->pos;
topLeft.y += this->size.y - lineStep; topLeft.y += this->size.y - lineStep;
auto line = this->lines.rbegin(); auto line = this->lines.rbegin();
for( ; line != this->lines.rend(); ++line ) for( ; line != this->lines.rend(); ++line )
{ {
if( topLeft.y - lineStep >= this->pos.y ) if( topLeft.y < fieldTopLeft.y )
{ break;
::Oyster::Graphics::API::RenderText( (*line), topLeft, rowSize, this->textColor );
topLeft.y -= lineStep; ::Oyster::Graphics::API::RenderText( (*line), topLeft, rowSize, this->fontHeight, this->textColor );
} topLeft.y -= lineStep;
else break;
} }
} }
else else
{ {
::Oyster::Math::Float2 topLeft = this->pos; topLeft.y += this->lineSpacing;
auto line = this->lines.begin(); auto line = this->lines.begin();
for( ; line != this->lines.end(); ++line ) for( ; line != this->lines.end(); ++line )
{ {
if( topLeft.y + lineStep < this->size.y ) if( topLeft.y >= fieldTopLeft.y + this->size.y )
{ break;
::Oyster::Graphics::API::RenderText( (*line), topLeft, rowSize, this->textColor );
topLeft.y += lineStep; ::Oyster::Graphics::API::RenderText( (*line), topLeft, rowSize, this->fontHeight, this->textColor );
} topLeft.y += lineStep;
else break;
} }
} }
} }
@ -125,9 +124,9 @@ namespace DanBias { namespace Client
} }
template<typename Owner> template<typename Owner>
void TextField<Owner>::SetTextHeight( ::Oyster::Math::Float h ) void TextField<Owner>::SetFontHeight( ::Oyster::Math::Float h )
{ {
this->textHeight = h; this->fontHeight = h;
} }
template<typename Owner> template<typename Owner>
@ -173,7 +172,7 @@ namespace DanBias { namespace Client
split.reserve( 10 ); split.reserve( 10 );
::Utility::String::Split( split, text, L"\n", 0 ); ::Utility::String::Split( split, text, L"\n", 0 );
auto line = split.begin(); auto line = split.begin();
for( ; line != split.end; ++line ) for( ; line != split.end(); ++line )
{ {
this->lines.push_back( (*line) ); this->lines.push_back( (*line) );
} }

View File

@ -1,14 +1,31 @@
#include "C_Object.h" #include "C_Object.h"
using namespace DanBias::Client; using namespace DanBias::Client;
void C_Object::Init(ModelInitData modelInit) C_Object::C_Object()
{
world = Oyster::Math::Float4x4::identity;
position = Oyster::Math::Float3::null;
rotation = Oyster::Math::Quaternion::identity;
scale = Oyster::Math::Float3::null;
id = 0;
model = NULL;
}
C_Object::~C_Object()
{
}
bool C_Object::Init(ModelInitData modelInit)
{ {
position = modelInit.position; position = modelInit.position;
rotation = modelInit.rotation; rotation = modelInit.rotation;
scale = modelInit.scale; scale = modelInit.scale;
id = modelInit.id; id = modelInit.id;
model = Oyster::Graphics::API::CreateModel(modelInit.modelPath); model = Oyster::Graphics::API::CreateModel(modelInit.modelPath);
if(model == NULL)
return false;
model->Visible = modelInit.visible; model->Visible = modelInit.visible;
updateWorld(); updateWorld();
return true;
} }
void C_Object::updateWorld() void C_Object::updateWorld()
{ {

View File

@ -5,6 +5,7 @@ namespace DanBias
{ {
namespace Client namespace Client
{ {
struct ModelInitData struct ModelInitData
{ {
int id; int id;
@ -15,52 +16,37 @@ namespace DanBias
bool visible; bool visible;
}; };
class C_Object class C_Object
{ {
protected: private:
Oyster::Graphics::Model::Model *model; Oyster::Math::Float4x4 world;
private: Oyster::Math::Float3 position;
Oyster::Math::Float4x4 world; Oyster::Math::Quaternion rotation;
Oyster::Math::Float3 position; Oyster::Math::Float3 scale;
Oyster::Math::Quaternion rotation;
Oyster::Math::Float3 scale;
int id;
void updateWorld();
public:
virtual void Init(ModelInitData modelInit);
void setWorld(Oyster::Math::Float4x4 world); int id;
Oyster::Math::Float4x4 getWorld() const; void updateWorld();
void setPos(Oyster::Math::Float3 newPos); protected:
Oyster::Math::Float3 getPos() const; Oyster::Graphics::Model::Model *model;
void addPos(Oyster::Math::Float3 deltaPos); public:
void setRot(Oyster::Math::Quaternion newRot); C_Object();
Oyster::Math::Quaternion getRotation() const; virtual ~C_Object();
void addRot(Oyster::Math::Quaternion deltaRot); virtual bool Init(ModelInitData modelInit);
void setScale(Oyster::Math::Float3 newScale);
void addScale(Oyster::Math::Float3 deltaScale); void setWorld(Oyster::Math::Float4x4 world);
Oyster::Math::Float3 getScale() const; Oyster::Math::Float4x4 getWorld() const;
void setPos(Oyster::Math::Float3 newPos);
virtual void Render(); Oyster::Math::Float3 getPos() const;
virtual void Release(); void addPos(Oyster::Math::Float3 deltaPos);
virtual int GetId() const; 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);
namespace Utility { namespace DynamicMemory Oyster::Math::Float3 getScale() const;
{ // template specializationto allowuse of dynamicmemory tools
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 #endif

View File

@ -11,7 +11,7 @@ C_DynamicObj::~C_DynamicObj(void)
{ {
} }
void C_DynamicObj::Init(ModelInitData modelInit) bool C_DynamicObj::Init(ModelInitData modelInit)
{ {
C_Object::Init(modelInit); return C_Object::Init(modelInit);
} }

View File

@ -11,7 +11,7 @@ private:
public: public:
C_DynamicObj(void); C_DynamicObj(void);
virtual ~C_DynamicObj(void); virtual ~C_DynamicObj(void);
void Init(ModelInitData modelInit); bool Init(ModelInitData modelInit);
};};}; };};};
#endif #endif

View File

@ -3,14 +3,22 @@
using namespace DanBias::Client; using namespace DanBias::Client;
C_Player::C_Player(void) C_Player::C_Player(void)
:C_DynamicObj() {} :C_DynamicObj()
C_Player::~C_Player(void) {}
void C_Player::Init(ModelInitData modelInit)
{ {
C_Object::Init(modelInit);
Oyster::Graphics::API::PlayAnimation( this->model, L"movement" );
//Oyster::Graphics::API::Update(0.002f);
} }
C_Player::~C_Player(void)
{
}
bool C_Player::Init(ModelInitData modelInit)
{
return C_Object::Init(modelInit);
}
void C_Player::playAnimation(std::wstring animation, bool loop)
{
if(model)
Oyster::Graphics::API::PlayAnimation(model, L"movement", loop);
}

View File

@ -5,15 +5,14 @@ namespace DanBias
{ {
namespace Client namespace Client
{ {
class C_Player : public C_DynamicObj class C_Player : public C_DynamicObj
{ {
private: private:
public: public:
C_Player(void); C_Player(void);
virtual ~C_Player(void); virtual ~C_Player(void);
void Init(ModelInitData modelInit); bool Init(ModelInitData modelInit);
void playAnimation(std::wstring animation, bool loop);
}; };};};
}
}
#endif #endif

View File

@ -10,7 +10,7 @@ C_StaticObj::~C_StaticObj(void)
{ {
} }
void C_StaticObj::Init(ModelInitData modelInit) bool C_StaticObj::Init(ModelInitData modelInit)
{ {
C_Object::Init(modelInit); return C_Object::Init(modelInit);
} }

View File

@ -11,7 +11,7 @@ private:
public: public:
C_StaticObj(void); C_StaticObj(void);
virtual ~C_StaticObj(void); virtual ~C_StaticObj(void);
void Init(ModelInitData modelInit); bool Init(ModelInitData modelInit);
};};}; };};};
#endif #endif

View File

@ -10,7 +10,7 @@ C_UIobject::C_UIobject(void)
C_UIobject::~C_UIobject(void) C_UIobject::~C_UIobject(void)
{ {
} }
void C_UIobject::Init(ModelInitData modelInit) bool C_UIobject::Init(ModelInitData modelInit)
{ {
C_Object::Init(modelInit); return C_Object::Init(modelInit);
} }

View File

@ -12,7 +12,7 @@ namespace DanBias
public: public:
C_UIobject(void); C_UIobject(void);
virtual ~C_UIobject(void); virtual ~C_UIobject(void);
void Init(ModelInitData modelInit); bool Init(ModelInitData modelInit);
void setPos(Oyster::Math::Float4x4 world); void setPos(Oyster::Math::Float4x4 world);
};};}; };};};
#endif #endif

View File

@ -12,11 +12,12 @@ namespace DanBias { namespace Client
public: public:
enum ClientState enum ClientState
{ {
ClientState_Login, ClientState_Main,
ClientState_Lan, ClientState_Lan,
ClientState_Lobby, ClientState_Lobby,
ClientState_LobbyCreate, ClientState_LobbyCreate,
ClientState_LobbyReady, ClientState_LobbyReady,
ClientState_NetLoad,
ClientState_Game, ClientState_Game,
ClientState_Same, ClientState_Same,
ClientState_Quit ClientState_Quit

View File

@ -2,20 +2,20 @@
#include "DllInterfaces/GFXAPI.h" #include "DllInterfaces/GFXAPI.h"
#include <Protocols.h> #include <Protocols.h>
#include "NetworkClient.h" #include "NetworkClient.h"
#include "Camera.h" #include "Camera_FPS.h"
#include <GameServerAPI.h> #include <GameServerAPI.h>
#include "LevelLoader\ObjectDefines.h"
using namespace GameLogic; using namespace ::DanBias::Client;
using namespace DanBias::Client; using namespace ::Oyster;
using namespace Oyster::Math; using namespace ::Oyster::Network;
struct GameState::myData using namespace ::Oyster::Math3D;
struct GameState::MyData
{ {
myData(){} MyData(){}
int modelCount; GameClientState::ClientState nextState;
Oyster::Network::NetworkClient* nwClient; NetworkClient *nwClient;
gameStateState state; } privData;
}privData;
GameState::GameState(void) GameState::GameState(void)
{ {
@ -23,145 +23,36 @@ GameState::GameState(void)
key_backward = false; key_backward = false;
key_strafeRight = false; key_strafeRight = false;
key_strafeLeft = false; key_strafeLeft = false;
timer = 0;
} }
GameState::~GameState(void) GameState::~GameState(void)
{ {
delete this->camera; if( this->privData )
delete this->privData; this->Release();
} }
bool GameState::Init(Oyster::Network::NetworkClient* nwClient)
bool GameState::Init(NetworkClient* nwClient)
{ {
// load models // load models
camera = new Camera; privData = new MyData();
privData = new myData();
privData->state = gameStateState_loading;
privData->nwClient = nwClient;
privData->state = LoadGame();
pitch = 0;
//tELL SERver ready this->privData->nextState = GameClientState::ClientState_Same;
nwClient->Send(GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready)); this->privData->nwClient = nwClient;
LoadGame();
//tell server ready
nwClient->Send( GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready) );
return true; return true;
} }
GameState::gameStateState GameState::LoadGame() GameState::gameStateState GameState::LoadGame()
{ {
Oyster::Graphics::Definitions::Pointlight plight;
plight.Pos = Float3(615, 0 ,5);
plight.Color = Float3(0.9f,0.7f,0.2f);
plight.Radius = 100;
plight.Bright = 0.5f;
Oyster::Graphics::API::AddLight(plight);
plight.Pos = Float3(10,800,5);
plight.Color = Float3(0.9f,0.7f,0.3f);
plight.Radius = 300;
plight.Bright = 0.5f;
Oyster::Graphics::API::AddLight(plight);
// use level loader
LoadModels("../Content/Worlds/ccc.bias");
// hardcoded objects
Float3 startPos = Float3(0,0,20.0f);
InitCamera(startPos);
return gameStateState_playing; return gameStateState_playing;
} }
bool GameState::LoadModels()
{
// open file
// read file
// init models
int nrOfBoxex = 5;
int id = 100;
// add world model
ModelInitData modelData;
modelData.position = Oyster::Math::Float3(0,0,0);
modelData.rotation = Oyster::Math::Quaternion::identity;
modelData.scale = Oyster::Math::Float3(2,2,2);
modelData.modelPath = L"world_earth.dan";
modelData.id = id++;
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
// add box model
modelData.position = Oyster::Math::Float3(0,0,0);
modelData.rotation = Oyster::Math::Quaternion::identity;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.modelPath = L"crate_colonists.dan";
for(int i =0; i< nrOfBoxex; i ++)
{
modelData.position = Oyster::Math::Float3(4,320,0);
modelData.id = id++;
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
}
// add crystal model
modelData.position = Oyster::Math::Float3(10, 601, 0);
modelData.modelPath = L"crystalformation_b.dan";
modelData.id = id++;
// load models
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
// add house model
modelData.position = Oyster::Math::Float3(-50, 590, 0);
//Oyster::Math3D::Float4x4 rot = Oyster::Math3D::RotationMatrix(Oyster::Math::Float3(0 ,Utility::Value::Radian(90.0f), 0));
modelData.visible = true;
modelData.modelPath = L"building_corporation.dan";
modelData.id = id++;
// load models
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
// add jumppad
modelData.position = Oyster::Math::Float3(4, 600.3f, 0);
modelData.modelPath = L"jumppad_round.dan";
modelData.id = id++;
// load models
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
// add player model
modelData.position = Oyster::Math::Float3(0, 602, 0);
modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = id++;
// load models
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
// add player model 2
modelData.position = Oyster::Math::Float3(50, 602, 0);
modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = id++;
// load models
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
// add sky sphere
modelData.position = Oyster::Math::Float3(0,0,0);
modelData.scale = Oyster::Math::Float3(800,800,800);
modelData.modelPath = L"skysphere.dan";
modelData.id = id++;
// load models
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
return true;
}
bool GameState::LoadModels(std::string mapFile) bool GameState::LoadModels(std::string mapFile)
{ {
GameLogic::LevelLoader levelLoader; GameLogic::LevelLoader levelLoader;
@ -169,7 +60,7 @@ bool GameState::LoadModels(std::string mapFile)
objects = levelLoader.LoadLevel(mapFile); objects = levelLoader.LoadLevel(mapFile);
int objCount = objects.size(); int objCount = objects.size();
int modelId = 100; int modelId = 0;
ModelInitData modelData; ModelInitData modelData;
for (int i = 0; i < objCount; i++) for (int i = 0; i < objCount; i++)
{ {
@ -186,9 +77,9 @@ bool GameState::LoadModels(std::string mapFile)
modelData.modelPath.assign(staticObjData->ModelFile.begin(), staticObjData->ModelFile.end()); modelData.modelPath.assign(staticObjData->ModelFile.begin(), staticObjData->ModelFile.end());
modelData.visible = true; modelData.visible = true;
modelData.position = staticObjData->position; //modelData.position = ;
modelData.rotation = Oyster::Math::Quaternion(Oyster::Math::Float3(staticObjData->rotation), staticObjData->rotation[3]); //modelData.rotation = Quaternion(Float3(2,2,-2), 1);
modelData.scale = staticObjData->scale; //modelData.scale = Float3(2,2,2);
modelData.id = modelId++; modelData.id = modelId++;
this->staticObjects.Push(new C_StaticObj()); this->staticObjects.Push(new C_StaticObj());
@ -198,11 +89,11 @@ bool GameState::LoadModels(std::string mapFile)
case GameLogic::ObjectType::ObjectType_Dynamic: case GameLogic::ObjectType::ObjectType_Dynamic:
{ {
GameLogic::ObjectHeader* dynamicObjData = ((GameLogic::ObjectHeader*)obj); 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.modelPath.assign(dynamicObjData->ModelFile.begin(), dynamicObjData->ModelFile.end());
modelData.visible = true; modelData.visible = true;
modelData.position = dynamicObjData->position;
modelData.rotation = Oyster::Math::Quaternion(Oyster::Math::Float3(dynamicObjData->rotation), dynamicObjData->rotation[3]);
modelData.scale = dynamicObjData->scale;
modelData.id = modelId++; modelData.id = modelId++;
this->dynamicObjects.Push(new C_DynamicObj()); this->dynamicObjects.Push(new C_DynamicObj());
@ -213,14 +104,19 @@ bool GameState::LoadModels(std::string mapFile)
{ {
GameLogic::BasicLight* lightData = ((GameLogic::BasicLight*)obj); GameLogic::BasicLight* lightData = ((GameLogic::BasicLight*)obj);
if(lightData->lightType == GameLogic::LightType_PointLight) switch( lightData->lightType )
{ {
Oyster::Graphics::Definitions::Pointlight plight; case GameLogic::LightType_PointLight:
plight.Pos = ((GameLogic::BasicLight*)lightData)->position; {
plight.Color = lightData->color; //Oyster::Graphics::Definitions::Pointlight plight;
plight.Radius = 100; //plight.Pos = ((GameLogic::PointLight*)lightData)->position;
plight.Bright = 0.9f; //plight.Color = lightData->diffuseColor;
Oyster::Graphics::API::AddLight(plight); //plight.Radius = 100;
//plight.Bright = 0.9f;
//Oyster::Graphics::API::AddLight(plight);
}
break;
default: break;
} }
} }
break; break;
@ -228,67 +124,39 @@ bool GameState::LoadModels(std::string mapFile)
break; break;
} }
} }
myId += modelId++;
Oyster::Math::Quaternion first = Oyster::Math::Quaternion(Float3(0.3536,0.3536,-0.146), 0.8536); // add player model
Oyster::Math::Quaternion second = Oyster::Math::Quaternion(Float3(0.3536,0.3536,-0.146), 0.8536); //modelData.position = ;
Oyster::Math::Quaternion result = first * second; //modelData.rotation = Quaternion(Float3(2,2,-2), 1);
Oyster::Math::Quaternion total = Oyster::Math::Quaternion(Float3(0.5,0.5,-0.5), 0.5); //modelData.scale = Float3(2,2,2);
modelData.visible = true;
modelData.position = Oyster::Math::Float3(20, 127,0);
modelData.rotation = first;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = myId;
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
modelData.visible = true; modelData.visible = true;
modelData.position = Oyster::Math::Float3(22, 127,0);
modelData.rotation = second;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.modelPath = L"char_still_sizeref.dan"; modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = myId; modelData.id = myId;
// load models
this->dynamicObjects.Push(new C_DynamicObj());
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
this->staticObjects.Push(new C_StaticObj()); /*C_Player* obj = new C_Player();
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData); privData->object.push_back(obj);
privData->object[privData->object.size() -1 ]->Init(modelData);
modelData.visible = true; */
modelData.position = Oyster::Math::Float3(24, 127,0);
modelData.rotation = result;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = myId;
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
modelData.visible = true;
modelData.position = Oyster::Math::Float3(26, 127,0);
modelData.rotation = total;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.modelPath = L"char_still_sizeref.dan";
modelData.id = myId;
this->staticObjects.Push(new C_StaticObj());
this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData);
return true; return true;
} }
bool GameState::InitCamera(Float3 startPos) bool GameState::InitCamera(Float3 startPos)
{ {
Float3 dir = Float3(0,0,1); camera.SetHeadOffset( Float3(0.0f, 1.0f, 1.0f) );
Float3 up = Float3(0,1,0); camera.SetPerspectiveProjection( pi / 4.0f, 1024.0f/768.0f, 1.0f, 1000.0f );
Float3 pos = Float3(0, 0, 20); camera.UpdateOrientation();
camera->LookAt(pos, dir, up); Oyster::Graphics::API::SetProjection(camera.GetProjectionMatrix());
camera->SetLens(pi/4, 1024/768, 1, 1000);
camera->UpdateViewMatrix();
Oyster::Graphics::API::SetProjection(camera->Proj());
return true; return true;
} }
void GameState::InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Float4x4 world)
void GameState::InitiatePlayer(int id, std::wstring modelName, Float4x4 world)
{ {
myId = id; myId = id;
@ -296,87 +164,61 @@ void GameState::InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Flo
C_Object* obj; C_Object* obj;
modelData.visible = true; modelData.visible = true;
//modelData.world = world; //modelData.world = world;
modelData.position = Oyster::Math::Float3(world[12], world[13], world[14]); modelData.position = Float3(world[12], world[13], world[14]);
modelData.rotation = Oyster::Math::Quaternion(Oyster::Math::Float3(0,0,0), 1); modelData.rotation = Quaternion(Float3(0,0,0), 1);
modelData.scale = Oyster::Math::Float3(1,1,1); modelData.scale = Float3(1,1,1);
modelData.modelPath = modelName; modelData.modelPath = modelName;
modelData.id = myId; modelData.id = myId;
obj = new C_Player(); obj = new C_Player();
this->dynamicObjects.Push(obj); this->dynamicObjects.Push(obj);
this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData);
Oyster::Math::Float3 right = Oyster::Math::Float3(world[0], world[1], world[2]);
Oyster::Math::Float3 up = Oyster::Math::Float3(world[4], world[5], world[6]);
Oyster::Math::Float3 objForward = (Oyster::Math::Float3(world[8], world[9], world[10]));
Oyster::Math::Float3 pos = Oyster::Math::Float3(world[12], world[13], world[14]);
Oyster::Math::Float3 cameraLook = camera->GetLook(); Float3 pos = Float3(world[12], world[13], world[14]);
Oyster::Math::Float3 cameraUp = camera->GetUp();
/*Oyster::Math::Float3 newUp = cameraUp.Dot(up); camera.SetPosition( pos );
up *= newUp; camera.UpdateOrientation();
up.Normalize();
Oyster::Math::Float3 newLook = up.Cross(right);
newLook.Normalize();*/
camera->setRight(right);
camera->setUp(up);
camera->setLook(objForward);
up *= 2;
objForward *= 3;
Oyster::Math::Float3 cameraPos = up + pos + objForward;
camera->SetPosition(cameraPos);
camera->UpdateViewMatrix();
} }
GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyInput) GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyInput)
{ {
switch (privData->state) //switch (privData->state)
{ //{
case gameStateState_loading: //Will this ever happen in this scope?? //case gameStateState_loading: //Will this ever happen in this scope??
{ // {
// load map // // load map
// wait for all players // // wait for all players
LoadGame(); // LoadGame();
GameLogic::Protocol_General_Status gameStatus; // GameLogic::Protocol_General_Status gameStatus;
gameStatus.status = GameLogic::Protocol_General_Status::States_ready; // gameStatus.status = GameLogic::Protocol_General_Status::States_ready;
privData->nwClient->Send(gameStatus); // privData->nwClient->Send(gameStatus);
privData->state = gameStateState_playing; // privData->state = gameStateState_playing;
} // }
break; // break;
case gameStateState_playing: //case gameStateState_playing:
// read server data // // read server data
// update objects // // update objects
{ // {
timer += deltaTime; // readKeyInput(KeyInput);
if(timer > 0.03) // camera.UpdateOrientation();
{ // }
readKeyInput(KeyInput); // break;
timer = 0; //case gameStateState_end:
} // return ClientState_Lobby;
camera->UpdateViewMatrix(); // break;
//default:
// break;
//}
//
//// send key input to server.
//return ClientState_Same;
} return this->privData->nextState;
break;
case gameStateState_end:
return ClientState_Lobby;
break;
default:
break;
}
// send key input to server.
return ClientState_Same;
} }
bool GameState::Render(float dt)
bool GameState::Render()
{ {
Oyster::Graphics::API::SetView(camera->View()); Oyster::Graphics::API::SetView( camera.GetViewMatrix() );
Oyster::Graphics::API::NewFrame(); Oyster::Graphics::API::NewFrame();
for (unsigned int i = 0; i < staticObjects.Size(); i++) for (unsigned int i = 0; i < staticObjects.Size(); i++)
@ -387,34 +229,28 @@ bool GameState::Render(float dt)
{ {
dynamicObjects[i]->Render(); dynamicObjects[i]->Render();
} }
Oyster::Graphics::API::StartTextRender();
std::wstring fps;
float f = 1/dt;
fps = std::to_wstring(f);
//Oyster::Graphics::API::RenderText(fps,Oyster::Math::Float2(0.5f,0.1f),Oyster::Math::Float2(0.2f,0.05f));
Oyster::Graphics::API::EndFrame(); Oyster::Graphics::API::EndFrame();
return true; return true;
} }
bool GameState::Release() bool GameState::Release()
{ {
/*for (unsigned int i = 0; i < privData->object.size(); i++)
{
privData->object[i]->Release();
delete privData->object[i];
privData->object[i] = NULL;
}*/
delete privData;
privData = NULL; privData = NULL;
return true; return true;
} }
void GameState::ChangeState( ClientState next )
{
this->privData->nextState = next;
}
void GameState::readKeyInput(InputClass* KeyInput) void GameState::readKeyInput(InputClass* KeyInput)
{ {
if(KeyInput->IsKeyPressed(DIK_W)) if(KeyInput->IsKeyPressed(DIK_W))
{ {
//if(!key_forward) if(!key_forward)
{ {
privData->nwClient->Send(GameLogic::Protocol_PlayerMovementForward()); privData->nwClient->Send(GameLogic::Protocol_PlayerMovementForward());
key_forward = true; key_forward = true;
@ -425,7 +261,7 @@ void GameState::readKeyInput(InputClass* KeyInput)
if(KeyInput->IsKeyPressed(DIK_S)) if(KeyInput->IsKeyPressed(DIK_S))
{ {
//if(!key_backward) if(!key_backward)
{ {
privData->nwClient->Send(GameLogic::Protocol_PlayerMovementBackward()); privData->nwClient->Send(GameLogic::Protocol_PlayerMovementBackward());
key_backward = true; key_backward = true;
@ -436,7 +272,7 @@ void GameState::readKeyInput(InputClass* KeyInput)
if(KeyInput->IsKeyPressed(DIK_A)) if(KeyInput->IsKeyPressed(DIK_A))
{ {
//if(!key_strafeLeft) if(!key_strafeLeft)
{ {
privData->nwClient->Send(GameLogic::Protocol_PlayerMovementLeft()); privData->nwClient->Send(GameLogic::Protocol_PlayerMovementLeft());
key_strafeLeft = true; key_strafeLeft = true;
@ -447,7 +283,7 @@ void GameState::readKeyInput(InputClass* KeyInput)
if(KeyInput->IsKeyPressed(DIK_D)) if(KeyInput->IsKeyPressed(DIK_D))
{ {
//if(!key_strafeRight) if(!key_strafeRight)
{ {
privData->nwClient->Send(GameLogic::Protocol_PlayerMovementRight()); privData->nwClient->Send(GameLogic::Protocol_PlayerMovementRight());
key_strafeRight = true; key_strafeRight = true;
@ -458,17 +294,16 @@ void GameState::readKeyInput(InputClass* KeyInput)
//send delta mouse movement //send delta mouse movement
if (KeyInput->IsMousePressed()) //if (KeyInput->IsMousePressed())
{ {
camera->Yaw(-KeyInput->GetYaw()); camera.YawRight( -KeyInput->GetYaw() );
camera->Pitch(KeyInput->GetPitch()); camera.PitchUp( KeyInput->GetPitch() );
pitch = KeyInput->GetPitch(); camera.UpdateOrientation();
camera->UpdateViewMatrix();
Oyster::Math::Float3 look = camera->GetLook();
Oyster::Math::Float3 right = camera->GetRight();
GameLogic::Protocol_PlayerLook playerLook(look, right);
privData->nwClient->Send(playerLook); GameLogic::Protocol_PlayerLook playerLookDir;
Float4 look = camera.GetLook();
privData->nwClient->Send( playerLookDir );
} }
// shoot // shoot
@ -486,7 +321,6 @@ void GameState::readKeyInput(InputClass* KeyInput)
} }
else else
key_Shoot = false; key_Shoot = false;
if(KeyInput->IsKeyPressed(DIK_X)) if(KeyInput->IsKeyPressed(DIK_X))
{ {
if(!key_Shoot) if(!key_Shoot)
@ -501,7 +335,6 @@ void GameState::readKeyInput(InputClass* KeyInput)
} }
else else
key_Shoot = false; key_Shoot = false;
if(KeyInput->IsKeyPressed(DIK_C)) if(KeyInput->IsKeyPressed(DIK_C))
{ {
if(!key_Shoot) if(!key_Shoot)
@ -531,98 +364,141 @@ void GameState::readKeyInput(InputClass* KeyInput)
// send event data // send event data
// //
if(KeyInput->IsKeyPressed(DIK_L)) //if(KeyInput->IsKeyPressed(DIK_L))
privData->state = GameState::gameStateState_end; // privData->state = GameState::gameStateState_end;
} }
void GameState::Protocol(ProtocolStruct* pos) using namespace ::Oyster::Network;
using namespace ::Utility::DynamicMemory;
// returns -1 if none found
int FindObject( const DynamicArray<SmartPointer<C_Object>> &collection, int id )
{ {
int num = collection.Size();
for( int i = 0; i < num; ++i ) if( id == collection[i]->GetId() )
return i;
return -1;
}
void GameState::DataRecieved( NetEvent<NetworkClient*, NetworkClient::ClientEventArgs> e )
{
CustomNetProtocol data = e.args.data.protocol;
short ID = data[0].value.netShort; // fetching the id data.
} if( ProtocolIsGameplay(ID) )
void GameState::Protocol( PlayerPos* pos )
{
//Oyster::Math::Float4x4 world, translate;
//world = Oyster::Math::Float4x4::identity;
//translate = Oyster::Math::Float4x4::identity;
//translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(pos->playerPos[0],pos->playerPos[1],pos->playerPos[2]));
//world = world * translate;
////privData->object[0]->setPos( world );
//for (unsigned int i = 0; i < dynamicObjects.Size(); i++)
//{
// dynamicObjects[i]->Render();
//}
}
void GameState::Protocol( ObjPos* pos )
{
Oyster::Math::Float4x4 world;
for(int i = 0; i<16; i++)
{ {
world[i] = pos->worldPos[i]; switch(ID)
}
for (unsigned int i = 0; i < dynamicObjects.Size(); i++)
{
if(dynamicObjects[i]->GetId() == pos->object_ID)
{ {
dynamicObjects[i]->setPos(Float3(world[0], world[1], world[2])); case protocol_Gameplay_ObjectPickup: break; /** @todo TODO: implement */
dynamicObjects[i]->setRot(Quaternion(Float3(world[3], world[4], world[5]), world[6])); case protocol_Gameplay_ObjectDamage: break; /** @todo TODO: implement */
//dynamicObjects[i]->setWorld(world); case protocol_Gameplay_ObjectHealthStatus: break; /** @todo TODO: implement */
case protocol_Gameplay_ObjectPosition:
if(dynamicObjects[i]->GetId() == myId) // playerobj
{ {
GameLogic::Protocol_ObjectPosition decoded(data);
// if is this player. Remember to change camera
if( this->myId == decoded.object_ID )
camera.SetPosition( decoded.position );
Float3 pos = dynamicObjects[i]->getPos(); int i = FindObject( this->dynamicObjects, decoded.object_ID );
Float3 up = dynamicObjects[i]->getWorld().v[1]; if( i > -1 )
Float3 objForward = dynamicObjects[i]->getWorld().v[2]; this->dynamicObjects[i]->setPos( decoded.position );
up *= 3;
objForward *= -4;
Oyster::Math::Float3 cameraPos = pos + up + objForward;
camera->SetPosition(cameraPos);
} }
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 );
}
break;
case protocol_Gameplay_ObjectRotation:
{
GameLogic::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) );
int i = FindObject( this->dynamicObjects, decoded.object_ID );
if( i > -1 )
this->dynamicObjects[i]->setRot( rotation );
}
break;
case protocol_Gameplay_ObjectPositionRotation:
{
GameLogic::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 )
{
camera.SetPosition( position );
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 );
}
}
break;
case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */
case protocol_Gameplay_ObjectDisabled:
{
GameLogic::Protocol_ObjectDisable decoded(data);
int i = FindObject( this->dynamicObjects, decoded.objectID );
if( i > -1 )
{
this->dynamicObjects[i].Release();
this->dynamicObjects.Pop(i);
}
}
break;
case protocol_Gameplay_ObjectCreate:
{
GameLogic::Protocol_ObjectCreate decoded(data);
C_DynamicObj* object = new C_DynamicObj();
ModelInitData modelData;
{
modelData.position = Float3( decoded.position );
modelData.rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] );
modelData.scale = Float3( decoded.scale );
modelData.visible = true;
modelData.id = decoded.object_ID;
::Utility::String::StringToWstring( decoded.name, modelData.modelPath );
}
object->Init(modelData);
dynamicObjects.Push(object);
}
break;
case protocol_Gameplay_ObjectCreatePlayer: break; /** @todo TODO: implement */
case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */
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 */
default: break;
} }
} }
} else if( ProtocolIsGeneral(ID) )
void GameState::Protocol( NewObj* newObj )
{
Oyster::Math::Float4x4 world;
for(int i = 0; i<16; i++)
{ {
world[i] = newObj->worldPos[i]; switch( ID )
}
ModelInitData modelData;
//modelData.world = world;
modelData.visible = true;
modelData.id = newObj->object_ID;
//not sure if this is good parsing rom char* to wstring
const char* path = newObj->path;
modelData.modelPath = std::wstring(path, path + strlen(path));
// load models
C_DynamicObj* player = new C_DynamicObj();
player->Init(modelData);
dynamicObjects.Push(player);
}
void DanBias::Client::GameState::Protocol( RemoveObj* obj )
{
for (unsigned int i = 0; i < dynamicObjects.Size(); i++)
{
if(dynamicObjects[i]->GetId() == obj->object_ID)
{ {
//dynamicObjects[i]->Release(); case protocol_General_Status: break; /** @todo TODO: implement */
dynamicObjects[i].Release(); case protocol_General_Text: break; /** @todo TODO: implement */
//dynamicObjects.erase(privData->object.begin() + i ); default: break;
} }
} }
//privData->object[obj->object_ID]->Release( );
} }
//void GameState::Protocol(LightPos pos);

View File

@ -36,6 +36,7 @@ struct LanMenuState::MyData
} privData; } privData;
void OnButtonInteract_Connect( Oyster::Event::ButtonEvent<LanMenuState*>& e ); void OnButtonInteract_Connect( Oyster::Event::ButtonEvent<LanMenuState*>& e );
void OnButtonInteract_Exit( Oyster::Event::ButtonEvent<LanMenuState*>& e );
LanMenuState::LanMenuState() {} LanMenuState::LanMenuState() {}
@ -55,19 +56,22 @@ bool LanMenuState::Init(Network::NetworkClient* nwClient)
this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" );
// create guiElements // create guiElements
ButtonRectangle<LanMenuState*> *guiElements; this->privData->connectIP = new TextField<LanMenuState*>( L"earth_md.png", Float3(1.0f), this, Float3(0.5f, 0.3f, 0.5f), Float2(0.8f, 0.09f), ResizeAspectRatio_None );
//0.5f, 0.2f, 0.3f, 0.1f,
guiElements = new ButtonRectangle<LanMenuState*>( L"earth_md.png", L"Connect", Float3(1.0f), OnButtonInteract_Connect, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width );
this->privData->guiElements.AddButton( guiElements );
this->privData->connectIP = new TextField<LanMenuState*>( L"earth_md.png", Float3(1.0f), this, Float3(0.1f, 0.2f, 0.5f), Float2(0.45f, 0.1f), ResizeAspectRatio_Width );
this->privData->connectIP->ReserveLines( 1 ); this->privData->connectIP->ReserveLines( 1 );
(*this->privData->connectIP)[0] = L"127.0.0.1"; this->privData->connectIP->AppendText( L"127.0.0.1" );
this->privData->connectIP->SetTextHeight( 0.1f ); this->privData->connectIP->SetFontHeight( 0.08f );
this->privData->connectIP->SetLineSpacing( 0.0f ); this->privData->connectIP->SetLineSpacing( 0.005f );
this->privData->connectIP->SetTopAligned();
this->privData->guiElements.AddButton( this->privData->connectIP ); this->privData->guiElements.AddButton( this->privData->connectIP );
ButtonRectangle<LanMenuState*> *guiElements;
guiElements = new ButtonRectangle<LanMenuState*>( 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 );
this->privData->guiElements.AddButton( guiElements );
guiElements = new ButtonRectangle<LanMenuState*>( 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 );
this->privData->guiElements.AddButton( guiElements );
// bind guiElements collection to the singleton eventhandler // bind guiElements collection to the singleton eventhandler
EventHandler::Instance().AddCollection( &this->privData->guiElements ); EventHandler::Instance().AddCollection( &this->privData->guiElements );
@ -80,8 +84,7 @@ GameClientState::ClientState LanMenuState::Update(float deltaTime, InputClass* K
{ {
MouseInput mouseState; MouseInput mouseState;
{ {
mouseState.x = KeyInput->GetPitch(); KeyInput->GetMousePos( mouseState.x, mouseState.y );
mouseState.y = KeyInput->GetYaw();
mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); mouseState.mouseButtonPressed = KeyInput->IsMousePressed();
} }
@ -96,7 +99,7 @@ bool LanMenuState::Render( )
Graphics::API::StartGuiRender(); Graphics::API::StartGuiRender();
Graphics::API::RenderGuiElement( this->privData->background, Float2(0.5f), Float2(1.0f) ); Graphics::API::RenderGuiElement( this->privData->background, Float3(0.5f, 0.5f, 1.0f), Float2(1.0f) );
this->privData->guiElements.RenderTexture(); this->privData->guiElements.RenderTexture();
Graphics::API::StartTextRender(); Graphics::API::StartTextRender();
@ -118,8 +121,8 @@ void LanMenuState::ChangeState( ClientState next )
{ {
case GameClientState::ClientState_Lobby: case GameClientState::ClientState_Lobby:
// attempt to connect to lobby // attempt to connect to lobby
if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) //if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) )
return; // return; // TODO: temporary commented out
break; break;
default: break; default: break;
} }
@ -132,8 +135,19 @@ void OnButtonInteract_Connect( Oyster::Event::ButtonEvent<LanMenuState*>& e )
switch( e.state ) switch( e.state )
{ {
case ButtonState_Released: case ButtonState_Released:
e.owner->ChangeState( GameClientState::ClientState_LobbyCreate ); e.owner->ChangeState( GameClientState::ClientState_Lobby );
break; break;
default: break; default: break;
} }
} }
void OnButtonInteract_Exit( Oyster::Event::ButtonEvent<LanMenuState*>& e )
{
switch( e.state )
{
case ButtonState_Released:
e.owner->ChangeState( GameClientState::ClientState_Main );
break;
default: break;
}
}

View File

@ -59,6 +59,27 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
break; 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. //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. //Unless they are changed to not be the same.
case ObjectType_Static: case ObjectType_Dynamic: case ObjectType_Static: case ObjectType_Dynamic:
@ -133,13 +154,8 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
objects.push_back(header); objects.push_back(header);
break; break;
} }
//this is a hotfix, fix so you only load the relevant data when the file is updated
case ObjectSpecialType_SpawnPoint:
{
loadCgf = false;
ObjectHeader* header = new ObjectHeader;
ParseObject(&buffer[counter], *header, counter, loadCgf);
}
default: default:
//Couldn't find specialType //Couldn't find specialType

View File

@ -16,6 +16,7 @@ namespace GameLogic
ObjectType_Static, ObjectType_Static,
ObjectType_Dynamic, ObjectType_Dynamic,
ObjectType_Light, ObjectType_Light,
ObjectType_SpawnPoint,
//Etc //Etc
ObjectType_NUM_OF_TYPES, ObjectType_NUM_OF_TYPES,
@ -38,7 +39,6 @@ namespace GameLogic
ObjectSpecialType_CrystalShard, ObjectSpecialType_CrystalShard,
ObjectSpecialType_JumpPad, ObjectSpecialType_JumpPad,
ObjectSpecialType_Portal, ObjectSpecialType_Portal,
ObjectSpecialType_SpawnPoint,
ObjectSpecialType_Player, ObjectSpecialType_Player,
@ -206,6 +206,13 @@ namespace GameLogic
virtual ~ObjectHeader(){} virtual ~ObjectHeader(){}
}; };
//inheritance from the base class because there is no use for ModelFile, Rotation and Scale
//so this is a special struct for just spawnpoints
struct SpawnPointAttributes : public ObjectTypeHeader
{
float position[3];
};
/************************************ /************************************
Special objects Special objects
*************************************/ *************************************/
@ -234,6 +241,8 @@ namespace GameLogic
/************************************ /************************************
Lights Lights
*************************************/ *************************************/

View File

@ -70,8 +70,7 @@ GameClientState::ClientState LobbyAdminState::Update(float deltaTime, InputClass
MouseInput mouseState; MouseInput mouseState;
{ {
mouseState.x = KeyInput->GetPitch(); KeyInput->GetMousePos( mouseState.x, mouseState.y );
mouseState.y = KeyInput->GetYaw();
mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); mouseState.mouseButtonPressed = KeyInput->IsMousePressed();
} }
@ -84,7 +83,7 @@ bool LobbyAdminState::Render( )
Graphics::API::NewFrame(); Graphics::API::NewFrame();
Graphics::API::StartGuiRender(); Graphics::API::StartGuiRender();
Graphics::API::RenderGuiElement( this->privData->background, Float2(0.5f), Float2(1.0f) ); Graphics::API::RenderGuiElement( this->privData->background, Float3(0.5f, 0.5f, 1.0f), Float2(1.0f) );
this->privData->guiElements.RenderTexture(); this->privData->guiElements.RenderTexture();
Graphics::API::StartTextRender(); Graphics::API::StartTextRender();
@ -121,14 +120,14 @@ void LobbyAdminState::DataRecieved( NetEvent<NetworkClient*, NetworkClient::Clie
{ {
switch(ID) switch(ID)
{ {
case protocol_Lobby_Create: break; /** @todo TODO: implement */ case protocol_Lobby_CreateGame: break; /** @todo TODO: implement */
case protocol_Lobby_Start: break; /** @todo TODO: implement */ case protocol_Lobby_StartGame: break; /** @todo TODO: implement */
case protocol_Lobby_Join: break; /** @todo TODO: implement */ case protocol_Lobby_JoinGame: break; /** @todo TODO: implement */
case protocol_Lobby_Login: break; /** @todo TODO: implement */ case protocol_Lobby_Login: break; /** @todo TODO: implement */
case protocol_Lobby_Refresh: break; /** @todo TODO: implement */ case protocol_Lobby_Refresh: break; /** @todo TODO: implement */
case protocol_Lobby_ClientData: break; /** @todo TODO: implement */ case protocol_Lobby_ClientData: break; /** @todo TODO: implement */
case protocol_Lobby_GameData: break; /** @todo TODO: implement */ case protocol_Lobby_GameData: break; /** @todo TODO: implement */
default: break; default: break;
} }
} }
else if( ProtocolIsGeneral(ID) ) else if( ProtocolIsGeneral(ID) )

View File

@ -48,7 +48,7 @@ bool LobbyState::Init(NetworkClient* nwClient)
// create buttons // create buttons
ButtonRectangle<LobbyState*> *button; ButtonRectangle<LobbyState*> *button;
button = new ButtonRectangle<LobbyState*>( L"earth_md.png", L"", Float3(1.0f), OnButtonInteract_Ready, this, Float3(0.5f, 0.2f, 0.5f), Float2(0.3f, 0.1f), ResizeAspectRatio_Width ); button = new ButtonRectangle<LobbyState*>( 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 );
this->privData->guiElements.AddButton( button ); this->privData->guiElements.AddButton( button );
// bind button collection to the singleton eventhandler // bind button collection to the singleton eventhandler
@ -70,8 +70,7 @@ GameClientState::ClientState LobbyState::Update(float deltaTime, InputClass* Key
MouseInput mouseState; MouseInput mouseState;
{ {
mouseState.x = KeyInput->GetPitch(); KeyInput->GetMousePos( mouseState.x, mouseState.y );
mouseState.y = KeyInput->GetYaw();
mouseState.mouseButtonPressed = KeyInput->IsMousePressed(); mouseState.mouseButtonPressed = KeyInput->IsMousePressed();
} }
@ -84,7 +83,7 @@ bool LobbyState::Render( )
Graphics::API::NewFrame(); Graphics::API::NewFrame();
Graphics::API::StartGuiRender(); Graphics::API::StartGuiRender();
Graphics::API::RenderGuiElement( this->privData->background, Float2(0.5f), Float2(1.0f) ); Graphics::API::RenderGuiElement( this->privData->background, Float3(0.5f, 0.5f, 1.0f), Float2(1.0f) );
this->privData->guiElements.RenderTexture(); this->privData->guiElements.RenderTexture();
Graphics::API::StartTextRender(); Graphics::API::StartTextRender();
@ -103,7 +102,7 @@ void LobbyState::ChangeState( ClientState next )
{ {
if( next == GameClientState::ClientState_LobbyReady ) if( next == GameClientState::ClientState_LobbyReady )
{ // Send ready signal to server lobby { // Send ready signal to server lobby
this->ChangeState( GameClientState::ClientState_NetLoad );
} }
else else
this->privData->nextState = next; this->privData->nextState = next;
@ -121,14 +120,14 @@ void LobbyState::DataRecieved( NetEvent<NetworkClient*, NetworkClient::ClientEve
{ {
switch(ID) switch(ID)
{ {
case protocol_Lobby_Create: break; /** @todo TODO: implement */ case protocol_Lobby_CreateGame: break; /** @todo TODO: implement */
case protocol_Lobby_Start: break; /** @todo TODO: implement */ case protocol_Lobby_StartGame: break; /** @todo TODO: implement */
case protocol_Lobby_Join: break; /** @todo TODO: implement */ case protocol_Lobby_JoinGame: break; /** @todo TODO: implement */
case protocol_Lobby_Login: break; /** @todo TODO: implement */ case protocol_Lobby_Login: break; /** @todo TODO: implement */
case protocol_Lobby_Refresh: break; /** @todo TODO: implement */ case protocol_Lobby_Refresh: break; /** @todo TODO: implement */
case protocol_Lobby_ClientData: break; /** @todo TODO: implement */ case protocol_Lobby_ClientData: break; /** @todo TODO: implement */
case protocol_Lobby_GameData: break; /** @todo TODO: implement */ case protocol_Lobby_GameData: break; /** @todo TODO: implement */
default: break; default: break;
} }
} }
else if( ProtocolIsGeneral(ID) ) else if( ProtocolIsGeneral(ID) )

View File

@ -1,288 +0,0 @@
#include "LoginState.h"
#include "DllInterfaces/GFXAPI.h"
#include "OysterMath.h"
#include "C_obj/C_Player.h"
#include "C_obj/C_StaticObj.h"
#include "C_obj/C_DynamicObj.h"
#include <GameServerAPI.h>
using namespace DanBias::Client;
//Menu buttons
#include "Buttons/ButtonEllipse.h"
#include "Buttons/ButtonRectangle.h"
#include "../Misc/EventHandler/EventHandler.h"
using namespace Oyster::Event;
struct LoginState::myData
{
myData(){}
Oyster::Math3D::Float4x4 view;
Oyster::Math3D::Float4x4 proj;
C_Object* object[2];
int modelCount;
// UI object
// game client*
//Menu button collection
EventButtonCollection collection;
bool createGame;
int testNumber;
}privData;
enum TestEnum
{
Create,
Options,
Incr,
Decr,
Exit,
};
LoginState::LoginState(void)
{
}
void LoginState::ButtonCallback(Oyster::Event::ButtonEvent<LoginState*>& e)
{
TestEnum type = TestEnum((int)e.userData);
switch(type)
{
case Create:
if(e.state == ButtonState_None)
{
int a = 0;
std::cout << "None" << std::endl;
}
else if(e.state == ButtonState_Hover)
{
int a = 0;
std::cout << "Hover" << std::endl;
}
else if(e.state == ButtonState_Down)
{
int a = 0;
std::cout << "Down" << std::endl;
}
else if(e.state == ButtonState_Pressed)
{
int a = 0;
std::cout << "Pressed" << std::endl;
}
else if(e.state == ButtonState_Released)
{
//Change to create state or something similar
int a = 0;
std::cout << "Released" << std::endl;
e.owner->privData->createGame = true;
}
break;
case Options:
break;
case Exit:
break;
case Incr:
if(e.state == ButtonState_Released)
e.owner->privData->testNumber++;
break;
case Decr:
if(e.state == ButtonState_Released)
e.owner->privData->testNumber--;
break;
}
}
LoginState::~LoginState(void)
{
}
bool LoginState::Init(Oyster::Network::NetworkClient* nwClient)
{
privData = new myData();
this->nwClient = nwClient;
// load models
//LoadModels(L"UImodels.txt");
InitCamera(Oyster::Math::Float3(0,0,5.4f));
//Create menu buttons
EventHandler::Instance().AddCollection(&privData->collection);
privData->collection.AddButton(new ButtonEllipse<LoginState*>(L"circle.png", L"Hej", Oyster::Math::Float3(1, 1, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.2f, 0.2f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f), ResizeAspectRatio_Width));
privData->collection.AddButton(new ButtonEllipse<LoginState*>(L"circle.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.2f, 0.3f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f), ResizeAspectRatio_Width));
privData->collection.AddButton(new ButtonEllipse<LoginState*>(L"circle.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.2f, 0.4f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f), ResizeAspectRatio_Width));
privData->collection.AddButton(new ButtonEllipse<LoginState*>(L"circle.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.2f, 0.5f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f), ResizeAspectRatio_Width));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.15f, 0.05f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.25f, 0.05f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.35f, 0.05f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Options, Oyster::Math::Float3(0.45f, 0.05f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Create Game", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Create, Oyster::Math::Float3(0.5f, 0.5f, 0.0f), Oyster::Math::Float2(0.3f, 0.3f)));
//Incr/decr buttons .
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Incr, Oyster::Math::Float3(0.85f, 0.2f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->collection.AddButton(new ButtonRectangle<LoginState*>(L"button.png", L"Hej", Oyster::Math::Float3(1, 0, 0), &LoginState::ButtonCallback, this,
(void*)Decr, Oyster::Math::Float3(0.55f, 0.2f, 0.0f), Oyster::Math::Float2(0.1f, 0.1f)));
privData->createGame = false;
privData->testNumber = 0;
return true;
}
bool LoginState::LoadModels(std::wstring file)
{
Oyster::Graphics::Definitions::Pointlight plight;
plight.Pos = Oyster::Math::Float3(0,0,5);
plight.Color = Oyster::Math::Float3(1,0,1);
plight.Radius = 100;
plight.Bright = 1;
Oyster::Graphics::API::AddLight(plight);
// open file
// read file
// init models
privData->modelCount = 2;
ModelInitData modelData;
modelData.rotation = Oyster::Math::Quaternion::identity;
modelData.scale = Oyster::Math::Float3(1,1,1);
modelData.visible = true;
modelData.modelPath = L"box.dan";
modelData.position = Oyster::Math::Float3(2,2,2);
privData->object[0] = new C_StaticObj();
privData->object[0]->Init(modelData);
modelData.position = Oyster::Math::Float3(-2,0,-2);
privData->object[1] = new C_StaticObj();
privData->object[1]->Init(modelData);
return true;
}
bool LoginState::InitCamera(Oyster::Math::Float3 startPos)
{
privData->proj = Oyster::Math3D::ProjectionMatrix_Perspective(Oyster::Math::pi/2,1024.0f/768.0f,.1f,1000);
//privData->proj = Oyster::Math3D::ProjectionMatrix_Orthographic(1024, 768, 1, 1000);
Oyster::Graphics::API::SetProjection(privData->proj);
privData->view = Oyster::Math3D::OrientationMatrix_LookAtDirection(Oyster::Math::Float3(0,0,-1),Oyster::Math::Float3(0,1,0),startPos);
privData->view = Oyster::Math3D::InverseOrientationMatrix(privData->view);
return true;
}
GameClientState::ClientState LoginState::Update(float deltaTime, InputClass* KeyInput)
{
// picking
// mouse events
// different menus
// play sounds
// update animation
// send data to server
// check data from server
// create game
if( KeyInput->IsKeyPressed(DIK_C) || privData->createGame)
{
DanBias::GameServerAPI::ServerInitDesc desc;
DanBias::GameServerAPI::ServerInitiate(desc);
DanBias::GameServerAPI::ServerStart();
// my ip
nwClient->Connect(15152, "127.0.0.1");
if (!nwClient->IsConnected())
{
// failed to connect
return ClientState_Same;
}
privData->collection.SetState(EventCollectionState_Disabled);
return ClientState_LobbyCreated;
}
// join game
if( KeyInput->IsKeyPressed(DIK_J))
{
// game ip
nwClient->Connect(15152, "127.0.0.1");
//nwClient->Connect(15152, "83.254.217.248");
if (!nwClient->IsConnected())
{
// failed to connect
return ClientState_Same;
}
privData->collection.SetState(EventCollectionState_Disabled);
return ClientState_Lobby;
}
return ClientState_Same;
}
bool LoginState::Render(float dt)
{
Oyster::Graphics::API::SetView(privData->view);
Oyster::Graphics::API::SetProjection( privData->proj);
Oyster::Graphics::API::NewFrame();
// render objects
for (int i = 0; i < privData->modelCount; i++)
{
privData->object[i]->Render();
}
// render effects
// render lights
//Render buttons
Oyster::Graphics::API::StartGuiRender();
EventHandler::Instance().RenderTexture();
std::wstring number;
wchar_t temp[10];
_itow_s(privData->testNumber, temp, 10);
number = temp;
Oyster::Graphics::API::StartTextRender();
EventHandler::Instance().RenderText();
//Oyster::Graphics::API::RenderText(number, Oyster::Math::Float2(0.7f, 0.2f), Oyster::Math::Float2(0.1f, 0.1f*(1008.0f/730.0f)), Oyster::Math::Float3(1.0f, 0.0f, 0.0f));
Oyster::Graphics::API::EndFrame();
return true;
}
bool LoginState::Release()
{
Oyster::Graphics::API::ClearLights();
for (int i = 0; i < privData->modelCount; i++)
{
privData->object[i]->Release();
delete privData->object[i];
privData->object[i] = NULL;
}
EventHandler::Instance().ReleaseCollection(&privData->collection);
delete privData;
privData = NULL;
return true;
}
void LoginState::Protocol(ProtocolStruct* protocol)
{
if((PlayerName*)protocol)
PlayerJoinProtocol((PlayerName*)protocol);
}
void LoginState::PlayerJoinProtocol(PlayerName* name)
{
}

View File

@ -0,0 +1,84 @@
#include "NetLoadState.h"
#include "NetworkClient.h"
#include "../Game/GameProtocols/Protocols.h"
using namespace ::DanBias::Client;
using namespace ::Oyster;
using namespace ::Oyster::Network;
using namespace ::GameLogic;
struct NetLoadState::MyData
{
MyData() {}
GameClientState::ClientState nextState;
NetworkClient *nwClient;
bool loading;
};
NetLoadState::NetLoadState(void) {}
NetLoadState::~NetLoadState(void)
{
if( this->privData )
this->Release();
}
bool NetLoadState::Init( NetworkClient* nwClient )
{
this->privData = new MyData();
this->privData->nextState = GameClientState::ClientState_Same;
this->privData->nwClient = nwClient;
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() );
return true;
}
GameClientState::ClientState NetLoadState::Update(float deltaTime, InputClass* KeyInput)
{
return this->privData->nextState;
}
bool NetLoadState::Render()
{
return true;
}
bool NetLoadState::Release()
{
if( this->privData )
{
this->privData = NULL;
}
return true;
}
void NetLoadState::ChangeState( ClientState next )
{
this->privData->nextState = next;
}
void NetLoadState::DataRecieved( NetEvent<NetworkClient*, NetworkClient::ClientEventArgs> e )
{
// fetching the id data.
short ID = e.args.data.protocol[0].value.netShort;
if( ID == protocol_Lobby_CreateGame && !this->privData->loading )
{
this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName );
}
}
void NetLoadState::LoadGame( const ::std::string &fileName )
{
this->privData->loading = true;
// TODO: ask Sam about level loader
this->privData->nextState = ClientState::ClientState_Game;
}

View File

@ -0,0 +1,34 @@
#ifndef DANBIAS_CLIENT_NETLOADSTATE_H
#define DANBIAS_CLIENT_NETLOADSTATE_H
#include "GameClientState.h"
#include "NetworkClient.h"
namespace DanBias
{
namespace Client
{
class NetLoadState : public GameClientState
{
public:
NetLoadState( );
virtual ~NetLoadState( );
bool Init( Oyster::Network::NetworkClient* nwClient );
ClientState Update( float deltaTime, InputClass* KeyInput );
bool Render();
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<MyData> privData;
void LoadGame( const ::std::string &fileName );
};
}
}
#endif // ! DANBIAS_CLIENT_LOGINSTATE_H

View File

@ -95,9 +95,16 @@ using namespace GameLogic;
{ {
int forceThreashHold = 200000; //how much force for the box to explode of the impact int forceThreashHold = 200000; //how much force for the box to explode of the impact
Object *realObj = (Object*)obj->GetCustomTag(); //needs to be changed?
if(kineticEnergyLoss > forceThreashHold) switch (realObj->GetObjectType())
{ {
case ObjectSpecialType::ObjectSpecialType_Generic:
break;
case ObjectSpecialType::ObjectSpecialType_StandardBox:
break;
case ObjectSpecialType::ObjectSpecialType_Player:
ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag()); ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag());
@ -107,7 +114,20 @@ using namespace GameLogic;
Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode); Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode);
delete hitSphere; delete hitSphere;
break;
} }
/*if(kineticEnergyLoss > forceThreashHold)
{
ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag());
Oyster::Math::Float3 pos = rigidBodyCrate->GetState().centerPos;
Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,crate->ExplosionRadius);
Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode);
delete hitSphere;
}*/
} }
void ExplosiveCrate::Explode(Oyster::Physics::ICustomBody *obj, void* args) void ExplosiveCrate::Explode(Oyster::Physics::ICustomBody *obj, void* args)
@ -123,7 +143,7 @@ using namespace GameLogic;
{ {
Player *hitPlayer = (Player*)realObj; Player *hitPlayer = (Player*)realObj;
hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision()); //hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision());
//do shredding damage //do shredding damage
} }

View File

@ -17,12 +17,12 @@ Game::PlayerData::PlayerData()
//sbDesc.quaternion = Oyster::Math::Float3(0, Oyster::Math::pi, 0); //sbDesc.quaternion = Oyster::Math::Float3(0, Oyster::Math::pi, 0);
//create rigid body //create rigid body
Oyster::Physics::ICustomBody* rigidBody = Oyster::Physics::API::Instance().AddCharacter(2.0f, 0.5f, Oyster::Math::Float4(0, 0, 0, 1), centerPosition, mass, 0.5f, 0.8f, 0.6f ); 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); rigidBody->SetAngularFactor(0.0f);
//create player with this rigid body //create player with this rigid body
this->player = new Player(rigidBody, Player::PlayerCollision, ObjectSpecialType_Player,0,0); this->player = new Player(rigidBody, Player::PlayerCollision, ObjectSpecialType_Player,0,0);
this->player->GetRigidBody()->SetCustomTag(this); //this->player->GetRigidBody()->SetCustomTag(this);
player->EndFrame(); player->EndFrame();
} }
Game::PlayerData::PlayerData(int playerID,int teamID) Game::PlayerData::PlayerData(int playerID,int teamID)

View File

@ -33,7 +33,7 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
case ObjectSpecialType_Sky: case ObjectSpecialType_Sky:
{ {
float skySize = ((SkyAttributes*)obj)->skySize; 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; break;
case ObjectSpecialType_World: case ObjectSpecialType_World:
@ -96,7 +96,7 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
break; break;
case ObjectSpecialType_JumpPad: case ObjectSpecialType_JumpPad:
{ {
float power = ((JumpPadAttributes*)obj)->power; float power = 500; //((JumpPadAttributes*)obj)->power;
Oyster::Math::Float3 dir = ((JumpPadAttributes*)obj)->direction; Oyster::Math::Float3 dir = ((JumpPadAttributes*)obj)->direction;
Oyster::Math::Float3 pushForce = dir * power; Oyster::Math::Float3 pushForce = dir * power;
gameObj = new JumpPad(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++ , pushForce); gameObj = new JumpPad(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++ , pushForce);
@ -108,16 +108,15 @@ Object* Level::createGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
gameObj = new Portal(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, destination); gameObj = new Portal(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, destination);
} }
break; break;
case ObjectSpecialType_SpawnPoint: //case ObjectSpecialType_SpawnPoint:
{ //{
// save // save
gameObj = new StaticObject(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID, objID++);
} //}
break; break;
case ObjectSpecialType_Player: case ObjectSpecialType_Player:
{ {
// should not be read from the lvl format // should not be read from the lvl format
//gameObj = new Player(rigidBody, Object::DefaultCollisionAfter, (ObjectSpecialType)obj->specialTypeID,objID++);
} }
break; break;
case ObjectSpecialType_Generic: case ObjectSpecialType_Generic:
@ -206,12 +205,10 @@ void Level::InitiateLevel(std::string levelPath)
API::Instance().SetGravityPoint(Oyster::Math3D::Float3(0,0,0)); API::Instance().SetGravityPoint(Oyster::Math3D::Float3(0,0,0));
API::Instance().SetGravity(200); API::Instance().SetGravity(200);
int objCount = objects.size(); int objCount = objects.size();
int modelCount = 100;
for (int i = 0; i < objCount; i++) for (int i = 0; i < objCount; i++)
{ {
ObjectTypeHeader* obj = objects.at(i); ObjectTypeHeader* obj = objects.at(i);
int id = obj->typeID;
switch (obj->typeID) switch (obj->typeID)
{ {
case ObjectType::ObjectType_LevelMetaData: case ObjectType::ObjectType_LevelMetaData:
@ -223,7 +220,6 @@ void Level::InitiateLevel(std::string levelPath)
break; break;
case ObjectType::ObjectType_Static: case ObjectType::ObjectType_Static:
{ {
ObjectHeader* staticObjData = ((ObjectHeader*)obj); ObjectHeader* staticObjData = ((ObjectHeader*)obj);
staticObjData->ModelFile; staticObjData->ModelFile;
@ -237,7 +233,6 @@ void Level::InitiateLevel(std::string levelPath)
else if(staticObjData->boundingVolume.geoType == CollisionGeometryType_Box) else if(staticObjData->boundingVolume.geoType == CollisionGeometryType_Box)
{ {
rigidBody_Static = InitRigidBodyCube(staticObjData); rigidBody_Static = InitRigidBodyCube(staticObjData);
} }
@ -248,22 +243,13 @@ void Level::InitiateLevel(std::string levelPath)
if(rigidBody_Static != NULL) if(rigidBody_Static != NULL)
{ {
// create game object // create game object
Object* staticGameObj = createGameObj(staticObjData, rigidBody_Static); Object* staticGameObj = createGameObj(staticObjData, rigidBody_Static);
//Object* staticGameObj = new StaticObject(rigidBody_Static, Object::DefaultCollisionAfter, (ObjectSpecialType)staticObjData->specialTypeID);
if(staticGameObj != NULL) if(staticGameObj != NULL)
{ {
this->staticObjects.Push((StaticObject*)staticGameObj); this->staticObjects.Push((StaticObject*)staticGameObj);
//this->staticObjects[this->staticObjects.Size()-1]->objectID = modelCount++;
//rigidBody_Static->SetCustomTag(this->staticObjects[this->staticObjects.Size()-1]);
} }
//this->staticObjects.Push(new StaticObject(rigidBody_Static, Object::DefaultCollisionAfter, (ObjectSpecialType)staticObjData->specialTypeID, 0));
//this->staticObjects[staticObjCount]->objectID = modelCount++;
} }
} }
break; break;
case ObjectType::ObjectType_Dynamic: case ObjectType::ObjectType_Dynamic:
@ -293,12 +279,9 @@ void Level::InitiateLevel(std::string levelPath)
{ {
// create game object // create game object
Object* dynamicGameObj = createGameObj(dynamicObjData, rigidBody_Dynamic); Object* dynamicGameObj = createGameObj(dynamicObjData, rigidBody_Dynamic);
//Object* dynamicGameObj =new DynamicObject(rigidBody_Dynamic, Object::DefaultCollisionAfter, (ObjectSpecialType)dynamicObjData->specialTypeID);
if (dynamicGameObj != NULL) if (dynamicGameObj != NULL)
{ {
this->dynamicObjects.Push((DynamicObject*)dynamicGameObj); this->dynamicObjects.Push((DynamicObject*)dynamicGameObj);
//this->dynamicObjects[this->dynamicObjects.Size()-1]->objectID = modelCount++;
//rigidBody_Dynamic->SetCustomTag(this->dynamicObjects[this->dynamicObjects.Size()-1]);
} }
} }
} }
@ -334,9 +317,6 @@ 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); 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::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++));
//this->dynamicObjects[i]->objectID = idCount++;
rigidBody_TestBox->SetCustomTag(this->dynamicObjects[i]);
} }
/*offset += nrOfBoxex; /*offset += nrOfBoxex;
for(int i =0; i< nrOfBoxex; i ++) for(int i =0; i< nrOfBoxex; i ++)
@ -365,31 +345,18 @@ void Level::InitiateLevel(float radius)
}*/ }*/
// add crystal // 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, 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::DefaultCollisionAfter, ObjectSpecialType_StandardBox, idCount++));
rigidBody_Crystal->SetCustomTag(this->dynamicObjects[nrOfBoxex]);
//this->dynamicObjects[nrOfBoxex]->objectID = idCount++;
// add house // 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, 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::DefaultCollisionAfter, ObjectSpecialType_Generic, idCount++));
rigidBody_House->SetCustomTag(this->staticObjects[0]);
//this->staticObjects[0]->objectID = idCount++;
// add jumppad // 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), 0, 0.5f, 0.8f, 0.6f);
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);
this->staticObjects.Push(new JumpPad(rigidBody_Jumppad, ObjectSpecialType_JumpPad,idCount++ ,Oyster::Math::Float3(0,2000,0))); this->staticObjects.Push(new JumpPad(rigidBody_Jumppad, ObjectSpecialType_JumpPad,idCount++ ,Oyster::Math::Float3(0,2000,0)));
rigidBody_Jumppad->SetCustomTag(this->staticObjects[1]);
//this->staticObjects[1]->objectID = idCount++;
} }
void Level::AddPlayerToTeam(Player *player, int teamID) void Level::AddPlayerToTeam(Player *player, int teamID)

View File

@ -77,6 +77,7 @@ namespace GameLogic
Utility::DynamicMemory::SmartPointer<Oyster::Physics::ICustomBody> rigidBodyLevel; Utility::DynamicMemory::SmartPointer<Oyster::Physics::ICustomBody> rigidBodyLevel;
StaticObject *levelObj; StaticObject *levelObj;
int objID; int objID;
Utility::DynamicMemory::DynamicArray<Oyster::Math::Float3> spawnPoints;
}; };

View File

@ -3,7 +3,6 @@
///////////////////////////////////// /////////////////////////////////////
#include "LevelParser.h" #include "LevelParser.h"
#include "Loader.h" #include "Loader.h"
#include "ParseFunctions.h" #include "ParseFunctions.h"
@ -59,6 +58,27 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
break; 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. //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. //Unless they are changed to not be the same.
case ObjectType_Static: case ObjectType_Dynamic: case ObjectType_Static: case ObjectType_Dynamic:
@ -134,13 +154,6 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
break; break;
} }
case ObjectSpecialType_SpawnPoint:
{
loadCgf = false;
ObjectHeader* header = new ObjectHeader;
ParseObject(&buffer[counter], *header, counter, loadCgf);
}
default: default:
//Couldn't find specialType //Couldn't find specialType
break; break;

View File

@ -16,6 +16,7 @@ namespace GameLogic
ObjectType_Static, ObjectType_Static,
ObjectType_Dynamic, ObjectType_Dynamic,
ObjectType_Light, ObjectType_Light,
ObjectType_SpawnPoint,
//Etc //Etc
ObjectType_NUM_OF_TYPES, ObjectType_NUM_OF_TYPES,
@ -38,7 +39,6 @@ namespace GameLogic
ObjectSpecialType_CrystalShard, ObjectSpecialType_CrystalShard,
ObjectSpecialType_JumpPad, ObjectSpecialType_JumpPad,
ObjectSpecialType_Portal, ObjectSpecialType_Portal,
ObjectSpecialType_SpawnPoint,
ObjectSpecialType_Player, ObjectSpecialType_Player,
ObjectSpecialType_Generic, ObjectSpecialType_Generic,
@ -207,6 +207,11 @@ namespace GameLogic
virtual ~ObjectHeader(){} virtual ~ObjectHeader(){}
}; };
struct SpawnPointAttributes : public ObjectTypeHeader
{
ObjectSpecialType specialTypeID;
float position[3];
};
/************************************ /************************************
Special objects Special objects
*************************************/ *************************************/

View File

@ -20,16 +20,16 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)
weapon = new Weapon(2,this); weapon = new Weapon(2,this);
this->life = 100; this->life = 100;
this->teamID = -1; this->teamID = teamID;
this->playerState = PLAYER_STATE_IDLE; this->playerState = PLAYER_STATE_IDLE;
this->lookDir = Oyster::Math::Float3(0,0,-1); this->lookDir = Oyster::Math::Float3(0,0,-1);
this->moveDir = Oyster::Math::Float3(0,0,0);
key_forward = 0; key_forward = 0;
key_backward = 0; key_backward = 0;
key_strafeRight = 0; key_strafeRight = 0;
key_strafeLeft = 0; key_strafeLeft = 0;
this->previousPosition = Oyster::Math::Float3(0,0,0); this->previousPosition = Oyster::Math::Float3(0,0,0);
this->moveDir = Oyster::Math::Float3(0,0,0); this->moveDir = Oyster::Math::Float3(0,0,0);
this->moveSpeed = 100; this->moveSpeed = 100;
this->previousMoveSpeed = Oyster::Math::Float3(0,0,0); this->previousMoveSpeed = Oyster::Math::Float3(0,0,0);
@ -38,20 +38,6 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)
Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID) Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID)
:DynamicObject(rigidBody, EventOnCollision, type, objectID) :DynamicObject(rigidBody, EventOnCollision, type, objectID)
{ {
this->rigidBody = rigidBody;
Oyster::Math::Float3 centerPosition = Oyster::Math::Float3(0,400,0);
Oyster::Math::Float3 size = Oyster::Math::Float3(0.25f,1.0f,0.5f);
Oyster::Math::Float mass = 60;
Oyster::Math::Float restitutionCoeff = 0.5;
Oyster::Math::Float frictionCoeff_Static = 0.4;
Oyster::Math::Float frictionCoeff_Dynamic = 0.3;
this->rigidBody = Oyster::Physics::API::Instance().AddCollisionBox(size, Oyster::Math::Float4(0, 0, 0, 1), centerPosition, mass, 0.5f, 0.8f, 0.6f );
this->rigidBody->SetAngularFactor(0.0f);
weapon = new Weapon(2,this); weapon = new Weapon(2,this);
this->life = 100; this->life = 100;
@ -67,7 +53,6 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom
this->moveDir = Oyster::Math::Float3(0,0,0); this->moveDir = Oyster::Math::Float3(0,0,0);
this->moveSpeed = 100; this->moveSpeed = 100;
this->previousMoveSpeed = Oyster::Math::Float3(0,0,0); this->previousMoveSpeed = Oyster::Math::Float3(0,0,0);
} }
Player::~Player(void) Player::~Player(void)

View File

@ -14,25 +14,25 @@ StaticObject::StaticObject()
StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID)
:Object(rigidBody, EventOnCollision, type, objectID) :Object(rigidBody, EventOnCollision, type, objectID)
{ {
//use setMass(when it is made) and set the mass to 0 in order to ensure that the object is static rigidBody->SetMass(0);
} }
StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID)
:Object(rigidBody, EventOnCollision, type, objectID) :Object(rigidBody, EventOnCollision, type, objectID)
{ {
//use setMass(when it is made) and set the mass to 0 in order to ensure that the object is static rigidBody->SetMass(0);
} }
StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision)
{ {
this->extraDamageOnCollision = extraDamageOnCollision; this->extraDamageOnCollision = extraDamageOnCollision;
//use setMass(when it is made) and set the mass to 0 in order to ensure that the object is static rigidBody->SetMass(0);
} }
StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) StaticObject::StaticObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision)
{ {
this->extraDamageOnCollision = extraDamageOnCollision; this->extraDamageOnCollision = extraDamageOnCollision;
//use setMass(when it is made) and set the mass to 0 in order to ensure that the object is static rigidBody->SetMass(0);
} }
StaticObject::~StaticObject(void) StaticObject::~StaticObject(void)
{ {

View File

@ -21,6 +21,24 @@
namespace GameLogic namespace GameLogic
{ {
struct Protocol_QuerryGameType :public Oyster::Network::CustomProtocolObject
{
public:
Protocol_QuerryGameType()
{
this->protocol[0].type = ::Oyster::Network::NetAttributeType_Short;
this->protocol[0].value = protocol_Lobby_QuerryGameType;
}
::Oyster::Network::CustomNetProtocol GetProtocol() override
{
return this->protocol;
}
private:
Oyster::Network::CustomNetProtocol protocol;
};
struct Protocol_LobbyCreateGame :public Oyster::Network::CustomProtocolObject struct Protocol_LobbyCreateGame :public Oyster::Network::CustomProtocolObject
{ {
short clientID; // The unuiqe id reprsenting a specific client short clientID; // The unuiqe id reprsenting a specific client
@ -30,7 +48,7 @@ namespace GameLogic
Protocol_LobbyCreateGame() Protocol_LobbyCreateGame()
{ {
int c = 0; int c = 0;
this->protocol[c].value = protocol_Lobby_Create; this->protocol[c].value = protocol_Lobby_CreateGame;
this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; this->protocol[c++].type = Oyster::Network::NetAttributeType_Short;
this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; this->protocol[c++].type = Oyster::Network::NetAttributeType_Short;
@ -43,7 +61,7 @@ namespace GameLogic
Protocol_LobbyCreateGame(short _clientID, std::string name, float world[16]) Protocol_LobbyCreateGame(short _clientID, std::string name, float world[16])
{ {
int c = 0; int c = 0;
this->protocol[c].value = protocol_Lobby_Create; this->protocol[c].value = protocol_Lobby_CreateGame;
this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; this->protocol[c++].type = Oyster::Network::NetAttributeType_Short;
this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; this->protocol[c++].type = Oyster::Network::NetAttributeType_Short;
@ -92,14 +110,14 @@ namespace GameLogic
Protocol_LobbyStartGame() Protocol_LobbyStartGame()
{ {
this->protocol[0].value = protocol_Lobby_Start; this->protocol[0].value = protocol_Lobby_StartGame;
this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
this->protocol[1].type = Oyster::Network::NetAttributeType_Float; this->protocol[1].type = Oyster::Network::NetAttributeType_Float;
seconds = 0; seconds = 0;
} }
Protocol_LobbyStartGame(float _seconds) Protocol_LobbyStartGame(float _seconds)
{ {
this->protocol[0].value = protocol_Lobby_Start; this->protocol[0].value = protocol_Lobby_StartGame;
this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
this->protocol[1].type = Oyster::Network::NetAttributeType_Float; this->protocol[1].type = Oyster::Network::NetAttributeType_Float;
seconds = _seconds; seconds = _seconds;
@ -119,17 +137,17 @@ namespace GameLogic
}; };
struct Protocol_LobbyLogin :public Oyster::Network::CustomProtocolObject struct Protocol_LobbyJoinGame :public Oyster::Network::CustomProtocolObject
{ {
// Login stuff // Login stuff
Protocol_LobbyLogin() Protocol_LobbyJoinGame()
{ {
this->protocol[0].value = protocol_Lobby_Join; this->protocol[0].value = protocol_Lobby_JoinGame;
this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
this->protocol[1].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Short;
} }
Protocol_LobbyLogin(Oyster::Network::CustomNetProtocol& p) Protocol_LobbyJoinGame(Oyster::Network::CustomNetProtocol& p)
{ {
} }

View File

@ -27,14 +27,15 @@
/********* LOBBY PROTOCOLS ***************************************************************************************************/ /********* LOBBY PROTOCOLS ***************************************************************************************************/
/***********[ 200 - 299 ]***********/ /***********[ 200 - 299 ]***********/
#define protocol_LobbyMIN 200 #define protocol_LobbyMIN 200
#define protocol_Lobby_Create 200 #define protocol_Lobby_CreateGame 200
#define protocol_Lobby_Start 201 #define protocol_Lobby_StartGame 201
#define protocol_Lobby_Join 202 #define protocol_Lobby_JoinGame 202
#define protocol_Lobby_Login 203 #define protocol_Lobby_Login 203
#define protocol_Lobby_Refresh 204 #define protocol_Lobby_Refresh 204
#define protocol_Lobby_ClientData 205 #define protocol_Lobby_ClientData 205
#define protocol_Lobby_GameData 206 #define protocol_Lobby_GameData 206
#define protocol_Lobby_ClientReadyState 207 #define protocol_Lobby_QuerryGameType 207
#define protocol_Lobby_ClientReadyState 208
#define protocol_LobbyMAX 299 #define protocol_LobbyMAX 299

View File

@ -41,7 +41,7 @@ namespace DanBias
//void LobbyCreateGame(GameLogic::Protocol_LobbyCreateGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Create: //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 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 LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Join:
void LobbyLogin(GameLogic::Protocol_LobbyLogin& 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 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 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 LobbyMainData(GameLogic::Protocol_LobbyClientData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_MainData:

View File

@ -15,11 +15,11 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie
break; break;
//case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c); //case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c);
//break; //break;
case protocol_Lobby_Start: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c);
break; break;
//case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c); //case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c);
//break; //break;
case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyLogin (p), c); case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c);
break; break;
case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c); case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c);
break; break;
@ -82,7 +82,7 @@ void GameLobby::LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Ne
// // } // // }
// //} // //}
//} //}
void GameLobby::LobbyLogin(GameLogic::Protocol_LobbyLogin& p, Oyster::Network::NetworkClient* c) void GameLobby::LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c)
{ {
} }

View File

@ -38,7 +38,7 @@ void ClientFnc()
gameDesc.IP = "127.0.0.1"; gameDesc.IP = "127.0.0.1";
//gameDesc.IP = "194.47.150.184"; //gameDesc.IP = "194.47.150.184";
if( DanBias::DanBiasGame::Initiate(gameDesc) == DanBias::DanBiasClientReturn_Sucess) if( DanBias::DanBiasGame::Initiate(gameDesc) == DanBias::DanBiasClientReturn_Success)
{ {
DanBias::DanBiasGame::Run(); DanBias::DanBiasGame::Run();
DanBias::DanBiasGame::Release(); DanBias::DanBiasGame::Release();

View File

@ -71,7 +71,7 @@ const wchar_t* FindResourceKey(std::map<std::wstring, ResourceData*>& resources,
{ {
for (auto i = resources.begin(); i != resources.end() ; i++) for (auto i = resources.begin(); i != resources.end() ; i++)
{ {
if(i->second->resource == h) if(i->second && i->second->resource == h)
{ {
return i->first.c_str(); return i->first.c_str();
} }

View File

@ -362,6 +362,7 @@ namespace Oyster
} }
Core::deviceContext->RSSetState(se.RenderStates.Rasterizer); Core::deviceContext->RSSetState(se.RenderStates.Rasterizer);
Core::deviceContext->PSSetSamplers(0,se.RenderStates.SampleCount,se.RenderStates.SampleState); Core::deviceContext->PSSetSamplers(0,se.RenderStates.SampleCount,se.RenderStates.SampleState);
Core::deviceContext->CSSetSamplers(0,se.RenderStates.SampleCount,se.RenderStates.SampleState);
Core::deviceContext->OMSetDepthStencilState(se.RenderStates.DepthStencil,0); Core::deviceContext->OMSetDepthStencilState(se.RenderStates.DepthStencil,0);
float test[4] = {0}; float test[4] = {0};
Core::deviceContext->OMSetBlendState(se.RenderStates.BlendState,test,-1); Core::deviceContext->OMSetBlendState(se.RenderStates.BlendState,test,-1);

View File

@ -27,8 +27,6 @@ namespace Oyster
Oyster::Math::Float3 pos; Oyster::Math::Float3 pos;
Oyster::Math::Float2 uv; Oyster::Math::Float2 uv;
Oyster::Math::Float3 normal; Oyster::Math::Float3 normal;
Oyster::Math::Float3 tangent;
Oyster::Math::Float3 biTangent;
Oyster::Math::Float4 boneIndex; Oyster::Math::Float4 boneIndex;
Oyster::Math::Float4 boneWeights; Oyster::Math::Float4 boneWeights;
}; };

View File

@ -94,6 +94,8 @@ namespace Oyster
if(!mi || mi->Vertices->GetBufferPointer() == NULL) if(!mi || mi->Vertices->GetBufferPointer() == NULL)
{ {
delete m; delete m;
Core::loader.ReleaseResource(mi);
delete mi;
return NULL; return NULL;
} }
@ -176,6 +178,8 @@ namespace Oyster
float API::PlayAnimation(Model::Model* m, std::wstring name,bool looping) float API::PlayAnimation(Model::Model* m, std::wstring name,bool looping)
{ {
if(m==NULL)
return 0;
m->Animation.AnimationPlaying = &(*m->info->Animations.find(name)).second; m->Animation.AnimationPlaying = &(*m->info->Animations.find(name)).second;
m->Animation.AnimationTime=0; m->Animation.AnimationTime=0;
m->Animation.LoopAnimation = looping; m->Animation.LoopAnimation = looping;

View File

@ -5,12 +5,11 @@
#include <fstream> #include <fstream>
#include <string> #include <string>
#define DANFILEVERSIONMAJOR 1 #define DANFILEVERSIONMAJOR 2
#define DANFILEVERSIONMINOR 1 #define DANFILEVERSIONMINOR 1
#define FILEHEADERSIZE 8 #define FILEHEADERSIZE 8
#define VERTEXHEADERSIZE 4 #define VERTEXHEADERSIZE 4
#define VERTEXSIZE 88
@ -176,7 +175,6 @@ static void ReadData(void* Destination, std::ifstream& file, int size)
/// ///
void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[]) void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[])
{ {
//
Oyster::Graphics::Model::ModelInfo* modelInfo = new Oyster::Graphics::Model::ModelInfo(); Oyster::Graphics::Model::ModelInfo* modelInfo = new Oyster::Graphics::Model::ModelInfo();
modelInfo->Indexed = false; modelInfo->Indexed = false;
modelInfo->Animated = false; modelInfo->Animated = false;
@ -185,7 +183,10 @@ void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[])
std::ifstream danFile; std::ifstream danFile;
danFile.open(filename, std::ios::binary); danFile.open(filename, std::ios::binary);
if (!danFile.is_open()) if (!danFile.is_open())
{
delete modelInfo;
return NULL; return NULL;
}
// Read file header // Read file header
char* buffer = new char[sizeof(FileHeader)]; char* buffer = new char[sizeof(FileHeader)];
@ -196,6 +197,7 @@ void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[])
// If problem with compatability then close file and return from method // If problem with compatability then close file and return from method
if (fileHeader.versionMajor != DANFILEVERSIONMAJOR) if (fileHeader.versionMajor != DANFILEVERSIONMAJOR)
{ {
delete modelInfo;
danFile.close(); danFile.close();
return NULL; return NULL;
} }
@ -220,7 +222,7 @@ void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[])
delete[] buffer; // ( note: may crash here.) delete[] buffer; // ( note: may crash here.)
// Fetch all vertices // Fetch all vertices
unsigned int bufferSize = VERTEXSIZE * vertexHeader.numVertices; unsigned int bufferSize = sizeof(Vertex) * vertexHeader.numVertices;
buffer = new char[bufferSize]; buffer = new char[bufferSize];
danFile.read(buffer, bufferSize); danFile.read(buffer, bufferSize);
@ -291,7 +293,7 @@ void* Oyster::Graphics::Loading::LoadDAN(const wchar_t filename[])
//read normal map name length //read normal map name length
ReadData(&materialHeader.normalMapPathLength,danFile,4); ReadData(&materialHeader.normalMapPathLength,danFile,4);
//read difuse map name //read normal map name
materialHeader.normalMapPath = new char[materialHeader.normalMapPathLength + 1]; materialHeader.normalMapPath = new char[materialHeader.normalMapPathLength + 1];
ReadData(materialHeader.normalMapPath,danFile,materialHeader.normalMapPathLength); ReadData(materialHeader.normalMapPath,danFile,materialHeader.normalMapPathLength);
materialHeader.normalMapPath[materialHeader.normalMapPathLength] = 0; materialHeader.normalMapPath[materialHeader.normalMapPathLength] = 0;

View File

@ -645,6 +645,7 @@ static HRESULT CreateTextureFromWIC( _In_ ID3D11Device* d3dDevice,
if ( SUCCEEDED(hr) && ( fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN ) ) if ( SUCCEEDED(hr) && ( fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN ) )
{ {
autogen = true; autogen = true;
autogen = false;
} }
} }

View File

@ -91,8 +91,8 @@ namespace Oyster
{ {
tmpInst.coff=(1.0f/TEXT_NR_LETTERS); tmpInst.coff=(1.0f/TEXT_NR_LETTERS);
tmpInst.offset=text[i]-32; tmpInst.offset=text[i]-32;
tmpInst.pos=i*(FontSize * 0.8f * TEXT_SPACING); tmpInst.pos=i*(FontSize * 0.7f * TEXT_SPACING);
if(tmpInst.pos > size.x) if(tmpInst.pos > size.x*2)
{ {
text = text.substr(0,i-1); text = text.substr(0,i-1);
break; break;

View File

@ -340,13 +340,11 @@ namespace Oyster
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "BONEINDEX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "BITANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 44, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }
{ "BONEINDEX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 56, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 72, D3D11_INPUT_PER_VERTEX_DATA, 0 }
}; };
Shader::CreateInputLayout(indesc,7,GetShader::Vertex(L"Gather"),Gather::Pass.IAStage.Layout); Shader::CreateInputLayout(indesc,5,GetShader::Vertex(L"Gather"),Gather::Pass.IAStage.Layout);
Gather::Pass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; Gather::Pass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
Gather::Pass.CBuffers.Vertex.push_back(Gather::AnimationData); Gather::Pass.CBuffers.Vertex.push_back(Gather::AnimationData);
Gather::Pass.CBuffers.Vertex.push_back(Gather::ModelData); Gather::Pass.CBuffers.Vertex.push_back(Gather::ModelData);

View File

@ -4,19 +4,19 @@
void main(point Vertex2DIn input[1],inout TriangleStream<Pixel2DIn> Quads) void main(point Vertex2DIn input[1],inout TriangleStream<Pixel2DIn> Quads)
{ {
Pixel2DIn output; Pixel2DIn output;
output.Pos = mul(float4(-1,-1,0,1) ,Translation); output.Pos = mul(float4(-1,-1,1,1) ,Translation);
output.Uv = float2(0,1); output.Uv = float2(0,1);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(-1,1,0,1), Translation); output.Pos = mul(float4(-1,1,1,1), Translation);
output.Uv = float2(0,0); output.Uv = float2(0,0);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(1,-1,0,1), Translation); output.Pos = mul(float4(1,-1,1,1), Translation);
output.Uv = float2(1,1); output.Uv = float2(1,1);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(1,1,0,1), Translation); output.Pos = mul(float4(1,1,1,1), Translation);
output.Uv = float2(1,0); output.Uv = float2(1,0);
Quads.Append(output); Quads.Append(output);
} }

View File

@ -7,22 +7,22 @@ void main(point Text2DIn input[1],inout TriangleStream<Pixel2DIn> Quads)
float endoff=startoff+input[0].coff; float endoff=startoff+input[0].coff;
Pixel2DIn output; Pixel2DIn output;
output.Pos = mul(float4(-1,-1,0,1), Translation); output.Pos = mul(float4(-1,-1,1,1), Translation);
output.Pos.x += input[0].Pos; output.Pos.x += input[0].Pos;
output.Uv = float2(startoff,1); output.Uv = float2(startoff,1);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(-1,1,0,1), Translation); output.Pos = mul(float4(-1,1,1,1), Translation);
output.Pos.x += input[0].Pos; output.Pos.x += input[0].Pos;
output.Uv = float2(startoff,0); output.Uv = float2(startoff,0);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(1,-1,0,1), Translation); output.Pos = mul(float4(1,-1,1,1), Translation);
output.Pos.x += input[0].Pos; output.Pos.x += input[0].Pos;
output.Uv = float2(endoff,1); output.Uv = float2(endoff,1);
Quads.Append(output); Quads.Append(output);
output.Pos = mul(float4(1,1,0,1), Translation); output.Pos = mul(float4(1,1,1,1), Translation);
output.Pos.x += input[0].Pos; output.Pos.x += input[0].Pos;
output.Uv = float2(endoff,0); output.Uv = float2(endoff,0);
Quads.Append(output); Quads.Append(output);

View File

@ -3,8 +3,6 @@ struct VertexIn
float3 pos : POSITION; float3 pos : POSITION;
float2 UV : TEXCOORD; float2 UV : TEXCOORD;
float3 normal : NORMAL; float3 normal : NORMAL;
float3 tangent : TANGENT;
float3 biTangent : BITANGENT;
float4 boneIndex : BONEINDEX; float4 boneIndex : BONEINDEX;
float4 boneWeight : BONEWEIGHT; float4 boneWeight : BONEWEIGHT;
}; };
@ -15,8 +13,6 @@ struct VertexOut
float4 ViewPos : POSITION; float4 ViewPos : POSITION;
float2 UV : TEXCOORD; float2 UV : TEXCOORD;
float3 normal : NORMAL; float3 normal : NORMAL;
//float3 tangent : TANGENT;
//float3 biTangent : BITANGENT;
}; };
struct PixelOut struct PixelOut

View File

@ -36,7 +36,8 @@ void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID )
float AmbValue = GetSSAO(ViewPos, UV, DTid.xy, GTid.xy/2); float AmbValue = GetSSAO(ViewPos, UV, DTid.xy, GTid.xy/2);
Ambient[DTid.xy/2] = float4(DiffuseGlow[DTid.xy].xyz, AmbValue); Ambient[DTid.xy/2] = float4(DiffuseGlow[DTid.xy].xyz, AmbValue);
Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy]; Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy];
Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffuseGlow[DTid.xy].xyz * DiffuseGlow[DTid.xy].w*10,1); Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffuseGlow[DTid.xy].xyz * DiffuseGlow[DTid.xy].w,1);
Ambient[DTid.xy/2 + Pixels/2] = float4(NormalSpec[DTid.xy].xyz,1);
} }
} }

View File

@ -11,7 +11,7 @@ cbuffer Size : register(b0)
int2 Pixels; int2 Pixels;
} }
#define AmbFactor 0.8f; #define AmbFactor 0.1f;
float4 SuperSample(float4 Glow, uint3 DTid) float4 SuperSample(float4 Glow, uint3 DTid)
{ {
@ -20,12 +20,7 @@ float4 SuperSample(float4 Glow, uint3 DTid)
index += float2(0,Output.Length.y/2); index += float2(0,Output.Length.y/2);
index = index / Output.Length; index = index / Output.Length;
Glow = Ambient.SampleLevel(S1, index,1); Glow = Ambient.SampleLevel(S1, index,1);
//Line Y+1 Glow = Glow * Glow.w*10;
//Glow += Ambient[DTid.xy/2 + uint2(1,(Output.Length.y/2)+1)] + Ambient[DTid.xy/2 + uint2(0,(Output.Length.y/2)+1)] + Ambient[DTid.xy/2 + uint2(-1,(Output.Length.y/2)+1)];
//Line Y-1
//Glow += Ambient[DTid.xy/2 + uint2(1,(Output.Length.y/2)-1)] + Ambient[DTid.xy/2 + uint2(0,(Output.Length.y/2)-1)] + Ambient[DTid.xy/2 + uint2(-1,(Output.Length.y/2)-1)];
//Glow = Glow/9;
return Glow; return Glow;
} }
@ -34,7 +29,7 @@ float4 SuperSample(float4 Glow, uint3 DTid)
void main( uint3 DTid : SV_DispatchThreadID ) void main( uint3 DTid : SV_DispatchThreadID )
{ {
float4 Light = Diffuse[DTid.xy] + saturate(Specular[DTid.xy]); float4 Light = Diffuse[DTid.xy] + saturate(Specular[DTid.xy]);
float4 Amb = float4(Ambient[DTid.xy/2].xyz/* * Ambient[DTid.xy/2].w */, 0); float4 Amb = float4(Ambient[DTid.xy/2].xyz /* * Ambient[DTid.xy/2].w*/, 0);
//float4 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)]; //float4 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)];
float4 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)]; float4 Glow = Ambient[DTid.xy/2 + uint2(0,Output.Length.y/2)];
@ -43,10 +38,10 @@ void main( uint3 DTid : SV_DispatchThreadID )
float4 GUI; float4 GUI;
uint2 index = DTid.xy/2 + uint2((uint)Pixels.x/(uint)2,0); uint2 index = DTid.xy/2 + uint2((uint)Pixels.x/(uint)2,0);
float3 PostLight = Amb.xyz * AmbFactor; float3 PostLight = Amb.xyz * AmbFactor;
PostLight = PostLight + Light.xyz; // + Glow; PostLight = PostLight + Light.xyz + Glow;
GUI = float4(Ambient[index]); GUI = float4(Ambient[index]);
PostLight = PostLight * (1 - GUI.w); PostLight = PostLight * (1 - GUI.w);
Output[DTid.xy] = float4((GUI.xyz * GUI.w) + PostLight, 1); Output[DTid.xy] = float4((GUI.xyz * GUI.w) + PostLight, 1);
//Output[DTid.xy] = Glow; //Output[DTid.xy] = Ambient[DTid.xy];
} }

View File

@ -373,6 +373,14 @@ namespace LinearAlgebra3D
return (rotation*localAxis*rotation.GetConjugate()).imaginary; return (rotation*localAxis*rotation.GetConjugate()).imaginary;
} }
template<typename ScalarType>
inline ::LinearAlgebra::Vector3<ScalarType> AngularAxis( const ::LinearAlgebra::Quaternion<ScalarType> &rotation )
{ // see http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
ScalarType angle = ScalarType(2) * (ScalarType)::std::acos( rotation.real ),
multiplier = angle / (ScalarType)::std::sqrt( ScalarType(1) - rotation.real * rotation.real );
return multiplier * rotation.imaginary;
}
// All Matrix to AngularAxis conversions here is incorrect // All Matrix to AngularAxis conversions here is incorrect
//template<typename ScalarType> //template<typename ScalarType>
//inline ::LinearAlgebra::Vector4<ScalarType> AngularAxis( const ::LinearAlgebra::Matrix3x3<ScalarType> &rotationMatrix ) //inline ::LinearAlgebra::Vector4<ScalarType> AngularAxis( const ::LinearAlgebra::Matrix3x3<ScalarType> &rotationMatrix )

View File

@ -81,6 +81,12 @@ namespace Oyster { namespace Math2D
namespace Oyster { namespace Math3D namespace Oyster { namespace Math3D
{ {
//! Converts a rotationQuaternion to an angularAxis
Float3 AngularAxis( const Quaternion &rotation )
{
return ::LinearAlgebra3D::AngularAxis( rotation );
}
//Float4 AngularAxis( const Float3x3 &rotationMatrix ) //Float4 AngularAxis( const Float3x3 &rotationMatrix )
//{ //{
// return ::LinearAlgebra3D::AngularAxis( rotationMatrix ); // return ::LinearAlgebra3D::AngularAxis( rotationMatrix );
@ -96,52 +102,6 @@ namespace Oyster { namespace Math3D
// return ::LinearAlgebra3D::ExtractAngularAxis( orientationMatrix ); // return ::LinearAlgebra3D::ExtractAngularAxis( orientationMatrix );
//} //}
Float4 QuaternionToAngularAxis(Float4 quaternion)
{
Float4 axis = Float4::null;
Float s = sqrtf(1 - quaternion.w*quaternion.w);
axis.w = 2*acos(quaternion.w*quaternion.w);
if(1 - quaternion.w > 0.001f)
{
axis.x = quaternion.x/s;
axis.y = quaternion.y/s;
axis.z = quaternion.z/s;
}
else
{
axis.x = quaternion.x;
axis.y = quaternion.y;
axis.z = quaternion.z;
}
return axis;
}
Float4 QuaternionToAngularAxis(Quaternion quaternion)
{
Float4 axis = Float4::null;
Float s = sqrtf(1 - quaternion.real*quaternion.real);
axis.w = 2*acos(quaternion.real*quaternion.real);
if(1 - quaternion.real > 0.001f)
{
axis.x = quaternion.imaginary.x/s;
axis.y = quaternion.imaginary.y/s;
axis.z = quaternion.imaginary.z/s;
}
else
{
axis.x = quaternion.imaginary.x;
axis.y = quaternion.imaginary.y;
axis.z = quaternion.imaginary.z;
}
return axis;
}
Float4x4 & TranslationMatrix( const Float3 &position, Float4x4 &targetMem ) Float4x4 & TranslationMatrix( const Float3 &position, Float4x4 &targetMem )
{ {
return ::LinearAlgebra3D::TranslationMatrix( position, targetMem ); return ::LinearAlgebra3D::TranslationMatrix( position, targetMem );

View File

@ -140,6 +140,9 @@ namespace Oyster { namespace Math3D //! Oyster's native math library specialized
{ {
using namespace ::Oyster::Math; // deliberate inheritance from ::Oyster::Math namespace using namespace ::Oyster::Math; // deliberate inheritance from ::Oyster::Math namespace
//! Converts a rotationQuaternion to an angularAxis
Float3 AngularAxis( const Quaternion &rotation );
//! Extracts the angularAxis from rotationMatrix //! Extracts the angularAxis from rotationMatrix
//Float4 AngularAxis( const Float3x3 &rotationMatrix ); //Float4 AngularAxis( const Float3x3 &rotationMatrix );
@ -149,12 +152,6 @@ namespace Oyster { namespace Math3D //! Oyster's native math library specialized
////! Extracts the angularAxis from orientationMatrix ////! Extracts the angularAxis from orientationMatrix
//Float4 ExtractAngularAxis( const Float4x4 &orientationMatrix ); //Float4 ExtractAngularAxis( const Float4x4 &orientationMatrix );
//! Converts a quaternion as Float4 to angular axis as Float4
Float4 QuaternionToAngularAxis(Float4 quaternion);
//! Converts a quaternion to angular axis as Float4
Float4 QuaternionToAngularAxis(Quaternion quaternion);
//! Sets and returns targetMem to a translationMatrix with position as translation. //! Sets and returns targetMem to a translationMatrix with position as translation.
Float4x4 & TranslationMatrix( const Float3 &position, Float4x4 &targetMem = Float4x4() ); Float4x4 & TranslationMatrix( const Float3 &position, Float4x4 &targetMem = Float4x4() );

View File

@ -171,18 +171,14 @@ HRESULT InitDirect3D()
} }
m = Oyster::Graphics::API::CreateModel(L"crate_colonists.dan"); m = Oyster::Graphics::API::CreateModel(L"crate_colonists.dan");
//m->WorldMatrix.m[0][0] = 50; m2 = Oyster::Graphics::API::CreateModel(L"char_orca.dan");
//m->WorldMatrix.m[1][1] = 50;
//m->WorldMatrix.m[2][2] = 0.00000005f;
m2 = Oyster::Graphics::API::CreateModel(L"char_temporary.dan");
m2->Tint = Oyster::Math::Float3(0.1f,0.1f,1); m2->Tint = Oyster::Math::Float3(0.1f,0.1f,1);
m3 = Oyster::Graphics::API::CreateModel(L"char_temporary.dan"); m3 = Oyster::Graphics::API::CreateModel(L"char_orca.dan");
m2->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3::null,Oyster::Math::Float3(4,0,0),Oyster::Math::Float3::null); //Oyster::Graphics::API::PlayAnimation(m2, L"movement", true);
Oyster::Graphics::API::PlayAnimation(m2, L"movement", true);
Oyster::Graphics::API::PlayAnimation(m3, L"movement", true); Oyster::Graphics::API::PlayAnimation(m3, L"movement", true);
t = Oyster::Graphics::API::CreateTexture(L"structure_corp_mdg.png"); t = Oyster::Graphics::API::CreateTexture(L"structure_corp_mdg.png");
t2 = Oyster::Graphics::API::CreateTexture(L"whiteGui.png"); t2 = Oyster::Graphics::API::CreateTexture(L"color_white.png");
P = Oyster::Math3D::ProjectionMatrix_Perspective(Oyster::Math::pi/2,1280.0f/720.0f,.1f,10000); P = Oyster::Math3D::ProjectionMatrix_Perspective(Oyster::Math::pi/2,1280.0f/720.0f,.1f,10000);
Oyster::Graphics::API::SetProjection(P); Oyster::Graphics::API::SetProjection(P);
@ -217,15 +213,13 @@ HRESULT InitDirect3D()
return S_OK; return S_OK;
} }
float angle = 0; float angle = 0;
float z=0;
HRESULT Update(float deltaTime) HRESULT Update(float deltaTime)
{ {
//angle += Oyster::Math::pi/16 * deltaTime; m->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(0,1,0) * angle,Oyster::Math::Float3(0,0,z),Oyster::Math::Float3::null);
m->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(1,0,0) * angle,Oyster::Math::Float3(0,0,0),Oyster::Math::Float3::null);
m2->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(0,1,0) * angle,Oyster::Math::Float3(4,0,0),Oyster::Math::Float3::null); m2->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(0,1,0) * angle,Oyster::Math::Float3(4,0,0),Oyster::Math::Float3::null);
m3->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(0,1,0) * -angle,Oyster::Math::Float3(-4,0,0),Oyster::Math::Float3::null); m3->WorldMatrix = Oyster::Math3D::OrientationMatrix(Oyster::Math::Float3(0,1,0) * -angle,Oyster::Math::Float3(-4,0,0),Oyster::Math::Float3::null);
//Oyster::Math::Matrix ma = Oyster::Math::Matrix::identity;
Oyster::Graphics::API::Update(deltaTime); Oyster::Graphics::API::Update(deltaTime);
//m2->Animation.data.AnimationTime += deltaTime;// * 0.5f;
return S_OK; return S_OK;
} }
@ -238,7 +232,7 @@ HRESULT Render(float deltaTime)
Oyster::Graphics::API::RenderModel(m2); Oyster::Graphics::API::RenderModel(m2);
Oyster::Graphics::API::RenderModel(m3); Oyster::Graphics::API::RenderModel(m3);
Oyster::Graphics::API::StartGuiRender(); Oyster::Graphics::API::StartGuiRender();
//Oyster::Graphics::API::RenderGuiElement(t,Oyster::Math::Float2(0.5f,0.5f),Oyster::Math::Float2(1,1), Oyster::Math::Float3(0,0,1)); Oyster::Graphics::API::RenderGuiElement(t2,Oyster::Math::Float3(0.5f,0.7f,0.1f),Oyster::Math::Float2(0.2f,0.2f), Oyster::Math::Float3(1,1,1));
//Oyster::Graphics::API::RenderGuiElement(t2,Oyster::Math::Float2(0.5f,0.5f),Oyster::Math::Float2(1,1),Oyster::Math::Float3(1,0,0)); //Oyster::Graphics::API::RenderGuiElement(t2,Oyster::Math::Float2(0.5f,0.5f),Oyster::Math::Float2(1,1),Oyster::Math::Float3(1,0,0));
Oyster::Graphics::API::StartTextRender(); Oyster::Graphics::API::StartTextRender();
std::wstring fps; std::wstring fps;
@ -246,7 +240,7 @@ HRESULT Render(float deltaTime)
fps = std::to_wstring(f); fps = std::to_wstring(f);
//Oyster::Graphics::API::RenderText(L"Lanariel",Oyster::Math::Float2(0.5f,0.1f),Oyster::Math::Float2(0.5f,0.1f)); //Oyster::Graphics::API::RenderText(L"Lanariel",Oyster::Math::Float2(0.5f,0.1f),Oyster::Math::Float2(0.5f,0.1f));
//Oyster::Graphics::API::RenderText(L"Lanariel WAS HERE",Oyster::Math::Float2(0.5f,0.1f),Oyster::Math::Float2(0.5f,0.1f)); //Oyster::Graphics::API::RenderText(L"Lanariel WAS HERE",Oyster::Math::Float2(0.5f,0.1f),Oyster::Math::Float2(0.5f,0.1f));
Oyster::Graphics::API::RenderText(fps,Oyster::Math::Float3(0.5f,0.1f,1.0f),Oyster::Math::Float2(0.5f,0.1f), 0.08f, Oyster::Math::Float3(0,1,0)); Oyster::Graphics::API::RenderText(fps,Oyster::Math::Float3(0.5f,0.1f,0.1f),Oyster::Math::Float2(0.5f,0.1f), 0.08f, Oyster::Math::Float3(0,1,0));
Oyster::Graphics::API::EndFrame(); Oyster::Graphics::API::EndFrame();
return S_OK; return S_OK;
@ -286,16 +280,26 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
break; break;
//Z - //Z -
case 0x5A: case 0x5A:
//m2->AnimationTime -= 0.1f;
//if(m2->AnimationTime < 0)
//m2->AnimationTime = 0;
angle += Oyster::Math::pi / 16; angle += Oyster::Math::pi / 16;
break; break;
//X + //X +
case 0x58: case 0x58:
//m2->AnimationTime += 0.1f;
angle -= Oyster::Math::pi / 16; angle -= Oyster::Math::pi / 16;
break; break;
//A
case 0x41:
break;
//D
case 0x44:
break;
//W
case 0x57:
z-=0.5f;
break;
//S
case 0x53:
z+=0.5f;
break;
} }
break; break;