From 2e688b9f62e88028f3452ac5971df3dba85be65b Mon Sep 17 00:00:00 2001 From: Fredrick Johansson Date: Thu, 20 Aug 2020 00:15:37 +0200 Subject: [PATCH] JAMSPOOK-18 - Implemented reset trigger - Implemented the reset trigger functionality --- assets/meshes/cube.bcosm | Bin 0 -> 1436 bytes assets/meshes/sprite-quad.f3d | Bin 212 -> 0 bytes assets/textures/trigger-diffuse.png | Bin 0 -> 5750 bytes src/JamSpookGame.cpp | 15 +- src/JamSpookGame.h | 1 + src/entities/KartFactory.cpp | 3 + src/entities/KartPhysicsComponent.cpp | 8 ++ src/entities/ResetTriggerFactory.cpp | 75 ++++++++++ src/entities/ResetTriggerFactory.h | 132 ++++++++++++++++++ src/entities/ResetTriggerPhysicsComponent.cpp | 50 +++++++ src/entities/ResetTriggerPhysicsComponent.h | 78 +++++++++++ 11 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 assets/meshes/cube.bcosm delete mode 100755 assets/meshes/sprite-quad.f3d create mode 100644 assets/textures/trigger-diffuse.png create mode 100644 src/entities/ResetTriggerFactory.cpp create mode 100644 src/entities/ResetTriggerFactory.h create mode 100644 src/entities/ResetTriggerPhysicsComponent.cpp create mode 100644 src/entities/ResetTriggerPhysicsComponent.h diff --git a/assets/meshes/cube.bcosm b/assets/meshes/cube.bcosm new file mode 100644 index 0000000000000000000000000000000000000000..489c023dfcfc7a5dce139ad86c11a75e99f5ed59 GIT binary patch literal 1436 zcmd^;F%H5o3`Je8zy%l>m^cFAC0aYQR=}Hl9$U{KHsB-tJ7x zoqF&||48p1%vbz1BU!`)|5S6)d+~0TKk$$An2F6m=WG6!Kjc9^>iZ0w|K9v{C!5iK zQjh+F_gDOx-+E8-AYZO|%iQWc(?8PZI)CxE{M1_weqUn!$<^EW`1`BNV^wIw(^V_oCJwK$u{aB-%XXt?%^5U-^&VKuQ&A8q<^OgCi{~Nv=Z{+|0 literal 0 HcmV?d00001 diff --git a/assets/meshes/sprite-quad.f3d b/assets/meshes/sprite-quad.f3d deleted file mode 100755 index b827a56391166683b260389c5848be107f7b450e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZQ%Kmaxb(;mp&58@X8thbL@bI}4J)c}(N(F`CtkQyxVVEs{NE?QvG4>JRo`5<|) OnIN-qm=Bi6W`yp^MU`cmXK)!ZFo-dGx;TbZ+TFL@7GaSfPWdu?n?FY$`;iLpKL@fy}C&lp5B!ZqpNeJlCB!V@tXqEm*%8L!4GM|*xO_J$A zvxzjEl)xCx>FAje94Uh!7DsdXpv~!{Nd#0FVH7i1;|rsC1I}6)dhry6q~%2+Y%Zgk z>BJjOLST&MbgY3zyEH<4ERN=MU|0>xoSuNyVFQrSN0SIzOe8RPfJCt7Y3!n-IUPN) z@T6mmz(UuX01AD|0~%rvjSR=*M#^1Iis7UL^k_~8B`kWSKT={5tQNyzc;c26!|@n{ f-Ad{kejt_cf-ctuw)$fo3_#%N>gTe~DWM4f%;_X* literal 0 HcmV?d00001 diff --git a/src/JamSpookGame.cpp b/src/JamSpookGame.cpp index d726af2..9b4562c 100644 --- a/src/JamSpookGame.cpp +++ b/src/JamSpookGame.cpp @@ -266,6 +266,19 @@ void JamSpookGame::set() goalFactory.reset(); + // Create the reset trigger + unique_ptr resetTriggerFactory = make_unique( + dynamic_pointer_cast(findSystem(IDCache::get("AssetSystem"))), + graphicsSystem, + dynamic_pointer_cast(findSystem(IDCache::get("PhysicsSystem"))), + renderLayerGame); + + resetTriggerFactory->createResetTrigger(vec3(-1, -30, -12), + vec3(1)); +// goalFactory->createGoal(vec3(0, 0, 0)); + + resetTriggerFactory.reset(); + // // Create the ball // unique_ptr ballFactory = make_unique(dynamic_pointer_cast(findSystem(IDCache::get("AssetSystem"))), // graphicsSystem, @@ -290,7 +303,7 @@ void JamSpookGame::set() renderLayerGame); kartFactory->createKart(vec3(0, 3, 0), // position - vec3(0, 0, 0)); // euler degrees rotation, XYZ + vec3(0, 180, 0)); // euler degrees rotation, XYZ kartFactory.reset(); diff --git a/src/JamSpookGame.h b/src/JamSpookGame.h index a018ac9..7da067b 100644 --- a/src/JamSpookGame.h +++ b/src/JamSpookGame.h @@ -66,6 +66,7 @@ #include "entities/BallFactory.h" #include "entities/BoxFactory.h" #include "entities/KartFactory.h" +#include "entities/ResetTriggerFactory.h" namespace JamSpook { diff --git a/src/entities/KartFactory.cpp b/src/entities/KartFactory.cpp index 4074f3a..7faf85b 100644 --- a/src/entities/KartFactory.cpp +++ b/src/entities/KartFactory.cpp @@ -107,6 +107,9 @@ shared_ptr KartFactory::createKart(const vec3 position, getShared(mInteractionSystem)); entity->addComponent(interactionComponent); + // Add position reset ICCR component +// ICCResponseComponent + // Return instance return entity; } diff --git a/src/entities/KartPhysicsComponent.cpp b/src/entities/KartPhysicsComponent.cpp index d649679..d2af911 100644 --- a/src/entities/KartPhysicsComponent.cpp +++ b/src/entities/KartPhysicsComponent.cpp @@ -80,6 +80,14 @@ void KartPhysicsComponent::onCollision(const string& tag) { ICCBroadcast(make_shared(IDCache::get("GroundCollisionMessage"))); } + + if (tag == "reset-trigger") + { +// ICCBroadcast(make_shared(IDCache::get("GroundCollisionMessage"))); + Log::write(LogLevel::debug, "KartPhysicsComponent - onCollision: reset-trigger"); + setPosition(vec3(0, 3, 0), true); + setOrientationEulerDegreesXYZ(vec3(0, 180, 0), true); + } } void KartPhysicsComponent::onSeparation(const string& tag) diff --git a/src/entities/ResetTriggerFactory.cpp b/src/entities/ResetTriggerFactory.cpp new file mode 100644 index 0000000..a80c8b5 --- /dev/null +++ b/src/entities/ResetTriggerFactory.cpp @@ -0,0 +1,75 @@ +/* + * ResetTriggerFactory.cpp + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#include "ResetTriggerFactory.h" + +namespace JamSpook { + +ResetTriggerFactory::ResetTriggerFactory(weak_ptr assetSystem, + weak_ptr graphicsSystem, + weak_ptr physicsSystem, + weak_ptr renderLayer): + mAssetSystem(assetSystem), + mGraphicsSystem(graphicsSystem), + mPhysicsSystem(physicsSystem), + mRenderLayer(renderLayer) +{} + +ResetTriggerFactory::~ResetTriggerFactory() +{} + +shared_ptr ResetTriggerFactory::createResetTrigger(const vec3 position, + const vec3 dimensions) +{ + // Create instance + shared_ptr entity = make_shared(); + entity->setEntityTag("reset-trigger"); + SceneGraph::addEntity(entity); + mat4 transform = translate(mat4(1), position); + + // Add physics component + ColliderFactory* colliderFactory = new ColliderFactory(mPhysicsSystem, mAssetSystem); + shared_ptr physicsComponent = + make_shared( + transform, + entity, + getShared(mPhysicsSystem), + getShared(mPhysicsSystem), + getShared(mPhysicsSystem), + colliderFactory->createBoxTriggerVolume(position, + quat(vec3(0,0,0)), + vec3(dimensions.x/2, dimensions.y/2, dimensions.z/2), + 1.0f, + entity, + entity->getEntityTag())); + delete colliderFactory; + // Note: Editing of rigid body params, maybe only has effect is it has been added to the world. + physicsComponent->getCollider()->getRigidBody()->setLinearFactor(btVector3(0, 0, 0)); // deny positional movement movement in any axis + physicsComponent->getCollider()->getRigidBody()->setAngularFactor(btVector3(0, 0, 0)); // deny rotational movement movement in any axis + physicsComponent->getCollider()->getRigidBody()->setRestitution(1); + entity->addComponent(physicsComponent); + + // Add graphics component + shared_ptr graphicsComponent = make_shared(transform, + entity, + getShared(mGraphicsSystem), + mRenderLayer); + entity->addComponent(graphicsComponent); + + // Add the ModelRenderable + ModelRenderableFactory* modelFactory = new ModelRenderableFactory(mAssetSystem); + shared_ptr modelRenderable = modelFactory->createModel("cube.bcosm", + "trigger-diffuse.png", + "cube-model"); + delete modelFactory; + graphicsComponent->addRenderable(modelRenderable); + + // Return instance + return entity; +} + +} // namespace JamSpook diff --git a/src/entities/ResetTriggerFactory.h b/src/entities/ResetTriggerFactory.h new file mode 100644 index 0000000..231bc58 --- /dev/null +++ b/src/entities/ResetTriggerFactory.h @@ -0,0 +1,132 @@ +/* + * ResetTriggerFactory.h + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#ifndef RESETTRIGGERFACTORY_H_ +#define RESETTRIGGERFACTORY_H_ + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ResetTriggerPhysicsComponent.h" + +namespace JamSpook { + +using std::string; +using std::shared_ptr; +using std::make_shared; +using std::weak_ptr; +using std::dynamic_pointer_cast; +using std::function; +using std::bind; +using std::vector; + +using glm::vec3; +using glm::mat4; +using glm::quat; +using glm::quat_cast; +using glm::translate; +using glm::scale; + +using ecos::utility::getShared; + +using ecos::core::IDCache; +using ecos::core::logging::Log; +using ecos::core::logging::LogLevel; +using ecos::core::BroadcastObservable; +using ecos::core::Message; +using ecos::core::Entity; +using ecos::core::SceneGraph; +using ecos::core::ICCResponseComponent; + +using ecos::asset::AssetSystem; +using ecos::asset::DataManagementMode; + +using ecos::graphics::GraphicsSystem; +using ecos::graphics::GraphicsComponent; +using ecos::graphics::RenderLayer; +using ecos::graphics::TextureFactory; +using ecos::graphics::Texture; +using ecos::graphics::ShaderType; +using ecos::graphics::ShaderAsset; +using ecos::graphics::ShaderProgram; +using ecos::graphics::ShaderProgramFactory; +using ecos::graphics::Material; +using ecos::graphics::MaterialFactory; +using ecos::graphics::Mesh; +using ecos::graphics::MeshFactory; +using ecos::graphics::ModelRenderableFactory; +using ecos::graphics::ModelRenderable; + +using ecos::physics::PhysicsSystem; +using ecos::physics::PhysicsComponent; +using ecos::physics::ColliderFactory; +using ecos::physics::Collider; + +/// Factory to simplify entity creation +class ResetTriggerFactory +{ +private: + weak_ptr mAssetSystem; + weak_ptr mGraphicsSystem; + weak_ptr mPhysicsSystem; + weak_ptr mRenderLayer; + +public: + ResetTriggerFactory(weak_ptr assetSystem, + weak_ptr graphicsSystem, + weak_ptr physicsSystem, + weak_ptr renderLayer); + virtual ~ResetTriggerFactory(); + + /// Compose a reset trigger entity + shared_ptr createResetTrigger(const vec3 position, + const vec3 dimensions); +}; + +} // namespace JamSpook + +#endif // RESETTRIGGERFACTORY_H_ diff --git a/src/entities/ResetTriggerPhysicsComponent.cpp b/src/entities/ResetTriggerPhysicsComponent.cpp new file mode 100644 index 0000000..dafe03d --- /dev/null +++ b/src/entities/ResetTriggerPhysicsComponent.cpp @@ -0,0 +1,50 @@ +/* + * ResetTriggerPhysicsComponent.cpp + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#include "ResetTriggerPhysicsComponent.h" + +namespace JamSpook { + +ResetTriggerPhysicsComponent::ResetTriggerPhysicsComponent(mat4 transform, + shared_ptr > > entity, + weak_ptr > physicsSystem, + weak_ptr > > physicsCollisionSubSystem, + weak_ptr > > physicsColliderQuerySubSystem, + shared_ptr collider): + PhysicsComponent(transform, + entity, + physicsSystem, + physicsCollisionSubSystem, + physicsColliderQuerySubSystem, + collider) +{} + +ResetTriggerPhysicsComponent::~ResetTriggerPhysicsComponent() +{} + +void ResetTriggerPhysicsComponent::update(const milliseconds dtms) +{ +// Log::write(LogLevel::trace, "CollectablePhysicsComponent - update"); + PhysicsComponent::update(dtms); +} + +void ResetTriggerPhysicsComponent::onICCMessage(shared_ptr message) +{ + PhysicsComponent::onICCMessage(message); +} + +void ResetTriggerPhysicsComponent::onCollision(const string& tag) +{ +// if (tag == "ground-plane") +// { +// vec3 position = getPosition(); +// setPosition(vec3(position.x, 10.0f, position.z)); +// ICCBroadcast(make_shared(IDCache::get("GroundContactMessage"))); +// } +} + +} // namespace JamSpook diff --git a/src/entities/ResetTriggerPhysicsComponent.h b/src/entities/ResetTriggerPhysicsComponent.h new file mode 100644 index 0000000..f6fc259 --- /dev/null +++ b/src/entities/ResetTriggerPhysicsComponent.h @@ -0,0 +1,78 @@ +/* + * ResetTriggerPhysicsComponent.h + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#ifndef RESETTRIGGERPHYSICSCOMPONENT_H_ +#define RESETTRIGGERPHYSICSCOMPONENT_H_ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace JamSpook { + +using std::chrono::milliseconds; +using std::weak_ptr; +using std::shared_ptr; +using std::make_shared; +using std::dynamic_pointer_cast; +using std::string; + +using glm::vec3; +using glm::mat4; +using glm::translate; +using glm::scale; + +using ecos::core::IDCache; +using ecos::core::logging::Log; +using ecos::core::logging::LogLevel; +using ecos::core::Message; +using ecos::core::BroadcastObservable; + +using ecos::physics::PhysicsSystem; +using ecos::physics::PhysicsComponent; +using ecos::physics::Collider; +using ecos::physics::TransformChangeMessage; +using ecos::physics::CollisionStateChangeMessage; +using ecos::physics::ColliderQueryMessage; + +/// +class ResetTriggerPhysicsComponent: + public PhysicsComponent +{ +public: + ResetTriggerPhysicsComponent(mat4 transform, + shared_ptr > > entity, + weak_ptr > physicsSystem, + weak_ptr > > physicsCollisionSubSystem, + weak_ptr > > physicsColliderQuerySubSystem, + shared_ptr collider); + virtual ~ResetTriggerPhysicsComponent(); + + virtual void update(const milliseconds dtms); + virtual void onICCMessage(shared_ptr message); + virtual void onCollision(const string& tag); +}; + +} // namespace JamSpook + +#endif // RESETTRIGGERPHYSICSCOMPONENT_H_