00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00036 class PG_API pgMdlData
00037 {
00038 public:
00039 pgDefineException(ExceptionInvalidArgument);
00040 pgDefineException(ExceptionInvalidCall);
00041 pgDefineException(ExceptionInvalidData);
00042 pgDefineException(ExceptionNotInitialized);
00043
00044 static const u32 MODEL_DATA_VERSION = 50;
00045
00046 enum ModelDataMode
00047 {
00048 MODE_READ,
00049 MODE_WRITE
00050 };
00051
00052 pgMdlData();
00053 ~pgMdlData();
00054
00055 void initAsReader(const void* data, u32 data_size);
00056 void initAsWriter(u16 node_num, u16 vert_num, pgID tex_id, bool has_normal);
00057
00058 ModelDataMode getMode() const;
00059 u16 getNodeNum() const;
00060 u16 getVertNum() const;
00061 bool hasNormal() const;
00062 pgID getTextureID() const;
00063
00064 u16 getNodeParentIndex(u16 node_index) const;
00065 void setNodeParentIndex(u16 node_index, u16 parent_index);
00066 void setNodeParentIndex_noParent(u16 node_index);
00067
00068 const pgMat& getNodeLocal(u16 node_index) const;
00069 void setNodeLocal(u16 node_index, const pgMat& local);
00070
00071 pgPrim::PrimMode getNodePrimMode(u16 node_index) const;
00072 void setNodePrimMode(u16 node_index, pgPrim::PrimMode prim_mode);
00073
00074 u16 getNodeVertIndex(u16 node_index) const;
00075 u16 getNodeVertNum(u16 node_index) const;
00076 void setNodeVertInfo(u16 node_index, u16 vert_index, u16 vert_num);
00077
00078 const pgPrim::PrimData* getNodePrimData(u16 node_index) const;
00079 const pgVec* getNodeNormalData(u16 node_index) const;
00080
00081 pgPrim::BlendMode getNodeBlendMode(u16 node_index) const;
00082 void setNodeBlendMode(u16 node_index, pgPrim::BlendMode blend_mode);
00083
00084 const pgVec& getNodeClipBoundMinForReader(u16 node_index) const;
00085 const pgVec& getNodeClipBoundMaxForReader(u16 node_index) const;
00086
00087 const pgVec& getVertPos(u16 vert_index) const;
00088 void setVertPos(u16 vert_index, const pgVec& pos);
00089
00090 pgCol getVertCol(u16 vert_index) const;
00091 void setVertCol(u16 vert_index, pgCol col);
00092
00093 r32 getVertU(u16 vert_index) const;
00094 r32 getVertV(u16 vert_index) const;
00095 void setVertUV(u16 vert_index, r32 u, r32 v);
00096
00097 const pgVec& getVertN(u16 vert_index) const;
00098 void setVertN(u16 vert_index, const pgVec& n);
00099
00100 void calcNormalAsTriangles(bool is_smoothing);
00101
00102 void registerAsResource(pgID res_id);
00103
00104 private:
00105 enum ModelDataFlag
00106 {
00107 FLAG_HAS_NORMAL
00108 };
00109
00110 struct ModelDataHeader
00111 {
00112 pgID format_id;
00113 u16 format_version;
00114 u16 node_num;
00115 u16 vert_num;
00116 pgFlag<u16, ModelDataFlag> flag;
00117 pgID tex_id;
00118 u32 prim_data_offset;
00119 u32 normal_data_offset;
00120 };
00121
00122 struct NodeInfo
00123 {
00124 pgMat local;
00125 pgVec bound_min;
00126 pgVec bound_max;
00127 u16 parent_index;
00128 pgType<u8, pgPrim::PrimMode> prim_mode;
00129 pgType<u8, pgPrim::BlendMode> blend_mode;
00130 u16 vert_index;
00131 u16 vert_num;
00132 };
00133
00134 pgMdlData(const pgMdlData&);
00135 void operator=(const pgMdlData&);
00136
00137 pgType<u8, ModelDataMode> m_mode;
00138 u8* m_data;
00139 u32 m_data_size;
00140 ModelDataHeader* m_mdl_data_header;
00141 NodeInfo* m_node_info;
00142 pgPrim::PrimData* m_prim_data;
00143 pgVec* m_normal_data;
00144 };