[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdegames/kolf
From:       Stefan Majewsky <majewsky () gmx ! net>
Date:       2010-10-31 23:23:39
Message-ID: 20101031232339.D266DAC8AD () svn ! kde ! org
[Download RAW message or body]

SVN commit 1191717 by majewsky:

Decouple Box2D coordinates and scale them to a size which Box2D handles well.

This is especially necessary because velocities are cut off by Box2D at
2 units per timestep (which it interprets as 2 m/s).

 M  +10 -5     canvasitem.cpp  
 M  +11 -6     shape.cpp  
 M  +5 -0      shape.h  


--- trunk/KDE/kdegames/kolf/canvasitem.cpp #1191716:1191717
@@ -133,7 +133,7 @@
 QPointF CanvasItem::physicalVelocity() const
 {
 	b2Vec2 v = m_body->GetLinearVelocity();
-	return QPointF(v.x, v.y);
+	return QPointF(v.x, v.y) / Kolf::Box2DScaleFactor;
 }
 
 void CanvasItem::setPhysicalVelocity(const QPointF& newVelocity)
@@ -143,10 +143,15 @@
 	{
 		const qreal mass = m_body->GetMass();
 		if (mass == 0)
-			m_body->SetLinearVelocity(b2Vec2(newVelocity.x(), newVelocity.y()));
+		{
+			m_body->SetLinearVelocity(b2Vec2(
+				newVelocity.x() * Kolf::Box2DScaleFactor,
+				newVelocity.y() * Kolf::Box2DScaleFactor
+			));
+		}
 		else
 		{
-			const QPointF impulse = (newVelocity - currentVelocity) * mass;
+			const QPointF impulse = (newVelocity - currentVelocity) * mass * Kolf::Box2DScaleFactor;
 			m_body->ApplyLinearImpulse(b2Vec2(impulse.x(), impulse.y()), m_body->GetPosition());
 		}
 	}
@@ -154,7 +159,7 @@
 
 void CanvasItem::startSimulation()
 {
-	const QPointF position = getPosition();
+	const QPointF position = getPosition() * Kolf::Box2DScaleFactor;
 	m_body->SetTransform(b2Vec2(position.x(), position.y()), 0);
 }
 
@@ -162,7 +167,7 @@
 {
 	//read position
 	b2Vec2 v = m_body->GetPosition();
-	QPointF position(v.x, v.y);
+	QPointF position = QPointF(v.x, v.y) / Kolf::Box2DScaleFactor;
 	if (position != getPosition())
 		//HACK: The above condition can be removed later, but for now we need to
 		//prevent moveBy() from being called with (0, 0) arguments because such
--- trunk/KDE/kdegames/kolf/shape.cpp #1191716:1191717
@@ -44,7 +44,7 @@
 	, m_shape(0)
 {
 	m_fixtureDef->density = 1;
-	m_fixtureDef->restitution = 0.8;
+	m_fixtureDef->restitution = 1;
 	m_fixtureDef->friction = 0;
 	m_fixtureDef->userData = this;
 }
@@ -152,8 +152,9 @@
 
 b2Shape* Kolf::EllipseShape::createShape()
 {
-	const b2Vec2 c = toB2Vec2(m_rect.center());
-	const qreal rx = m_rect.width() / 2, ry = m_rect.height() / 2;
+	const b2Vec2 c = toB2Vec2(m_rect.center() * Kolf::Box2DScaleFactor);
+	const qreal rx = m_rect.width() * Kolf::Box2DScaleFactor / 2;
+	const qreal ry = m_rect.height() * Kolf::Box2DScaleFactor / 2;
 	if (rx == ry)
 	{
 		//use circle shape when possible because it's cheaper and exact
@@ -216,8 +217,9 @@
 {
 	b2PolygonShape* shape = new b2PolygonShape;
 	shape->SetAsBox(
-		m_rect.width() / 2, m_rect.height() / 2,
-		toB2Vec2(m_rect.center()),
+		m_rect.width() * Kolf::Box2DScaleFactor / 2,
+		m_rect.height() * Kolf::Box2DScaleFactor / 2,
+		toB2Vec2(m_rect.center() * Kolf::Box2DScaleFactor),
 		0 //intrinsic rotation angle
 	);
 	return shape;
@@ -256,7 +258,10 @@
 b2Shape* Kolf::LineShape::createShape()
 {
 	b2EdgeShape* shape = new b2EdgeShape;
-	shape->Set(toB2Vec2(m_line.p1()), toB2Vec2(m_line.p2()));
+	shape->Set(
+		toB2Vec2(m_line.p1() * Kolf::Box2DScaleFactor),
+		toB2Vec2(m_line.p2() * Kolf::Box2DScaleFactor)
+	);
 	return shape;
 }
 
--- trunk/KDE/kdegames/kolf/shape.h #1191716:1191717
@@ -29,6 +29,11 @@
 
 namespace Kolf
 {
+	//All coordinates and units of Kolf's coordinate system are internally
+	//scaled with the following factor before using them with Box2D, because
+	//Box2D works best with lengths between 0.1 and 10 metres.
+	static const qreal Box2DScaleFactor = 0.025;
+
 	/**
 	 * @class Kolf::Shape
 	 *
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic