From d7518cdd8e9dbe67a2406c818300f69bdf1eb6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Thu, 27 Jun 2024 09:37:40 +0200 Subject: [PATCH] Soft body updates (#869) - vertex radius - detail - multi-selection edit --- .../ScriptingAPI-Documentation.md | 19 +- Content/models/Sponza/sponza.wiscene | Bin 15411325 -> 15857972 bytes Editor/ComponentsWindow.cpp | 433 +++++++++--------- Editor/ContentBrowserWindow.cpp | 32 +- Editor/PaintToolWindow.cpp | 77 +--- Editor/SoftBodyWindow.cpp | 156 ++++++- Editor/SoftBodyWindow.h | 3 + WickedEngine/wiBacklog.cpp | 6 +- WickedEngine/wiBacklog.h | 1 + WickedEngine/wiPhysics_Jolt.cpp | 55 ++- WickedEngine/wiScene.h | 2 +- WickedEngine/wiScene_BindLua.cpp | 55 ++- WickedEngine/wiScene_BindLua.h | 9 + WickedEngine/wiScene_Components.cpp | 43 +- WickedEngine/wiScene_Components.h | 13 + WickedEngine/wiScene_Serializers.cpp | 16 + WickedEngine/wiVersion.cpp | 2 +- 17 files changed, 574 insertions(+), 348 deletions(-) diff --git a/Content/Documentation/ScriptingAPI-Documentation.md b/Content/Documentation/ScriptingAPI-Documentation.md index 32b1f801f..350ce8181 100644 --- a/Content/Documentation/ScriptingAPI-Documentation.md +++ b/Content/Documentation/ScriptingAPI-Documentation.md @@ -138,7 +138,7 @@ You can use the Renderer with the following functions, all of which are in the g - SetShadowPropsCube(int resolution) - SetDebugPartitionTreeEnabled(bool enabled) - SetDebugBonesEnabled(bool enabled) -- SetDebugEittersEnabled(bool enabled) +- SetDebugEmittersEnabled(bool enabled) - SetDebugEnvProbesEnabled(bool enabled) - SetDebugForceFieldsEnabled(bool enabled) - SetDebugCamerasEnabled(bool value) @@ -1201,7 +1201,7 @@ A lua script bound to an entity #### RigidBodyPhysicsComponent Describes a Rigid Body Physics object. - Shape : int -- Mass : float +- Mass : float -- Set mass to 0 to have completely static rigid body (if you want to move it, it's better to use `SetKinematic(true)` as it will be moved continuously with the physics update rate) - Friction : float - Restitution : float - LinearDamping : float @@ -1216,14 +1216,25 @@ Describes a Rigid Body Physics object. - IsDisableDeactivation() : bool return -- Check if the rigidbody is able to deactivate after inactivity - IsKinematic() : bool return -- Check if the rigidbody is movable or just static -- SetDisableDeactivation(bool value = true) -- Sets if the rigidbody is able to deactivate after inactivity -- SetKinematic(bool value = true) -- Sets if the rigidbody is movable or just static +- IsStartDeactivated() : bool return -- Checks whether rigid body is set to be deactivated when added to simulation +- SetDisableDeactivation(bool value) -- Sets if the rigidbody is able to deactivate after inactivity +- SetKinematic(bool value) -- Set the rigid body to be kinematic (which means it is optimized for being moved by the system or user logic, not the physics engine) +- SetStartDeactivated(bool value) -- If true, rigid body will be deactivated when added to the simulation (if it's dynamic, it won't fall) #### SoftBodyPhysicsComponent Describes a Soft Body Physics object. - Mass : float - Friction : float - Restitution : float +- VertexRadius : float -- how much distance vertices keep from other physics bodies + +- SetDetail(float value) -- Set how much detail the soft body simulation has compared to the graphics mesh. Setting this will rebuild the soft body, so individual physics vertex settings will be lost. +- GetDetail() : float +- SetDisableDeactivation(bool value) +- IsDisableDeactivation() : bool +- SetWindEnabled(bool value) +- IsWindEnabled() : bool +- CreateFromMesh(MeshComponent mesh) #### ForceFieldComponent Describes a Force Field effector. diff --git a/Content/models/Sponza/sponza.wiscene b/Content/models/Sponza/sponza.wiscene index 00ff791f19d9c5b9118ce037c39c36bd7c3ad86b..0b6fc40f5b45efaf5722d6b0ab4702109cc48e5e 100644 GIT binary patch delta 101008 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 D*5kpB delta 84215 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.selected.empty()) - return; - Scene& scene = editor->GetCurrentScene(); - Entity entity = editor->translator.selected.back().entity; - if (args.userdata == ADD_SOFTBODY) + wi::scene::Scene& scene = editor->GetCurrentScene(); + wi::vector entities; + for (auto& x : editor->translator.selected) { - // explanation: for softbody, we want to create it for the MeshComponent, if it's also selected together with the object: - ObjectComponent* object = scene.objects.GetComponent(entity); - if (object != nullptr) + Entity entity = x.entity; + if (args.userdata == ADD_SOFTBODY) { - entity = object->meshID; + // explanation: for softbody, we want to create it for the MeshComponent, if it's also selected together with the object: + ObjectComponent* object = scene.objects.GetComponent(entity); + if (object != nullptr) + { + entity = object->meshID; + } } - } - if (entity == INVALID_ENTITY) - { - assert(0); - return; - } + if (entity == INVALID_ENTITY) + continue; - // Can early exit before creating history entry! - switch (args.userdata) - { - case ADD_NAME: - if (scene.names.Contains(entity)) - return; - break; - case ADD_LAYER: - if (scene.layers.Contains(entity)) - return; - break; - case ADD_TRANSFORM: - if (scene.transforms.Contains(entity)) - return; - break; - case ADD_LIGHT: - if (scene.lights.Contains(entity)) - return; - break; - case ADD_MATERIAL: - if (scene.materials.Contains(entity)) - return; - break; - case ADD_SPRING: - if (scene.springs.Contains(entity)) - return; - break; - case ADD_IK: - if (scene.inverse_kinematics.Contains(entity)) - return; - break; - case ADD_SOUND: - if (scene.sounds.Contains(entity)) - return; - break; - case ADD_ENVPROBE: - if (scene.probes.Contains(entity)) - return; - break; - case ADD_EMITTER: - if (scene.emitters.Contains(entity)) - return; - break; - case ADD_HAIR: - if (scene.hairs.Contains(entity)) - return; - break; - case ADD_DECAL: - if (scene.decals.Contains(entity)) - return; - break; - case ADD_WEATHER: - if (scene.weathers.Contains(entity)) - return; - break; - case ADD_FORCE: - if (scene.forces.Contains(entity)) - return; - break; - case ADD_ANIMATION: - if (scene.animations.Contains(entity)) - return; - break; - case ADD_SCRIPT: - if (scene.scripts.Contains(entity)) - return; - break; - case ADD_RIGIDBODY: - if (scene.rigidbodies.Contains(entity)) - return; - break; - case ADD_SOFTBODY: - if (scene.softbodies.Contains(entity)) - return; - break; - case ADD_COLLIDER: - if (scene.colliders.Contains(entity)) - return; - break; - case ADD_HIERARCHY: - if (scene.hierarchy.Contains(entity)) - return; - break; - case ADD_CAMERA: - if (scene.cameras.Contains(entity)) - return; - break; - case ADD_OBJECT: - if (scene.objects.Contains(entity)) - return; - break; - case ADD_VIDEO: - if (scene.videos.Contains(entity)) - return; - break; - case ADD_SPRITE: - if (scene.sprites.Contains(entity)) - return; - break; - case ADD_FONT: - if (scene.fonts.Contains(entity)) - return; - break; - case ADD_VOXELGRID: - if (scene.voxel_grids.Contains(entity)) - return; - break; - default: - return; + // Can early exit before creating history entry! + bool valid = true; + switch (args.userdata) + { + case ADD_NAME: + if (scene.names.Contains(entity)) + valid = false; + break; + case ADD_LAYER: + if (scene.layers.Contains(entity)) + valid = false; + break; + case ADD_TRANSFORM: + if (scene.transforms.Contains(entity)) + valid = false; + break; + case ADD_LIGHT: + if (scene.lights.Contains(entity)) + valid = false; + break; + case ADD_MATERIAL: + if (scene.materials.Contains(entity)) + valid = false; + break; + case ADD_SPRING: + if (scene.springs.Contains(entity)) + valid = false; + break; + case ADD_IK: + if (scene.inverse_kinematics.Contains(entity)) + valid = false; + break; + case ADD_SOUND: + if (scene.sounds.Contains(entity)) + valid = false; + break; + case ADD_ENVPROBE: + if (scene.probes.Contains(entity)) + valid = false; + break; + case ADD_EMITTER: + if (scene.emitters.Contains(entity)) + valid = false; + break; + case ADD_HAIR: + if (scene.hairs.Contains(entity)) + valid = false; + break; + case ADD_DECAL: + if (scene.decals.Contains(entity)) + valid = false; + break; + case ADD_WEATHER: + if (scene.weathers.Contains(entity)) + valid = false; + break; + case ADD_FORCE: + if (scene.forces.Contains(entity)) + valid = false; + break; + case ADD_ANIMATION: + if (scene.animations.Contains(entity)) + valid = false; + break; + case ADD_SCRIPT: + if (scene.scripts.Contains(entity)) + valid = false; + break; + case ADD_RIGIDBODY: + if (scene.rigidbodies.Contains(entity)) + valid = false; + break; + case ADD_SOFTBODY: + if (scene.softbodies.Contains(entity)) + valid = false; + break; + case ADD_COLLIDER: + if (scene.colliders.Contains(entity)) + valid = false; + break; + case ADD_HIERARCHY: + if (scene.hierarchy.Contains(entity)) + valid = false; + break; + case ADD_CAMERA: + if (scene.cameras.Contains(entity)) + valid = false; + break; + case ADD_OBJECT: + if (scene.objects.Contains(entity)) + valid = false; + break; + case ADD_VIDEO: + if (scene.videos.Contains(entity)) + valid = false; + break; + case ADD_SPRITE: + if (scene.sprites.Contains(entity)) + valid = false; + break; + case ADD_FONT: + if (scene.fonts.Contains(entity)) + valid = false; + break; + case ADD_VOXELGRID: + if (scene.voxel_grids.Contains(entity)) + valid = false; + break; + default: + valid = false; + break; + } + + if (valid) + { + entities.push_back(entity); + } } wi::Archive& archive = editor->AdvanceHistory(); archive << EditorComponent::HISTORYOP_COMPONENT_DATA; - editor->RecordEntity(archive, entity); + editor->RecordEntity(archive, entities); - switch (args.userdata) + for (Entity entity : entities) { - case ADD_NAME: - scene.names.Create(entity); - break; - case ADD_LAYER: - scene.layers.Create(entity); - break; - case ADD_TRANSFORM: - scene.transforms.Create(entity); - break; - case ADD_LIGHT: - scene.lights.Create(entity); - break; - case ADD_MATERIAL: - scene.materials.Create(entity); - break; - case ADD_SPRING: - scene.springs.Create(entity); - break; - case ADD_IK: - scene.inverse_kinematics.Create(entity); - break; - case ADD_SOUND: - scene.sounds.Create(entity); - break; - case ADD_ENVPROBE: - scene.probes.Create(entity); - break; - case ADD_EMITTER: - if (!scene.materials.Contains(entity)) + switch (args.userdata) + { + case ADD_NAME: + scene.names.Create(entity); + break; + case ADD_LAYER: + scene.layers.Create(entity); + break; + case ADD_TRANSFORM: + scene.transforms.Create(entity); + break; + case ADD_LIGHT: + scene.lights.Create(entity); + break; + case ADD_MATERIAL: scene.materials.Create(entity); - scene.emitters.Create(entity); - break; - case ADD_HAIR: - if (!scene.materials.Contains(entity)) - scene.materials.Create(entity); - scene.hairs.Create(entity); - break; - case ADD_DECAL: - if (!scene.materials.Contains(entity)) - scene.materials.Create(entity); - scene.decals.Create(entity); - break; - case ADD_WEATHER: - scene.weathers.Create(entity); - break; - case ADD_FORCE: - scene.forces.Create(entity); - break; - case ADD_ANIMATION: - scene.animations.Create(entity); - break; - case ADD_SCRIPT: - scene.scripts.Create(entity); - break; - case ADD_RIGIDBODY: + break; + case ADD_SPRING: + scene.springs.Create(entity); + break; + case ADD_IK: + scene.inverse_kinematics.Create(entity); + break; + case ADD_SOUND: + scene.sounds.Create(entity); + break; + case ADD_ENVPROBE: + scene.probes.Create(entity); + break; + case ADD_EMITTER: + if (!scene.materials.Contains(entity)) + scene.materials.Create(entity); + scene.emitters.Create(entity); + break; + case ADD_HAIR: + if (!scene.materials.Contains(entity)) + scene.materials.Create(entity); + scene.hairs.Create(entity); + break; + case ADD_DECAL: + if (!scene.materials.Contains(entity)) + scene.materials.Create(entity); + scene.decals.Create(entity); + break; + case ADD_WEATHER: + scene.weathers.Create(entity); + break; + case ADD_FORCE: + scene.forces.Create(entity); + break; + case ADD_ANIMATION: + scene.animations.Create(entity); + break; + case ADD_SCRIPT: + scene.scripts.Create(entity); + break; + case ADD_RIGIDBODY: { RigidBodyPhysicsComponent& rigidbody = scene.rigidbodies.Create(entity); - rigidbody.SetKinematic(true); // Set it to kinematic so that it doesn't immediately fall + rigidbody.SetKinematic(true); // Set it to kinematic so that it can be easily placed } break; - case ADD_SOFTBODY: - scene.softbodies.Create(entity); - break; - case ADD_COLLIDER: - scene.colliders.Create(entity); - break; - case ADD_HIERARCHY: - scene.hierarchy.Create(entity); - break; - case ADD_CAMERA: - scene.cameras.Create(entity); - break; - case ADD_OBJECT: - scene.objects.Create(entity); - break; - case ADD_VIDEO: - scene.videos.Create(entity); - break; - case ADD_SPRITE: - scene.sprites.Create(entity); - break; - case ADD_FONT: - scene.fonts.Create(entity); - break; - case ADD_VOXELGRID: - scene.voxel_grids.Create(entity); - break; - default: - break; + case ADD_SOFTBODY: + scene.softbodies.Create(entity); + break; + case ADD_COLLIDER: + scene.colliders.Create(entity); + break; + case ADD_HIERARCHY: + scene.hierarchy.Create(entity); + break; + case ADD_CAMERA: + scene.cameras.Create(entity); + break; + case ADD_OBJECT: + scene.objects.Create(entity); + break; + case ADD_VIDEO: + scene.videos.Create(entity); + break; + case ADD_SPRITE: + scene.sprites.Create(entity); + break; + case ADD_FONT: + scene.fonts.Create(entity); + break; + case ADD_VOXELGRID: + scene.voxel_grids.Create(entity); + break; + default: + break; + } } - editor->RecordEntity(archive, entity); + editor->RecordEntity(archive, entities); RefreshEntityTree(); - }); + }); AddWidget(&newComponentCombo); diff --git a/Editor/ContentBrowserWindow.cpp b/Editor/ContentBrowserWindow.cpp index e59ef5d8b..733058c45 100644 --- a/Editor/ContentBrowserWindow.cpp +++ b/Editor/ContentBrowserWindow.cpp @@ -172,6 +172,22 @@ void ContentBrowserWindow::RefreshContent() current_selection = SELECTION_RECENT; } } + if (wi::helper::DirectoryExists(content_folder + "models")) + { + wi::gui::Button& button = folderButtons[SELECTION_MODELS]; + button.Create("Models"); + button.SetTooltip(content_folder + "models"); + button.SetLocalizationEnabled(false); + button.SetSize(XMFLOAT2(wid, hei)); + button.OnClick([this](wi::gui::EventArgs args) { + SetSelection(SELECTION_MODELS); + }); + AddWidget(&button, wi::gui::Window::AttachmentOptions::NONE); + if (current_selection == SELECTION_COUNT) + { + current_selection = SELECTION_MODELS; + } + } if (wi::helper::DirectoryExists(content_folder + "scripts")) { wi::gui::Button& button = folderButtons[SELECTION_SCRIPTS]; @@ -188,22 +204,6 @@ void ContentBrowserWindow::RefreshContent() current_selection = SELECTION_SCRIPTS; } } - if (wi::helper::DirectoryExists(content_folder + "models")) - { - wi::gui::Button& button = folderButtons[SELECTION_MODELS]; - button.Create("Models"); - button.SetTooltip(content_folder + "models"); - button.SetLocalizationEnabled(false); - button.SetSize(XMFLOAT2(wid, hei)); - button.OnClick([this](wi::gui::EventArgs args) { - SetSelection(SELECTION_MODELS); - }); - AddWidget(&button, wi::gui::Window::AttachmentOptions::NONE); - if (current_selection == SELECTION_COUNT) - { - current_selection = SELECTION_MODELS; - } - } for (size_t i = 0; i < editor->recentFolders.size(); ++i) { diff --git a/Editor/PaintToolWindow.cpp b/Editor/PaintToolWindow.cpp index 8ae84ac06..df6086081 100644 --- a/Editor/PaintToolWindow.cpp +++ b/Editor/PaintToolWindow.cpp @@ -1173,14 +1173,13 @@ void PaintToolWindow::Update(float dt) if (softbody == nullptr || !softbody->HasVertices()) continue; - // Painting: - if (painting) + size_t j = 0; + for (auto& ind : softbody->physicsToGraphicsVertexMapping) { - size_t j = 0; - for (auto& ind : softbody->physicsToGraphicsVertexMapping) - { - XMVECTOR P = softbody->vertex_positions_simulation[ind].LoadPOS(); + XMVECTOR P = softbody->vertex_positions_simulation[ind].LoadPOS(); + if (painting) + { const float dist = wi::math::Distance(P, CENTER); if (dist <= pressure_radius) { @@ -1188,64 +1187,22 @@ void PaintToolWindow::Update(float dt) softbody->weights[j] = (mode == MODE_SOFTBODY_PINNING ? 0.0f : 1.0f); softbody->_flags |= SoftBodyPhysicsComponent::FORCE_RESET; } - j++; } - } - // Visualizing: - const XMMATRIX W = XMLoadFloat4x4(&softbody->worldMatrix); - uint32_t first_subset = 0; - uint32_t last_subset = 0; - mesh->GetLODSubsetRange(0, first_subset, last_subset); - for (uint32_t subsetIndex = first_subset; subsetIndex < last_subset; ++subsetIndex) - { - const MeshComponent::MeshSubset& subset = mesh->subsets[subsetIndex]; - for (size_t j = 0; j < subset.indexCount; j += 3) + wi::renderer::RenderablePoint point; + point.size = 0.01f; + XMStoreFloat3(&point.position, P); + if (softbody->weights[j] == 0) { - const uint32_t graphicsIndex0 = mesh->indices[j + 0]; - const uint32_t graphicsIndex1 = mesh->indices[j + 1]; - const uint32_t graphicsIndex2 = mesh->indices[j + 2]; - const uint32_t physicsIndex0 = softbody->graphicsToPhysicsVertexMapping[graphicsIndex0]; - const uint32_t physicsIndex1 = softbody->graphicsToPhysicsVertexMapping[graphicsIndex1]; - const uint32_t physicsIndex2 = softbody->graphicsToPhysicsVertexMapping[graphicsIndex2]; - const float weight0 = softbody->weights[physicsIndex0]; - const float weight1 = softbody->weights[physicsIndex1]; - const float weight2 = softbody->weights[physicsIndex2]; - wi::renderer::RenderableTriangle tri; - if (softbody->HasVertices()) - { - tri.positionA = softbody->vertex_positions_simulation[graphicsIndex0].GetPOS(); - tri.positionB = softbody->vertex_positions_simulation[graphicsIndex1].GetPOS(); - tri.positionC = softbody->vertex_positions_simulation[graphicsIndex2].GetPOS(); - } - else - { - XMStoreFloat3(&tri.positionA, XMVector3Transform(XMLoadFloat3(&mesh->vertex_positions[graphicsIndex0]), W)); - XMStoreFloat3(&tri.positionB, XMVector3Transform(XMLoadFloat3(&mesh->vertex_positions[graphicsIndex1]), W)); - XMStoreFloat3(&tri.positionC, XMVector3Transform(XMLoadFloat3(&mesh->vertex_positions[graphicsIndex2]), W)); - } - if (weight0 == 0) - tri.colorA = XMFLOAT4(1, 1, 0, 1); - else - tri.colorA = XMFLOAT4(1, 1, 1, 1); - if (weight1 == 0) - tri.colorB = XMFLOAT4(1, 1, 0, 1); - else - tri.colorB = XMFLOAT4(1, 1, 1, 1); - if (weight2 == 0) - tri.colorC = XMFLOAT4(1, 1, 0, 1); - else - tri.colorC = XMFLOAT4(1, 1, 1, 1); - if (wireframe) - { - wi::renderer::DrawTriangle(tri, true); - } - if (weight0 == 0 && weight1 == 0 && weight2 == 0) - { - tri.colorA = tri.colorB = tri.colorC = XMFLOAT4(1, 0, 0, 0.8f); - wi::renderer::DrawTriangle(tri); - } + point.color = XMFLOAT4(1, 0, 0, 1); } + else + { + point.color = XMFLOAT4(0, 1, 0, 1); + } + wi::renderer::DrawPoint(point); + + j++; } } } diff --git a/Editor/SoftBodyWindow.cpp b/Editor/SoftBodyWindow.cpp index e550353c9..941595a45 100644 --- a/Editor/SoftBodyWindow.cpp +++ b/Editor/SoftBodyWindow.cpp @@ -8,9 +8,9 @@ void SoftBodyWindow::Create(EditorComponent* _editor) { editor = _editor; wi::gui::Window::Create(ICON_SOFTBODY " Soft Body Physics", wi::gui::Window::WindowControls::COLLAPSE | wi::gui::Window::WindowControls::CLOSE); - SetSize(XMFLOAT2(580, 200)); + SetSize(XMFLOAT2(580, 260)); - closeButton.SetTooltip("Delete MeshComponent"); + closeButton.SetTooltip("Delete SoftBodyPhysicsComponent"); OnClose([=](wi::gui::EventArgs args) { wi::Archive& archive = editor->AdvanceHistory(); @@ -22,7 +22,7 @@ void SoftBodyWindow::Create(EditorComponent* _editor) editor->RecordEntity(archive, entity); editor->componentsWnd.RefreshEntityTree(); - }); + }); float x = 95; float y = 0; @@ -35,18 +35,57 @@ void SoftBodyWindow::Create(EditorComponent* _editor) infoLabel.SetSize(XMFLOAT2(100, 90)); AddWidget(&infoLabel); + detailSlider.Create(10, 100, 1, 90, "Detail: "); + detailSlider.SetTooltip("Set the detail to keep between simulation and graphics mesh. This will recreate the soft body, vertex changes will be lost.\nLower = less detailed, higher = more detailed."); + detailSlider.SetSize(XMFLOAT2(wid, hei)); + detailSlider.SetPos(XMFLOAT2(x, y)); + detailSlider.OnSlide([&](wi::gui::EventArgs args) { + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) + { + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->SetDetail(args.fValue); + } + } + }); + AddWidget(&detailSlider); + massSlider.Create(0, 10, 1, 100000, "Mass: "); massSlider.SetTooltip("Set the mass amount for the physics engine."); massSlider.SetSize(XMFLOAT2(wid, hei)); massSlider.SetPos(XMFLOAT2(x, y)); massSlider.OnSlide([&](wi::gui::EventArgs args) { - SoftBodyPhysicsComponent* physicscomponent = editor->GetCurrentScene().softbodies.GetComponent(entity); - if (physicscomponent != nullptr) + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) { - physicscomponent->physicsobject = {}; - physicscomponent->mass = args.fValue; + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->physicsobject = {}; + physicscomponent->mass = args.fValue; + } } - }); + }); AddWidget(&massSlider); frictionSlider.Create(0, 1, 0.5f, 100000, "Friction: "); @@ -54,12 +93,25 @@ void SoftBodyWindow::Create(EditorComponent* _editor) frictionSlider.SetSize(XMFLOAT2(wid, hei)); frictionSlider.SetPos(XMFLOAT2(x, y += step)); frictionSlider.OnSlide([&](wi::gui::EventArgs args) { - SoftBodyPhysicsComponent* physicscomponent = editor->GetCurrentScene().softbodies.GetComponent(entity); - if (physicscomponent != nullptr) + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) { - physicscomponent->friction = args.fValue; + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->friction = args.fValue; + } } - }); + }); AddWidget(&frictionSlider); restitutionSlider.Create(0, 1, 0, 100000, "Restitution: "); @@ -67,14 +119,80 @@ void SoftBodyWindow::Create(EditorComponent* _editor) restitutionSlider.SetSize(XMFLOAT2(wid, hei)); restitutionSlider.SetPos(XMFLOAT2(x, y += step)); restitutionSlider.OnSlide([&](wi::gui::EventArgs args) { - SoftBodyPhysicsComponent* physicscomponent = editor->GetCurrentScene().softbodies.GetComponent(entity); - if (physicscomponent != nullptr) + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) { - physicscomponent->restitution = args.fValue; + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->restitution = args.fValue; + } } - }); + }); AddWidget(&restitutionSlider); + vertexRadiusSlider.Create(0, 1, 0, 100000, "Vertex Radius: "); + vertexRadiusSlider.SetTooltip("Set how much distance vertices should keep from other physics bodies."); + vertexRadiusSlider.SetSize(XMFLOAT2(wid, hei)); + vertexRadiusSlider.SetPos(XMFLOAT2(x, y += step)); + vertexRadiusSlider.OnSlide([&](wi::gui::EventArgs args) { + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) + { + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->physicsobject = {}; + physicscomponent->vertex_radius = args.fValue; + } + } + }); + AddWidget(&vertexRadiusSlider); + + windCheckbox.Create("Wind: "); + windCheckbox.SetTooltip("Enable/disable wind force on this soft body."); + windCheckbox.SetSize(XMFLOAT2(hei, hei)); + windCheckbox.SetPos(XMFLOAT2(x, y += step)); + windCheckbox.OnClick([&](wi::gui::EventArgs args) { + wi::scene::Scene& scene = editor->GetCurrentScene(); + for (auto& x : editor->translator.selected) + { + SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(x.entity); + if (physicscomponent == nullptr) + { + // Try also getting it through object's mesh: + ObjectComponent* object = scene.objects.GetComponent(x.entity); + if (object != nullptr) + { + physicscomponent = scene.softbodies.GetComponent(object->meshID); + } + } + if (physicscomponent != nullptr) + { + physicscomponent->SetWindEnabled(args.bValue); + } + } + }); + AddWidget(&windCheckbox); + SetMinimized(true); @@ -92,9 +210,12 @@ void SoftBodyWindow::SetEntity(Entity entity) const SoftBodyPhysicsComponent* physicscomponent = scene.softbodies.GetComponent(entity); if (physicscomponent != nullptr) { + detailSlider.SetValue(physicscomponent->detail); massSlider.SetValue(physicscomponent->mass); frictionSlider.SetValue(physicscomponent->friction); restitutionSlider.SetValue(physicscomponent->restitution); + vertexRadiusSlider.SetValue(physicscomponent->vertex_radius); + windCheckbox.SetCheck(physicscomponent->IsWindEnabled()); } } @@ -136,8 +257,11 @@ void SoftBodyWindow::ResizeLayout() }; add_fullwidth(infoLabel); + add(detailSlider); add(massSlider); add(frictionSlider); add(restitutionSlider); + add(vertexRadiusSlider); + add_right(windCheckbox); } diff --git a/Editor/SoftBodyWindow.h b/Editor/SoftBodyWindow.h index 1e73eb40c..dba11716a 100644 --- a/Editor/SoftBodyWindow.h +++ b/Editor/SoftBodyWindow.h @@ -11,9 +11,12 @@ public: void SetEntity(wi::ecs::Entity entity); wi::gui::Label infoLabel; + wi::gui::Slider detailSlider; wi::gui::Slider massSlider; wi::gui::Slider frictionSlider; wi::gui::Slider restitutionSlider; + wi::gui::Slider vertexRadiusSlider; + wi::gui::CheckBox windCheckbox; void ResizeLayout() override; }; diff --git a/WickedEngine/wiBacklog.cpp b/WickedEngine/wiBacklog.cpp index 6fe0041f8..36bff9080 100644 --- a/WickedEngine/wiBacklog.cpp +++ b/WickedEngine/wiBacklog.cpp @@ -336,7 +336,7 @@ namespace wi::backlog entries.clear(); scroll = 0; } - void post(const std::string& input, LogLevel level) + void post(const char* input, LogLevel level) { if (logLevel > level) { @@ -397,6 +397,10 @@ namespace wi::backlog write_logfile(); // will lock mutex } } + void post(const std::string& input, LogLevel level) + { + post(input.c_str(), level); + } void historyPrev() { diff --git a/WickedEngine/wiBacklog.h b/WickedEngine/wiBacklog.h index 36ec866d8..98ca5c4fc 100644 --- a/WickedEngine/wiBacklog.h +++ b/WickedEngine/wiBacklog.h @@ -33,6 +33,7 @@ namespace wi::backlog std::string getText(); void clear(); + void post(const char* input, LogLevel level = LogLevel::Default); void post(const std::string& input, LogLevel level = LogLevel::Default); void historyPrev(); diff --git a/WickedEngine/wiPhysics_Jolt.cpp b/WickedEngine/wiPhysics_Jolt.cpp index 00be3c5a0..edf4c8692 100644 --- a/WickedEngine/wiPhysics_Jolt.cpp +++ b/WickedEngine/wiPhysics_Jolt.cpp @@ -258,6 +258,7 @@ namespace wi::physics SoftBodySharedSettings shared_settings; Array simulation_normals; + Array position_offsets; ~SoftBody() { @@ -387,8 +388,9 @@ namespace wi::physics if (!shape_result.IsValid()) { - physicscomponent.physicsobject = nullptr; - wi::backlog::post("AddRigidBody failed: shape couldn't be created!", wi::backlog::LogLevel::Error); + char text[1024] = {}; + snprintf(text, arraysize(text), "AddRigidBody failed, shape_result: %s", shape_result.GetError().c_str()); + wi::backlog::post(text, wi::backlog::LogLevel::Error); return; } else @@ -442,8 +444,7 @@ namespace wi::physics physicsobject.bodyID = body_interface.CreateAndAddBody(settings, activation); if (physicsobject.bodyID.IsInvalid()) { - physicscomponent.physicsobject = nullptr; - wi::backlog::post("AddRigidBody failed: body couldn't be created!", wi::backlog::LogLevel::Error); + wi::backlog::post("AddRigidBody failed: body couldn't be created! This could mean that there are too many physics objects.", wi::backlog::LogLevel::Error); return; } @@ -471,6 +472,7 @@ namespace wi::physics PhysicsScene& physics_scene = GetPhysicsScene(scene); physicsobject.shared_settings.SetEmbedded(); + physicsobject.shared_settings.mVertexRadius = physicscomponent.vertex_radius; const XMMATRIX worldMatrix = XMLoadFloat4x4(&physicscomponent.worldMatrix); @@ -508,7 +510,6 @@ namespace wi::physics SoftBodySharedSettings::VertexAttributes vertexAttributes = { 1.0e-5f, 1.0e-5f, 1.0e-5f }; physicsobject.shared_settings.CreateConstraints(&vertexAttributes, 1); - physicsobject.shared_settings.Optimize(); SoftBodyCreationSettings settings(&physicsobject.shared_settings, Vec3::sZero(), Quat::sIdentity(), Layers::MOVING); @@ -525,12 +526,25 @@ namespace wi::physics if (physicsobject.bodyID.IsInvalid()) { - physicscomponent.physicsobject = nullptr; - wi::backlog::post("AddSoftBody failed: body couldn't be created!", wi::backlog::LogLevel::Error); + wi::backlog::post("AddSoftBody failed: body couldn't be created! This could mean that there are too many physics objects.", wi::backlog::LogLevel::Error); return; } physicsobject.simulation_normals.resize(physicsobject.shared_settings.mVertices.size()); + + physicsobject.position_offsets.resize(mesh.vertex_positions.size()); + for (size_t i = 0; i < mesh.vertex_positions.size(); ++i) + { + XMFLOAT3 position = mesh.vertex_positions[i]; + XMVECTOR P = XMLoadFloat3(&position); + P = XMVector3Transform(P, worldMatrix); + XMStoreFloat3(&position, P); + + uint32_t physicsInd = physicscomponent.graphicsToPhysicsVertexMapping[i]; + Float3 physicsPosF3 = physicsobject.shared_settings.mVertices[physicsInd].mPosition; + Vec3 physicsPos(physicsPosF3.x, physicsPosF3.y, physicsPosF3.z); + physicsobject.position_offsets[i] = cast(position) - physicsPos; + } } struct Ragdoll @@ -1188,12 +1202,18 @@ namespace wi::physics if (IsSimulationEnabled()) { + const Vec3 position = cast(transform->GetPosition()); + const Quat rotation = cast(transform->GetRotation()); + + Mat44 m = Mat44::sTranslation(position) * Mat44::sRotation(rotation); + m = m * physicsobject.additionalTransform; + if (currentMotionType == EMotionType::Kinematic) { body_interface.MoveKinematic( physicsobject.bodyID, - cast(transform->GetPosition()), - cast(transform->GetRotation()), + m.GetTranslation(), + m.GetQuaternion().Normalized(), physics_scene.GetKinematicDT(scene.dt) ); } @@ -1201,8 +1221,8 @@ namespace wi::physics { body_interface.SetPositionAndRotation( physicsobject.bodyID, - cast(transform->GetPosition()), - cast(transform->GetRotation()), + m.GetTranslation(), + m.GetQuaternion().Normalized(), EActivation::DontActivate ); } @@ -1255,7 +1275,7 @@ namespace wi::physics body_interface.SetFriction(physicsobject.bodyID, physicscomponent.friction); body_interface.SetRestitution(physicsobject.bodyID, physicscomponent.restitution); - if (IsSimulationEnabled()) + if (IsSimulationEnabled() && physicscomponent.IsWindEnabled()) { // Add wind: const Vec3 wind = cast(scene.weather.windDirection); @@ -1384,7 +1404,8 @@ namespace wi::physics wi::jobsystem::Wait(ctx); - //physics_scene.physics_system.OptimizeBroadPhase(); + static wi::jobsystem::context broadphase_optimization_ctx; + wi::jobsystem::Wait(broadphase_optimization_ctx); // Perform internal simulation step: if (IsSimulationEnabled()) @@ -1441,6 +1462,11 @@ namespace wi::physics physics_scene.alpha = physics_scene.accumulator / TIMESTEP; } + broadphase_optimization_ctx.priority = wi::jobsystem::Priority::Streaming; + wi::jobsystem::Execute(broadphase_optimization_ctx, [&](wi::jobsystem::JobArgs args) { + physics_scene.physics_system.OptimizeBroadPhase(); + }); + // Feedback physics objects to system: wi::jobsystem::Dispatch(ctx, (uint32_t)scene.rigidbodies.GetCount(), 64, [&scene, &physics_scene](wi::jobsystem::JobArgs args) { @@ -1522,9 +1548,10 @@ namespace wi::physics // Soft body simulation nodes will update graphics mesh: for (size_t ind = 0; ind < mesh->vertex_positions.size(); ++ind) { + const Vec3& offset = physicsobject.position_offsets[ind]; uint32_t physicsInd = physicscomponent.graphicsToPhysicsVertexMapping[ind]; - const XMFLOAT3 position = cast(soft_vertices[physicsInd].mPosition); + const XMFLOAT3 position = cast(soft_vertices[physicsInd].mPosition + offset); const XMFLOAT3 normal = cast(physicsobject.simulation_normals[physicsInd]); physicscomponent.vertex_positions_simulation[ind].FromFULL(position); diff --git a/WickedEngine/wiScene.h b/WickedEngine/wiScene.h index b498f559e..12c48ae6d 100644 --- a/WickedEngine/wiScene.h +++ b/WickedEngine/wiScene.h @@ -37,7 +37,7 @@ namespace wi::scene wi::ecs::ComponentManager& impostors = componentLibrary.Register("wi::scene::Scene::impostors"); wi::ecs::ComponentManager& objects = componentLibrary.Register("wi::scene::Scene::objects", 3); // version = 3 wi::ecs::ComponentManager& rigidbodies = componentLibrary.Register("wi::scene::Scene::rigidbodies", 3); // version = 3 - wi::ecs::ComponentManager& softbodies = componentLibrary.Register("wi::scene::Scene::softbodies"); + wi::ecs::ComponentManager& softbodies = componentLibrary.Register("wi::scene::Scene::softbodies", 1); // version = 1 wi::ecs::ComponentManager& armatures = componentLibrary.Register("wi::scene::Scene::armatures"); wi::ecs::ComponentManager& lights = componentLibrary.Register("wi::scene::Scene::lights", 2); // version = 2 wi::ecs::ComponentManager& cameras = componentLibrary.Register("wi::scene::Scene::cameras"); diff --git a/WickedEngine/wiScene_BindLua.cpp b/WickedEngine/wiScene_BindLua.cpp index 363d9eda4..58eb02811 100644 --- a/WickedEngine/wiScene_BindLua.cpp +++ b/WickedEngine/wiScene_BindLua.cpp @@ -5675,8 +5675,10 @@ int ScriptComponent_BindLua::Stop(lua_State* L) Luna::FunctionType RigidBodyPhysicsComponent_BindLua::methods[] = { lunamethod(RigidBodyPhysicsComponent_BindLua, IsDisableDeactivation), lunamethod(RigidBodyPhysicsComponent_BindLua, IsKinematic), + lunamethod(RigidBodyPhysicsComponent_BindLua, IsStartDeactivated), lunamethod(RigidBodyPhysicsComponent_BindLua, SetDisableDeactivation), lunamethod(RigidBodyPhysicsComponent_BindLua, SetKinematic), + lunamethod(RigidBodyPhysicsComponent_BindLua, SetStartDeactivated), { NULL, NULL } }; Luna::PropertyType RigidBodyPhysicsComponent_BindLua::properties[] = { @@ -5732,6 +5734,25 @@ int RigidBodyPhysicsComponent_BindLua::SetKinematic(lua_State* L) } return 0; } +int RigidBodyPhysicsComponent_BindLua::IsStartDeactivated(lua_State* L) +{ + wi::lua::SSetBool(L, component->IsStartDeactivated()); + return 1; +} +int RigidBodyPhysicsComponent_BindLua::SetStartDeactivated(lua_State* L) +{ + int argc = wi::lua::SGetArgCount(L); + if (argc > 0) + { + bool value = wi::lua::SGetBool(L, 1); + component->SetStartDeactivated(value); + } + else + { + wi::lua::SError(L, "SetStartDeactivated(bool value) not enough arguments!"); + } + return 0; +} @@ -5740,8 +5761,12 @@ int RigidBodyPhysicsComponent_BindLua::SetKinematic(lua_State* L) Luna::FunctionType SoftBodyPhysicsComponent_BindLua::methods[] = { + lunamethod(SoftBodyPhysicsComponent_BindLua, SetDetail), + lunamethod(SoftBodyPhysicsComponent_BindLua, GetDetail), lunamethod(SoftBodyPhysicsComponent_BindLua, SetDisableDeactivation), lunamethod(SoftBodyPhysicsComponent_BindLua, IsDisableDeactivation), + lunamethod(SoftBodyPhysicsComponent_BindLua, SetWindEnabled), + lunamethod(SoftBodyPhysicsComponent_BindLua, IsWindEnabled), lunamethod(SoftBodyPhysicsComponent_BindLua, CreateFromMesh), { NULL, NULL } }; @@ -5749,9 +5774,21 @@ Luna::PropertyType SoftBodyPhysicsComponent_Bi lunaproperty(SoftBodyPhysicsComponent_BindLua, Mass), lunaproperty(SoftBodyPhysicsComponent_BindLua, Friction), lunaproperty(SoftBodyPhysicsComponent_BindLua, Restitution), + lunaproperty(SoftBodyPhysicsComponent_BindLua, VertexRadius), { NULL, NULL } }; +int SoftBodyPhysicsComponent_BindLua::SetDetail(lua_State* L) +{ + float value = wi::lua::SGetFloat(L, 1); + component->SetDetail(value); + return 0; +} +int SoftBodyPhysicsComponent_BindLua::GetDetail(lua_State* L) +{ + wi::lua::SSetFloat(L, component->detail); + return 1; +} int SoftBodyPhysicsComponent_BindLua::SetDisableDeactivation(lua_State *L) { bool value = wi::lua::SGetBool(L, 1); @@ -5763,10 +5800,24 @@ int SoftBodyPhysicsComponent_BindLua::IsDisableDeactivation(lua_State *L) wi::lua::SSetBool(L, component->IsDisableDeactivation()); return 1; } +int SoftBodyPhysicsComponent_BindLua::SetWindEnabled(lua_State* L) +{ + bool value = wi::lua::SGetBool(L, 1); + component->SetWindEnabled(value); + return 0; +} +int SoftBodyPhysicsComponent_BindLua::IsWindEnabled(lua_State* L) +{ + wi::lua::SSetBool(L, component->IsWindEnabled()); + return 1; +} int SoftBodyPhysicsComponent_BindLua::CreateFromMesh(lua_State *L) { - //TODO - //wi::lua::SSetBool(L, component->IsDisableDeactivation()); + MeshComponent_BindLua* mesh = Luna::lightcheck(L, 1); + if (mesh != nullptr) + { + component->CreateFromMesh(*mesh->component); + } return 0; } diff --git a/WickedEngine/wiScene_BindLua.h b/WickedEngine/wiScene_BindLua.h index fa0811268..76b87de6e 100644 --- a/WickedEngine/wiScene_BindLua.h +++ b/WickedEngine/wiScene_BindLua.h @@ -948,9 +948,11 @@ namespace wi::lua::scene int SetDisableDeactivation(lua_State* L); int SetKinematic(lua_State* L); + int SetStartDeactivated(lua_State* L); int IsDisableDeactivation(lua_State* L); int IsKinematic(lua_State* L); + int IsStartDeactivated(lua_State* L); }; class SoftBodyPhysicsComponent_BindLua @@ -969,6 +971,7 @@ namespace wi::lua::scene Mass = wi::lua::FloatProperty(&component->mass); Friction = wi::lua::FloatProperty(&component->friction); Restitution = wi::lua::FloatProperty(&component->restitution); + VertexRadius = wi::lua::FloatProperty(&component->vertex_radius); } SoftBodyPhysicsComponent_BindLua(wi::scene::SoftBodyPhysicsComponent* component) :component(component) @@ -983,13 +986,19 @@ namespace wi::lua::scene wi::lua::FloatProperty Mass; wi::lua::FloatProperty Friction; wi::lua::FloatProperty Restitution; + wi::lua::FloatProperty VertexRadius; PropertyFunction(Mass) PropertyFunction(Friction) PropertyFunction(Restitution) + PropertyFunction(VertexRadius) + int SetDetail(lua_State* L); + int GetDetail(lua_State* L); int SetDisableDeactivation(lua_State* L); int IsDisableDeactivation(lua_State* L); + int SetWindEnabled(lua_State* L); + int IsWindEnabled(lua_State* L); int CreateFromMesh(lua_State* L); }; diff --git a/WickedEngine/wiScene_Components.cpp b/WickedEngine/wiScene_Components.cpp index 8b63a3def..25167d6f4 100644 --- a/WickedEngine/wiScene_Components.cpp +++ b/WickedEngine/wiScene_Components.cpp @@ -1460,20 +1460,21 @@ namespace wi::scene XMFLOAT3& v1 = vertex_positions[i1]; XMFLOAT3& v2 = vertex_positions[i2]; + bool match_pos0 = - fabs(v_search_pos.x - v0.x) < FLT_EPSILON && - fabs(v_search_pos.y - v0.y) < FLT_EPSILON && - fabs(v_search_pos.z - v0.z) < FLT_EPSILON; + wi::math::float_equal(v_search_pos.x, v0.x) && + wi::math::float_equal(v_search_pos.y, v0.y) && + wi::math::float_equal(v_search_pos.z, v0.z); bool match_pos1 = - fabs(v_search_pos.x - v1.x) < FLT_EPSILON && - fabs(v_search_pos.y - v1.y) < FLT_EPSILON && - fabs(v_search_pos.z - v1.z) < FLT_EPSILON; + wi::math::float_equal(v_search_pos.x, v1.x) && + wi::math::float_equal(v_search_pos.y, v1.y) && + wi::math::float_equal(v_search_pos.z, v1.z); bool match_pos2 = - fabs(v_search_pos.x - v2.x) < FLT_EPSILON && - fabs(v_search_pos.y - v2.y) < FLT_EPSILON && - fabs(v_search_pos.z - v2.z) < FLT_EPSILON; + wi::math::float_equal(v_search_pos.x, v2.x) && + wi::math::float_equal(v_search_pos.y, v2.y) && + wi::math::float_equal(v_search_pos.z, v2.z); if (match_pos0 || match_pos1 || match_pos2) { @@ -1520,21 +1521,21 @@ namespace wi::scene const XMFLOAT2& at1 = vertex_atlas.empty() ? XMFLOAT2(0, 0) : vertex_atlas[ind1]; const bool duplicated_pos = - fabs(p0.x - p1.x) < FLT_EPSILON && - fabs(p0.y - p1.y) < FLT_EPSILON && - fabs(p0.z - p1.z) < FLT_EPSILON; + wi::math::float_equal(p0.x, p1.x) && + wi::math::float_equal(p0.y, p1.y) && + wi::math::float_equal(p0.z, p1.z); const bool duplicated_uv0 = - fabs(u00.x - u01.x) < FLT_EPSILON && - fabs(u00.y - u01.y) < FLT_EPSILON; + wi::math::float_equal(u00.x, u01.x) && + wi::math::float_equal(u00.y, u01.y); const bool duplicated_uv1 = - fabs(u10.x - u11.x) < FLT_EPSILON && - fabs(u10.y - u11.y) < FLT_EPSILON; + wi::math::float_equal(u10.x, u11.x) && + wi::math::float_equal(u10.y, u11.y); const bool duplicated_atl = - fabs(at0.x - at1.x) < FLT_EPSILON && - fabs(at0.y - at1.y) < FLT_EPSILON; + wi::math::float_equal(at0.x, at1.x) && + wi::math::float_equal(at0.y, at1.y); if (duplicated_pos && duplicated_uv0 && duplicated_uv1 && duplicated_atl) { @@ -2008,9 +2009,9 @@ namespace wi::scene const XMFLOAT3& position = mesh.vertex_positions[i]; size_t hashes[] = { - std::hash{}(position.x), - std::hash{}(position.y), - std::hash{}(position.z), + std::hash{}(int(position.x * detail)), + std::hash{}(int(position.y * detail)), + std::hash{}(int(position.z * detail)), }; size_t vertexHash = (((hashes[0] ^ (hashes[1] << 1) >> 1) ^ (hashes[2] << 1)) >> 1); diff --git a/WickedEngine/wiScene_Components.h b/WickedEngine/wiScene_Components.h index f8102d32a..56368cd0f 100644 --- a/WickedEngine/wiScene_Components.h +++ b/WickedEngine/wiScene_Components.h @@ -965,12 +965,15 @@ namespace wi::scene SAFE_TO_REGISTER = 1 << 0, DISABLE_DEACTIVATION = 1 << 1, FORCE_RESET = 1 << 2, + WIND = 1 << 3, }; uint32_t _flags = DISABLE_DEACTIVATION; float mass = 1.0f; float friction = 0.5f; float restitution = 0.0f; + float vertex_radius = 0.2f; // how much distance vertices keep from other physics bodies + float detail = 100; // precision to keep within a unit wi::vector physicsToGraphicsVertexMapping; // maps graphics vertex index to physics vertex index of the same position wi::vector graphicsToPhysicsVertexMapping; // maps a physics vertex index to first graphics vertex index of the same position wi::vector weights; // weight per physics vertex controlling the mass. (0: disable weight (no physics, only animation), 1: default weight) @@ -985,8 +988,18 @@ namespace wi::scene wi::primitive::AABB aabb; inline void SetDisableDeactivation(bool value) { if (value) { _flags |= DISABLE_DEACTIVATION; } else { _flags &= ~DISABLE_DEACTIVATION; } } + inline void SetWindEnabled(bool value) { if (value) { _flags |= WIND; } else { _flags &= ~DISABLE_DEACTIVATION; } } inline bool IsDisableDeactivation() const { return _flags & DISABLE_DEACTIVATION; } + inline bool IsWindEnabled() const { return _flags & WIND; } + + void SetDetail(float value) + { + detail = value; + physicsToGraphicsVertexMapping.clear(); + physicsToGraphicsVertexMapping.shrink_to_fit(); + physicsobject = {}; + } inline bool HasVertices() const { diff --git a/WickedEngine/wiScene_Serializers.cpp b/WickedEngine/wiScene_Serializers.cpp index 926469c0c..9d980a98f 100644 --- a/WickedEngine/wiScene_Serializers.cpp +++ b/WickedEngine/wiScene_Serializers.cpp @@ -772,6 +772,16 @@ namespace wi::scene friction = 0.5f; } + if (seri.version >= 1) + { + archive >> vertex_radius; + archive >> detail; + } + else + { + SetWindEnabled(true); + } + _flags &= ~SAFE_TO_REGISTER; } else @@ -787,6 +797,12 @@ namespace wi::scene { archive << restitution; } + + if (seri.version >= 1) + { + archive << vertex_radius; + archive << detail; + } } } void ArmatureComponent::Serialize(wi::Archive& archive, EntitySerializer& seri) diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 86b4dea5a..c0e3c5a26 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 = 495; + const int revision = 496; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);