Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-08-27 19:22:15 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-08-27 19:22:15 +0300
commit8ae25c3da21777845ba2fa680ea288b1ff7eb960 (patch)
tree8e0fbcae0878a77c95962a8b4c1435df693275ad
parent8b5ffd9af05515ecb09295e3fc252ab46afa499d (diff)
Fix several bugs
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_shader.cc6
-rw-r--r--source/blender/draw/intern/draw_command.cc4
-rw-r--r--source/blender/draw/intern/draw_command.hh2
-rw-r--r--source/blender/draw/intern/draw_manager.cc2
-rw-r--r--source/blender/draw/intern/draw_pass.hh12
-rw-r--r--source/blender/draw/intern/draw_shader_shared.h4
-rw-r--r--source/blender/draw/intern/draw_view.cc7
-rw-r--r--source/blender/draw/intern/draw_view.hh2
-rw-r--r--source/blender/draw/intern/shaders/draw_object_infos_info.hh9
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