Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/OpenGL/OpenGLTextureVolume.cpp @ 2066:cf3d85eb291c deep-learning
added class OpenGLTextureVolume
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 04 May 2023 17:18:14 +0200 |
parents | |
children |
rev | line source |
---|---|
2066
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * License along with this program. If not, see |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "OpenGLTextureVolume.h" |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 #include "OpenGLFramebuffer.h" |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 #include "OpenGLTexture.h" |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 #include <Images/Image.h> |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 #include <OrthancException.h> |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 #include <boost/lexical_cast.hpp> |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 #include <cassert> |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 namespace OrthancStone |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 namespace OpenGL |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 OpenGLTextureVolume::OpenGLTextureVolume(IOpenGLContext& context) : |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 context_(context), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 texture_(0), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 width_(0), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 height_(0), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 depth_(0), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 format_(Orthanc::PixelFormat_Float32), |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 isLinearInterpolation_(false) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 if (context.IsContextLost()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 "OpenGL context has been lost"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 glGenTextures(1, &texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 ORTHANC_OPENGL_CHECK("glGenTextures()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 if (texture_ == 0) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 "Cannot create an OpenGL texture array"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 OpenGLTextureVolume::~OpenGLTextureVolume() |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 assert(texture_ != 0); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 glDeleteTextures(1, &texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 void OpenGLTextureVolume::Setup(Orthanc::PixelFormat format, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 unsigned int width, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 unsigned int height, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 unsigned int depth, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 bool isLinearInterpolation) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 glActiveTexture(GL_TEXTURE0); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 ORTHANC_OPENGL_CHECK("glBindTexture(GL_TEXTURE_3D)"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 GLenum sourceFormat, internalFormat, pixelType; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 OpenGLTexture::ConvertToOpenGLFormats(sourceFormat, internalFormat, pixelType, format); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 glTexImage3D(GL_TEXTURE_3D, 0, internalFormat, width, height, depth, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 0, sourceFormat, pixelType, NULL); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 ORTHANC_OPENGL_CHECK("glTexImage3D()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 #if !defined(__EMSCRIPTEN__) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 /** |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 * glGetTexLevelParameteriv() was introduced in OpenGL ES 3.1, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 * but WebGL 2 only supports OpenGL ES 3.0, so it is not |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 * available in WebAssembly: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 * https://registry.khronos.org/OpenGL-Refpages/es3.1/html/glGetTexLevelParameter.xhtml |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 **/ |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 GLint w, h, d; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &w); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &h); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 glGetTexLevelParameteriv(GL_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &d); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 if (width != static_cast<unsigned int>(w) || |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 height != static_cast<unsigned int>(h) || |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 depth != static_cast<unsigned int>(d)) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 "Your GPU cannot create a 3D texture of size " + |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 boost::lexical_cast<std::string>(width) + " x " + |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 boost::lexical_cast<std::string>(height) + " x " + |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 boost::lexical_cast<std::string>(depth)); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 #endif |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 format_ = format; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 width_ = width; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 height_ = height; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 depth_ = depth; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 isLinearInterpolation_ = isLinearInterpolation; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, interpolation); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, interpolation); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 void OpenGLTextureVolume::SetClampingToZero() |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 #if defined(__EMSCRIPTEN__) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 /** |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 * This is because WebGL 2 derives from OpenGL ES 3.0, which |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 * doesn't support GL_CLAMP_TO_BORDER, as can be seen here: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 * https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexParameter.xhtml |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 **/ |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 "OpenGLTextureArray::SetClampingToZero() is not available in WebGL 2"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 #else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 ORTHANC_OPENGL_CHECK("Entering OpenGLTextureArray::SetClampingToZero()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 GLfloat colorfv[4] = { 0, 0, 0, 0 }; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 glTexParameterfv(texture_, GL_TEXTURE_BORDER_COLOR, colorfv); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 ORTHANC_OPENGL_CHECK("Exiting OpenGLTextureArray::SetClampingToZero()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 #endif |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 void OpenGLTextureVolume::Bind(GLint location) const |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 glActiveTexture(GL_TEXTURE0); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 glUniform1i(location, 0 /* texture unit */); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 void OpenGLTextureVolume::BindAsTextureUnit(GLint location, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 unsigned int unit) const |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 if (unit >= 32) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 assert(GL_TEXTURE0 + 1 == GL_TEXTURE1 && |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 GL_TEXTURE0 + 31 == GL_TEXTURE31); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 glActiveTexture(GL_TEXTURE0 + unit); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 glUniform1i(location, unit /* texture unit */); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 void OpenGLTextureVolume::Upload(const Orthanc::ImageAccessor& image, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 unsigned int z) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 if (image.GetWidth() != width_ || |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 image.GetHeight() != height_) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 else if (z >= depth_) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 else if (image.GetPitch() != Orthanc::GetBytesPerPixel(format_) * width_) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Minimal pitch is required for upload"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 else if (width_ != 0 && |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 height_ != 0) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 GLenum sourceFormat, internalFormat, pixelType; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 OpenGLTexture::ConvertToOpenGLFormats(sourceFormat, internalFormat, pixelType, image.GetFormat()); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 #if defined(__EMSCRIPTEN__) && (ORTHANC_WEBGL2_HEAP_COMPAT == 1) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 // Check out "OpenGLTexture.cpp" for an explanation |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 EM_ASM({ |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 var ptr = emscriptenWebGLGetTexPixelData($5, $4, $2, $3, $0, $1); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
206 GLctx.texSubImage3D(GLctx.TEXTURE_3D, 0, 0 /* x offset */, 0 /* y offset */, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
207 $6, $2, $3, 1 /* depth */, $4, $5, ptr); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 }, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 image.GetConstBuffer(), // $0 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 internalFormat, // $1 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 image.GetWidth(), // $2 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 image.GetHeight(), // $3 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
213 sourceFormat, // $4 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
214 pixelType, // $5 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
215 z); // $6 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
216 #else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 glTexSubImage3D(GL_TEXTURE_3D, 0, 0 /* x offset */, 0 /* y offset */, z /* z offset */, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
218 width_, height_, 1 /* depth */, sourceFormat, pixelType, image.GetConstBuffer()); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
219 #endif |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
222 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
223 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
224 size_t OpenGLTextureVolume::GetMemoryBufferSize() const |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
225 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
226 return static_cast<size_t>(Orthanc::GetBytesPerPixel(format_)) * width_ * height_ * depth_; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
227 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
228 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
229 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
230 void OpenGLTextureVolume::Download(void* targetBuffer, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
231 size_t targetSize) const |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
232 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
233 if (targetSize != GetMemoryBufferSize()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
234 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
235 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
237 else if (targetSize == 0) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
238 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 return; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
240 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
241 else if (targetBuffer == NULL) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
242 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
243 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
244 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
245 else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
246 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
247 #if 1 || defined(__EMSCRIPTEN__) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
248 /** |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 * The "glGetTexImage()" function is unavailable in WebGL, it |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
250 * is necessary to use a framebuffer: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
251 * https://stackoverflow.com/a/15064957 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 **/ |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 OpenGLFramebuffer framebuffer(context_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
254 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
255 const size_t sliceSize = targetSize / depth_; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 Orthanc::Image tmp(GetFormat(), GetWidth(), GetHeight(), true); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 if (sliceSize != tmp.GetPitch() * height_) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
261 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 for (unsigned int z = 0; z < depth_; z++) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
265 framebuffer.ReadTexture(tmp, *this, z); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
266 memcpy(reinterpret_cast<uint8_t*>(targetBuffer) + z * sliceSize, tmp.GetBuffer(), sliceSize); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
267 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
268 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
269 #else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
270 glBindTexture(GL_TEXTURE_3D, texture_); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
271 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
272 switch (format_) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
273 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
274 case Orthanc::PixelFormat_Grayscale8: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
275 glGetTexImage(GL_TEXTURE_3D, 0 /* base level */, GL_RED, GL_UNSIGNED_BYTE, targetBuffer); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
276 break; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
277 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
278 case Orthanc::PixelFormat_RGB24: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
279 glGetTexImage(GL_TEXTURE_3D, 0 /* base level */, GL_RGB, GL_UNSIGNED_BYTE, targetBuffer); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
280 break; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
281 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
282 case Orthanc::PixelFormat_RGBA32: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
283 glGetTexImage(GL_TEXTURE_3D, 0 /* base level */, GL_RGBA, GL_UNSIGNED_BYTE, targetBuffer); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
284 break; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
285 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
286 case Orthanc::PixelFormat_Float32: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
287 glGetTexImage(GL_TEXTURE_3D, 0 /* base level */, GL_RED, GL_FLOAT, targetBuffer); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
288 break; |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
289 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
290 default: |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
292 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
293 #endif |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
294 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
295 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
296 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
297 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
298 void OpenGLTextureVolume::Download(std::string& target) const |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
299 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
300 target.resize(GetMemoryBufferSize()); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
301 Download(target); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
302 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
303 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
304 } |