#pragma once #define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include "lib_begin.h" namespace cgv { namespace render { class CGV_API drawable; class CGV_API textured_material; /// different compond types for data elements enum ElementType { ET_VALUE, ET_VECTOR, ET_MATRIX }; /// compact type description of data that can be sent to the context; convertible to int struct type_descriptor { cgv::type::info::TypeId coordinate_type : 8; ElementType element_type : 4; unsigned nr_rows : 4; unsigned nr_columns : 4; bool is_row_major : 1; bool is_array : 1; bool normalize : 1; /// construct from int type_descriptor(int td) { *reinterpret_cast(this) = td; } /// construct descriptor for values type_descriptor(cgv::type::info::TypeId _coordinate_type, bool _normalize = false) : coordinate_type(_coordinate_type), element_type(ET_VALUE), nr_rows(1), nr_columns(1), is_row_major(false), is_array(false), normalize(_normalize) {} /// construct descriptor for vectors type_descriptor(cgv::type::info::TypeId _coordinate_type, unsigned _nr_entries, bool _normalize = false) : coordinate_type(_coordinate_type), element_type(ET_VECTOR), nr_rows(_nr_entries), nr_columns(1), is_row_major(false), is_array(false), normalize(_normalize) {} /// construct descriptor for matrices type_descriptor(cgv::type::info::TypeId _coordinate_type, unsigned _nr_rows, unsigned _nr_cols, bool _is_row_major, bool _normalize = false) : coordinate_type(_coordinate_type), element_type(ET_MATRIX), nr_rows(_nr_rows), nr_columns(_nr_cols), is_row_major(_is_row_major), is_array(false), normalize(_normalize) {} /// construct descriptor for an array type_descriptor(const type_descriptor& td, bool _is_array) : coordinate_type(td.coordinate_type), element_type(td.element_type), nr_rows(td.nr_rows), nr_columns(td.nr_columns), is_row_major(td.is_row_major), normalize(td.normalize), is_array(_is_array) {} /// cast to int operator int() const { return *reinterpret_cast(this); } }; /// enumeration of rendering APIs which can be queried from the context enum RenderAPI { RA_OPENGL, RA_DIRECTX }; /// enumeration of different render passes, which can be queried from the context and used to specify a new render pass enum RenderPass { RP_NONE, RP_MAIN, /// the main rendering pass triggered by the redraw event RP_STEREO, /// rendering of second eye RP_SHADOW_MAP, /// construction of shadow map RP_SHADOW_VOLUME, /// construction of shadow map RP_OPAQUE_SURFACES, /// opaque surface rendering using z-Buffer RP_TRANSPARENT_SURFACES, /// transparent surface rendering using depth peeling RP_PICK, /// in picking pass a small rectangle around the mouse is rendered RP_USER_DEFINED }; /// available flags that can be queried from the context and set for a new render pass enum RenderPassFlags { RPF_NONE = 0, // no frame initialization is performed RPF_SET_PROJECTION = 1, // whether to set default projection matrix RPF_SET_MODELVIEW = 1 << 1, // whether to set default modelview matrix RPF_SET_MODELVIEW_PROJECTION = RPF_SET_PROJECTION|RPF_SET_MODELVIEW, // whether to set default modelview and projection matrix RPF_SET_LIGHTS = 1 << 2, // whether to define default lights RPF_SET_MATERIAL = 1 << 3, // whether to define default material RPF_SET_LIGHTS_ON = 1 << 4, // whether to turn on default lights RPF_ENABLE_MATERIAL = 1 << 5, // whether to enable material RPF_SET_LIGHTING = RPF_SET_LIGHTS|RPF_SET_LIGHTS_ON|RPF_ENABLE_MATERIAL, // whether to define and enable default lighting RPF_CLEAR_COLOR = 1 << 6, // whether to clear the color buffer RPF_CLEAR_DEPTH = 1 << 7, // whether to clear the depth buffer RPF_CLEAR_STENCIL = 1 << 8, // whether to clear the depth buffer RPF_CLEAR_ACCUM = 1 << 9, // whether to clear the accumulation buffer RPF_CLEAR_ALL = RPF_CLEAR_COLOR|RPF_CLEAR_DEPTH|RPF_CLEAR_STENCIL|RPF_CLEAR_ACCUM, // whether to clear all buffers RPF_DRAWABLES_INIT_FRAME = 1 << 10, // whether to call the init_frame method of the drawables RPF_SET_STATE_FLAGS = 1 << 11, // whether to set depth buffer and culling flags RPF_SET_CLEAR_COLOR = 1 << 12, // whether to set the clear color RPF_SET_CLEAR_DEPTH = 1 << 13, // whether to set the clear color RPF_SET_CLEAR_STENCIL = 1 << 14, // whether to set the clear color RPF_SET_CLEAR_ACCUM = 1 << 15, // whether to set the accumulation buffer clear color RPF_DRAWABLES_DRAW = 1 << 16, // whether to call draw and finish_draw methods of drawables RPF_DRAWABLES_FINISH_FRAME = 1 << 17, // whether to call finish frame method of drawables RPF_DRAW_TEXTUAL_INFO = 1 << 18, // whether to draw textual information RPF_DRAWABLES_AFTER_FINISH = 1 << 19, // whether to call after finish method of drawables RPF_HANDLE_SCREEN_SHOT = 1 << 20, // whether to perform a screen shot if this was scheduled RPF_ALL = (1 << 21) - 1, // all flags set, defines default render pass RPF_DEFAULT = RPF_ALL & ~ (RPF_SET_LIGHTS|RPF_CLEAR_ACCUM|RPF_SET_CLEAR_ACCUM|RPF_CLEAR_STENCIL|RPF_SET_CLEAR_STENCIL) // all flags set, defines default render pass }; /// different sides of a material enum MaterialSide { MS_NONE, MS_FRONT, MS_BACK, MS_FRONT_AND_BACK }; /// different illumination modes enum IlluminationMode { IM_OFF, IM_ONE_SIDED, IM_TWO_SIDED }; /// different culling modes enum CullingMode { CM_OFF, CM_BACKFACE, CM_FRONTFACE }; /// different texture wrap modes enum TextureWrap { TW_REPEAT = 0, TW_CLAMP = 1, TW_CLAMP_TO_EDGE = 2, TW_CLAMP_TO_BORDER = 3, TW_MIRROR_CLAMP = 4, TW_MIRROR_CLAMP_TO_EDGE = 5, TW_MIRROR_CLAMP_TO_BORDER = 6, TW_MIRRORED_REPEAT = 7, TW_LAST }; /// convert texture wrap to string extern CGV_API std::string to_string(TextureWrap wrap); /// different texture filter enum TextureFilter { TF_NEAREST = 0, TF_LINEAR = 1, TF_NEAREST_MIPMAP_NEAREST = 2, TF_LINEAR_MIPMAP_NEAREST = 3, TF_NEAREST_MIPMAP_LINEAR = 4, TF_LINEAR_MIPMAP_LINEAR = 5, TF_ANISOTROP = 6, TF_LAST }; /// different texture types enum TextureType { TT_UNDEF, TT_1D = 1, TT_2D, TT_3D, TT_CUBEMAP, TT_BUFFER }; /// the six different sides of a cube enum TextureCubeSides { TCS_PLUS_X, TCS_MINUS_X, TCS_PLUS_Y, TCS_MINUS_Y, TCS_PLUS_Z, TCS_MINUS_Z }; /// different primitive types enum PrimitiveType { PT_UNDEF, PT_POINTS, PT_LINES, PT_LINES_ADJACENCY, PT_LINE_STRIP, PT_LINE_STRIP_ADJACENCY, PT_LINE_LOOP, PT_TRIANGLES, PT_TRIANGLES_ADJACENCY, PT_TRIANGLE_STRIP, PT_TRIANGLE_STRIP_ADJACENCY, PT_TRIANGLE_FAN, PT_QUADS, PT_QUAD_STRIP, PT_POLYGON, PT_LAST }; /// different sampling strategies for rendering to textures that steer the computation of the \c tex_coord input to the fragment shader enum TextureSampling { TS_CELL = 0, /// for texture resulution N x M x L the \c tex_coord ranges from [1/2N, 1/2M, 1/2L] to [1-1/2N, 1-1/2M, 1-1/2P] TS_VERTEX = 1 /// \c tex_coord ranges from [0,0,0] to [1,1,1] }; /// different sampling strategies for rendering to textures that steer the computation of the \c tex_coord input to the fragment shader enum CompareFunction { CF_LEQUAL, CF_GEQUAL, CF_LESS, CF_GREATER, CF_EQUAL, CF_NOTEQUAL, CF_ALWAYS, CF_NEVER }; /// different text alignments enum TextAlignment { TA_NONE = 0, TA_LEFT = 1, // center of left edge of text bounds TA_RIGHT = 2, // center of right edge of text bounds TA_TOP = 4, // center of top edge of text bounds TA_BOTTOM = 8, // center of bottom edge of text bounds TA_TOP_LEFT = TA_LEFT+TA_TOP, // top left corner of text bounds TA_TOP_RIGHT = TA_RIGHT+TA_TOP, // top right corner of text bounds TA_BOTTOM_LEFT = TA_LEFT+TA_BOTTOM, // bottom left corner of text bounds TA_BOTTOM_RIGHT = TA_RIGHT+TA_BOTTOM // bottom right corner of text bounds }; /// convert texture filter to string extern CGV_API std::string to_string(TextureFilter filter_type); /// convert primitive type to string extern CGV_API std::string to_string(PrimitiveType pt); /// convert texture type to string extern CGV_API std::string to_string(TextureType tt); /// convert texture cube side to string extern CGV_API std::string to_string(TextureCubeSides tcs); class CGV_API context; /// base interface for all render components class CGV_API render_component { public: void* handle; void* internal_format; void* user_data; /// keep pointer to my context context* ctx_ptr; /// a string that contains the last error mutable std::string last_error; /// initialize members render_component(); /// return whether component has been created bool is_created() const; /// copy the rendering api specific id the component to the memory location of the given pointer. /// For opengl this the passed pointer should be of type GLint or GLuint. void put_id_void(void* ptr) const; /// cast the refence to rendering api specific representation of component id to the specified type template void put_id(T& id) const { put_id_void(&id); } }; /// base interface for a texture class CGV_API texture_base : public render_component { public: TextureFilter mag_filter; TextureFilter min_filter; TextureWrap wrap_s; TextureWrap wrap_t; TextureWrap wrap_r; float anisotropy; float priority; float border_color[4]; CompareFunction compare_function; bool use_compare_function; TextureType tt; bool have_mipmaps; /// initialize members texture_base(TextureType _tt = TT_UNDEF); }; /// base interface for shader programs class CGV_API shader_program_base : public render_component { protected: bool is_enabled; friend class context; public: PrimitiveType geometry_shader_input_type; PrimitiveType geometry_shader_output_type; int geometry_shader_output_count; /// initializes members shader_program_base(); }; /// base class for attribute_array_bindings class CGV_API attribute_array_binding_base : public render_component { public: /// nothing to be done heremembers attribute_array_binding_base(); }; /// different vertex buffer types enum VertexBufferType { VBT_VERTICES, VBT_INDICES, VBT_TEXTURE, VBT_UNIFORM, VBT_FEEDBACK }; /// different vertex buffer usages as defined in OpenGL enum VertexBufferUsage { VBU_STREAM_DRAW, VBU_STREAM_READ, VBU_STREAM_COPY, VBU_STATIC_DRAW, VBU_STATIC_READ, VBU_STATIC_COPY, VBU_DYNAMIC_DRAW, VBU_DYNAMIC_READ, VBU_DYNAMIC_COPY }; /// base interface for a vertex buffer class CGV_API vertex_buffer_base : public render_component { public: /// buffer type defaults to VBT_VERTICES VertexBufferType type; /// usage defaults to VBU_STATIC_DRAW VertexBufferUsage usage; /// initialize members vertex_buffer_base(); }; /// base interface for framebuffer class CGV_API frame_buffer_base : public render_component { public: int width, height; std::vector enabled_color_attachments; bool attached[16]; int old_vp[4]; /// initialize members frame_buffer_base(); }; /// different shader types enum ShaderType { ST_DETECT, ST_COMPUTE, ST_VERTEX, ST_TESS_CONTROL, ST_TESS_EVALUTION, ST_GEOMETRY, ST_FRAGMENT }; /// different frame buffer types which can be combined together with or enum FrameBufferType { FB_0 = 0, FB_1 = 1, FB_2 = 2, FB_3 = 3, FB_4 = 4, FB_5 = 5, FB_6 = 6, FB_7 = 7, FB_BACK = 128, FB_FRONT = 129, FB_LEFT = 512, FB_RIGHT = 1024, FB_BACK_LEFT = FB_BACK+FB_LEFT, FB_BACK_RIGHT = FB_BACK+FB_RIGHT, FB_FRONT_LEFT = FB_FRONT+FB_LEFT, FB_FRONT_RIGHT = FB_FRONT+FB_RIGHT }; /// integer constants that can be queried from context enum ContextIntegerConstant { MAX_NR_GEOMETRY_SHADER_OUTPUT_VERTICES }; // forward declaration of all render components class CGV_API texture; class CGV_API render_buffer; class CGV_API frame_buffer; class CGV_API shader_code; class CGV_API shader_program; // declare some colors by name extern CGV_API float black[4], white[4], gray[4], green[4], brown[4], dark_red[4]; extern CGV_API float cyan[4], yellow[4], red[4], blue[4]; /** configuration object used to define default creation parameters for contexts */ struct CGV_API context_creation_config : public cgv::base::base { /**@name context creation parameters*/ //@{ /// default: false bool stereo_mode; /// default: true bool double_buffer; /// default: false bool alpha_buffer; /// default: 0 int stencil_bits; /// default: false bool forward_compatible; /// default: false in release and true in debug version bool debug; /// default: false bool core_profile; /// default: 0 int accumulation_bits; /// default: -1 ... major version of maximum supported OpenGL version int version_major; /// default: -1 ... minor version of maximum supported OpenGL version int version_minor; /// default: 0 int nr_multi_samples; //@} /// construct config with default parameters context_creation_config(); /// return "context_creation_config" std::string get_type_name() const; /// reflect the shader_path member bool self_reflect(cgv::reflect::reflection_handler& srh); }; /// type of ref counted pointer to context creation configuration typedef cgv::data::ref_ptr context_creation_config_ptr; /** configuration object used to define default creation parameters for contexts and to configure error handling */ struct CGV_API render_config : public context_creation_config { /**@name window creation parameters*/ //@{ /// default: -1 ... no fullscreen int fullscreen_monitor; /// default: 640 int window_width; /// default: 480 int window_height; //@} /**@name error handling */ //@{ /// default: false bool abort_on_error; /// default: true (only in case a gui_driver, which supports this, is loaded) bool dialog_on_error; /// default: true bool show_error_on_console; //@} /// construct config with default parameters render_config(); /// return "render_config" std::string get_type_name() const; /// reflect the shader_path member bool self_reflect(cgv::reflect::reflection_handler& srh); }; /// type of ref counted pointer to render configuration typedef cgv::data::ref_ptr render_config_ptr; /// return a pointer to the current shader configuration extern CGV_API render_config_ptr get_render_config(); /** base class for all drawables, which is independent of the used rendering API. */ class CGV_API context { protected: /// information necessary for a rendering pass struct render_info { RenderPass pass; RenderPassFlags flags; void* user_data; }; /// store the current render pass std::stack render_pass_stack; /// default render flags with which the main render pass is initialized RenderPassFlags default_render_flags; /// current background color, depth, stencil and accum color float bg_r, bg_g, bg_b, bg_a, bg_d; int bg_s; float bg_accum_r, bg_accum_g, bg_accum_b, bg_accum_a; /// whether to use phong shading bool phong_shading; /// current back ground color index int current_background; /// current cursor location for textual output int cursor_x, cursor_y; /// use a callback stream to write text to the opengl context cgv::signal::callback_stream out_stream; /// store current font size float current_font_size; /// store current font cgv::media::font::font_face_ptr current_font_face; /// size a tabs int tab_size; /// offset in x and y direction where text starts int x_offset, y_offset; /// current number of indentations int nr_identations; /// store whether we are at the beginning of the line bool at_line_begin; /// bool do_screen_shot; /// callback method for processing of text from the output stream virtual void process_text(const std::string& text); /// draw some text at cursor position and update cursor position virtual void draw_text(const std::string& text); virtual int query_integer_constant(ContextIntegerConstant cic) const = 0; virtual void put_id(void* handle, void* ptr) const = 0; virtual cgv::data::component_format texture_find_best_format(const cgv::data::component_format& cf, render_component& rc, const std::vector* palettes = 0) const = 0; virtual bool texture_create (texture_base& tb, cgv::data::data_format& df) = 0; virtual bool texture_create (texture_base& tb, cgv::data::data_format& target_format, const cgv::data::const_data_view& data, int level, int cube_side = -1, const std::vector* palettes = 0) = 0; virtual bool texture_create_from_buffer (texture_base& tb, cgv::data::data_format& df, int x, int y, int level) = 0; virtual bool texture_replace (texture_base& tb, int x, int y, int z_or_cube_side, const cgv::data::const_data_view& data, int level, const std::vector* palettes = 0) = 0; virtual bool texture_replace_from_buffer(texture_base& tb, int x, int y, int z_or_cube_side, int x_buffer, int y_buffer, unsigned int width, unsigned int height, int level) = 0; virtual bool texture_generate_mipmaps (texture_base& tb, unsigned int dim) = 0; virtual bool texture_destruct (texture_base& tb) = 0; virtual bool texture_set_state (const texture_base& tb) = 0; virtual bool texture_enable (texture_base& tb, int tex_unit, unsigned int nr_dims) = 0; virtual bool texture_disable (texture_base& tb, int tex_unit, unsigned int nr_dims) = 0; virtual bool render_buffer_create (render_component& rc, cgv::data::component_format& cf, int& _width, int& _height) = 0; virtual bool render_buffer_destruct (render_component& rc) = 0; virtual bool frame_buffer_create (frame_buffer_base& fbb) = 0; virtual bool frame_buffer_attach (frame_buffer_base& fbb, const render_component& rb, bool is_depth, int i) = 0; virtual bool frame_buffer_attach (frame_buffer_base& fbb, const texture_base& t, bool is_depth, int level, int i, int z) = 0; virtual bool frame_buffer_is_complete(const frame_buffer_base& fbb) const = 0; virtual bool frame_buffer_enable (frame_buffer_base& fbb) = 0; virtual bool frame_buffer_disable (frame_buffer_base& fbb) = 0; virtual bool frame_buffer_destruct (frame_buffer_base& fbb) = 0; virtual int frame_buffer_get_max_nr_color_attachments() = 0; virtual int frame_buffer_get_max_nr_draw_buffers() = 0; virtual bool shader_code_create (render_component& sc, ShaderType st, const std::string& source) = 0; virtual bool shader_code_compile (render_component& sc) = 0; virtual void shader_code_destruct(render_component& sc) = 0; virtual bool shader_program_create (shader_program_base& spb) = 0; virtual void shader_program_destruct(shader_program_base& spb) = 0; virtual void shader_program_attach(shader_program_base& spb, const render_component& sc) = 0; virtual void shader_program_detach(shader_program_base& spb, const render_component& sc) = 0; virtual bool shader_program_link(shader_program_base& spb) = 0; virtual bool shader_program_set_state(shader_program_base& spb) = 0; virtual bool shader_program_enable (shader_program_base& spb) = 0; virtual bool shader_program_disable(shader_program_base& spb) = 0; virtual int get_uniform_location(const shader_program_base& spb, const std::string& name) const = 0; virtual bool set_uniform_void(shader_program_base& spb, int loc, type_descriptor value_type, const void* value_ptr) = 0; virtual bool set_uniform_array_void(shader_program_base& spb, int loc, type_descriptor value_type, const void* value_ptr, size_t nr_elements) = 0; virtual int get_attribute_location(const shader_program_base& spb, const std::string& name) const = 0; virtual bool set_attribute_void(shader_program_base& spb, int loc, type_descriptor value_type, const void* value_ptr) = 0; virtual bool attribute_array_binding_create (attribute_array_binding_base& aab) = 0; virtual bool attribute_array_binding_destruct(attribute_array_binding_base& aab) = 0; virtual bool attribute_array_binding_enable (attribute_array_binding_base& aab) = 0; virtual bool attribute_array_binding_disable (attribute_array_binding_base& aab) = 0; virtual bool set_attribute_array_void(attribute_array_binding_base* aab, int loc, type_descriptor value_type, const vertex_buffer_base* vbb, const void* ptr, size_t nr_elements = 0, unsigned stride_in_bytes = 0) = 0; virtual bool enable_attribute_array(attribute_array_binding_base* aab, int loc, bool do_enable) = 0; virtual bool is_attribute_array_enabled(const attribute_array_binding_base* aab, int loc) const = 0; virtual bool vertex_buffer_create(vertex_buffer_base& vbb, const void* array_ptr, size_t size_in_bytes) = 0; virtual bool vertex_buffer_replace(vertex_buffer_base& vbb, size_t offset, size_t size_in_bytes, const void* array_ptr) = 0; virtual bool vertex_buffer_copy(const vertex_buffer_base& src, size_t src_offset, vertex_buffer_base& target, size_t target_offset, size_t size_in_bytes) = 0; virtual bool vertex_buffer_copy_back(vertex_buffer_base& vbb, size_t offset, size_t size_in_bytes, void* array_ptr) = 0; virtual bool vertex_buffer_destruct(vertex_buffer_base& vbb) = 0; public: friend class CGV_API attribute_array_manager; friend class CGV_API render_component; friend class CGV_API texture; friend class CGV_API render_buffer; friend class CGV_API frame_buffer; friend class CGV_API shader_code; friend class CGV_API shader_program; friend class CGV_API attribute_array_binding; friend class CGV_API vertex_buffer; /// declare type of matrices typedef cgv::math::mat mat_type; /// declare type of vectors typedef cgv::math::vec vec_type; protected: /// keep two matrix stacks for view and projection matrices std::stack V_stack, P_stack; public: /// init the cursor position to (0,0) context(); /// virtual destructor virtual ~context(); /// error handling virtual void error(const std::string& message, const render_component* rc = 0) const; /**@name interface for implementation of specific contexts*/ //@{ /// virtual void init_render_pass(); /// virtual cgv::base::group* get_group_interface(); /// virtual void draw_textual_info(); /// virtual void perform_screen_shot(); /// virtual void finish_render_pass(); //@} /**@name render process*/ //@{ /// helper method to integrate a new child virtual void configure_new_child(cgv::base::base_ptr child); /// return the used rendering API virtual RenderAPI get_render_api() const = 0; /// return the current render pass virtual RenderPass get_render_pass() const; /// return the current render pass flags virtual RenderPassFlags get_render_pass_flags() const; /// return the current render pass user data virtual void* get_render_pass_user_data() const; /// return the default render pass flags virtual RenderPassFlags get_default_render_pass_flags() const; /// return the default render pass flags virtual void set_default_render_pass_flags(RenderPassFlags); /// perform the given render task virtual void render_pass(RenderPass render_pass = RP_MAIN, RenderPassFlags render_pass_flags = RPF_ALL, void* user_data = 0); /// return whether the context is currently in process of rendering virtual bool in_render_process() const = 0; /// return whether the context is created virtual bool is_created() const = 0; /// return whether the context is current virtual bool is_current() const = 0; /// make the current context current if possible virtual bool make_current() const = 0; /// clear the current context, typically used in multi-threaded rendering to allow usage of context in several threads virtual void clear_current() const = 0; //@} /// return the width of the window virtual unsigned int get_width() const = 0; /// return the height of the window virtual unsigned int get_height() const = 0; /// resize the context to the given dimensions virtual void resize(unsigned int width, unsigned int height) = 0; /// return whether alpha buffer is attached virtual bool is_alpha_buffer_attached() const = 0; /// attach an alpha buffer to the current frame buffer if not present virtual void attach_alpha_buffer() = 0; /// detach the alpha buffer if present virtual void detach_alpha_buffer() = 0; /// return whether stencil buffer is attached virtual bool is_stencil_buffer_attached() const = 0; /// attach a stencil buffer to the current frame buffer if not present virtual void attach_stencil_buffer() = 0; /// detach the stencil buffer if present virtual void detach_stencil_buffer() = 0; /// return whether the graphics card supports quad buffer mode virtual bool is_quad_buffer_supported() const = 0; /// return whether quad buffer is attached virtual bool is_quad_buffer_attached() const = 0; /// attach a quad buffer to the current frame buffer if not present virtual void attach_quad_buffer() = 0; /// detach the quad buffer if present virtual void detach_quad_buffer() = 0; /// return whether accumulation buffer is attached virtual bool is_accum_buffer_attached() const = 0; /// attach a accumulation buffer to the current frame buffer if not present virtual void attach_accum_buffer() = 0; /// detach the accumulation buffer if present virtual void detach_accum_buffer() = 0; /// return whether multisampling is enabled virtual bool is_multisample_enabled() const = 0; /// enable multi sampling virtual void enable_multisample() = 0; /// disable multi sampling virtual void disable_multisample() = 0; /** read the current frame buffer or a rectangular region of it into the given data view. If no format is associated with the data view, a new format is created and assigned to the data view. If width and height are not specified in the format associated with the data view or in the parameters, they are determined from the current viewport size. x and y specify the pixel offset of the region measured from the left upper corner. The parameter buffer_type is only used in case of reading color or alpha components and specifies from which color buffer to read the data. */ virtual bool read_frame_buffer( data::data_view& dv, unsigned int x = 0, unsigned int y = 0, FrameBufferType buffer_type = FB_BACK, TypeId type = type::info::TI_UINT8, data::ComponentFormat cf = data::CF_RGB, int w = -1, int h = -1) = 0; /** write the content of the frame buffer to an image file. In case of writing a depth buffer a the depth offset is subtracted from the value and scaled by the depth scale before conversion to an unsigned int of bit depth 8 is performed. */ bool write_frame_buffer_to_image( const std::string& file_name, data::ComponentFormat cf = data::CF_RGB, FrameBufferType buffer_type = FB_BACK, unsigned int x = 0, unsigned int y = 0, int w = -1, int h = -1, float depth_offset = 0.9f, float depth_scale = 10.0f); /// set a user defined background color virtual void set_bg_color(float r, float g, float b, float a); /// set a user defined background alpha value virtual void set_bg_alpha(float a); /// set a user defined background depth value virtual void set_bg_depth(float d); /// set a user defined background stencil value virtual void set_bg_stencil(int s); /// set a user defined background color for the accumulation buffer virtual void set_bg_accum_color(float r, float g, float b, float a); /// set a user defined background alpha value for the accumulation buffer virtual void set_bg_accum_alpha(float a); /// set an indexed background color virtual void set_bg_clr_idx(unsigned int idx); /// return the current index of the background color unsigned int get_bg_clr_idx() const; /// copy the current back ground rgba color into the given float array void put_bg_color(float* rgba) const; /// return the current alpha value for clearing the background float get_bg_alpha() const; /// copy the current back ground rgba color of the accumulation buffer into the given float array void put_bg_accum_color(float* rgba) const; /// return the current alpha value for clearing the accumulation buffer float get_bg_accum_alpha() const; /// return the current depth value for clearing the background float get_bg_depth() const; /// return the current stencil value for clearing the background int get_bg_stencil() const; /// the context will be redrawn when the system is idle again virtual void post_redraw() = 0; /// the context will be redrawn right now. This method cannot be called inside the following methods of a drawable: init, init_frame, draw, finish_draw virtual void force_redraw() = 0; /**@name font selection and measure*/ //@{ /// enable the given font face with the given size in pixels virtual void enable_font_face(media::font::font_face_ptr font_face, float font_size) = 0; /// return the size in pixels of the currently enabled font face virtual float get_current_font_size() const; /// return the currently enabled font face virtual media::font::font_face_ptr get_current_font_face() const; //@} /**@name light and materials management*/ //@{ /// enable phong shading with the help of a shader (enabled by default) virtual void enable_phong_shading(); /// disable phong shading virtual void disable_phong_shading(); /// enable a material without textures virtual void enable_material(const cgv::media::illum::phong_material& mat, MaterialSide ms = MS_FRONT_AND_BACK, float alpha = 1) = 0; /// disable phong material virtual void disable_material(const cgv::media::illum::phong_material& mat) = 0; /// enable a material with textures virtual void enable_material(const textured_material& mat, MaterialSide ms = MS_FRONT_AND_BACK, float alpha = 1) = 0; /// disable phong material virtual void disable_material(const textured_material& mat) = 0; /// return maximum number of supported light sources virtual unsigned get_max_nr_lights() const = 0; /// enable a light source and return a handled to be used for disabling, if no more light source unit available 0 is returned virtual void* enable_light(const cgv::media::illum::light_source& light) = 0; /// disable a previously enabled light virtual void disable_light(void* handle) = 0; //@} /**@name text output*/ //@{ /** returns an output stream whose output is printed at the current cursor location, which is managed by the context. The coordinate system of the cursor location corresponds to window / mouse coordinates. The cursor position is updated during text drawing also by special characters like tab or new line and can be read back with the get_cursor method. Use the flush method of the output_stream to ensure that text has been drawn to the context. */ virtual std::ostream& output_stream(); /** flush the output_stream and set a new cursor position given in window/mouse coordinates */ virtual void set_cursor(int x, int y); /// return current cursor location in mouse coordinates virtual void get_cursor(int& x, int& y) const; /** transform point p in current world coordinates into cursor coordinates and put x and y coordinates into the passed variables */ virtual void put_cursor_coords(const vec_type& p, int& x, int& y) const = 0; /** flush output_stream and set the current text position from a 3D or 4D location in current world coordinates. These are transformed to mouse coordinates with the put_cursor_coords method. If the optional parameters are given, update the cursor location such that the given text alignment is achieved. */ virtual void set_cursor(const cgv::math::vec& pos, const std::string& text = "", TextAlignment ta = TA_BOTTOM_LEFT, int x_offset=0, int y_offset=0); /// same as with float version of vec virtual void set_cursor(const cgv::math::vec& pos, const std::string& text = "", TextAlignment ta = TA_BOTTOM_LEFT, int x_offset=0, int y_offset=0); //@} /**@name tesselation*/ //@{ /// tesselate with independent faces virtual void draw_faces( const double* vertices, const double* normals, const double* tex_coords, const int* vertex_indices, const int* normal_indices, const int* tex_coord_indices, int nr_faces, int face_degree, bool flip_normals = false) const = 0; /// tesselate with one face strip virtual void draw_strip_or_fan( const double* vertices, const double* normals, const double* tex_coords, const int* vertex_indices, const int* normal_indices, const int* tex_coord_indices, int nr_faces, int face_degree, bool is_fan, bool flip_normals = false) const = 0; /// tesselate a unit square in the xy-plane with texture coordinates void tesselate_unit_square(bool flip_normals = false); /// tesselate a unit cube with extent from [-1,-1,-1] to [1,1,1] with face normals that can be flipped void tesselate_unit_cube(bool flip_normals = false); /// tesselate an axis aligned box virtual void tesselate_box(const cgv::media::axis_aligned_box& B, bool flip_normals) const; /// tesselate a prism void tesselate_unit_prism(bool flip_normals = false); /// tesselate a circular disk of radius 1 void tesselate_unit_disk(int resolution = 25, bool flip_normals = false); /// tesselate a cone of radius 1 void tesselate_unit_cone(int resolution = 25, bool flip_normals = false); /// tesselate a cylinder of radius 1 void tesselate_unit_cylinder(int resolution = 25, bool flip_normals = false); /// tesselate a sphere of radius 1 void tesselate_unit_sphere(int resolution = 25, bool flip_normals = false); /// tesselate a tetrahedron void tesselate_unit_tetrahedron(bool flip_normals = false); /// tesselate a octahedron void tesselate_unit_octahedron(bool flip_normals = false); /// tesselate a dodecahedron void tesselate_unit_dodecahedron(bool flip_normals = false); /// tesselate an icosahedron void tesselate_unit_icosahedron(bool flip_normals = false); /// tesselate a torus with major radius of one and given minor radius void tesselate_unit_torus(float minor_radius = 0.2f, int resolution = 25, bool flip_normals = false); //! tesselate an arrow from the origin in z-direction /*! An arrow of length L is composed of a cylinder of radius R and a cone of radius r. The parameters are @param[in] length the total length of the radius @param[in] aspect is defined as R/L @param[in] rel_tip_radius is defined as r/R @param[in] tip_aspect is defined as r/l */ virtual void tesselate_arrow(double length = 1, double aspect = 0.1, double rel_tip_radius = 2.0, double tip_aspect = 0.3, int res = 25); /// define length and direction from start and end point and draw an arrow virtual void tesselate_arrow(const cgv::math::fvec& start, const cgv::math::fvec& end, double aspect = 0.1f, double rel_tip_radius = 2.0f, double tip_aspect = 0.3f, int res = 25); //! draw a light source with an emissive material /*! @param[in] l to be rendered light source @param[in] intensity_scale used to multiply with the light source values */ virtual void draw_light_source(const cgv::media::illum::light_source& l, float intensity_scale, float light_scale); //@} /**@name transformations*/ //@{ /** use this to push transformation matrices on the stack such that x and y coordinates correspond to window coordinates, i.e. the coordinates of the mouse pointer and the cursor for text output. */ virtual void push_pixel_coords() = 0; /// pop previously changed transformation matrices virtual void pop_pixel_coords() = 0; /// return homogeneous 4x4 viewing matrix, which transforms from world to eye space virtual mat_type get_V() const = 0; /// set the current viewing matrix, which transforms from world to eye space virtual void set_V(const mat_type& V) const = 0; //! push the current viewing matrix onto a matrix stack for viewing matrices. /*! A software implementation is used for the matrix stack as some hardware stacks - i.e. in opengl - have strong limitations on their maximum size. The push_V method does not change the current viewing matrix similarly to the glPushMatrix function. Use pop_V() to restore the pushed viewing matrix into the current viewing matrix. Don't intermix these methods with the correspondong opengl or directx functions.*/ void push_V(); /// see push_V for an explanation void pop_V(); /// return homogeneous 4x4 projection matrix, which transforms from eye to clip space virtual mat_type get_P() const = 0; /// set the current projection matrix, which transforms from eye to clip space virtual void set_P(const mat_type& P) const = 0; /// same as push_V but for the projection matrix - a different matrix stack is used. void push_P(); /// see push_P for an explanation void pop_P(); /// return homogeneous 4x4 projection matrix, which transforms from clip to device space virtual mat_type get_D() const = 0; /// return homogeneous 4x4 matrix, which transforms from world to device space virtual mat_type get_DPV() const; /// read the device z-coordinate from the z-buffer for the given device x- and y-coordinates virtual double get_z_D(int x_D, int y_D) const = 0; /// compute the location in world space of a device x/y-location. For this the device point is extended with the device z-coordinate currently stored in the displayed depth buffer. vec_type get_point_W(int x_D, int y_D) const; /// compute the location in world space of a device x/y-location by inversion of the given transformation from world to device space. For this the device point is extended with the device z-coordinate currently stored in the displayed depth buffer. vec_type get_point_W(int x_D, int y_D, const mat_type& DPV) const; /// compute the location in world space of a device point. For this the current world to device transformation get_DPV is inverted. vec_type get_point_W(int x_D, int y_D, double z_D) const; /// compute the location in world space of a device point by inversion of the given world to device transformation. vec_type get_point_W(int x_D, int y_D, double z_D, const mat_type& DPV) const; /// compute a the location in world space of a device point. vec_type get_point_W(const vec_type& p_D) const; /// compute a the location in world space of a device point. virtual vec_type get_point_W(const vec_type& p_D, const mat_type& MPD) const; //@} }; /** construct a context of the given size. This is primarily used to create a context without a window for console applications that render into a frame buffer object only. The newly created context will be current right after creation. After usage you need to delete the context by hand. */ extern CGV_API context* create_context(RenderAPI api = RA_OPENGL, unsigned int w = 800, unsigned int h = 600, const std::string& title = "", bool show = false); typedef context* (*context_creation_function_type)(RenderAPI api, unsigned int w, unsigned int h, const std::string& title, bool show); /// registration context creation functions extern CGV_API void register_context_factory(context_creation_function_type); struct CGV_API context_factory_registration { context_factory_registration(context_creation_function_type fp); }; } } #include