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(); }
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); }