@ -25,14 +25,8 @@
# include "ShapeRenderer.h"
# include "ResourceManager.h"
# include "Physics/AbstractShape.h"
# include "Physics/AxisAlignedBox.h"
# include "Physics/Box.h"
# include "Physics/ObjectShape.h"
# include "Physics/LineSegment.h"
# include "Physics/Point.h"
# include "Physics/ShapeGroup.h"
# include "Physics/Sphere.h"
# include "SceneGraph/AbstractCamera.h"
# include "Implementation/AxisAlignedBoxRenderer.h"
@ -45,51 +39,53 @@ namespace Magnum { namespace DebugTools {
namespace Implementation {
template < > void createDebugMesh ( ShapeRenderer < 2 > * renderer , Physics : : AbstractShape < 2 > * shape ) {
template < > void createDebugMesh ( ShapeRenderer < 2 > * renderer , const Physics : : Implementation : : AbstractShape < 2 > * shape ) {
switch ( shape - > type ( ) ) {
case Physics : : AbstractShape2D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 2 > ( * static_cast < Physics : : AxisAlignedBox2D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape2D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 2 > ( shape ) ) ;
break ;
case Physics : : AbstractShape2D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 2 > ( * static_cast < Physics : : Box2D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape2D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 2 > ( shape ) ) ;
break ;
case Physics : : AbstractShape2D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 2 > ( * static_cast < Physics : : LineSegment2D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape2D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 2 > ( shape ) ) ;
break ;
case Physics : : AbstractShape2D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 2 > ( * static_cast < Physics : : Point2D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape2D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 2 > ( shape ) ) ;
break ;
case Physics : : AbstractShape2D : : Type : : ShapeGroup : {
Physics : : ShapeGroup2D * group = static_cast < Physics : : ShapeGroup2D * > ( shape ) ;
if ( group - > first ( ) ) createDebugMesh ( renderer , group - > first ( ) ) ;
if ( group - > second ( ) ) createDebugMesh ( renderer , group - > second ( ) ) ;
case Physics : : AbstractObjectShape2D : : Type : : ShapeGroup : {
const Physics : : ShapeGroup2D & group =
static_cast < const Physics : : Implementation : : Shape < Physics : : ShapeGroup2D > * > ( shape ) - > shape ;
for ( std : : size_t i = 0 ; i ! = group . size ( ) ; + + i )
createDebugMesh ( renderer , Physics : : Implementation : : getAbstractShape ( group , i ) ) ;
} break ;
case Physics : : AbstractShape2D : : Type : : Sphere :
renderer - > renderers . push_back ( new Implementation : : SphereRenderer < 2 > ( * static_cast < Physics : : Sphere2D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape2D : : Type : : Sphere :
renderer - > renderers . push_back ( new Implementation : : SphereRenderer < 2 > ( shape ) ) ;
break ;
default :
Warning ( ) < < " DebugTools::ShapeRenderer2D::createShapeRenderer(): type " < < shape - > type ( ) < < " not implemented " ;
}
}
template < > void createDebugMesh ( ShapeRenderer < 3 > * renderer , Physics : : AbstractShape < 3 > * shape ) {
template < > void createDebugMesh ( ShapeRenderer < 3 > * renderer , const Physics : : Implementation : : AbstractShape < 3 > * shape ) {
switch ( shape - > type ( ) ) {
case Physics : : AbstractShape3D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 3 > ( * static_cast < Physics : : AxisAlignedBox3D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape3D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 3 > ( shape ) ) ;
break ;
case Physics : : AbstractShape3D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 3 > ( * static_cast < Physics : : Box3D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape3D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 3 > ( shape ) ) ;
break ;
case Physics : : AbstractShape3D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 3 > ( * static_cast < Physics : : LineSegment3D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape3D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 3 > ( shape ) ) ;
break ;
case Physics : : AbstractShape3D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 3 > ( * static_cast < Physics : : Point3D * > ( shape ) ) ) ;
case Physics : : AbstractObject Shape3D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 3 > ( shape ) ) ;
break ;
case Physics : : AbstractShape3D : : Type : : ShapeGroup : {
Physics : : ShapeGroup3D * group = static_cast < Physics : : ShapeGroup3D * > ( shape ) ;
if ( group - > first ( ) ) createDebugMesh ( renderer , group - > first ( ) ) ;
if ( group - > second ( ) ) createDebugMesh ( renderer , group - > second ( ) ) ;
case Physics : : AbstractObjectShape3D : : Type : : ShapeGroup : {
const Physics : : ShapeGroup3D & group =
static_cast < const Physics : : Implementation : : Shape < Physics : : ShapeGroup3D > * > ( shape ) - > shape ;
for ( std : : size_t i = 0 ; i ! = group . size ( ) ; + + i )
createDebugMesh ( renderer , Physics : : Implementation : : getAbstractShape ( group , i ) ) ;
} break ;
default :
Warning ( ) < < " DebugTools::ShapeRenderer3D::createShapeRenderer(): type " < < shape - > type ( ) < < " not implemented " ;
@ -98,9 +94,8 @@ template<> void createDebugMesh(ShapeRenderer<3>* renderer, Physics::AbstractSha
}
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ShapeRenderer ( Physics : : ObjectShape < dimensions > * shape , ResourceKey options , SceneGraph : : DrawableGroup < dimensions > * drawables ) : SceneGraph : : Drawable < dimensions > ( shape - > object ( ) , drawables ) , options ( ResourceManager : : instance ( ) - > get < ShapeRendererOptions > ( options ) ) {
CORRADE_ASSERT ( shape - > shape ( ) ! = nullptr , " DebugTools::ShapeRenderer: cannot create renderer for empty shape " , ) ;
Implementation : : createDebugMesh ( this , shape - > shape ( ) ) ;
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ShapeRenderer ( Physics : : AbstractObjectShape < dimensions > * shape , ResourceKey options , SceneGraph : : DrawableGroup < dimensions > * drawables ) : SceneGraph : : Drawable < dimensions > ( shape - > object ( ) , drawables ) , options ( ResourceManager : : instance ( ) - > get < ShapeRendererOptions > ( options ) ) {
Implementation : : createDebugMesh ( this , Physics : : Implementation : : getAbstractShape ( shape ) ) ;
}
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ~ ShapeRenderer ( ) {