32void gizmos_renderer::draw_grid(uint32_t pass_id,
const camera& cam,
const editing_manager::grid& grid)
34 grid_program_->begin();
36 float grid_height = 0.0f;
37 math::vec4 u_params(grid_height, cam.get_near_clip(), cam.get_far_clip(), grid.opacity);
38 grid_program_->set_uniform(
"u_params", u_params);
41 auto state =
topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ALPHA;
45 state |= BGFX_STATE_DEPTH_TEST_LEQUAL | BGFX_STATE_WRITE_Z;
49 gfx::submit(pass_id, grid_program_->native_handle());
62 const auto& rview = camera_comp.get_render_view();
63 const auto&
camera = camera_comp.get_camera();
66 const auto& obuffer = rview.fbo_get(
"OBUFFER_DEPTH");
67 auto size = obuffer->get_size();
69 bool selection_mask_drawn =
false;
71 if(em.gizmos.show_selection_outline)
75 selection_mask_drawn = draw_selection_mask_pass(ctx,
camera, selection_mask_);
81 pass.
bind(obuffer.get());
88 draw_selection_gizmos(ctx,
camera, dd, dd_2d);
90 if(selection_mask_drawn)
92 draw_outline_pass(selection_mask_, obuffer, dd);
95 draw_icon_gizmos(ctx, scn,
camera, dd);
99 draw_grid(pass.
id,
camera, em.grid_data);
103 if(em.gizmos.show_selection_wireframe)
107 draw_selection_wireframe_pass(ctx,
camera, obuffer);
117 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_wf_wireframe.sc");
118 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_wf_wireframe.sc");
119 wireframe_program_.program = std::make_unique<gpu_program>(vs,
fs);
120 wireframe_program_.cache_uniforms();
124 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_wf_wireframe_skinned.sc");
125 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_wf_wireframe.sc");
126 wireframe_program_skinned_.program = std::make_unique<gpu_program>(vs,
fs);
127 wireframe_program_skinned_.cache_uniforms();
131 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_grid.sc");
132 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_grid.sc");
133 grid_program_ = std::make_unique<gpu_program>(vs,
fs);
137 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_outline_mask.sc");
138 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_mask.sc");
139 outline_mask_program_.program = std::make_unique<gpu_program>(vs,
fs);
140 outline_mask_program_.cache_uniforms();
144 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_outline_mask_skinned.sc");
145 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_mask.sc");
146 outline_mask_program_skinned_.program = std::make_unique<gpu_program>(vs,
fs);
147 outline_mask_program_skinned_.cache_uniforms();
151 auto vs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/vs_clip_quad.sc");
152 auto fs = am.get_asset<
gfx::shader>(
"editor:/data/shaders/fs_outline_detect.sc");
153 outline_program_.program = std::make_unique<gpu_program>(vs,
fs);
154 outline_program_.cache_uniforms();
164 for(
auto& s : em.get_selections())
170auto gizmos_renderer::draw_selection_mask_pass(
rtti::context& ctx,
171 const camera& camera,
179 pass.bind(selection_mask.get());
180 pass.set_view_proj(
view, proj);
183 BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH,
188 bool any_drawn =
false;
189 for(
auto& obj : em.get_selections())
191 if(obj.type() == entt::resolve<entt::handle>())
193 auto e = obj.cast<entt::handle>();
198 auto transform_comp =
e.try_get<transform_component>();
204 const auto& world_transform = transform_comp->get_transform_global();
206 if(
auto model_comp =
e.try_get<model_component>())
208 auto& model = model_comp->get_model();
209 if(!model.is_valid())
216 auto lod = model.get_lod(current_lod_data.current_lod_index);
224 if(!camera.
get_frustum().test_aabb(model_comp->get_world_bounds()))
229 const auto& submesh_transforms = model_comp->get_submesh_transforms();
230 const auto& bone_transforms = model_comp->get_bone_transforms();
231 const auto& skinning_transforms = model_comp->get_skinning_transforms();
233 model::submit_callbacks callbacks;
234 callbacks.setup_begin = [&](
const model::submit_callbacks::params& submit_params)
237 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
240 callbacks.setup_params_per_instance = [&](
const model::submit_callbacks::params& submit_params)
243 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
245 callbacks.setup_params_per_submesh =
246 [&](
const model::submit_callbacks::params& submit_params,
const material& mat)
249 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
250 gfx::submit(pass.id, prog->native_handle(), 0, submit_params.preserve_state);
252 callbacks.setup_end = [&](
const model::submit_callbacks::params& submit_params)
255 submit_params.skinned ? outline_mask_program_skinned_.program : outline_mask_program_.program;
259 model.submit(world_transform, submesh_transforms, bone_transforms, skinning_transforms, current_lod_data.current_lod_index, callbacks);
269void gizmos_renderer::draw_selection_wireframe_pass(
rtti::context& ctx,
270 const camera& camera,
273 const bool non_skinned_ready = wireframe_program_.program && wireframe_program_.program->is_valid();
274 const bool skinned_ready = wireframe_program_skinned_.program && wireframe_program_skinned_.program->is_valid();
275 if(!non_skinned_ready && !skinned_ready)
281 const auto&
view = camera.get_view();
282 const auto& proj = camera.get_projection();
285 pass.bind(obuffer.get());
286 pass.set_view_proj(
view, proj);
290 const uint64_t state = 0
291 | BGFX_STATE_WRITE_RGB
293 | BGFX_STATE_DEPTH_TEST_LEQUAL
294 | BGFX_STATE_CULL_CCW
296 | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA);
298 for(
const auto& obj : em.get_selections())
300 if(obj.type() != entt::resolve<entt::handle>())
305 auto e = obj.cast<entt::handle>();
311 auto* transform_comp =
e.try_get<transform_component>();
312 auto* model_comp =
e.try_get<model_component>();
313 if(!transform_comp || !model_comp)
318 auto& mdl = model_comp->get_model();
325 auto lod = mdl.get_lod(lod_data.current_lod_index);
331 const auto& mesh_ptr = lod.get();
337 const auto& world_transform = transform_comp->get_transform_global();
339 if(!camera.get_frustum().test_aabb(model_comp->get_world_bounds()))
344 const auto& submesh_transforms = model_comp->get_submesh_transforms();
345 const auto& skinning_transforms = model_comp->get_skinning_transforms();
356 std::array<math::vec4, 3> params;
357 params[0] = em.gizmos.selection_wireframe_color;
358 params[1] = math::vec4(em.gizmos.selection_wireframe_thickness, 0.0f, 0.0f, 0.0f);
359 params[2] = math::vec4(0.0f, 0.0f, 0.0f, 0.0f);
361 model::submit_vertex_pulling_callbacks callbacks;
363 callbacks.setup_begin = [&](
const model::submit_vertex_pulling_callbacks::params& info)
365 auto& prog = info.skinned ? wireframe_program_skinned_.program : wireframe_program_.program;
372 callbacks.setup_params_per_instance = [&](
const model::submit_vertex_pulling_callbacks::params& info)
374 params[1].y =
static_cast<float>(info.vertex_stride_floats);
375 params[1].z =
static_cast<float>(info.position_offset_floats);
378 params[2].x =
static_cast<float>(info.weight_offset_floats);
379 params[2].y =
static_cast<float>(info.indices_offset_floats);
383 callbacks.setup_params_per_submesh = [&](
const model::submit_vertex_pulling_callbacks::params& info)
385 auto& wf_prog = info.skinned ? wireframe_program_skinned_ : wireframe_program_;
386 params[1].w =
static_cast<float>(info.index_start);
392 gfx::submit(pass.id, wf_prog.program->native_handle());
395 callbacks.setup_end = [&](
const model::submit_vertex_pulling_callbacks::params& info)
397 auto& prog = info.skinned ? wireframe_program_skinned_.program : wireframe_program_.program;
404 mdl.submit_for_vertex_pulling(world_transform.get_matrix(),
407 lod_data.current_lod_index,
416 auto size = obuffer->get_size();
418 outline_program_.program->begin();
423 float thickness = 3.0f;
429 float outline_color[4] = {1.0f, 0.5f, 0.2f, 1.0f};
436 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ALPHA);
440 outline_program_.program->end();
447 if(!em.show_icon_gizmos)
450 hpp::for_each_type<camera_component, light_component, reflection_probe_component, audio_source_component, particle_emitter_component>(
453 using type_t =
typename std::decay_t<
decltype(
tag)>
::type;
455 scn.registry->view<type_t>().each(
456 [&](
auto e,
auto&& comp)
458 auto entity = scn.create_handle(e);
467 outline_mask_program_ = {};
468 outline_mask_program_skinned_ = {};
469 outline_program_ = {};
470 wireframe_program_ = {};
471 wireframe_program_skinned_ = {};
472 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 get_projection() const -> const math::transform &
Retrieves the current projection matrix.
auto get_view() const -> const math::transform &
Retrieves the current view matrix.
auto get_frustum() const -> const math::frustum &
Retrieves the current camera object frustum.
void on_frame_render(rtti::context &ctx, scene &scn, entt::handle camera_entity, dd_2d_raii &dd_2d)
auto init(rtti::context &ctx) -> bool
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)
void set_vertex_count(uint32_t _numVertices)
uint32_t get_render_frame()
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, dd_2d_raii &dd_2d)
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.