Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions OpenGLEngine/OpenGLEngine/AddTorqueFromCameraComponent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct AddTorqueFromCameraComponent
{
AddTorqueFromCameraComponent(float _torqueScale = 10.0f)
: torqueScale(_torqueScale)
{

}
float torqueScale;
};
}
35 changes: 35 additions & 0 deletions OpenGLEngine/OpenGLEngine/AddTorqueFromCameraSystem.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "AddTorqueFromCameraSystem.h"
#include "LifeTimeComponent.h"

namespace Reality
{
AddTorqueFromCameraSystem::AddTorqueFromCameraSystem()
{
requireComponent<TransformComponentV2>();
requireComponent<ForceAndTorqueAccumulatorComponent>();
requireComponent<AddTorqueFromCameraComponent>();
}

void AddTorqueFromCameraSystem::Update(float deltaTime)
{
if (!pressed && glfwGetKey(getWorld().data.renderUtil->window->glfwWindow, GLFW_KEY_E) == GLFW_PRESS)
{
for (auto e : getEntities())
{
auto& transform = e.getComponent<TransformComponentV2>();
auto& forceAndTorqueAcc = e.getComponent<ForceAndTorqueAccumulatorComponent>();
auto& addTorqueComp = e.getComponent<AddTorqueFromCameraComponent>();

Camera& cam = getWorld().data.renderUtil->camera;

Vector3 torque = glm::cross(cam.Position - transform.GetPosition(), cam.Front * addTorqueComp.torqueScale);
forceAndTorqueAcc.AddTorque(torque);
}
pressed = true;
}
else if(glfwGetKey(getWorld().data.renderUtil->window->glfwWindow, GLFW_KEY_E) == GLFW_RELEASE)
{
pressed = false;
}
}
}
17 changes: 17 additions & 0 deletions OpenGLEngine/OpenGLEngine/AddTorqueFromCameraSystem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#pragma once
#include "ECSConfig.h"
#include "TransformComponentV2.h"
#include "ForceAndTorqueAccumulatorComponent.h"
#include "AddTorqueFromCameraComponent.h"

namespace Reality
{
class AddTorqueFromCameraSystem : public ECSSystem
{
public:
AddTorqueFromCameraSystem();
void Update(float deltaTime);
private:
bool pressed = false;
};
}
17 changes: 12 additions & 5 deletions OpenGLEngine/OpenGLEngine/AeroControlComponent.h
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
#pragma once
#include "ECSConfig.h"
#include <vector>

namespace Reality
{
struct AeroControlComponent
{
AeroControlComponent(std::vector<int> _positiveKeys = { GLFW_KEY_UP }, std::vector<int> _negetiveKeys = { GLFW_KEY_DOWN }, float _rate = 1)
:positiveKeys(_positiveKeys), negetiveKeys(_negetiveKeys), rate(_rate)
AeroControlComponent(Vector3 _aeroPlusOne = Vector3(0, 0, 0), Vector3 _aeroMinusOne = Vector3(0, 0, 0),
const std::vector<int>& _positiveKeys = {}, const std::vector<int>& _negetiveKeys = {},
float _controlSpeed = 1)
:aeroPlusOne(_aeroPlusOne),
aeroMinusOne(_aeroMinusOne),
positiveKeys(_positiveKeys),
negetiveKeys(_negetiveKeys),
controlSpeed(_controlSpeed)
{

}

Vector3 aeroPlusOne;
Vector3 aeroMinusOne;
std::vector<int> positiveKeys;
std::vector<int> negetiveKeys;
float rate;
float controlSetting = 0;
float controlSpeed;
};
}
39 changes: 25 additions & 14 deletions OpenGLEngine/OpenGLEngine/AeroControlSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,54 @@ namespace Reality
{
AeroControlSystem::AeroControlSystem()
{
requireComponent<AeroMinMaxComponent>();
requireComponent<AeroSurfaceComponent>();
requireComponent<AeroControlComponent>();
}

void AeroControlSystem::Update(float deltaTime)
{
pKey = false;
nKey = false;
for (auto e : getEntities())
{
auto& aero = e.getComponent<AeroMinMaxComponent>();
auto& surface = e.getComponent<AeroSurfaceComponent>();
auto& control = e.getComponent<AeroControlComponent>();

for (auto key : control.positiveKeys)
bool reset = true;

for (int key : control.positiveKeys)
{
if (glfwGetKey(getWorld().data.renderUtil->window->glfwWindow, key) == GLFW_PRESS)
{
aero.controlSetting += control.rate * deltaTime;
pKey = true;
control.controlSetting += control.controlSpeed * deltaTime;
reset = false;
}
}

for (auto key : control.negetiveKeys)

if (control.controlSetting > 1)
{
control.controlSetting = 1;
}

for (int key : control.negetiveKeys)
{
if (glfwGetKey(getWorld().data.renderUtil->window->glfwWindow, key) == GLFW_PRESS)
{
aero.controlSetting -= control.rate * deltaTime;
nKey = true;
control.controlSetting -= control.controlSpeed * deltaTime;
reset = false;
}
}

if (!pKey && !nKey)
if (control.controlSetting < -1)
{
control.controlSetting = -1;
}

if (reset)
{
aero.controlSetting = 0;
control.controlSetting = 0;
}

aero.controlSetting = glm::clamp(aero.controlSetting, -1.0f, 1.0f);
float t = (control.controlSetting + 1) * 0.5f;
surface.aerodynamicForce = t * control.aeroMinusOne + (1 - t) * control.aeroPlusOne;
}
}
}
5 changes: 1 addition & 4 deletions OpenGLEngine/OpenGLEngine/AeroControlSystem.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once
#include "ECSConfig.h"
#include "AeroMinMaxComponent.h"
#include "AeroSurfaceComponent.h"
#include "AeroControlComponent.h"

namespace Reality
Expand All @@ -10,8 +10,5 @@ namespace Reality
public:
AeroControlSystem();
void Update(float deltaTime);
private:
bool pKey = false;
bool nKey = false;
};
}
20 changes: 20 additions & 0 deletions OpenGLEngine/OpenGLEngine/AeroSurfaceComponent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct AeroSurfaceComponent
{
AeroSurfaceComponent(ECSEntity _targetEntity = ECSEntity(), Vector3 _aerodynamicForce = Vector3(0, 0, 0),
Vector3 _localOffset = Vector3(0, 0, 0))
:targetEntity(_targetEntity),
aerodynamicForce(_aerodynamicForce),
localOffset(_localOffset)
{

}
ECSEntity targetEntity;
Vector3 aerodynamicForce;
Vector3 localOffset;
};
}
48 changes: 48 additions & 0 deletions OpenGLEngine/OpenGLEngine/AeroSurfaceSystem.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include "AeroSurfaceSystem.h"
#include "RigidbodyComponent.h"
#include "ForceAndTorqueAccumulatorComponent.h"

namespace Reality
{
AeroSurfaceSystem::AeroSurfaceSystem()
{
requireComponent<TransformComponentV2>();
requireComponent<AeroSurfaceComponent>();
}

void AeroSurfaceSystem::Update(float deltaTime)
{
for (auto e : getEntities())
{
auto& surfaceTransform = e.getComponent<TransformComponentV2>();
auto& aero = e.getComponent<AeroSurfaceComponent>();

if (aero.targetEntity.hasComponent<TransformComponentV2>() &&
aero.targetEntity.hasComponent<RigidbodyComponent>() &&
aero.targetEntity.hasComponent<ForceAndTorqueAccumulatorComponent>())
{
auto& targetTransform = aero.targetEntity.getComponent<TransformComponentV2>();
auto& rigidbody = aero.targetEntity.getComponent<RigidbodyComponent>();
auto& forceAndTorque = aero.targetEntity.getComponent<ForceAndTorqueAccumulatorComponent>();

// HACK: For lack of scene graph
Vector3 worldSurfacePosition = targetTransform.LocalToWorldPosition(aero.localOffset);
surfaceTransform.SetPosition(worldSurfacePosition);
surfaceTransform.SetOrientation(targetTransform.GetOrientation());
getWorld().data.renderUtil->DrawCube(surfaceTransform.GetPosition(),
Vector3(1, 1, 1),
surfaceTransform.GetOrientation());

Vector3 force = CalculateWorldAerodynamicForce(aero.aerodynamicForce, targetTransform);
forceAndTorque.AddForceAtPoint(force,
surfaceTransform.GetPosition(),
targetTransform.GetPosition());
}
}
}

const Vector3 & AeroSurfaceSystem::CalculateWorldAerodynamicForce(const Vector3& localAeroForce, TransformComponentV2& transform)
{
return transform.LocalToWorldDirection(localAeroForce);
}
}
18 changes: 18 additions & 0 deletions OpenGLEngine/OpenGLEngine/AeroSurfaceSystem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once
#include "ECSConfig.h"
#include "TransformComponentV2.h"
#include "AeroSurfaceComponent.h"

namespace Reality
{
class AeroSurfaceSystem : public ECSSystem
{
public:
AeroSurfaceSystem();
void Update(float deltaTime);
Vector3 windVelocity = Vector3(0, 0, 0);
private:
const Vector3& CalculateWorldAerodynamicForce(const Vector3& localAeroForce,
TransformComponentV2& transform);
};
}
18 changes: 18 additions & 0 deletions OpenGLEngine/OpenGLEngine/BuoyancyCenter2Component.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct BuoyancyCenter2Component
{
BuoyancyCenter2Component(Vector3 _positionOffset = Vector3(0,0,0), float _maxDepth = 1.0f, float _volume = 1.0f)
: positionOffset(_positionOffset), maxDepth(_maxDepth), volume(_volume)
{

}

Vector3 positionOffset;
float maxDepth;
float volume;
};
}
18 changes: 18 additions & 0 deletions OpenGLEngine/OpenGLEngine/BuoyancyCenter3Component.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct BuoyancyCenter3Component
{
BuoyancyCenter3Component(Vector3 _positionOffset = Vector3(0, 0, 0), float _maxDepth = 1.0f, float _volume = 1.0f)
: positionOffset(_positionOffset), maxDepth(_maxDepth), volume(_volume)
{

}

Vector3 positionOffset;
float maxDepth;
float volume;
};
}
18 changes: 18 additions & 0 deletions OpenGLEngine/OpenGLEngine/BuoyancyCenter4Component.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct BuoyancyCenter4Component
{
BuoyancyCenter4Component(Vector3 _positionOffset = Vector3(0, 0, 0), float _maxDepth = 1.0f, float _volume = 1.0f)
: positionOffset(_positionOffset), maxDepth(_maxDepth), volume(_volume)
{

}

Vector3 positionOffset;
float maxDepth;
float volume;
};
}
18 changes: 18 additions & 0 deletions OpenGLEngine/OpenGLEngine/BuoyancyCenterComponent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct BuoyancyCenterComponent
{
BuoyancyCenterComponent(Vector3 _positionOffset = Vector3(0, 0, 0), float _maxDepth = 1.0f, float _volume = 1.0f)
: positionOffset(_positionOffset), maxDepth(_maxDepth), volume(_volume)
{

}

Vector3 positionOffset;
float maxDepth;
float volume;
};
}
14 changes: 12 additions & 2 deletions OpenGLEngine/OpenGLEngine/CableComponent.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
#pragma once
#include "ECSConfig.h"

namespace Reality
{
struct CableComponent
{
CableComponent(ECSEntity a = ECSEntity(), ECSEntity b = ECSEntity(), float _maxLength = 10, float _restitution = 1.0f)
: entityA(a), entityB(b), maxLength(_maxLength), restitution(_restitution){}
CableComponent(ECSEntity a = ECSEntity(),
ECSEntity b = ECSEntity(),
float _maxLength = 10,
float _restitution = 1)
: entityA(a),
entityB(b),
maxLength(_maxLength),
restitution(_restitution)
{

}
ECSEntity entityA;
ECSEntity entityB;
float maxLength;
Expand Down
Loading