void BoxTest::testGetters() { const Geometry::Box b1(-1.0f, 1.0f, -2.0f, 2.0f, -3.0f, 3.0f); const Geometry::Box b2; CPPUNIT_ASSERT(b1.getMaxX() == 1.0f); CPPUNIT_ASSERT(b1.getMax(Geometry::dimension_t::X) == 1.0f); CPPUNIT_ASSERT(b1.getMaxY() == 2.0f); CPPUNIT_ASSERT(b1.getMax(Geometry::dimension_t::Y) == 2.0f); CPPUNIT_ASSERT(b1.getMaxZ() == 3.0f); CPPUNIT_ASSERT(b1.getMax(Geometry::dimension_t::Z) == 3.0f); CPPUNIT_ASSERT(b1.getMinX() == -1.0f); CPPUNIT_ASSERT(b1.getMin(Geometry::dimension_t::X) == -1.0f); CPPUNIT_ASSERT(b1.getMinY() == -2.0f); CPPUNIT_ASSERT(b1.getMin(Geometry::dimension_t::Y) == -2.0f); CPPUNIT_ASSERT(b1.getMinZ() == -3.0f); CPPUNIT_ASSERT(b1.getMin(Geometry::dimension_t::Z) == -3.0f); CPPUNIT_ASSERT(b1.getExtentMax() == 6.0f); CPPUNIT_ASSERT(b1.getExtentMin() == 2.0f); CPPUNIT_ASSERT(b1.getExtentX() == 2.0f); CPPUNIT_ASSERT(b1.getExtent(Geometry::dimension_t::X) == 2.0f); CPPUNIT_ASSERT(b1.getExtentY() == 4.0f); CPPUNIT_ASSERT(b1.getExtent(Geometry::dimension_t::Y) == 4.0f); CPPUNIT_ASSERT(b1.getExtentZ() == 6.0f); CPPUNIT_ASSERT(b1.getExtent(Geometry::dimension_t::Z) == 6.0f); CPPUNIT_ASSERT(b1.getVolume() == 48.0f); CPPUNIT_ASSERT(b1.getSurfaceArea() == 88.0f); CPPUNIT_ASSERT(b1.getCenter() == Geometry::Vec3(0.0f, 0.0f, 0.0f)); CPPUNIT_ASSERT(b1.getBoundingSphereRadius() == 0.5f * std::sqrt(56.0f)); }
void drawFastAbsBox(RenderingContext & rc, const Geometry::Box & b){ #ifdef LIB_GL rc.pushAndSetShader(nullptr); // Too slow: // rc.pushMatrix_modelToCamera(); // rc.resetMatrix(); // rc.applyChanges(); glPushMatrix(); glLoadTransposeMatrixf( rc.getMatrix_worldToCamera().getData()); static const unsigned int indices[]={ 1,3,2,0, 5,7,3,1, 4,6,7,5, 0,2,6,4, 7,6,2,3, 4,5,1,0 }; float corners[8][3] = {{b.getMaxX(), b.getMaxY(), b.getMaxZ()}, {b.getMinX(), b.getMaxY(), b.getMaxZ()}, {b.getMaxX(), b.getMinY(), b.getMaxZ()}, {b.getMinX(), b.getMinY(), b.getMaxZ()}, {b.getMaxX(), b.getMaxY(), b.getMinZ()}, {b.getMinX(), b.getMaxY(), b.getMinZ()}, {b.getMaxX(), b.getMinY(), b.getMinZ()}, {b.getMinX(), b.getMinY(), b.getMinZ()}}; glBegin(GL_QUADS); for(auto & index : indices){ glVertex3fv(corners[index]); } glEnd(); glPopMatrix(); // rc.popMatrix_modelToCamera(); rc.popShader(); #else drawAbsBox(rc,b); #endif }
void BoxTest::testMisc() { const Geometry::Box b1(-1.0f, 1.0f, -2.0f, 2.0f, -3.0f, 3.0f); Geometry::Box b2; b2 = Geometry::Box(); CPPUNIT_ASSERT(b2.isValid()); b2.invalidate(); CPPUNIT_ASSERT(b2.isInvalid()); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::xyz) == Geometry::Vec3(b1.getMinX(), b1.getMinY(), b1.getMinZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::Xyz) == Geometry::Vec3(b1.getMaxX(), b1.getMinY(), b1.getMinZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::xYz) == Geometry::Vec3(b1.getMinX(), b1.getMaxY(), b1.getMinZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::XYz) == Geometry::Vec3(b1.getMaxX(), b1.getMaxY(), b1.getMinZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::xyZ) == Geometry::Vec3(b1.getMinX(), b1.getMinY(), b1.getMaxZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::XyZ) == Geometry::Vec3(b1.getMaxX(), b1.getMinY(), b1.getMaxZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::xYZ) == Geometry::Vec3(b1.getMinX(), b1.getMaxY(), b1.getMaxZ())); CPPUNIT_ASSERT(b1.getCorner(Geometry::corner_t::XYZ) == Geometry::Vec3(b1.getMaxX(), b1.getMaxY(), b1.getMaxZ())); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::xyz) == Geometry::corner_t::XYZ); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::Xyz) == Geometry::corner_t::xYZ); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::xYz) == Geometry::corner_t::XyZ); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::XYz) == Geometry::corner_t::xyZ); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::xyZ) == Geometry::corner_t::XYz); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::XyZ) == Geometry::corner_t::xYz); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::xYZ) == Geometry::corner_t::Xyz); CPPUNIT_ASSERT(Geometry::Box::getOppositeCorner(Geometry::corner_t::XYZ) == Geometry::corner_t::xyz); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::X_NEG) == Geometry::Vec3(-1.0f, 0.0f, 0.0f)); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::X_POS) == Geometry::Vec3(1.0f, 0.0f, 0.0f)); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::Y_NEG) == Geometry::Vec3(0.0f, -1.0f, 0.0f)); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::Y_POS) == Geometry::Vec3(0.0f, 1.0f, 0.0f)); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::Z_NEG) == Geometry::Vec3(0.0f, 0.0f, -1.0f)); CPPUNIT_ASSERT(Geometry::Helper::getNormal(Geometry::side_t::Z_POS) == Geometry::Vec3(0.0f, 0.0f, 1.0f)); for (uint_fast8_t s = 0; s < 6; ++s) { const Geometry::side_t side = static_cast<const Geometry::side_t>(s); const Geometry::corner_t * corners = Geometry::Helper::getCornerIndices(side); for (uint_fast8_t i = 0; i < 4; ++i) { const uint_fast8_t prevCorner = i % 4; const uint_fast8_t currentCorner = (i + 1) % 4; const uint_fast8_t nextCorner = (i + 2) % 4; const Geometry::Vec3 edgeA = b1.getCorner(corners[nextCorner]) - b1.getCorner(corners[currentCorner]); const Geometry::Vec3 edgeB = b1.getCorner(corners[prevCorner]) - b1.getCorner(corners[currentCorner]); Geometry::Vec3 normal = edgeA.cross(edgeB); normal.normalize(); CPPUNIT_ASSERT(Geometry::Helper::getNormal(side) == normal); } } const Geometry::Vec3 v1(-1.1f, 0.0f, 0.0f); const Geometry::Vec3 v2(0.0f, 0.0f, 0.0f); const Geometry::Vec3 v3(1.1f, 0.0f, 0.0f); CPPUNIT_ASSERT(!b1.contains(-1.1f, 0.0f, 0.0f)); CPPUNIT_ASSERT(b1.contains(0.0f, 0.0f, 0.0f)); CPPUNIT_ASSERT(!b1.contains(1.1f, 0.0f, 0.0f)); CPPUNIT_ASSERT(!b1.contains(v1)); CPPUNIT_ASSERT(b1.contains(v2)); CPPUNIT_ASSERT(!b1.contains(v3)); CPPUNIT_ASSERT( Geometry::Intersection::isBoxIntersectingTriangle(b1, Geometry::Triangle<Geometry::Vec3>(v1, v2, v3))); CPPUNIT_ASSERT(b1.contains(Geometry::Box())); CPPUNIT_ASSERT(b1.contains(b1)); CPPUNIT_ASSERT(!b1.contains(Geometry::Box(-1.1f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))); CPPUNIT_ASSERT(Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(0, 1, 0, 1, 0, 1))); CPPUNIT_ASSERT(!Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(2, 3, 2, 3, 2, 3))); CPPUNIT_ASSERT(!Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(0, 3, 2, 3, 2, 3))); CPPUNIT_ASSERT(!Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(2, 3, 0, 3, 2, 3))); CPPUNIT_ASSERT(!Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(2, 3, 2, 3, 0, 3))); CPPUNIT_ASSERT(Geometry::Intersection::isBoxIntersectingBox(Geometry::Box(0, 1, 0, 1, 0, 1), Geometry::Box(-1, 2, -1, 2, -1, 2))); CPPUNIT_ASSERT( Geometry::Intersection::isBoxIntersectingBox(b1, Geometry::Box(-1.1f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))); CPPUNIT_ASSERT( !Geometry::Intersection::isBoxIntersectingBox(b1, Geometry::Box(-1.1f, -1.0f, -2.1f, -2.0f, -3.0f, -3.0f))); b2 = Geometry::Box(0.5f, 1.5f, 1.5f, 2.5f, 2.5f, 3.5f); CPPUNIT_ASSERT(Geometry::Intersection::isBoxIntersectingBox(b1, b2)); CPPUNIT_ASSERT(Geometry::Intersection::getBoxBoxIntersection(b1, b2) == Geometry::Box(0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f)); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(-2.0f, 0.0f, 0.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(2.0f, 0.0f, 0.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(0.0f, -3.0f, 0.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(0.0f, 3.0f, 0.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(0.0f, 0.0f, -4.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistance(Geometry::Vec3(0.0f, 0.0f, 4.0f)) == 1.0f); CPPUNIT_ASSERT(b1.getDistanceSquared(Geometry::Vec3(-2.0f, -3.0f, -4.0f)) == 3.0f); CPPUNIT_ASSERT(b1.getDistanceSquared(Geometry::Vec3(2.0f, 3.0f, 4.0f)) == 3.0f); // Make sure the box b1 was never changed. CPPUNIT_ASSERT(b1 == Geometry::Box(-1.0f, 1.0f, -2.0f, 2.0f, -3.0f, 3.0f)); }