Skip to content

Commit 59c4365

Browse files
committed
factory->context
1 parent aaf06d4 commit 59c4365

File tree

6 files changed

+278
-270
lines changed

6 files changed

+278
-270
lines changed

src/ruis/render/opengl/context.cpp

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
3030
#include "shaders/shader_pos_clr.hpp"
3131
#include "shaders/shader_pos_tex.hpp"
3232

33+
#include "frame_buffer.hpp"
34+
#include "index_buffer.hpp"
35+
#include "texture_2d.hpp"
36+
#include "texture_cube.hpp"
37+
#include "texture_depth.hpp"
38+
#include "vertex_array.hpp"
39+
#include "vertex_buffer.hpp"
40+
3341
using namespace ruis::render::opengl;
3442

3543
utki::shared_ref<ruis::render::context::shaders> context::create_shaders()
@@ -50,3 +58,210 @@ utki::shared_ref<ruis::render::context::shaders> context::create_shaders()
5058
ret.get().color_pos_lum = std::make_unique<shader_color_pos_lum>(this->get_shared_ref());
5159
return ret;
5260
}
61+
62+
utki::shared_ref<ruis::render::texture_2d> context::create_texture_2d(
63+
rasterimage::format format,
64+
rasterimage::dimensioned::dimensions_type dims,
65+
texture_2d_parameters params
66+
)
67+
{
68+
return this->create_texture_2d_internal(format, dims, {}, std::move(params));
69+
}
70+
71+
utki::shared_ref<ruis::render::texture_2d> context::create_texture_2d(
72+
const rasterimage::image_variant& imvar,
73+
texture_2d_parameters params
74+
)
75+
{
76+
auto imvar_copy = imvar;
77+
return this->create_texture_2d(std::move(imvar_copy), std::move(params));
78+
}
79+
80+
utki::shared_ref<ruis::render::texture_2d> context::create_texture_2d(
81+
rasterimage::image_variant&& imvar,
82+
texture_2d_parameters params
83+
)
84+
{
85+
auto iv = std::move(imvar);
86+
return std::visit(
87+
[this, &imvar = iv, &params](auto&& im) -> utki::shared_ref<ruis::render::texture_2d> {
88+
if constexpr (sizeof(im.pixels().front().front()) != 1) {
89+
throw std::logic_error(
90+
"context::create_texture_2d(): "
91+
"non-8bit images are not supported"
92+
);
93+
} else {
94+
im.span().flip_vertical();
95+
auto data = im.pixels();
96+
return this->create_texture_2d_internal(
97+
imvar.get_format(),
98+
im.dims(),
99+
utki::make_span(data.front().data(), data.size_bytes()),
100+
std::move(params)
101+
);
102+
}
103+
},
104+
iv.variant
105+
);
106+
}
107+
108+
utki::shared_ref<ruis::render::texture_2d> context::create_texture_2d_internal(
109+
rasterimage::format type,
110+
rasterimage::dimensioned::dimensions_type dims,
111+
utki::span<const uint8_t> data,
112+
texture_2d_parameters params
113+
)
114+
{
115+
return utki::make_shared<texture_2d>(
116+
this->get_shared_ref(), //
117+
type,
118+
dims,
119+
data,
120+
params
121+
);
122+
}
123+
124+
utki::shared_ref<ruis::render::texture_depth> context::create_texture_depth(
125+
rasterimage::dimensioned::dimensions_type dims
126+
)
127+
{
128+
return utki::make_shared<texture_depth>(
129+
this->get_shared_ref(), //
130+
dims
131+
);
132+
}
133+
134+
utki::shared_ref<ruis::render::texture_cube> context::create_texture_cube(
135+
rasterimage::image_variant&& positive_x,
136+
rasterimage::image_variant&& negative_x,
137+
rasterimage::image_variant&& positive_y,
138+
rasterimage::image_variant&& negative_y,
139+
rasterimage::image_variant&& positive_z,
140+
rasterimage::image_variant&& negative_z
141+
)
142+
{
143+
constexpr auto num_cube_sides = 6;
144+
std::array<rasterimage::image_variant, num_cube_sides> sides = {
145+
std::move(positive_x),
146+
std::move(negative_x),
147+
148+
// negative_y and positive_y are swapped due to texture coordinates y-axis going downwards
149+
std::move(negative_y),
150+
std::move(positive_y),
151+
152+
std::move(positive_z),
153+
std::move(negative_z)
154+
};
155+
std::array<ruis::render::opengl::texture_cube::cube_face_image, num_cube_sides> faces;
156+
157+
auto face = faces.begin();
158+
for (auto& side : sides) {
159+
ASSERT(face != faces.end())
160+
std::visit(
161+
[&](auto& im) {
162+
if constexpr (sizeof(im.pixels().front().front()) != 1) {
163+
throw std::logic_error(
164+
"context::create_texture_cube(): "
165+
"non-8bit images are not supported"
166+
);
167+
} else {
168+
im.span().flip_vertical();
169+
auto data = im.pixels();
170+
171+
face->type = side.get_format();
172+
face->dims = im.dims();
173+
face->data = utki::make_span(data.front().data(), data.size_bytes());
174+
}
175+
},
176+
side.variant
177+
);
178+
++face;
179+
}
180+
181+
return utki::make_shared<texture_cube>(
182+
this->get_shared_ref(), //
183+
faces
184+
);
185+
}
186+
187+
utki::shared_ref<ruis::render::vertex_buffer> context::create_vertex_buffer(
188+
utki::span<const r4::vector4<float>> vertices
189+
)
190+
{
191+
return utki::make_shared<vertex_buffer>(
192+
this->get_shared_ref(), //
193+
vertices
194+
);
195+
}
196+
197+
utki::shared_ref<ruis::render::vertex_buffer> context::create_vertex_buffer(
198+
utki::span<const r4::vector3<float>> vertices
199+
)
200+
{
201+
return utki::make_shared<vertex_buffer>(
202+
this->get_shared_ref(), //
203+
vertices
204+
);
205+
}
206+
207+
utki::shared_ref<ruis::render::vertex_buffer> context::create_vertex_buffer(
208+
utki::span<const r4::vector2<float>> vertices
209+
)
210+
{
211+
return utki::make_shared<vertex_buffer>(
212+
this->get_shared_ref(), //
213+
vertices
214+
);
215+
}
216+
217+
utki::shared_ref<ruis::render::vertex_buffer> context::create_vertex_buffer(utki::span<const float> vertices)
218+
{
219+
return utki::make_shared<vertex_buffer>(
220+
this->get_shared_ref(), //
221+
vertices
222+
);
223+
}
224+
225+
utki::shared_ref<ruis::render::vertex_array> context::create_vertex_array(
226+
std::vector<utki::shared_ref<const ruis::render::vertex_buffer>> buffers,
227+
utki::shared_ref<const ruis::render::index_buffer> indices,
228+
ruis::render::vertex_array::mode mode
229+
)
230+
{
231+
return utki::make_shared<vertex_array>(
232+
this->get_shared_ref(), //
233+
std::move(buffers),
234+
std::move(indices),
235+
mode
236+
);
237+
}
238+
239+
utki::shared_ref<ruis::render::index_buffer> context::create_index_buffer(utki::span<const uint16_t> indices)
240+
{
241+
return utki::make_shared<index_buffer>(
242+
this->get_shared_ref(), //
243+
indices
244+
);
245+
}
246+
247+
utki::shared_ref<ruis::render::index_buffer> context::create_index_buffer(utki::span<const uint32_t> indices)
248+
{
249+
return utki::make_shared<index_buffer>(
250+
this->get_shared_ref(), //
251+
indices
252+
);
253+
}
254+
255+
utki::shared_ref<ruis::render::frame_buffer> context::create_framebuffer( //
256+
std::shared_ptr<ruis::render::texture_2d> color,
257+
std::shared_ptr<ruis::render::texture_depth> depth,
258+
std::shared_ptr<ruis::render::texture_stencil> stencil
259+
)
260+
{
261+
return utki::make_shared<frame_buffer>( //
262+
this->get_shared_ref(),
263+
std::move(color),
264+
std::move(depth),
265+
std::move(stencil)
266+
);
267+
}

src/ruis/render/opengl/context.hpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,67 @@ class context : public ruis::render::context
3030
{
3131
public:
3232
utki::shared_ref<shaders> create_shaders() override;
33+
34+
utki::shared_ref<ruis::render::texture_2d> create_texture_2d(
35+
rasterimage::format format,
36+
rasterimage::dimensioned::dimensions_type dims,
37+
texture_2d_parameters params
38+
) override;
39+
40+
utki::shared_ref<ruis::render::texture_2d> create_texture_2d(
41+
const rasterimage::image_variant& imvar,
42+
texture_2d_parameters params
43+
) override;
44+
45+
utki::shared_ref<ruis::render::texture_2d> create_texture_2d(
46+
rasterimage::image_variant&& imvar,
47+
texture_2d_parameters params
48+
) override;
49+
50+
utki::shared_ref<ruis::render::texture_depth> create_texture_depth(
51+
rasterimage::dimensioned::dimensions_type dims
52+
) override;
53+
54+
utki::shared_ref<ruis::render::texture_cube> create_texture_cube(
55+
rasterimage::image_variant&& positive_x,
56+
rasterimage::image_variant&& negative_x,
57+
rasterimage::image_variant&& positive_y,
58+
rasterimage::image_variant&& negative_y,
59+
rasterimage::image_variant&& positive_z,
60+
rasterimage::image_variant&& negative_z
61+
) override;
62+
63+
utki::shared_ref<ruis::render::vertex_buffer> create_vertex_buffer(
64+
utki::span<const r4::vector4<float>> vertices
65+
) override;
66+
utki::shared_ref<ruis::render::vertex_buffer> create_vertex_buffer(
67+
utki::span<const r4::vector3<float>> vertices
68+
) override;
69+
utki::shared_ref<ruis::render::vertex_buffer> create_vertex_buffer(
70+
utki::span<const r4::vector2<float>> vertices
71+
) override;
72+
utki::shared_ref<ruis::render::vertex_buffer> create_vertex_buffer(utki::span<const float> vertices) override;
73+
utki::shared_ref<ruis::render::index_buffer> create_index_buffer(utki::span<const uint16_t> indices) override;
74+
utki::shared_ref<ruis::render::index_buffer> create_index_buffer(utki::span<const uint32_t> indices) override;
75+
utki::shared_ref<ruis::render::vertex_array> create_vertex_array(
76+
std::vector<utki::shared_ref<const ruis::render::vertex_buffer>> buffers,
77+
utki::shared_ref<const ruis::render::index_buffer> indices,
78+
ruis::render::vertex_array::mode mode
79+
) override;
80+
81+
utki::shared_ref<ruis::render::frame_buffer> create_framebuffer( //
82+
std::shared_ptr<ruis::render::texture_2d> color,
83+
std::shared_ptr<ruis::render::texture_depth> depth,
84+
std::shared_ptr<ruis::render::texture_stencil> stencil
85+
) override;
86+
87+
private:
88+
utki::shared_ref<ruis::render::texture_2d> create_texture_2d_internal(
89+
rasterimage::format type,
90+
rasterimage::dimensioned::dimensions_type dims,
91+
utki::span<const uint8_t> data,
92+
texture_2d_parameters params
93+
);
3394
};
3495

3596
} // namespace ruis::render::opengl

0 commit comments

Comments
 (0)