Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp @ 2021:1458f3bcb991
todo
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 03 Dec 2022 12:00:48 +0100 |
parents | 7053b8a0aaec |
children | 07964689cb0b |
rev | line source |
---|---|
594 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1871
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
594 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
594 | 10 * as published by the Free Software Foundation, either version 3 of |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1576
diff
changeset
|
17 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
594 | 21 **/ |
22 | |
23 | |
24 #include "OpenGLInfoPanelRenderer.h" | |
25 | |
26 namespace OrthancStone | |
27 { | |
28 namespace Internals | |
29 { | |
30 void OpenGLInfoPanelRenderer::LoadTexture(const InfoPanelSceneLayer& layer) | |
31 { | |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
32 if (!context_.IsContextLost()) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
33 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
34 context_.MakeCurrent(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
35 texture_.reset(new OpenGL::OpenGLTexture(context_)); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
36 texture_->Load(layer.GetTexture(), layer.IsLinearInterpolation()); |
1325
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
37 applySceneRotation_ = layer.ShouldApplySceneRotation(); |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
38 anchor_ = layer.GetAnchor(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
39 } |
594 | 40 } |
41 | |
42 OpenGLInfoPanelRenderer::OpenGLInfoPanelRenderer(OpenGL::IOpenGLContext& context, | |
43 OpenGLColorTextureProgram& program, | |
44 const InfoPanelSceneLayer& layer) : | |
45 context_(context), | |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
46 program_(program), |
1325
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
47 anchor_(BitmapAnchor_TopLeft), |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
48 applySceneRotation_(false) |
594 | 49 { |
50 LoadTexture(layer); | |
51 } | |
52 | |
888
6e888cf6a48b
renderers now have access to canvas width/height
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
594
diff
changeset
|
53 void OpenGLInfoPanelRenderer::Render(const AffineTransform2D& transform, |
6e888cf6a48b
renderers now have access to canvas width/height
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
594
diff
changeset
|
54 unsigned int canvasWidth, |
6e888cf6a48b
renderers now have access to canvas width/height
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
594
diff
changeset
|
55 unsigned int canvasHeight) |
594 | 56 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
57 if (!context_.IsContextLost() && texture_.get() != NULL) |
594 | 58 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
888
diff
changeset
|
59 int dx = 0, dy = 0; |
594 | 60 InfoPanelSceneLayer::ComputeAnchorLocation( |
61 dx, dy, anchor_, texture_->GetWidth(), texture_->GetHeight(), | |
888
6e888cf6a48b
renderers now have access to canvas width/height
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
594
diff
changeset
|
62 canvasWidth, canvasHeight); |
594 | 63 |
64 // The position of this type of layer is layer: Ignore the | |
65 // "transform" coming from the scene | |
1325
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
66 AffineTransform2D actualTransform = |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
67 AffineTransform2D::CreateOffset(dx, dy); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
68 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
69 if (applySceneRotation_) |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
70 { |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
71 // the transformation is as follows: |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
72 // - originally, the image is aligned so that its top left corner |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
73 // is at 0,0 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
74 // - first, we translate the image by -w/2,-h/2 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
75 // - then we rotate it, so that the next rotation will make the |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
76 // image rotate around its center. |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
77 // - then, we translate the image by +w/2,+h/2 to put it |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
78 // back in place |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
79 // - the fourth and last transform is the one that brings the |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
80 // image to its desired anchored location. |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
81 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
82 int32_t halfWidth = |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
83 static_cast<int32_t>(0.5 * texture_->GetWidth()); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
84 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
85 int32_t halfHeight= |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
86 static_cast<int32_t>(0.5 * texture_->GetHeight()); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
87 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
88 AffineTransform2D translation1 = |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
89 AffineTransform2D::CreateOffset(-halfWidth, -halfHeight); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
90 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
91 const Matrix& sceneTransformM = transform.GetHomogeneousMatrix(); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
92 Matrix r; |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
93 Matrix q; |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
94 LinearAlgebra::RQDecomposition3x3(r, q, sceneTransformM); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
95 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
96 // counterintuitively, q is the rotation and r is the upper |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
97 // triangular |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
98 AffineTransform2D rotation(q); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
99 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
100 AffineTransform2D translation2 = |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
101 AffineTransform2D::CreateOffset(halfWidth, halfHeight); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
102 |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
103 // please note that the last argument is the 1st applied |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
104 // transformation (rationale: if arguments are a, b and c, then |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
105 // the resulting matrix is a*b*c: |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
106 // x2 = (a*b*c)*x1 = (a*(b*(c*x1))) (you can see that the result |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
107 // of c*x1 is transformed by b, and the result of b*c*x1 is trans- |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
108 // formed by a) |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
109 actualTransform = AffineTransform2D::Combine(actualTransform, |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
110 translation2, |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
111 rotation, |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
112 translation1); |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
113 } |
be17fed8c7c5
Added flag in InfoPanelSceneLayer to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
114 |
1576
92fca2b3ba3d
sanitizing the handling of canvas size
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
115 program_.Apply(*texture_, actualTransform, canvasWidth, canvasHeight, true); |
594 | 116 } |
117 } | |
118 } | |
119 } |