Mercurial > hg > orthanc-stone
annotate Framework/OpenGL/OpenGLTexture.cpp @ 819:a68cd7ae8838
fix
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 29 May 2019 13:39:31 +0200 |
parents | 97926984d5d0 |
children | 1091b2adeb5a |
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 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * 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
|
10 * the License, or (at your option) any later version. |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * 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
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
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 #include "OpenGLTexture.h" |
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 <Core/OrthancException.h> |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 namespace OrthancStone |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 namespace OpenGL |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 OpenGLTexture::OpenGLTexture() : |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 width_(0), |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 height_(0) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 // Generate a texture object |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 glGenTextures(1, &texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 if (texture_ == 0) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 "Cannot create an OpenGL program"); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 OpenGLTexture::~OpenGLTexture() |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 assert(texture_ != 0); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 glDeleteTextures(1, &texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 void OpenGLTexture::Load(const Orthanc::ImageAccessor& image, |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 bool isLinearInterpolation) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Disable byte-alignment restriction |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 if (image.GetPitch() != image.GetBytesPerPixel() * image.GetWidth()) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 "Unsupported non-zero padding"); |
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 // Bind it |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 glActiveTexture(GL_TEXTURE0); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 glBindTexture(GL_TEXTURE_2D, texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 GLenum sourceFormat, internalFormat; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 switch (image.GetFormat()) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 case Orthanc::PixelFormat_Grayscale8: |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 sourceFormat = GL_RED; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 internalFormat = GL_RED; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 break; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 case Orthanc::PixelFormat_RGB24: |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 sourceFormat = GL_RGB; |
616
97926984d5d0
WebAssembly sample using Scene2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
579
diff
changeset
|
77 internalFormat = GL_RGB; |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 break; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 case Orthanc::PixelFormat_RGBA32: |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 sourceFormat = GL_RGBA; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 internalFormat = GL_RGBA; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 break; |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 default: |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 "No support for this format in OpenGL textures: " + |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 std::string(EnumerationToString(image.GetFormat()))); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 width_ = image.GetWidth(); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 height_ = image.GetHeight(); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 // Load the texture from the image buffer |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, image.GetWidth(), image.GetHeight(), |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 0, sourceFormat, GL_UNSIGNED_BYTE, image.GetBuffer()); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, interpolation); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, interpolation); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 void OpenGLTexture::Bind(GLint location) |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 glActiveTexture(GL_TEXTURE0); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 glBindTexture(GL_TEXTURE_2D, texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 glUniform1i(location, 0 /* texture unit */); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 } |