Overlay-Next: Initial implementation #107045
|
@ -36,7 +36,7 @@ template<typename SelectEngineT> class Prepass {
|
|||
init_pass(prepass_in_front_ps_);
|
||||
}
|
||||
|
||||
void object_sync(Manager &manager, const ObjectRef &ob_ref, ResourcesT & /*res*/)
|
||||
void object_sync(Manager &manager, const ObjectRef &ob_ref, ResourcesT &res)
|
||||
{
|
||||
PassMain &pass = (ob_ref.object->dtx & OB_DRAW_IN_FRONT) != 0 ? prepass_in_front_ps_ :
|
||||
prepass_ps_;
|
||||
|
@ -46,11 +46,7 @@ template<typename SelectEngineT> class Prepass {
|
|||
GPUBatch *geom = DRW_cache_object_surface_get(ob_ref.object);
|
||||
if (geom) {
|
||||
ResourceHandle res_handle = manager.resource_handle(ob_ref);
|
||||
pass.draw(geom, res_handle);
|
||||
|
||||
/* TODO */
|
||||
// const SelectID radius_id = res.select_id(ob_ref);
|
||||
// pass.draw(geom, res_handle, radius_id.value);
|
||||
pass.draw(geom, res_handle, res.select_id(ob_ref).value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
|
||||
#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(select_lib.glsl)
|
||||
|
||||
/* Sphere radius */
|
||||
const float rad = 0.05;
|
||||
|
||||
void main()
|
||||
{
|
||||
select_id_set(in_select_buf[gl_InstanceID]);
|
||||
|
||||
vec4 bone_color, state_color;
|
||||
mat4 model_mat = extract_matrix_packed_data(inst_obmat, state_color, bone_color);
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
|
||||
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(select_lib.glsl)
|
||||
|
||||
void main()
|
||||
{
|
||||
lineOutput = pack_line_data(gl_FragCoord.xy, edgeStart, edgePos);
|
||||
fragColor = vec4(finalColor.rgb, finalColor.a * alpha);
|
||||
select_id_output(select_id);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ void main()
|
|||
{
|
||||
GPU_INTEL_VERTEX_SHADER_WORKAROUND
|
||||
|
||||
select_id_set(in_select_buf[resource_id]);
|
||||
select_id_set(drw_CustomID);
|
||||
|
||||
vec3 world_pos = point_object_to_world(pos);
|
||||
gl_Position = point_world_to_ndc(world_pos);
|
||||
|
|
|
@ -25,22 +25,18 @@ struct EngineObject {
|
|||
/* Add type safety to selection ID. Only the select engine should provide them. */
|
||||
struct ID {
|
||||
uint32_t value;
|
||||
|
||||
friend constexpr bool operator==(ID a, ID b)
|
||||
{
|
||||
return a.value == b.value;
|
||||
}
|
||||
|
||||
uint64_t hash() const
|
||||
{
|
||||
return BLI_ghashutil_uinthash(value);
|
||||
}
|
||||
};
|
||||
|
||||
struct SelectShader {
|
||||
static void patch(gpu::shader::ShaderCreateInfo &info)
|
||||
{
|
||||
info.define("SELECT_UNORDERED");
|
||||
/* Replace additional info. */
|
||||
for (StringRefNull &str : info.additional_infos_) {
|
||||
if (str == "draw_modelmat_new") {
|
||||
str = "draw_modelmat_new_with_custom_id";
|
||||
}
|
||||
}
|
||||
info.additional_info("select_id_patch");
|
||||
};
|
||||
};
|
||||
|
@ -100,11 +96,8 @@ struct EngineObject {
|
|||
void begin_sync()
|
||||
{
|
||||
select_id_map.clear();
|
||||
/* Index 0 is the invalid selection ID. */
|
||||
select_id_map.append(uint(-1));
|
||||
#ifdef DEBUG
|
||||
map_names.clear();
|
||||
map_names.append("Invalid Index");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -115,6 +108,7 @@ struct EngineObject {
|
|||
|
||||
void select_bind(PassMain &pass)
|
||||
{
|
||||
pass.use_custom_ids = true;
|
||||
/* IMPORTANT: This binds a dummy buffer `in_select_buf` but it is not supposed to be used. */
|
||||
pass.bind_ssbo(SELECT_ID_IN, &dummy_select_buf);
|
||||
pass.bind_ssbo(SELECT_ID_OUT, &select_output_buf);
|
||||
|
@ -138,7 +132,8 @@ struct EngineObject {
|
|||
uint32_t word = select_output_buf[i];
|
||||
for (auto bit : IndexRange(32)) {
|
||||
if ((word & 1) != 0) {
|
||||
std::cout << map_names[i * 32 + bit] << std::endl;
|
||||
uint index = i * 32 + bit;
|
||||
std::cout << index << map_names[index] << std::endl;
|
||||
}
|
||||
word >>= 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue