cgv
Loading...
Searching...
No Matches
box_wire_renderer.cxx
1#include "box_wire_renderer.h"
2#include <cgv_reflect_types/math/fvec.h>
3#include <cgv_gl/gl/gl.h>
4#include <cgv_gl/gl/gl_tools.h>
5
6namespace cgv {
7 namespace render {
13
14 box_wire_renderer& ref_box_wire_renderer(context& ctx, int ref_count_change)
15 {
16 static int ref_count = 0;
17 static box_wire_renderer r;
18 r.manage_singleton(ctx, "box_wire_renderer", ref_count, ref_count_change);
19 return r;
20 }
21
27
28 box_wire_renderer::box_wire_renderer()
29 {
30 has_extents = false;
31 position_is_center = true;
32 has_translations = false;
33 has_rotations = false;
34 }
37 {
39 if (has_attribute(ctx, "extent"))
40 has_extents = true;
41 if (has_attribute(ctx, "translation"))
42 has_translations = true;
43 if (has_attribute(ctx, "rotation"))
44 has_rotations = true;
45 }
55 has_extents = false;
56 remove_attribute_array(ctx, "extent");
57 }
59 has_translations = false;
60 remove_attribute_array(ctx, "translation");
61 }
63 has_rotations = false;
64 remove_attribute_array(ctx, "rotation");
65 }
67 void box_wire_renderer::set_position_is_center(bool _position_is_center)
68 {
69 position_is_center = _position_is_center;
70 }
71
74 {
75 return prog.build_program(ctx, "box_wire.glpr", true, defines);
76 }
79 {
80 if (!line_renderer::enable(ctx))
81 return false;
82 ref_prog().set_uniform(ctx, "position_is_center", position_is_center);
83 ref_prog().set_uniform(ctx, "has_rotations", has_rotations);
84 ref_prog().set_uniform(ctx, "has_translations", has_translations);
85 const auto& brs = get_style<box_wire_render_style>();
86 ref_prog().set_uniform(ctx, "relative_anchor", brs.relative_anchor);
87 if (!has_extents)
88 ref_prog().set_attribute(ctx, "extent", brs.default_extent);
89 return true;
90 }
93 {
94 if (!attributes_persist()) {
95 has_extents = false;
96 position_is_center = true;
97 has_rotations = false;
98 has_translations = false;
99 }
100
101 return line_renderer::disable(ctx);
102 }
103
104 void box_wire_renderer::draw(context& ctx, size_t start, size_t count, bool use_strips, bool use_adjacency, uint32_t strip_restart_index)
105 {
106 draw_impl(ctx, PT_POINTS, start, count, false, false, -1);
107 }
108 bool box_wire_render_style_reflect::self_reflect(cgv::reflect::reflection_handler& rh)
109 {
110 return
111 rh.reflect_base(*static_cast<line_render_style*>(this)) &&
112 rh.reflect_member("default_extent", default_extent) &&
113 rh.reflect_member("relative_anchor", relative_anchor);
114 }
115
116
118 {
120 }
121 }
122}
123
124#include <cgv/gui/provider.h>
125
126namespace cgv {
127 namespace gui {
128
130 {
132 bool create(provider* p, const std::string& label,
133 void* value_ptr, const std::string& value_type,
134 const std::string& gui_type, const std::string& options, bool*)
135 {
137 return false;
138 cgv::render::box_wire_render_style* brs_ptr = reinterpret_cast<cgv::render::box_wire_render_style*>(value_ptr);
139 cgv::base::base* b = dynamic_cast<cgv::base::base*>(p);
140 p->add_member_control(b, "Default Eextent X", brs_ptr->default_extent[0], "value_slider", "min=0.001;max=1000;log=true;ticks=true");
141 p->add_member_control(b, "Default Eextent Y", brs_ptr->default_extent[1], "value_slider", "min=0.001;max=1000;log=true;ticks=true");
142 p->add_member_control(b, "Default Eextent Z", brs_ptr->default_extent[2], "value_slider", "min=0.001;max=1000;log=true;ticks=true");
143 p->add_member_control(b, "Relative Anchor X", brs_ptr->relative_anchor[0], "value_slider", "min=-1;max=1;ticks=true");
144 p->add_member_control(b, "Relative Anchor Y", brs_ptr->relative_anchor[1], "value_slider", "min=-1;max=1;ticks=true");
145 p->add_member_control(b, "Relative Anchor Z", brs_ptr->relative_anchor[2], "value_slider", "min=-1;max=1;ticks=true");
146 p->add_gui("line_render_style", *static_cast<cgv::render::line_render_style*>(brs_ptr));
147 return true;
148 }
149 };
150
151#include "gl/lib_begin.h"
152
153 CGV_API cgv::gui::gui_creator_registration<box_wire_render_style_gui_creator> box_wire_rs_gc_reg("box_wire_render_style_gui_creator");
154 }
155}
base class for all classes that can be registered with support for dynamic properties (see also secti...
Definition base.h:75
helper template for registration of gui creators
Definition gui_creator.h:32
derive from this class to provide a gui to the current viewer
Definition provider.h:64
bool add_gui(const std::string &label, T &value, const std::string &gui_type="", const std::string &options="")
Add a composed gui of the given gui_type for the given value.
Definition provider.h:247
data::ref_ptr< control< T > > add_member_control(cgv::base::base *base_ptr, const std::string &label, T &value, const std::string &gui_type="", const std::string &options="", const std::string &align="\n")
add control with callback to cgv::base::on_set method on cgv::gui::control::value_change
Definition provider.h:137
the self reflection handler is passed to the virtual self_reflect() method of cgv::base::base.
bool reflect_base(B &base_ref)
reflect a base class with its members
bool reflect_member(const std::string &member_name, T &member_ref, bool hard_cast=false)
call this to reflect a member by member name and reference to the member.
attribute array manager used to upload arrays to gpu
renderer that supports point splatting
void remove_rotation_array(const context &ctx)
remove the rotation attribute
void set_position_is_center(bool _position_is_center)
set the flag, whether the position is interpreted as the box center
bool enable(context &ctx)
enable box wire renderer
void draw(context &ctx, size_t start, size_t count, bool use_strips=false, bool use_adjacency=false, uint32_t strip_restart_index=-1)
Draw a range of vertices or indexed elements.
bool disable(context &ctx)
disable renderer
void enable_attribute_array_manager(const context &ctx, attribute_array_manager &aam)
call this before setting attribute arrays to manage attribute array in given manager
bool has_translations
whether array with per box translations has been specified
bool build_shader_program(context &ctx, shader_program &prog, const shader_define_map &defines)
build box wire program
bool has_rotations
whether array with per box rotations has been specified
render_style * create_render_style() const
overload to allow instantiation of box_wire_renderer
void remove_extent_array(const context &ctx)
remove the extent attribute
void disable_attribute_array_manager(const context &ctx, attribute_array_manager &aam)
call this after last render/draw call to ensure that no other users of renderer change attribute arra...
bool position_is_center
whether position is box center, if not it is lower left bottom corner
void remove_translation_array(const context &ctx)
remove the translation attribute
base class for all drawables, which is independent of the used rendering API.
Definition context.h:621
void enable_attribute_array_manager(const context &ctx, attribute_array_manager &aam)
call this before setting attribute arrays to manage attribute array in given manager
void disable_attribute_array_manager(const context &ctx, attribute_array_manager &aam)
call this after last render/draw call to ensure that no other users of renderer change attribute arra...
bool enable(context &ctx)
overload to activate group style
bool disable(context &ctx)
disable renderer
void manage_singleton(context &ctx, const std::string &renderer_name, int &ref_count, int ref_count_change)
used by derived classes to manage singletons
Definition renderer.cxx:23
bool has_attribute(const context &ctx, const std::string &name)
check for attribute
Definition renderer.h:60
shader_program & ref_prog()
derived renderer classes have access to shader program
Definition renderer.h:75
bool attributes_persist() const
return whether attributes persist after a call to disable
Definition renderer.h:66
void draw_impl(context &ctx, PrimitiveType pt, size_t start, size_t count, bool use_strips=false, bool use_adjacency=false, uint32_t strip_restart_index=-1)
default implementation of draw method with support for indexed rendering and different primitive type...
Definition renderer.cxx:253
a shader program combines several shader code fragments to a complete definition of the shading pipel...
bool set_uniform(const context &ctx, const std::string &name, const T &value, bool generate_error=false)
Set the value of a uniform by name, where the type can be any of int, unsigned, float,...
bool set_attribute(const context &ctx, const std::string &name, const T &value)
set constant default value of a vertex attribute by attribute name, if name does not specify an attri...
bool build_program(const context &ctx, const std::string &file_name, bool show_error=false, const shader_define_map &defines=shader_define_map())
successively calls create, attach_program and link.
std::map< std::string, std::string > shader_define_map
typedef for shader define map data structure
Definition shader_code.h:52
box_wire_renderer & ref_box_wire_renderer(context &ctx, int ref_count_change)
reference to a singleton box_wire renderer that can be shared among drawables
the cgv namespace
Definition print.h:11
cgv::math::fvec< float, 3 > vec3
declare type of 3d single precision floating point vectors
Definition fvec.h:669
bool create(provider *p, const std::string &label, void *value_ptr, const std::string &value_type, const std::string &gui_type, const std::string &options, bool *)
attempt to create a gui and return whether this was successful
interface for gui creators
Definition gui_creator.h:14
this reflection traits implementation is used for external self_reflect implementations of instances ...
box wires extend line render styles
vec3 default_extent
extent used in case extent array is not specified
vec3 relative_anchor
box anchor position relative to center that corresponds to the position attribute
box_wire_render_style()
default constructor sets default extent to (1,1,1) and relative anchor to (0,0,0)
base class for all render styles
Definition renderer.h:16
traits class with a static function get_name() of type const char* that returns the type name of the ...
Definition type_name.h:54