Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/OpenGL/OpenGLTexture.cpp @ 2048:a05b03f45289 deep-learning
added ORTHANC_WEBGL2_HEAP_COMPAT
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 08 Mar 2023 17:46:04 +0100 |
parents | 0b596428e60c |
children | 66c130af0d3c |
rev | line source |
---|---|
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
1871
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1564
diff
changeset
|
17 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "OpenGLTexture.h" |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
25 #include "IOpenGLContext.h" |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
27 #include <Images/Image.h> |
1624 | 28 #include <Logging.h> |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1270
diff
changeset
|
29 #include <OrthancException.h> |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
31 #if defined(__EMSCRIPTEN__) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
32 # if !defined(ORTHANC_WEBGL2_HEAP_COMPAT) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
33 # error The macro ORTHANC_WEBGL2_HEAP_COMPAT must be defined |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
34 # endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
35 #endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
36 |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 namespace OrthancStone |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 namespace OpenGL |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 { |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
41 OpenGLTexture::OpenGLTexture(OpenGL::IOpenGLContext& context) : |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
42 texture_(0), |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
43 width_(0), |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
44 height_(0), |
2047
0b596428e60c
added OpenGLTexture::GetFormat()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2046
diff
changeset
|
45 format_(Orthanc::PixelFormat_Grayscale8), |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
46 context_(context) |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
48 if (!context_.IsContextLost()) |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
50 // Generate a texture object |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
51 glGenTextures(1, &texture_); |
2045
e5c812a36746
added support of WebGL2 in WebAssemblyOpenGLContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2044
diff
changeset
|
52 ORTHANC_OPENGL_CHECK("glGenTextures()"); |
e5c812a36746
added support of WebGL2 in WebAssemblyOpenGLContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2044
diff
changeset
|
53 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
54 if (texture_ == 0) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
55 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
56 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
57 "Cannot create an OpenGL texture"); |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
58 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 OpenGLTexture::~OpenGLTexture() |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
64 try |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
65 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
66 if (!context_.IsContextLost()) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
67 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
68 assert(texture_ != 0); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
69 ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteTextures"); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
70 glDeleteTextures(1, &texture_); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
71 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
72 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
73 catch (const Orthanc::OrthancException& e) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
74 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
75 if (e.HasDetails()) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
76 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
77 LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What() << " Details: " << e.GetDetails(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
78 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
79 else |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
80 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
81 LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
82 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
83 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
84 catch (const std::exception& e) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
85 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
86 LOG(ERROR) << "std::exception in ~OpenGLTexture: " << e.what(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
87 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
88 catch (...) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
89 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
90 LOG(ERROR) << "Unknown exception in ~OpenGLTexture"; |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
91 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 |
2034 | 94 void OpenGLTexture::Setup(Orthanc::PixelFormat format, |
95 unsigned int width, | |
96 unsigned int height, | |
97 bool isLinearInterpolation, | |
98 const void* data) | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 { |
2034 | 100 if (context_.IsContextLost()) |
101 { | |
102 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, | |
103 "OpenGL context has been lost"); | |
104 } | |
105 else | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
107 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Disable byte-alignment restriction |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
109 // Bind it |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
110 glActiveTexture(GL_TEXTURE0); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
111 glBindTexture(GL_TEXTURE_2D, texture_); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
113 GLenum sourceFormat, internalFormat, pixelType; |
2037
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
114 ConvertToOpenGLFormats(sourceFormat, internalFormat, pixelType, format); |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
115 |
2047
0b596428e60c
added OpenGLTexture::GetFormat()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2046
diff
changeset
|
116 format_ = format; |
2034 | 117 width_ = width; |
118 height_ = height; | |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
119 |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
120 GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
122 // Load the texture from the image buffer |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
123 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
124 #if defined(__EMSCRIPTEN__) && (ORTHANC_WEBGL2_HEAP_COMPAT == 1) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
125 /** |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
126 * This compatibility implementation seems to be necessary |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
127 * with WebGL2, at least in Web workers. In such a situation, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
128 * the calls that are referred to as the "new garbage-free |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
129 * entry points" in the Emscripten source file |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
130 * "upstream/emscripten/src/library_webgl.js" seem to fail, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
131 * because the "Uint8Array" and "Float32Array" seem to be |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
132 * incorrectly created. This compatibility reverts to the |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
133 * WebGL1 behavior of "library_webgl.js", which requires the |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
134 * function "emscriptenWebGLGetTexPixelData" that is defined |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
135 * in "upstream/emscripten/src/library_webgl.js" to be |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
136 * exported in the linker using option |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
137 * "EXTRA_EXPORTED_RUNTIME_METHODS" or |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
138 * "EXPORTED_RUNTIME_METHODS". |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
139 **/ |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
140 EM_ASM({ |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
141 var ptr = $0 ? emscriptenWebGLGetTexPixelData($5, $4, $2, $3, $0, $1) : null; |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
142 GLctx.texImage2D(GLctx.TEXTURE_2D, 0, $1, $2, $3, 0, $4, $5, ptr); |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
143 }, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
144 data, // $0 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
145 internalFormat, // $1 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
146 width, // $2 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
147 height, // $3 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
148 sourceFormat, // $4 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
149 pixelType); // $5 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
150 #else |
2034 | 151 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, |
152 0, sourceFormat, pixelType, data); | |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
153 #endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
154 |
2046 | 155 ORTHANC_OPENGL_CHECK("glTexImage2D()"); |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
156 |
2043 | 157 #if !defined(__EMSCRIPTEN__) |
2046 | 158 /** |
159 * glGetTexLevelParameteriv() was introduced in OpenGL ES 3.1, | |
160 * but WebGL 2 only supports OpenGL ES 3.0, so it is not | |
161 * available in WebAssembly: | |
162 * https://registry.khronos.org/OpenGL-Refpages/es3.1/html/glGetTexLevelParameter.xhtml | |
163 **/ | |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
164 GLint w, h; |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
165 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
166 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
167 if (width != static_cast<unsigned int>(w) || |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
168 height != static_cast<unsigned int>(h)) |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
169 { |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
170 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
171 "Your GPU cannot create a texture of size " + |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
172 boost::lexical_cast<std::string>(width) + " x " + |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
173 boost::lexical_cast<std::string>(height)); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
174 } |
2043 | 175 #endif |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
176 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
177 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, interpolation); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
178 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, interpolation); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
179 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
180 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
181 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 |
2034 | 184 void OpenGLTexture::Load(const Orthanc::ImageAccessor& image, |
185 bool isLinearInterpolation) | |
186 { | |
187 if (image.GetPitch() != image.GetBytesPerPixel() * image.GetWidth()) | |
188 { | |
189 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, | |
190 "Pitch is not the same as the row size"); | |
191 } | |
192 else | |
193 { | |
194 Setup(image.GetFormat(), image.GetWidth(), image.GetHeight(), | |
195 isLinearInterpolation, image.GetConstBuffer()); | |
196 } | |
197 } | |
198 | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 |
2039 | 200 void OpenGLTexture::Bind(GLint location) const |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 glActiveTexture(GL_TEXTURE0); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 glBindTexture(GL_TEXTURE_2D, texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 glUniform1i(location, 0 /* texture unit */); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 } |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
206 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
207 |
2042
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
208 void OpenGLTexture::BindAsTextureUnit(GLint location, |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
209 unsigned int unit) const |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
210 { |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
211 if (unit >= 32) |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
212 { |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
213 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
214 } |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
215 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
216 assert(GL_TEXTURE0 + 1 == GL_TEXTURE1 && |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
217 GL_TEXTURE0 + 31 == GL_TEXTURE31); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
218 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
219 glActiveTexture(GL_TEXTURE0 + unit); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
220 glBindTexture(GL_TEXTURE_2D, texture_); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
221 glUniform1i(location, unit /* texture unit */); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
222 } |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
223 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
224 |
2039 | 225 Orthanc::ImageAccessor* OpenGLTexture::Download(Orthanc::PixelFormat format) const |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
226 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
227 if (context_.IsContextLost()) |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
228 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
229 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
230 "OpenGL context is lost"); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
231 } |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
232 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
233 std::unique_ptr<Orthanc::ImageAccessor> target(new Orthanc::Image(format, width_, height_, true)); |
2033
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
234 assert(target->GetPitch() == width_ * Orthanc::GetBytesPerPixel(format)); |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
235 |
2044 | 236 #if defined(__EMSCRIPTEN__) |
237 /** | |
238 * The "glGetTexImage()" is unavailable in WebGL, it is | |
239 * necessary to use a framebuffer: | |
240 * https://stackoverflow.com/a/15064957 | |
241 **/ | |
242 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
243 | |
244 #else | |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
245 glBindTexture(GL_TEXTURE_2D, texture_); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
246 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
247 switch (format) |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
248 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
249 case Orthanc::PixelFormat_Grayscale8: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
250 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RED, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
251 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
252 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
253 case Orthanc::PixelFormat_RGB24: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
254 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RGB, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
255 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
256 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
257 case Orthanc::PixelFormat_RGBA32: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
258 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RGBA, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
259 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
260 |
2033
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
261 case Orthanc::PixelFormat_Float32: |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
262 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RED, GL_FLOAT, target->GetBuffer()); |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
263 break; |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
264 |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
265 default: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
266 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
267 } |
2044 | 268 #endif |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
269 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
270 return target.release(); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
271 } |
2035
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
272 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
273 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
274 void OpenGLTexture::SetClampingToZero() |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
275 { |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
276 glBindTexture(GL_TEXTURE_2D, texture_); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
277 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
278 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
279 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
280 GLfloat colorfv[4] = { 0, 0, 0, 0 }; |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
281 glTextureParameterfv(texture_, GL_TEXTURE_BORDER_COLOR, colorfv); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
282 } |
2037
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
283 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
284 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
285 void OpenGLTexture::ConvertToOpenGLFormats(GLenum& sourceFormat, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
286 GLenum& internalFormat, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
287 GLenum& pixelType, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
288 Orthanc::PixelFormat format) |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
289 { |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
290 switch (format) |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
291 { |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
292 case Orthanc::PixelFormat_Grayscale8: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
293 sourceFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
294 internalFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
295 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
296 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
297 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
298 case Orthanc::PixelFormat_RGB24: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
299 sourceFormat = GL_RGB; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
300 internalFormat = GL_RGB; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
301 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
302 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
303 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
304 case Orthanc::PixelFormat_RGBA32: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
305 sourceFormat = GL_RGBA; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
306 internalFormat = GL_RGBA; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
307 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
308 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
309 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
310 case Orthanc::PixelFormat_Float32: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
311 sourceFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
312 internalFormat = GL_R32F; // Don't use "GL_RED" here, as it clamps to [0,1] |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
313 pixelType = GL_FLOAT; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
314 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
315 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
316 default: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
317 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
318 "No support for this format in OpenGL textures: " + |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
319 std::string(EnumerationToString(format))); |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
320 } |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
321 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
322 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
323 } |