KWin
Loading...
Searching...
No Matches
gllut3D.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "gllut3D.h"
10
11#include <vector>
12
13namespace KWin
14{
15
16GlLookUpTable3D::GlLookUpTable3D(GLuint handle, size_t xSize, size_t ySize, size_t zSize)
17 : m_handle(handle)
18 , m_xSize(xSize)
19 , m_ySize(ySize)
20 , m_zSize(zSize)
21{
22}
23
25{
26 glDeleteTextures(1, &m_handle);
27}
28
30{
31 return m_handle;
32}
33
35{
36 return m_xSize;
37}
38
40{
41 return m_ySize;
42}
43
45{
46 return m_zSize;
47}
48
50{
51 glBindTexture(GL_TEXTURE_3D, m_handle);
52}
53
54std::unique_ptr<GlLookUpTable3D> GlLookUpTable3D::create(const std::function<QVector3D(size_t x, size_t y, size_t z)> &mapping, size_t xSize, size_t ySize, size_t zSize)
55{
56 GLuint handle = 0;
57 glGenTextures(1, &handle);
58 if (!handle) {
59 return nullptr;
60 }
61 glBindTexture(GL_TEXTURE_3D, handle);
62 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
63 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_LOD, 0);
64 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LOD, 0);
65 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
66 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
67 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
68 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
69 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
70 QVector<float> data;
71 data.reserve(4 * xSize * ySize * zSize);
72 for (size_t z = 0; z < zSize; z++) {
73 for (size_t y = 0; y < ySize; y++) {
74 for (size_t x = 0; x < xSize; x++) {
75 const auto color = mapping(x, y, z);
76 data.push_back(color.x());
77 data.push_back(color.y());
78 data.push_back(color.z());
79 data.push_back(1);
80 }
81 }
82 }
83 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F, xSize, ySize, zSize, 0, GL_RGBA, GL_FLOAT, data.data());
84 glBindTexture(GL_TEXTURE_3D, 0);
85 return std::make_unique<GlLookUpTable3D>(handle, xSize, ySize, zSize);
86}
87
88}
static std::unique_ptr< GlLookUpTable3D > create(const std::function< QVector3D(size_t x, size_t y, size_t z)> &mapping, size_t xSize, size_t ySize, size_t zSize)
Definition gllut3D.cpp:54
GLuint handle() const
Definition gllut3D.cpp:29
size_t xSize() const
Definition gllut3D.cpp:34
GlLookUpTable3D(GLuint handle, size_t xSize, size_t ySize, size_t zSize)
Definition gllut3D.cpp:16
size_t ySize() const
Definition gllut3D.cpp:39
size_t zSize() const
Definition gllut3D.cpp:44