@ -39,74 +39,74 @@ namespace Magnum { namespace DebugTools {
namespace Implementation {
namespace Implementation {
template < > void createDebugMesh ( ShapeRenderer < 2 > * renderer , const Shapes : : Implementation : : AbstractShape < 2 > * shape ) {
template < > void createDebugMesh ( ShapeRenderer < 2 > & renderer , const Shapes : : Implementation : : AbstractShape < 2 > & shape ) {
switch ( shape - > type ( ) ) {
switch ( shape . type ( ) ) {
case Shapes : : AbstractShape2D : : Type : : AxisAlignedBox :
case Shapes : : AbstractShape2D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 2 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 2 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape2D : : Type : : Box :
case Shapes : : AbstractShape2D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 2 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : BoxRenderer < 2 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape2D : : Type : : LineSegment :
case Shapes : : AbstractShape2D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 2 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : LineSegmentRenderer < 2 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape2D : : Type : : Point :
case Shapes : : AbstractShape2D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 2 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : PointRenderer < 2 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape2D : : Type : : Sphere :
case Shapes : : AbstractShape2D : : Type : : Sphere :
renderer - > renderers . push_back ( new Implementation : : SphereRenderer < 2 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : SphereRenderer < 2 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape2D : : Type : : Composition : {
case Shapes : : AbstractShape2D : : Type : : Composition : {
const Shapes : : Composition2D & composition =
const Shapes : : Composition2D & composition =
static_cast < const Shapes : : Implementation : : Shape < Shapes : : Composition2D > * > ( shape ) - > shape ;
static_cast < const Shapes : : Implementation : : Shape < Shapes : : Composition2D > & > ( shape ) . shape ;
for ( std : : size_t i = 0 ; i ! = composition . size ( ) ; + + i )
for ( std : : size_t i = 0 ; i ! = composition . size ( ) ; + + i )
createDebugMesh ( renderer , Shapes : : Implementation : : getAbstractShape ( composition , i ) ) ;
createDebugMesh ( renderer , Shapes : : Implementation : : getAbstractShape ( composition , i ) ) ;
} break ;
} break ;
default :
default :
Warning ( ) < < " DebugTools::ShapeRenderer2D::createShapeRenderer(): type " < < shape - > type ( ) < < " not implemented " ;
Warning ( ) < < " DebugTools::ShapeRenderer2D::createShapeRenderer(): type " < < shape . type ( ) < < " not implemented " ;
}
}
}
}
template < > void createDebugMesh ( ShapeRenderer < 3 > * renderer , const Shapes : : Implementation : : AbstractShape < 3 > * shape ) {
template < > void createDebugMesh ( ShapeRenderer < 3 > & renderer , const Shapes : : Implementation : : AbstractShape < 3 > & shape ) {
switch ( shape - > type ( ) ) {
switch ( shape . type ( ) ) {
case Shapes : : AbstractShape3D : : Type : : AxisAlignedBox :
case Shapes : : AbstractShape3D : : Type : : AxisAlignedBox :
renderer - > renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 3 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : AxisAlignedBoxRenderer < 3 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape3D : : Type : : Box :
case Shapes : : AbstractShape3D : : Type : : Box :
renderer - > renderers . push_back ( new Implementation : : BoxRenderer < 3 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : BoxRenderer < 3 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape3D : : Type : : LineSegment :
case Shapes : : AbstractShape3D : : Type : : LineSegment :
renderer - > renderers . push_back ( new Implementation : : LineSegmentRenderer < 3 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : LineSegmentRenderer < 3 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape3D : : Type : : Point :
case Shapes : : AbstractShape3D : : Type : : Point :
renderer - > renderers . push_back ( new Implementation : : PointRenderer < 3 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : PointRenderer < 3 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape3D : : Type : : Sphere :
case Shapes : : AbstractShape3D : : Type : : Sphere :
renderer - > renderers . push_back ( new Implementation : : SphereRenderer < 3 > ( shape ) ) ;
renderer . renderers . push_back ( new Implementation : : SphereRenderer < 3 > ( shape ) ) ;
break ;
break ;
case Shapes : : AbstractShape3D : : Type : : Composition : {
case Shapes : : AbstractShape3D : : Type : : Composition : {
const Shapes : : Composition3D & composition =
const Shapes : : Composition3D & composition =
static_cast < const Shapes : : Implementation : : Shape < Shapes : : Composition3D > * > ( shape ) - > shape ;
static_cast < const Shapes : : Implementation : : Shape < Shapes : : Composition3D > & > ( shape ) . shape ;
for ( std : : size_t i = 0 ; i ! = composition . size ( ) ; + + i )
for ( std : : size_t i = 0 ; i ! = composition . size ( ) ; + + i )
createDebugMesh ( renderer , Shapes : : Implementation : : getAbstractShape ( composition , i ) ) ;
createDebugMesh ( renderer , Shapes : : Implementation : : getAbstractShape ( composition , i ) ) ;
} break ;
} break ;
default :
default :
Warning ( ) < < " DebugTools::ShapeRenderer3D::createShapeRenderer(): type " < < shape - > type ( ) < < " not implemented " ;
Warning ( ) < < " DebugTools::ShapeRenderer3D::createShapeRenderer(): type " < < shape . type ( ) < < " not implemented " ;
}
}
}
}
}
}
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ShapeRenderer ( Shapes : : AbstractShape < dimensions > * shape , ResourceKey options , SceneGraph : : DrawableGroup < dimensions , Float > * drawables ) : SceneGraph : : Drawable < dimensions , Float > ( shape - > object ( ) , drawables ) , options ( ResourceManager : : instance ( ) - > get < ShapeRendererOptions > ( options ) ) {
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ShapeRenderer ( Shapes : : AbstractShape < dimensions > & shape , ResourceKey options , SceneGraph : : DrawableGroup < dimensions , Float > * drawables ) : SceneGraph : : Drawable < dimensions , Float > ( shape . object ( ) , drawables ) , options ( ResourceManager : : instance ( ) . get < ShapeRendererOptions > ( options ) ) {
Implementation : : createDebugMesh ( this , Shapes : : Implementation : : getAbstractShape ( shape ) ) ;
Implementation : : createDebugMesh ( * this , Shapes : : Implementation : : getAbstractShape ( shape ) ) ;
}
}
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ~ ShapeRenderer ( ) {
template < UnsignedInt dimensions > ShapeRenderer < dimensions > : : ~ ShapeRenderer ( ) {
for ( auto i : renderers ) delete i ;
for ( auto i : renderers ) delete i ;
}
}
template < UnsignedInt dimensions > void ShapeRenderer < dimensions > : : draw ( const typename DimensionTraits < dimensions , Float > : : MatrixType & , SceneGraph : : AbstractCamera < dimensions , Float > * camera ) {
template < UnsignedInt dimensions > void ShapeRenderer < dimensions > : : draw ( const typename DimensionTraits < dimensions , Float > : : MatrixType & , SceneGraph : : AbstractCamera < dimensions , Float > & camera ) {
typename DimensionTraits < dimensions , Float > : : MatrixType projectionMatrix = camera - > projectionMatrix ( ) * camera - > cameraMatrix ( ) ;
typename DimensionTraits < dimensions , Float > : : MatrixType projectionMatrix = camera . projectionMatrix ( ) * camera . cameraMatrix ( ) ;
for ( auto i : renderers ) i - > draw ( options , projectionMatrix ) ;
for ( auto i : renderers ) i - > draw ( options , projectionMatrix ) ;
}
}