From 05757b6112ecfc98818ce8c523c4719084927a26 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Thu, 15 May 2014 19:30:44 +0200 Subject: [PATCH 01/10] assets --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 15ac025..9a3fcc2 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 15ac02523ad374b4aaf60a16db89b1934de7f303 +Subproject commit 9a3fcc241854a9fa5665ec4885c70adb8f29faa0 From 16d51c64c5a3bf68619e64e783acbf1fff525b82 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sat, 17 May 2014 00:56:38 +0200 Subject: [PATCH 02/10] Meh-ish helicopter physics --- src/Components/HelicopterSteering.h | 16 + src/Events/ApplyForce.h | 18 + src/GameWorld.cpp | 691 ++---------------- src/GameWorld.h | 1 + src/Systems/FreeSteeringSystem.cpp | 14 +- src/Systems/HelicopterSteeringSystem.cpp | 67 ++ src/Systems/HelicopterSteeringSystem.h | 54 ++ src/Systems/PhysicsSystem.cpp | 18 +- src/Systems/PhysicsSystem.h | 4 +- vs11/Returngeance/Returngeance.vcxproj | 4 + .../Returngeance/Returngeance.vcxproj.filters | 25 + 11 files changed, 259 insertions(+), 653 deletions(-) create mode 100644 src/Components/HelicopterSteering.h create mode 100644 src/Events/ApplyForce.h create mode 100644 src/Systems/HelicopterSteeringSystem.cpp create mode 100644 src/Systems/HelicopterSteeringSystem.h diff --git a/src/Components/HelicopterSteering.h b/src/Components/HelicopterSteering.h new file mode 100644 index 0000000..630ec67 --- /dev/null +++ b/src/Components/HelicopterSteering.h @@ -0,0 +1,16 @@ +#ifndef HelicopterSteering_h__ +#define HelicopterSteering_h__ + +#include "Component.h" + +namespace Components +{ + +struct HelicopterSteering : Component +{ + HelicopterSteering* Clone() const override { return new HelicopterSteering(*this); } +}; + +} + +#endif // HelicopterSteering_h__ \ No newline at end of file diff --git a/src/Events/ApplyForce.h b/src/Events/ApplyForce.h new file mode 100644 index 0000000..2008764 --- /dev/null +++ b/src/Events/ApplyForce.h @@ -0,0 +1,18 @@ +#ifndef Events_ApplyForce_h__ +#define Events_ApplyForce_h__ +#include "Entity.h" +#include "EventBroker.h" + +namespace Events +{ + +struct ApplyForce : Event +{ + EntityID Entity; + double DeltaTime; + glm::vec3 Force; +}; + +} + +#endif // Events_ApplyForce_h__ \ No newline at end of file diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index f0c5999..924922e 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -8,14 +8,25 @@ void GameWorld::Initialize() m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/Plane.obj"); m_ResourceManager.Preload("Model", "Models/Placeholders/PhysicsTest/ArrowCube.obj"); - BindKey(GLFW_KEY_W, "vertical", 1.f); - BindKey(GLFW_KEY_S, "vertical", -1.f); - BindKey(GLFW_KEY_A, "horizontal", -1.f); - BindKey(GLFW_KEY_D, "horizontal", 1.f); + BindKey(GLFW_KEY_W, "cam_vertical", 1.f); + BindKey(GLFW_KEY_S, "cam_vertical", -1.f); + BindKey(GLFW_KEY_A, "cam_horizontal", -1.f); + BindKey(GLFW_KEY_D, "cam_horizontal", 1.f); BindGamepadAxis(Gamepad::Axis::LeftX, "horizontal", 1.f); BindGamepadAxis(Gamepad::Axis::LeftY, "vertical", 1.f); + BindGamepadAxis(Gamepad::Axis::RightX, "horizontal", 1.f); + BindGamepadAxis(Gamepad::Axis::RightY, "vertical", 1.f); + BindGamepadAxis(Gamepad::Axis::RightTrigger, "normal", 1.f); + BindGamepadAxis(Gamepad::Axis::LeftTrigger, "normal", -1.f); + BindKey(GLFW_KEY_SPACE, "cam_normal", 1.f); + BindKey(GLFW_KEY_LEFT_CONTROL, "cam_normal", -1.f); - BindKey(GLFW_KEY_UP, "barrel_rotation", 1.f); + BindKey(GLFW_KEY_LEFT_SHIFT, "cam_speed", 1.f); + BindKey(GLFW_KEY_LEFT_ALT, "cam_speed", -1.f); + + BindMouseButton(GLFW_MOUSE_BUTTON_1, "cam_attack", 1.f); + + /*BindKey(GLFW_KEY_UP, "barrel_rotation", 1.f); BindKey(GLFW_KEY_DOWN, "barrel_rotation", -1.f); BindKey(GLFW_KEY_LEFT, "tower_rotation", -1.f); BindKey(GLFW_KEY_RIGHT, "tower_rotation", 1.f); @@ -25,8 +36,7 @@ void GameWorld::Initialize() BindKey(GLFW_KEY_SPACE, "handbrake", 1.f); BindGamepadButton(Gamepad::Button::A, "handbrake", 1.f); - BindKey(GLFW_KEY_Z, "shoot", 1.f); - BindGamepadAxis(Gamepad::Axis::RightTrigger, "shoot", 1.f); + BindKey(GLFW_KEY_Z, "shoot", 1.f);*/ //BindGamepadButton(Gamepad::Button::Up, "Gamepad::Button::Up", 1.f); //BindGamepadButton(Gamepad::Button::Down, "Gamepad::Button::Down", 1.f); @@ -45,17 +55,7 @@ void GameWorld::Initialize() RegisterComponents(); - //{ - // auto camera = CreateEntity(); - // auto transform = AddComponent(camera, "Transform"); - // transform->Position.z = 20.f; - // transform->Position.y = 20.f; - // //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); - // auto cameraComp = AddComponent(camera, "Camera"); - // cameraComp->FarClip = 2000.f; - // auto freeSteering = AddComponent(camera, "FreeSteering"); - // CommitEntity(camera); - //} + { @@ -78,646 +78,55 @@ void GameWorld::Initialize() auto meshShape = AddComponent(groundshape, "MeshShape"); meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; //meshShape->ResourceName = "Models/TestScene/testScene.obj"; - CommitEntity(groundshape); CommitEntity(ground); } - - - /*{ - auto jeep = CreateEntity(); - auto transform = AddComponent(jeep, "Transform"); - transform->Position = glm::vec3(0, 5, 0); - transform->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(0, 1, 0)); - auto physics = AddComponent(jeep, "Physics"); - physics->Mass = 1800; - physics->Static = false; - auto vehicle = AddComponent(jeep, "Vehicle"); - AddComponent(jeep, "Input"); - - { - auto shape = CreateEntity(jeep); - auto transform = AddComponent(shape, "Transform"); - auto meshShape = AddComponent(shape, "MeshShape"); - meshShape->ResourceName = "Models/Jeep/Chassi/ChassiCollision.obj"; - CommitEntity(shape); - - // auto box = AddComponent(jeep, "Box"); - // box->Width = 1.487f; - // box->Height = 0.727f; - // box->Depth = 2.594f; - - } - - { - auto chassis = CreateEntity(jeep); - auto transform = AddComponent(chassis, "Transform"); - transform->Position = glm::vec3(0, 0, 0); // 0.6577f - auto model = AddComponent(chassis, "Model"); - model->ModelFile = "Models/Jeep/Chassi/chassi.obj"; - } - - { - auto lightentity = CreateEntity(jeep); - auto transform = AddComponent(lightentity, "Transform"); - transform->Position = glm::vec3(0, 15, 0); - auto light = AddComponent(lightentity, "PointLight"); - light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); - light->Specular = glm::vec3(1.f); - light->constantAttenuation = 0.3f; - light->linearAttenuation = 0.003f; - light->quadraticAttenuation = 0.002f; - } - - - //Create wheels - float wheelOffset = 0.4f; - float springLength = 0.3f; - float suspensionStrength = 35.f; - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(1.9f, 0.5546f - wheelOffset, -0.9242f); - transform->Scale = glm::vec3(1.0f); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 50; - Wheel->Radius = 0.837f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-1.9f, 0.5546f - wheelOffset, -0.9242f); - transform->Scale = glm::vec3(1.0f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 50; - Wheel->Radius = 0.837f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(0.2726f, 0.2805f - wheelOffset, 1.9307f); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 50; - Wheel->Radius = 0.737f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(jeep); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-0.2726f, 0.2805f - wheelOffset, 1.9307f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 50; - Wheel->Radius = 0.737f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - CommitEntity(wheel); - } - - CommitEntity(jeep); - }*/ - - + auto heli = CreateEntity(); { - auto tank = CreateEntity(); - auto transform = AddComponent(tank, "Transform"); - transform->Position = glm::vec3(0, 5, 0); - //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); - auto physics = AddComponent(tank, "Physics"); - physics->Mass = 45000; - physics->Static = false; - auto vehicle = AddComponent(tank, "Vehicle"); - vehicle->MaxTorque = 5200.f; - AddComponent(tank, "TankSteering"); - AddComponent(tank, "Input"); - { - auto shape = CreateEntity(tank); - auto transform = AddComponent(shape, "Transform"); - auto meshShape = AddComponent(shape, "MeshShape"); - meshShape->ResourceName = "Models/Tank/Fix/ChassiCollision.obj"; - CommitEntity(shape); - - // auto box = AddComponent(jeep, "Box"); - // box->Width = 1.487f; - // box->Height = 0.727f; - // box->Depth = 2.594f; - + auto transform = AddComponent(heli, "Transform"); + transform->Position = glm::vec3(0.f, 3.f, 10.f); + auto physics = AddComponent(heli, "Physics"); + physics->Mass = 3000; + auto heliComponent = AddComponent(heli, "HelicopterSteering"); } + auto model = CreateEntity(heli); { - auto chassis = CreateEntity(tank); - auto transform = AddComponent(chassis, "Transform"); - transform->Position = glm::vec3(0, 0, 0); - auto model = AddComponent(chassis, "Model"); - model->ModelFile = "Models/Tank/Fix/Chassi.obj"; + auto transform = AddComponent(model, "Transform"); + transform->Orientation = glm::quat(glm::vec3(0, -glm::pi()/2.f, 0.f)); + auto modelComponent = AddComponent(model, "Model"); + modelComponent->ModelFile = "Models/Heli/Chassi/Chassi.obj"; } + CommitEntity(model); + + auto shape = CreateEntity(heli); { - auto tower = CreateEntity(tank); - SetProperty(tower, "Name", "tower"); - auto transform = AddComponent(tower, "Transform"); - transform->Position = glm::vec3(0.f, 1.2f, 1.8f); - auto model = AddComponent(tower, "Model"); - model->ModelFile = "Models/Tank/Fix/Top.obj"; - auto towerSteering = AddComponent(tower, "TowerSteering"); - towerSteering->Axis = glm::vec3(0.f, 1.f, 0.f); - towerSteering->TurnSpeed = glm::pi()/4.f; - { - auto barrel = CreateEntity(tower); - auto transform = AddComponent(barrel, "Transform"); - transform->Position = glm::vec3(-0.018f, -0.2, -1.3f); - auto model = AddComponent(barrel, "Model"); - model->ModelFile = "Models/Tank/Fix/Barrel.obj"; - auto barrelSteering = AddComponent(barrel, "BarrelSteering"); - barrelSteering->Axis = glm::vec3(1.f, 0.f, 0.f); - barrelSteering->TurnSpeed = glm::pi()/4.f; - barrelSteering->ShotSpeed = 70.f; - { - auto shot = CreateEntity(barrel); - auto transform = AddComponent(shot, "Transform"); - transform->Position = glm::vec3(0.35f, 0.f, -2.f); - transform->Orientation = glm::angleAxis(-glm::pi()/2.f, glm::vec3(1, 0, 0)); - transform->Scale = glm::vec3(3.f); - AddComponent(shot, "Template"); - auto physics = AddComponent(shot, "Physics"); - physics->Mass = 10.f; - physics->Static = false; - auto modelComponent = AddComponent(shot, "Model"); - modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; - - { - auto shape = CreateEntity(shot); - auto transform = AddComponent(shape, "Transform"); - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.5f; - boxShape->Height = 0.5f; - boxShape->Depth = 0.5f; - CommitEntity(shape); - } - CommitEntity(shot); - barrelSteering->ShotTemplate = shot; - } - CommitEntity(barrel); - } - - { - auto camera = CreateEntity(tower); - auto transform = AddComponent(camera, "Transform"); - transform->Position.z = 30.f; - transform->Position.y = 5.f; - //transform->Orientation = glm::quat(glm::vec3(-glm::pi() / 8.f, 0.f, 0.f)); - transform->Orientation = glm::angleAxis(glm::pi() / 100, glm::vec3(1, 0, 0)); - auto cameraComp = AddComponent(camera, "Camera"); - cameraComp->FarClip = 2000.f; - AddComponent(camera, "Input"); - //auto freeSteering = AddComponent(camera, "FreeSteering"); - CommitEntity(camera); - } + auto transform = AddComponent(shape, "Transform"); + auto box = AddComponent(shape, "BoxShape"); + box->Width = 5.f; + box->Height = 1.8f; + box->Depth = 7.f; } + CommitEntity(shape); - { - auto lightentity = CreateEntity(tank); - auto transform = AddComponent(lightentity, "Transform"); - transform->Position = glm::vec3(0, 0, 0); - auto light = AddComponent(lightentity, "PointLight"); - //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); - //light->Specular = glm::vec3(1.f); - /*light->ConstantAttenuation = 0.3f; - light->LinearAttenuation = 0.003f; - light->QuadraticAttenuation = 0.002f;*/ - } - -// auto wheelpair = CreateEntity(tank); -// SetProperty(wheelpair, "Name", "WheelPair"); -// AddComponent(wheelpair, "WheelPairThingy"); - - //Create wheels - float wheelOffset = 0.4f; - float springLength = 0.3f; - float suspensionStrength = 25.f; - - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, -2.6f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, -0.83f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - - - //Back - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 1.f); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 2.95f); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - - auto entity = CreateEntity(tank); - auto transformComponent = AddComponent(entity, "Transform"); - transformComponent->Position = glm::vec3(2,-1.7,2.0); - transformComponent->Scale = glm::vec3(3,3,3); - transformComponent->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)); - auto emitterComponent = AddComponent(entity, "ParticleEmitter"); - emitterComponent->SpawnCount = 2; - emitterComponent->SpawnFrequency = 0.005; - emitterComponent->SpreadAngle = glm::pi(); - emitterComponent->UseGoalVelocity = false; - emitterComponent->LifeTime = 0.5; - //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); - emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); - CommitEntity(entity); - - auto particleEntity = CreateEntity(entity); - auto TEMP = AddComponent(particleEntity, "Transform"); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity, "Sprite"); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - emitterComponent->ParticleTemplate = particleEntity; - - CommitEntity(particleEntity); - } - - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 1.f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel, "Transform"); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 2.95f); - auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel, "Wheel"); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 1; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape, "Transform"); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape, "BoxShape"); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } - CommitEntity(wheel); - - auto entity = CreateEntity(tank); - auto transformComponent = AddComponent(entity, "Transform"); - transformComponent->Position = glm::vec3(-2,-1.7,2.0); - transformComponent->Scale = glm::vec3(3,3,3); - transformComponent->Orientation = glm::angleAxis(glm::pi()/2, glm::vec3(1,0,0)); - auto emitterComponent = AddComponent(entity, "ParticleEmitter"); - emitterComponent->SpawnCount = 2; - emitterComponent->SpawnFrequency = 0.005; - emitterComponent->SpreadAngle = glm::pi(); - emitterComponent->UseGoalVelocity = false; - emitterComponent->LifeTime = 0.5; - //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); - emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); - CommitEntity(entity); - - auto particleEntity = CreateEntity(entity); - auto TEMP = AddComponent(particleEntity, "Transform"); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity, "Sprite"); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - emitterComponent->ParticleTemplate = particleEntity; - - CommitEntity(particleEntity); - } - - CommitEntity(tank); + } + CommitEntity(heli); - - - /* - for(int i = 0; i < 10; i++) - { - auto entity = CreateEntity(); - auto transform = AddComponent(entity, "Transform"); - transform->Position = glm::vec3(30 + i*0.1f, 0 + i*0.1f, 10 + i*0.1f); - transform->Scale = glm::vec3(0); - transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); - - std::stringstream ss; - ss << "Models/Placeholders/ShatterTest/" << i+1 << ".obj"; - - auto model = AddComponent(entity, "Model"); - model->ModelFile = ss.str(); - - auto physics = AddComponent(entity, "Physics"); - physics->Mass = 100; - physics->Static = true; - auto meshShape = AddComponent(entity, "MeshShape"); - meshShape->ResourceName = ss.str(); - - CommitEntity(entity); - }*/ - - for(int i = 0; i < 1; i++) + auto camera = CreateEntity(heli); { - for (int y = 0; y < 15; y++) - { - for (int x = -5; x < 5; x++) - { - auto brick = CreateEntity(); - auto transform = AddComponent(brick, "Transform"); - transform->Position = glm::vec3(x + 0.01f, y * 0.3f + 0.01f, -20); - transform->Position.x += (y % 2)*0.5f; - transform->Scale = glm::vec3(1, 0.3f, 0.4f); - transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); - auto model = AddComponent(brick, "Model"); - model->ModelFile = "Models/Placeholders/PhysicsTest/Cube2.obj"; - - auto physics = AddComponent(brick, "Physics"); - physics->Mass = 3; - - - - auto shape = CreateEntity(brick); - auto transformshape = AddComponent(shape, "Transform"); - auto box = AddComponent(shape, "BoxShape"); - box->Width = 0.5f; - box->Height = 0.15f; - box->Depth = 0.3f; - CommitEntity(shape); - CommitEntity(brick); - } - } + auto transform = AddComponent(camera, "Transform"); + transform->Position.z = 10.f; + transform->Position.y = 5.f; + //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); + auto cameraComp = AddComponent(camera, "Camera"); + cameraComp->FarClip = 2000.f; + auto freeSteering = AddComponent(camera, "FreeSteering"); + CommitEntity(camera); } - - /*for (int x = 0; x < 5; x++) - for (int y = 0; y < 5; y++) - { - auto cube = CreateEntity(); - auto transform = AddComponent(cube, "Transform"); - transform->Position = glm::vec3(3 * x + 0.1f + -20.f, 3 * y + 0.1f + 1.f, 0); - transform->Scale = glm::vec3(3); - transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); - auto model = AddComponent(cube, "Model"); - model->ModelFile = "Models/Placeholders/PhysicsTest/Cube2.obj"; - - auto physics = AddComponent(cube, "Physics"); - physics->Mass = 100; - auto box = AddComponent(cube, "BoxShape"); - box->Width = 1.5f; - box->Height = 1.5f; - box->Depth = 1.5f; - CommitEntity(cube); - } -*/ - - - /*{ - auto entity = CreateEntity(); - AddComponent(entity, "Transform"); - auto emitter = AddComponent(entity, "SoundEmitter"); - emitter->Path = "Sounds/korvring.wav"; - emitter->Loop = true; - GetSystem("SoundSystem")->PlaySound(emitter); - CommitEntity(entity); - }*/ - } void GameWorld::Update(double dt) @@ -742,6 +151,7 @@ void GameWorld::RegisterSystems() //m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); }); m_SystemFactory.Register("FreeSteeringSystem", [this]() { return new Systems::FreeSteeringSystem(this, m_EventBroker); }); m_SystemFactory.Register("TankSteeringSystem", [this]() { return new Systems::TankSteeringSystem(this, m_EventBroker); }); + m_SystemFactory.Register("HelicopterSteeringSystem", [this]() { return new Systems::HelicopterSteeringSystem(this, m_EventBroker); }); m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this, m_EventBroker); }); m_SystemFactory.Register("PhysicsSystem", [this]() { return new Systems::PhysicsSystem(this, m_EventBroker); }); m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_EventBroker, m_Renderer); }); @@ -758,6 +168,7 @@ void GameWorld::AddSystems() //AddSystem("PlayerSystem"); AddSystem("FreeSteeringSystem"); AddSystem("TankSteeringSystem"); + AddSystem("HelicopterSteeringSystem"); AddSystem("SoundSystem"); AddSystem("PhysicsSystem"); AddSystem("RenderSystem"); diff --git a/src/GameWorld.h b/src/GameWorld.h index 7235e25..952f002 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -13,6 +13,7 @@ //#include "Systems/PlayerSystem.h" #include "Systems/FreeSteeringSystem.h" #include "Systems/TankSteeringSystem.h" +#include "Systems/HelicopterSteeringSystem.h" #include "Systems/RenderSystem.h" #include "Systems/SoundSystem.h" #include "Systems/PhysicsSystem.h" diff --git a/src/Systems/FreeSteeringSystem.cpp b/src/Systems/FreeSteeringSystem.cpp index edf24d0..c5ed953 100755 --- a/src/Systems/FreeSteeringSystem.cpp +++ b/src/Systems/FreeSteeringSystem.cpp @@ -60,27 +60,27 @@ void Systems::FreeSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit bool Systems::FreeSteeringSystem::FreeSteeringInputController::OnCommand(const Events::InputCommand &event) { // Movement - if (event.Command == "vertical") + if (event.Command == "cam_vertical") { Movement.z = -event.Value; } - else if (event.Command == "horizontal") + else if (event.Command == "cam_horizontal") { Movement.x = event.Value; } - else if (event.Command == "normal") + else if (event.Command == "cam_normal") { Movement.y = event.Value; } // Speed - else if (event.Command == "speed") + else if (event.Command == "cam_speed") { SpeedMultiplier = event.Value; } // Mouse click - else if (event.Command == "attack") + else if (event.Command == "cam_attack") { OrientationActive = event.Value > 0; @@ -96,11 +96,11 @@ bool Systems::FreeSteeringSystem::FreeSteeringInputController::OnCommand(const E } } - else if (event.Command == "vertical2") + else if (event.Command == "cam_vertical2") { ControllerOrientation.x = event.Value; } - else if (event.Command == "horizontal2") + else if (event.Command == "cam_horizontal2") { ControllerOrientation.y = -event.Value; } diff --git a/src/Systems/HelicopterSteeringSystem.cpp b/src/Systems/HelicopterSteeringSystem.cpp new file mode 100644 index 0000000..7fd9661 --- /dev/null +++ b/src/Systems/HelicopterSteeringSystem.cpp @@ -0,0 +1,67 @@ +#include "PrecompiledHeader.h" +#include "HelicopterSteeringSystem.h" +#include "World.h" + +void Systems::HelicopterSteeringSystem::RegisterComponents(ComponentFactory* cf) +{ + cf->Register("HelicopterSteering", []() { return new Components::HelicopterSteering(); }); +} + +void Systems::HelicopterSteeringSystem::Initialize() +{ + m_InputController = std::unique_ptr(new HelicopterSteeringInputController(EventBroker)); +} + +void Systems::HelicopterSteeringSystem::Update(double dt) +{ + +} + +void Systems::HelicopterSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto transform = m_World->GetComponent(entity, "Transform"); + if (!transform) + return; + + auto helicopterComponent = m_World->GetComponent(entity, "HelicopterSteering"); + if (helicopterComponent) + { + glm::vec3 controllerRotationEuler = m_InputController->Rotation * (float)dt; + transform->Orientation *= glm::quat(controllerRotationEuler); + + Events::ApplyForce e; + e.Entity = entity; + e.DeltaTime = dt; + e.Force = glm::normalize(transform->Orientation * glm::vec3(0, 1, 0)) * (m_InputController->Power * 3000.f * 9.82f * 8.f); + EventBroker->Publish(e); + } +} + +bool Systems::HelicopterSteeringSystem::HelicopterSteeringInputController::OnCommand(const Events::InputCommand &event) +{ + if (event.Command == "horizontal") + { + Rotation.z = -event.Value; + } + else if (event.Command == "vertical") + { + Rotation.x = -event.Value; + } + + else if (event.Command == "normal") + { + Power = event.Value; + } + + return true; +} + +bool Systems::HelicopterSteeringSystem::HelicopterSteeringInputController::OnMouseMove(const Events::MouseMove &event) +{ + return true; +} + +void Systems::HelicopterSteeringSystem::HelicopterSteeringInputController::Update(double dt) +{ + +} diff --git a/src/Systems/HelicopterSteeringSystem.h b/src/Systems/HelicopterSteeringSystem.h new file mode 100644 index 0000000..ed91096 --- /dev/null +++ b/src/Systems/HelicopterSteeringSystem.h @@ -0,0 +1,54 @@ +#include "System.h" +#include "Components/Transform.h" +#include "Components/HelicopterSteering.h" +#include "Events/SetVelocity.h" +#include "Events/ApplyForce.h" +#include "InputController.h" + +namespace Systems +{ + +class HelicopterSteeringSystem : public System +{ +public: + HelicopterSteeringSystem(World* world, std::shared_ptr<::EventBroker> eventBroker) + : System(world, eventBroker) { } + + void RegisterComponents(ComponentFactory* cf) override; + void Initialize() override; + + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + +private: + class HelicopterSteeringInputController; + std::unique_ptr m_InputController; + + std::map m_TimeSinceLastShot; +}; + +class HelicopterSteeringSystem::HelicopterSteeringInputController : InputController +{ +public: + HelicopterSteeringInputController(std::shared_ptr<::EventBroker> eventBroker) + : InputController(eventBroker) + , Power(0.f) + { } + + float Power; + glm::vec3 Rotation; + + void Update(double dt); + +protected: + bool OnCommand(const Events::InputCommand &event) override; + bool OnMouseMove(const Events::MouseMove &event) override; + + +}; + + + + + +} \ No newline at end of file diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 8efa4bb..e9bc69c 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -32,6 +32,7 @@ void Systems::PhysicsSystem::Initialize() // Events EVENT_SUBSCRIBE_MEMBER(m_ETankSteer, &Systems::PhysicsSystem::OnTankSteer); EVENT_SUBSCRIBE_MEMBER(m_ESetVelocity, &Systems::PhysicsSystem::OnSetVelocity); + EVENT_SUBSCRIBE_MEMBER(m_EApplyForce, &Systems::PhysicsSystem::OnApplyForce); hkMemorySystem::FrameInfo finfo(6000 * 1024); // Allocate 6MB of Physics solver buffer hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault(hkMallocAllocator::m_defaultMallocAllocator, finfo); @@ -160,7 +161,7 @@ void Systems::PhysicsSystem::Update(double dt) m_Accumulator += dt; while (m_Accumulator >= timestep) { - m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); + hkpStepResult stepresult = m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); //m_PhysicsWorld->stepDeltaTime(timestep); m_Accumulator -= timestep; @@ -172,10 +173,7 @@ void Systems::PhysicsSystem::Update(double dt) // Clear accumulated timer data in this thread and all slave threads hkMonitorStream::getInstance().reset(); m_ThreadPool->clearTimerData(); - } - - - + } } void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -586,5 +584,15 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) m_PhysicsWorld->markForWrite(); m_RigidBodies[event.Entity]->setLinearVelocity(ConvertPosition(event.Velocity)); m_PhysicsWorld->unmarkForWrite(); + + return true; +} + +bool Systems::PhysicsSystem::OnApplyForce(const Events::ApplyForce &event) +{ + m_PhysicsWorld->markForWrite(); + m_RigidBodies[event.Entity]->applyForce(event.DeltaTime, ConvertPosition(event.Force)); + m_PhysicsWorld->unmarkForWrite(); + return true; } diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index 7b2d259..8670cae 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -15,6 +15,7 @@ #include "Components/TowerSteering.h" #include "Events/TankSteer.h" #include "Events/SetVelocity.h" +#include "Events/ApplyForce.h" #include "OBJ.h" // Math and base include @@ -85,9 +86,10 @@ private: // Events EventRelay m_ETankSteer; bool OnTankSteer(const Events::TankSteer &event); - EventRelay m_ESetVelocity; bool OnSetVelocity(const Events::SetVelocity &event); + EventRelay m_EApplyForce; + bool OnApplyForce(const Events::ApplyForce &event); void SetUpPhysicsState(EntityID entity, EntityID parent); void TearDownPhysicsState(EntityID entity, EntityID parent); diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 9849fc0..4681962 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -111,6 +111,7 @@ + @@ -131,6 +132,7 @@ + @@ -152,6 +154,7 @@ + @@ -188,6 +191,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 49cc263..22eb9ea 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -63,6 +63,7 @@ Physics\Systems + @@ -137,6 +138,21 @@ {42ae084f-ade8-402c-87ba-f03f6b846bc8} + + {5b992473-73e6-485e-8f13-17e0801fb2ca} + + + {8a78be3a-a3c5-4054-a2f1-1456f3fcbab0} + + + {8ccc0abe-5bdd-4656-ab11-5708a39c71ae} + + + {b2416d05-a49e-4fef-a5c4-cd03d8cc2efd} + + + {b34c0c95-a887-4cf4-af24-cf7c1f459aa8} + @@ -356,6 +372,15 @@ Input\Events + + Gameplay\Vehicles\Helicopter\Components + + + Gameplay\Vehicles\Helicopter\Systems + + + Physics\Events + From 4d15d3e02ce1eb40de13c40c234a77b6ba81c09b Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sat, 17 May 2014 18:06:56 +0200 Subject: [PATCH 03/10] Collision callbacks --- src/Components/Health.h | 21 ++++++++++++++++ src/GameWorld.cpp | 2 +- src/Systems/PhysicsSystem.cpp | 11 +++++++- src/Systems/PhysicsSystem.h | 25 ++++++++++++++++--- vs11/Returngeance/Returngeance.vcxproj | 1 + .../Returngeance/Returngeance.vcxproj.filters | 3 +++ 6 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/Components/Health.h diff --git a/src/Components/Health.h b/src/Components/Health.h new file mode 100644 index 0000000..5100aaf --- /dev/null +++ b/src/Components/Health.h @@ -0,0 +1,21 @@ +#ifndef Components_Health_h__ +#define Components_Health_h__ + +#include "Component.h" + +namespace Components +{ + + struct Health : Component + { + Health() + : health(1.0f){ } + + float health; + + virtual Health* Clone() const override { return new Health(*this); } + }; + +} + +#endif // Components_Health_h__ diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 9e48cf7..e9f5327 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -340,7 +340,7 @@ void GameWorld::Initialize() //Create wheels float wheelOffset = 0.4f; float springLength = 0.3f; - float suspensionStrength = 25.f; + float suspensionStrength = 15.f; { auto wheel = CreateEntity(tank); diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 8efa4bb..51420d3 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -27,6 +27,8 @@ void Systems::PhysicsSystem::Initialize() { + + m_Accumulator = 0; // Events @@ -102,6 +104,8 @@ void Systems::PhysicsSystem::Initialize() SetupVisualDebugger(m_Context); m_PhysicsWorld->unmarkForWrite(); + + m_collisionResolution = new MyCollisionResolution; } } @@ -324,9 +328,11 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) m_PhysicsWorld->markForWrite(); vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels); // Add the vehicle's entities and phantoms to the world + rigidBody->addContactListener( m_collisionResolution ); m_Vehicles[entity]->addToWorld(m_PhysicsWorld); - m_RigidBodies[entity] = rigidBody; + m_collisionResolution->m_RigidBodies[rigidBody] = entity; + // The vehicle is an action m_PhysicsWorld->addAction(m_Vehicles[entity]); @@ -340,8 +346,10 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) else { m_PhysicsWorld->markForWrite(); + rigidBody->addContactListener( m_collisionResolution ); m_PhysicsWorld->addEntity(rigidBody); m_RigidBodies[entity] = rigidBody; + m_collisionResolution->m_RigidBodies[rigidBody] = entity; m_PhysicsWorld->unmarkForWrite(); shape->removeReference(); @@ -394,6 +402,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) m_PhysicsWorld->markForWrite(); m_PhysicsWorld->addEntity(rigidBody); m_RigidBodies[entity] = rigidBody; + m_collisionResolution->m_RigidBodies[rigidBody] = entity; m_PhysicsWorld->unmarkForWrite(); shape->removeReference(); diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index 7b2d259..ef7cb70 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -60,9 +60,27 @@ #include "Physics/VehicleSetup.h" #include + +#include + +class MyCollisionResolution: public hkReferencedObject, public hkpContactListener +{ +public: + std::unordered_map m_RigidBodies; + + virtual void contactPointCallback( const hkpContactPointEvent& event ) + { + + EntityID entity1 = m_RigidBodies[event.getBody(0)]; + EntityID entity2 = m_RigidBodies[event.getBody(1)]; + LOG_INFO("Entities colliding: %i, %i ", entity1, entity2); + + } +}; + + namespace Systems { - class PhysicsSystem : public System { public: @@ -77,7 +95,7 @@ public: void OnComponentCreated(std::string type, std::shared_ptr component) override; void OnComponentRemoved(std::string type, Component* component) override; void OnEntityCommit(EntityID entity) override; - + private: double m_Accumulator; hkpWorld* m_PhysicsWorld; @@ -145,8 +163,9 @@ private: hkpMoppBvTreeShape* MoppShape; }; std::unordered_map m_ExtendedMeshShapes; + + MyCollisionResolution* m_collisionResolution; }; } - #endif // PhysicsSystem_h__ diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 6ccecc9..96c8e85 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -131,6 +131,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 641fa8f..70213c2 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -352,6 +352,9 @@ Input\Events + + Physics\Components + From a8ecacab11e3d60555738ae3c5fbb965d5fb8aa0 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sat, 17 May 2014 18:45:54 +0200 Subject: [PATCH 04/10] tank steering --- src/GameWorld.cpp | 3 ++- src/Physics/VehicleSetup.cpp | 2 +- src/Physics/VehicleSetup.h | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index e9f5327..5cc997c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -248,6 +248,7 @@ void GameWorld::Initialize() physics->Static = false; auto vehicle = AddComponent(tank, "Vehicle"); vehicle->MaxTorque = 5200.f; + vehicle->MaxSteeringAngle = 90.f; AddComponent(tank, "TankSteering"); AddComponent(tank, "Input"); @@ -445,7 +446,7 @@ void GameWorld::Initialize() Wheel->AxleID = 0; Wheel->Mass = 2000; Wheel->Radius = 0.6f; - Wheel->Steering = false; + Wheel->Steering = true; Wheel->SuspensionStrength = suspensionStrength; Wheel->Friction = 4.f; Wheel->ConnectedToHandbrake = true; diff --git a/src/Physics/VehicleSetup.cpp b/src/Physics/VehicleSetup.cpp index 90e65dc..7d3610a 100644 --- a/src/Physics/VehicleSetup.cpp +++ b/src/Physics/VehicleSetup.cpp @@ -22,7 +22,7 @@ void VehicleSetup::buildVehicle(World *world, const hkpWorld* physicsWorld, hkpV // vehicle.m_data = new hkpVehicleData; vehicle.m_driverInput = new hkpVehicleDefaultAnalogDriverInput; - vehicle.m_steering = new hkpVehicleDefaultSteering; + vehicle.m_steering = new TankSteering; vehicle.m_engine = new hkpVehicleDefaultEngine; vehicle.m_transmission = new hkpVehicleDefaultTransmission; vehicle.m_brake = new hkpVehicleDefaultBrake; diff --git a/src/Physics/VehicleSetup.h b/src/Physics/VehicleSetup.h index 7f78204..bf75840 100644 --- a/src/Physics/VehicleSetup.h +++ b/src/Physics/VehicleSetup.h @@ -33,6 +33,32 @@ #include "Components/Wheel.h" #include "Components/Transform.h" + +/// Tank specific steering implementation. Rear wheels steer in opposite direction +/// to front wheels. +class TankSteering: public hkpVehicleDefaultSteering +{ +public: + virtual void calcSteering(const hkReal deltaTime, const hkpVehicleInstance* vehicle, const hkpVehicleDriverInput::FilteredDriverInputOutput& filteredInfoOutput, SteeringAnglesOutput& steeringOutput ) + { + hkpVehicleDefaultSteering::calcMainSteeringAngle( deltaTime, vehicle, filteredInfoOutput, steeringOutput ); + + // Wheels. + for (int w_it = 0; w_it < m_doesWheelSteer.getSize(); w_it++) + { + if ( m_doesWheelSteer[w_it] ) + { + steeringOutput.m_wheelsSteeringAngle [w_it] = steeringOutput.m_mainSteeringAngle; + } + else + { + // Steer with front and back wheels to simulate a tank. + steeringOutput.m_wheelsSteeringAngle [w_it] = -steeringOutput.m_mainSteeringAngle; + } + } + } +}; + class VehicleSetup { public: From fd0bb18bd33877d43c9f166a9cc1eb83992e49d5 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sun, 18 May 2014 21:07:03 +0200 Subject: [PATCH 05/10] tank stuff --- src/GameWorld.cpp | 3 ++- src/Systems/PhysicsSystem.h | 2 +- src/Systems/TankSteeringSystem.cpp | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index ca9dff4..fa338f2 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -222,11 +222,12 @@ void GameWorld::Initialize() transform->Position = glm::vec3(0, 5, 0); //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); auto physics = AddComponent(tank); - physics->Mass = 45000; + physics->Mass = 25000; physics->Static = false; auto vehicle = AddComponent(tank); vehicle->MaxTorque = 5200.f; vehicle->MaxSteeringAngle = 90.f; + vehicle->MaxSpeedFullSteeringAngle = 4.f; AddComponent(tank); AddComponent(tank); diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index ef7cb70..0ff2bda 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -73,7 +73,7 @@ public: EntityID entity1 = m_RigidBodies[event.getBody(0)]; EntityID entity2 = m_RigidBodies[event.getBody(1)]; - LOG_INFO("Entities colliding: %i, %i ", entity1, entity2); + //LOG_INFO("Entities colliding: %i, %i ", entity1, entity2); } }; diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index dca3441..8a67039 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -87,6 +87,7 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E if (event.Command == "horizontal") { m_Horizontal = val; + m_Vertical = -0.4f; } else if (event.Command == "vertical") { From 02243beceec2a5469965019c313e931e195c6723 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sun, 18 May 2014 23:54:01 +0200 Subject: [PATCH 06/10] Recoil while firing, clamp inputs, merge Helicopter --- src/Events/ApplyPointImpulse.h | 18 +++++++++++++++ src/GameWorld.cpp | 4 ++-- src/InputManager.cpp | 13 +++++++++++ src/Systems/HelicopterSteeringSystem.cpp | 6 ++--- src/Systems/PhysicsSystem.cpp | 12 +++++++++- src/Systems/PhysicsSystem.h | 3 +++ src/Systems/TankSteeringSystem.cpp | 22 ++++++++++++++++++- src/Systems/TankSteeringSystem.h | 3 +++ vs11/Returngeance/Returngeance.vcxproj | 3 ++- .../Returngeance/Returngeance.vcxproj.filters | 8 ++++++- 10 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 src/Events/ApplyPointImpulse.h diff --git a/src/Events/ApplyPointImpulse.h b/src/Events/ApplyPointImpulse.h new file mode 100644 index 0000000..a02745b --- /dev/null +++ b/src/Events/ApplyPointImpulse.h @@ -0,0 +1,18 @@ +#ifndef Events_ApplyPointImpulse_h__ +#define Events_ApplyPointImpulse_h__ +#include "Entity.h" +#include "EventBroker.h" + +namespace Events +{ + + struct ApplyPointImpulse : Event + { + EntityID Entity; + glm::vec3 Position; + glm::vec3 Impulse; + }; + +} + +#endif // Events_ApplyPointImpulse_h__ \ No newline at end of file diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index fa338f2..f0484be 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -222,7 +222,7 @@ void GameWorld::Initialize() transform->Position = glm::vec3(0, 5, 0); //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); auto physics = AddComponent(tank); - physics->Mass = 25000; + physics->Mass = 63000 - 16000; physics->Static = false; auto vehicle = AddComponent(tank); vehicle->MaxTorque = 5200.f; @@ -280,7 +280,7 @@ void GameWorld::Initialize() transform->Scale = glm::vec3(3.f); AddComponent(shot); auto physics = AddComponent(shot); - physics->Mass = 10.f; + physics->Mass = 25.f; physics->Static = false; auto modelComponent = AddComponent(shot); modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; diff --git a/src/InputManager.cpp b/src/InputManager.cpp index edbb736..f4e81e2 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -97,6 +97,19 @@ void InputManager::Update(double dt) dwResult = XInputGetState(i, &state); if (dwResult == 0) { + if(std::abs(state.Gamepad.sThumbLX) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) + state.Gamepad.sThumbLX = 0; + if(std::abs(state.Gamepad.sThumbLY) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) + state.Gamepad.sThumbLY = 0; + if(std::abs(state.Gamepad.sThumbRX) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) + state.Gamepad.sThumbRX = 0; + if(std::abs(state.Gamepad.sThumbRY) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) + state.Gamepad.sThumbRY = 0; + if(std::abs(state.Gamepad.bLeftTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) + state.Gamepad.bLeftTrigger = 0; + if(std::abs(state.Gamepad.bRightTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) + state.Gamepad.bRightTrigger = 0; + m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftX)] = state.Gamepad.sThumbLX / 32767.f; m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftY)] = state.Gamepad.sThumbLY / 32767.f; m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightX)] = state.Gamepad.sThumbRX / 32767.f; diff --git a/src/Systems/HelicopterSteeringSystem.cpp b/src/Systems/HelicopterSteeringSystem.cpp index 7fd9661..94431c2 100644 --- a/src/Systems/HelicopterSteeringSystem.cpp +++ b/src/Systems/HelicopterSteeringSystem.cpp @@ -4,7 +4,7 @@ void Systems::HelicopterSteeringSystem::RegisterComponents(ComponentFactory* cf) { - cf->Register("HelicopterSteering", []() { return new Components::HelicopterSteering(); }); + cf->Register([]() { return new Components::HelicopterSteering(); }); } void Systems::HelicopterSteeringSystem::Initialize() @@ -19,11 +19,11 @@ void Systems::HelicopterSteeringSystem::Update(double dt) void Systems::HelicopterSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - auto transform = m_World->GetComponent(entity, "Transform"); + auto transform = m_World->GetComponent(entity); if (!transform) return; - auto helicopterComponent = m_World->GetComponent(entity, "HelicopterSteering"); + auto helicopterComponent = m_World->GetComponent(entity); if (helicopterComponent) { glm::vec3 controllerRotationEuler = m_InputController->Rotation * (float)dt; diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index c8ccc6d..c8a899b 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -35,7 +35,8 @@ void Systems::PhysicsSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_ETankSteer, &Systems::PhysicsSystem::OnTankSteer); EVENT_SUBSCRIBE_MEMBER(m_ESetVelocity, &Systems::PhysicsSystem::OnSetVelocity); EVENT_SUBSCRIBE_MEMBER(m_EApplyForce, &Systems::PhysicsSystem::OnApplyForce); - + EVENT_SUBSCRIBE_MEMBER(m_EApplyPointImpulse, &Systems::PhysicsSystem::OnApplyPointImpulse); + hkMemorySystem::FrameInfo finfo(6000 * 1024); // Allocate 6MB of Physics solver buffer hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault(hkMallocAllocator::m_defaultMallocAllocator, finfo); hkBaseSystem::init(memoryRouter, HavokErrorReport); @@ -605,3 +606,12 @@ bool Systems::PhysicsSystem::OnApplyForce(const Events::ApplyForce &event) return true; } + +bool Systems::PhysicsSystem::OnApplyPointImpulse( const Events::ApplyPointImpulse &event ) +{ + m_PhysicsWorld->markForWrite(); + m_RigidBodies[event.Entity]->applyPointImpulse(ConvertPosition(event.Impulse), ConvertPosition(event.Position)); + m_PhysicsWorld->unmarkForWrite(); + + return true; +} diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index 2e0230d..ac73310 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -16,6 +16,7 @@ #include "Events/TankSteer.h" #include "Events/SetVelocity.h" #include "Events/ApplyForce.h" +#include "Events/ApplyPointImpulse.h" #include "OBJ.h" // Math and base include @@ -108,6 +109,8 @@ private: bool OnSetVelocity(const Events::SetVelocity &event); EventRelay m_EApplyForce; bool OnApplyForce(const Events::ApplyForce &event); + EventRelay m_EApplyPointImpulse; + bool OnApplyPointImpulse(const Events::ApplyPointImpulse &event); void SetUpPhysicsState(EntityID entity, EntityID parent); void TearDownPhysicsState(EntityID entity, EntityID parent); diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index 8a67039..7755f1e 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -62,6 +62,17 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit e.Velocity = absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed); EventBroker->Publish(e); m_TimeSinceLastShot[entity] = 0; + + + auto clonePhysicsComponent = m_World->GetComponent(clone); + //1,670m/s + //25kg + EntityID baseParent = m_World->GetEntityBaseParent(entity); + Events::ApplyPointImpulse ePointImpulse ; + ePointImpulse.Entity = baseParent; + ePointImpulse.Position = absoluteTransform.Position; + ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 1670.f; + EventBroker->Publish(ePointImpulse); } m_TimeSinceLastShot[entity] += dt; @@ -83,7 +94,16 @@ void Systems::TankSteeringSystem::TowerSteeringInputController::Update( double d bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const Events::InputCommand &event) { - float val = event.Value; + float val; + if(abs(event.Value) < 0.3f) + { + val = 0.f; + } + else + { + val = event.Value; + } + if (event.Command == "horizontal") { m_Horizontal = val; diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index d264325..65c0bfc 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -3,10 +3,13 @@ #include "System.h" #include "Events/TankSteer.h" #include "Events/SetVelocity.h" +#include "Events/ApplyForce.h" +#include "Events/ApplyPointImpulse.h" #include "Components/Transform.h" #include "Components/TankSteering.h" #include "Components/TowerSteering.h" #include "Components/BarrelSteering.h" +#include "Components/Physics.h" #include "Components/Vehicle.h" #include "Systems/TransformSystem.h" #include "InputController.h" diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 250e3db..e3cc2e4 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -60,7 +60,7 @@ false Default ProgramDatabase - MaxSpeed + Disabled true @@ -156,6 +156,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index bdab530..3dd634b 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -63,7 +63,9 @@ Physics\Systems - + + Gameplay\Vehicles\Helicopter\Systems + @@ -383,6 +385,10 @@ Physics\Events + + + Physics\Events + From f14a83caa8a2c813140bec6494364edd32f3275a Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sun, 18 May 2014 23:59:18 +0200 Subject: [PATCH 07/10] Assets --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 9a3fcc2..0a8ad2b 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 9a3fcc241854a9fa5665ec4885c70adb8f29faa0 +Subproject commit 0a8ad2bc62fd926d1e26eb20094474c59fd278f7 From 998ee3cfabd8b69b28694d6cd22a0619e92baa99 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Mon, 19 May 2014 00:58:48 +0200 Subject: [PATCH 08/10] Brakes working --- assets | 2 +- src/Components/Wheel.h | 2 +- src/GameWorld.cpp | 18 +++++++++--------- src/Physics/VehicleSetup.cpp | 2 +- src/Systems/PhysicsSystem.cpp | 4 ++++ src/Systems/TankSteeringSystem.cpp | 11 ++--------- 6 files changed, 18 insertions(+), 21 deletions(-) diff --git a/assets b/assets index 0a8ad2b..9d3f71b 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 0a8ad2bc62fd926d1e26eb20094474c59fd278f7 +Subproject commit 9d3f71bee6e0a930a4bd265eca3f5fceac619709 diff --git a/src/Components/Wheel.h b/src/Components/Wheel.h index be3638b..4a6a66d 100644 --- a/src/Components/Wheel.h +++ b/src/Components/Wheel.h @@ -14,7 +14,7 @@ struct Wheel : Component Wheel() : AxleID(0), Radius(0), Width(0), Mass(0), Steering(false), DownDirection(glm::vec3(0, -1, 0)), Friction(1.5f), SlipAngle(0.0f), - MaxBreakingTorque(1500.0f), ConnectedToHandbrake(false), SuspensionStrength(50.0f), TorqueRatio(0.25f) { } + MaxBreakingTorque(50000.f), ConnectedToHandbrake(false), SuspensionStrength(50.0f), TorqueRatio(0.25f) { } // The Hardpoint MUST be positioned INSIDE the chassis. glm::vec3 Hardpoint; diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index f0484be..86eb104 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -225,7 +225,7 @@ void GameWorld::Initialize() physics->Mass = 63000 - 16000; physics->Static = false; auto vehicle = AddComponent(tank); - vehicle->MaxTorque = 5200.f; + vehicle->MaxTorque = 8000.f; vehicle->MaxSteeringAngle = 90.f; vehicle->MaxSpeedFullSteeringAngle = 4.f; AddComponent(tank); @@ -350,7 +350,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = true; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -380,7 +380,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = false; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -411,7 +411,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = true; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -441,7 +441,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = true; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -473,7 +473,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = false; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -502,7 +502,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = false; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -557,7 +557,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = false; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; @@ -586,7 +586,7 @@ void GameWorld::Initialize() Wheel->Radius = 0.6f; Wheel->Steering = false; Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; + Wheel->Friction = 3.f; Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; diff --git a/src/Physics/VehicleSetup.cpp b/src/Physics/VehicleSetup.cpp index 59c3f07..e319834 100644 --- a/src/Physics/VehicleSetup.cpp +++ b/src/Physics/VehicleSetup.cpp @@ -201,7 +201,7 @@ void VehicleSetup::setupComponent(const hkpVehicleData& data, hkpVehicleDefaultT transmission.m_upshiftRPM = 7000.0f; transmission.m_clutchDelayTime = 0.0f; - transmission.m_reverseGearRatio = 1.2f; + transmission.m_reverseGearRatio = 1.0f; transmission.m_gearsRatio[0] = 3.0f; transmission.m_gearsRatio[1] = 2.25f; transmission.m_gearsRatio[2] = 1.5f; diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index c8a899b..c5aa34a 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -582,6 +582,10 @@ bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus; deviceStatus->m_positionX = event.PositionX; deviceStatus->m_positionY = event.PositionY; + if(event.PositionY > 0) + { + deviceStatus->m_reverseButtonPressed = true; + } deviceStatus->m_handbrakeButtonPressed = event.Handbrake; m_PhysicsWorld->unmarkForWrite(); } diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index 7755f1e..99cd4bd 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -94,15 +94,8 @@ void Systems::TankSteeringSystem::TowerSteeringInputController::Update( double d bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const Events::InputCommand &event) { - float val; - if(abs(event.Value) < 0.3f) - { - val = 0.f; - } - else - { - val = event.Value; - } + + float val = event.Value; if (event.Command == "horizontal") { From 7f77db97a0466607094e7ba410a915966ecf8519 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Mon, 19 May 2014 19:59:17 +0200 Subject: [PATCH 09/10] Convert functions working in debug --- src/Systems/PhysicsSystem.cpp | 85 ++++++++++------------------------- src/Systems/PhysicsSystem.h | 20 ++++----- 2 files changed, 34 insertions(+), 71 deletions(-) diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index c5aa34a..f4de197 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -146,13 +146,13 @@ void Systems::PhysicsSystem::Update(double dt) if (parent) { auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - position = ConvertPosition(absoluteTransform.Position); - rotation = ConvertRotation(absoluteTransform.Orientation); + position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position); + rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation); } else { - position = ConvertPosition(transformComponent->Position); - rotation = ConvertRotation(transformComponent->Orientation); + position = GLMVEC3_TO_HKVECTOR4(transformComponent->Position); + rotation = GLMQUAT_TO_HKQUATERNION(transformComponent->Orientation); } m_PhysicsWorld->markForWrite(); m_RigidBodies[entity]->setPositionAndRotation(position, rotation); @@ -166,8 +166,8 @@ void Systems::PhysicsSystem::Update(double dt) m_Accumulator += dt; while (m_Accumulator >= timestep) { - hkpStepResult stepresult = m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); - //m_PhysicsWorld->stepDeltaTime(timestep); + //hkpStepResult stepresult = m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); + m_PhysicsWorld->stepDeltaTime(timestep); m_Accumulator -= timestep; @@ -204,7 +204,7 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p hkQuaternion steeringOrientation = m_Vehicles[car]->m_wheelsInfo[wheelComponent->ID].m_steeringOrientationChassisSpace; hkReal spinAngle = -m_Vehicles[car]->m_wheelsInfo[wheelComponent->ID].m_spinAngle; - glm::quat orientation = ConvertRotation(steeringOrientation) * glm::angleAxis(spinAngle, glm::vec3(1, 0, 0)); + glm::quat orientation = HKQUATERNION_TO_GLMQUAT(steeringOrientation) * glm::angleAxis(spinAngle, glm::vec3(1, 0, 0)); transformComponent->Orientation = orientation * wheelComponent->OriginalOrientation; m_PhysicsWorld->unmarkForWrite(); } @@ -213,8 +213,8 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p { auto transformComponentParent = m_World->GetComponent(parent); - transformComponent->Position = ConvertPosition(m_RigidBodies[entity]->getPosition()); - transformComponent->Orientation = ConvertRotation(m_RigidBodies[entity]->getRotation()); + transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition()); + transformComponent->Orientation = HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation()); // TODO: No support for Scale, MIGHT be possible if (transformComponentParent) @@ -277,13 +277,9 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) hkpListShape* listShape = new hkpListShape(shapeArray.begin(), shapeArray.getSize(), hkpShapeContainer::REFERENCE_POLICY_INCREMENT); // Save the listShape for further use m_ListShapes[entity] = listShape; - shape = listShape; - - ////////////////////////////////// - //******************************// - // Add a hkpBvShape // - //******************************// - ////////////////////////////////// + //shape = listShape; + hkpBoxShape* box = new hkpBoxShape(listShape->m_aabbHalfExtents, 0.0f); + shape = new hkpBvShape(listShape, box); // Clean up for less memory usage m_Shapes.erase(entity); @@ -296,8 +292,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) rigidBodyInfo.m_shape = shape; rigidBodyInfo.m_motionType = hkpMotion::MOTION_DYNAMIC; auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - hkVector4 position = ConvertPosition(absoluteTransform.Position); - hkQuaternion rotation = ConvertRotation(absoluteTransform.Orientation); + hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position); + hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation); rigidBodyInfo.m_position.set(position(0), position(1), position(2), position(3)); rigidBodyInfo.m_rotation.set(rotation(0), rotation(1), rotation(2), rotation(3)); @@ -366,9 +362,9 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) auto childTransformComponent = m_World->GetComponent(shapeData.Entity); - hkVector4 position = ConvertPosition(childTransformComponent->Position); - hkQuaternion rotation = ConvertRotation(childTransformComponent->Orientation); - hkVector4 scale = ConvertScale(childTransformComponent->Scale); + hkVector4 position = GLMVEC3_TO_HKVECTOR4(childTransformComponent->Position); + hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(childTransformComponent->Orientation); + hkVector4 scale = GLMVEC3_TO_HKVECTOR4(childTransformComponent->Scale); hkQsTransform transform(position, rotation, scale); staticCompoundShape->addInstance(shapeData.Shape, transform); @@ -386,8 +382,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) rigidBodyInfo.m_shape = shape; rigidBodyInfo.m_motionType = hkpMotion::MOTION_FIXED; auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - hkVector4 position = ConvertPosition(absoluteTransform.Position); - hkQuaternion rotation = ConvertRotation(absoluteTransform.Orientation); + hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position); + hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation); rigidBodyInfo.m_position.set(position(0), position(1), position(2), position(3)); rigidBodyInfo.m_rotation.set(rotation(0), rotation(1), rotation(2), rotation(3)); @@ -419,7 +415,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) { hkpSphereShape* sphereShape = new hkpSphereShape(sphereComponent->Radius); - hkQsTransform transform( ConvertPosition(transformComponent->Position), ConvertRotation(transformComponent->Orientation), ConvertScale(transformComponent->Scale)); + hkQsTransform transform( GLMVEC3_TO_HKVECTOR4(transformComponent->Position), GLMQUAT_TO_HKQUATERNION(transformComponent->Orientation), GLMVEC3_TO_HKVECTOR4(transformComponent->Scale)); hkpConvexTransformShape* transformedSphereShape = new hkpConvexTransformShape( sphereShape, transform ); m_Shapes[entityParent].push_back(ShapeArrayData(entity, transformedSphereShape)); @@ -432,7 +428,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) hkReal thickness = 0.05; hkpBoxShape* boxShape = new hkpBoxShape(hkVector4(boxComponent->Width- thickness, boxComponent->Height -thickness, boxComponent->Depth - thickness), thickness); - hkQsTransform transform( ConvertPosition(transformComponent->Position), ConvertRotation(transformComponent->Orientation), ConvertScale(transformComponent->Scale)); + hkQsTransform transform( GLMVEC3_TO_HKVECTOR4(transformComponent->Position), GLMQUAT_TO_HKQUATERNION(transformComponent->Orientation), GLMVEC3_TO_HKVECTOR4(transformComponent->Scale)); hkpConvexTransformShape* transformedBoxShape = new hkpConvexTransformShape( boxShape, transform ); m_Shapes[entityParent].push_back(ShapeArrayData(entity, transformedBoxShape)); boxShape->removeReference(); @@ -540,39 +536,6 @@ void HK_CALL Systems::PhysicsSystem::HavokErrorReport(const char* msg, void*) LOG_INFO("%s", msg); } - -glm::vec3 Systems::PhysicsSystem::ConvertPosition(const hkVector4 &hkPosition) -{ - return glm::vec3(hkPosition(0), hkPosition(1), hkPosition(2)); -} - -const hkVector4& Systems::PhysicsSystem::ConvertPosition(glm::vec3 glmPosition) -{ - return hkVector4( glmPosition.x, glmPosition.y, glmPosition.z); -} - -glm::quat Systems::PhysicsSystem::ConvertRotation(const hkQuaternion &hkRotation) -{ - return glm::quat(hkRotation(3), hkRotation(0), hkRotation(1), hkRotation(2)); -} - -const hkQuaternion& Systems::PhysicsSystem::ConvertRotation(glm::quat glmRotation) -{ - hkQuaternion quat = hkQuaternion(glmRotation.x, glmRotation.y, glmRotation.z, glmRotation.w); - quat.normalize(); - return quat; -} - -glm::vec3 Systems::PhysicsSystem::ConvertScale(const hkVector4 &hkScale) -{ - return glm::vec3(hkScale(0), hkScale(1), hkScale(2)); -} - -const hkVector4& Systems::PhysicsSystem::ConvertScale(glm::vec3 glmScale) -{ - return hkVector4(glmScale.x, glmScale.y, glmScale.z); -} - bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) { auto vehicleComponent = m_World->GetComponent(event.Entity); @@ -596,7 +559,7 @@ bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) { m_PhysicsWorld->markForWrite(); - m_RigidBodies[event.Entity]->setLinearVelocity(ConvertPosition(event.Velocity)); + m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity)); m_PhysicsWorld->unmarkForWrite(); return true; @@ -605,7 +568,7 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) bool Systems::PhysicsSystem::OnApplyForce(const Events::ApplyForce &event) { m_PhysicsWorld->markForWrite(); - m_RigidBodies[event.Entity]->applyForce(event.DeltaTime, ConvertPosition(event.Force)); + m_RigidBodies[event.Entity]->applyForce(event.DeltaTime, GLMVEC3_TO_HKVECTOR4(event.Force)); m_PhysicsWorld->unmarkForWrite(); return true; @@ -614,7 +577,7 @@ bool Systems::PhysicsSystem::OnApplyForce(const Events::ApplyForce &event) bool Systems::PhysicsSystem::OnApplyPointImpulse( const Events::ApplyPointImpulse &event ) { m_PhysicsWorld->markForWrite(); - m_RigidBodies[event.Entity]->applyPointImpulse(ConvertPosition(event.Impulse), ConvertPosition(event.Position)); + m_RigidBodies[event.Entity]->applyPointImpulse(GLMVEC3_TO_HKVECTOR4(event.Impulse), GLMVEC3_TO_HKVECTOR4(event.Position)); m_PhysicsWorld->unmarkForWrite(); return true; diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index ac73310..54e61f7 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -1,6 +1,16 @@ #ifndef PhysicsSystem_h__ #define PhysicsSystem_h__ +#define HKVECTOR4_TO_GLMVEC3(hkvec) \ + glm::vec3(hkvec(0), hkvec(1), hkvec(2)) +#define GLMVEC3_TO_HKVECTOR4(glmvec) \ + hkVector4(glmvec.x, glmvec.y, glmvec.z) + +#define HKQUATERNION_TO_GLMQUAT(gkquat) \ + glm::quat(gkquat(3), gkquat(0), gkquat(1), gkquat(2)) +#define GLMQUAT_TO_HKQUATERNION(glmquat) \ + hkQuaternion(glmquat.x, glmquat.y, glmquat.z, glmquat.w) + #include "System.h" #include "Systems/TransformSystem.h" #include "Components/Transform.h" @@ -121,16 +131,6 @@ private: static void HK_CALL HavokErrorReport(const char* msg, void*); void SetupPhysics(hkpWorld* physicsWorld); - // Converterfunctions - glm::vec3 ConvertPosition(const hkVector4 &hkPosition); - const hkVector4& ConvertPosition(glm::vec3 glmPosition); - - glm::quat ConvertRotation(const hkQuaternion &hkRotation); - const hkQuaternion& ConvertRotation(glm::quat glmRotation); - - glm::vec3 ConvertScale(const hkVector4 &hkScale); - const hkVector4&ConvertScale(glm::vec3 glmScale); - std::unordered_map m_RigidBodies; hkJobThreadPool* m_ThreadPool; From ec74d700be55565beac8aa27dca5e96dc2b42d10 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Mon, 19 May 2014 21:57:13 +0200 Subject: [PATCH 10/10] fix --- src/Systems/PhysicsSystem.cpp | 9 ++------- src/Systems/TankSteeringSystem.cpp | 11 +++++------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index f4de197..03aade8 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -166,8 +166,8 @@ void Systems::PhysicsSystem::Update(double dt) m_Accumulator += dt; while (m_Accumulator >= timestep) { - //hkpStepResult stepresult = m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); - m_PhysicsWorld->stepDeltaTime(timestep); + m_PhysicsWorld->stepMultithreaded(m_JobQueue, m_ThreadPool, timestep); + //m_PhysicsWorld->stepDeltaTime(timestep); m_Accumulator -= timestep; @@ -541,7 +541,6 @@ bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) auto vehicleComponent = m_World->GetComponent(event.Entity); if (vehicleComponent && m_Vehicles.find(event.Entity) != m_Vehicles.end() && m_RigidBodies.find(event.Entity) != m_RigidBodies.end()) { - m_PhysicsWorld->markForWrite(); hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus; deviceStatus->m_positionX = event.PositionX; deviceStatus->m_positionY = event.PositionY; @@ -550,7 +549,6 @@ bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) deviceStatus->m_reverseButtonPressed = true; } deviceStatus->m_handbrakeButtonPressed = event.Handbrake; - m_PhysicsWorld->unmarkForWrite(); } return true; @@ -561,7 +559,6 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) m_PhysicsWorld->markForWrite(); m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity)); m_PhysicsWorld->unmarkForWrite(); - return true; } @@ -570,7 +567,6 @@ bool Systems::PhysicsSystem::OnApplyForce(const Events::ApplyForce &event) m_PhysicsWorld->markForWrite(); m_RigidBodies[event.Entity]->applyForce(event.DeltaTime, GLMVEC3_TO_HKVECTOR4(event.Force)); m_PhysicsWorld->unmarkForWrite(); - return true; } @@ -579,6 +575,5 @@ bool Systems::PhysicsSystem::OnApplyPointImpulse( const Events::ApplyPointImpuls m_PhysicsWorld->markForWrite(); m_RigidBodies[event.Entity]->applyPointImpulse(GLMVEC3_TO_HKVECTOR4(event.Impulse), GLMVEC3_TO_HKVECTOR4(event.Position)); m_PhysicsWorld->unmarkForWrite(); - return true; } diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index 99cd4bd..11c48fe 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -24,6 +24,9 @@ void Systems::TankSteeringSystem::Update(double dt) void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { auto tankSteeringComponent = m_World->GetComponent(entity); + auto towerSteeringComponent = m_World->GetComponent(entity); + auto barrelSteeringComponent = m_World->GetComponent(entity); + if(tankSteeringComponent) { Events::TankSteer e; @@ -33,17 +36,13 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit e.Handbrake = m_TankInputController->Handbrake; EventBroker->Publish(e); } - - auto towerSteeringComponent = m_World->GetComponent(entity); - if(towerSteeringComponent) + else if(towerSteeringComponent) { auto transformComponent = m_World->GetComponent(entity); glm::quat orientation = glm::angleAxis(towerSteeringComponent->TurnSpeed * m_TowerInputController->TowerDirection * (float)dt, towerSteeringComponent->Axis); transformComponent->Orientation *= orientation; } - - auto barrelSteeringComponent = m_World->GetComponent(entity); - if(barrelSteeringComponent) + else if(barrelSteeringComponent) { auto transformComponent = m_World->GetComponent(entity); auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity);