void
vsCollisionObject::RegisterObject()
{
	b2World *w = vsCollisionSystem::Instance()->GetWorld();

	if ( m_static )
		m_body = w->CreateBody( GetBodyDef() );
	else
		m_body = w->CreateBody( GetBodyDef() );

	for ( int i = 0; i < m_boxCount; i++ )
		m_body->CreateFixture(&m_boxDef[i]);
	for ( int i = 0; i < m_circleCount; i++ )
		m_body->CreateFixture(&m_circleDef[i]);

	m_body->ResetMassData();
}
Beispiel #2
0
void PhysicsSystem::OnEntityAdded(Entity* _entity)
{
	auto collision = _entity->GetComponent<CollisionComponent>();
	auto position = _entity->GetComponent<PositionComponent>();
	auto velocity = _entity->GetComponent<VelocityComponent>();
	auto rotation = _entity->GetComponent<RotationComponent>();
	auto scale = _entity->GetComponent<ScaleComponent>();

	if (scale && (scale->GetScale().x != 1 || scale->GetScale().y != 1))
	{
		auto fixDefs = collision->GetFixtureDefs();
		for (auto it = fixDefs.begin(); it != fixDefs.end(); ++it)
		{
			b2FixtureDef* fix = *it;
			if (fix->shape->m_type == b2Shape::Type::e_polygon)
			{
				b2PolygonShape* polygonShape = (b2PolygonShape*)fix->shape;

				for (int i = 0; i < polygonShape->GetVertexCount(); ++i)
                                    polygonShape->m_vertices[i] = b2Vec2(polygonShape->m_vertices[i].x * scale->GetScale().x, polygonShape->m_vertices[i].y * scale->GetScale().y);
			}
			else if (fix->shape->m_type == b2Shape::Type::e_circle)
			{
				b2CircleShape* circleShape = (b2CircleShape*)fix->shape;
				if (scale->GetScale().x > scale->GetScale().y)
					circleShape->m_radius *= scale->GetScale().x;
				else
					circleShape->m_radius *= scale->GetScale().y;
			}
		}
	}
	if (position)
		collision->GetBodyDef()->position = b2Vec2(position->GetPosition().x, position->GetPosition().y);
	if (velocity)
		collision->GetBodyDef()->linearVelocity = b2Vec2(velocity->m_velocity.x, velocity->m_velocity.y);
	if (rotation)
		collision->GetBodyDef()->angle = rotation->GetRotation().z;
	
	collision->CreateBody(m_b2World);
}