Skip to content
Snippets Groups Projects
Commit e7e8bf09 authored by Jan Müller's avatar Jan Müller
Browse files

Add LookupTable class

#470
parent e869e2e1
No related branches found
No related tags found
1 merge request!151Feature/#470 create a color lookup table
//------------------------------------------------------------------------------
// Project Phoenix
//
// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
// Virtual Reality & Immersive Visualization Group.
//------------------------------------------------------------------------------
// License
//
// Licensed under the 3-Clause BSD License (the "License");
// you may not use this file except in compliance with the License.
// See the file LICENSE for the full text.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//------------------------------------------------------------------------------
#include "phx/resources/types/lookup_table.hpp"
#include <memory>
namespace phx {
LookupTable::LookupTable(const TransferFunction& transfer_function,
int num_colors)
: min_key_(transfer_function.GetEntries().front().scalar),
max_key_(transfer_function.GetEntries().back().scalar),
transfer_function_(transfer_function) {
Generate(num_colors);
}
void LookupTable::Generate(int num_colors) {
float step = (max_key_ - min_key_) / (num_colors - 1);
for (auto i = 0; i < num_colors; ++i) {
lookup_table_.push_back(
transfer_function_.Interpolate(min_key_ + i * step));
}
}
glm::vec4 LookupTable::GetColor(int index) const {
return lookup_table_.at(index);
}
std::size_t LookupTable::GetIndex(float key) const {
return static_cast<std::size_t>(
std::round((GetSize() - 1) * ((key - min_key_) / (max_key_ - min_key_))));
}
std::size_t LookupTable::GetSize() const { return lookup_table_.size(); }
std::unique_ptr<gl::texture_1d> LookupTable::GetTexture1D() const {
auto lookup_texture = std::make_unique<gl::texture_1d>();
lookup_texture->set_storage(0, GL_RGBA,
static_cast<GLsizei>(lookup_table_.size()));
lookup_texture->set_sub_image(0, 0,
static_cast<GLsizei>(lookup_table_.size()),
GL_RGBA8, GL_FLOAT, lookup_table_.data());
return lookup_texture;
}
} // namespace phx
//------------------------------------------------------------------------------
// Project Phoenix
//
// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
// Virtual Reality & Immersive Visualization Group.
//------------------------------------------------------------------------------
// License
//
// Licensed under the 3-Clause BSD License (the "License");
// you may not use this file except in compliance with the License.
// See the file LICENSE for the full text.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//------------------------------------------------------------------------------
#ifndef LIBRARY_PHX_RESOURCES_TYPES_LOOKUP_TABLE_HPP_
#define LIBRARY_PHX_RESOURCES_TYPES_LOOKUP_TABLE_HPP_
#include <memory>
#include <vector>
#include "phx/resources/types/shader_source.hpp"
#include "phx/resources/types/transfer_function.hpp"
#include "phx/suppress_warnings.hpp"
SUPPRESS_WARNINGS_BEGIN
#include "gl/texture.hpp"
#include "glm/detail/type_vec4.hpp"
SUPPRESS_WARNINGS_END
namespace phx {
class PHOENIX_EXPORT LookupTable {
public:
LookupTable(const TransferFunction& transfer_function, int num_colors);
LookupTable(const LookupTable&) = default;
LookupTable(LookupTable&&) = default;
~LookupTable() = default;
std::size_t GetIndex(float key) const;
glm::vec4 GetColor(int index) const;
std::size_t GetSize() const;
std::unique_ptr<gl::texture_1d> GetTexture1D() const;
private:
void Generate(int num_colors);
float min_key_;
float max_key_;
std::vector<glm::vec4> lookup_table_;
const TransferFunction transfer_function_;
};
} // namespace phx
#endif // LIBRARY_PHX_RESOURCES_TYPES_LOOKUP_TABLE_HPP_
//------------------------------------------------------------------------------
// Project Phoenix
//
// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
// Virtual Reality & Immersive Visualization Group.
//------------------------------------------------------------------------------
// License
//
// Licensed under the 3-Clause BSD License (the "License");
// you may not use this file except in compliance with the License.
// See the file LICENSE for the full text.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//------------------------------------------------------------------------------
#include "phx/resources/types/lookup_table.hpp"
#include "phx/resources/types/transfer_function.hpp"
#include "catch/catch.hpp"
SCENARIO("Creating and accesing a Lookup Table", "[phx][phx::LookupTable]") {
GIVEN("A test transfer function") {
phx::TransferFunction transfer_function;
glm::vec4 red_color{1.0f, 0.0f, 0.0f, 0.0f};
glm::vec4 black_color{0.0f, 0.0f, 0.0f, 0.0f};
transfer_function.SetEntries({{0.0f, red_color}, {1.0f, black_color}});
WHEN("We create Lookup Table from the given Transfer function") {
phx::LookupTable lut(transfer_function, 11);
THEN("The Lookup Table is generated correctly") {
REQUIRE(lut.GetColor(0) == red_color);
REQUIRE(lut.GetColor(2) == glm::vec4(0.8f, 0.0f, 0.0f, 0.0f));
REQUIRE(lut.GetColor(5) == glm::vec4(0.5f, 0.0f, 0.0f, 0.0f));
REQUIRE(lut.GetColor(7) == glm::vec4(0.3f, 0.0f, 0.0f, 0.0f));
REQUIRE(lut.GetColor(10) == black_color);
}
THEN("Keys can be converted indices") {
REQUIRE(lut.GetIndex(0.0f) == 0);
REQUIRE(lut.GetIndex(1.0f) == 10);
REQUIRE(lut.GetIndex(0.56f) == 6);
}
}
WHEN("We ask for a nearest neighbor interpolated Lookup Table") {
transfer_function.SetMode(
phx::TransferFunction::InterpolationMode::NEAREST_NEIGHBOR);
phx::LookupTable lut(transfer_function, 11);
THEN("The Lookuptable is generated correctly") {
REQUIRE(lut.GetColor(0) == red_color);
REQUIRE(lut.GetColor(2) == red_color);
REQUIRE(lut.GetColor(5) == black_color);
REQUIRE(lut.GetColor(7) == black_color);
REQUIRE(lut.GetColor(10) == black_color);
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment