diff --git a/assets/meshes/cube.bcosm b/assets/meshes/cube.bcosm new file mode 100644 index 0000000..489c023 Binary files /dev/null and b/assets/meshes/cube.bcosm differ diff --git a/assets/meshes/sprite-quad.f3d b/assets/meshes/sprite-quad.f3d deleted file mode 100755 index b827a56..0000000 Binary files a/assets/meshes/sprite-quad.f3d and /dev/null differ diff --git a/assets/textures/trigger-diffuse.png b/assets/textures/trigger-diffuse.png new file mode 100644 index 0000000..628fe22 Binary files /dev/null and b/assets/textures/trigger-diffuse.png differ 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_