annotate OrthancStone/Sources/OpenGL/OpenGLTextureVolume.cpp @ 2078:fdb012c86a75 deep-learning

integration mainline->deep-learning
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 12 Jul 2023 21:21:11 +0200
parents cf3d85eb291c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }