29void gizmos_renderer::draw_grid(uint32_t pass_id,
const camera& cam,
const editing_manager::grid& grid)
31 grid_program_->begin();
33 float grid_height = 0.0f;
34 math::vec4 u_params(grid_height, cam.get_near_clip(), cam.get_far_clip(), grid.opacity);
35 grid_program_->set_uniform(
"u_params", u_params);
38 auto state =
topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ALPHA;
42 state |= BGFX_STATE_DEPTH_TEST_LEQUAL | BGFX_STATE_WRITE_Z;
46 gfx::submit(pass_id, grid_program_->native_handle());
59 const auto& rview = camera_comp.get_render_view();
60 const auto&
camera = camera_comp.get_camera();
63 const auto& obuffer = rview.fbo_get(
"OBUFFER_DEPTH");
64 auto size = obuffer->get_size();
66 bool selection_mask_drawn =
false;
70 selection_mask_drawn = draw_selection_mask_pass(ctx,
camera, selection_mask_);
76 pass.
bind(obuffer.get());
83 draw_selection_gizmos(ctx,
camera, dd);
85 if(selection_mask_drawn)
87 draw_outline_pass(selection_mask_, obuffer, dd);
90 draw_icon_gizmos(ctx, scn,
camera, dd);
94 draw_grid(pass.
id,
camera, em.grid_data);
105 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_wf_wireframe.sc");
106 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_wf_wireframe.sc");
107 wireframe_program_ = std::make_unique<gpu_program>(vs,
fs);
111 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_grid.sc");
112 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_grid.sc");
113 grid_program_ = std::make_unique<gpu_program>(vs,
fs);
117 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_outline_mask.sc");
118 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_mask.sc");
119 outline_mask_program_.program = std::make_unique<gpu_program>(vs,
fs);
120 outline_mask_program_.cache_uniforms();
124 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_outline_mask_skinned.sc");
125 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_mask.sc");
126 outline_mask_program_skinned_.program = std::make_unique<gpu_program>(vs,
fs);
127 outline_mask_program_skinned_.cache_uniforms();
131 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_clip_quad.sc");
132 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_detect.sc");
133 outline_program_.program = std::make_unique<gpu_program>(vs,
fs);
134 outline_program_.cache_uniforms();
144 for(
auto& s : em.get_selections())
150auto gizmos_renderer::draw_selection_mask_pass(
rtti::context& ctx,
151 const camera& camera,
155 const auto& view = camera.
get_view();
159 pass.bind(selection_mask.get());
160 pass.set_view_proj(view, proj);
163 BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH,
168 bool any_drawn =
false;
169 for(
auto& obj : em.get_selections())
171 if(obj.type() == entt::resolve<entt::handle>())
173 auto e = obj.cast<entt::handle>();
178 auto transform_comp =
e.try_get<transform_component>();
184 const auto& world_transform = transform_comp->get_transform_global();
186 if(
auto model_comp =
e.try_get<model_component>())
188 auto& model = model_comp->get_model();
189 if(!model.is_valid())
194 auto lod = model.get_lod(0);
200 const auto& mesh = lod.get();
201 const auto& bounds = mesh->get_bounds();
204 if(!camera.
test_obb(bounds, world_transform))
207 const auto& submesh_transforms = model_comp->get_submesh_transforms();
208 const auto& bone_transforms = model_comp->get_bone_transforms();
209 const auto& skinning_transforms = model_comp->get_skinning_transforms();
211 model::submit_callbacks callbacks;
212 callbacks.setup_begin = [&](
const model::submit_callbacks::params& submit_params)
215 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
218 callbacks.setup_params_per_instance = [&](
const model::submit_callbacks::params& submit_params)
221 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
223 callbacks.setup_params_per_submesh =
224 [&](
const model::submit_callbacks::params& submit_params,
const material& mat)
227 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
228 gfx::submit(pass.id, prog->native_handle(), 0, submit_params.preserve_state);
230 callbacks.setup_end = [&](
const model::submit_callbacks::params& submit_params)
233 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
237 model.submit(world_transform, submesh_transforms, bone_transforms, skinning_transforms, 0, callbacks);
251 auto size = obuffer->get_size();
253 outline_program_.program->begin();
258 float thickness = 3.0f;
264 float outline_color[4] = {1.0f, 0.5f, 0.2f, 1.0f};
271 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ALPHA);
275 outline_program_.program->end();
282 if(!em.show_icon_gizmos)
285 hpp::for_each_type<camera_component, light_component, reflection_probe_component, audio_source_component>(
288 using type_t =
typename std::decay_t<
decltype(
tag)>
::type;
290 scn.registry->view<type_t>().each(
291 [&](
auto e,
auto&& comp)
293 auto entity = scn.create_handle(e);
302 outline_mask_program_ = {};
303 outline_mask_program_skinned_ = {};
304 outline_program_ = {};
305 wireframe_program_.reset();
306 grid_program_.reset();
std::shared_ptr< frame_buffer > ptr
Manages assets, including loading, unloading, and storage.
Class that contains core camera data, used for rendering and other purposes.
Class representing a camera. Contains functionality for manipulating and updating a camera....
auto test_obb(const math::bbox &bounds, const math::transform &t) const -> bool
Tests if the specified OBB is within the frustum.
auto get_projection() const -> const math::transform &
Retrieves the current projection matrix.
auto get_view() const -> const math::transform &
Retrieves the current view matrix.
auto init(rtti::context &ctx) -> bool
void on_frame_render(rtti::context &ctx, scene &scn, entt::handle camera_entity)
auto deinit(rtti::context &ctx) -> bool
void submit(view_id _id, program_handle _handle, int32_t _depth, bool _preserveState)
void set_view_clear(view_id _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
void set_state(uint64_t _state, uint32_t _rgba)
void set_uniform(uniform_handle _handle, const void *_value, uint16_t _num)
auto clip_quad(float depth, float width, float height) -> uint64_t
void set_texture(uint8_t _stage, uniform_handle _sampler, texture_handle _handle, uint32_t _flags)
void draw_gizmo_var(rtti::context &ctx, entt::meta_any &var, const camera &cam, gfx::dd_raii &dd)
void draw_gizmo_billboard_var(rtti::context &ctx, entt::meta_any &var, const camera &cam, gfx::dd_raii &dd)
void set_view_proj(const float *v, const float *p)
void bind(const frame_buffer *fb=nullptr) const
static void draw_system_gizmos(rtti::context &ctx, const camera &cam, gfx::dd_raii &dd)
Represents a scene in the ACE framework, managing entities and their relationships.