// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. #pragma once #include "../BinaryAsset.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Graphics/Models/MaterialSlot.h" #include "Engine/Streaming/StreamableResource.h" // Note: we use the first chunk as a header, next is the highest quality lod and then lower ones // // Example: // Chunk 0: Header // Chunk 1: LOD0 // Chunk 2: LOD1 // .. // Chunk 15: SDF #define MODEL_LOD_TO_CHUNK_INDEX(lod) (lod + 1) class MeshBase; struct RenderContextBatch; /// /// Base class for asset types that can contain a model resource. /// API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API ModelBase : public BinaryAsset, public StreamableResource { DECLARE_ASSET_HEADER(ModelBase); public: /// /// The Sign Distant Field (SDF) data for the model. /// API_STRUCT() struct SDFData { DECLARE_SCRIPTING_TYPE_MINIMAL(SDFData); /// /// The SDF volume texture (merged all meshes). /// API_FIELD() GPUTexture* Texture = nullptr; /// /// The transformation scale from model local-space to the generated SDF texture space (local-space -> uv). /// API_FIELD() Float3 LocalToUVWMul; /// /// Amount of world-units per SDF texture voxel. /// API_FIELD() float WorldUnitsPerVoxel; /// /// The transformation offset from model local-space to the generated SDF texture space (local-space -> uv). /// API_FIELD() Float3 LocalToUVWAdd; /// /// The maximum distance stored in the SDF texture. Used to rescale normalized SDF into world-units (in model local space). /// API_FIELD() float MaxDistance; /// /// The bounding box of the SDF texture in the model local-space. /// API_FIELD() Float3 LocalBoundsMin; /// /// The SDF texture resolution scale used for building texture. /// API_FIELD() float ResolutionScale = 1.0f; /// /// The bounding box of the SDF texture in the model local-space. /// API_FIELD() Float3 LocalBoundsMax; /// /// The model LOD index used for the building. /// API_FIELD() int32 LOD = 6; }; protected: explicit ModelBase(const SpawnParams& params, const AssetInfo* info, StreamingGroup* group) : BinaryAsset(params, info) , StreamableResource(group) { } public: /// /// The minimum screen size to draw this model (the bottom limit). Used to cull small models. Set to 0 to disable this feature. /// API_FIELD() float MinScreenSize = 0.0f; /// /// The list of material slots. /// API_FIELD(ReadOnly) Array MaterialSlots; /// /// Gets the amount of the material slots used by this model asset. /// API_PROPERTY() int32 GetMaterialSlotsCount() const { return MaterialSlots.Count(); } /// /// Resizes the material slots collection. Updates meshes that were using removed slots. /// API_FUNCTION() virtual void SetupMaterialSlots(int32 slotsCount); /// /// Gets the material slot by the name. /// /// The slot name. /// The material slot with the given name or null if cannot find it (asset may be not loaded yet). API_FUNCTION() MaterialSlot* GetSlot(const StringView& name); /// /// Gets amount of the level of details in the model. /// virtual int32 GetLODsCount() const = 0; /// /// Gets the meshes for a particular LOD index. /// virtual void GetMeshes(Array& meshes, int32 lodIndex = 0) = 0; };