Commit 1a794421 authored by Max Lyon's avatar Max Lyon

Merge branch 'master' into CMakeSimplification

parents 1210a46c 4cbd0db4
......@@ -164,7 +164,7 @@ int viewerId() {
return viewerId_;
}
void setViewers( std::vector< glViewer* > _viewerWidgets ) {
void setViewers( const std::vector< glViewer* >& _viewerWidgets ) {
PluginFunctions::examiner_widgets_ = _viewerWidgets;
PluginFunctions::examiner_widget_ = examiner_widgets_[0];
......@@ -174,7 +174,7 @@ void setViewers( std::vector< glViewer* > _viewerWidgets ) {
viewerId_ = qrand();
}
void setViewerProperties( std::vector< Viewer::ViewerProperties* > _viewerProperties ) {
void setViewerProperties( const std::vector< Viewer::ViewerProperties* >& _viewerProperties ) {
PluginFunctions::viewerProperties_ = _viewerProperties;
}
......@@ -221,9 +221,11 @@ void setEncodedExaminerView( QString _view ) {
void setEncodedExaminerView(int _viewerId , QString _view ) {
// Consistency check. If viewer id is wrong, we set the currently active viewer.
if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
examiner_widgets_[activeExaminer()]->decodeView ( _view );
return;
}
examiner_widgets_[_viewerId]->decodeView ( _view );
......
......@@ -79,7 +79,7 @@ namespace PluginFunctions {
//=======================================
/// Set the internal Viewer pointer ( DO NOT USE!! )
DLLEXPORT
void setViewers( std::vector< glViewer* > _viewerWidgets );
void setViewers( const std::vector< glViewer* >& _viewerWidgets );
/// Get a Viewer
DLLEXPORT
......@@ -87,7 +87,7 @@ glViewer* viewer(int _viewerId );
/// Set the internal viewerProperties pointer ( DO NOT USE!! )
DLLEXPORT
void setViewerProperties( std::vector< Viewer::ViewerProperties* > _viewerProperties );
void setViewerProperties( const std::vector< Viewer::ViewerProperties* >& _viewerProperties );
/** Set the internal scenegraph root node pointer. This is the topmost
* node of the whole scenegraph ( DO NOT USE!! )
......
......@@ -587,8 +587,8 @@ Core::init() {
// debug information for this case, print renderer count and their names
const unsigned int rendererCount = renderManager().available();
emit log(LOGERR,tr("Currently ") + QString::number(rendererCount) + tr(" renderers are available:") );
for (unsigned int i = 0 ; i < rendererCount ; ++i )
emit log(LOGERR, tr("Renderer ") + QString::number(i) + ": " + renderManager()[i]->name );
for (unsigned int rendererId = 0 ; rendererId < rendererCount ; ++rendererId )
emit log(LOGERR, tr("Renderer ") + QString::number(rendererId) + ": " + renderManager()[rendererId]->name );
}
} else {
......@@ -1901,8 +1901,8 @@ void Core::slotDeleteAllObjects( ){
bool Core::checkLibraryVersions() {
bool ok = true;
bool warn = false;
// bool ok = true;
// bool warn = false;
QString messages;
......@@ -1916,39 +1916,40 @@ bool Core::checkLibraryVersions() {
messages += tr("Link time QT Version:\t\t") + QString( QT_VERSION_STR ) + "\n";
messages += tr("This inconsistency may lead to an unstable behavior of OpenFlipper!");
warn = true;
// warn = true;
}
if ( !ok ) {
QString message = tr("Error! Library tests failed!\n");
message += tr("The following problems have been found:\n\n");
message += messages;
std::cerr << message.toStdString() << std::endl;
if ( OpenFlipper::Options::gui() ) {
finishSplash();
StaysOnTopMessageBox::critical ( 0, tr( "Library incompatibilities found!"),message );
}
// Unsafe operation, so quit the application
exitFailure();
} else if ( warn ) {
QString message = tr("Warning! The OpenGL capabilities of your current machine/driver could be insufficient!\n\n");
message += tr("The following checks failed:\n\n");
message += messages;
std::cerr << message.toStdString() << std::endl;
if ( OpenFlipper::Options::gui() ) {
finishSplash();
StaysOnTopMessageBox::warning ( 0, tr( "Library incompatibilities found!"),message );
}
// if ( !ok ) {
// QString message = tr("Error! Library tests failed!\n");
// message += tr("The following problems have been found:\n\n");
//
// message += messages;
//
// std::cerr << message.toStdString() << std::endl;
//
// if ( OpenFlipper::Options::gui() ) {
// finishSplash();
// StaysOnTopMessageBox::critical ( 0, tr( "Library incompatibilities found!"),message );
// }
//
// // Unsafe operation, so quit the application
// exitFailure();
//
// } else if ( warn ) {
}
// QString message = tr("Warning! The OpenGL capabilities of your current machine/driver could be insufficient!\n\n");
// message += tr("The following checks failed:\n\n");
// message += messages;
//
// std::cerr << message.toStdString() << std::endl;
//
// if ( OpenFlipper::Options::gui() ) {
// finishSplash();
// StaysOnTopMessageBox::warning ( 0, tr( "Library incompatibilities found!"),message );
// }
//
// }
#ifndef NDEBUG
else {
std::cerr << "Library Check succeeded" << std::endl;
......
......@@ -108,8 +108,8 @@ void Core::readApplicationOptions(INIFile& _ini) {
// Check if the mode already exists
bool found = false;
for (int i=0; i < viewModes_.size(); i++)
if (viewModes_[i]->name == mode)
for (int modeNr = 0; modeNr < viewModes_.size(); modeNr++)
if (viewModes_[modeNr]->name == mode)
found = true;
if (!found){
......
......@@ -66,6 +66,11 @@ void Core::startVideoCapture(QString _baseName, int _fps, bool _captureViewers)
// set track to true;
videoTimer_.setSingleShot(false);
// sanitize input
if (_fps == 0) {
_fps = 25;
}
// 25 fps
videoTimer_.start( 1000 / _fps);
......
......@@ -51,15 +51,15 @@
#include "salt.hh"
KeyGen::KeyGen(QString n, QString cHash, QString pHash, QString cpHash, QString prHash, QStringList mHashes, QString request)
KeyGen::KeyGen(QString n, QString cHash, QString pHash, QString cpHash, QString prHash, QStringList mHashes, QString request) :
name (n),
coreHash(cHash),
pluginHash(pHash),
cpuHash(cpHash),
productHash(prHash),
macHashes(mHashes),
requestSig(request)
{
name = n;
coreHash = cHash;
pluginHash = pHash;
cpuHash = cpHash;
productHash = prHash;
macHashes = mHashes;
requestSig = request;
}
QString KeyGen::computeSignature(const bool _utf8 ) const {
......
......@@ -88,7 +88,7 @@
class StackWalkerToConsole : public StackWalker
{
protected:
virtual void OnOutput(LPCSTR szText)
virtual void OnOutput(LPCSTR szText) override
{
// Writes crash dump to .OpenFlipper config directory
std::ofstream crashFile;
......
......@@ -135,12 +135,12 @@ class DLLEXPORT BaseObjectData : public BaseObject
/** Clean all data structures of the object
*
* */
virtual void cleanup();
virtual void cleanup() override;
/** @} */
virtual void setName(QString _name );
virtual void setName(QString _name ) override;
//===========================================================================
/** @name Object visualization
......@@ -155,10 +155,10 @@ class DLLEXPORT BaseObjectData : public BaseObject
virtual void hide();
/// return visiblity
virtual bool visible();
virtual bool visible() override;
/// Sets visiblity of the whole Scenegraph subtree of this node
virtual void visible(bool _visible);
virtual void visible(bool _visible) override;
/** get the base node of this object (Use this node to add custom Nodes to the Object
* which should not be transformed with the manipulator of the Object)
......@@ -298,7 +298,7 @@ class DLLEXPORT BaseObjectData : public BaseObject
*
* \note Do not call this function yourself to avoid unnecessary overhead(the core will call it via the type plugins when it is required)
*/
virtual void update(UpdateType _type = UPDATE_ALL );
virtual void update(UpdateType _type = UPDATE_ALL ) override;
/** @} */
......
......@@ -93,18 +93,18 @@ class DLLEXPORT PerObjectData {
//=============================================================================
#define PER_OBJECT_DATA(_CLASS, _VALUE) \
class DLLEXPORT _CLASS : public PerObjectData { \
\
public: \
inline _CLASS() : data_( 0) { } \
inline explicit _CLASS(const _VALUE& _x) : data_(_x) { } \
inline virtual ~_CLASS() { } \
inline virtual _CLASS* copyPerObjectData() { return new _CLASS(data_); } \
inline _VALUE& data() { return data_; } \
inline const _VALUE& data() const { return data_; } \
private: \
_VALUE data_; \
#define PER_OBJECT_DATA(_CLASS, _VALUE) \
class DLLEXPORT _CLASS : public PerObjectData { \
\
public: \
inline _CLASS() : data_( 0) { } \
inline explicit _CLASS(const _VALUE& _x) : data_(_x) { } \
inline virtual ~_CLASS() { } \
inline virtual _CLASS* copyPerObjectData() override { return new _CLASS(data_); } \
inline _VALUE& data() { return data_; } \
inline const _VALUE& data() const { return data_; } \
private: \
_VALUE data_; \
}
//=============================================================================
......
......@@ -201,9 +201,9 @@ public:
protected:
virtual GLSL::Program* setupPass(int _pass, GLuint _srcTex);
virtual GLSL::Program* setupPass(int _pass, GLuint _srcTex) override;
void updateKernel();
void updateKernel() override;
private:
......@@ -282,9 +282,9 @@ public:
const std::vector<ACG::Vec2f>& offsetsY() const {return offsetsY_;}
protected:
virtual GLSL::Program* setupPass(int _pass, GLuint _srcTex);
virtual GLSL::Program* setupPass(int _pass, GLuint _srcTex) override;
void updateKernel();
void updateKernel() override;
private:
......
......@@ -609,7 +609,7 @@ ACG::Vec3f GLCone::normalOnCone(int _sliceNumber, int _stackNumber)
ACG::Vec3f normal;
double beta = ((2.0 * M_PI) / slices_) * _sliceNumber;
double relativeHeight = _stackNumber / (double) stacks_;
// double relativeHeight = _stackNumber / (double) stacks_;
normal[0] = sin(beta);
normal[1] = cos(beta);
......
......@@ -146,11 +146,11 @@ public:
void addToRenderer(class IRenderer* _renderer, const struct RenderObject* _base, float _radius, const ACG::Vec3f& _center = ACG::Vec3f(0.0f, 0.0f, 0.0f));
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
void addTriangle(int sl0, int st0, int sl1, int st1, int sl2, int st2);
......@@ -185,9 +185,9 @@ public:
ACG::Vec3f _upDir = ACG::Vec3f(0.0f, 0.0f, 1.0f),
float _radiusScale = 1.0f);
int getNumTriangles();
int getNumTriangles() override;
void updateVBO();
void updateVBO() override;
void setBottomRadius(float _bottomRadius);
void setTopRadius(float _topRadius);
void setNormalOrientation(NormalOrientation orienation);
......@@ -228,7 +228,7 @@ public:
void setInnerRadius(float _innerRadius);
void setOuterRadius(float _outerRadius);
int getNumTriangles();
int getNumTriangles() override;
void draw(
GLState& _state,
......@@ -236,7 +236,7 @@ public:
ACG::Vec3f _upDir = ACG::Vec3f(0.0f, 0.0f, 1.0f));
protected:
void updateVBO();
void updateVBO() override;
private:
int slices_;
......@@ -263,11 +263,11 @@ public:
GLBox();
~GLBox();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -279,12 +279,12 @@ public:
GLLineBox();
~GLLineBox();
int getNumTriangles();
int getNumLines();
int getNumTriangles() override;
int getNumLines() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -296,11 +296,11 @@ public:
GLDodecahedron();
~GLDodecahedron();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -312,11 +312,11 @@ public:
GLIcosahedron();
~GLIcosahedron();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -328,11 +328,11 @@ public:
GLOctahedron();
~GLOctahedron();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -344,11 +344,11 @@ public:
GLTetrahedron();
~GLTetrahedron();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
};
//------------------------------------------------------------------------
......@@ -362,11 +362,11 @@ public:
GLint nsides, GLint rings);
~GLTorus();
int getNumTriangles();
int getNumTriangles() override;
private:
void updateVBO();
void updateVBO() override;
int rings_;
int nsides_;
......
......@@ -1302,15 +1302,15 @@ QString IRenderer::dumpCurrentRenderObjectsToString(ACG::RenderObject** _list, b
ShaderProgGenerator progGen(&(obj->shaderDesc), _modifiers);
outStrm << "\n---------------------vertex-shader--------------------\n\n";
for (int i = 0; i < progGen.getVertexShaderCode().size(); ++i)
outStrm << progGen.getVertexShaderCode()[i] << "\n";
for (int nr = 0; nr < progGen.getVertexShaderCode().size(); ++nr)
outStrm << progGen.getVertexShaderCode()[nr] << "\n";
outStrm << "\n---------------------end-vertex-shader--------------------\n\n";
if (progGen.hasTessControlShader())
{
outStrm << "\n---------------------tesscontrol-shader--------------------\n\n";
for (int i = 0; i < progGen.getTessControlShaderCode().size(); ++i)
outStrm << progGen.getTessControlShaderCode()[i] << "\n";
for (int nr = 0; nr < progGen.getTessControlShaderCode().size(); ++nr)
outStrm << progGen.getTessControlShaderCode()[nr] << "\n";
outStrm << "\n---------------------end-tesscontrol-shader--------------------\n\n";
}
......@@ -1318,23 +1318,23 @@ QString IRenderer::dumpCurrentRenderObjectsToString(ACG::RenderObject** _list, b
{
outStrm << "\n---------------------tesseval-shader--------------------\n\n";
if (progGen.hasTessEvaluationShader())
for (int i = 0; i < progGen.getTessEvaluationShaderCode().size(); ++i)
outStrm << progGen.getTessEvaluationShaderCode()[i] << "\n";
for (int nr = 0; nr < progGen.getTessEvaluationShaderCode().size(); ++nr)
outStrm << progGen.getTessEvaluationShaderCode()[nr] << "\n";
outStrm << "\n---------------------end-tesseval-shader--------------------\n\n";
}
if (progGen.hasGeometryShader())
{
outStrm << "\n---------------------geometry-shader--------------------\n\n";
for (int i = 0; i < progGen.getGeometryShaderCode().size(); ++i)
outStrm << progGen.getGeometryShaderCode()[i] << "\n";
for (int nr = 0; nr < progGen.getGeometryShaderCode().size(); ++nr)
outStrm << progGen.getGeometryShaderCode()[nr] << "\n";
outStrm << "\n---------------------end-geometry-shader--------------------\n\n";
}
outStrm << "\n---------------------fragment-shader--------------------\n\n";
for (int i = 0; i < progGen.getFragmentShaderCode().size(); ++i)
outStrm << progGen.getFragmentShaderCode()[i] << "\n";
for (int nr = 0; nr < progGen.getFragmentShaderCode().size(); ++nr)
outStrm << progGen.getFragmentShaderCode()[nr] << "\n";
outStrm << "\n---------------------end-fragment-shader--------------------\n\n";
}
......
......@@ -196,14 +196,14 @@ public:
MeshCompilerDefaultFaceInput(int _numFaces, int _numIndices);
virtual ~MeshCompilerDefaultFaceInput(){}
int getNumFaces() const {return numFaces_;}
int getNumIndices() const {return numIndices_;}
int getNumFaces() const override {return numFaces_;}
int getNumIndices() const override {return numIndices_;}
int getFaceSize(const int _faceID) const {return faceSize_[_faceID];}
int getFaceSize(const int _faceID) const override {return faceSize_[_faceID];}
int getSingleFaceAttr(const int _faceID, const int _faceCorner, const int _attrID) const;
int getSingleFaceAttr(const int _faceID, const int _faceCorner, const int _attrID) const override;
bool getFaceAttr(const int _faceID, const int _attrID, int* _out) const;
bool getFaceAttr(const int _faceID, const int _attrID, int* _out) const override;
void dbgWriteToObjFile(FILE* _file, int _posAttrID = 0, int _normalAttrID = -1, int _texcAttrID = -1);
......
......@@ -2526,17 +2526,17 @@ public:
virtual ~ShaderModifierFile()
{}
void modifyVertexIO(ShaderGenerator* _shader) { modifyIO(0, _shader); }
void modifyTessControlIO(ShaderGenerator* _shader) { modifyIO(1, _shader); }
void modifyTessEvalIO(ShaderGenerator* _shader) { modifyIO(2, _shader); }
void modifyGeometryIO(ShaderGenerator* _shader) { modifyIO(3, _shader); }
void modifyFragmentIO(ShaderGenerator* _shader) { modifyIO(4, _shader); }
void modifyVertexIO(ShaderGenerator* _shader) override { modifyIO(0, _shader); }
void modifyTessControlIO(ShaderGenerator* _shader) override { modifyIO(1, _shader); }
void modifyTessEvalIO(ShaderGenerator* _shader) override { modifyIO(2, _shader); }
void modifyGeometryIO(ShaderGenerator* _shader) override { modifyIO(3, _shader); }
void modifyFragmentIO(ShaderGenerator* _shader) override { modifyIO(4, _shader); }
void modifyVertexBeginCode(QStringList* _code) { _code->append(vertexBeginCode_); }
void modifyVertexEndCode(QStringList* _code) { _code->append(vertexEndCode_); }
void modifyFragmentBeginCode(QStringList* _code) { _code->append(fragmentBeginCode_); }
void modifyFragmentEndCode(QStringList* _code) { _code->append(fragmentEndCode_); }
void modifyVertexBeginCode(QStringList* _code) override { _code->append(vertexBeginCode_); }
void modifyVertexEndCode(QStringList* _code) override { _code->append(vertexEndCode_); }
void modifyFragmentBeginCode(QStringList* _code) override { _code->append(fragmentBeginCode_); }
void modifyFragmentEndCode(QStringList* _code) override { _code->append(fragmentEndCode_); }
const QString& filename() const {return filename_;}
const QDateTime& filetime() const {return filetime_;}
......
......@@ -71,6 +71,16 @@
#endif
// qt refers to outdated include guard of glext.h, set the old guard if the
// new one is defined:
#ifdef __gl_glext_h_
# ifndef __glext_h_
# define __glext_h_ 1
# endif
#endif
#include "../Math/VectorT.hh"
......
......@@ -98,9 +98,19 @@ class Matrix3x3T {
Vec3 getRow(uint_fast8_t r) const {
return Vec3((*this)(r,0), (*this)(r,1), (*this)(r,2));
}
void setRow(uint_fast8_t r, const Vec3 &v) {
for (uint_fast8_t c = 0; c < 3; ++c) {
(*this)(r, c) = v[c];
}
}
Vec3 getCol(uint_fast8_t c) const {
return Vec3((*this)(0,c), (*this)(1,c), (*this)(2,c));
}
void setCol(uint_fast8_t c, const Vec3 &v) {
for (uint_fast8_t r = 0; r < 3; ++r) {
(*this)(r, c) = v[r];
}
}
constexpr Matrix3x3T operator*(const Matrix3x3T &rhs) const {
return Matrix3x3T {{
......
......@@ -130,13 +130,13 @@ private slots:
protected:
/// handle new key events
virtual bool viewKeyPressEvent(QKeyEvent* /* _event */ ) { return false; }
virtual bool viewKeyPressEvent(QKeyEvent* /* _event */ ) override { return false; }
/// handle wheel events
virtual void viewWheelEvent(QWheelEvent* _event);
virtual void viewWheelEvent(QWheelEvent* _event) override;
/// handle mouse events
virtual void viewMouseEvent(QMouseEvent* _event);
virtual void viewMouseEvent(QMouseEvent* _event) override;
/// handle mouse events
virtual void lightMouseEvent(QMouseEvent* _event);
virtual void lightMouseEvent(QMouseEvent* _event) override;
protected:
......
......@@ -90,7 +90,7 @@ class Material;
/// Convenience macro that sets up the BaseNode::className() function
#define ACG_CLASSNAME(_className) \
virtual const std::string& className() const { \
virtual const std::string& className() const override { \
static std::string cname( #_className ); return cname; \
}
......
......@@ -88,10 +88,10 @@ public:
ACG_CLASSNAME(CartesianClippingNode);
/// begin clipping
void enter( GLState & _state, const DrawModes::DrawMode& _drawmode );
void enter( GLState & _state, const DrawModes::DrawMode& _drawmode ) override;
/// stop clipping
void leave( GLState & _state, const DrawModes::DrawMode& _drawmode );
void leave( GLState & _state, const DrawModes::DrawMode& _drawmode ) override;
/// set position
void set_cursor( const Vec3f & _pos );
......
......@@ -205,10 +205,10 @@ void ClippingNode::ClippingShaderModifier::modifyVertexIO(ShaderGenerator* _shad
}
void ClippingNode::ClippingShaderModifier::modifyVertexBeginCode(QStringList* _code)
void ClippingNode::ClippingShaderModifier::modifyVertexEndCode(QStringList* _code)
{
for (int i = 0; i < numClipPlanes_; ++i)
_code->push_back(QString("gl_ClipDistance[%1] = dot(SG_INPUT_POSOS, g_SlicePlane%1);").arg(i));
_code->push_back(QString("gl_ClipDistance[%1] = dot(inverse(g_mWV) * sg_vPosVS, g_SlicePlane%1);").arg(i));
}
//=============================================================================
......
......@@ -120,16 +120,16 @@ public:
ACG_CLASSNAME(ClippingNode);
/// enable clipping plane
void enter(IRenderer* _renderer, GLState& _state, const DrawModes::DrawMode& _drawmode);
void enter(IRenderer* _renderer, GLState& _state, const DrawModes::DrawMode& _drawmode) override;
/// disable clipping plane
void leave(IRenderer* _renderer, GLState& _state, const DrawModes::DrawMode& _drawmode);
void leave(IRenderer* _renderer, GLState& _state, const DrawModes::DrawMode& _drawmode) override;
/// enable clipping plane
void enter(GLState& _state, const DrawModes::DrawMode& _drawmode);
void enter(GLState& _state, const DrawModes::DrawMode& _drawmode) override;
/// disable clipping plane
void leave(GLState& _state, const DrawModes::DrawMode& _drawmode);
void leave(GLState& _state, const DrawModes::DrawMode& _drawmode) override;
/// set position and normal of plane
void set_plane(const Vec3f& _position, const Vec3f& _normal, float _eps=0.0);
......@@ -174,7 +174,7 @@ private:
void modifyVertexIO(ShaderGenerator* _shader);
void modifyVertexBeginCode(QStringList* _code);
void modifyVertexEndCode(QStringList* _code);
private:
......
......@@ -94,11 +94,11 @@ public:
/// implement className()
ACG_CLASSNAME(CoordFrameNode);
/// return available draw modes
DrawModes::DrawMode availableDrawModes() const;
DrawModes::DrawMode availableDrawModes() const override;
/// update bounding box
void boundingBox(Vec3d& _bbMin, Vec3d& _bbMax);
void boundingBox(Vec3d& _bbMin, Vec3d& _bbMax) override;
/// drawing the primitive
void draw(GLState& _state, const DrawModes::DrawMode& _drawMode);
void draw(GLState& _state, const DrawModes::DrawMode& _drawMode) override;
/// update bounding box (compute in from BB of children)
......
......@@ -115,19 +115,19 @@ public:
ACG_CLASSNAME(CoordsysNode);
/// return available draw modes
ACG::SceneGraph::DrawModes::DrawMode availableDrawModes() const;
ACG::SceneGraph::DrawModes::DrawMode availableDrawModes() const override;
/// update bounding box
void boundingBox(Vec3d& _bbMin, Vec3d& _bbMax);
void boundingBox(Vec3d& _bbMin, Vec3d& _bbMax) override;
/// draw Coordsys
void draw(GLState& _state, const DrawModes::DrawMode& _drawMode);