Browse Source

Added asserts to object absolute transformation, added test.

pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
45255ff597
  1. 10
      src/Object.cpp
  2. 7
      src/Object.h
  3. 2
      src/Test/CMakeLists.txt
  4. 44
      src/Test/ObjectTest.cpp
  5. 2
      src/Test/ObjectTest.h

10
src/Object.cpp

@ -50,19 +50,21 @@ Object* Object::setParent(Object* parent) {
} }
Matrix4 Object::absoluteTransformation(Camera* camera) { Matrix4 Object::absoluteTransformation(Camera* camera) {
Matrix4 t = _transformation;
/* Shortcut for absolute transformation of camera relative to itself */ /* Shortcut for absolute transformation of camera relative to itself */
if(camera == this) return Matrix4(); if(camera == this) return Matrix4();
Matrix4 t = _transformation;
Object* p = parent(); Object* p = parent();
while(p != nullptr) { while(p != nullptr) {
t = p->transformation()*t; t = p->transformation()*t;
/* We got to the scene, multiply with camera matrix */ /* We got to the scene, multiply with camera matrix */
if(p->parent() == p) { if(p->parent() == p) {
if(camera && camera->scene() == scene()) if(camera) {
CORRADE_ASSERT(camera->scene() == scene(), "Object::absoluteTransformation(): the camera is not part of the same scene as object!", t)
t = camera->cameraMatrix()*t; t = camera->cameraMatrix()*t;
}
break; break;
} }
@ -70,6 +72,8 @@ Matrix4 Object::absoluteTransformation(Camera* camera) {
p = p->parent(); p = p->parent();
} }
CORRADE_ASSERT(p != nullptr || camera == nullptr, "Object::absoluteTransformation(): the object is not part of camera scene!", t)
return t; return t;
} }

7
src/Object.h

@ -103,10 +103,9 @@ class MAGNUM_EXPORT Object {
/** /**
* @brief Absolute transformation * @brief Absolute transformation
* *
* If both this object and the camera is part of the same scene, * Returns absolute transformation matrix relative to the camera or
* returns absolute transformation matrix (relative to the camera). * root object, if no camera is specified. If the camera is specified,
* Otherwise returns transformation matrix relative to root object * it should be part of the same scene as object.
* (in most cases scene of this object).
* *
* Note that the absolute transformation is computed from all parent * Note that the absolute transformation is computed from all parent
* objects every time it is asked, unless this function is * objects every time it is asked, unless this function is

2
src/Test/CMakeLists.txt

@ -1,4 +1,4 @@
corrade_add_test(ObjectTest ObjectTest.h ObjectTest.cpp Magnum) corrade_add_test(ObjectTest ObjectTest.h ObjectTest.cpp MagnumTestLib)
corrade_add_test(CameraTest CameraTest.h CameraTest.cpp Magnum) corrade_add_test(CameraTest CameraTest.h CameraTest.cpp Magnum)
corrade_add_test(LightTest LightTest.h LightTest.cpp MagnumTestLib) corrade_add_test(LightTest LightTest.h LightTest.cpp MagnumTestLib)
corrade_add_test(SceneTest SceneTest.h SceneTest.cpp Magnum) corrade_add_test(SceneTest SceneTest.h SceneTest.cpp Magnum)

44
src/Test/ObjectTest.cpp

@ -15,9 +15,14 @@
#include "ObjectTest.h" #include "ObjectTest.h"
#include "Scene.h" #include "Scene.h"
#include "Camera.h"
#include <sstream>
#include <QtTest/QTest> #include <QtTest/QTest>
using namespace std;
using namespace Corrade::Utility;
QTEST_APPLESS_MAIN(Magnum::Test::ObjectTest) QTEST_APPLESS_MAIN(Magnum::Test::ObjectTest)
namespace Magnum { namespace Test { namespace Magnum { namespace Test {
@ -70,6 +75,45 @@ void ObjectTest::transformation() {
QVERIFY(o2.transformation() == o.transformation()); QVERIFY(o2.transformation() == o.transformation());
} }
void ObjectTest::absoluteTransformationWrongCamera() {
stringstream ss;
Error::setOutput(&ss);
Scene s;
Object o(&s);
o.translate(Vector3::yAxis());
Camera c;
QVERIFY(o.absoluteTransformation(&c) == Matrix4::translation(Vector3::yAxis()));
QVERIFY(ss.str() == "Object::absoluteTransformation(): the camera is not part of the same scene as object!\n");
ss.str("");
Object o2;
o2.translate(Vector3::xAxis());
QVERIFY(o2.absoluteTransformation(&c) == Matrix4::translation(Vector3::xAxis()));
QVERIFY(ss.str() == "Object::absoluteTransformation(): the object is not part of camera scene!\n");
}
void ObjectTest::absoluteTransformation() {
Scene s;
Camera c(&s);
c.translate(Vector3::zAxis(2.0f));
QVERIFY(s.absoluteTransformation() == Matrix4());
QVERIFY(c.absoluteTransformation(&c) == Matrix4());
Object o(&s);
o.scale(Vector3(2.0f));
Object o2(&o);
o.rotate(deg(90.0f), Vector3::yAxis());
QVERIFY((o2.absoluteTransformation() ==
Matrix4::scaling(Vector3(2.0f))*Matrix4::rotation(deg(90.0f), Vector3::yAxis())));
QVERIFY((o2.absoluteTransformation(&c) ==
(Matrix4::translation(Vector3::zAxis(2.0f)).inverted())*Matrix4::scaling(Vector3(2.0f))*Matrix4::rotation(deg(90.0f), Vector3::yAxis())));
Object o3;
o3.translate({1.0f, 2.0f, 3.0f});
QVERIFY(o3.absoluteTransformation() == Matrix4::translation({1.0f, 2.0f, 3.0f}));
}
void ObjectTest::scene() { void ObjectTest::scene() {
Scene scene; Scene scene;

2
src/Test/ObjectTest.h

@ -27,6 +27,8 @@ class ObjectTest: public QObject {
private slots: private slots:
void parenting(); void parenting();
void transformation(); void transformation();
void absoluteTransformationWrongCamera();
void absoluteTransformation();
void scene(); void scene();
void dirty(); void dirty();
}; };

Loading…
Cancel
Save