// Copyright (c) Wojciech Figat. All rights reserved.
#pragma once
#include "MeshBase.h"
#include "BlendShape.h"
///
/// Represents part of the skinned model that is made of vertices and can be rendered using custom material, transformation and skeleton bones hierarchy.
///
API_CLASS(NoSpawn) class FLAXENGINE_API SkinnedMesh : public MeshBase
{
DECLARE_SCRIPTING_TYPE_WITH_CONSTRUCTOR_IMPL(SkinnedMesh, MeshBase);
///
/// Gets the skinned model owning this mesh.
///
FORCE_INLINE SkinnedModel* GetSkinnedModel() const
{
return (SkinnedModel*)_model;
}
///
/// Blend shapes used by this mesh.
///
Array BlendShapes;
public:
///
/// Load mesh data and Initialize GPU buffers
/// [Deprecated in v1.10]
///
/// Amount of vertices in the vertex buffer
/// Amount of triangles in the index buffer
/// Vertex buffer data
/// Index buffer data
/// True if use 16 bit indices for the index buffer (true: uint16, false: uint32).
/// True if cannot load data, otherwise false.
DEPRECATED("Use Init intead.") bool Load(uint32 vertices, uint32 triangles, const void* vb0, const void* ib, bool use16BitIndexBuffer);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// [Deprecated in v1.10]
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The vertex buffer data.
/// The index buffer in clockwise order.
/// True if failed, otherwise false.
DEPRECATED("Use MeshAccessor or UpdateMesh with separate vertex attribute arrays instead.")
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const VB0SkinnedElementType* vb, const int32* ib);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// [Deprecated in v1.10]
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The vertex buffer data.
/// The index buffer in clockwise order.
/// True if failed, otherwise false.
DEPRECATED("Use MeshAccessor or UpdateMesh with separate vertex attribute arrays instead.")
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const VB0SkinnedElementType* vb, const uint32* ib);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// [Deprecated in v1.10]
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The vertex buffer data.
/// The index buffer, clockwise order.
/// True if failed, otherwise false.
DEPRECATED("Use MeshAccessor or UpdateMesh with separate vertex attribute arrays instead.")
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const VB0SkinnedElementType* vb, const uint16* ib);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// [Deprecated in v1.10]
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The vertex buffer data.
/// The index buffer in clockwise order.
/// True if index buffer uses 16-bit index buffer, otherwise 32-bit.
/// True if failed, otherwise false.
DEPRECATED("Use MeshAccessor or Load with separate vertex attribute arrays instead.")
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const VB0SkinnedElementType* vb, const void* ib, bool use16BitIndices);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// Can be used only for virtual assets (see and ).
/// Mesh data will be cached and uploaded to the GPU with a delay.
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The mesh vertices positions. Cannot be null.
/// The mesh index buffer (clockwise triangles). Uses 32-bit stride buffer. Cannot be null.
/// The skeletal bones indices to use for skinning.
/// The skeletal bones weights to use for skinning (matches blendIndices).
/// The normal vectors (per vertex).
/// The normal vectors (per vertex). Use null to compute them from normal vectors.
/// The texture coordinates (per vertex).
/// The vertex colors (per vertex).
/// True if failed, otherwise false.
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const Float3* vertices, const uint16* triangles, const Int4* blendIndices, const Float4* blendWeights, const Float3* normals = nullptr, const Float3* tangents = nullptr, const Float2* uvs = nullptr, const Color32* colors = nullptr);
///
/// Updates the model mesh (used by the virtual models created with Init rather than Load).
/// Can be used only for virtual assets (see and ).
/// Mesh data will be cached and uploaded to the GPU with a delay.
///
/// The amount of vertices in the vertex buffer.
/// The amount of triangles in the index buffer.
/// The mesh vertices positions. Cannot be null.
/// The mesh index buffer (clockwise triangles). Uses 32-bit stride buffer. Cannot be null.
/// The skeletal bones indices to use for skinning.
/// The skeletal bones weights to use for skinning (matches blendIndices).
/// The normal vectors (per vertex).
/// The normal vectors (per vertex). Use null to compute them from normal vectors.
/// The texture coordinates (per vertex).
/// The vertex colors (per vertex).
/// True if failed, otherwise false.
bool UpdateMesh(uint32 vertexCount, uint32 triangleCount, const Float3* vertices, const uint32* triangles, const Int4* blendIndices, const Float4* blendWeights, const Float3* normals = nullptr, const Float3* tangents = nullptr, const Float2* uvs = nullptr, const Color32* colors = nullptr);
public:
///
/// Draws the mesh.
///
/// The rendering context.
/// The packed drawing info data.
/// The LOD transition dither factor.
void Draw(const RenderContext& renderContext, const DrawInfo& info, float lodDitherFactor) const;
///
/// Draws the mesh.
///
/// The rendering context batch.
/// The packed drawing info data.
/// The LOD transition dither factor.
void Draw(const RenderContextBatch& renderContextBatch, const DrawInfo& info, float lodDitherFactor) const;
public:
// [MeshBase]
void Release() override;
private:
// Internal bindings
#if !COMPILE_WITHOUT_CSHARP
API_FUNCTION(NoProxy) bool UpdateMeshUInt(int32 vertexCount, int32 triangleCount, const MArray* verticesObj, const MArray* trianglesObj, const MArray* blendIndicesObj, const MArray* blendWeightsObj, const MArray* normalsObj, const MArray* tangentsObj, const MArray* uvObj, const MArray* colorsObj);
API_FUNCTION(NoProxy) bool UpdateMeshUShort(int32 vertexCount, int32 triangleCount, const MArray* verticesObj, const MArray* trianglesObj, const MArray* blendIndicesObj, const MArray* blendWeightsObj, const MArray* normalsObj, const MArray* tangentsObj, const MArray* uvObj, const MArray* colorsObj);
API_FUNCTION(NoProxy) MArray* DownloadBuffer(bool forceGpu, MTypeObject* resultType, int32 typeI);
#endif
};