mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
normalized camera viewport property
This commit is contained in:
@@ -21,19 +21,19 @@ namespace e2d
|
||||
camera() = default;
|
||||
|
||||
camera& depth(i32 value) noexcept;
|
||||
camera& viewport(const b2u& value) noexcept;
|
||||
camera& viewport(const b2f& value) noexcept;
|
||||
camera& projection(const m4f& value) noexcept;
|
||||
camera& target(const render_target_ptr& value) noexcept;
|
||||
camera& background(const color& value) noexcept;
|
||||
|
||||
[[nodiscard]] i32 depth() const noexcept;
|
||||
[[nodiscard]] const b2u& viewport() const noexcept;
|
||||
[[nodiscard]] const b2f& viewport() const noexcept;
|
||||
[[nodiscard]] const m4f& projection() const noexcept;
|
||||
[[nodiscard]] const render_target_ptr& target() const noexcept;
|
||||
[[nodiscard]] const color& background() const noexcept;
|
||||
private:
|
||||
i32 depth_ = 0;
|
||||
b2u viewport_ = b2u::zero();
|
||||
b2f viewport_ = b2f::unit();
|
||||
m4f projection_ = m4f::identity();
|
||||
render_target_ptr target_ = nullptr;
|
||||
color background_ = color::clear();
|
||||
@@ -89,7 +89,7 @@ namespace e2d
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline camera& camera::viewport(const b2u& value) noexcept {
|
||||
inline camera& camera::viewport(const b2f& value) noexcept {
|
||||
viewport_ = value;
|
||||
return *this;
|
||||
}
|
||||
@@ -113,7 +113,7 @@ namespace e2d
|
||||
return depth_;
|
||||
}
|
||||
|
||||
inline const b2u& camera::viewport() const noexcept {
|
||||
inline const b2f& camera::viewport() const noexcept {
|
||||
return viewport_;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,57 @@
|
||||
"scene" : {}
|
||||
},
|
||||
"children" : [{
|
||||
"prototype" : "../prefabs/camera_prefab.json"
|
||||
"prototype" : "../prefabs/camera_prefab.json",
|
||||
"components" : {
|
||||
"actor" : {
|
||||
"rotation" : 0.5
|
||||
},
|
||||
"camera" : {
|
||||
"viewport" : [0.0,0.0,0.5,0.5]
|
||||
},
|
||||
"named" : {
|
||||
"name" : "camera(1)"
|
||||
}
|
||||
}
|
||||
},{
|
||||
"prototype" : "../prefabs/camera_prefab.json",
|
||||
"components" : {
|
||||
"actor" : {
|
||||
"rotation" : -0.5
|
||||
},
|
||||
"camera" : {
|
||||
"viewport" : [0.5,0.0,0.5,0.5]
|
||||
},
|
||||
"named" : {
|
||||
"name" : "camera(2)"
|
||||
}
|
||||
}
|
||||
},{
|
||||
"prototype" : "../prefabs/camera_prefab.json",
|
||||
"components" : {
|
||||
"actor" : {
|
||||
"rotation" : 0.5
|
||||
},
|
||||
"camera" : {
|
||||
"viewport" : [0.5,0.5,0.5,0.5]
|
||||
},
|
||||
"named" : {
|
||||
"name" : "camera(3)"
|
||||
}
|
||||
}
|
||||
},{
|
||||
"prototype" : "../prefabs/camera_prefab.json",
|
||||
"components" : {
|
||||
"actor" : {
|
||||
"rotation" : -0.5
|
||||
},
|
||||
"camera" : {
|
||||
"viewport" : [0.0,0.5,0.5,0.5]
|
||||
},
|
||||
"named" : {
|
||||
"name" : "camera(4)"
|
||||
}
|
||||
}
|
||||
},{
|
||||
"prototype" : "../prefabs/gnome_prefab.json",
|
||||
"components" : {
|
||||
|
||||
@@ -60,10 +60,10 @@ namespace e2d::bindings::high
|
||||
|
||||
"viewport", sol::property(
|
||||
[](const gcomponent<camera>& c) -> b2f {
|
||||
return c->viewport().cast_to<f32>();
|
||||
return c->viewport();
|
||||
},
|
||||
[](gcomponent<camera>& c, const b2f& v){
|
||||
c->viewport(v.cast_to<u32>());
|
||||
c->viewport(v);
|
||||
}),
|
||||
|
||||
"projection", sol::property(
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace e2d
|
||||
const fill_context& ctx) const
|
||||
{
|
||||
if ( ctx.root.HasMember("depth") ) {
|
||||
auto depth = component.depth();
|
||||
i32 depth = component.depth();
|
||||
if ( !json_utils::try_parse_value(ctx.root["depth"], depth) ) {
|
||||
the<debug>().error("CAMERA: Incorrect formatting of 'depth' property");
|
||||
return false;
|
||||
@@ -34,7 +34,7 @@ namespace e2d
|
||||
}
|
||||
|
||||
if ( ctx.root.HasMember("viewport") ) {
|
||||
auto viewport = component.viewport();
|
||||
b2f viewport = component.viewport();
|
||||
if ( !json_utils::try_parse_value(ctx.root["viewport"], viewport) ) {
|
||||
the<debug>().error("CAMERA: Incorrect formatting of 'viewport' property");
|
||||
return false;
|
||||
@@ -43,7 +43,7 @@ namespace e2d
|
||||
}
|
||||
|
||||
if ( ctx.root.HasMember("projection") ) {
|
||||
auto projection = component.projection();
|
||||
m4f projection = component.projection();
|
||||
if ( !json_utils::try_parse_value(ctx.root["projection"], projection) ) {
|
||||
the<debug>().error("CAMERA: Incorrect formatting of 'projection' property");
|
||||
return false;
|
||||
@@ -56,7 +56,7 @@ namespace e2d
|
||||
}
|
||||
|
||||
if ( ctx.root.HasMember("background") ) {
|
||||
auto background = component.background();
|
||||
color background = component.background();
|
||||
if ( !json_utils::try_parse_value(ctx.root["background"], background) ) {
|
||||
the<debug>().error("CAMERA: Incorrect formatting of 'background' property");
|
||||
return false;
|
||||
@@ -123,7 +123,22 @@ namespace e2d
|
||||
c->depth(depth);
|
||||
}
|
||||
|
||||
///TODO(BlackMat): add 'viewport' inspector
|
||||
if ( ImGui::TreeNode("viewport") ) {
|
||||
E2D_DEFER([](){ ImGui::TreePop(); });
|
||||
|
||||
if ( b2f viewport = c->viewport();
|
||||
ImGui::DragFloat2("position", viewport.position.data(), 0.01f) )
|
||||
{
|
||||
c->viewport(viewport);
|
||||
}
|
||||
|
||||
if ( b2f viewport = c->viewport();
|
||||
ImGui::DragFloat2("size", viewport.size.data(), 0.01f) )
|
||||
{
|
||||
c->viewport(viewport);
|
||||
}
|
||||
}
|
||||
|
||||
///TODO(BlackMat): add 'projection' inspector
|
||||
///TODO(BlackMat): add 'target' inspector
|
||||
|
||||
|
||||
@@ -13,6 +13,15 @@ namespace
|
||||
{
|
||||
using namespace e2d;
|
||||
|
||||
void clear_framebuffer(render& render, window& window) {
|
||||
render.execute(render::command_block<3>()
|
||||
.add_command(render::target_command())
|
||||
.add_command(render::viewport_command(
|
||||
window.framebuffer_size().cast_to<i32>()))
|
||||
.add_command(render::clear_command()
|
||||
.color_value(color::black())));
|
||||
}
|
||||
|
||||
template < typename Event >
|
||||
void for_all_cameras(ecs::registry& owner) {
|
||||
const auto comp = [](const auto& l, const auto& r) noexcept {
|
||||
@@ -42,8 +51,10 @@ namespace e2d
|
||||
|
||||
class frame_system::internal_state final : private noncopyable {
|
||||
public:
|
||||
internal_state(engine& e)
|
||||
: engine_(e) {}
|
||||
internal_state(engine& e, render& r, window& w)
|
||||
: engine_(e)
|
||||
, render_(r)
|
||||
, window_(w) {}
|
||||
~internal_state() noexcept = default;
|
||||
|
||||
void process_frame_update(ecs::registry& owner) {
|
||||
@@ -67,6 +78,8 @@ namespace e2d
|
||||
}
|
||||
|
||||
void process_frame_render(ecs::registry& owner) {
|
||||
clear_framebuffer(render_, window_);
|
||||
|
||||
{
|
||||
E2D_PROFILER_SCOPE("ecs.pre_render");
|
||||
for_all_cameras<systems::pre_render_event>(owner);
|
||||
@@ -84,6 +97,8 @@ namespace e2d
|
||||
}
|
||||
private:
|
||||
engine& engine_;
|
||||
render& render_;
|
||||
window& window_;
|
||||
};
|
||||
|
||||
//
|
||||
@@ -91,7 +106,7 @@ namespace e2d
|
||||
//
|
||||
|
||||
frame_system::frame_system()
|
||||
: state_(new internal_state(the<engine>())) {}
|
||||
: state_(new internal_state(the<engine>(), the<render>(), the<window>())) {}
|
||||
frame_system::~frame_system() noexcept = default;
|
||||
|
||||
void frame_system::process(
|
||||
|
||||
@@ -69,9 +69,20 @@ namespace e2d::render_system_impl
|
||||
.property(matrix_vp_property_hash, m_v * m_p)
|
||||
.property(time_property_hash, engine.time());
|
||||
|
||||
const v2u target_size = cam.target()
|
||||
? cam.target()->size()
|
||||
: window.framebuffer_size();
|
||||
|
||||
const b2f target_viewport = make_rect(
|
||||
cam.viewport().position * target_size.cast_to<f32>(),
|
||||
cam.viewport().size * target_size.cast_to<f32>());
|
||||
|
||||
render.execute(render::command_block<3>()
|
||||
.add_command(render::target_command(cam.target()))
|
||||
.add_command(render::viewport_command(cam.viewport()))
|
||||
.add_command(render::target_command(
|
||||
cam.target()))
|
||||
.add_command(render::viewport_command(
|
||||
target_viewport.cast_to<i32>(),
|
||||
target_viewport.cast_to<i32>()))
|
||||
.add_command(render::clear_command()
|
||||
.color_value(cam.background())));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user