Unravel Engine C++ Reference
Loading...
Searching...
No Matches
render_pass.cpp
Go to the documentation of this file.
1#include "render_pass.h"
2#include "graphics/graphics.h"
3#include <bitset>
4#include <limits>
5
6namespace gfx
7{
8namespace
9{
10auto get_last_frame_counter() -> gfx::view_id&
11{
12 static gfx::view_id id = 0;
13 return id;
14}
15
16auto get_counter() -> gfx::view_id&
17{
18 static gfx::view_id id = 0;
19 return id;
20}
21
22auto generate_id() -> gfx::view_id
23{
24 const auto& limits = gfx::get_caps()->limits;
25 auto& counter = get_counter();
26 if(counter >= limits.maxViews - 1)
27 {
28 frame();
29 counter = 0;
30 }
31 gfx::view_id idx = counter++;
32
33 return idx;
34}
35
36auto get_scopes() -> std::vector<std::string>&
37{
38 static std::vector<std::string> scopes;
39 return scopes;
40}
41}
43{
44 get_scopes().emplace_back(name);
45}
46
48{
49 get_scopes().pop_back();
50}
51
52render_pass::render_pass(const char* name) : render_pass(generate_id(), name)
53{
54}
55
56render_pass::render_pass(view_id i, const char* name) : id(i)
57{
58 reset_view(id);
59
60 const auto& scopes = get_scopes();
61 if(scopes.empty())
62 {
64 }
65 else
66 {
67 std::string scoped_name{};
68 for(const auto& scope : scopes)
69 {
70 scoped_name.append(scope).append("/");
71 }
72
73 scoped_name.append(name);
74
75 set_view_name(id, scoped_name.c_str());
76
77 }
78}
79
80void render_pass::bind(const frame_buffer* fb) const
81{
82 set_view_mode(id, gfx::view_mode::Sequential);
83 if(fb != nullptr)
84 {
85 const auto size = fb->get_size();
86 const auto width = size.width;
87 const auto height = size.height;
89 gfx::set_view_rect(id, 0, 0, width, height);
90 gfx::set_view_scissor(id, uint16_t(0), uint16_t(0), uint16_t(width), uint16_t(height));
91 }
92 else
93 {
95 gfx::set_view_rect(id, uint16_t(0), uint16_t(0), backbuffer_ratio::Equal);
96 }
97 touch();
98}
99
101{
102 gfx::touch(id);
103}
104
105void render_pass::clear(uint16_t _flags,
106 uint32_t _rgba /*= 0x000000ff */,
107 float _depth /*= 1.0f */,
108 uint8_t _stencil /*= 0*/) const
109{
110 set_view_clear(id, _flags, _rgba, _depth, _stencil);
111 touch();
112}
113
115{
116 clear(BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH | BGFX_CLEAR_STENCIL, 0x000000FF, 1.0f, 0);
117}
118
119void render_pass::set_view_proj(const float* v, const float* p)
120{
121 set_view_transform(id, v, p);
122}
123
124void render_pass::set_view_scissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
125{
126 gfx::set_view_scissor(id, _x, _y, _width, _height);
127}
128
129void render_pass::set_view_rect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
130{
131 gfx::set_view_rect(id, _x, _y, _width, _height);
132}
133
135{
136 auto& count = get_counter();
137 get_last_frame_counter() = count;
138 count = 0;
139}
140
142{
143 const auto& limits = gfx::get_caps()->limits;
144 return limits.maxViews - 1;
145}
146
148{
149 return get_last_frame_counter();
150}
151} // namespace gfx
static auto invalid_handle() -> frame_buffer_handle
Definition handle_impl.h:45
auto native_handle() const -> T
Definition handle_impl.h:40
uint32_t frame
Definition graphics.cpp:21
std::string name
Definition hub.cpp:27
void set_view_scissor(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:707
void set_view_mode(view_id _id, view_mode _mode)
Definition graphics.cpp:733
void set_view_clear(view_id _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
Definition graphics.cpp:712
void reset_view(view_id _id)
Definition graphics.cpp:753
void touch(view_id _id)
Definition graphics.cpp:894
void set_view_frame_buffer(view_id _id, frame_buffer_handle _handle)
Definition graphics.cpp:738
void set_view_rect(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:697
void set_view_name(view_id _id, const char *_name)
Definition graphics.cpp:692
void set_view_transform(view_id _id, const void *_view, const void *_proj)
Definition graphics.cpp:743
const caps * get_caps()
Definition graphics.cpp:286
bgfx::ViewId view_id
Definition graphics.h:20
auto get_size() const -> usize32_t
static auto get_last_frame_max_pass_id() -> gfx::view_id
void set_view_rect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
static void reset()
static auto get_max_pass_id() -> gfx::view_id
static void pop_scope()
void clear() const
void set_view_proj(const float *v, const float *p)
void set_view_scissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
render_pass(const char *name)
void touch() const
static void push_scope(const char *name)
void bind(const frame_buffer *fb=nullptr) const
T width
Definition basetypes.hpp:55
T height
Definition basetypes.hpp:56