]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CPLYMeshFileLoader.h
Fix some more problems with OSX build file.
[irrlicht.git] / source / Irrlicht / CPLYMeshFileLoader.h
1 // Copyright (C) 2009-2012 Gaz Davidson\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #ifndef __C_PLY_MESH_FILE_LOADER_H_INCLUDED__\r
6 #define __C_PLY_MESH_FILE_LOADER_H_INCLUDED__\r
7 \r
8 #include "IMeshLoader.h"\r
9 #include "ISceneManager.h"\r
10 #include "CDynamicMeshBuffer.h"\r
11 \r
12 namespace irr\r
13 {\r
14 namespace scene\r
15 {\r
16 \r
17 enum E_PLY_PROPERTY_TYPE\r
18 {\r
19         EPLYPT_INT8  = 0,\r
20         EPLYPT_INT16,\r
21         EPLYPT_INT32,\r
22         EPLYPT_FLOAT32,\r
23         EPLYPT_FLOAT64,\r
24         EPLYPT_LIST,\r
25         EPLYPT_UNKNOWN\r
26 };\r
27 \r
28 //! Meshloader capable of loading obj meshes.\r
29 class CPLYMeshFileLoader : public IMeshLoader\r
30 {\r
31 public:\r
32 \r
33         //! Constructor\r
34         CPLYMeshFileLoader(scene::ISceneManager* smgr);\r
35 \r
36         //! Destructor\r
37         virtual ~CPLYMeshFileLoader();\r
38 \r
39         //! returns true if the file maybe is able to be loaded by this class\r
40         //! based on the file extension (e.g. ".ply")\r
41         virtual bool isALoadableFileExtension(const io::path& filename) const _IRR_OVERRIDE_;\r
42 \r
43         //! creates/loads an animated mesh from the file.\r
44         virtual IAnimatedMesh* createMesh(io::IReadFile* file) _IRR_OVERRIDE_;\r
45 \r
46 private:\r
47 \r
48         struct SPLYProperty\r
49         {\r
50                 core::stringc Name;\r
51                 E_PLY_PROPERTY_TYPE Type;\r
52                 union\r
53                 {\r
54                         u8  Int8;\r
55                         u16 Int16;\r
56                         u32 Int32;\r
57                         f32 Float32;\r
58                         f64 Double;\r
59                         struct SPLYListProperty\r
60                         {\r
61                                 E_PLY_PROPERTY_TYPE CountType;\r
62                                 E_PLY_PROPERTY_TYPE ItemType;\r
63                         } List;\r
64 \r
65                 } Data;\r
66 \r
67                 inline u32 size() const\r
68                 {\r
69                         switch(Type)\r
70                         {\r
71                         case EPLYPT_INT8:\r
72                                 return 1;\r
73                         case EPLYPT_INT16:\r
74                                 return 2;\r
75                         case EPLYPT_INT32:\r
76                         case EPLYPT_FLOAT32:\r
77                                 return 4;\r
78                         case EPLYPT_FLOAT64:\r
79                                 return 8;\r
80                         case EPLYPT_LIST:\r
81                         case EPLYPT_UNKNOWN:\r
82                         default:\r
83                                 return 0;\r
84                         }\r
85                 }\r
86 \r
87                 inline bool isFloat() const\r
88                 {\r
89                         switch(Type)\r
90                         {\r
91                         case EPLYPT_FLOAT32:\r
92                         case EPLYPT_FLOAT64:\r
93                                 return true;\r
94                         case EPLYPT_INT8:\r
95                         case EPLYPT_INT16:\r
96                         case EPLYPT_INT32:\r
97                         case EPLYPT_LIST:\r
98                         case EPLYPT_UNKNOWN:\r
99                         default:\r
100                                 return false;\r
101                         }\r
102                 }\r
103         };\r
104 \r
105         struct SPLYElement\r
106         {\r
107                 // name of the element. We only want "vertex" and "face" elements\r
108                 // but we have to parse the others anyway.\r
109                 core::stringc Name;\r
110                 // The number of elements in the file\r
111                 u32 Count;\r
112                 // Properties of this element\r
113                 core::array<SPLYProperty> Properties;\r
114                 // in binary files, true if this is a fixed size\r
115                 bool IsFixedWidth;\r
116                 // known size in bytes, 0 if unknown\r
117                 u32 KnownSize;\r
118         };\r
119 \r
120         bool allocateBuffer();\r
121         c8* getNextLine();\r
122         c8* getNextWord();\r
123         void fillBuffer();\r
124         E_PLY_PROPERTY_TYPE getPropertyType(const c8* typeString) const;\r
125 \r
126         bool readVertex(const SPLYElement &Element, scene::CDynamicMeshBuffer* mb);\r
127         bool readFace(const SPLYElement &Element, scene::CDynamicMeshBuffer* mb);\r
128         void skipElement(const SPLYElement &Element);\r
129         void skipProperty(const SPLYProperty &Property);\r
130         f32 getFloat(E_PLY_PROPERTY_TYPE t);\r
131         u32 getInt(E_PLY_PROPERTY_TYPE t);\r
132         void moveForward(u32 bytes);\r
133 \r
134         core::array<SPLYElement*> ElementList;\r
135 \r
136         scene::ISceneManager* SceneManager;\r
137         io::IReadFile *File;\r
138         c8 *Buffer;\r
139         bool IsBinaryFile, IsWrongEndian, EndOfFile;\r
140         s32 WordLength;\r
141         c8 *StartPointer, *EndPointer, *LineEndPointer;\r
142 };\r
143 \r
144 } // end namespace scene\r
145 } // end namespace irr\r
146 \r
147 #endif\r
148 \r