#ifndef __DTS_SHAPE_H #define __DTS_SHAPE_H #include "DTSPoint.h" #include "DTSQuaternion.h" #include "DTSMesh.h" namespace DTS { //! Defines a tree node, as stored in the DTS file struct Node { int name ; //!< Index of its name in the DTS string table int parent ; //!< Number of the parent node, -1 if it is root int firstObject ; //!< Deprecated: set to -1 (Note: not quite true, used in TSShape, set on load, but not used by exporter) int child ; //!< Deprecated: set to -1 (Note: not quite true, used in TSShape, set on load, but not used by exporter) int sibling ; //!< Deprecated: set to -1 (Note: not quite true, used in TSShape, set on load, but not used by exporter) Node() { // These values unused in data file firstObject = child = sibling = -1; } }; //! Defines an object, as stored in the DTS file struct Object { int name ; //!< Index of its name in the DTS string table int numMeshes ; //!< Number of meshes (only one mesh is used for detail level) int firstMesh ; //!< Number of the first mesh (they must be consecutive) int node ; //!< Number of the node where the object is stored int sibling ; //!< Deprecated: set to -1. (Note: not quite true, used in TSShape, set on load, but not used by exporter) int firstDecal ; //!< Deprecated: set to -1 Object() { // These values unused in data file firstDecal = sibling = -1; } }; //! Defines a decal, as stored in the DTS file. DEPRECATED. struct Decal { int name ; int numMeshes ; int firstMesh ; int object ; int sibling ; }; //! Defines a material, as stored in the DTS file struct Material { std::string name ; //!< Texture name. Materials don't use the DTS string table int flags ; //!< Boolean properties int reflectance ; //!< Number of reflectance map (?) int bump ; //!< Number of bump map (?) or -1 if none int detail ; //!< Index of the material, which stores the Detailmap for this material or -1 if none float detailScale ; //!< Scale of the Detailmap, Default = 1.0f float reflection ; //!< ? enum //!< Material flags { SWrap = 0x00000001, TWrap = 0x00000002, Translucent = 0x00000004, Additive = 0x00000008, Subtractive = 0x00000010, SelfIlluminating = 0x00000020, NeverEnvMap = 0x00000040, NoMipMap = 0x00000080, MipMapZeroBorder = 0x00000100, IFLMaterial = 0x08000000, IFLFrame = 0x10000000, DetailMap = 0x20000000, BumpMap = 0x40000000, ReflectanceMap = 0x80000000, AuxiliaryMask = 0xE0000000 }; }; //! Defines an animated material as stored in the DTS file struct IFLMaterial { int name ; int slot ; int firstFrame ; int time ; int numFrames ; }; //! Defines a detail level as stored in the DTS file struct DetailLevel { int name ; //!< Index of the name in the DTS string table int subshape ; //!< Number of the subshape it belongs int objectDetail ; //!< Number of object mesh to draw for each object float size ; //!< Minimum pixel size (store details from big to small) float avgError ; //!< Don't know, use -1 float maxError ; //!< Don't know, use -1 int polyCount ; //!< Polygon count of the meshes to draw. }; //! Defines a subshape as stored in the DTS file. A subshape defines a range //! of nodes and objects. struct Subshape { int firstNode ; int firstObject ; int firstDecal ; int numNodes ; int numObjects ; int numDecals ; int firstTranslucent ; //!< Not used/stored (?) }; //! Defines an object state as stored in the DTS file. //! Not sure about what does, but it may be related to animated materials. struct ObjectState { float vis ; int frame ; int matFrame ; }; //! Defines a decal state as stored in the DTS file. DEPRECATED. struct DecalState { int frame ; }; //! Defines a trigger as stored in the DTS file. struct Trigger { int state ; float pos ; }; //! Defines a sequence as stored in the DTS file struct Sequence { int nameIndex ; int flags ; int numKeyFrames ; float duration ; int priority ; int firstGroundFrame ; int numGroundFrames ; int baseRotation ; int baseTranslation ; int baseScale ; int baseObjectState ; int baseDecalState ; int firstTrigger ; int numTriggers ; float toolBegin ; enum /* flags */ { UniformScale = 0x0001, AlignedScale = 0x0002, ArbitraryScale = 0x0004, Blend = 0x0008, Cyclic = 0x0010, MakePath = 0x0020, IFLInit = 0x0040, HasTranslucency = 0x0080 }; struct matters_array { std::vector rotation ; std::vector translation ; std::vector scale ; std::vector decal ; std::vector ifl ; std::vector vis ; std::vector frame ; std::vector matframe ; } matters ; Sequence() ; }; //! Defines a DTS shape class Shape { friend class ShapeMimic; friend class AppConfig; public: enum //! ImportConfig collision types { C_None = 0, C_BBox, C_Cylinder, C_Mesh } ; //! Create an empty shape Shape () ; //! Write the shape to a file or stream void save (std::ostream & out) const ; //! Write the shape's sequences to a file or stream void saveSequences (std::ostream & out) const ; //! Read the shape from a file or stream void read (std::istream & in) ; Box getBounds() const { return bounds; } float getRadius() const { return radius; } float getTubeRadius() const { return tubeRadius; } protected: int addName (std::string s) ; void calculateBounds() ; void calculateRadius() ; void calculateTubeRadius() ; void calculateCenter() ; void setSmallestSize(int) ; void setCenter(Point &p) { center = p; } void getNodeWorldPosRot(int n,Point &trans, Quaternion &rot); void write(std::ostream & out,const std::vector * ptr) const; protected: std::vector nodes ; std::vector objects ; std::vector decals ; std::vector subshapes ; std::vector IFLmaterials ; std::vector materials ; std::vector nodeDefRotations ; std::vector nodeDefTranslations ; std::vector nodeRotations ; std::vector nodeTranslations ; std::vector nodeScalesUniform ; std::vector nodeScalesAligned ; std::vector nodeScalesArbitrary ; std::vector nodeScaleRotsArbitrary ; std::vector groundRotations ; std::vector groundTranslations ; std::vector objectStates ; std::vector decalStates ; std::vector triggers ; std::vector detailLevels ; std::vector meshes ; std::vector sequences ; std::vector names ; private: float smallestSize ; int smallestDetailLevel ; float radius ; float tubeRadius ; Point center ; Box bounds ; }; } #endif