2023-09-15 13:21:49 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../../VTAll.hpp"
|
|
|
|
#include "CKBeObject.hpp"
|
|
|
|
|
|
|
|
namespace LibCmo::CK2::ObjImpls {
|
|
|
|
|
|
|
|
class CKMesh : public CKBeObject {
|
2023-10-01 23:48:55 +08:00
|
|
|
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. */
|
|
|
|
};
|
|
|
|
|
2023-09-15 13:21:49 +08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2023-09-20 15:25:43 +08:00
|
|
|
virtual void CheckPreDeletion() override;
|
|
|
|
|
|
|
|
// 2 RW functions
|
2023-09-15 13:21:49 +08:00
|
|
|
virtual bool Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) override;
|
|
|
|
virtual bool Load(CKStateChunk* chunk, CKFileVisitor* file) override;
|
2023-09-20 13:13:08 +08:00
|
|
|
|
|
|
|
// it only have special Show method
|
|
|
|
virtual void Show(CK_OBJECT_SHOWOPTION show = CK_OBJECT_SHOWOPTION::CKSHOW) override;
|
|
|
|
|
2023-09-15 16:15:07 +08:00
|
|
|
// ===== Misc Section =====
|
|
|
|
public:
|
|
|
|
void CleanMesh();
|
2023-09-22 16:40:10 +08:00
|
|
|
VxMath::VXMESH_FLAGS GetMeshFlags() const;
|
2023-09-15 17:03:36 +08:00
|
|
|
protected:
|
2023-10-01 23:48:55 +08:00
|
|
|
VertexSaveFlags GenerateSaveFlags();
|
2023-09-15 17:03:36 +08:00
|
|
|
void BuildNormals();
|
|
|
|
void BuildFaceNormals();
|
2023-09-15 16:15:07 +08:00
|
|
|
|
2023-09-20 14:42:44 +08:00
|
|
|
// ===== Vertex Section =====
|
2023-09-15 16:15:07 +08:00
|
|
|
public:
|
2023-09-22 14:48:45 +08:00
|
|
|
CKDWORD GetVertexCount() const;
|
2023-09-15 16:15:07 +08:00
|
|
|
void SetVertexCount(CKDWORD count);
|
|
|
|
VxMath::VxVector3* GetVertexPositions();
|
|
|
|
VxMath::VxVector3* GetVertexNormals();
|
|
|
|
VxMath::VxVector2* GetVertexUVs();
|
|
|
|
CKDWORD* GetVertexColors();
|
|
|
|
CKDWORD* GetVertexSpecularColors();
|
|
|
|
|
|
|
|
// ===== Material Slot Section =====
|
|
|
|
public:
|
2023-09-22 14:48:45 +08:00
|
|
|
CKDWORD GetMaterialSlotCount() const;
|
2023-09-15 16:15:07 +08:00
|
|
|
void SetMaterialSlotCount(CKDWORD count);
|
2023-09-22 14:48:45 +08:00
|
|
|
CKMaterial** GetMaterialSlots();
|
2023-09-15 16:15:07 +08:00
|
|
|
|
|
|
|
// ===== Face Section =====
|
|
|
|
public:
|
2023-09-22 14:48:45 +08:00
|
|
|
CKDWORD GetFaceCount() const;
|
2023-09-15 16:15:07 +08:00
|
|
|
void SetFaceCount(CKDWORD count);
|
|
|
|
CKWORD* GetFaceIndices();
|
|
|
|
CKWORD* GetFaceMaterialSlotIndexs();
|
|
|
|
VxMath::VxVector3* GetFaceNormals(CKDWORD& stride);
|
|
|
|
|
|
|
|
// ===== Line Section =====
|
|
|
|
public:
|
2023-09-22 14:48:45 +08:00
|
|
|
CKDWORD GetLineCount() const;
|
2023-09-15 16:15:07 +08:00
|
|
|
void SetLineCount(CKDWORD count);
|
|
|
|
CKWORD* GetLineIndices();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
struct FaceData_t {
|
|
|
|
FaceData_t() :
|
2023-10-01 23:48:55 +08:00
|
|
|
m_Normal()
|
2023-09-15 16:15:07 +08:00
|
|
|
{}
|
|
|
|
VxMath::VxVector3 m_Normal;
|
|
|
|
};
|
|
|
|
VxMath::VXMESH_FLAGS m_Flags;
|
|
|
|
CKDWORD m_VertexCount;
|
|
|
|
CKDWORD m_LineCount;
|
2023-10-08 20:56:29 +08:00
|
|
|
CKDWORD m_MaterialSlotCount;
|
2023-09-15 16:15:07 +08:00
|
|
|
CKDWORD m_FaceCount;
|
|
|
|
|
|
|
|
XContainer::XArray<VxMath::VxVector3> m_VertexPosition;
|
|
|
|
XContainer::XArray<VxMath::VxVector3> m_VertexNormal;
|
|
|
|
XContainer::XArray<VxMath::VxVector2> m_VertexUV;
|
|
|
|
XContainer::XArray<CKDWORD> m_VertexColor;
|
|
|
|
XContainer::XArray<CKDWORD> m_VertexSpecularColor;
|
|
|
|
|
|
|
|
XContainer::XArray<CKMaterial*> m_MaterialSlot;
|
|
|
|
|
|
|
|
XContainer::XArray<CKWORD> m_FaceIndices;
|
|
|
|
XContainer::XArray<CKWORD> m_FaceMtlIndex;
|
2023-10-01 23:48:55 +08:00
|
|
|
XContainer::XArray<FaceData_t> m_FaceOthers;
|
2023-09-15 16:15:07 +08:00
|
|
|
|
|
|
|
XContainer::XArray<CKWORD> m_LineIndices;
|
2023-09-15 13:21:49 +08:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|