Merge branch 'GameLogic' of https://github.com/dean11/Danbias into GameLogic
This commit is contained in:
commit
2052f60ea4
|
@ -3,6 +3,7 @@
|
||||||
using namespace DanBias::Client;
|
using namespace DanBias::Client;
|
||||||
|
|
||||||
C_DynamicObj::C_DynamicObj(void)
|
C_DynamicObj::C_DynamicObj(void)
|
||||||
|
:C_Object()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
using namespace DanBias::Client;
|
using namespace DanBias::Client;
|
||||||
|
|
||||||
C_StaticObj::C_StaticObj(void)
|
C_StaticObj::C_StaticObj(void)
|
||||||
|
:C_Object()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,8 +114,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa
|
||||||
modelData.position = position;
|
modelData.position = position;
|
||||||
modelData.rotation = ArrayToQuaternion( rotation );
|
modelData.rotation = ArrayToQuaternion( rotation );
|
||||||
modelData.scale = scale;
|
modelData.scale = scale;
|
||||||
StringToWstring( modelName, modelData.modelPath );
|
|
||||||
modelData.id = id;
|
modelData.id = id;
|
||||||
|
StringToWstring(modelName,modelData.modelPath);
|
||||||
|
|
||||||
// RB DEBUG
|
// RB DEBUG
|
||||||
RBInitData RBData;
|
RBInitData RBData;
|
||||||
|
@ -141,8 +141,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa
|
||||||
this->privData->camera.SetPosition( p->getPos() );
|
this->privData->camera.SetPosition( p->getPos() );
|
||||||
Float3 offset = Float3( 0.0f );
|
Float3 offset = Float3( 0.0f );
|
||||||
// DEBUG position of camera so we can see the player model
|
// DEBUG position of camera so we can see the player model
|
||||||
//offset.y = p->getScale().y * 5.0f;
|
offset.y = p->getScale().y * 5.0f;
|
||||||
//offset.z = p->getScale().z * -5.0f;
|
offset.z = p->getScale().z * -5.0f;
|
||||||
// !DEBUG
|
// !DEBUG
|
||||||
this->privData->camera.SetHeadOffset( offset );
|
this->privData->camera.SetHeadOffset( offset );
|
||||||
this->privData->camera.UpdateOrientation();
|
this->privData->camera.UpdateOrientation();
|
||||||
|
@ -186,7 +186,7 @@ bool GameState::Render()
|
||||||
{
|
{
|
||||||
if(playerObject->second)
|
if(playerObject->second)
|
||||||
{
|
{
|
||||||
if( this->privData->myId != playerObject->second->GetId() )
|
//if( this->privData->myId != playerObject->second->GetId() )
|
||||||
{
|
{
|
||||||
playerObject->second->Render();
|
playerObject->second->Render();
|
||||||
}
|
}
|
||||||
|
@ -217,6 +217,8 @@ bool GameState::Render()
|
||||||
|
|
||||||
playerObject = this->privData->players.begin();
|
playerObject = this->privData->players.begin();
|
||||||
for( ; playerObject != this->privData->players.end(); ++playerObject )
|
for( ; playerObject != this->privData->players.end(); ++playerObject )
|
||||||
|
{
|
||||||
|
if(playerObject->second)
|
||||||
{
|
{
|
||||||
if( playerObject->second->getBRtype() == RB_Type_Cube)
|
if( playerObject->second->getBRtype() == RB_Type_Cube)
|
||||||
{
|
{
|
||||||
|
@ -227,6 +229,7 @@ bool GameState::Render()
|
||||||
Oyster::Graphics::API::RenderDebugSphere( playerObject->second->getRBWorld());
|
Oyster::Graphics::API::RenderDebugSphere( playerObject->second->getRBWorld());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
staticObject = this->privData->staticObjects->begin();
|
staticObject = this->privData->staticObjects->begin();
|
||||||
for( ; staticObject != this->privData->staticObjects->end(); ++staticObject )
|
for( ; staticObject != this->privData->staticObjects->end(); ++staticObject )
|
||||||
|
@ -588,6 +591,8 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState
|
||||||
{
|
{
|
||||||
Protocol_ObjectDie decoded(data);
|
Protocol_ObjectDie decoded(data);
|
||||||
// if is this player. Remember to change camera
|
// if is this player. Remember to change camera
|
||||||
|
int killerID = decoded.killerID;
|
||||||
|
int victimID = decoded.objectID;
|
||||||
if( this->privData->myId == decoded.objectID )
|
if( this->privData->myId == decoded.objectID )
|
||||||
{
|
{
|
||||||
this->currGameUI = this->respawnUI;
|
this->currGameUI = this->respawnUI;
|
||||||
|
|
|
@ -33,7 +33,7 @@ bool GamingUI::Init()
|
||||||
// z value should be between 0.5 - 0.9 so that it will be behind other states
|
// z value should be between 0.5 - 0.9 so that it will be behind other states
|
||||||
// add textures and text
|
// add textures and text
|
||||||
this->plane = new Plane_UI(L"box_tex.png", Float3(0.5f, 0.0f, 0.5f), Float2(0.3f, 0.1f));
|
this->plane = new Plane_UI(L"box_tex.png", Float3(0.5f, 0.0f, 0.5f), Float2(0.3f, 0.1f));
|
||||||
this->text = new Text_UI(L"hej", Float3(0.5f,0.0f,0.1f), Float2(0.1f,0.1f));
|
this->text = new Text_UI(L"hej", Float3(0.3f,0.0f,0.1f), Float2(0.1f,0.1f));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,7 +231,7 @@ void NetLoadState::LoadGame( const ::std::string &fileName )
|
||||||
pointLight.Color = light->color;
|
pointLight.Color = light->color;
|
||||||
pointLight.Pos = light->position;
|
pointLight.Pos = light->position;
|
||||||
pointLight.Bright = light->intensity;
|
pointLight.Bright = light->intensity;
|
||||||
pointLight.Radius = light->raduis;
|
pointLight.Radius = light->radius;
|
||||||
|
|
||||||
C_Light *newLight = new C_Light( pointLight, objectID );
|
C_Light *newLight = new C_Light( pointLight, objectID );
|
||||||
|
|
||||||
|
@ -242,5 +242,7 @@ void NetLoadState::LoadGame( const ::std::string &fileName )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Graphics::API::EndLoadingModels();
|
||||||
|
|
||||||
this->privData->nextState = ClientState::ClientState_Game;
|
this->privData->nextState = ClientState::ClientState_Game;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,18 @@ AttatchmentMassDriver::AttatchmentMassDriver(void)
|
||||||
this->owner = 0;
|
this->owner = 0;
|
||||||
this->heldObject = NULL;
|
this->heldObject = NULL;
|
||||||
this->hasObject = false;
|
this->hasObject = false;
|
||||||
|
this->currentEnergy = StandardMaxEnergy;
|
||||||
|
this->maxEnergy = StandardMaxEnergy;
|
||||||
|
this->rechargeRate = StandardrechargeRate;
|
||||||
|
this->force = Standardforce;
|
||||||
}
|
}
|
||||||
|
|
||||||
AttatchmentMassDriver::AttatchmentMassDriver(Player &owner)
|
AttatchmentMassDriver::AttatchmentMassDriver(Player &owner)
|
||||||
{
|
{
|
||||||
|
this->currentEnergy = StandardMaxEnergy;
|
||||||
|
this->maxEnergy = StandardMaxEnergy;
|
||||||
|
this->rechargeRate = StandardrechargeRate;
|
||||||
|
this->force = Standardforce;
|
||||||
|
|
||||||
this->owner = &owner;
|
this->owner = &owner;
|
||||||
this->heldObject = NULL;
|
this->heldObject = NULL;
|
||||||
|
@ -36,15 +44,27 @@ void AttatchmentMassDriver::UseAttatchment(const GameLogic::WEAPON_FIRE &usage,
|
||||||
switch (usage)
|
switch (usage)
|
||||||
{
|
{
|
||||||
case WEAPON_FIRE::WEAPON_USE_PRIMARY_PRESS:
|
case WEAPON_FIRE::WEAPON_USE_PRIMARY_PRESS:
|
||||||
|
if(currentEnergy >= 90.0f)
|
||||||
|
{
|
||||||
|
currentEnergy -= 90.0f;
|
||||||
ForcePush(usage,dt);
|
ForcePush(usage,dt);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WEAPON_FIRE::WEAPON_USE_SECONDARY_PRESS:
|
case WEAPON_FIRE::WEAPON_USE_SECONDARY_PRESS:
|
||||||
|
if(currentEnergy >= 1.0f)
|
||||||
|
{
|
||||||
|
currentEnergy -= 1.0f;
|
||||||
ForcePull(usage,dt);
|
ForcePull(usage,dt);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WEAPON_FIRE::WEAPON_USE_UTILLITY_PRESS:
|
case WEAPON_FIRE::WEAPON_USE_UTILLITY_PRESS:
|
||||||
|
if(currentEnergy >= 90.0f)
|
||||||
|
{
|
||||||
|
currentEnergy -= 90.0f;
|
||||||
ForceZip(usage,dt);
|
ForceZip(usage,dt);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +84,14 @@ void AttatchmentMassDriver::Update(float dt)
|
||||||
heldObject->SetPosition(pos);
|
heldObject->SetPosition(pos);
|
||||||
heldObject->SetLinearVelocity(Oyster::Math::Float3::null);
|
heldObject->SetLinearVelocity(Oyster::Math::Float3::null);
|
||||||
|
|
||||||
|
currentEnergy += rechargeRate * 0.5f; //rechargeRate is halfed if you are holding an object
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentEnergy += rechargeRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************
|
/********************************************************
|
||||||
|
@ -78,9 +105,9 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float
|
||||||
|
|
||||||
if(hasObject)
|
if(hasObject)
|
||||||
{
|
{
|
||||||
pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (800);
|
pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force);
|
||||||
heldObject->ApplyImpulse((Oyster::Math::Float3)pushForce);
|
heldObject->ApplyImpulse((Oyster::Math::Float3)pushForce);
|
||||||
|
((DynamicObject*)(heldObject->GetCustomTag()))->RemoveManipulation();
|
||||||
hasObject = false;
|
hasObject = false;
|
||||||
heldObject = NULL;
|
heldObject = NULL;
|
||||||
return;
|
return;
|
||||||
|
@ -91,14 +118,13 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float
|
||||||
Oyster::Math::Float lenght = 10;
|
Oyster::Math::Float lenght = 10;
|
||||||
Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos;
|
Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos;
|
||||||
|
|
||||||
pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (400);
|
pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force * 0.6f);
|
||||||
|
|
||||||
Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius);
|
Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
forcePushData args;
|
forcePushData args;
|
||||||
args.pushForce = pushForce;
|
args.pushForce = pushForce;
|
||||||
|
args.p = this->owner;
|
||||||
|
|
||||||
Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction);
|
Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction);
|
||||||
|
|
||||||
|
@ -110,7 +136,7 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float
|
||||||
********************************************************/
|
********************************************************/
|
||||||
void AttatchmentMassDriver::ForceZip(const WEAPON_FIRE &usage, float dt)
|
void AttatchmentMassDriver::ForceZip(const WEAPON_FIRE &usage, float dt)
|
||||||
{
|
{
|
||||||
Oyster::Math::Float3 force = Oyster::Math::Float4(this->owner->GetLookDir()) * (1000);
|
Oyster::Math::Float3 force = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force);
|
||||||
|
|
||||||
this->owner->GetRigidBody()->ApplyImpulse(force);
|
this->owner->GetRigidBody()->ApplyImpulse(force);
|
||||||
}
|
}
|
||||||
|
@ -131,11 +157,12 @@ void AttatchmentMassDriver::ForcePull(const WEAPON_FIRE &usage, float dt)
|
||||||
Oyster::Math::Float lenght = 10;
|
Oyster::Math::Float lenght = 10;
|
||||||
Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos;
|
Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos;
|
||||||
|
|
||||||
Oyster::Math::Float4 pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (100);
|
Oyster::Math::Float4 pullForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force * 0.2);
|
||||||
|
|
||||||
Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius);
|
Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius);
|
||||||
forcePushData args;
|
forcePushData args;
|
||||||
args.pushForce = -pushForce;
|
args.pushForce = -pullForce;
|
||||||
|
args.p = this->owner;
|
||||||
|
|
||||||
Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction);
|
Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction);
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,14 @@
|
||||||
#ifndef ATTATCHMENTMASSDRIVER_H
|
#ifndef ATTATCHMENTMASSDRIVER_H
|
||||||
#define ATTATCHMENTMASSDRIVER_H
|
#define ATTATCHMENTMASSDRIVER_H
|
||||||
#include "IAttatchment.h"
|
#include "IAttatchment.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace GameLogic
|
namespace GameLogic
|
||||||
{
|
{
|
||||||
|
const Oyster::Math::Float StandardMaxEnergy = 100.0f;
|
||||||
|
const Oyster::Math::Float StandardrechargeRate = 0.5f;
|
||||||
|
const Oyster::Math::Float Standardforce = 1000.0f;
|
||||||
|
|
||||||
class AttatchmentMassDriver : public IAttatchment
|
class AttatchmentMassDriver : public IAttatchment
|
||||||
{
|
{
|
||||||
|
@ -53,6 +59,19 @@ namespace GameLogic
|
||||||
Oyster::Physics::ICustomBody *heldObject;
|
Oyster::Physics::ICustomBody *heldObject;
|
||||||
bool hasObject;
|
bool hasObject;
|
||||||
|
|
||||||
|
Oyster::Math::Float force;
|
||||||
|
|
||||||
|
Oyster::Math::Float maxEnergy;
|
||||||
|
Oyster::Math::Float currentEnergy;
|
||||||
|
|
||||||
|
Oyster::Math::Float rechargeRate;
|
||||||
|
|
||||||
|
struct Aim
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -115,7 +115,7 @@ using namespace GameLogic;
|
||||||
|
|
||||||
|
|
||||||
Object *realObjA = ((Object*)(objA->GetCustomTag()));
|
Object *realObjA = ((Object*)(objA->GetCustomTag()));
|
||||||
Object *realObjB = (Object*)objB->GetCustomTag(); //needs to be changed?
|
Object *realObjB = (Object*)objB->GetCustomTag();
|
||||||
ExplosiveCrate* crate;
|
ExplosiveCrate* crate;
|
||||||
|
|
||||||
if(!realObjA)
|
if(!realObjA)
|
||||||
|
@ -166,13 +166,17 @@ using namespace GameLogic;
|
||||||
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player)
|
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player)
|
||||||
{
|
{
|
||||||
Player *hitPlayer = (Player*)realObj;
|
Player *hitPlayer = (Player*)realObj;
|
||||||
|
hitPlayer->DamageLife(ExplosionSource->extraDamageOnCollision);
|
||||||
|
//hitPlayer->GetRigidBody()->ApplyImpulse(force);
|
||||||
|
|
||||||
//hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision());
|
//hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision());
|
||||||
hitPlayer->GetRigidBody()->ApplyImpulse(force);
|
realObj->GetRigidBody()->ApplyImpulse(force * 5);
|
||||||
//do shredding damage
|
//do shredding damage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerVObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss)
|
void PlayerVObject(Player &player, Object &obj, Oyster::Math::Float kineticEnergyLoss)
|
||||||
|
@ -228,6 +232,58 @@ using namespace GameLogic;
|
||||||
{
|
{
|
||||||
return Physics::ICustomBody::SubscriptMessage_none;
|
return Physics::ICustomBody::SubscriptMessage_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DynamicObject::DynamicDefaultOnCollision(Oyster::Physics::ICustomBody *objA, Oyster::Physics::ICustomBody *objB, Oyster::Math::Float kineticEnergyLoss)
|
||||||
|
{
|
||||||
|
|
||||||
|
DynamicObject *realObjA = dynamic_cast<DynamicObject*>((Object*)objA->GetCustomTag());
|
||||||
|
|
||||||
|
DynamicObject *realObjB = dynamic_cast<DynamicObject*>((Object*)objB->GetCustomTag());
|
||||||
|
|
||||||
|
if(!realObjA || !realObjB) // one of the objects cannot be cast into a dynamicObject and so we leave the function
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check which obj is the one that is already affected, if both are then use the special case of changing ownership.
|
||||||
|
if(realObjA->getAffectingPlayer() == NULL && realObjB->getAffectingPlayer() == NULL) //None of the objects have a player affecting them
|
||||||
|
{
|
||||||
|
return;//leave function as the are not to transfer any ownership
|
||||||
|
}
|
||||||
|
|
||||||
|
if(realObjA->getAffectingPlayer() != NULL && realObjB->getAffectingPlayer() == NULL)
|
||||||
|
{
|
||||||
|
//realobjA is the affectedObject, transfer this to realobjB
|
||||||
|
realObjB->SetAffectedBy(*realObjA->getAffectingPlayer());
|
||||||
|
|
||||||
|
}
|
||||||
|
if(realObjB->getAffectingPlayer() != NULL && realObjA->getAffectingPlayer() == NULL)
|
||||||
|
{
|
||||||
|
//realobjB is the affectedObject, transfer this to realobjA
|
||||||
|
realObjA->SetAffectedBy(*realObjB->getAffectingPlayer());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(realObjA->getAffectingPlayer() != NULL && realObjB->getAffectingPlayer() != NULL)
|
||||||
|
{
|
||||||
|
//Both objects have a player affecting them, now use the special case
|
||||||
|
if(realObjA->GetRigidBody()->GetState().previousVelocity.GetMagnitude() > realObjB->GetRigidBody()->GetState().previousVelocity.GetMagnitude() )
|
||||||
|
{
|
||||||
|
//realObjA is the winner and will change Bs ownership to A
|
||||||
|
realObjB->SetAffectedBy(*realObjA->getAffectingPlayer());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
realObjA->SetAffectedBy(*realObjB->getAffectingPlayer());
|
||||||
|
//realObjB is the winner and will change As ownership to B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
|
Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss)
|
||||||
{
|
{
|
||||||
return Physics::ICustomBody::SubscriptMessage_none;
|
return Physics::ICustomBody::SubscriptMessage_none;
|
||||||
|
@ -252,7 +308,17 @@ using namespace GameLogic;
|
||||||
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player || realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_World)
|
if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player || realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_World)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
obj->ApplyImpulse(((forcePushData*)(args))->pushForce);
|
obj->ApplyImpulse(((forcePushData*)(args))->pushForce);
|
||||||
|
|
||||||
|
|
||||||
|
DynamicObject *dynamicObj = dynamic_cast<DynamicObject*>(realObj);
|
||||||
|
|
||||||
|
if(dynamicObj)
|
||||||
|
{
|
||||||
|
dynamicObj->SetAffectedBy(*((forcePushData*)(args))->p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttatchmentMassDriver::AttemptPickUp(Oyster::Physics::ICustomBody *obj, void* args)
|
void AttatchmentMassDriver::AttemptPickUp(Oyster::Physics::ICustomBody *obj, void* args)
|
||||||
|
@ -270,12 +336,21 @@ using namespace GameLogic;
|
||||||
Object* realObj = (Object*)(obj->GetCustomTag());
|
Object* realObj = (Object*)(obj->GetCustomTag());
|
||||||
//check so that it is an object that you can pickup
|
//check so that it is an object that you can pickup
|
||||||
|
|
||||||
switch(realObj->GetObjectType())
|
DynamicObject *dynamicObj = dynamic_cast<DynamicObject*>(realObj);
|
||||||
|
|
||||||
|
if(!dynamicObj) return;
|
||||||
|
|
||||||
|
if(dynamicObj->getManipulatingPlayer() != NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(dynamicObj->GetObjectType())
|
||||||
{
|
{
|
||||||
case ObjectSpecialType::ObjectSpecialType_StandardBox:
|
case ObjectSpecialType::ObjectSpecialType_StandardBox:
|
||||||
weapon->heldObject = obj; //weapon now holds the object
|
weapon->heldObject = obj; //weapon now holds the object
|
||||||
weapon->hasObject = true;
|
weapon->hasObject = true;
|
||||||
|
dynamicObj->SetManipulatingPlayer(*weapon->owner); //TODO: add if this is to be a struggle of who has the most power in its weapon, the player that is already manipulating the object or you. if you then you take the object from the other player, if not then you do not take the object
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "DynamicObject.h"
|
#include "DynamicObject.h"
|
||||||
#include "CollisionManager.h"
|
#include "CollisionManager.h"
|
||||||
|
#include "Player.h"
|
||||||
|
|
||||||
using namespace GameLogic;
|
using namespace GameLogic;
|
||||||
using namespace Oyster::Math;
|
using namespace Oyster::Math;
|
||||||
|
@ -10,6 +11,8 @@ DynamicObject::DynamicObject()
|
||||||
{
|
{
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID)
|
DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID)
|
||||||
|
@ -17,12 +20,16 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev
|
||||||
{
|
{
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
}
|
}
|
||||||
DynamicObject::DynamicObject(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)
|
DynamicObject::DynamicObject(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)
|
||||||
{
|
{
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicObject::DynamicObject(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)
|
DynamicObject::DynamicObject(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)
|
||||||
|
@ -31,6 +38,8 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev
|
||||||
this->extraDamageOnCollision = extraDamageOnCollision;
|
this->extraDamageOnCollision = extraDamageOnCollision;
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicObject::DynamicObject(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)
|
DynamicObject::DynamicObject(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)
|
||||||
|
@ -39,6 +48,8 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::P
|
||||||
this->extraDamageOnCollision = extraDamageOnCollision;
|
this->extraDamageOnCollision = extraDamageOnCollision;
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
}
|
}
|
||||||
DynamicObject::~DynamicObject(void)
|
DynamicObject::~DynamicObject(void)
|
||||||
{
|
{
|
||||||
|
@ -75,3 +86,38 @@ void DynamicObject::Activate()
|
||||||
this->isActive = true;
|
this->isActive = true;
|
||||||
this->isReleased = false;
|
this->isReleased = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DynamicObject::SetAffectedBy(Player &player)
|
||||||
|
{
|
||||||
|
this->affectedBy = &player;
|
||||||
|
if(this->type != ObjectSpecialType::ObjectSpecialType_Player) //should not add itself to its own list if its a player
|
||||||
|
{
|
||||||
|
player.AddAffectedObject(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Player* DynamicObject::getAffectingPlayer()
|
||||||
|
{
|
||||||
|
return this->affectedBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DynamicObject::RemoveAffectedBy()
|
||||||
|
{
|
||||||
|
this->affectedBy = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameLogic::Player* DynamicObject::getManipulatingPlayer()
|
||||||
|
{
|
||||||
|
return this->manipulatedBy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DynamicObject::SetManipulatingPlayer(GameLogic::Player &player)
|
||||||
|
{
|
||||||
|
this->manipulatedBy = &player;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DynamicObject::RemoveManipulation()
|
||||||
|
{
|
||||||
|
this->manipulatedBy = NULL;
|
||||||
|
}
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
namespace GameLogic
|
namespace GameLogic
|
||||||
{
|
{
|
||||||
|
class Player;
|
||||||
class DynamicObject : public Object
|
class DynamicObject : public Object
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -28,9 +29,22 @@ namespace GameLogic
|
||||||
void Inactivate();
|
void Inactivate();
|
||||||
void Activate();
|
void Activate();
|
||||||
|
|
||||||
|
void SetAffectedBy(GameLogic::Player &player);
|
||||||
|
void SetManipulatingPlayer(GameLogic::Player &player);
|
||||||
|
void RemoveAffectedBy();
|
||||||
|
void RemoveManipulation();
|
||||||
|
GameLogic::Player* getAffectingPlayer();
|
||||||
|
GameLogic::Player* getManipulatingPlayer();
|
||||||
|
|
||||||
|
static void DynamicObject::DynamicDefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool isActive;
|
bool isActive;
|
||||||
bool isReleased;
|
bool isReleased;
|
||||||
|
protected:
|
||||||
|
GameLogic::Player *affectedBy;
|
||||||
|
GameLogic::Player *manipulatedBy;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,9 @@ Game::Game(void)
|
||||||
: initiated(false)
|
: initiated(false)
|
||||||
, onMoveFnc(0)
|
, onMoveFnc(0)
|
||||||
, onDisableFnc(0)
|
, onDisableFnc(0)
|
||||||
|
, onDamageTakenFnc(0)
|
||||||
|
, onRespawnFnc(0)
|
||||||
|
, onDeadFnc(0)
|
||||||
, frameTime(1.0f/120.0f)
|
, frameTime(1.0f/120.0f)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@ -105,6 +108,7 @@ Game::PlayerData* Game::CreatePlayer()
|
||||||
this->players[insert] = new PlayerData(freeID, 0); // user constructor with objectID and teamID
|
this->players[insert] = new PlayerData(freeID, 0); // user constructor with objectID and teamID
|
||||||
this->players[insert]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove);
|
this->players[insert]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove);
|
||||||
|
|
||||||
|
this->level->AddPlayerToGame(this->players[insert]);
|
||||||
return this->players[insert];
|
return this->players[insert];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +129,9 @@ void Game::CreateTeam()
|
||||||
|
|
||||||
bool Game::NewFrame()
|
bool Game::NewFrame()
|
||||||
{
|
{
|
||||||
|
// HACK need dynamic delta time
|
||||||
|
this->level->Update(this->frameTime);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < this->players.Size(); i++)
|
for (unsigned int i = 0; i < this->players.Size(); i++)
|
||||||
{
|
{
|
||||||
if(this->players[i] && this->players[i]->player) this->players[i]->player->BeginFrame();
|
if(this->players[i] && this->players[i]->player) this->players[i]->player->BeginFrame();
|
||||||
|
@ -149,16 +156,38 @@ void Game::SetFrameTimeLength( float seconds )
|
||||||
this->frameTime = seconds;
|
this->frameTime = seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::SetSubscription(GameEvent::ObjectMovedFunction functionPointer)
|
void Game::SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer)
|
||||||
{
|
{
|
||||||
this->onMoveFnc = functionPointer;
|
this->onMoveFnc = functionPointer;
|
||||||
}
|
}
|
||||||
void Game::SetSubscription(GameEvent::ObjectDisabledFunction functionPointer)
|
void Game::SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer)
|
||||||
{
|
{
|
||||||
this->onDisableFnc = functionPointer;
|
this->onDisableFnc = functionPointer;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
void Game::SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onEnableFnc = functionPointer;
|
||||||
|
}
|
||||||
|
void Game::SetHpSubscription(GameEvent::ObjectHpFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onDamageTakenFnc = functionPointer;
|
||||||
|
}
|
||||||
|
void Game::SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onRespawnFnc = functionPointer;
|
||||||
|
}
|
||||||
|
void Game::SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onDeadFnc = functionPointer;
|
||||||
|
}
|
||||||
|
void Game::SetActionSubscription(GameEvent::AnimationEventFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onPlayerActionEventFnc = functionPointer;
|
||||||
|
}
|
||||||
|
void Game::SetPickupSubscription(GameEvent::PickupEventFunction functionPointer)
|
||||||
|
{
|
||||||
|
this->onPickupEventFnc = functionPointer;
|
||||||
|
}
|
||||||
bool Game::Initiate()
|
bool Game::Initiate()
|
||||||
{
|
{
|
||||||
API::Instance().Init();
|
API::Instance().Init();
|
||||||
|
@ -186,6 +215,5 @@ void Game::PhysicsOnMove(const ICustomBody *object)
|
||||||
}
|
}
|
||||||
void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<ICustomBody> proto)
|
void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<ICustomBody> proto)
|
||||||
{
|
{
|
||||||
if(gameInstance.onDisableFnc) gameInstance.onDisableFnc(0, 0);
|
if(gameInstance.onDisableFnc) gameInstance.onDisableFnc(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace GameLogic
|
||||||
ObjectSpecialType GetObjectType() const override;
|
ObjectSpecialType GetObjectType() const override;
|
||||||
void Inactivate() override;
|
void Inactivate() override;
|
||||||
void Release() override;
|
void Release() override;
|
||||||
|
Player* GetPlayer();
|
||||||
Player *player;
|
Player *player;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -63,7 +63,8 @@ namespace GameLogic
|
||||||
int getNrOfDynamicObj()const override;
|
int getNrOfDynamicObj()const override;
|
||||||
IObjectData* GetObjectAt(int ID) const override;
|
IObjectData* GetObjectAt(int ID) const override;
|
||||||
void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& mem) const override;
|
void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& mem) const override;
|
||||||
|
void Update(float deltaTime);
|
||||||
|
void AddPlayerToGame(IPlayerData *player);
|
||||||
Level *level;
|
Level *level;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -78,22 +79,35 @@ namespace GameLogic
|
||||||
bool NewFrame() override;
|
bool NewFrame() override;
|
||||||
void SetFPS( int FPS ) override;
|
void SetFPS( int FPS ) override;
|
||||||
void SetFrameTimeLength( float seconds ) override;
|
void SetFrameTimeLength( float seconds ) override;
|
||||||
void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) override;
|
void SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer) override;
|
||||||
void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) override;
|
void SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer) override;
|
||||||
|
void SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer) override;
|
||||||
|
void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override;
|
||||||
|
void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override;
|
||||||
|
void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override;
|
||||||
|
void SetActionSubscription(GameEvent::AnimationEventFunction functionPointer) override;
|
||||||
|
void SetPickupSubscription(GameEvent::PickupEventFunction functionPointer) override;
|
||||||
bool Initiate() override;
|
bool Initiate() override;
|
||||||
|
|
||||||
float GetFrameTime() const;
|
float GetFrameTime() const;
|
||||||
|
|
||||||
static void PhysicsOnMove(const Oyster::Physics::ICustomBody *object);
|
static void PhysicsOnMove(const Oyster::Physics::ICustomBody *object);
|
||||||
static void PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<Oyster::Physics::ICustomBody> proto);
|
static void PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<Oyster::Physics::ICustomBody> proto);
|
||||||
|
static void PhysicsOnDead(const Oyster::Physics::ICustomBody *object);
|
||||||
|
|
||||||
Utility::DynamicMemory::DynamicArray<PlayerData*> players;
|
Utility::DynamicMemory::DynamicArray<PlayerData*> players;
|
||||||
LevelData* level;
|
LevelData* level;
|
||||||
float frameTime;
|
float frameTime;
|
||||||
bool initiated;
|
bool initiated;
|
||||||
GameEvent::ObjectDisabledFunction onDisableFnc;
|
|
||||||
GameEvent::ObjectMovedFunction onMoveFnc;
|
|
||||||
|
|
||||||
|
GameEvent::ObjectMovedFunction onMoveFnc;
|
||||||
|
GameEvent::ObjectDisabledFunction onDisableFnc;
|
||||||
|
GameEvent::ObjectEnabledFunction onEnableFnc;
|
||||||
|
GameEvent::ObjectHpFunction onDamageTakenFnc;
|
||||||
|
GameEvent::ObjectRespawnedFunction onRespawnFnc;
|
||||||
|
GameEvent::ObjectDeadFunction onDeadFnc;
|
||||||
|
GameEvent::AnimationEventFunction onPlayerActionEventFnc;
|
||||||
|
GameEvent::PickupEventFunction onPickupEventFnc;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,13 @@ namespace GameLogic
|
||||||
namespace GameEvent
|
namespace GameEvent
|
||||||
{
|
{
|
||||||
typedef void(*ObjectMovedFunction)(IObjectData* object); // Callback method that recieves and object
|
typedef void(*ObjectMovedFunction)(IObjectData* object); // Callback method that recieves and object
|
||||||
typedef void(*ObjectDisabledFunction)(IObjectData* object, float seconds); // Callback method that recieves and object
|
typedef void(*ObjectDisabledFunction)(IObjectData* object); // Callback method that recieves and object
|
||||||
|
typedef void(*ObjectEnabledFunction)(IObjectData* object); // Callback method that recieves and object
|
||||||
|
typedef void(*ObjectHpFunction)(IObjectData* object, float hp); // Callback method that sends obj HP
|
||||||
|
typedef void(*ObjectRespawnedFunction)(IObjectData* object, Oyster::Math::Float3 spawnPos ); // Callback method that sends spawnPos
|
||||||
|
typedef void(*ObjectDeadFunction)(IObjectData* victim, IObjectData* killer, float seconds); // Callback method that sends killer and death timer
|
||||||
|
typedef void(*PickupEventFunction)(IObjectData* player, int pickupEffectID ); // Callback method that sends killer and death timer
|
||||||
|
typedef void(*AnimationEventFunction)(IObjectData* player, int actionID ); // Callback method that sends killer and death timer
|
||||||
//etc...
|
//etc...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -114,8 +120,10 @@ namespace GameLogic
|
||||||
class ILevelData :public IObjectData
|
class ILevelData :public IObjectData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual void Update(float deltaTime) = 0;
|
||||||
virtual int getNrOfDynamicObj()const = 0;
|
virtual int getNrOfDynamicObj()const = 0;
|
||||||
virtual IObjectData* GetObjectAt(int ID) const = 0;
|
virtual IObjectData* GetObjectAt(int ID) const = 0;
|
||||||
|
virtual void AddPlayerToGame(IPlayerData *player) = 0;
|
||||||
virtual void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& destMem) const = 0;
|
virtual void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& destMem) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -172,12 +180,14 @@ namespace GameLogic
|
||||||
/** Set a specific object event subscription callback
|
/** Set a specific object event subscription callback
|
||||||
* @param
|
* @param
|
||||||
*/
|
*/
|
||||||
virtual void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) = 0;
|
virtual void SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer) = 0;
|
||||||
|
virtual void SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer) = 0;
|
||||||
/** Set a specific object event subscription callback
|
virtual void SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer) = 0;
|
||||||
* @param
|
virtual void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) = 0;
|
||||||
*/
|
virtual void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) = 0;
|
||||||
virtual void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) = 0;
|
virtual void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) = 0;
|
||||||
|
virtual void SetActionSubscription(GameEvent::AnimationEventFunction functionPointer) = 0;
|
||||||
|
virtual void SetPickupSubscription(GameEvent::PickupEventFunction functionPointer) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
#define GAMELOGICSTATES_H
|
#define GAMELOGICSTATES_H
|
||||||
#include "OysterMath.h"
|
#include "OysterMath.h"
|
||||||
|
|
||||||
|
|
||||||
namespace GameLogic
|
namespace GameLogic
|
||||||
{
|
{
|
||||||
|
class Player;
|
||||||
enum PLAYER_MOVEMENT
|
enum PLAYER_MOVEMENT
|
||||||
{
|
{
|
||||||
PLAYER_MOVEMENT_FORWARD = 0,
|
PLAYER_MOVEMENT_FORWARD = 0,
|
||||||
|
@ -18,7 +20,8 @@ namespace GameLogic
|
||||||
PLAYER_STATE_WALKING = 1,
|
PLAYER_STATE_WALKING = 1,
|
||||||
PLAYER_STATE_IDLE = 2,
|
PLAYER_STATE_IDLE = 2,
|
||||||
PLAYER_STATE_DEAD = 4,
|
PLAYER_STATE_DEAD = 4,
|
||||||
PLAYER_STATE_INVALID = 8,
|
PLAYER_STATE_DIED = 8,
|
||||||
|
PLAYER_STATE_INVALID = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum WEAPON_FIRE
|
enum WEAPON_FIRE
|
||||||
|
@ -41,6 +44,7 @@ namespace GameLogic
|
||||||
struct forcePushData
|
struct forcePushData
|
||||||
{
|
{
|
||||||
Oyster::Math::Float3 pushForce;
|
Oyster::Math::Float3 pushForce;
|
||||||
|
Player *p;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,9 +54,17 @@ IObjectData* Game::LevelData::GetObjectAt(int ID) const
|
||||||
|
|
||||||
void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& mem) const
|
void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray<IObjectData*>& mem) const
|
||||||
{
|
{
|
||||||
mem.Resize(level->dynamicObjects.Size());
|
mem.Resize(level->GetDynamicObject().Size());
|
||||||
for(int i = 0; i < (int)level->dynamicObjects.Size(); i++)
|
for(int i = 0; i < (int)level->GetDynamicObject().Size(); i++)
|
||||||
{
|
{
|
||||||
mem[i] = level->dynamicObjects[i];
|
mem[i] = level->GetDynamicObject()[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void Game::LevelData::Update(float deltaTime)
|
||||||
|
{
|
||||||
|
this->level->Update(deltaTime);
|
||||||
|
}
|
||||||
|
void Game::LevelData::AddPlayerToGame(IPlayerData *player)
|
||||||
|
{
|
||||||
|
this->level->AddPlayerToGame(((PlayerData*)player)->GetPlayer());
|
||||||
|
}
|
|
@ -102,3 +102,7 @@ void Game::PlayerData::Release()
|
||||||
{
|
{
|
||||||
this->player->ReleaseDynamicObject();
|
this->player->ReleaseDynamicObject();
|
||||||
}
|
}
|
||||||
|
Player* Game::PlayerData::GetPlayer()
|
||||||
|
{
|
||||||
|
return this->player;
|
||||||
|
}
|
|
@ -12,7 +12,7 @@
|
||||||
using namespace GameLogic;
|
using namespace GameLogic;
|
||||||
using namespace Utility::DynamicMemory;
|
using namespace Utility::DynamicMemory;
|
||||||
using namespace Oyster::Physics;
|
using namespace Oyster::Physics;
|
||||||
|
using namespace Oyster::Math;
|
||||||
|
|
||||||
Level::Level(void)
|
Level::Level(void)
|
||||||
{
|
{
|
||||||
|
@ -59,17 +59,17 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_Stone:
|
case ObjectSpecialType_Stone:
|
||||||
{
|
{
|
||||||
gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_StandardBox:
|
case ObjectSpecialType_StandardBox:
|
||||||
{
|
{
|
||||||
gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_RedExplosiveBox:
|
case ObjectSpecialType_RedExplosiveBox:
|
||||||
{
|
{
|
||||||
Oyster::Math::Float dmg = 50;
|
Oyster::Math::Float dmg = 120;
|
||||||
Oyster::Math::Float force = 500;
|
Oyster::Math::Float force = 500;
|
||||||
Oyster::Math::Float radie = 3;
|
Oyster::Math::Float radie = 3;
|
||||||
gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie);
|
gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie);
|
||||||
|
@ -81,12 +81,12 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
|
||||||
// break;
|
// break;
|
||||||
case ObjectSpecialType_SpikeBox:
|
case ObjectSpecialType_SpikeBox:
|
||||||
{
|
{
|
||||||
gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_Spike:
|
case ObjectSpecialType_Spike:
|
||||||
{
|
{
|
||||||
gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_CrystalFormation:
|
case ObjectSpecialType_CrystalFormation:
|
||||||
|
@ -98,7 +98,7 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody)
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_CrystalShard:
|
case ObjectSpecialType_CrystalShard:
|
||||||
{
|
{
|
||||||
gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ObjectSpecialType_JumpPad:
|
case ObjectSpecialType_JumpPad:
|
||||||
|
@ -393,7 +393,20 @@ void Level::AddPlayerToTeam(Player *player, int teamID)
|
||||||
{
|
{
|
||||||
this->teamManager.AddPlayerToTeam(player,teamID);
|
this->teamManager.AddPlayerToTeam(player,teamID);
|
||||||
}
|
}
|
||||||
|
void Level::AddPlayerToGame(Player *player)
|
||||||
|
{
|
||||||
|
this->playerObjects.Push(player);
|
||||||
|
}
|
||||||
|
void Level::RemovePlayerFromGame(Player *player)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < (int)this->playerObjects.Size(); i++)
|
||||||
|
{
|
||||||
|
if ((Player*)this->playerObjects[i] == player)
|
||||||
|
{
|
||||||
|
//this->playerObjects[i].
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
void Level::CreateTeam(int teamSize)
|
void Level::CreateTeam(int teamSize)
|
||||||
{
|
{
|
||||||
this->teamManager.CreateTeam(teamSize);
|
this->teamManager.CreateTeam(teamSize);
|
||||||
|
@ -401,9 +414,34 @@ void Level::CreateTeam(int teamSize)
|
||||||
|
|
||||||
void Level::RespawnPlayer(Player *player)
|
void Level::RespawnPlayer(Player *player)
|
||||||
{
|
{
|
||||||
this->teamManager.RespawnPlayerRandom(player);
|
//this->teamManager.RespawnPlayerRandom(player);
|
||||||
|
|
||||||
|
Float3 spawnPoint = spawnPoints[0];
|
||||||
|
player->Respawn(spawnPoint);
|
||||||
|
}
|
||||||
|
void Level::Update(float deltaTime)
|
||||||
|
{
|
||||||
|
// update lvl-things
|
||||||
|
for(int i = 0; i < (int)this->playerObjects.Size(); i++)
|
||||||
|
{
|
||||||
|
if (this->playerObjects[i]->GetState() == PLAYER_STATE::PLAYER_STATE_DEAD)
|
||||||
|
{
|
||||||
|
// true when timer reaches 0
|
||||||
|
if(this->playerObjects[i]->deathTimerTick(deltaTime))
|
||||||
|
RespawnPlayer(this->playerObjects[i]);
|
||||||
|
}
|
||||||
|
else if (this->playerObjects[i]->GetState() == PLAYER_STATE::PLAYER_STATE_DIED)
|
||||||
|
{
|
||||||
|
this->playerObjects[i]->setDeathTimer(DEATH_TIMER);
|
||||||
|
// HACK to avoid crasch. affected by tag is NULL
|
||||||
|
Player* killer = this->playerObjects[i]->getAffectingPlayer();
|
||||||
|
((Game*)&Game::Instance())->onDeadFnc(this->playerObjects[i], this->playerObjects[i], DEATH_TIMER); // add killer ID
|
||||||
|
//((Game*)&Game::Instance())->onDeadFnc(this->playerObjects[i], this->playerObjects[i]->getAffectingPlayer(), DEATH_TIMER); // add killer ID
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
int Level::getNrOfDynamicObj()
|
int Level::getNrOfDynamicObj()
|
||||||
{
|
{
|
||||||
return this->dynamicObjects.Size();
|
return this->dynamicObjects.Size();
|
||||||
|
@ -417,10 +455,23 @@ Object* Level::GetObj( int ID) const
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level::PhysicsOnMoveLevel(const ICustomBody *object)
|
void Level::PhysicsOnMoveLevel(const ICustomBody *object)
|
||||||
{
|
{
|
||||||
// function call from physics update when object was moved
|
// function call from physics update when object was moved
|
||||||
Object* temp = (Object*)object->GetCustomTag();
|
Object* temp = (Object*)object->GetCustomTag();
|
||||||
((Game*)&Game::Instance())->onMoveFnc(temp);
|
((Game*)&Game::Instance())->onMoveFnc(temp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<Player>> Level::GetPlayers()
|
||||||
|
{
|
||||||
|
return this->playerObjects;
|
||||||
|
}
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<StaticObject>> Level::GetStaticObjects()
|
||||||
|
{
|
||||||
|
return this->staticObjects;
|
||||||
|
}
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<DynamicObject>> Level::GetDynamicObject()
|
||||||
|
{
|
||||||
|
return this->dynamicObjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "DynamicArray.h"
|
#include "DynamicArray.h"
|
||||||
#include "LevelLoader.h"
|
#include "LevelLoader.h"
|
||||||
|
|
||||||
|
const int DEATH_TIMER = 5;
|
||||||
namespace GameLogic
|
namespace GameLogic
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -48,7 +49,8 @@ namespace GameLogic
|
||||||
* @param teamID: ArrayPos of the team you want to add the player to
|
* @param teamID: ArrayPos of the team you want to add the player to
|
||||||
********************************************************/
|
********************************************************/
|
||||||
void AddPlayerToTeam(Player *player, int teamID);
|
void AddPlayerToTeam(Player *player, int teamID);
|
||||||
|
void AddPlayerToGame(Player *player);
|
||||||
|
void RemovePlayerFromGame(Player *player);
|
||||||
|
|
||||||
/********************************************************
|
/********************************************************
|
||||||
* Respawns a player on a random teammate
|
* Respawns a player on a random teammate
|
||||||
|
@ -64,12 +66,21 @@ namespace GameLogic
|
||||||
********************************************************/
|
********************************************************/
|
||||||
static Oyster::Physics::ICustomBody::SubscriptMessage LevelCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss);
|
static Oyster::Physics::ICustomBody::SubscriptMessage LevelCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss);
|
||||||
|
|
||||||
|
void Update(float deltaTime);
|
||||||
|
|
||||||
int getNrOfDynamicObj();
|
int getNrOfDynamicObj();
|
||||||
Object* GetObj( int ID ) const;
|
Object* GetObj( int ID ) const;
|
||||||
|
|
||||||
|
static void PlayerDied( Player* player );
|
||||||
static void PhysicsOnMoveLevel(const Oyster::Physics::ICustomBody *object);
|
static void PhysicsOnMoveLevel(const Oyster::Physics::ICustomBody *object);
|
||||||
|
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<Player>> GetPlayers();
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<StaticObject>> GetStaticObjects();
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<DynamicObject>> GetDynamicObject();
|
||||||
|
|
||||||
//private:
|
private:
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<Player>> playerObjects;
|
||||||
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<Player>> deadPlayerObjects;
|
||||||
TeamManager teamManager;
|
TeamManager teamManager;
|
||||||
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<StaticObject>> staticObjects;
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<StaticObject>> staticObjects;
|
||||||
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<DynamicObject>> dynamicObjects;
|
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<DynamicObject>> dynamicObjects;
|
||||||
|
|
|
@ -11,56 +11,28 @@ const float KEY_TIMER = 0.03f;
|
||||||
Player::Player()
|
Player::Player()
|
||||||
:DynamicObject()
|
:DynamicObject()
|
||||||
{
|
{
|
||||||
|
Player::initPlayerData();
|
||||||
|
AffectedObjects.Reserve(15);
|
||||||
|
this->weapon = NULL;
|
||||||
|
this->teamID = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*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, void (*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)
|
||||||
{
|
{
|
||||||
weapon = new Weapon(2,this);
|
this->weapon = new Weapon(2,this);
|
||||||
|
Player::initPlayerData();
|
||||||
this->life = 100;
|
AffectedObjects.Reserve(15);
|
||||||
this->teamID = teamID;
|
this->teamID = teamID;
|
||||||
this->playerState = PLAYER_STATE_IDLE;
|
|
||||||
this->lookDir = Oyster::Math::Float3(0,0,-1);
|
|
||||||
key_forward = 0;
|
|
||||||
key_backward = 0;
|
|
||||||
key_strafeRight = 0;
|
|
||||||
key_strafeLeft = 0;
|
|
||||||
key_jump = 0;
|
|
||||||
invincibleCooldown = 0;
|
|
||||||
|
|
||||||
this->previousPosition = Oyster::Math::Float3(0,0,0);
|
|
||||||
|
|
||||||
this->moveDir = Oyster::Math::Float3(0,0,0);
|
|
||||||
this->moveSpeed = 100;
|
|
||||||
this->previousMoveSpeed = Oyster::Math::Float3(0,0,0);
|
|
||||||
|
|
||||||
this->rotationUp = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
weapon = new Weapon(2,this);
|
this->weapon = new Weapon(2,this);
|
||||||
|
Player::initPlayerData();
|
||||||
this->life = 100;
|
AffectedObjects.Reserve(15);
|
||||||
this->teamID = teamID;
|
this->teamID = teamID;
|
||||||
this->playerState = PLAYER_STATE_IDLE;
|
|
||||||
this->lookDir = Oyster::Math::Float3(0,0,-1);
|
|
||||||
key_forward = 0;
|
|
||||||
key_backward = 0;
|
|
||||||
key_strafeRight = 0;
|
|
||||||
key_strafeLeft = 0;
|
|
||||||
key_jump = 0;
|
|
||||||
invincibleCooldown = 0;
|
|
||||||
|
|
||||||
this->previousPosition = Oyster::Math::Float3(0,0,0);
|
|
||||||
this->moveDir = Oyster::Math::Float3(0,0,0);
|
|
||||||
this->moveSpeed = 20;
|
|
||||||
this->previousMoveSpeed = Oyster::Math::Float3(0,0,0);
|
|
||||||
|
|
||||||
this->rotationUp = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::~Player(void)
|
Player::~Player(void)
|
||||||
|
@ -71,11 +43,31 @@ Player::~Player(void)
|
||||||
weapon = NULL;
|
weapon = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void Player::initPlayerData()
|
||||||
|
{
|
||||||
|
this->playerStats.hp = MAX_HP;
|
||||||
|
this->playerStats.movementSpeed = BASIC_SPEED;
|
||||||
|
this->playerScore.killScore = 0;
|
||||||
|
this->playerScore.deathScore = 0;
|
||||||
|
this->playerState = PLAYER_STATE_IDLE;
|
||||||
|
this->lookDir = Oyster::Math::Float3(0,0,-1);
|
||||||
|
|
||||||
|
this->key_forward = 0;
|
||||||
|
this->key_backward = 0;
|
||||||
|
this->key_strafeRight = 0;
|
||||||
|
this->key_strafeLeft = 0;
|
||||||
|
this->key_jump = 0;
|
||||||
|
this->invincibleCooldown = 0;
|
||||||
|
this->deathTimer = 0;
|
||||||
|
|
||||||
|
this->rotationUp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Player::BeginFrame()
|
void Player::BeginFrame()
|
||||||
|
{
|
||||||
|
if( this->playerState != PLAYER_STATE_DEAD && PLAYER_STATE_DIED)
|
||||||
{
|
{
|
||||||
weapon->Update(0.002f);
|
weapon->Update(0.002f);
|
||||||
//Object::BeginFrame();
|
|
||||||
|
|
||||||
Oyster::Math::Float maxSpeed = 30;
|
Oyster::Math::Float maxSpeed = 30;
|
||||||
|
|
||||||
|
@ -108,7 +100,7 @@ void Player::BeginFrame()
|
||||||
|
|
||||||
// Walking data
|
// Walking data
|
||||||
Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0);
|
Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0);
|
||||||
Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f;
|
Oyster::Math::Float walkSpeed = this->playerStats.movementSpeed*0.2f;
|
||||||
|
|
||||||
// Check for input
|
// Check for input
|
||||||
if(key_forward > 0.001)
|
if(key_forward > 0.001)
|
||||||
|
@ -194,18 +186,21 @@ void Player::BeginFrame()
|
||||||
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//this->weapon->Update(0.01f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::EndFrame()
|
void Player::EndFrame()
|
||||||
{
|
{
|
||||||
|
//check if there are any objects that can be removed from the AffectedObjects list
|
||||||
|
for(int i = 0; i < this->AffectedObjects.Size(); i++)
|
||||||
|
{
|
||||||
|
if(this->AffectedObjects[i] && (this->AffectedObjects[i]->GetRigidBody()->GetState().previousVelocity).GetMagnitude() <= 0.1f)
|
||||||
|
{
|
||||||
|
this->AffectedObjects[i]->RemoveAffectedBy();
|
||||||
|
this->AffectedObjects.Remove(i);
|
||||||
|
}
|
||||||
|
|
||||||
//Object::EndFrame();
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Move(const PLAYER_MOVEMENT &movement)
|
void Player::Move(const PLAYER_MOVEMENT &movement)
|
||||||
|
@ -258,10 +253,13 @@ void Player::UseWeapon(const WEAPON_FIRE &usage)
|
||||||
|
|
||||||
void Player::Respawn(Oyster::Math::Float3 spawnPoint)
|
void Player::Respawn(Oyster::Math::Float3 spawnPoint)
|
||||||
{
|
{
|
||||||
this->life = 100;
|
if( this->playerState == PLAYER_STATE_DEAD)
|
||||||
this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE;
|
{
|
||||||
this->lookDir = Oyster::Math::Float4(1,0,0);
|
Player::initPlayerData();
|
||||||
this->rigidBody->SetPosition(spawnPoint);
|
this->rigidBody->SetPosition(spawnPoint);
|
||||||
|
this->gameInstance->onRespawnFnc( this, spawnPoint);
|
||||||
|
this->gameInstance->onDamageTakenFnc( this, this->playerStats.hp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::SetLookDir(const Oyster::Math3D::Float3& lookDir)
|
void Player::SetLookDir(const Oyster::Math3D::Float3& lookDir)
|
||||||
|
@ -321,13 +319,43 @@ PLAYER_STATE Player::GetState() const
|
||||||
|
|
||||||
void Player::DamageLife(int damage)
|
void Player::DamageLife(int damage)
|
||||||
{
|
{
|
||||||
this->life -= damage;
|
this->playerStats.hp -= damage;
|
||||||
this->life = 0;
|
// send hp to client
|
||||||
|
this->gameInstance->onDamageTakenFnc( this, this->playerStats.hp);
|
||||||
|
|
||||||
if(this->life <= 0)
|
if(this->playerStats.hp <= 0)
|
||||||
{
|
{
|
||||||
this->life = 0;
|
this->playerStats.hp = 0;
|
||||||
playerState = PLAYER_STATE_DEAD;
|
this->playerState = PLAYER_STATE_DIED;
|
||||||
this->gameInstance->onDisableFnc(this, 0.0f);
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Player::AddAffectedObject(DynamicObject &AffectedObject)
|
||||||
|
{
|
||||||
|
//check if object already exists in the list, if so then do not add
|
||||||
|
for(int i = 0; i < AffectedObjects.Size(); i++)
|
||||||
|
{
|
||||||
|
if(AffectedObjects[i]->GetID() == AffectedObject.GetID())
|
||||||
|
{
|
||||||
|
//object already exists, exit function
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//else you add the object to the stack
|
||||||
|
AffectedObjects.Push(&AffectedObject);
|
||||||
|
}
|
||||||
|
bool Player::deathTimerTick(float dt)
|
||||||
|
{
|
||||||
|
this->deathTimer -= dt;
|
||||||
|
if( this->deathTimer <= 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void Player::setDeathTimer(float deathTimer)
|
||||||
|
{
|
||||||
|
this->deathTimer = deathTimer;
|
||||||
|
this->playerState = PLAYER_STATE_DEAD;
|
||||||
|
}
|
||||||
|
|
|
@ -7,7 +7,10 @@
|
||||||
#include "GameLogicStates.h"
|
#include "GameLogicStates.h"
|
||||||
#include "OysterMath.h"
|
#include "OysterMath.h"
|
||||||
#include "DynamicObject.h"
|
#include "DynamicObject.h"
|
||||||
|
#include "DynamicArray.h"
|
||||||
|
|
||||||
|
const float MAX_HP = 100.0f;
|
||||||
|
const float BASIC_SPEED = 30.0f;
|
||||||
|
|
||||||
namespace GameLogic
|
namespace GameLogic
|
||||||
{
|
{
|
||||||
|
@ -15,6 +18,21 @@ namespace GameLogic
|
||||||
class Player : public DynamicObject
|
class Player : public DynamicObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
struct PlayerStats
|
||||||
|
{
|
||||||
|
Oyster::Math::Float hp;
|
||||||
|
Oyster::Math::Float movementSpeed;
|
||||||
|
//Oyster::Math::Float resistance;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PlayerScore
|
||||||
|
{
|
||||||
|
int killScore;
|
||||||
|
int deathScore;
|
||||||
|
// int assistScore;
|
||||||
|
// int suicideScore;
|
||||||
|
};
|
||||||
|
|
||||||
Player(void);
|
Player(void);
|
||||||
|
|
||||||
Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID);
|
Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID);
|
||||||
|
@ -50,6 +68,8 @@ namespace GameLogic
|
||||||
|
|
||||||
void TurnLeft(Oyster::Math3D::Float deltaRadians);
|
void TurnLeft(Oyster::Math3D::Float deltaRadians);
|
||||||
|
|
||||||
|
void AddAffectedObject(DynamicObject &AffectedObject);
|
||||||
|
|
||||||
/********************************************************
|
/********************************************************
|
||||||
* Collision function for player, this is to be sent to physics through the subscribe function with the rigidbody
|
* Collision function for player, this is to be sent to physics through the subscribe function with the rigidbody
|
||||||
* Will be called when the physics detect a collision
|
* Will be called when the physics detect a collision
|
||||||
|
@ -72,6 +92,8 @@ namespace GameLogic
|
||||||
PLAYER_STATE GetState() const;
|
PLAYER_STATE GetState() const;
|
||||||
|
|
||||||
void DamageLife(int damage);
|
void DamageLife(int damage);
|
||||||
|
void setDeathTimer(float deathTimer);
|
||||||
|
bool deathTimerTick(float dt);
|
||||||
|
|
||||||
void BeginFrame();
|
void BeginFrame();
|
||||||
void EndFrame();
|
void EndFrame();
|
||||||
|
@ -79,9 +101,11 @@ namespace GameLogic
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Jump();
|
void Jump();
|
||||||
|
void initPlayerData();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Oyster::Math::Float life;
|
|
||||||
|
Utility::DynamicMemory::DynamicArray<DynamicObject*> AffectedObjects;
|
||||||
int teamID;
|
int teamID;
|
||||||
Weapon *weapon;
|
Weapon *weapon;
|
||||||
PLAYER_STATE playerState;
|
PLAYER_STATE playerState;
|
||||||
|
@ -93,16 +117,15 @@ namespace GameLogic
|
||||||
float key_jump;
|
float key_jump;
|
||||||
|
|
||||||
|
|
||||||
Oyster::Math::Float3 previousPosition;
|
|
||||||
Oyster::Math::Float3 moveDir;
|
|
||||||
Oyster::Math::Float moveSpeed;
|
|
||||||
Oyster::Math::Float3 previousMoveSpeed;
|
|
||||||
|
|
||||||
Oyster::Math::Float rotationUp;
|
Oyster::Math::Float rotationUp;
|
||||||
|
|
||||||
|
float deathTimer;
|
||||||
|
|
||||||
bool hasTakenDamage;
|
bool hasTakenDamage;
|
||||||
float invincibleCooldown;
|
float invincibleCooldown;
|
||||||
|
PlayerStats playerStats;
|
||||||
|
PlayerScore playerScore;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -75,13 +75,15 @@ namespace GameLogic
|
||||||
}
|
}
|
||||||
Protocol_ObjectDamage(Oyster::Network::CustomNetProtocol& p)
|
Protocol_ObjectDamage(Oyster::Network::CustomNetProtocol& p)
|
||||||
{
|
{
|
||||||
|
this->object_ID = p[1].value.netInt;
|
||||||
|
this->healthLost = p[2].value.netFloat;
|
||||||
}
|
}
|
||||||
Protocol_ObjectDamage(int id, float hp)
|
Protocol_ObjectDamage(int id, float hp)
|
||||||
{
|
{
|
||||||
this->protocol[0].value = protocol_Gameplay_ObjectDamage;
|
this->protocol[0].value = protocol_Gameplay_ObjectDamage;
|
||||||
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
||||||
|
|
||||||
|
this->protocol[1].type = Oyster::Network::NetAttributeType_Int;
|
||||||
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
||||||
|
|
||||||
object_ID = id;
|
object_ID = id;
|
||||||
|
@ -866,6 +868,7 @@ namespace GameLogic
|
||||||
struct Protocol_ObjectDie :public Oyster::Network::CustomProtocolObject
|
struct Protocol_ObjectDie :public Oyster::Network::CustomProtocolObject
|
||||||
{
|
{
|
||||||
int objectID;
|
int objectID;
|
||||||
|
int killerID;
|
||||||
float seconds;
|
float seconds;
|
||||||
|
|
||||||
Protocol_ObjectDie()
|
Protocol_ObjectDie()
|
||||||
|
@ -873,28 +876,34 @@ namespace GameLogic
|
||||||
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
||||||
this->protocol[0].value.netShort = protocol_Gameplay_ObjectDie;
|
this->protocol[0].value.netShort = protocol_Gameplay_ObjectDie;
|
||||||
this->protocol[1].type = Oyster::Network::NetAttributeType_Int;
|
this->protocol[1].type = Oyster::Network::NetAttributeType_Int;
|
||||||
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
this->protocol[2].type = Oyster::Network::NetAttributeType_Int;
|
||||||
this->objectID = 0;
|
this->protocol[3].type = Oyster::Network::NetAttributeType_Float;
|
||||||
|
this->objectID = -1;
|
||||||
|
this->killerID = -1;
|
||||||
this->seconds = 0.0f;
|
this->seconds = 0.0f;
|
||||||
}
|
}
|
||||||
Protocol_ObjectDie(int objectID, float seconds)
|
Protocol_ObjectDie(int objectID, int killerID, float seconds)
|
||||||
{
|
{
|
||||||
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
||||||
this->protocol[0].value.netShort = protocol_Gameplay_ObjectDie;
|
this->protocol[0].value.netShort = protocol_Gameplay_ObjectDie;
|
||||||
this->protocol[1].type = Oyster::Network::NetAttributeType_Int;
|
this->protocol[1].type = Oyster::Network::NetAttributeType_Int;
|
||||||
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
this->protocol[2].type = Oyster::Network::NetAttributeType_Int;
|
||||||
|
this->protocol[3].type = Oyster::Network::NetAttributeType_Float;
|
||||||
this->objectID = objectID;
|
this->objectID = objectID;
|
||||||
|
this->killerID = killerID;
|
||||||
this->seconds = seconds;
|
this->seconds = seconds;
|
||||||
}
|
}
|
||||||
Protocol_ObjectDie(Oyster::Network::CustomNetProtocol& p)
|
Protocol_ObjectDie(Oyster::Network::CustomNetProtocol& p)
|
||||||
{
|
{
|
||||||
this->objectID = p[1].value.netInt;
|
this->objectID = p[1].value.netInt;
|
||||||
this->seconds = p[2].value.netFloat;
|
this->killerID = p[2].value.netInt;
|
||||||
|
this->seconds = p[3].value.netFloat;
|
||||||
}
|
}
|
||||||
Oyster::Network::CustomNetProtocol GetProtocol() override
|
Oyster::Network::CustomNetProtocol GetProtocol() override
|
||||||
{
|
{
|
||||||
this->protocol[1].value = this->objectID;
|
this->protocol[1].value = this->objectID;
|
||||||
this->protocol[2].value = this->seconds;
|
this->protocol[2].value = this->killerID;
|
||||||
|
this->protocol[3].value = this->seconds;
|
||||||
return protocol;
|
return protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -935,5 +944,45 @@ namespace GameLogic
|
||||||
Oyster::Network::CustomNetProtocol protocol;
|
Oyster::Network::CustomNetProtocol protocol;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
//#define protocol_Gameplay_ObjectAction 368
|
||||||
|
struct Protocol_ObjectAction :public Oyster::Network::CustomProtocolObject
|
||||||
|
{
|
||||||
|
short objectID;
|
||||||
|
float animationID;
|
||||||
|
|
||||||
|
Protocol_ObjectAction()
|
||||||
|
{
|
||||||
|
this->protocol[0].value = protocol_Gameplay_ObjectAction;
|
||||||
|
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
||||||
|
this->protocol[1].type = Oyster::Network::NetAttributeType_Short;
|
||||||
|
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
||||||
|
|
||||||
|
objectID = 0;
|
||||||
|
animationID = -1;
|
||||||
|
}
|
||||||
|
Protocol_ObjectAction(Oyster::Network::CustomNetProtocol& p)
|
||||||
|
{
|
||||||
|
objectID = p[1].value.netShort;
|
||||||
|
animationID = p[2].value.netFloat;
|
||||||
|
}
|
||||||
|
Protocol_ObjectAction(float animID, int id)
|
||||||
|
{
|
||||||
|
this->protocol[0].value = protocol_Gameplay_ObjectAction;
|
||||||
|
this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
|
||||||
|
this->protocol[1].type = Oyster::Network::NetAttributeType_Short;
|
||||||
|
this->protocol[2].type = Oyster::Network::NetAttributeType_Float;
|
||||||
|
|
||||||
|
objectID = id;
|
||||||
|
animationID = animID;
|
||||||
|
}
|
||||||
|
Oyster::Network::CustomNetProtocol GetProtocol() override
|
||||||
|
{
|
||||||
|
this->protocol[1].value = objectID;
|
||||||
|
this->protocol[2].value = animationID;
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Oyster::Network::CustomNetProtocol protocol;
|
||||||
|
};
|
||||||
#endif // !GAMELOGIC_PLAYER_PROTOCOLS_H
|
#endif // !GAMELOGIC_PLAYER_PROTOCOLS_H
|
|
@ -70,6 +70,7 @@
|
||||||
#define protocol_Gameplay_ObjectRespawn 365
|
#define protocol_Gameplay_ObjectRespawn 365
|
||||||
#define protocol_Gameplay_ObjectDie 366
|
#define protocol_Gameplay_ObjectDie 366
|
||||||
#define protocol_Gameplay_ObjectDisconnectPlayer 367
|
#define protocol_Gameplay_ObjectDisconnectPlayer 367
|
||||||
|
#define protocol_Gameplay_ObjectAction 368
|
||||||
#define protocol_GameplayMAX 399
|
#define protocol_GameplayMAX 399
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -96,10 +96,15 @@ namespace DanBias
|
||||||
void General_Status ( GameLogic::Protocol_General_Status& p, DanBias::GameClient* c );
|
void General_Status ( GameLogic::Protocol_General_Status& p, DanBias::GameClient* c );
|
||||||
void General_Text ( GameLogic::Protocol_General_Text& p, DanBias::GameClient* c );
|
void General_Text ( GameLogic::Protocol_General_Text& p, DanBias::GameClient* c );
|
||||||
|
|
||||||
//Callback method recieving from gamelogic
|
//Callback method receiving from game logic
|
||||||
static void ObjectMove ( GameLogic::IObjectData* movedObject );
|
static void ObjectMove ( GameLogic::IObjectData* movedObject );
|
||||||
static void ObjectDisabled ( GameLogic::IObjectData* movedObject, float seconds );
|
static void ObjectDisabled ( GameLogic::IObjectData* movedObject );
|
||||||
|
static void ObjectEnabled ( GameLogic::IObjectData* movedObject );
|
||||||
|
static void ObjectDamaged ( GameLogic::IObjectData* movedObject, float hp );
|
||||||
|
static void ObjectRespawned ( GameLogic::IObjectData* movedObject, Oyster::Math::Float3 spawnPos );
|
||||||
|
static void ObjectDead ( GameLogic::IObjectData* victim, GameLogic::IObjectData* killer, float seconds );
|
||||||
|
static void PickupEvent ( GameLogic::IObjectData* movedObject, int pickupEffectID );
|
||||||
|
static void ActionEvent ( GameLogic::IObjectData* movedObject , int actionID );
|
||||||
//Private member variables
|
//Private member variables
|
||||||
private:
|
private:
|
||||||
Utility::DynamicMemory::DynamicArray<gClient> gClients;
|
Utility::DynamicMemory::DynamicArray<gClient> gClients;
|
||||||
|
|
|
@ -29,10 +29,10 @@ using namespace DanBias;
|
||||||
float dt = (float)this->logicTimer.getElapsedSeconds();
|
float dt = (float)this->logicTimer.getElapsedSeconds();
|
||||||
if( dt >= this->logicFrameTime )
|
if( dt >= this->logicFrameTime )
|
||||||
{
|
{
|
||||||
|
this->logicTimer.reset();
|
||||||
|
|
||||||
this->ProcessClients();
|
this->ProcessClients();
|
||||||
this->gameInstance.NewFrame();
|
this->gameInstance.NewFrame();
|
||||||
|
|
||||||
this->logicTimer.reset();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,11 +146,36 @@ using namespace DanBias;
|
||||||
GameSession::gameSession->Send(p.GetProtocol());
|
GameSession::gameSession->Send(p.GetProtocol());
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
void GameSession::ObjectDisabled( GameLogic::IObjectData* movedObject, float seconds )
|
void GameSession::ObjectDisabled( GameLogic::IObjectData* movedObject )
|
||||||
{
|
{
|
||||||
GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID(), seconds).GetProtocol());
|
//GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::ObjectEnabled( GameLogic::IObjectData* movedObject )
|
||||||
|
{
|
||||||
|
//GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::ObjectDamaged( GameLogic::IObjectData* movedObject, float hp )
|
||||||
|
{
|
||||||
|
GameSession::gameSession->Send(Protocol_ObjectDamage(movedObject->GetID(), hp).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::ObjectRespawned( GameLogic::IObjectData* movedObject, Oyster::Math::Float3 spawnPos )
|
||||||
|
{
|
||||||
|
GameSession::gameSession->Send(Protocol_ObjectRespawn(movedObject->GetID(), spawnPos).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::ObjectDead( GameLogic::IObjectData* victim, GameLogic::IObjectData* killer, float seconds )
|
||||||
|
{
|
||||||
|
GameSession::gameSession->Send(Protocol_ObjectDie(victim->GetID(), killer->GetID(), seconds).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::PickupEvent( GameLogic::IObjectData* movedObject, int pickupEffectID )
|
||||||
|
{
|
||||||
|
// send pickup protocol
|
||||||
|
GameSession::gameSession->Send(Protocol_ObjectPickup(movedObject->GetID(), pickupEffectID).GetProtocol());
|
||||||
|
}
|
||||||
|
void GameSession::ActionEvent( GameLogic::IObjectData* movedObject , int actionID )
|
||||||
|
{
|
||||||
|
// send action protocol
|
||||||
|
GameSession::gameSession->Send(Protocol_ObjectAction(movedObject->GetID(), actionID).GetProtocol());
|
||||||
}
|
}
|
||||||
|
|
||||||
//*****************************************************//
|
//*****************************************************//
|
||||||
//****************** Protocol methods *****************//
|
//****************** Protocol methods *****************//
|
||||||
//******************************************************************************************************************//
|
//******************************************************************************************************************//
|
||||||
|
@ -177,7 +202,6 @@ using namespace DanBias;
|
||||||
break;
|
break;
|
||||||
case protocol_Gameplay_PlayerShot: this->Gameplay_PlayerShot ( Protocol_PlayerShot (p), c );
|
case protocol_Gameplay_PlayerShot: this->Gameplay_PlayerShot ( Protocol_PlayerShot (p), c );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case protocol_Gameplay_ObjectPickup: this->Gameplay_ObjectPickup ( Protocol_ObjectPickup (p), c );
|
case protocol_Gameplay_ObjectPickup: this->Gameplay_ObjectPickup ( Protocol_ObjectPickup (p), c );
|
||||||
break;
|
break;
|
||||||
case protocol_Gameplay_ObjectDamage: this->Gameplay_ObjectDamage ( Protocol_ObjectDamage (p), c );
|
case protocol_Gameplay_ObjectDamage: this->Gameplay_ObjectDamage ( Protocol_ObjectDamage (p), c );
|
||||||
|
@ -190,7 +214,6 @@ using namespace DanBias;
|
||||||
break;
|
break;
|
||||||
case protocol_Gameplay_ObjectCreate: this->Gameplay_ObjectCreate ( Protocol_ObjectCreate (p), c );
|
case protocol_Gameplay_ObjectCreate: this->Gameplay_ObjectCreate ( Protocol_ObjectCreate (p), c );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case protocol_General_Status: this->General_Status ( Protocol_General_Status (p), c );
|
case protocol_General_Status: this->General_Status ( Protocol_General_Status (p), c );
|
||||||
break;
|
break;
|
||||||
case protocol_General_Text: this->General_Text ( Protocol_General_Text (p), c );
|
case protocol_General_Text: this->General_Text ( Protocol_General_Text (p), c );
|
||||||
|
@ -231,11 +254,8 @@ using namespace DanBias;
|
||||||
{
|
{
|
||||||
if(p.secondaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_SECONDARY_PRESS);
|
if(p.secondaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_SECONDARY_PRESS);
|
||||||
if(p.primaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS);
|
if(p.primaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS);
|
||||||
|
|
||||||
if(p.utilityPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_UTILLITY_PRESS);
|
if(p.utilityPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_UTILLITY_PRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GameSession::Gameplay_ObjectPickup ( Protocol_ObjectPickup& p, DanBias::GameClient* c )
|
void GameSession::Gameplay_ObjectPickup ( Protocol_ObjectPickup& p, DanBias::GameClient* c )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -106,8 +106,14 @@ bool GameSession::Create(GameDescription& desc, bool forceStart)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set some game instance data options */
|
/* Set some game instance data options */
|
||||||
this->gameInstance.SetSubscription(GameSession::ObjectMove);
|
this->gameInstance.SetMoveSubscription(GameSession::ObjectMove);
|
||||||
this->gameInstance.SetSubscription(GameSession::ObjectDisabled);
|
this->gameInstance.SetDisableSubscription(GameSession::ObjectDisabled);
|
||||||
|
this->gameInstance.SetEnableSubscription(GameSession::ObjectEnabled);
|
||||||
|
this->gameInstance.SetHpSubscription(GameSession::ObjectDamaged);
|
||||||
|
this->gameInstance.SetRespawnSubscription(GameSession::ObjectRespawned);
|
||||||
|
this->gameInstance.SetDeadSubscription(GameSession::ObjectDead);
|
||||||
|
this->gameInstance.SetActionSubscription(GameSession::ActionEvent);
|
||||||
|
this->gameInstance.SetPickupSubscription(GameSession::PickupEvent);
|
||||||
this->gameInstance.SetFPS(60);
|
this->gameInstance.SetFPS(60);
|
||||||
|
|
||||||
this->description.clients.Clear();
|
this->description.clients.Clear();
|
||||||
|
|
|
@ -166,16 +166,17 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
|
||||||
|
|
||||||
case ObjectType_Light:
|
case ObjectType_Light:
|
||||||
{
|
{
|
||||||
LightType lightType;
|
//LightType lightType;
|
||||||
|
|
||||||
//Get Light type
|
//Get Light type
|
||||||
ParseObject(&buffer[counter+4], &lightType, sizeof(lightType));
|
//ParseObject(&buffer[counter+4], &lightType, sizeof(lightType));
|
||||||
|
|
||||||
//We only support PointLight for now.
|
//We only support PointLight for now.
|
||||||
BasicLight* header = new BasicLight;
|
BasicLight* header = new BasicLight;
|
||||||
ParseObject(&buffer[counter], header, sizeof(*header));
|
|
||||||
counter += sizeof(*header);
|
ParseLight(&buffer[counter], *header, counter);
|
||||||
objects.push_back(header);
|
objects.push_back(header);
|
||||||
|
|
||||||
/*switch(lightType)
|
/*switch(lightType)
|
||||||
{
|
{
|
||||||
case LightType_PointLight:
|
case LightType_PointLight:
|
||||||
|
@ -208,6 +209,7 @@ std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::string filen
|
||||||
}
|
}
|
||||||
break;*/
|
break;*/
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
//Couldn't find typeID. FAIL!!!!!!
|
//Couldn't find typeID. FAIL!!!!!!
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -53,6 +53,7 @@ namespace GameLogic
|
||||||
CollisionGeometryType_Box,
|
CollisionGeometryType_Box,
|
||||||
CollisionGeometryType_Sphere,
|
CollisionGeometryType_Sphere,
|
||||||
CollisionGeometryType_Cylinder,
|
CollisionGeometryType_Cylinder,
|
||||||
|
CollisionGeometryType_CG_MESH,
|
||||||
|
|
||||||
CollisionGeometryType_Count,
|
CollisionGeometryType_Count,
|
||||||
CollisionGeometryType_Unknown = -1
|
CollisionGeometryType_Unknown = -1
|
||||||
|
@ -92,6 +93,18 @@ namespace GameLogic
|
||||||
WorldSize_Unknown = -1
|
WorldSize_Unknown = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum PlayerAction
|
||||||
|
{
|
||||||
|
PlayerAction_Jump,
|
||||||
|
PlayerAction_Walk,
|
||||||
|
PlayerAction_Idle,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum PickupType
|
||||||
|
{
|
||||||
|
PickupType_Health,
|
||||||
|
PickupType_SpeedBoost
|
||||||
|
};
|
||||||
|
|
||||||
/************************************
|
/************************************
|
||||||
Structs
|
Structs
|
||||||
|
@ -162,6 +175,11 @@ namespace GameLogic
|
||||||
float radius;
|
float radius;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BoundingVolumeCGMesh : public BoundingVolumeBase
|
||||||
|
{
|
||||||
|
wchar_t filename[128];
|
||||||
|
};
|
||||||
|
|
||||||
struct BoundingVolume
|
struct BoundingVolume
|
||||||
{
|
{
|
||||||
CollisionGeometryType geoType;
|
CollisionGeometryType geoType;
|
||||||
|
@ -170,9 +188,9 @@ namespace GameLogic
|
||||||
LevelLoaderInternal::BoundingVolumeBox box;
|
LevelLoaderInternal::BoundingVolumeBox box;
|
||||||
LevelLoaderInternal::BoundingVolumeSphere sphere;
|
LevelLoaderInternal::BoundingVolumeSphere sphere;
|
||||||
LevelLoaderInternal::BoundingVolumeCylinder cylinder;
|
LevelLoaderInternal::BoundingVolumeCylinder cylinder;
|
||||||
|
LevelLoaderInternal::BoundingVolumeCGMesh cgMesh;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LevelMetaData : public ObjectTypeHeader
|
struct LevelMetaData : public ObjectTypeHeader
|
||||||
|
@ -254,8 +272,10 @@ namespace GameLogic
|
||||||
LightType lightType; //Is not used right now
|
LightType lightType; //Is not used right now
|
||||||
float color[3];
|
float color[3];
|
||||||
float position[3];
|
float position[3];
|
||||||
float raduis;
|
float radius;
|
||||||
float intensity;
|
float intensity;
|
||||||
|
|
||||||
|
virtual ~BasicLight(){}
|
||||||
};
|
};
|
||||||
/* We only support pointlight right now.
|
/* We only support pointlight right now.
|
||||||
struct PointLight : public BasicLight
|
struct PointLight : public BasicLight
|
||||||
|
|
|
@ -20,6 +20,32 @@ namespace GameLogic
|
||||||
memcpy(header, buffer, size);
|
memcpy(header, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParseLight(char* buffer, BasicLight& header, int& size)
|
||||||
|
{
|
||||||
|
int start = 0;
|
||||||
|
memcpy(&header.typeID, &buffer[start], 40);
|
||||||
|
start += 40;
|
||||||
|
/*
|
||||||
|
memcpy(&header.lightType, &buffer[start], 4);
|
||||||
|
start += 4;
|
||||||
|
|
||||||
|
memcpy(&header.color, &buffer[start], 12);
|
||||||
|
start += 12;
|
||||||
|
|
||||||
|
memcpy(&header.position, &buffer[start], 12);
|
||||||
|
start += 12;
|
||||||
|
|
||||||
|
memcpy(&header.radius, &buffer[start], 4);
|
||||||
|
start += 4;
|
||||||
|
|
||||||
|
memcpy(&header.intensity, &buffer[start], 4);
|
||||||
|
start += 4;*/
|
||||||
|
|
||||||
|
size += start;
|
||||||
|
|
||||||
|
//memcpy(&header, buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf)
|
void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf)
|
||||||
{
|
{
|
||||||
char tempName[128];
|
char tempName[128];
|
||||||
|
@ -173,6 +199,22 @@ namespace GameLogic
|
||||||
start += sizeof(volume.cylinder);
|
start += sizeof(volume.cylinder);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CollisionGeometryType_CG_MESH:
|
||||||
|
{
|
||||||
|
memcpy(&volume.cgMesh, &buf[start], sizeof(float)*12);
|
||||||
|
start += sizeof(float)*12;
|
||||||
|
memcpy(&tempSize, &buf[start], sizeof(tempSize));
|
||||||
|
start += 4;
|
||||||
|
memcpy(&tempName, &buf[start], tempSize);
|
||||||
|
tempName[tempSize] = '\0';
|
||||||
|
|
||||||
|
//convert from char[] to wchar_t[]
|
||||||
|
mbstowcs_s(NULL, volume.cgMesh.filename, tempSize+1, tempName, _TRUNCATE);
|
||||||
|
|
||||||
|
start += tempSize;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace GameLogic
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void ParseObject(char* buffer, void *header, int size);
|
void ParseObject(char* buffer, void *header, int size);
|
||||||
|
void ParseLight(char* buffer, BasicLight& header, int& size);
|
||||||
void ParseObject(char* buffer, ObjectHeader& header, int& size , bool loadCgf);
|
void ParseObject(char* buffer, ObjectHeader& header, int& size , bool loadCgf);
|
||||||
void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size);
|
void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size);
|
||||||
void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size);
|
void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size);
|
||||||
|
|
|
@ -376,10 +376,14 @@ namespace LinearAlgebra3D
|
||||||
template<typename ScalarType>
|
template<typename ScalarType>
|
||||||
inline ::LinearAlgebra::Vector3<ScalarType> AngularAxis( const ::LinearAlgebra::Quaternion<ScalarType> &rotation )
|
inline ::LinearAlgebra::Vector3<ScalarType> AngularAxis( const ::LinearAlgebra::Quaternion<ScalarType> &rotation )
|
||||||
{ // see http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
|
{ // see http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
|
||||||
ScalarType angle = ScalarType(2) * (ScalarType)::std::acos( rotation.real ),
|
if( rotation.real < ScalarType(1) )
|
||||||
multiplier = angle / (ScalarType)::std::sqrt( ScalarType(1) - rotation.real * rotation.real );
|
{
|
||||||
|
ScalarType angle = ScalarType(2) * ScalarType( ::std::acos(rotation.real) ),
|
||||||
|
multiplier = angle / ScalarType( ::std::sqrt(ScalarType(1) - rotation.real * rotation.real) );
|
||||||
return multiplier * rotation.imaginary;
|
return multiplier * rotation.imaginary;
|
||||||
}
|
}
|
||||||
|
else return ::LinearAlgebra::Vector3<ScalarType>::null;
|
||||||
|
}
|
||||||
|
|
||||||
// All Matrix to AngularAxis conversions here is incorrect
|
// All Matrix to AngularAxis conversions here is incorrect
|
||||||
//template<typename ScalarType>
|
//template<typename ScalarType>
|
||||||
|
@ -838,7 +842,7 @@ namespace LinearAlgebra3D
|
||||||
|
|
||||||
template<typename ScalarType>
|
template<typename ScalarType>
|
||||||
::LinearAlgebra::Vector3<ScalarType> & SnapAngularAxis( const ::LinearAlgebra::Vector3<ScalarType> &startAngularAxis, const ::LinearAlgebra::Vector3<ScalarType> &localStartNormal, const ::LinearAlgebra::Vector3<ScalarType> &worldEndNormal, ::LinearAlgebra::Vector3<ScalarType> &targetMem = ::LinearAlgebra::Vector3<ScalarType>() )
|
::LinearAlgebra::Vector3<ScalarType> & SnapAngularAxis( const ::LinearAlgebra::Vector3<ScalarType> &startAngularAxis, const ::LinearAlgebra::Vector3<ScalarType> &localStartNormal, const ::LinearAlgebra::Vector3<ScalarType> &worldEndNormal, ::LinearAlgebra::Vector3<ScalarType> &targetMem = ::LinearAlgebra::Vector3<ScalarType>() )
|
||||||
{
|
{ //! @todo TODO: This code is broken and do not work!
|
||||||
::LinearAlgebra::Vector3<ScalarType> worldStartNormal( WorldAxisOf(Rotation(startAngularAxis), localStartNormal) );
|
::LinearAlgebra::Vector3<ScalarType> worldStartNormal( WorldAxisOf(Rotation(startAngularAxis), localStartNormal) );
|
||||||
targetMem = worldStartNormal.Cross( worldEndNormal );
|
targetMem = worldStartNormal.Cross( worldEndNormal );
|
||||||
targetMem *= (ScalarType)::std::acos( ::Utility::Value::Clamp(worldStartNormal.Dot(worldEndNormal), (ScalarType)0, (ScalarType)1) );
|
targetMem *= (ScalarType)::std::acos( ::Utility::Value::Clamp(worldStartNormal.Dot(worldEndNormal), (ScalarType)0, (ScalarType)1) );
|
||||||
|
|
|
@ -56,6 +56,17 @@ struct NetworkClient::PrivateData : public IThreadObject
|
||||||
ThreadSafeQueue<CustomNetProtocol> sendQueue;
|
ThreadSafeQueue<CustomNetProtocol> sendQueue;
|
||||||
ThreadSafeQueue<NetEvent<NetworkClient*, NetworkClient::ClientEventArgs>> recieveQueue;
|
ThreadSafeQueue<NetEvent<NetworkClient*, NetworkClient::ClientEventArgs>> recieveQueue;
|
||||||
|
|
||||||
|
//Testing for eventSelect.
|
||||||
|
HANDLE socketEvents[2];
|
||||||
|
HANDLE shutdownEvent;
|
||||||
|
|
||||||
|
//The OysterByte each message is packed in.
|
||||||
|
OysterByte tempMessage;
|
||||||
|
|
||||||
|
//Used to buffer messages
|
||||||
|
OysterByte bufferedSend;
|
||||||
|
int numPackages;
|
||||||
|
|
||||||
//ID
|
//ID
|
||||||
static unsigned int currID;
|
static unsigned int currID;
|
||||||
const unsigned int ID;
|
const unsigned int ID;
|
||||||
|
@ -66,13 +77,17 @@ struct NetworkClient::PrivateData : public IThreadObject
|
||||||
, owner(0)
|
, owner(0)
|
||||||
, outputEvent(0)
|
, outputEvent(0)
|
||||||
{
|
{
|
||||||
|
numPackages = 0;
|
||||||
|
bufferedSend.Resize(MAX_NETWORK_MESSAGE_SIZE);
|
||||||
|
tempMessage.Resize(MAX_NETWORK_MESSAGE_SIZE);
|
||||||
InitWinSock();
|
InitWinSock();
|
||||||
this->thread.Create(this, false);
|
this->thread.Create(this, false);
|
||||||
this->thread.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_1);
|
this->thread.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_1);
|
||||||
}
|
}
|
||||||
~PrivateData()
|
~PrivateData()
|
||||||
{
|
{
|
||||||
this->thread.Terminate();
|
SetEvent(shutdownEvent);
|
||||||
|
this->thread.Wait();
|
||||||
|
|
||||||
ShutdownWinSock();
|
ShutdownWinSock();
|
||||||
this->connection.Disconnect();
|
this->connection.Disconnect();
|
||||||
|
@ -80,15 +95,150 @@ struct NetworkClient::PrivateData : public IThreadObject
|
||||||
this->parent = 0;
|
this->parent = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadEntry()
|
||||||
|
{
|
||||||
|
//Create alla events used in the thread
|
||||||
|
shutdownEvent = CreateEvent(NULL, true, false, NULL);
|
||||||
|
socketEvents[0] = WSACreateEvent();
|
||||||
|
socketEvents[1] = WSACreateEvent();
|
||||||
|
|
||||||
|
if(socketEvents[0] == WSA_INVALID_EVENT)
|
||||||
|
{
|
||||||
|
//Error
|
||||||
|
}
|
||||||
|
|
||||||
|
if(WSAEventSelect(this->connection.GetSocket(), socketEvents[0], FD_READ) == SOCKET_ERROR)
|
||||||
|
{
|
||||||
|
//Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadExit()
|
||||||
|
{
|
||||||
|
WSACloseEvent(socketEvents[0]);
|
||||||
|
WSACloseEvent(socketEvents[1]);
|
||||||
|
CloseHandle(shutdownEvent);
|
||||||
|
}
|
||||||
|
|
||||||
bool DoWork() override
|
bool DoWork() override
|
||||||
|
{
|
||||||
|
WSANETWORKEVENTS wsaEvents;
|
||||||
|
|
||||||
|
while(WaitForSingleObject(shutdownEvent, 0) != WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
if(!this->connection.IsConnected()) return false;
|
if(!this->connection.IsConnected()) return false;
|
||||||
|
|
||||||
Send();
|
int result = WSAWaitForMultipleEvents(2, socketEvents, FALSE, 100, FALSE) - WSA_WAIT_EVENT_0;
|
||||||
|
if(result == 0)
|
||||||
|
{
|
||||||
|
WSAEnumNetworkEvents(this->connection.GetSocket(), socketEvents[0], &wsaEvents);
|
||||||
|
if((wsaEvents.lNetworkEvents & FD_READ) && (wsaEvents.iErrorCode[FD_READ_BIT] == 0))
|
||||||
|
{
|
||||||
|
//Recieve a message
|
||||||
Recv();
|
Recv();
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if(result == 1)
|
||||||
|
{
|
||||||
|
//Send all messages in the sendQueue
|
||||||
|
int i = this->sendQueue.Size();
|
||||||
|
WSAResetEvent(socketEvents[1]);
|
||||||
|
|
||||||
|
if(i == 1)
|
||||||
|
{
|
||||||
|
Send();
|
||||||
|
}
|
||||||
|
else if(i > 1)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < i; j++)
|
||||||
|
BufferMessage();
|
||||||
|
|
||||||
|
SendBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendBuffer()
|
||||||
|
{
|
||||||
|
if(bufferedSend.GetSize() > 0)
|
||||||
|
{
|
||||||
|
this->connection.Send(bufferedSend);
|
||||||
|
//printf("2. %d, %d\n", numPackages, bufferedSend.GetSize());
|
||||||
|
bufferedSend.Clear();
|
||||||
|
|
||||||
|
//Debug
|
||||||
|
numPackages = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BufferMessage()
|
||||||
|
{
|
||||||
|
int errorCode = 0;
|
||||||
|
|
||||||
|
if(!this->sendQueue.IsEmpty())
|
||||||
|
{
|
||||||
|
CustomNetProtocol p = this->sendQueue.Pop();
|
||||||
|
|
||||||
|
this->translator.Pack(tempMessage, p);
|
||||||
|
|
||||||
|
|
||||||
|
if(tempMessage.GetSize() > MAX_NETWORK_MESSAGE_SIZE - bufferedSend.GetSize())
|
||||||
|
{
|
||||||
|
//Send buffered message
|
||||||
|
errorCode = this->connection.Send(bufferedSend);
|
||||||
|
//printf("2. %d, %d\n", numPackages, bufferedSend.GetSize());
|
||||||
|
bufferedSend.Clear();
|
||||||
|
|
||||||
|
//Debug
|
||||||
|
numPackages = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufferedSend += tempMessage;
|
||||||
|
tempMessage.Clear();
|
||||||
|
|
||||||
|
//Debug
|
||||||
|
numPackages++;
|
||||||
|
|
||||||
|
if(errorCode != 0 && errorCode != WSAEWOULDBLOCK)
|
||||||
|
{
|
||||||
|
if( errorCode == WSAECONNABORTED || errorCode == WSAENOTCONN)
|
||||||
|
{
|
||||||
|
CEA parg;
|
||||||
|
parg.type = CEA::EventType_Disconnect;
|
||||||
|
parg.data.protocol = p;
|
||||||
|
NetEvent<NetworkClient*, CEA> e = { this->parent, parg };
|
||||||
|
this->recieveQueue.Push(e);
|
||||||
|
|
||||||
|
if(this->outputEvent)
|
||||||
|
{
|
||||||
|
printf("\t(ID: %i | IP: %s | Protocol: %i) - EventType_Disconnect && EventType_ProtocolFailedToSend \n", this->ID, this->connection.GetIpAddress().c_str(), p[0].value.netShort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CEA parg;
|
||||||
|
parg.type = CEA::EventType_ProtocolFailedToSend;
|
||||||
|
parg.data.protocol = p;
|
||||||
|
NetEvent<NetworkClient*, CEA> e = { this->parent, parg };
|
||||||
|
this->recieveQueue.Push(e);
|
||||||
|
|
||||||
|
if(this->outputEvent)
|
||||||
|
{
|
||||||
|
printf("\t(ID: %i | IP: %s | Protocol: %i) - EventType_ProtocolFailedToSend\n", this->ID, this->connection.GetIpAddress().c_str(), p[0].value.netShort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this->outputEvent)
|
||||||
|
{
|
||||||
|
printf("\t(ID: %i | IP: %s | Protocol: %i) Message sent!\n", this->ID, this->connection.GetIpAddress().c_str(), p[0].value.netShort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Send()
|
int Send()
|
||||||
{
|
{
|
||||||
int errorCode = 0;
|
int errorCode = 0;
|
||||||
|
@ -96,11 +246,11 @@ struct NetworkClient::PrivateData : public IThreadObject
|
||||||
if(!this->sendQueue.IsEmpty())
|
if(!this->sendQueue.IsEmpty())
|
||||||
{
|
{
|
||||||
//printf("\t(%i)\n", this->sendQueue.Size());
|
//printf("\t(%i)\n", this->sendQueue.Size());
|
||||||
OysterByte temp;
|
|
||||||
CustomNetProtocol p = this->sendQueue.Pop();
|
CustomNetProtocol p = this->sendQueue.Pop();
|
||||||
|
|
||||||
this->translator.Pack(temp, p);
|
this->translator.Pack(tempMessage, p);
|
||||||
errorCode = this->connection.Send(temp);
|
errorCode = this->connection.Send(tempMessage);
|
||||||
|
tempMessage.Clear();
|
||||||
|
|
||||||
if(errorCode != 0 && errorCode != WSAEWOULDBLOCK)
|
if(errorCode != 0 && errorCode != WSAEWOULDBLOCK)
|
||||||
{
|
{
|
||||||
|
@ -144,12 +294,12 @@ struct NetworkClient::PrivateData : public IThreadObject
|
||||||
{
|
{
|
||||||
int errorCode = -1;
|
int errorCode = -1;
|
||||||
|
|
||||||
OysterByte temp = OysterByte();
|
errorCode = this->connection.Recieve(tempMessage);
|
||||||
errorCode = this->connection.Recieve(temp);
|
|
||||||
|
|
||||||
if(errorCode == 0 && temp.GetSize())
|
if(errorCode == 0 && tempMessage.GetSize())
|
||||||
{
|
{
|
||||||
HandleRecievedData(temp);
|
HandleRecievedData(tempMessage);
|
||||||
|
tempMessage.Clear();
|
||||||
|
|
||||||
|
|
||||||
/* Replaced with EmptyOutbufferedQueue() and HandleRecievedData(OysterByte)
|
/* Replaced with EmptyOutbufferedQueue() and HandleRecievedData(OysterByte)
|
||||||
|
@ -312,7 +462,7 @@ bool NetworkClient::Connect(ConnectionInfo& socket)
|
||||||
if(this->privateData) return false;
|
if(this->privateData) return false;
|
||||||
if(!this->privateData) this->privateData = new PrivateData();
|
if(!this->privateData) this->privateData = new PrivateData();
|
||||||
|
|
||||||
int result = this->privateData->connection.Connect(socket, false);
|
int result = this->privateData->connection.Connect(socket, true);
|
||||||
|
|
||||||
//Connect has succeeded
|
//Connect has succeeded
|
||||||
if(result != 0) return false;
|
if(result != 0) return false;
|
||||||
|
@ -333,7 +483,7 @@ bool NetworkClient::Connect(unsigned short port, const char serverIP[])
|
||||||
if(!this->privateData)
|
if(!this->privateData)
|
||||||
this->privateData = new PrivateData();
|
this->privateData = new PrivateData();
|
||||||
|
|
||||||
int result = this->privateData->connection.Connect(port, serverIP, false);
|
int result = this->privateData->connection.Connect(port, serverIP, true);
|
||||||
|
|
||||||
//Connect has succeeded
|
//Connect has succeeded
|
||||||
if(result != 0) return false;
|
if(result != 0) return false;
|
||||||
|
@ -381,7 +531,9 @@ void NetworkClient::Disconnect()
|
||||||
{
|
{
|
||||||
if(!privateData) return;
|
if(!privateData) return;
|
||||||
|
|
||||||
privateData->thread.Stop();
|
SetEvent(privateData->shutdownEvent);
|
||||||
|
privateData->thread.Wait();
|
||||||
|
|
||||||
privateData->connection.Disconnect();
|
privateData->connection.Disconnect();
|
||||||
this->privateData->sendQueue.Clear();
|
this->privateData->sendQueue.Clear();
|
||||||
this->privateData->recieveQueue.Clear();
|
this->privateData->recieveQueue.Clear();
|
||||||
|
@ -390,11 +542,13 @@ void NetworkClient::Disconnect()
|
||||||
void NetworkClient::Send(CustomProtocolObject& protocol)
|
void NetworkClient::Send(CustomProtocolObject& protocol)
|
||||||
{
|
{
|
||||||
this->privateData->sendQueue.Push(protocol.GetProtocol());
|
this->privateData->sendQueue.Push(protocol.GetProtocol());
|
||||||
|
WSASetEvent(this->privateData->socketEvents[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkClient::Send(CustomNetProtocol& protocol)
|
void NetworkClient::Send(CustomNetProtocol& protocol)
|
||||||
{
|
{
|
||||||
this->privateData->sendQueue.Push(protocol);
|
this->privateData->sendQueue.Push(protocol);
|
||||||
|
WSASetEvent(this->privateData->socketEvents[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkClient::SetOwner(NetworkSession* owner)
|
void NetworkClient::SetOwner(NetworkSession* owner)
|
||||||
|
|
|
@ -188,8 +188,8 @@ int Connection::Recieve(OysterByte &bytes)
|
||||||
if(this->closed) return -1;
|
if(this->closed) return -1;
|
||||||
int nBytes;
|
int nBytes;
|
||||||
|
|
||||||
bytes.Resize(1000);
|
bytes.Resize(MAX_NETWORK_MESSAGE_SIZE);
|
||||||
nBytes = recv(this->socket, bytes, 1000, 0);
|
nBytes = recv(this->socket, bytes, MAX_NETWORK_MESSAGE_SIZE, 0);
|
||||||
if(nBytes == SOCKET_ERROR)
|
if(nBytes == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
bytes.SetSize(0);
|
bytes.SetSize(0);
|
||||||
|
@ -263,6 +263,11 @@ std::string Connection::GetIpAddress()
|
||||||
return this->addr;
|
return this->addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Connection::GetSocket()
|
||||||
|
{
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
//Private functions
|
//Private functions
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
|
|
|
@ -39,6 +39,8 @@ namespace Oyster
|
||||||
int SetBlockingMode( bool blocking );
|
int SetBlockingMode( bool blocking );
|
||||||
|
|
||||||
std::string GetIpAddress();
|
std::string GetIpAddress();
|
||||||
|
int GetSocket();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int InitiateSocket();
|
int InitiateSocket();
|
||||||
|
|
|
@ -135,10 +135,10 @@ int ConnectionUDP::Recieve(OysterByte &bytes)
|
||||||
sockaddr_in from;
|
sockaddr_in from;
|
||||||
int fromLength = sizeof( from );
|
int fromLength = sizeof( from );
|
||||||
|
|
||||||
bytes.Resize(1000);
|
bytes.Resize(MAX_NETWORK_MESSAGE_SIZE);
|
||||||
nBytes = recvfrom(this->socket,
|
nBytes = recvfrom(this->socket,
|
||||||
bytes,
|
bytes,
|
||||||
1000,
|
MAX_NETWORK_MESSAGE_SIZE,
|
||||||
0,
|
0,
|
||||||
(sockaddr*)&from,
|
(sockaddr*)&from,
|
||||||
&fromLength
|
&fromLength
|
||||||
|
|
|
@ -11,6 +11,8 @@ namespace Oyster
|
||||||
{
|
{
|
||||||
namespace Network
|
namespace Network
|
||||||
{
|
{
|
||||||
|
const int MAX_NETWORK_MESSAGE_SIZE = 1400;
|
||||||
|
|
||||||
struct ConnectionInfo
|
struct ConnectionInfo
|
||||||
{
|
{
|
||||||
int socket;
|
int socket;
|
||||||
|
@ -44,6 +46,8 @@ namespace Oyster
|
||||||
|
|
||||||
//Disconnects the client or server TODO: optimize!
|
//Disconnects the client or server TODO: optimize!
|
||||||
virtual int Disconnect() = 0;
|
virtual int Disconnect() = 0;
|
||||||
|
|
||||||
|
virtual int GetSocket() { return -1; };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,8 @@ namespace Oyster
|
||||||
{
|
{
|
||||||
Math::Matrix WV;
|
Math::Matrix WV;
|
||||||
Math::Matrix WVP;
|
Math::Matrix WVP;
|
||||||
TintData td;
|
Math::Float3 Tint;
|
||||||
|
Math::Float3 GTint;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,9 +58,11 @@ namespace Oyster
|
||||||
debugSRV = (ID3D11ShaderResourceView*)API::CreateTexture(L"color_white.png");
|
debugSRV = (ID3D11ShaderResourceView*)API::CreateTexture(L"color_white.png");
|
||||||
|
|
||||||
cube = CreateModel(L"generic_cube.dan");
|
cube = CreateModel(L"generic_cube.dan");
|
||||||
cube->Tint = Math::Float3(0.0f,0.0f,1.0f);
|
cube->Tint = Math::Float3(1.0f,0.0f,0.0f);
|
||||||
|
cube->Instanced = false;
|
||||||
sphere = CreateModel(L"generic_sphere.dan");
|
sphere = CreateModel(L"generic_sphere.dan");
|
||||||
sphere->Tint = Math::Float3(1.0f,0.5f,182/255.0f);
|
sphere->Tint = Math::Float3(1.0f,0.5f,182/255.0f);
|
||||||
|
sphere->Instanced = false;
|
||||||
|
|
||||||
|
|
||||||
D3D11_RASTERIZER_DESC desc;
|
D3D11_RASTERIZER_DESC desc;
|
||||||
|
@ -141,7 +143,26 @@ namespace Oyster
|
||||||
void API::EndLoadingModels()
|
void API::EndLoadingModels()
|
||||||
{
|
{
|
||||||
//TODO finalize instance buffers and create rendering map;
|
//TODO finalize instance buffers and create rendering map;
|
||||||
|
int maxModels = 0;
|
||||||
|
for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ )
|
||||||
|
{
|
||||||
|
if((*i).second->Models > maxModels)
|
||||||
|
{
|
||||||
|
maxModels = (*i).second->Models;
|
||||||
|
}
|
||||||
|
(*i).second->rid = new Definitions::RenderInstanceData[(*i).second->Models+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::Buffer::BUFFER_INIT_DESC desc;
|
||||||
|
|
||||||
|
|
||||||
|
desc.ElementSize = sizeof(Definitions::RenderInstanceData);
|
||||||
|
desc.Type = Core::Buffer::VERTEX_BUFFER;
|
||||||
|
desc.Usage = Core::Buffer::BUFFER_CPU_WRITE_DISCARD;
|
||||||
|
desc.InitData = 0;
|
||||||
|
desc.NumElements = maxModels+1;
|
||||||
|
|
||||||
|
Render::Resources::Gather::InstancedData.Init(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
//returns null for invalid filenames
|
//returns null for invalid filenames
|
||||||
|
@ -153,6 +174,7 @@ namespace Oyster
|
||||||
m->Animation.AnimationPlaying = NULL;
|
m->Animation.AnimationPlaying = NULL;
|
||||||
m->Tint = Math::Float3(1);
|
m->Tint = Math::Float3(1);
|
||||||
m->GlowTint = Math::Float3(1);
|
m->GlowTint = Math::Float3(1);
|
||||||
|
m->Instanced = true;
|
||||||
m->info = (Model::ModelInfo*)Core::loader.LoadResource((Core::modelPath + filename).c_str(),Oyster::Graphics::Loading::LoadDAN, Oyster::Graphics::Loading::UnloadDAN);
|
m->info = (Model::ModelInfo*)Core::loader.LoadResource((Core::modelPath + filename).c_str(),Oyster::Graphics::Loading::LoadDAN, Oyster::Graphics::Loading::UnloadDAN);
|
||||||
|
|
||||||
Model::ModelInfo* mi = (Model::ModelInfo*)m->info;
|
Model::ModelInfo* mi = (Model::ModelInfo*)m->info;
|
||||||
|
@ -164,6 +186,8 @@ namespace Oyster
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!m->info->Animated)
|
||||||
|
{
|
||||||
if(Core::loader.GetResourceCount(m->info) == 1)
|
if(Core::loader.GetResourceCount(m->info) == 1)
|
||||||
{
|
{
|
||||||
Render::Resources::RenderData[m->info] = new Render::Resources::ModelDataWrapper();
|
Render::Resources::RenderData[m->info] = new Render::Resources::ModelDataWrapper();
|
||||||
|
@ -172,6 +196,7 @@ namespace Oyster
|
||||||
{
|
{
|
||||||
Render::Resources::RenderData[m->info]->Models++;
|
Render::Resources::RenderData[m->info]->Models++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
@ -207,6 +232,12 @@ namespace Oyster
|
||||||
SAFE_RELEASE(Core::deviceContext);
|
SAFE_RELEASE(Core::deviceContext);
|
||||||
SAFE_RELEASE(Core::device);
|
SAFE_RELEASE(Core::device);
|
||||||
|
|
||||||
|
for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ )
|
||||||
|
{
|
||||||
|
SAFE_DELETE((*i).second->rid);
|
||||||
|
SAFE_DELETE((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void API::AddLight(Definitions::Pointlight light)
|
void API::AddLight(Definitions::Pointlight light)
|
||||||
|
@ -228,9 +259,9 @@ namespace Oyster
|
||||||
|
|
||||||
void API::StartRenderWireFrame()
|
void API::StartRenderWireFrame()
|
||||||
{
|
{
|
||||||
Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::Pass.RTV.size(),&Render::Resources::Gather::Pass.RTV[0],NULL);
|
//Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL);
|
||||||
Core::deviceContext->RSSetState(wire);
|
Core::deviceContext->RSSetState(wire);
|
||||||
Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::Pass.RTV.size(),&Render::Resources::Gather::Pass.RTV[0],NULL);
|
//Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void API::RenderDebugCube(Math::Matrix world)
|
void API::RenderDebugCube(Math::Matrix world)
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace Oyster
|
||||||
Oyster::Math::Float3 Tint;
|
Oyster::Math::Float3 Tint;
|
||||||
Oyster::Math::Float3 GlowTint;
|
Oyster::Math::Float3 GlowTint;
|
||||||
bool Visible;
|
bool Visible;
|
||||||
|
bool Instanced;
|
||||||
AnimationData Animation;
|
AnimationData Animation;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,13 +239,25 @@
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Vertex</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Vertex</ShaderType>
|
||||||
</FxCompile>
|
</FxCompile>
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherInstPixel.hlsl">
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
|
||||||
|
</FxCompile>
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherInstVertex.hlsl">
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Vertex</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Vertex</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
|
||||||
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Vertex</ShaderType>
|
||||||
|
</FxCompile>
|
||||||
<FxCompile Include="Shader\Passes\Light\LightPass.hlsl">
|
<FxCompile Include="Shader\Passes\Light\LightPass.hlsl">
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
||||||
</FxCompile>
|
</FxCompile>
|
||||||
<FxCompile Include="Shader\Passes\Gather\GatherPixel.hlsl">
|
<FxCompile Include="Shader\Passes\Gather\GatherAnimPixel.hlsl">
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
|
||||||
|
@ -281,7 +293,7 @@
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
||||||
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">5.0</ShaderModel>
|
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">5.0</ShaderModel>
|
||||||
</FxCompile>
|
</FxCompile>
|
||||||
<FxCompile Include="Shader\Passes\Gather\GatherVertex.hlsl">
|
<FxCompile Include="Shader\Passes\Gather\GatherAnimVertex.hlsl">
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Vertex</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Vertex</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Vertex</ShaderType>
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Vertex</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Vertex</ShaderType>
|
||||||
|
@ -328,8 +340,9 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Shader\Passes\2D\Header.hlsli" />
|
<None Include="Shader\Passes\2D\Header.hlsli" />
|
||||||
<None Include="Shader\Passes\2D\Text\Header.hlsli" />
|
<None Include="Shader\Passes\2D\Text\Header.hlsli" />
|
||||||
|
<None Include="Shader\Passes\Gather\InstHeader.hlsli" />
|
||||||
<None Include="Shader\Passes\Light\Defines.hlsli" />
|
<None Include="Shader\Passes\Light\Defines.hlsli" />
|
||||||
<None Include="Shader\Passes\Gather\Header.hlsli" />
|
<None Include="Shader\Passes\Gather\AnimHeader.hlsli" />
|
||||||
<None Include="Shader\Passes\Light\LightCalc.hlsli" />
|
<None Include="Shader\Passes\Light\LightCalc.hlsli" />
|
||||||
<None Include="Shader\Passes\Light\PosManipulation.hlsli" />
|
<None Include="Shader\Passes\Light\PosManipulation.hlsli" />
|
||||||
<None Include="Shader\Passes\Light\SSAO.hlsli" />
|
<None Include="Shader\Passes\Light\SSAO.hlsli" />
|
||||||
|
|
|
@ -100,8 +100,6 @@
|
||||||
<FxCompile Include="Shader\HLSL\SimpleDebug\TextureDebug.hlsl" />
|
<FxCompile Include="Shader\HLSL\SimpleDebug\TextureDebug.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\Light\LightPass.hlsl" />
|
<FxCompile Include="Shader\Passes\Light\LightPass.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\Post\PostPass.hlsl" />
|
<FxCompile Include="Shader\Passes\Post\PostPass.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\Gather\GatherPixel.hlsl" />
|
|
||||||
<FxCompile Include="Shader\Passes\Gather\GatherVertex.hlsl" />
|
|
||||||
<FxCompile Include="Shader\Passes\2D\2DVertex.hlsl" />
|
<FxCompile Include="Shader\Passes\2D\2DVertex.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\2D\2DPixel.hlsl" />
|
<FxCompile Include="Shader\Passes\2D\2DPixel.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\2D\2DGeometry.hlsl" />
|
<FxCompile Include="Shader\Passes\2D\2DGeometry.hlsl" />
|
||||||
|
@ -109,6 +107,10 @@
|
||||||
<FxCompile Include="Shader\Passes\Blur\BlurVert.hlsl" />
|
<FxCompile Include="Shader\Passes\Blur\BlurVert.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\2D\Text\2DTextVertex.hlsl" />
|
<FxCompile Include="Shader\Passes\2D\Text\2DTextVertex.hlsl" />
|
||||||
<FxCompile Include="Shader\Passes\2D\Text\2DTextGeometry.hlsl" />
|
<FxCompile Include="Shader\Passes\2D\Text\2DTextGeometry.hlsl" />
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherAnimPixel.hlsl" />
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherAnimVertex.hlsl" />
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherInstVertex.hlsl" />
|
||||||
|
<FxCompile Include="Shader\Passes\Gather\GatherInstPixel.hlsl" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Shader\HLSL\SimpleDebug\Debug.hlsl" />
|
<None Include="Shader\HLSL\SimpleDebug\Debug.hlsl" />
|
||||||
|
@ -117,8 +119,9 @@
|
||||||
<None Include="Shader\Passes\Light\PosManipulation.hlsli" />
|
<None Include="Shader\Passes\Light\PosManipulation.hlsli" />
|
||||||
<None Include="Shader\Passes\Light\SSAO.hlsli" />
|
<None Include="Shader\Passes\Light\SSAO.hlsli" />
|
||||||
<None Include="Shader\Passes\2D\Header.hlsli" />
|
<None Include="Shader\Passes\2D\Header.hlsli" />
|
||||||
<None Include="Shader\Passes\Gather\Header.hlsli" />
|
|
||||||
<None Include="Shader\Passes\Blur\BlurSharedData.hlsli" />
|
<None Include="Shader\Passes\Blur\BlurSharedData.hlsli" />
|
||||||
<None Include="Shader\Passes\2D\Text\Header.hlsli" />
|
<None Include="Shader\Passes\2D\Text\Header.hlsli" />
|
||||||
|
<None Include="Shader\Passes\Gather\AnimHeader.hlsli" />
|
||||||
|
<None Include="Shader\Passes\Gather\InstHeader.hlsli" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -19,7 +19,6 @@ namespace Oyster
|
||||||
Preparations::Basic::ClearBackBuffer(Oyster::Math::Float4(0,0,0,0));
|
Preparations::Basic::ClearBackBuffer(Oyster::Math::Float4(0,0,0,0));
|
||||||
Preparations::Basic::ClearDepthStencil(Resources::Gui::depth);
|
Preparations::Basic::ClearDepthStencil(Resources::Gui::depth);
|
||||||
Preparations::Basic::ClearRTV(Resources::GBufferRTV,Resources::GBufferSize,Math::Float4(0,0,0,0));
|
Preparations::Basic::ClearRTV(Resources::GBufferRTV,Resources::GBufferSize,Math::Float4(0,0,0,0));
|
||||||
Core::PipelineManager::SetRenderPass(Graphics::Render::Resources::Gather::Pass);
|
|
||||||
Lights[1];
|
Lights[1];
|
||||||
|
|
||||||
void* data;
|
void* data;
|
||||||
|
@ -39,15 +38,39 @@ namespace Oyster
|
||||||
data = Resources::Light::PointLightsData.Map();
|
data = Resources::Light::PointLightsData.Map();
|
||||||
memcpy(data, Lights, sizeof(Definitions::Pointlight) * numLights);
|
memcpy(data, Lights, sizeof(Definitions::Pointlight) * numLights);
|
||||||
Resources::Light::PointLightsData.Unmap();
|
Resources::Light::PointLightsData.Unmap();
|
||||||
|
|
||||||
|
for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ )
|
||||||
|
{
|
||||||
|
(*i).second->Models=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::PipelineManager::SetRenderPass(Resources::Gather::AnimatedPass);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultRenderer::RenderScene(Model::Model* models, int count, Math::Matrix View, Math::Matrix Projection, float deltaTime)
|
void DefaultRenderer::RenderScene(Model::Model* models, int count, Math::Matrix View, Math::Matrix Projection, float deltaTime)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < count; ++i)
|
for(int i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
if(&models[i] == NULL)
|
if(&models[i] == NULL || !models[i].Visible)
|
||||||
continue;
|
continue;
|
||||||
if(models[i].Visible)
|
|
||||||
|
Model::ModelInfo* info = models[i].info;
|
||||||
|
if(!info->Animated && models[i].Instanced)
|
||||||
|
{
|
||||||
|
Definitions::RenderInstanceData rid;
|
||||||
|
Math::Float3x3 normalTransform;
|
||||||
|
normalTransform = Math::Float3x3(models[i].WorldMatrix.v[0].xyz, models[i].WorldMatrix.v[1].xyz, models[i].WorldMatrix.v[2].xyz);
|
||||||
|
normalTransform.Transpose().Invert();
|
||||||
|
Math::Matrix m = Math::Matrix(Math::Vector4(normalTransform.v[0],0.0f), Math::Vector4(normalTransform.v[1],0.0f), Math::Vector4(normalTransform.v[2],0.0f), Math::Vector4(0.0f));
|
||||||
|
rid.WV = View * m;
|
||||||
|
rid.WVP = Projection * View * models[i].WorldMatrix;
|
||||||
|
|
||||||
|
rid.Tint = models[i].Tint;
|
||||||
|
rid.GTint = models[i].GlowTint;
|
||||||
|
|
||||||
|
Resources::RenderData[info]->rid[Resources::RenderData[info]->Models++] = rid;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Definitions::PerModel pm;
|
Definitions::PerModel pm;
|
||||||
Math::Float3x3 normalTransform;
|
Math::Float3x3 normalTransform;
|
||||||
|
@ -55,7 +78,6 @@ namespace Oyster
|
||||||
normalTransform.Transpose().Invert();
|
normalTransform.Transpose().Invert();
|
||||||
Math::Matrix m = Math::Matrix(Math::Vector4(normalTransform.v[0],0.0f), Math::Vector4(normalTransform.v[1],0.0f), Math::Vector4(normalTransform.v[2],0.0f), Math::Vector4(0.0f));
|
Math::Matrix m = Math::Matrix(Math::Vector4(normalTransform.v[0],0.0f), Math::Vector4(normalTransform.v[1],0.0f), Math::Vector4(normalTransform.v[2],0.0f), Math::Vector4(0.0f));
|
||||||
pm.WV = View * m;
|
pm.WV = View * m;
|
||||||
//pm.WV = models[i].WorldMatrix.GetTranspose().GetInverse();
|
|
||||||
pm.WVP = Projection * View * models[i].WorldMatrix;
|
pm.WVP = Projection * View * models[i].WorldMatrix;
|
||||||
|
|
||||||
Model::ModelInfo* info = models[i].info;
|
Model::ModelInfo* info = models[i].info;
|
||||||
|
@ -207,9 +229,47 @@ namespace Oyster
|
||||||
Core::deviceContext->Dispatch((UINT)(Core::resolution.x/2), (UINT)((Core::resolution.y/2 + 127U) / 128U), 1);
|
Core::deviceContext->Dispatch((UINT)(Core::resolution.x/2), (UINT)((Core::resolution.y/2 + 127U) / 128U), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderModel(Model::ModelInfo* info, Definitions::RenderInstanceData* rid , int count)
|
||||||
|
{
|
||||||
|
if(count < 1)
|
||||||
|
return;
|
||||||
|
if(info->Material.size())
|
||||||
|
{
|
||||||
|
Core::deviceContext->PSSetShaderResources(0,(UINT)info->Material.size(),&(info->Material[0]));
|
||||||
|
}
|
||||||
|
info->Vertices->Apply();
|
||||||
|
if(info->Indexed)
|
||||||
|
{
|
||||||
|
info->Indecies->Apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
void* data = Resources::Gather::InstancedData.Map();
|
||||||
|
memcpy(data, rid, sizeof(Definitions::RenderInstanceData)*count);
|
||||||
|
Resources::Gather::InstancedData.Unmap();
|
||||||
|
|
||||||
|
if(info->Indexed)
|
||||||
|
{
|
||||||
|
Core::deviceContext->DrawIndexedInstanced(info->IndexCount,count,0,0,0);
|
||||||
|
//Core::deviceContext->DrawIndexed(info->IndexCount,0,0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Core::deviceContext->DrawInstanced(info->VertexCount,count,0,0);
|
||||||
|
//Core::deviceContext->Draw(info->VertexCount,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DefaultRenderer::EndFrame()
|
void DefaultRenderer::EndFrame()
|
||||||
{
|
{
|
||||||
|
Core::PipelineManager::SetRenderPass(Graphics::Render::Resources::Gather::InstancedPass);
|
||||||
|
Resources::Gather::InstancedData.Apply(1);
|
||||||
|
|
||||||
|
for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ )
|
||||||
|
{
|
||||||
|
RenderModel((*i).first,(*i).second->rid, (*i).second->Models);
|
||||||
|
}
|
||||||
|
|
||||||
Core::PipelineManager::SetRenderPass(Resources::Light::Pass);
|
Core::PipelineManager::SetRenderPass(Resources::Light::Pass);
|
||||||
|
|
||||||
Core::deviceContext->Dispatch((UINT)((Core::resolution.x + 15U) / 16U), (UINT)((Core::resolution.y + 15U) / 16U), 1);
|
Core::deviceContext->Dispatch((UINT)((Core::resolution.x + 15U) / 16U), (UINT)((Core::resolution.y + 15U) / 16U), 1);
|
||||||
|
|
|
@ -33,7 +33,8 @@ namespace Oyster
|
||||||
ID3D11UnorderedAccessView* Resources::Blur::BufferUAV = {0};
|
ID3D11UnorderedAccessView* Resources::Blur::BufferUAV = {0};
|
||||||
ID3D11ShaderResourceView* Resources::Blur::BufferSRV = {0};
|
ID3D11ShaderResourceView* Resources::Blur::BufferSRV = {0};
|
||||||
|
|
||||||
Shader::RenderPass Resources::Gather::Pass;
|
Shader::RenderPass Resources::Gather::AnimatedPass;
|
||||||
|
Shader::RenderPass Resources::Gather::InstancedPass;
|
||||||
Shader::RenderPass Resources::Light::Pass;
|
Shader::RenderPass Resources::Light::Pass;
|
||||||
Shader::RenderPass Resources::Post::Pass;
|
Shader::RenderPass Resources::Post::Pass;
|
||||||
Shader::RenderPass Resources::Gui::Pass;
|
Shader::RenderPass Resources::Gui::Pass;
|
||||||
|
@ -43,6 +44,7 @@ namespace Oyster
|
||||||
|
|
||||||
Buffer Resources::Gather::ModelData = Buffer();
|
Buffer Resources::Gather::ModelData = Buffer();
|
||||||
Buffer Resources::Gather::AnimationData = Buffer();
|
Buffer Resources::Gather::AnimationData = Buffer();
|
||||||
|
Buffer Resources::Gather::InstancedData = Buffer();
|
||||||
Buffer Resources::Light::LightConstantsData = Buffer();
|
Buffer Resources::Light::LightConstantsData = Buffer();
|
||||||
Buffer Resources::Gui::Data = Buffer();
|
Buffer Resources::Gui::Data = Buffer();
|
||||||
Buffer Resources::Color = Buffer();
|
Buffer Resources::Color = Buffer();
|
||||||
|
@ -78,8 +80,12 @@ namespace Oyster
|
||||||
std::wstring end = L".cso";
|
std::wstring end = L".cso";
|
||||||
#endif
|
#endif
|
||||||
//Load Shaders
|
//Load Shaders
|
||||||
Core::PipelineManager::Init(path + L"GatherPixel" + end, ShaderType::Pixel, L"Gather");
|
Core::PipelineManager::Init(path + L"GatherAnimPixel" + end, ShaderType::Pixel, L"AGather");
|
||||||
Core::PipelineManager::Init(path + L"GatherVertex" + end, ShaderType::Vertex, L"Gather");
|
Core::PipelineManager::Init(path + L"GatherAnimVertex" + end, ShaderType::Vertex, L"AGather");
|
||||||
|
|
||||||
|
|
||||||
|
Core::PipelineManager::Init(path + L"GatherInstPixel" + end, ShaderType::Pixel, L"IGather");
|
||||||
|
Core::PipelineManager::Init(path + L"GatherInstVertex" + end, ShaderType::Vertex, L"IGather");
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
path = PathToHLSL+L"Light\\";
|
path = PathToHLSL+L"Light\\";
|
||||||
#endif
|
#endif
|
||||||
|
@ -153,6 +159,7 @@ namespace Oyster
|
||||||
desc.NumElements = MAX_LETTER_COUNT;
|
desc.NumElements = MAX_LETTER_COUNT;
|
||||||
Gui::Text::Vertex.Init(desc);
|
Gui::Text::Vertex.Init(desc);
|
||||||
|
|
||||||
|
|
||||||
return Core::Init::Success;
|
return Core::Init::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,10 +365,11 @@ namespace Oyster
|
||||||
{
|
{
|
||||||
|
|
||||||
////---------------- Geometry Pass Setup ----------------------------
|
////---------------- Geometry Pass Setup ----------------------------
|
||||||
Gather::Pass.Shaders.Pixel = GetShader::Pixel(L"Gather");
|
#pragma region Animated Pass
|
||||||
Gather::Pass.Shaders.Vertex = GetShader::Vertex(L"Gather");
|
Gather::AnimatedPass.Shaders.Pixel = GetShader::Pixel(L"AGather");
|
||||||
|
Gather::AnimatedPass.Shaders.Vertex = GetShader::Vertex(L"AGather");
|
||||||
|
|
||||||
D3D11_INPUT_ELEMENT_DESC indesc[] =
|
D3D11_INPUT_ELEMENT_DESC AnimInDesc[] =
|
||||||
{
|
{
|
||||||
{ "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 },
|
||||||
|
@ -370,20 +378,163 @@ namespace Oyster
|
||||||
{ "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }
|
{ "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
Shader::CreateInputLayout(indesc,5,GetShader::Vertex(L"Gather"),Gather::Pass.IAStage.Layout);
|
Shader::CreateInputLayout(AnimInDesc,5,GetShader::Vertex(L"AGather"),Gather::AnimatedPass.IAStage.Layout);
|
||||||
Gather::Pass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
|
Gather::AnimatedPass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
|
||||||
Gather::Pass.CBuffers.Vertex.push_back(Gather::AnimationData);
|
Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::AnimationData);
|
||||||
Gather::Pass.CBuffers.Vertex.push_back(Gather::ModelData);
|
Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::ModelData);
|
||||||
Gather::Pass.CBuffers.Pixel.push_back(Color);
|
Gather::AnimatedPass.CBuffers.Pixel.push_back(Color);
|
||||||
Gather::Pass.RenderStates.Rasterizer = RenderStates::rs;
|
Gather::AnimatedPass.RenderStates.Rasterizer = RenderStates::rs;
|
||||||
Gather::Pass.RenderStates.SampleCount = 1;
|
Gather::AnimatedPass.RenderStates.SampleCount = 1;
|
||||||
Gather::Pass.RenderStates.SampleState = RenderStates::ss;
|
Gather::AnimatedPass.RenderStates.SampleState = RenderStates::ss;
|
||||||
Gather::Pass.RenderStates.DepthStencil = RenderStates::dsState;
|
Gather::AnimatedPass.RenderStates.DepthStencil = RenderStates::dsState;
|
||||||
for(int i = 0; i<GBufferSize;++i)
|
for(int i = 0; i<GBufferSize;++i)
|
||||||
{
|
{
|
||||||
Gather::Pass.RTV.push_back(GBufferRTV[i]);
|
Gather::AnimatedPass.RTV.push_back(GBufferRTV[i]);
|
||||||
}
|
}
|
||||||
Gather::Pass.depth = Core::depthStencil;
|
Gather::AnimatedPass.depth = Core::depthStencil;
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma region Instanced Pass
|
||||||
|
Gather::InstancedPass.Shaders.Pixel = GetShader::Pixel(L"IGather");
|
||||||
|
Gather::InstancedPass.Shaders.Vertex = GetShader::Vertex(L"IGather");
|
||||||
|
|
||||||
|
D3D11_INPUT_ELEMENT_DESC InstInDesc[15];
|
||||||
|
|
||||||
|
InstInDesc[0].AlignedByteOffset = 0;
|
||||||
|
InstInDesc[0].SemanticName = "POSITION";
|
||||||
|
InstInDesc[0].SemanticIndex = 0;
|
||||||
|
InstInDesc[0].InputSlot = 0;
|
||||||
|
InstInDesc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
||||||
|
InstInDesc[0].InstanceDataStepRate = 0;
|
||||||
|
InstInDesc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[1].AlignedByteOffset = 12;
|
||||||
|
InstInDesc[1].SemanticName = "TEXCOORD";
|
||||||
|
InstInDesc[1].SemanticIndex = 0;
|
||||||
|
InstInDesc[1].InputSlot = 0;
|
||||||
|
InstInDesc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
||||||
|
InstInDesc[1].InstanceDataStepRate = 0;
|
||||||
|
InstInDesc[1].Format = DXGI_FORMAT_R32G32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[2].AlignedByteOffset = 20;
|
||||||
|
InstInDesc[2].SemanticName = "NORMAL";
|
||||||
|
InstInDesc[2].SemanticIndex = 0;
|
||||||
|
InstInDesc[2].InputSlot = 0;
|
||||||
|
InstInDesc[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
||||||
|
InstInDesc[2].InstanceDataStepRate = 0;
|
||||||
|
InstInDesc[2].Format = DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[3].AlignedByteOffset = 36;
|
||||||
|
InstInDesc[3].SemanticName = "BONEINDEX";
|
||||||
|
InstInDesc[3].SemanticIndex = 0;
|
||||||
|
InstInDesc[3].InputSlot = 0;
|
||||||
|
InstInDesc[3].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
||||||
|
InstInDesc[3].InstanceDataStepRate = 0;
|
||||||
|
InstInDesc[3].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[4].AlignedByteOffset = 48;
|
||||||
|
InstInDesc[4].SemanticName = "BONEWEIGHT";
|
||||||
|
InstInDesc[4].SemanticIndex = 0;
|
||||||
|
InstInDesc[4].InputSlot = 0;
|
||||||
|
InstInDesc[4].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
||||||
|
InstInDesc[4].InstanceDataStepRate = 0;
|
||||||
|
InstInDesc[4].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
/// Set WV
|
||||||
|
InstInDesc[5].AlignedByteOffset = 0;
|
||||||
|
InstInDesc[5].SemanticName = "WV";
|
||||||
|
InstInDesc[5].SemanticIndex = 0;
|
||||||
|
InstInDesc[5].InputSlot = 1;
|
||||||
|
InstInDesc[5].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[5].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[5].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[6].AlignedByteOffset = 16;
|
||||||
|
InstInDesc[6].SemanticName = "WV";
|
||||||
|
InstInDesc[6].SemanticIndex = 1;
|
||||||
|
InstInDesc[6].InputSlot = 1;
|
||||||
|
InstInDesc[6].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[6].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[6].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[7].AlignedByteOffset = 32;
|
||||||
|
InstInDesc[7].SemanticName = "WV";
|
||||||
|
InstInDesc[7].SemanticIndex = 2;
|
||||||
|
InstInDesc[7].InputSlot = 1;
|
||||||
|
InstInDesc[7].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[7].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[7].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[8].AlignedByteOffset = 48;
|
||||||
|
InstInDesc[8].SemanticName = "WV";
|
||||||
|
InstInDesc[8].SemanticIndex = 3;
|
||||||
|
InstInDesc[8].InputSlot = 1;
|
||||||
|
InstInDesc[8].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[8].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[8].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
//WVP
|
||||||
|
|
||||||
|
InstInDesc[9].AlignedByteOffset = 64;
|
||||||
|
InstInDesc[9].SemanticName = "WVP";
|
||||||
|
InstInDesc[9].SemanticIndex = 0;
|
||||||
|
InstInDesc[9].InputSlot = 1;
|
||||||
|
InstInDesc[9].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[9].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[9].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[10].AlignedByteOffset = 80;
|
||||||
|
InstInDesc[10].SemanticName = "WVP";
|
||||||
|
InstInDesc[10].SemanticIndex = 1;
|
||||||
|
InstInDesc[10].InputSlot = 1;
|
||||||
|
InstInDesc[10].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[10].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[10].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[11].AlignedByteOffset = 96;
|
||||||
|
InstInDesc[11].SemanticName = "WVP";
|
||||||
|
InstInDesc[11].SemanticIndex = 2;
|
||||||
|
InstInDesc[11].InputSlot = 1;
|
||||||
|
InstInDesc[11].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[11].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[11].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[12].AlignedByteOffset = 112;
|
||||||
|
InstInDesc[12].SemanticName = "WVP";
|
||||||
|
InstInDesc[12].SemanticIndex = 3;
|
||||||
|
InstInDesc[12].InputSlot = 1;
|
||||||
|
InstInDesc[12].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[12].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[12].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[13].AlignedByteOffset = 128;
|
||||||
|
InstInDesc[13].SemanticName = "TINT";
|
||||||
|
InstInDesc[13].SemanticIndex = 0;
|
||||||
|
InstInDesc[13].InputSlot = 1;
|
||||||
|
InstInDesc[13].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[13].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[13].Format = DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
|
|
||||||
|
InstInDesc[14].AlignedByteOffset = 140;
|
||||||
|
InstInDesc[14].SemanticName = "GTINT";
|
||||||
|
InstInDesc[14].SemanticIndex = 0;
|
||||||
|
InstInDesc[14].InputSlot = 1;
|
||||||
|
InstInDesc[14].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
|
||||||
|
InstInDesc[14].InstanceDataStepRate = 1;
|
||||||
|
InstInDesc[14].Format = DXGI_FORMAT_R32G32B32_FLOAT;
|
||||||
|
|
||||||
|
Shader::CreateInputLayout(InstInDesc,15,GetShader::Vertex(L"IGather"),Gather::InstancedPass.IAStage.Layout);
|
||||||
|
Gather::InstancedPass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
|
||||||
|
Gather::InstancedPass.RenderStates.Rasterizer = RenderStates::rs;
|
||||||
|
Gather::InstancedPass.RenderStates.SampleCount = 1;
|
||||||
|
Gather::InstancedPass.RenderStates.SampleState = RenderStates::ss;
|
||||||
|
Gather::InstancedPass.RenderStates.DepthStencil = RenderStates::dsState;
|
||||||
|
for(int i = 0; i<GBufferSize;++i)
|
||||||
|
{
|
||||||
|
Gather::InstancedPass.RTV.push_back(GBufferRTV[i]);
|
||||||
|
}
|
||||||
|
Gather::InstancedPass.depth = Core::depthStencil;
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
////---------------- Light Pass Setup ----------------------------
|
////---------------- Light Pass Setup ----------------------------
|
||||||
Light::Pass.Shaders.Compute = GetShader::Compute(L"LightPass");
|
Light::Pass.Shaders.Compute = GetShader::Compute(L"LightPass");
|
||||||
|
@ -498,6 +649,7 @@ namespace Oyster
|
||||||
{
|
{
|
||||||
Gather::ModelData.~Buffer();
|
Gather::ModelData.~Buffer();
|
||||||
Gather::AnimationData.~Buffer();
|
Gather::AnimationData.~Buffer();
|
||||||
|
Gather::InstancedData.~Buffer();
|
||||||
Light::LightConstantsData.~Buffer();
|
Light::LightConstantsData.~Buffer();
|
||||||
Light::PointLightsData.~Buffer();
|
Light::PointLightsData.~Buffer();
|
||||||
Gui::Data.~Buffer();
|
Gui::Data.~Buffer();
|
||||||
|
@ -524,20 +676,21 @@ namespace Oyster
|
||||||
SAFE_RELEASE(LBufferSRV[i]);
|
SAFE_RELEASE(LBufferSRV[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFE_RELEASE(Gather::Pass.IAStage.Layout);
|
SAFE_RELEASE(Gather::AnimatedPass.IAStage.Layout);
|
||||||
|
SAFE_RELEASE(Gather::InstancedPass.IAStage.Layout);
|
||||||
|
|
||||||
SAFE_RELEASE(Gather::Pass.RenderStates.BlendState);
|
SAFE_RELEASE(Gather::AnimatedPass.RenderStates.BlendState);
|
||||||
|
|
||||||
SAFE_RELEASE(Gather::Pass.RenderStates.DepthStencil);
|
SAFE_RELEASE(Gather::AnimatedPass.RenderStates.DepthStencil);
|
||||||
|
|
||||||
SAFE_RELEASE(Gather::Pass.RenderStates.Rasterizer);
|
SAFE_RELEASE(Gather::AnimatedPass.RenderStates.Rasterizer);
|
||||||
|
|
||||||
for(int i = 0; i < Gather::Pass.RenderStates.SampleCount; ++i)
|
for(int i = 0; i < Gather::AnimatedPass.RenderStates.SampleCount; ++i)
|
||||||
{
|
{
|
||||||
SAFE_RELEASE(Gather::Pass.RenderStates.SampleState[i]);
|
SAFE_RELEASE(Gather::AnimatedPass.RenderStates.SampleState[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFE_DELETE_ARRAY(Gather::Pass.RenderStates.SampleState);
|
SAFE_DELETE_ARRAY(Gather::AnimatedPass.RenderStates.SampleState);
|
||||||
|
|
||||||
SAFE_RELEASE(Gui::Pass.IAStage.Layout);
|
SAFE_RELEASE(Gui::Pass.IAStage.Layout);
|
||||||
|
|
||||||
|
|
|
@ -54,9 +54,11 @@ namespace Oyster
|
||||||
|
|
||||||
struct Gather
|
struct Gather
|
||||||
{
|
{
|
||||||
static Core::PipelineManager::RenderPass Pass;
|
static Core::PipelineManager::RenderPass AnimatedPass;
|
||||||
|
static Core::PipelineManager::RenderPass InstancedPass;
|
||||||
static Core::Buffer ModelData;
|
static Core::Buffer ModelData;
|
||||||
static Core::Buffer AnimationData;
|
static Core::Buffer AnimationData;
|
||||||
|
static Core::Buffer InstancedData;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Light
|
struct Light
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
struct VertexIn
|
struct AnimVertexIn
|
||||||
{
|
{
|
||||||
float3 pos : POSITION;
|
float3 pos : POSITION;
|
||||||
float2 UV : TEXCOORD;
|
float2 UV : TEXCOORD;
|
|
@ -1,4 +1,4 @@
|
||||||
#include "Header.hlsli"
|
#include "AnimHeader.hlsli"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ PixelOut main(VertexOut input)
|
||||||
PixelOut output;
|
PixelOut output;
|
||||||
float4 DiffGlow = Diffuse.Sample(S1, input.UV);
|
float4 DiffGlow = Diffuse.Sample(S1, input.UV);
|
||||||
float3 tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w;
|
float3 tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w;
|
||||||
tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w;
|
//tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w;
|
||||||
output.DiffuseGlow = DiffGlow * float4(tint,1);
|
output.DiffuseGlow = DiffGlow * float4(tint,1);
|
||||||
|
|
||||||
//NORMALIZE
|
//NORMALIZE
|
|
@ -1,6 +1,6 @@
|
||||||
#include "Header.hlsli"
|
#include "AnimHeader.hlsli"
|
||||||
|
|
||||||
VertexOut main( VertexIn input )
|
VertexOut main( AnimVertexIn input )
|
||||||
{
|
{
|
||||||
VertexOut output;
|
VertexOut output;
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
#include "InstHeader.hlsli"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
float3x3 cotangent_frame( float3 N, float3 p, float2 uv )
|
||||||
|
{
|
||||||
|
// get edge vectors of the pixel triangle
|
||||||
|
float3 dp1 = ddx( p );
|
||||||
|
float3 dp2 = ddy( p );
|
||||||
|
float2 duv1 = ddx( uv );
|
||||||
|
float2 duv2 = ddy( uv );
|
||||||
|
|
||||||
|
// solve the linear system
|
||||||
|
float3 dp2perp = cross( dp2, N );
|
||||||
|
float3 dp1perp = cross( N, dp1 );
|
||||||
|
float3 T = dp2perp * duv1.x + dp1perp * duv2.x;
|
||||||
|
float3 B = dp2perp * duv1.y + dp1perp * duv2.y;
|
||||||
|
|
||||||
|
// construct a scale-invariant frame
|
||||||
|
float invmax = rsqrt( max( dot(T,T), dot(B,B) ) );
|
||||||
|
return transpose(float3x3( T * invmax, B * invmax, N ));
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 perturb_normal( float3 N, float3 V, float2 texcoord )
|
||||||
|
{
|
||||||
|
// assume N, the interpolated vertex normal and
|
||||||
|
// V, the view vector (vertex to eye)
|
||||||
|
float3 map = Normal.Sample(S1,texcoord).xyz;
|
||||||
|
map = map * 255./127. - 128./127.;
|
||||||
|
#ifdef WITH_NORMALMAP_2CHANNEL
|
||||||
|
map.z = sqrt( 1. - dot( map.xy, map.xy ) );
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_NORMALMAP_GREEN_UP
|
||||||
|
map.y = -map.y;
|
||||||
|
#endif
|
||||||
|
float3x3 TBN = cotangent_frame( N, -V, texcoord );
|
||||||
|
return normalize( mul(transpose(TBN), map) );
|
||||||
|
}
|
||||||
|
|
||||||
|
PixelOut main(VertexOut input)
|
||||||
|
{
|
||||||
|
PixelOut output;
|
||||||
|
float4 DiffGlow = Diffuse.Sample(S1, input.UV);
|
||||||
|
float3 tint = input.tint * (1-DiffGlow.w) + input.gtint * DiffGlow.w;
|
||||||
|
//tint = Color*(1-DiffGlow.w) + GlowColor * DiffGlow.w;
|
||||||
|
output.DiffuseGlow = DiffGlow * float4(tint,1);
|
||||||
|
|
||||||
|
//NORMALIZE
|
||||||
|
float3x3 CoTangentFrame = cotangent_frame(input.normal, normalize(input.ViewPos), input.UV);
|
||||||
|
|
||||||
|
float3 map = Normal.Sample(S1,input.UV).xyz;
|
||||||
|
//map = normalize((map * 2) -1);
|
||||||
|
map = map * 255./127. - 128./127.;
|
||||||
|
//map = map * 255;
|
||||||
|
float3 normal = normalize(mul(CoTangentFrame, map));
|
||||||
|
//normal = perturb_normal( normal, normalize(-input.ViewPos), input.UV );
|
||||||
|
|
||||||
|
output.NormalSpec = float4(normal, Normal.Sample(S1, input.UV).w*255);
|
||||||
|
|
||||||
|
//output.NormalSpec = float4(input.normal, Normal.Sample(S1, input.UV).w * 0);
|
||||||
|
//output.NormalSpec = float4(map,0);
|
||||||
|
return output;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include "InstHeader.hlsli"
|
||||||
|
|
||||||
|
VertexOut main( InstVertexIn input )
|
||||||
|
{
|
||||||
|
VertexOut output;
|
||||||
|
|
||||||
|
matrix WV = transpose(matrix(input.wv1, input.wv2, input.wv3, input.wv4));
|
||||||
|
matrix WVP = transpose(matrix(input.wvp1, input.wvp2, input.wvp3, input.wvp4));
|
||||||
|
|
||||||
|
output.pos = mul(WVP, float4(input.pos,1));
|
||||||
|
output.ViewPos = mul(WV, float4(input.pos,1));
|
||||||
|
output.normal = mul(WV, float4(input.normal,0)).xyz;
|
||||||
|
output.UV = input.UV;
|
||||||
|
output.tint = input.Tint;
|
||||||
|
output.gtint = input.GlowTint;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
struct InstVertexIn
|
||||||
|
{
|
||||||
|
float3 pos : POSITION;
|
||||||
|
float2 UV : TEXCOORD;
|
||||||
|
float3 normal : NORMAL;
|
||||||
|
float4 boneIndex : BONEINDEX;
|
||||||
|
float4 boneWeight : BONEWEIGHT;
|
||||||
|
//instance Data
|
||||||
|
//WV MATRIX
|
||||||
|
float4 wv1 : WV0;
|
||||||
|
float4 wv2 : WV1;
|
||||||
|
float4 wv3 : WV2;
|
||||||
|
float4 wv4 : WV3;
|
||||||
|
|
||||||
|
//WVP MATRIX
|
||||||
|
float4 wvp1 : WVP0;
|
||||||
|
float4 wvp2 : WVP1;
|
||||||
|
float4 wvp3 : WVP2;
|
||||||
|
float4 wvp4 : WVP3;
|
||||||
|
|
||||||
|
float3 Tint : TINT;
|
||||||
|
float3 GlowTint : GTINT;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexOut
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
float4 ViewPos : POSITION;
|
||||||
|
float2 UV : TEXCOORD;
|
||||||
|
float3 normal : NORMAL;
|
||||||
|
float3 tint : TINT;
|
||||||
|
float3 gtint : GTINT;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PixelOut
|
||||||
|
{
|
||||||
|
float4 DiffuseGlow : SV_TARGET0;
|
||||||
|
float4 NormalSpec : SV_TARGET1;
|
||||||
|
};
|
||||||
|
|
||||||
|
Texture2D Diffuse : register(t0);
|
||||||
|
Texture2D Normal : register(t1);
|
||||||
|
|
||||||
|
SamplerState S1 : register(s0);
|
|
@ -25,6 +25,16 @@ cbuffer LightConstants : register(b0)
|
||||||
float4x4 View;
|
float4x4 View;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FrustrumPoints
|
||||||
|
{
|
||||||
|
float3 v0;
|
||||||
|
float3 v1;
|
||||||
|
float3 v2;
|
||||||
|
float3 v3;
|
||||||
|
float3 v4;
|
||||||
|
float3 v5;
|
||||||
|
};
|
||||||
|
|
||||||
Texture2D DiffuseGlow : register(t0);
|
Texture2D DiffuseGlow : register(t0);
|
||||||
Texture2D NormalSpec : register(t1);
|
Texture2D NormalSpec : register(t1);
|
||||||
Texture2D GUI : register(t2);
|
Texture2D GUI : register(t2);
|
||||||
|
|
|
@ -28,3 +28,8 @@ DiffSpec LightCalc(PointLight pl, float3 pos, int2 texCoord)
|
||||||
output.Specular = output.Specular * SpecCo;
|
output.Specular = output.Specular * SpecCo;
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool intersects(FrustrumPoints box, int Index)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -8,13 +8,85 @@
|
||||||
//Calc Ambience Done
|
//Calc Ambience Done
|
||||||
//Write Glow
|
//Write Glow
|
||||||
|
|
||||||
|
#define EXPAND 1024.0f
|
||||||
|
#define SHRINK 1.0f/EXPAND
|
||||||
|
#define UINT_MAX 0xFFFFFFFF
|
||||||
|
#define FLOAT_MAX 3.402823466e+38
|
||||||
|
#define BLOCKSIZE 16
|
||||||
|
#define NUMTHREADS BLOCKSIZE * BLOCKSIZE
|
||||||
|
#define MAXLIGHTS 100
|
||||||
|
|
||||||
[numthreads(16, 16, 1)]
|
|
||||||
void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID )
|
// -- Shared Memory ------------------------------------------------- //
|
||||||
|
|
||||||
|
groupshared uint iMinDepth = UINT_MAX,
|
||||||
|
iMaxDepth = 0;
|
||||||
|
groupshared uint numVisiblePointLights = 0,
|
||||||
|
visiblePointlightIndex[MAXLIGHTS];
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------ //
|
||||||
|
|
||||||
|
[numthreads(BLOCKSIZE, BLOCKSIZE, 1)]
|
||||||
|
void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID, uint GI : SV_GroupIndex )
|
||||||
{
|
{
|
||||||
float2 UV = DTid.xy / Pixels;
|
float2 UV = DTid.xy / Pixels;
|
||||||
UV.x = UV.x * 2 - 1;
|
UV.x = UV.x * 2 - 1;
|
||||||
UV.y = 1 - 2 * UV.y;
|
UV.y = 1 - 2 * UV.y;
|
||||||
|
|
||||||
|
float3 posN = float3(UV, DepthTexture[DTid.xy].x);
|
||||||
|
|
||||||
|
// store and load shared minDepth and maxDepth
|
||||||
|
float minDepth = 0.0f, maxDepth = 0.0f,
|
||||||
|
depth = posN.z;
|
||||||
|
{
|
||||||
|
uint uidepth = (uint)( depth * EXPAND);
|
||||||
|
InterlockedMin( iMinDepth, uidepth );
|
||||||
|
InterlockedMax( iMaxDepth, uidepth );
|
||||||
|
|
||||||
|
GroupMemoryBarrierWithGroupSync();
|
||||||
|
minDepth = (float)( iMinDepth ) * SHRINK;
|
||||||
|
maxDepth = (float)( iMaxDepth ) * SHRINK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Switching to LightCulling ------------------------------------- //
|
||||||
|
|
||||||
|
//define collision volume
|
||||||
|
float2 size = BLOCKSIZE / Pixels;
|
||||||
|
FrustrumPoints tile;
|
||||||
|
tile.v0 = float3(size * Gid,minDepth);
|
||||||
|
tile.v1 = float3(tile.v0.xy+size,maxDepth);
|
||||||
|
tile.v2 = float3(tile.v1.xy, minDepth);
|
||||||
|
tile.v3 = float3(tile.v0.x,tile.v1.y,minDepth);
|
||||||
|
tile.v4 = float3(tile.v1.x, tile.v0.y, minDepth);
|
||||||
|
tile.v5 = float3(tile.v0.xy, maxDepth);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// culling the tile's near and far to minDepth & maxDepth ( with tolerance )
|
||||||
|
|
||||||
|
|
||||||
|
uint numPass = (Lights + NUMTHREADS - 1) / NUMTHREADS;
|
||||||
|
numPass = min( numPass, MAXLIGHTS / NUMTHREADS );
|
||||||
|
|
||||||
|
for( uint passI = 0; passI < numPass; ++passI )
|
||||||
|
{
|
||||||
|
uint lightIndex = (passI * NUMTHREADS) + GI;
|
||||||
|
lightIndex = min( lightIndex, Lights );
|
||||||
|
|
||||||
|
if( lightIndex < Lights )
|
||||||
|
if( intersects(tile, lightIndex) )
|
||||||
|
{
|
||||||
|
uint offset;
|
||||||
|
InterlockedAdd( numVisiblePointLights, 1, offset );
|
||||||
|
visiblePointlightIndex[offset] = lightIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupMemoryBarrierWithGroupSync();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float3 ViewPos = ToVpos(DTid.xy, UV);
|
float3 ViewPos = ToVpos(DTid.xy, UV);
|
||||||
DiffSpec Shaded;
|
DiffSpec Shaded;
|
||||||
Shaded.Diffuse = float3(0,0,0);
|
Shaded.Diffuse = float3(0,0,0);
|
||||||
|
@ -47,7 +119,7 @@ void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID )
|
||||||
DepthBase = DepthBase /4;
|
DepthBase = DepthBase /4;
|
||||||
Ambient[DTid.xy/2] = float4(DiffBase.xyz, AmbValue);
|
Ambient[DTid.xy/2] = float4(DiffBase.xyz, AmbValue);
|
||||||
Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy];
|
Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy];
|
||||||
Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w /* * (2-DepthBase) */,DiffBase.w);
|
Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w ,DiffBase.w);
|
||||||
Ambient[DTid.xy/2 + Pixels/2] = float4(NormalSpec[DTid.xy].xyz * float3(1,1,-1),1);
|
Ambient[DTid.xy/2 + Pixels/2] = float4(NormalSpec[DTid.xy].xyz * float3(1,1,-1),1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue