diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-08-27 19:22:15 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-08-27 19:22:15 +0300 |
commit | 8ae25c3da21777845ba2fa680ea288b1ff7eb960 (patch) | |
tree | 8e0fbcae0878a77c95962a8b4c1435df693275ad | |
parent | 8b5ffd9af05515ecb09295e3fc252ab46afa499d (diff) |
Fix several bugs
-rw-r--r-- | source/blender/draw/engines/eevee_next/eevee_shader.cc | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_command.cc | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_command.hh | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.cc | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_pass.hh | 12 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_shader_shared.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_view.cc | 7 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_view.hh | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/shaders/draw_object_infos_info.hh | 9 |
9 files changed, 34 insertions, 14 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.cc b/source/blender/draw/engines/eevee_next/eevee_shader.cc index d07aabf14b0..01a99daeeab 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader.cc +++ b/source/blender/draw/engines/eevee_next/eevee_shader.cc @@ -180,6 +180,12 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu GPUCodegenOutput &codegen = *codegen_; ShaderCreateInfo &info = *reinterpret_cast<ShaderCreateInfo *>(codegen.create_info); + /* WORKAROUND: Replace by new ob info. */ + int64_t ob_info_index = info.additional_infos_.first_index_of_try("draw_object_infos"); + if (ob_info_index != -1) { + info.additional_infos_[ob_info_index] = "draw_object_infos_new"; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSPARENT)) { info.define("MAT_TRANSPARENT"); } diff --git a/source/blender/draw/intern/draw_command.cc b/source/blender/draw/intern/draw_command.cc index 2cdf12ad06b..a42416a6f8a 100644 --- a/source/blender/draw/intern/draw_command.cc +++ b/source/blender/draw/intern/draw_command.cc @@ -95,12 +95,12 @@ void DrawMulti::execute(RecordingState &state) const /* Draw negatively scaled geometry first. */ if (grp.len - grp.front_facing_len > 0) { - state.front_facing_set(false); + state.front_facing_set(true); GPU_batch_draw_indirect(grp.gpu_batch, indirect_buf, offset); } if (grp.front_facing_len > 0) { - state.front_facing_set(true); + state.front_facing_set(false); GPU_batch_draw_indirect(grp.gpu_batch, indirect_buf, offset + stride); } diff --git a/source/blender/draw/intern/draw_command.hh b/source/blender/draw/intern/draw_command.hh index 54830805706..fc0060c910a 100644 --- a/source/blender/draw/intern/draw_command.hh +++ b/source/blender/draw/intern/draw_command.hh @@ -483,7 +483,7 @@ class DrawMultiBuf { instance_len = instance_len != -1 ? instance_len : 1; /* If there was some state changes since previous call, we have to create another command. */ - if (headers.last().type != Type::DrawMulti) { + if (headers.is_empty() || headers.last().type != Type::DrawMulti) { uint index = commands.append_and_get_index({}); headers.append({Type::DrawMulti, index}); commands[index].draw_multi = {batch, this, (uint)-1, header_id_counter_++}; diff --git a/source/blender/draw/intern/draw_manager.cc b/source/blender/draw/intern/draw_manager.cc index b9a24d5a9fa..82ff05604f0 100644 --- a/source/blender/draw/intern/draw_manager.cc +++ b/source/blender/draw/intern/draw_manager.cc @@ -94,6 +94,7 @@ void Manager::submit(PassSimple &pass, View &view) debug_bind(); command::RecordingState state; + state.inverted_view = view.is_inverted(); pass.draw_commands_buf_.bind(state, pass.headers_, pass.commands_, view.visibility_buf_); @@ -115,6 +116,7 @@ void Manager::submit(PassMain &pass, View &view) view.compute_visibility(bounds_buf, resource_len_); command::RecordingState state; + state.inverted_view = view.is_inverted(); pass.draw_commands_buf_.bind(state, pass.headers_, pass.commands_, view.visibility_buf_); diff --git a/source/blender/draw/intern/draw_pass.hh b/source/blender/draw/intern/draw_pass.hh index a183c223492..513e7580742 100644 --- a/source/blender/draw/intern/draw_pass.hh +++ b/source/blender/draw/intern/draw_pass.hh @@ -68,7 +68,7 @@ template<typename T, int64_t block_size = 16> class SubPassVector { private: - Vector<Vector<T, block_size>, 0> blocks_; + Vector<std::unique_ptr<Vector<T, block_size>>, 0> blocks_; public: void clear() @@ -79,20 +79,20 @@ class SubPassVector { int64_t append_and_get_index(T &&elem) { /* Do not go over the inline size so that existing members never move. */ - if (blocks_.size() == 0 || blocks_.last().size() == block_size) { - blocks_.append({}); + if (blocks_.is_empty() || blocks_.last()->size() == block_size) { + blocks_.append(std::make_unique<Vector<T, block_size>>()); } - return blocks_.last().append_and_get_index(elem) + (blocks_.size() - 1) * block_size; + return blocks_.last()->append_and_get_index(elem) + (blocks_.size() - 1) * block_size; } T &operator[](int64_t index) { - return blocks_[index / block_size][index % block_size]; + return (*blocks_[index / block_size])[index % block_size]; } const T &operator[](int64_t index) const { - return blocks_[index / block_size][index % block_size]; + return (*blocks_[index / block_size])[index % block_size]; } }; diff --git a/source/blender/draw/intern/draw_shader_shared.h b/source/blender/draw/intern/draw_shader_shared.h index c432638e218..267e88f704b 100644 --- a/source/blender/draw/intern/draw_shader_shared.h +++ b/source/blender/draw/intern/draw_shader_shared.h @@ -73,7 +73,9 @@ struct ViewInfos { /* Mouse pixel. */ int2 mouse_pixel; - int2 _pad0; + /** True if facing needs to be inverted. */ + bool1 is_inverted; + int _pad0; }; BLI_STATIC_ASSERT_ALIGN(ViewInfos, 16) diff --git a/source/blender/draw/intern/draw_view.cc b/source/blender/draw/intern/draw_view.cc index 70222342d51..b267ce19866 100644 --- a/source/blender/draw/intern/draw_view.cc +++ b/source/blender/draw/intern/draw_view.cc @@ -25,6 +25,8 @@ void View::sync(const float4x4 &view_mat, const float4x4 &win_mat) /* Should not be used anymore. */ data_.viewcamtexcofac = float4(1.0f, 1.0f, 0.0f, 0.0f); + data_.is_inverted = (is_negative_m4(view_mat.ptr()) == is_negative_m4(win_mat.ptr())); + update_view_vectors(); BoundBox &bound_box = *reinterpret_cast<BoundBox *>(&data_.frustum_corners); @@ -310,4 +312,9 @@ void View::compute_visibility(ObjectBoundsBuf &bounds, uint resource_len) GPU_debug_group_end(); } +bool View::is_inverted() const +{ + return data_.is_inverted; +} + } // namespace blender::draw diff --git a/source/blender/draw/intern/draw_view.hh b/source/blender/draw/intern/draw_view.hh index 19a3a3feab3..9c3b4054dd8 100644 --- a/source/blender/draw/intern/draw_view.hh +++ b/source/blender/draw/intern/draw_view.hh @@ -54,6 +54,8 @@ class View { return data_.winmat[3][3] == 0.0f; } + bool is_inverted() const; + float far_clip() const { if (is_persp()) { diff --git a/source/blender/draw/intern/shaders/draw_object_infos_info.hh b/source/blender/draw/intern/shaders/draw_object_infos_info.hh index de96e86b67a..2ec40ab76e3 100644 --- a/source/blender/draw/intern/shaders/draw_object_infos_info.hh +++ b/source/blender/draw/intern/shaders/draw_object_infos_info.hh @@ -21,7 +21,8 @@ GPU_SHADER_CREATE_INFO(draw_curves_infos) GPU_SHADER_CREATE_INFO(draw_object_infos_new) .typedef_source("draw_shader_shared.h") - .storage_buf(DRW_OBJ_INFOS_SLOT, Qualifier::READ, "ObjectMatrices", "drw_matrix_buf[]") - .define("drw_ModelMatrixInverse", "drw_matrix_buf[drw_ResourceIndex].model") - .define("drw_ModelMatrix", "drw_matrix_buf[drw_ResourceIndex].model_inverse") - .additional_info("draw_resource_id_new");
\ No newline at end of file + .define("OBINFO_LIB") + .define("OrcoTexCoFactors", "(drw_infos[resource_id].orco_mul_bias)") + .define("ObjectInfo", "(drw_infos[resource_id].infos)") + .define("ObjectColor", "(drw_infos[resource_id].color)") + .storage_buf(DRW_OBJ_INFOS_SLOT, Qualifier::READ, "ObjectInfos", "drw_infos[]");
\ No newline at end of file |