Files
o3de/Gems/NvCloth/Code/Source/Components/ClothComponentMesh/ActorClothSkinning.h
T
Aaron Ruiz Mora 0b551a0c21 Fixed cloth simulation generating incorrect normals
Fixed cloth simulation generating incorrect normals.
Also added option in Cloth Component to update normals of static particles (disabled by default).
User will want to keep the option disabled when continuity of the normals is important, like in characters, but for environmental cloth the mesh could look better when the normals of static particles are updated too.

Enable 'Update normals of static particles' option on blind slices of  Nvcloth gem

Fix unit tests
2021-05-17 09:53:14 +01:00

98 lines
3.4 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/std/limits.h>
#include <AzCore/Component/Entity.h>
#include <NvCloth/Types.h>
#include <Components/ClothComponentMesh/ClothComponentMesh.h>
namespace NvCloth
{
//! One skinning influence of a vertex.
struct SkinningInfluence
{
//! Weight of the joint that influences the vertex.
float m_jointWeight = 0.0f;
//! Index of the joint that influences the vertex.
AZ::u16 m_jointIndex = AZStd::numeric_limits<AZ::u16>::max();
};
//! Class to retrieve skinning information from an actor on the same entity
//! and use that data to apply skinning to vertices.
class ActorClothSkinning
{
public:
AZ_TYPE_INFO(ActorClothSkinning, "{3E7C664D-096B-4126-8553-3241BA965533}");
virtual ~ActorClothSkinning() = default;
static AZStd::unique_ptr<ActorClothSkinning> Create(
AZ::EntityId entityId,
const MeshNodeInfo& meshNodeInfo,
const AZStd::vector<SimParticleFormat>& originalMeshParticles,
const size_t numSimulatedVertices,
const AZStd::vector<int>& meshRemappedVertices);
explicit ActorClothSkinning(AZ::EntityId entityId);
//! Updates skinning with the current pose of the actor.
virtual void UpdateSkinning() = 0;
//! Applies skinning to a list of positions.
//! @note w components are not affected.
virtual void ApplySkinning(
const AZStd::vector<AZ::Vector4>& originalPositions,
AZStd::vector<AZ::Vector4>& positions) = 0;
//! Applies skinning to a list of positions and vectors whose vertices
//! have not been used for simulation.
virtual void ApplySkinningOnNonSimulatedVertices(
const MeshClothInfo& originalData,
ClothComponentMesh::RenderData& renderData) = 0;
//! Updates visibility variables.
void UpdateActorVisibility();
//! Returns true if actor is currently visible on screen.
bool IsActorVisible() const;
//! Returns true if actor was visible on screen in previous update.
bool WasActorVisible() const;
protected:
AZ::EntityId m_entityId;
size_t m_numberOfInfluencesPerVertex = 0;
// Skinning influences of all vertices
AZStd::vector<SkinningInfluence> m_skinningInfluences;
// Indices to skinning influences that are part of the simulation
AZStd::vector<AZ::u32> m_simulatedVertices;
// Indices to skinning influences that are not part of the simulation
AZStd::vector<AZ::u32> m_nonSimulatedVertices;
// Collection of skeleton joint indices that influence the vertices
AZStd::vector<AZ::u16> m_jointIndices;
// Visibility variables
bool m_wasActorVisible = false;
bool m_isActorVisible = false;
};
}// namespace NvCloth