CSC3224_Computer_Games_Development / GameEngine / Engine_Physics / EnginePhysicsSystem.cpp
EnginePhysicsSystem.cpp
Raw
#include "EnginePhysicsSystem.h"
#include "../GameEngine/Engine_Physics/RigidBodyPhysics.h"
// Engine Physics System
EnginePhysicsSystem::EnginePhysicsSystem(Scene& inputScene, b2Vec2 gravityFactor) : EngineMessageSystem(inputScene), physicsScene(gravityFactor) {}
// Step through the Engine Physics Sysetm
void EnginePhysicsSystem::play(const sf::Time& elapsedTime)
{
	enginePhysicsSystemProfiler.startTime();
// Apply Gravity -  b2World::play(float32 dt, int32 velocityIterations, int32 positionIterations)
	physicsScene.play(elapsedTime.asSeconds(), 8, 3);
// Loop thorugh the messages and apply Physics (i.e. Movement, Rotation...)
	auto Enginemessages = scene->getEntityManagement().getMessageSystemEventType(MessageSystemEventType::RIGID_BODY_PHYSICS_TYPE);
	for (auto messages : *Enginemessages)
	{
		auto physicsBody = static_cast<RigidBodyPhysics*>(messages.first)->getBody();
		auto physicsSprite = messages.second->getEntitySprite();
// Set position for sprites
		physicsSprite->setPosition(physicsBody->GetPosition().x * SCALE_PIXELS_TO_UNITS, physicsBody->GetPosition().y * SCALE_PIXELS_TO_UNITS);
// Set rotation for sprites
		physicsSprite->setRotation((180.f / b2_pi) * physicsBody->GetAngle());
	}
	enginePhysicsSystemProfiler.finishProfiler();
}

void EnginePhysicsSystem::setContactListener(b2ContactListener* inputList)
{
	physicsScene.SetContactListener(inputList);
}

void EnginePhysicsSystem::clear() {
	auto messageSystem
		= this->scene->getEntityManagement().getMessageSystemEventType(MessageSystemEventType::RIGID_BODY_PHYSICS_TYPE);
}