Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/OpenGL/OpenGLFramebuffer.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 | 4e31d76c7ecd |
children |
rev | line source |
---|---|
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * License along with this program. If not, see |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "OpenGLFramebuffer.h" |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 #if defined(__EMSCRIPTEN__) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 # if !defined(ORTHANC_WEBGL2_HEAP_COMPAT) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 # error The macro ORTHANC_WEBGL2_HEAP_COMPAT must be defined |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 # endif |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 #endif |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 #include "OpenGLTexture.h" |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 #include "OpenGLTextureArray.h" |
2066
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
34 #include "OpenGLTextureVolume.h" |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 #include <OrthancException.h> |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 namespace OrthancStone |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 namespace OpenGL |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 void OpenGLFramebuffer::SetupTextureTarget() |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 }; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 glDrawBuffers(1, drawBuffers); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 "Incomplete setup of an OpenGL framebuffer"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 void OpenGLFramebuffer::ReadContent(Orthanc::ImageAccessor& target) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 if (target.GetPitch() != target.GetWidth() * Orthanc::GetBytesPerPixel(target.GetFormat()) || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 target.GetBuffer() == NULL) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 "Image must have minimal pitch"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 ORTHANC_OPENGL_CHECK("glCheckFramebufferStatus()"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 glViewport(0, 0, target.GetWidth(), target.GetHeight()); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 GLenum sourceFormat, internalFormat, pixelType; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 OpenGLTexture::ConvertToOpenGLFormats(sourceFormat, internalFormat, pixelType, target.GetFormat()); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 #if defined(__EMSCRIPTEN__) && (ORTHANC_WEBGL2_HEAP_COMPAT == 1) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 // Check out "OpenGLTexture.cpp" for an explanation |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 int framebufferFormat, framebufferType; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &framebufferFormat); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &framebufferType); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 switch (target.GetFormat()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 case Orthanc::PixelFormat_RGBA32: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 if (sourceFormat != GL_RGBA || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 internalFormat != GL_RGBA || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 pixelType != GL_UNSIGNED_BYTE || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 framebufferFormat != GL_RGBA || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 framebufferType != GL_UNSIGNED_BYTE) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 EM_ASM({ |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 var ptr = emscriptenWebGLGetTexPixelData(GLctx.UNSIGNED_BYTE, GLctx.RGBA, $1, $2, $0, GLctx.RGBA); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 GLctx.readPixels(0, 0, $1, $2, GLctx.RGBA, GLctx.UNSIGNED_BYTE, ptr); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 }, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 target.GetBuffer(), // $0 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 target.GetWidth(), // $1 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 target.GetHeight()); // $2 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 break; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 case Orthanc::PixelFormat_Float32: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 // In Mozilla Firefox, "Float32" is not available as such. We |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 // have to download an RGBA image in Float32. |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 if (sourceFormat != GL_RED || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 internalFormat != GL_R32F || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 pixelType != GL_FLOAT || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 framebufferType != GL_FLOAT) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 switch (framebufferFormat) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 case GL_RGBA: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 // This is Mozilla Firefox |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 EM_ASM({ |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 var tmp = new Float32Array($1 * $2 * 4); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 GLctx.readPixels(0, 0, $1, $2, GLctx.RGBA, GLctx.FLOAT, tmp); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 // From RGBA to RED |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 var ptr = emscriptenWebGLGetTexPixelData(GLctx.FLOAT, GLctx.RED, $1, $2, $0, GLctx.R32F); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 for (var i = 0; i < $1 * $2; i++) { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 ptr[i] = tmp[4 * i]; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 }, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 target.GetBuffer(), // $0 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 target.GetWidth(), // $1 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 target.GetHeight()); // $2 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 break; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 case GL_RED: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 // This is Chromium |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 EM_ASM({ |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 var ptr = emscriptenWebGLGetTexPixelData(GLctx.FLOAT, GLctx.RED, $1, $2, $0, GLctx.R32F); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 GLctx.readPixels(0, 0, $1, $2, GLctx.RED, GLctx.FLOAT, ptr); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 }, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 target.GetBuffer(), // $0 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 target.GetWidth(), // $1 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 target.GetHeight()); // $2 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 break; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 default: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 break; |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 default: |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 #else |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 glReadPixels(0, 0, target.GetWidth(), target.GetHeight(), sourceFormat, pixelType, target.GetBuffer()); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 #endif |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 ORTHANC_OPENGL_CHECK("glReadPixels()"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 else |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 "Incomplete setup of an OpenGL framebuffer"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 OpenGLFramebuffer::OpenGLFramebuffer(IOpenGLContext& context) : |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 context_(context), |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 framebuffer_(0) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 if (context.IsContextLost()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 "OpenGL context has been lost"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 glGenFramebuffers(1, &framebuffer_); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 if (framebuffer_ == 0) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 "Cannot create an OpenGL framebuffer"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 OpenGLFramebuffer::~OpenGLFramebuffer() |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 glDeleteFramebuffers(1, &framebuffer_); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 void OpenGLFramebuffer::SetTarget(OpenGLTexture& target) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target.GetId(), 0); |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
195 ORTHANC_OPENGL_CHECK("glFramebufferTexture2D()"); |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
196 |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 SetupTextureTarget(); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 glViewport(0, 0, target.GetWidth(), target.GetHeight()); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 void OpenGLFramebuffer::SetTarget(OpenGLTextureArray& target, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 unsigned int layer) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 if (layer >= target.GetDepth()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
206 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
207 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 else |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target.GetId(), 0, layer); |
2064
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
212 ORTHANC_OPENGL_CHECK("glFramebufferTextureLayer()"); |
4e31d76c7ecd
making ImageProcessingProgram compatible with 3D volumes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
213 |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
214 SetupTextureTarget(); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
215 glViewport(0, 0, target.GetWidth(), target.GetHeight()); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
216 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
218 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
219 |
2066
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
220 void OpenGLFramebuffer::SetTarget(OpenGLTextureVolume& target, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
221 unsigned int z) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
222 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
223 if (z >= target.GetDepth()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
224 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
225 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
226 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
227 else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
228 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
229 // Warning: "glFramebufferTexture3D()" is not available in WebGL 2 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
230 glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target.GetId(), 0, z); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
231 ORTHANC_OPENGL_CHECK("glFramebufferTextureLayer()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
232 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
233 SetupTextureTarget(); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
234 glViewport(0, 0, target.GetWidth(), target.GetHeight()); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
235 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
236 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
237 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
238 |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 void OpenGLFramebuffer::ReadTexture(Orthanc::ImageAccessor& target, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
240 const OpenGLTexture& source) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
241 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
242 if (target.GetWidth() != source.GetWidth() || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
243 target.GetHeight() != source.GetHeight()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
244 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
245 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
246 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
247 else if (target.GetFormat() != source.GetFormat()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
248 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
250 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
251 else |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, source.GetId(), 0); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
254 ORTHANC_OPENGL_CHECK("glFramebufferTexture2D()"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
255 ReadContent(target); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 void OpenGLFramebuffer::ReadTexture(Orthanc::ImageAccessor& target, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
261 const OpenGLTextureArray& source, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 unsigned int layer) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 if (target.GetWidth() != source.GetWidth() || |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
265 target.GetHeight() != source.GetHeight()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
266 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
267 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
268 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
269 else if (target.GetFormat() != source.GetFormat()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
270 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
271 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
272 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
273 else if (layer >= source.GetDepth()) |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
274 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
275 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
276 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
277 else |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
278 { |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
279 glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, source.GetId(), 0, layer); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
280 ORTHANC_OPENGL_CHECK("glFramebufferTextureLayer()"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
281 ReadContent(target); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
282 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
283 } |
2066
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
284 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
285 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
286 void OpenGLFramebuffer::ReadTexture(Orthanc::ImageAccessor& target, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
287 const OpenGLTextureVolume& source, |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
288 unsigned int z) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
289 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
290 if (target.GetWidth() != source.GetWidth() || |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
291 target.GetHeight() != source.GetHeight()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
292 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
293 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
294 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
295 else if (target.GetFormat() != source.GetFormat()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
296 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
297 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
298 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
299 else if (z >= source.GetDepth()) |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
300 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
301 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
302 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
303 else |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
304 { |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
305 // Warning: "glFramebufferTexture3D()" is not available in WebGL 2 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
306 glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, source.GetId(), 0, z); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
307 ORTHANC_OPENGL_CHECK("glFramebufferTextureLayer()"); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
308 |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
309 ReadContent(target); |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
310 } |
cf3d85eb291c
added class OpenGLTextureVolume
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2064
diff
changeset
|
311 } |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
312 } |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
313 } |