#pragma once #include "../../VTAll.hpp" #include "CKBeObject.hpp" namespace LibCmo::CK2::ObjImpls { class CKMesh : public CKBeObject { public: CKMesh(CKContext* ctx, CK_ID ckid, CKSTRING name); virtual ~CKMesh(); LIBCMO_DISABLE_COPY_MOVE(CKMesh); virtual CK_CLASSID GetClassID(void) override { return CK_CLASSID::CKCID_MESH; } virtual void CheckPreDeletion() override; // 2 RW functions virtual bool Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) override; virtual bool Load(CKStateChunk* chunk, CKFileVisitor* file) override; // it only have special Show method virtual void Show(CK_OBJECT_SHOWOPTION show = CK_OBJECT_SHOWOPTION::CKSHOW) override; // ===== Misc Section ===== public: void CleanMesh(); VxMath::VXMESH_FLAGS GetMeshFlags() const; protected: void BuildNormals(); void BuildFaceNormals(); // ===== Vertex Section ===== public: CKDWORD GetVertexCount() const; void SetVertexCount(CKDWORD count); VxMath::VxVector3* GetVertexPositions(); VxMath::VxVector3* GetVertexNormals(); VxMath::VxVector2* GetVertexUVs(); CKDWORD* GetVertexColors(); CKDWORD* GetVertexSpecularColors(); CKFLOAT* GetVertexWeights(); // ===== Material Slot Section ===== public: CKDWORD GetMaterialSlotCount() const; void SetMaterialSlotCount(CKDWORD count); CKMaterial** GetMaterialSlots(); // ===== Face Section ===== public: CKDWORD GetFaceCount() const; void SetFaceCount(CKDWORD count); CKWORD* GetFaceIndices(); CKWORD* GetFaceMaterialSlotIndexs(); VxMath::VxVector3* GetFaceNormals(CKDWORD& stride); CKWORD* GetFaceChannelMasks(CKDWORD& stride); // ===== Line Section ===== public: CKDWORD GetLineCount() const; void SetLineCount(CKDWORD count); CKWORD* GetLineIndices(); // ===== Material Channel Section ===== public: CKDWORD GetMtlChannelCount() const; void SetMtlChannelCount(CKDWORD count); CKMaterial** GetMtlChannelMaterials(CKDWORD& stride); VxMath::VXBLEND_MODE* GetMtlChannelSourceBlends(CKDWORD& stride); VxMath::VXBLEND_MODE* GetMtlChannelDestBlends(CKDWORD& stride); VxMath::VxVector2* GetMtlChannelCustomUVs(CKDWORD idx); VxMath::VXCHANNEL_FLAGS GetMtlChannelFlags(CKDWORD idx) const; void SetMtlChannelFlags(CKDWORD idx, VxMath::VXCHANNEL_FLAGS flags); protected: // 2 sync functions served for material channels. void SyncVertexCountToMtlChannel(); // setup material channel custom uv properly void SyncMtlChannelToFaceMask(CKDWORD oldsize, CKDWORD newsize); // request all face accept all material channels. protected: enum class VertexSaveFlags : CKDWORD { None = 0, SingleColor = 0x1u, /**< if not set, the VertexColor is a list, otherwise a single global CKDWORD.*/ SingleSpecularColor = 0x2u, /**< if not set, the VertexSpecularColor is a list, otherwise a single global CKDWORD. */ NoNormal = 0x4u, /**< if set, there are no normal data for vertex. */ SingleUV = 0x8u, /**< if not set, the VertexUV is a list, otherwise a single global VxVertex2. */ NoPos = 0x10u, /**< if set, there are no position data for vertex. */ }; struct FaceData_t { FaceData_t() : m_Normal(), m_ChannelMask(0xFFFF) {} VxMath::VxVector3 m_Normal; CKWORD m_ChannelMask; }; struct MaterialChannel_t { MaterialChannel_t() : m_Material(nullptr), m_SourceBlend(VxMath::VXBLEND_MODE::VXBLEND_ZERO), m_DestBlend(VxMath::VXBLEND_MODE::VXBLEND_SRCCOLOR), m_CustomUV(), m_Flags(EnumsHelper::Merge({ VxMath::VXCHANNEL_FLAGS::VXCHANNEL_ACTIVE, VxMath::VXCHANNEL_FLAGS::VXCHANNEL_SAMEUV })) {} CKMaterial* m_Material; VxMath::VXBLEND_MODE m_SourceBlend; VxMath::VXBLEND_MODE m_DestBlend; XContainer::XArray m_CustomUV; VxMath::VXCHANNEL_FLAGS m_Flags; }; VxMath::VXMESH_FLAGS m_Flags; CKDWORD m_VertexCount; CKDWORD m_LineCount; CKDWORD m_MtlSlotCount; CKDWORD m_FaceCount; CKDWORD m_MtlChannelCount; XContainer::XArray m_VertexPosition; XContainer::XArray m_VertexNormal; XContainer::XArray m_VertexUV; XContainer::XArray m_VertexColor; XContainer::XArray m_VertexSpecularColor; XContainer::XArray m_VertexWeight; bool m_NoVertexWeight; // true if there is actually no vertex weight XContainer::XArray m_MaterialSlot; XContainer::XArray m_FaceIndices; XContainer::XArray m_FaceMtlIndex; XContainer::XArray m_Faces; XContainer::XArray m_LineIndices; XContainer::XArray m_MaterialChannels; }; }