mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-16 22:16:53 +07:00
material and geometry ptr for draw_command
This commit is contained in:
@@ -665,8 +665,14 @@ namespace e2d
|
||||
u8 _pad[4] = {0};
|
||||
};
|
||||
|
||||
class material;
|
||||
using material_ptr = std::shared_ptr<material>;
|
||||
|
||||
class material final {
|
||||
public:
|
||||
static material_ptr create();
|
||||
static material_ptr create(const material& mat);
|
||||
|
||||
material& add_pass(const pass_state& pass) noexcept;
|
||||
std::size_t pass_count() const noexcept;
|
||||
|
||||
@@ -684,8 +690,14 @@ namespace e2d
|
||||
property_block properties_;
|
||||
};
|
||||
|
||||
class geometry;
|
||||
using geometry_ptr = std::shared_ptr<geometry>;
|
||||
|
||||
class geometry final {
|
||||
public:
|
||||
static geometry_ptr create();
|
||||
static geometry_ptr create(const geometry& geo);
|
||||
|
||||
geometry& add_vertices(const vertex_buffer_ptr& vb) noexcept;
|
||||
std::size_t vertices_count() const noexcept;
|
||||
|
||||
@@ -722,21 +734,23 @@ namespace e2d
|
||||
|
||||
class draw_command final {
|
||||
public:
|
||||
draw_command() = delete;
|
||||
draw_command(const material& mat, const geometry& geo) noexcept;
|
||||
|
||||
draw_command& material_ref(const material& value) noexcept;
|
||||
draw_command& geometry_ref(const geometry& value) noexcept;
|
||||
|
||||
const material& material_ref() const noexcept;
|
||||
const geometry& geometry_ref() const noexcept;
|
||||
draw_command() = default;
|
||||
draw_command(const material_ptr& mat, const geometry_ptr& geo) noexcept;
|
||||
|
||||
draw_command& material(const material_ptr& value) noexcept;
|
||||
draw_command& geometry(const geometry_ptr& value) noexcept;
|
||||
draw_command& properties(const property_block& value);
|
||||
|
||||
material_ptr& material() noexcept;
|
||||
geometry_ptr& geometry() noexcept;
|
||||
property_block& properties() noexcept;
|
||||
|
||||
const material_ptr& material() const noexcept;
|
||||
const geometry_ptr& geometry() const noexcept;
|
||||
const property_block& properties() const noexcept;
|
||||
private:
|
||||
const material* material_ = nullptr;
|
||||
const geometry* geometry_ = nullptr;
|
||||
material_ptr material_;
|
||||
geometry_ptr geometry_;
|
||||
property_block properties_;
|
||||
};
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ namespace e2d
|
||||
std::this_thread::get_id() ==
|
||||
modules::main_thread<render>());
|
||||
|
||||
for ( std::size_t i = 0; i < commands.command_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = commands.command_count(); i < e; ++i ) {
|
||||
execute(commands.command(i));
|
||||
}
|
||||
return *this;
|
||||
|
||||
@@ -144,7 +144,7 @@ int e2d_main() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto material = render::material()
|
||||
auto material = render::material::create(render::material()
|
||||
.add_pass(render::pass_state()
|
||||
.states(render::state_block()
|
||||
.capabilities(render::capabilities_state()
|
||||
@@ -161,12 +161,12 @@ int e2d_main() {
|
||||
.sampler("u_texture2", render::sampler_state()
|
||||
.texture(texture2)
|
||||
.min_filter(render::sampler_min_filter::linear)
|
||||
.mag_filter(render::sampler_mag_filter::linear))));
|
||||
.mag_filter(render::sampler_mag_filter::linear)))));
|
||||
|
||||
auto geometry = render::geometry()
|
||||
auto geometry = render::geometry::create(render::geometry()
|
||||
.indices(index_buffer)
|
||||
.add_vertices(vertex_buffer1)
|
||||
.add_vertices(vertex_buffer2);
|
||||
.add_vertices(vertex_buffer2));
|
||||
|
||||
const auto begin_game_time = time::now_ms();
|
||||
const auto framebuffer_size = the<window>().real_size().cast_to<f32>();
|
||||
@@ -176,7 +176,7 @@ int e2d_main() {
|
||||
while ( !the<window>().should_close() && !k.is_key_just_released(keyboard_key::escape) ) {
|
||||
const auto game_time = (time::now_ms() - begin_game_time).cast_to<f32>().value;
|
||||
|
||||
material.properties()
|
||||
material->properties()
|
||||
.property("u_time", game_time)
|
||||
.property("u_MVP", projection);
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ int e2d_main() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto material = render::material()
|
||||
auto material = render::material::create(render::material()
|
||||
.add_pass(render::pass_state()
|
||||
.states(render::state_block()
|
||||
.capabilities(render::capabilities_state()
|
||||
@@ -216,12 +216,12 @@ int e2d_main() {
|
||||
.sampler("u_texture", render::sampler_state()
|
||||
.texture(texture)
|
||||
.min_filter(render::sampler_min_filter::linear)
|
||||
.mag_filter(render::sampler_mag_filter::linear))));
|
||||
.mag_filter(render::sampler_mag_filter::linear)))));
|
||||
|
||||
auto geometry = render::geometry()
|
||||
auto geometry = render::geometry::create(render::geometry()
|
||||
.indices(index_buffer)
|
||||
.add_vertices(vertex_buffer1)
|
||||
.add_vertices(vertex_buffer2);
|
||||
.add_vertices(vertex_buffer2));
|
||||
|
||||
const auto begin_game_time = time::now_ms();
|
||||
const auto framebuffer_size = the<window>().real_size().cast_to<f32>();
|
||||
@@ -243,7 +243,7 @@ int e2d_main() {
|
||||
math::make_loot_at_lh_matrix4({0.f,0.f,-3.f}, v3f::zero(), v3f::unit_y()) *
|
||||
projection;
|
||||
|
||||
material.properties()
|
||||
material->properties()
|
||||
.property("u_time", game_time)
|
||||
.property("u_MVP", MVP);
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ int e2d_main() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto material = render::material()
|
||||
auto material = render::material::create(render::material()
|
||||
.add_pass(render::pass_state()
|
||||
.states(render::state_block()
|
||||
.capabilities(render::capabilities_state()
|
||||
@@ -169,11 +169,11 @@ int e2d_main() {
|
||||
.sampler("u_texture", render::sampler_state()
|
||||
.texture(texture)
|
||||
.min_filter(render::sampler_min_filter::linear)
|
||||
.mag_filter(render::sampler_mag_filter::linear)));
|
||||
.mag_filter(render::sampler_mag_filter::linear))));
|
||||
|
||||
auto geometry = render::geometry()
|
||||
auto geometry = render::geometry::create(render::geometry()
|
||||
.indices(index_buffer)
|
||||
.add_vertices(vertex_buffer);
|
||||
.add_vertices(vertex_buffer));
|
||||
|
||||
const auto begin_game_time = time::now_ms();
|
||||
const auto framebuffer_size = the<window>().real_size().cast_to<f32>();
|
||||
@@ -201,7 +201,7 @@ int e2d_main() {
|
||||
math::make_loot_at_lh_matrix4({0.f,0.f,-2.f}, v3f::zero(), v3f::unit_y()) *
|
||||
projection;
|
||||
|
||||
material.properties()
|
||||
material->properties()
|
||||
.property("u_time", game_time)
|
||||
.property("u_MVP", MVP);
|
||||
|
||||
|
||||
@@ -768,6 +768,14 @@ namespace e2d
|
||||
// material
|
||||
//
|
||||
|
||||
render::material_ptr render::material::create() {
|
||||
return std::make_shared<material>();
|
||||
}
|
||||
|
||||
render::material_ptr render::material::create(const material& mat) {
|
||||
return std::make_shared<material>(mat);
|
||||
}
|
||||
|
||||
render::material& render::material::add_pass(const pass_state& pass) noexcept {
|
||||
E2D_ASSERT(pass_count_ < max_pass_count);
|
||||
passes_[pass_count_] = pass;
|
||||
@@ -804,6 +812,14 @@ namespace e2d
|
||||
// geometry
|
||||
//
|
||||
|
||||
render::geometry_ptr render::geometry::create() {
|
||||
return std::make_shared<geometry>();
|
||||
}
|
||||
|
||||
render::geometry_ptr render::geometry::create(const geometry& geo) {
|
||||
return std::make_shared<geometry>(geo);
|
||||
}
|
||||
|
||||
render::geometry& render::geometry::add_vertices(const vertex_buffer_ptr& vb) noexcept {
|
||||
E2D_ASSERT(vertices_count_ < max_vertices_count);
|
||||
vertices_[vertices_count_] = vb;
|
||||
@@ -881,39 +897,45 @@ namespace e2d
|
||||
// draw_command
|
||||
//
|
||||
|
||||
render::draw_command::draw_command(const material& mat, const geometry& geo) noexcept
|
||||
: material_(&mat)
|
||||
, geometry_(&geo) {}
|
||||
render::draw_command::draw_command(const material_ptr& mat, const geometry_ptr& geo) noexcept
|
||||
: material_(mat)
|
||||
, geometry_(geo) {}
|
||||
|
||||
render::draw_command& render::draw_command::material_ref(const material& value) noexcept {
|
||||
material_ = &value;
|
||||
render::draw_command& render::draw_command::material(const material_ptr& value) noexcept {
|
||||
material_ = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
render::draw_command& render::draw_command::geometry_ref(const geometry& value) noexcept {
|
||||
geometry_ = &value;
|
||||
render::draw_command& render::draw_command::geometry(const geometry_ptr& value) noexcept {
|
||||
geometry_ = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const render::material& render::draw_command::material_ref() const noexcept {
|
||||
E2D_ASSERT(material_);
|
||||
return *material_;
|
||||
}
|
||||
|
||||
const render::geometry& render::draw_command::geometry_ref() const noexcept {
|
||||
E2D_ASSERT(geometry_);
|
||||
return *geometry_;
|
||||
}
|
||||
|
||||
render::draw_command& render::draw_command::properties(const property_block& value) {
|
||||
properties_ = value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
render::material_ptr& render::draw_command::material() noexcept {
|
||||
return material_;
|
||||
}
|
||||
|
||||
render::geometry_ptr& render::draw_command::geometry() noexcept {
|
||||
return geometry_;
|
||||
}
|
||||
|
||||
render::property_block& render::draw_command::properties() noexcept {
|
||||
return properties_;
|
||||
}
|
||||
|
||||
const render::material_ptr& render::draw_command::material() const noexcept {
|
||||
return material_;
|
||||
}
|
||||
|
||||
const render::geometry_ptr& render::draw_command::geometry() const noexcept {
|
||||
return geometry_;
|
||||
}
|
||||
|
||||
const render::property_block& render::draw_command::properties() const noexcept {
|
||||
return properties_;
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace
|
||||
E2D_ASSERT(ps && vb);
|
||||
opengl::with_gl_bind_buffer(debug, vb->state().id(), [&debug, &ps, &vb]() noexcept {
|
||||
const vertex_declaration& decl = vb->decl();
|
||||
for ( std::size_t i = 0; i < decl.attribute_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = decl.attribute_count(); i < e; ++i ) {
|
||||
const vertex_declaration::attribute_info& vai = decl.attribute(i);
|
||||
ps->state().with_attribute_location(vai.name, [&debug, &decl, &vai](const attribute_info& ai) noexcept {
|
||||
const GLuint rows = math::numeric_cast<GLuint>(vai.rows);
|
||||
@@ -207,7 +207,7 @@ namespace
|
||||
{
|
||||
E2D_ASSERT(ps && vb);
|
||||
const vertex_declaration& decl = vb->decl();
|
||||
for ( std::size_t i = 0; i < decl.attribute_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = decl.attribute_count(); i < e; ++i ) {
|
||||
const vertex_declaration::attribute_info& vai = decl.attribute(i);
|
||||
ps->state().with_attribute_location(vai.name, [&debug, &vai](const attribute_info& ai) noexcept {
|
||||
const GLuint rows = math::numeric_cast<GLuint>(vai.rows);
|
||||
@@ -261,7 +261,7 @@ namespace
|
||||
F&& f,
|
||||
Args&&... args)
|
||||
{
|
||||
for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) {
|
||||
const vertex_buffer_ptr& vb = geo.vertices(i);
|
||||
if ( vb ) {
|
||||
bind_vertex_declaration(debug, ps, vb);
|
||||
@@ -270,7 +270,7 @@ namespace
|
||||
try {
|
||||
stdex::invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
||||
} catch (...) {
|
||||
for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) {
|
||||
const vertex_buffer_ptr& vb = geo.vertices(i);
|
||||
if ( vb ) {
|
||||
unbind_vertex_declaration(debug, ps, vb);
|
||||
@@ -278,7 +278,7 @@ namespace
|
||||
}
|
||||
throw;
|
||||
}
|
||||
for ( std::size_t i = 0; i < geo.vertices_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = geo.vertices_count(); i < e; ++i ) {
|
||||
const vertex_buffer_ptr& vb = geo.vertices(i);
|
||||
if ( vb ) {
|
||||
unbind_vertex_declaration(debug, ps, vb);
|
||||
@@ -782,11 +782,14 @@ namespace e2d
|
||||
std::this_thread::get_id() ==
|
||||
modules::main_thread<render>());
|
||||
|
||||
const material& mat = command.material_ref();
|
||||
const geometry& geo = command.geometry_ref();
|
||||
E2D_ASSERT_MSG(command.material(), "draw command with empty material");
|
||||
E2D_ASSERT_MSG(command.geometry(), "draw command with empty geometry");
|
||||
|
||||
const material& mat = *command.material();
|
||||
const geometry& geo = *command.geometry();
|
||||
const property_block& props = command.properties();
|
||||
|
||||
for ( std::size_t i = 0; i < mat.pass_count(); ++i ) {
|
||||
for ( std::size_t i = 0, e = mat.pass_count(); i < e; ++i ) {
|
||||
const pass_state& pass = mat.pass(i);
|
||||
const property_block& main_props = main_property_cache()
|
||||
.clear()
|
||||
|
||||
@@ -1390,7 +1390,7 @@ namespace e2d { namespace opengl
|
||||
uniforms.reserve(uniforms.size() +
|
||||
math::numeric_cast<std::size_t>(uniform_count));
|
||||
|
||||
for ( GLuint i = 0; i < math::numeric_cast<GLuint>(uniform_count); ++i ) {
|
||||
for ( GLuint i = 0, e = math::numeric_cast<GLuint>(uniform_count); i < e; ++i ) {
|
||||
GLint size = 0;
|
||||
GLenum type = 0;
|
||||
GL_CHECK_CODE(debug, glGetActiveUniform(
|
||||
@@ -1428,7 +1428,7 @@ namespace e2d { namespace opengl
|
||||
attributes.reserve(attributes.size() +
|
||||
math::numeric_cast<std::size_t>(attribute_count));
|
||||
|
||||
for ( GLuint i = 0; i < math::numeric_cast<GLuint>(attribute_count); ++i ) {
|
||||
for ( GLuint i = 0, e = math::numeric_cast<GLuint>(attribute_count); i < e; ++i ) {
|
||||
GLint size = 0;
|
||||
GLenum type = 0;
|
||||
GL_CHECK_CODE(debug, glGetActiveAttrib(
|
||||
|
||||
Reference in New Issue
Block a user