1#ifndef GUIK_SHADER_SETTING_HPP
2#define GUIK_SHADER_SETTING_HPP
6#include <unordered_map>
40enum class ShaderDataType {
INT = 0,
INT2,
INT3,
INT4,
FLOAT,
FLOAT2,
FLOAT3,
FLOAT4,
MATRIX4,
INT_ARRAY,
FLOAT_ARRAY,
INVALID };
45 if constexpr (std::is_same<T, int>::value) {
47 }
else if constexpr (std::is_same<T, Eigen::Vector2i>::value) {
49 }
else if constexpr (std::is_same<T, Eigen::Vector3i>::value) {
51 }
else if constexpr (std::is_same<T, Eigen::Vector4i>::value) {
53 }
else if constexpr (std::is_same<T, float>::value) {
55 }
else if constexpr (std::is_same<T, Eigen::Vector2f>::value) {
57 }
else if constexpr (std::is_same<T, Eigen::Vector3f>::value) {
59 }
else if constexpr (std::is_same<T, Eigen::Vector4f>::value) {
61 }
else if constexpr (std::is_same<T, Eigen::Matrix4f>::value) {
63 }
else if constexpr (std::is_same<T, std::vector<int>>::value) {
65 }
else if constexpr (std::is_same<T, std::vector<float>>::value) {
99 if (
type != deduce_data_type<T>()) {
100 std::cerr <<
"error: type mismatch when getting shader parameter " <<
name << std::endl;
104 if constexpr (std::is_same<T, std::vector<int>>::value || std::is_same<T, std::vector<float>>::value) {
105 const int* ptr =
reinterpret_cast<const int*
>(&
mat4f);
106 int num_data = ptr[0];
109 memcpy(v.data(), &ptr[1],
sizeof(
typename T::value_type) * num_data);
112 return *
reinterpret_cast<const T*
>(&
mat4f);
117 template <
typename T>
119 if (
type != deduce_data_type<T>()) {
120 std::cerr <<
"error: type mismatch when getting shader parameter " <<
name << std::endl;
124 if constexpr (std::is_same<T, std::vector<int>>::value || std::is_same<T, std::vector<float>>::value) {
125 if (value.size() > 15) {
126 std::cerr <<
"error: array size exceeds the maximum limit of 15 for shader parameter " <<
name << std::endl;
130 int* ptr =
reinterpret_cast<int*
>(&
mat4f);
131 ptr[0] =
static_cast<int>(value.size());
132 memcpy(&ptr[1], value.data(),
sizeof(
typename T::value_type) * value.size());
134 *
reinterpret_cast<T*
>(&
mat4f) = value;
175 std::cerr <<
"error: invalid shader parameter type for " <<
name << std::endl;
189 using Ptr = std::shared_ptr<ShaderSetting>;
190 using ConstPtr = std::shared_ptr<const ShaderSetting>;
211 template <
typename Transform>
230 template <
typename T>
232 const std::uint64_t name =
glk::hash(name_);
234 for (
int i = 0; i <
params.size() &&
params[i].valid(); i++) {
235 if (
params[i].name == name) {
248 template <
typename T>
249 std::optional<T>
get(
const std::string& name_) {
250 const std::uint64_t name =
glk::hash(name_);
252 for (
const auto& param :
params) {
253 if (!param.valid() || param.name != name) {
257 if (param.type != deduce_data_type<T>()) {
258 std::cerr <<
"warning: type mismatch for shader parameter " << name_ << std::endl;
262 return param.get_value<T>();
271 template <
typename T>
272 std::optional<T>
get(
const std::string& name_)
const {
273 const std::uint64_t name =
glk::hash(name_);
275 for (
const auto& param :
params) {
276 if (!param.valid() || param.name != name) {
280 if (param.type != deduce_data_type<T>()) {
281 std::cerr <<
"warning: type mismatch for shader parameter " << name_ << std::endl;
285 return param.get_value<T>();
294 template <
typename T>
295 T
cast(
const std::string& name_)
const {
296 const std::uint64_t name =
glk::hash(name_);
298 for (
const auto& param :
params) {
299 if (!param.valid() || param.name != name) {
303 if (param.type != deduce_data_type<T>()) {
304 std::cerr <<
"error: type mismatch for shader parameter " << name << std::endl;
308 return param.get_value<T>();
311 std::cerr <<
"error: " << name <<
" not found in the param list" << std::endl;
333 template <
typename Color>
335 const Eigen::Vector4f color = color_.template cast<float>();
336 if (color.w() < 0.999f) {
339 return add(
"material_color", color);
407 template <
typename Transform>
409 Eigen::Matrix4f mat = (
transform.template cast<float>() * Eigen::Isometry3f::Identity()).matrix();
412 p.set_value<Eigen::Matrix4f>(mat);
419 template <
typename Transform>
422 Eigen::Matrix4f current = p.get_value<Eigen::Matrix4f>();
423 Eigen::Matrix4f trans_mat = (
transform.template cast<float>() * Eigen::Isometry3f::Identity()).matrix();
424 p.set_value<Eigen::Matrix4f>(current * trans_mat);
434 template <
typename Vector>
438 p.mat4f.block<3, 1>(0, 3) += trans.template cast<float>().template head<3>();
445 template <
typename Vector>
447 const Eigen::Vector3f ax = axis.eval().template cast<float>();
449 p.mat4f = p.mat4f * (Eigen::Isometry3f::Identity() * Eigen::AngleAxisf(angle, ax)).matrix();
454 template <
typename Scalar>
457 p.mat4f = p.mat4f * (Eigen::Isometry3f::Identity() * quat.template cast<float>()).matrix();
462 template <
typename Scalar,
int Dim>
464 Eigen::Isometry3f R = Eigen::Isometry3f::Identity();
465 R.linear() = rot.template cast<float>().template block<3, 3>(0, 0);
468 p.mat4f = p.mat4f * R.matrix();
480 template <
typename Vector>
483 const auto s = scaling.eval();
484 p.mat4f.col(0) *= s[0];
485 p.mat4f.col(1) *= s[1];
486 p.mat4f.col(2) *= s[2];
497 return add<Eigen::Matrix4f>(name, value.matrix());
502 return add<Eigen::Matrix4f>(name, value.matrix());
512 template <
typename Transform>
523 add(
"material_color", Eigen::Vector4f(r, g, b, a));
528 add(
"material_color", color);
532 template <
typename Transform>
535 add(
"material_color", color);
539 template <
typename Color>
541 const Eigen::Vector4f c = color.eval().template cast<float>();
542 add(
"material_color", c);
546 template <
typename Transform>
549 add(
"material_color", Eigen::Vector4f(r, g, b, a));
553 template <
typename Color,
typename Transform>
556 const Eigen::Vector4f c = color.eval().template cast<float>();
557 add(
"material_color", c);
561 template <
typename T>
563 Eigen::Vector4f color = Eigen::Vector4f::Zero();
564 std::copy(i.begin(), i.end(), color.data());
565 add(
"material_color", color);
569 template <
typename T,
typename Transform>
572 Eigen::Vector4f color = Eigen::Vector4f::Zero();
573 std::copy(i.begin(), i.end(), color.data());
574 add(
"material_color", color);
586 template <
typename Transform>
594 template <
typename Transform>
602 template <
typename Transform>
610 template <
typename Transform>
618 template <
typename Transform>
626 template <
typename Transform>
634 template <
typename Transform>
642 template <
typename Transform>
651 template <
typename Transform>
662 template <
typename Transform>
673 template <
typename Transform>
Definition glsl_shader.hpp:20
void set_uniform(std::uint64_t name, int value, const char *debug_msg=nullptr)
std::uint64_t hash(const void *data, std::size_t size, std::uint64_t seed=0)
RapidHash (https://github.com/Nicoshev/rapidhash)
Definition drawable_container.hpp:9
ShaderDataType
Data type of shader parameter.
Definition shader_setting.hpp:40
ShaderDataType deduce_data_type()
Deduce shader data type from C++ type.
Definition shader_setting.hpp:44
Fragment color mode. RAINBOW : Color mapped by 3D coordinates of pixels (by default,...
Definition shader_setting.hpp:21
MODE
Definition shader_setting.hpp:22
@ VERTEX_COLOR
Definition shader_setting.hpp:22
@ FLAT_COLOR
Definition shader_setting.hpp:22
@ TEXTURE_COLOR
Definition shader_setting.hpp:22
@ VERTEX_COLORMAP
Definition shader_setting.hpp:22
@ RAINBOW
Definition shader_setting.hpp:22
Flat black color.
Definition shader_setting.hpp:639
FlatBlack(const Transform &transform)
Definition shader_setting.hpp:643
FlatBlack()
Definition shader_setting.hpp:640
Flat blue color.
Definition shader_setting.hpp:599
FlatBlue()
Definition shader_setting.hpp:600
FlatBlue(const Transform &transform)
Definition shader_setting.hpp:603
Flat coloring scheme that assigns a single color to the object. If the alpha value is less than 0....
Definition shader_setting.hpp:520
FlatColor(const Eigen::Vector4f &color, const Transform &transform)
Definition shader_setting.hpp:533
FlatColor(float r, float g, float b, float a=1.0f)
Definition shader_setting.hpp:522
FlatColor(std::initializer_list< T > i, const Transform &transform)
Definition shader_setting.hpp:570
FlatColor(const Eigen::Vector4f &color)
Definition shader_setting.hpp:527
FlatColor(std::initializer_list< T > i)
Definition shader_setting.hpp:562
FlatColor(float r, float g, float b, float a, const Transform &transform)
Definition shader_setting.hpp:547
virtual ~FlatColor() override
Definition shader_setting.hpp:578
FlatColor(const Color &color)
Definition shader_setting.hpp:540
FlatColor(const Color &color, const Transform &transform)
Definition shader_setting.hpp:554
Flat dark gray color.
Definition shader_setting.hpp:631
FlatDarkGray()
Definition shader_setting.hpp:632
FlatDarkGray(const Transform &transform)
Definition shader_setting.hpp:635
Flat light gray color.
Definition shader_setting.hpp:623
FlatGray(const Transform &transform)
Definition shader_setting.hpp:627
FlatGray()
Definition shader_setting.hpp:624
Flat green color.
Definition shader_setting.hpp:591
FlatGreen()
Definition shader_setting.hpp:592
FlatGreen(const Transform &transform)
Definition shader_setting.hpp:595
Flat orange color.
Definition shader_setting.hpp:607
FlatOrange()
Definition shader_setting.hpp:608
FlatOrange(const Transform &transform)
Definition shader_setting.hpp:611
Flat red color.
Definition shader_setting.hpp:583
FlatRed()
Definition shader_setting.hpp:584
FlatRed(const Transform &transform)
Definition shader_setting.hpp:587
Flat white color.
Definition shader_setting.hpp:615
FlatWhite()
Definition shader_setting.hpp:616
FlatWhite(const Transform &transform)
Definition shader_setting.hpp:619
Point size scale mode. SCREENSPACE : Screen space size METRIC : Metric size (in meters)
Definition shader_setting.hpp:28
MODE
Definition shader_setting.hpp:29
@ SCREENSPACE
Definition shader_setting.hpp:29
@ METRIC
Definition shader_setting.hpp:29
Point shape mode. RECTANGLE : Square/rectangle shape CIRCLE : Circle shape.
Definition shader_setting.hpp:35
MODE
Definition shader_setting.hpp:36
@ CIRCLE
Definition shader_setting.hpp:36
@ RECTANGLE
Definition shader_setting.hpp:36
Rainbow coloring scheme that assigns colors to the height (z-value) of pixels of the object....
Definition shader_setting.hpp:508
virtual ~Rainbow() override
Definition shader_setting.hpp:515
Rainbow(const Transform &transform)
Definition shader_setting.hpp:513
Rainbow()
Definition shader_setting.hpp:510
Shader parameter class that holds a single parameter for shader setting.
Definition shader_setting.hpp:74
std::uint64_t name
Name of the parameter (hashed)
Definition shader_setting.hpp:182
ShaderParameter(std::uint64_t name, const T &v)
Constructor.
Definition shader_setting.hpp:81
Eigen::Matrix4f mat4f
Value of the parameter (stored as 4x4 float matrix)
Definition shader_setting.hpp:183
ShaderDataType type
Data type of the parameter.
Definition shader_setting.hpp:181
void set(glk::GLSLShader &shader) const
Set the parameter to the shader.
Definition shader_setting.hpp:139
ShaderParameter()
Default constructor.
Definition shader_setting.hpp:77
T get_value() const
Get the parameter value.
Definition shader_setting.hpp:98
void invalidate()
Invalidate the parameter.
Definition shader_setting.hpp:90
bool valid() const
Check if the parameter is valid.
Definition shader_setting.hpp:87
void set_value(const T &value)
Get the parameter value.
Definition shader_setting.hpp:118
Shader setting class that holds rendering settings.
Definition shader_setting.hpp:187
ShaderSetting & scale(float scaling)
Apply uniform scaling to the model matrix.
ShaderSetting & add(const std::string &name_, const T &value)
Add a new parameter to the shader setting.
Definition shader_setting.hpp:231
ShaderSetting & set_point_shape(float point_size, bool metric, bool circle)
Set point shape with common settings.
ShaderSetting & set_color_mode(int color_mode)
Set color mode.
std::enable_if_t<!std::is_arithmetic_v< Vector >, ShaderSetting & > scale(const Vector &scaling)
Apply scaling to the model matrix (non-uniform).
Definition shader_setting.hpp:481
ShaderSetting & remove_model_matrix()
ShaderSetting & set_old_default_point_shape()
Set old (v0.1.9) default point shape (rectangle + screenspace)
ShaderSetting & make_transparent()
Make the object transparent (alpha blending).
ShaderSetting clone() const
Clone the shader setting.
ShaderSetting(int color_mode)
Constructor.
ShaderSetting & set_point_scale_screenspace()
Set point size scale to screen space.
ShaderSetting & set_color(const Color &color_)
Set material color (for FLAT_COLOR).
Definition shader_setting.hpp:334
std::optional< T > get(const std::string &name_) const
Get a parameter value from the shader setting.
Definition shader_setting.hpp:272
ShaderSetting & operator=(const ShaderSetting &other)
Copy assignment operator.
ShaderSetting & translate(const Vector &translation)
Apply translation to the model matrix.
Definition shader_setting.hpp:435
Eigen::Matrix4f model_matrix() const
Get model matrix.
virtual ~ShaderSetting()
Destructor.
Definition shader_setting.hpp:221
ShaderSetting & set_rainbow_axis(const Eigen::Vector3f &axis)
Set RAINBOW coloring axis.
ShaderSetting & set_point_size(float size)
Set point size.
ShaderSetting & dynamic_object()
Set dynamic object flag.
ShaderSetting & scale(const Eigen::Vector3f &scaling)
Apply scaling to the model matrix (non-uniform).
ShaderSetting & set_point_shape_rectangle()
Set point shape to rectangle.
std::shared_ptr< const ShaderSetting > ConstPtr
Definition shader_setting.hpp:190
ShaderSetting & set_rainbow_range(const Eigen::Vector2f &minmax_z)
Set RAINBOW color range.
ShaderSetting & static_object()
Set static object flag.
ShaderSetting & transform(const Transform &transform)
Apply transformation to the model matrix.
Definition shader_setting.hpp:420
ShaderSetting & translate(float tx, float ty, float tz)
Apply translation to the model matrix.
ShaderSetting & translate(const Eigen::Vector3f &translation)
Apply translation to the model matrix.
ShaderSetting & set_model_matrix(const Transform &transform)
Set model matrix.
Definition shader_setting.hpp:408
ShaderSetting & set_alpha(float alpha)
Set alpha value of the material color.
ShaderSetting & set_point_size_offset(float offset)
Set point size offset.
Eigen::Vector3f translation() const
Get translation vector from the model matrix.
ShaderSetting & set_point_scale_mode(guik::PointScaleMode::MODE mode)
Set point size scale mode.
ShaderSetting(int color_mode, const Transform &transform)
Constructor.
Definition shader_setting.hpp:212
Eigen::Vector4f material_color() const
Get material color (FLAT_COLOR).
ShaderSetting & set_point_scale_metric()
Set point size scale to metric.
ShaderSetting & set_color(float r, float g, float b, float a)
Set material color (FLAT_COLOR).
ShaderSetting & rotate(const Eigen::Quaternion< Scalar > &quat)
Apply rotation to the model matrix.
Definition shader_setting.hpp:455
ShaderSetting & rotate(const float angle, const Vector &axis)
Apply rotation to the model matrix.
Definition shader_setting.hpp:446
ShaderSetting()
Default constructor.
Eigen::Matrix3f rotation() const
Get rotation matrix from the model matrix.
ShaderSetting & set_point_shape_mode(guik::PointShapeMode::MODE mode)
Set point shape mode.
int color_mode() const
Get color mode.
std::shared_ptr< ShaderSetting > Ptr
Definition shader_setting.hpp:189
ShaderSetting & set_point_scale(float scaling)
Set point size scale factor.
float point_scale() const
Get point size scale factor.
void set(glk::GLSLShader &shader) const
Set shader parameters to the shader program.
ShaderSetting(const ShaderSetting &other)
Copy constructor.
T cast(const std::string &name_) const
Get a parameter value from the shader setting. This method avoid type checking. Fast but unsafe.
Definition shader_setting.hpp:295
ShaderSetting & rotate(const float angle, const Eigen::Vector3f &axis)
Apply rotation to the model matrix.
ShaderSetting & rotate(const Eigen::Matrix< Scalar, Dim, Dim > &rot)
Apply rotation to the model matrix.
Definition shader_setting.hpp:463
float point_size() const
Get point size.
ShaderSetting(int color_mode, const Eigen::Matrix4f &transform)
Constructor.
bool transparent
If true, the object is rendered as transparent.
Definition shader_setting.hpp:491
ShaderSetting & scale(float sx, float sy, float sz)
Apply scaling to the model matrix (non-uniform).
ShaderSetting & set_point_shape_circle()
Set point shape to circle.
std::vector< ShaderParameter > params
Shader parameters.
Definition shader_setting.hpp:492
std::optional< T > get(const std::string &name_)
Get a parameter value from the shader setting.
Definition shader_setting.hpp:249
Texture color scheme that assigns colors based on the binded texture.
Definition shader_setting.hpp:658
TextureColor(const Transform &transform)
Definition shader_setting.hpp:663
virtual ~TextureColor() override
Definition shader_setting.hpp:665
TextureColor()
Definition shader_setting.hpp:660
Vertex colormap scheme that assigns colors based on vertex colormap attributes.
Definition shader_setting.hpp:669
virtual ~VertexColorMap() override
Definition shader_setting.hpp:676
VertexColorMap()
Definition shader_setting.hpp:671
VertexColorMap(const Transform &transform)
Definition shader_setting.hpp:674
Vertex color scheme that assigns colors based on vertex color attributes.
Definition shader_setting.hpp:647
VertexColor(const Transform &transform)
Definition shader_setting.hpp:652
virtual ~VertexColor() override
Definition shader_setting.hpp:654
VertexColor()
Definition shader_setting.hpp:649