From a75df7bdb21cd949c79631539b4bda119ff5710a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sat, 15 Jul 2023 15:02:28 +0200 Subject: [PATCH] fixes: random generator int range and zero delta time rendering bugs --- WickedEngine/wiRandom.h | 8 ++++---- WickedEngine/wiRenderer.cpp | 10 +++++----- WickedEngine/wiScene.cpp | 4 ++-- WickedEngine/wiTerrain.cpp | 2 +- WickedEngine/wiVersion.cpp | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/WickedEngine/wiRandom.h b/WickedEngine/wiRandom.h index d3728929c..bebada47b 100644 --- a/WickedEngine/wiRandom.h +++ b/WickedEngine/wiRandom.h @@ -28,12 +28,12 @@ namespace wi::random // gives an uint64 in range [min, max] constexpr uint64_t next_uint(uint64_t min, uint64_t max) { - return min + (next_uint() % (max - min)); + return min + (next_uint() % (max - min + 1ull)); } // gives an uint32 in range [min, max] constexpr uint32_t next_uint(uint32_t min, uint32_t max) { - return min + (uint32_t(next_uint()) % (max - min)); + return min + (uint32_t(next_uint()) % (max - min + 1u)); } // gives an int64 in range [-INT64_MAX, INT64_MAX] @@ -45,12 +45,12 @@ namespace wi::random // gives an int64 in range [min, max] constexpr int64_t next_int(int64_t min, int64_t max) { - return min + int64_t(next_uint() % (max - min)); // we roll next_uint here to avoid negative value messing with range mapping + return min + int64_t(next_uint() % (max - min + 1ll)); // we roll next_uint here to avoid negative value messing with range mapping } // gives an int32 in range [min, max] constexpr int32_t next_int(int32_t min, int32_t max) { - return min + int32_t(next_uint() % (max - min)); // we roll next_uint here to avoid negative value messing with range mapping + return min + int32_t(next_uint() % (max - min + 1)); // we roll next_uint here to avoid negative value messing with range mapping } // gives a float in range [0, 1] diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 7eeb18855..c6aa5c68d 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -4126,8 +4126,8 @@ void UpdateRenderData( wi::profiler::EndRange(range); } - device->EventBegin("Skinning and Morph", cmd); { + device->EventBegin("Skinning and Morph", cmd); auto range = wi::profiler::BeginRangeGPU("Skinning and Morph", cmd); int descriptor_skinningbuffer = -1; if (vis.scene->skinningBuffer.IsValid()) @@ -4145,7 +4145,7 @@ void UpdateRenderData( Entity entity = vis.scene->meshes.GetEntity(i); const MeshComponent& mesh = vis.scene->meshes[i]; - if (mesh.IsSkinned() || mesh.active_morph_count > 0) + if ((mesh.IsSkinned() || mesh.active_morph_count > 0) && mesh.streamoutBuffer.IsValid()) { const SoftBodyPhysicsComponent* softbody = vis.scene->softbodies.GetComponent(entity); if (softbody != nullptr && softbody->physicsobject != nullptr) @@ -4193,15 +4193,15 @@ void UpdateRenderData( } wi::profiler::EndRange(range); // Skinning and Morph + device->EventEnd(cmd); // Skinning and Morph } - device->EventEnd(cmd); // Skinning and Morph barrier_stack_flush(cmd); // wind/skinning flush // Hair particle systems GPU simulation: // (This must be non-async too, as prepass will render hairs!) static thread_local wi::vector hair_updates; - if (!vis.visibleHairs.empty() && frameCB.delta_time > 0) + if (!vis.visibleHairs.empty()) { auto range = wi::profiler::BeginRangeGPU("HairParticles - Simulate", cmd); for (uint32_t hairIndex : vis.visibleHairs) @@ -4440,7 +4440,7 @@ void UpdateRenderDataAsync( } // GPU Particle systems simulation/sorting/culling: - if (!vis.visibleEmitters.empty() && frameCB.delta_time > 0) + if (!vis.visibleEmitters.empty()) { auto range = wi::profiler::BeginRangeGPU("EmittedParticles - Simulate", cmd); for (uint32_t emitterIndex : vis.visibleEmitters) diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index 029e61fbd..8bb659e4a 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -3191,7 +3191,7 @@ namespace wi::scene ShaderTransform& shadertransform = armature.boneData[boneIndex]; shadertransform.Create(mat); - if (dt > 0) + if (skinningDataMapped != nullptr) { std::memcpy(gpu_dst + boneIndex, &shadertransform, sizeof(shadertransform)); } @@ -3233,7 +3233,7 @@ namespace wi::scene mesh._flags &= ~MeshComponent::TLAS_FORCE_DOUBLE_SIDED; mesh.active_morph_count = 0; - if (dt > 0 && !mesh.morph_targets.empty()) + if (skinningDataMapped != nullptr && !mesh.morph_targets.empty()) { mesh.morphGPUOffset = skinningAllocator.fetch_add(uint32_t(mesh.morph_targets.size() * sizeof(MorphTargetGPU))); MorphTargetGPU* gpu_dst = (MorphTargetGPU*)((uint8_t*)skinningDataMapped + mesh.morphGPUOffset); diff --git a/WickedEngine/wiTerrain.cpp b/WickedEngine/wiTerrain.cpp index fd8422ba3..c046bd791 100644 --- a/WickedEngine/wiTerrain.cpp +++ b/WickedEngine/wiTerrain.cpp @@ -928,7 +928,7 @@ namespace wi::terrain ); for (int i = 0; i < gen_count; ++i) { - uint32_t tri = rng.next_uint(0, chunk_indices.lods[0].indexCount / 3 - 1); // random triangle on the chunk mesh + uint32_t tri = rng.next_uint(0, chunk_indices.lods[0].indexCount / 3); // random triangle on the chunk mesh uint32_t ind0 = chunk_indices.indices[tri * 3 + 0]; uint32_t ind1 = chunk_indices.indices[tri * 3 + 1]; uint32_t ind2 = chunk_indices.indices[tri * 3 + 2]; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 578185600..df1314a17 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 244; + const int revision = 245; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);