// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/Math/BoundingBox.h" #include "Engine/Core/Math/BoundingSphere.h" #include "Engine/Core/Types/DataContainer.h" #include "Engine/Graphics/Enums.h" #include "Engine/Graphics/Models/Types.h" #include "Engine/Level/Types.h" #include "Engine/Scripting/ScriptingObject.h" struct GeometryDrawStateData; struct RenderContext; struct RenderContextBatch; class Task; class ModelBase; class Lightmap; class GPUBuffer; class SkinnedMeshDrawData; class BlendShapesInstance; /// /// Base class for model resources meshes. /// API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API MeshBase : public ScriptingObject { DECLARE_SCRIPTING_TYPE_MINIMAL(MeshBase); protected: ModelBase* _model; BoundingBox _box; BoundingSphere _sphere; int32 _index; int32 _lodIndex; uint32 _vertices; uint32 _triangles; int32 _materialSlotIndex; bool _use16BitIndexBuffer; explicit MeshBase(const SpawnParams& params) : ScriptingObject(params) { } public: /// /// Gets the model owning this mesh. /// API_PROPERTY() FORCE_INLINE ModelBase* GetModelBase() const { return _model; } /// /// Gets the mesh parent LOD index. /// API_PROPERTY() FORCE_INLINE int32 GetLODIndex() const { return _lodIndex; } /// /// Gets the mesh index. /// API_PROPERTY() FORCE_INLINE int32 GetIndex() const { return _index; } /// /// Gets the triangle count. /// API_PROPERTY() FORCE_INLINE int32 GetTriangleCount() const { return _triangles; } /// /// Gets the vertex count. /// API_PROPERTY() FORCE_INLINE int32 GetVertexCount() const { return _vertices; } /// /// Gets the box. /// API_PROPERTY() FORCE_INLINE const BoundingBox& GetBox() const { return _box; } /// /// Gets the sphere. /// API_PROPERTY() FORCE_INLINE const BoundingSphere& GetSphere() const { return _sphere; } /// /// Determines whether this mesh is using 16 bit index buffer, otherwise it's 32 bit. /// API_PROPERTY() FORCE_INLINE bool Use16BitIndexBuffer() const { return _use16BitIndexBuffer; } /// /// Gets the index of the material slot to use during this mesh rendering. /// API_PROPERTY() FORCE_INLINE int32 GetMaterialSlotIndex() const { return _materialSlotIndex; } /// /// Sets the index of the material slot to use during this mesh rendering. /// API_PROPERTY() void SetMaterialSlotIndex(int32 value); /// /// Sets the mesh bounds. /// /// The bounding box. void SetBounds(const BoundingBox& box); public: /// /// Extract mesh buffer data from GPU. Cannot be called from the main thread. /// /// Buffer type /// The result data /// True if failed, otherwise false virtual bool DownloadDataGPU(MeshBufferType type, BytesContainer& result) const = 0; /// /// Extracts mesh buffer data from GPU in the async task. /// /// Buffer type /// The result data /// Created async task used to gather the buffer data. virtual Task* DownloadDataGPUAsync(MeshBufferType type, BytesContainer& result) const = 0; /// /// Extract mesh buffer data from CPU. Cached internally. /// /// Buffer type /// The result data /// The amount of items inside the result buffer. /// True if failed, otherwise false virtual bool DownloadDataCPU(MeshBufferType type, BytesContainer& result, int32& count) const = 0; public: /// /// Model instance drawing packed data. /// struct DrawInfo { /// /// The instance buffer to use during model rendering. /// ModelInstanceEntries* Buffer; /// /// The world transformation of the model. /// Matrix* World; /// /// The instance drawing state data container. Used for LOD transition handling and previous world transformation matrix updating. /// GeometryDrawStateData* DrawState; /// /// The instance deformation utility. /// MeshDeformation* Deformation; union { struct { /// /// The skinning. /// SkinnedMeshDrawData* Skinning; }; struct { /// /// The lightmap. /// const Lightmap* Lightmap; /// /// The lightmap UVs. /// const Rectangle* LightmapUVs; }; }; /// /// The model instance vertex colors buffers (per-lod all meshes packed in a single allocation, array length equal to model lods count). /// GPUBuffer** VertexColors; /// /// The object static flags. /// StaticFlags Flags; /// /// The object draw modes. /// DrawPass DrawModes; /// /// The bounds of the model (used to select a proper LOD during rendering). /// BoundingSphere Bounds; /// /// The per-instance random value. /// float PerInstanceRandom; /// /// The LOD bias value. /// char LODBias; /// /// The forced LOD to use. Value -1 disables this feature. /// char ForcedLOD; /// /// The object sorting key. /// int16 SortOrder; }; };