// Warning - physics properties are never reflected in the event size cache.
// Have to use GetCurrentProperty to see the updated values.
Quaternion q = actor.GetCurrentProperty<Quaternion>(Actor::Property::ORIENTATION);
- Quaternion expected(Degree(30), Vector3::ZAXIS);
+ Quaternion expected(Degree(-30), Vector3::ZAXIS);
DALI_TEST_EQUALS(q, expected, 0.0001f, TEST_LOCATION);
}
ToolkitTestApplication application;
Matrix transform(false);
- transform.SetIdentityAndScale(Vector3(2.0f, -2.0f, 1.0f));
+ transform.SetIdentityAndScale(Vector3(2.0f, 2.0f, 1.0f));
Uint16Pair size(640, 480);
PhysicsAdaptor adaptor = PhysicsAdaptor::New(transform, size);
Actor rootActor = adaptor.GetRootActor();
// Rotation shouldn't change under this scale
Quaternion q(Degree(30.0f), Vector3::XAXIS);
- DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), q, 0.0001f, TEST_LOCATION);
+ Quaternion expected(Degree(30.0f), Vector3::XAXIS);
+ DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), expected, 0.0001f, TEST_LOCATION);
END_TEST;
}
{
ToolkitTestApplication application;
Matrix transform(false);
- tet_infoline("Test that using an inverted Y scale does nothing to rotation");
+ tet_infoline("Test that using an inverted Y scale inverts rotation");
transform.SetIdentityAndScale(Vector3(1.0f, -1.0f, 1.0f));
Uint16Pair size(640, 480);
PhysicsAdaptor adaptor = PhysicsAdaptor::New(transform, size);
Quaternion q(Degree(30.0f), Vector3::ZAXIS);
- Quaternion qp(Degree(30.0f), Vector3::ZAXIS);
+ Quaternion expected(Degree(-30.0f), Vector3::ZAXIS);
- DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), qp, 0.0001f, TEST_LOCATION);
-
- END_TEST;
-}
-
-int UtcDaliPhysics2DAdaptorTranslateToPhysicsSpace4(void)
-{
- ToolkitTestApplication application;
- Matrix transform(false);
- tet_infoline("Test that using an inverted Y scale does nothing to rotation");
-
- transform.SetIdentityAndScale(Vector3(1.0f, -1.0f, 1.0f));
- Uint16Pair size(640, 480);
- PhysicsAdaptor adaptor = PhysicsAdaptor::New(transform, size);
-
- Quaternion q(Degree(30.0f), Vector3::XAXIS);
- Quaternion qp(Degree(30.0f), Vector3::XAXIS);
-
- DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), qp, 0.0001f, TEST_LOCATION);
-
- END_TEST;
-}
-
-int UtcDaliPhysics2DAdaptorTranslateToPhysicsSpace5(void)
-{
- ToolkitTestApplication application;
- Matrix transform(false);
- tet_infoline("Test that using an inverted Y scale does nothing to rotation");
-
- transform.SetIdentityAndScale(Vector3(1.0f, -1.0f, 1.0f));
- Uint16Pair size(640, 480);
- PhysicsAdaptor adaptor = PhysicsAdaptor::New(transform, size);
-
- Quaternion q(Degree(30.0f), Vector3::YAXIS);
- Quaternion qp(Degree(30.0f), Vector3::YAXIS);
-
- DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), qp, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(adaptor.TranslateToPhysicsSpace(q), expected, 0.0001f, TEST_LOCATION);
END_TEST;
}
Quaternion ChipmunkPhysicsAdaptor::TranslateToPhysicsSpace(Quaternion orientation) const
{
- // It's complicated.
- return orientation;
+ // Actors face outwards (+ve Z)
+ // In DALi world, +ve angle about +ve Z is clockwise.
+ // But, if physics is mirrored in Y axis, so +ve angle is anti-clockwise.
+
+ // Compute angle about Z axis
+ Vector3 axis;
+ Radian angle;
+ orientation.ToAxisAngle(axis, angle);
+
+ // Check if Transform matrix is mirrored in X xor Y
+ if(std::signbit(mTransform.AsFloat()[0]) ^ std::signbit(mTransform.AsFloat()[5]))
+ {
+ return Quaternion(-angle, axis);
+ }
+
+ return Quaternion(angle, axis);
}
Quaternion ChipmunkPhysicsAdaptor::TranslateFromPhysicsSpace(Quaternion orientation) const