ImagingTools Core SDK
CShape3dBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore>
7
8#if QT_VERSION < 0x060000
9#include <QtGui/QOpenGLBuffer>
10#else
11#include <QtOpenGL/QOpenGLBuffer>
12#endif
13
14#include <QtGui/QOpenGLFunctions>
15
16// ACF includes
17#include <imod/CSingleModelObserverBase.h>
18
19// ImtCore includes
20#include <imt3dgui/IShape3d.h>
21#include <imt3d/IPointsBasedObject.h>
22
23
24class QOpenGLContext;
25
26
27namespace imt3dgui
28{
29
30
34class CShape3dBase: public imod::CSingleModelObserverBase, virtual public IShape3d
35{
36public:
37 typedef imod::CSingleModelObserverBase BaseClass;
38
40 virtual ~CShape3dBase();
41
42 int FindVertex(const QPoint& point, bool limitDistance, QVector3D* positionPtr = nullptr) const;
43
44 // reimplement (imt3dgui::IShape3d)
45 virtual bool IsValid() const override;
46 virtual bool IsVisible() const override;
47 virtual void SetVisible(bool isVisible) override;
48
49 // reimplement (imt3dview::IScene3dItem)
50 virtual void SetCamera(const imt3dview::IScene3dCamera* cameraPtr) override;
51 virtual void SetProjection(const QMatrix4x4& projection) override;
52 virtual void SetViewPort(const QRect& viewPort) override;
53
54 virtual const QVector3D& GetPosition() const override;
55 virtual void SetPosition(const QVector3D& position) override;
56
57 virtual const QQuaternion& GetRotation() const override;
58 virtual void SetRotation(const QQuaternion& rotation) override;
59
60 virtual float GetScale() const override;
61 virtual void SetScale(float scale) override;
62
63 // reimplement (imt3dview::IDrawable)
64 virtual void SetContext(QOpenGLContext* contextPtr) override;
65 virtual void DrawGl(QOpenGLShaderProgram& program) override;
66 virtual void Draw(QPainter& /*painter*/) override;
67
68protected:
69 // reimplement (IShape3d)
70 virtual QVector3D GetColor() const override { return QVector3D(); }
71
72protected:
73 // to be implemented in descendants
74 virtual void UpdateShapeGeometry(const istd::IChangeable::ChangeSet& changeSet) = 0;
75 virtual void DrawShapeGl(QOpenGLShaderProgram& program, QOpenGLFunctions& functions) = 0;
76
77protected:
78 void UpdateGeometry(const istd::IChangeable::ChangeSet& changeSet);
79 QMatrix4x4 GetModelMatrix() const;
80 QPoint ModelToWindow(const QVector3D& modelCoordinate) const;
81 QVector3D WindowToModel(const QPoint& windowCoordinate, float z) const;
82
83 void CreateGeometry();
84 void RefreshGeometry();
85
86 // reimplemented (imod::CSingleModelObserverBase)
87 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
88
89protected:
90 const imt3d::IPointsBasedObject* m_pointsDataPtr;
91 QVector<GLuint> m_indices;
92
93 QVector3D m_position;
94 QQuaternion m_rotation;
95 float m_scale;
96
97 QOpenGLContext* m_contextPtr;
98 const imt3dview::IScene3dCamera* m_cameraPtr;
99 QRect m_viewPort;
100 QOpenGLBuffer m_vertexBuffer;
101 QOpenGLBuffer m_indexBuffer;
102 QMatrix4x4 m_projection;
103
104#if QT_VERSION >= 0x060000
105 mutable QRecursiveMutex m_bufferMutex;
106#else
107 mutable QMutex m_bufferMutex;
108#endif
109
110 bool m_isVisible;
111};
112
113} // namespace imt3dgui
114
115