Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_MESHLOADER_OBJ_H__
00009 #define __SP_MESHLOADER_OBJ_H__
00010
00011
00012 #include "Base/spStandard.hpp"
00013
00014 #ifdef SP_COMPILE_WITH_MESHLOADER_OBJ
00015
00016
00017 #include "Base/spInputOutputLog.hpp"
00018 #include "Base/spInputOutputFileSystem.hpp"
00019 #include "Base/spDimension.hpp"
00020 #include "FileFormats/Mesh/spMeshLoader.hpp"
00021
00022 #include <vector>
00023
00024
00025 namespace sp
00026 {
00027 namespace scene
00028 {
00029
00030
00031 class SP_EXPORT MeshLoaderOBJ : public MeshLoader
00032 {
00033
00034 public:
00035
00036 MeshLoaderOBJ();
00037 ~MeshLoaderOBJ();
00038
00039 Mesh* loadMesh(const io::stringc &Filename, const io::stringc &TexturePath);
00040
00041 private:
00042
00043
00044
00045 enum ETokenFlags
00046 {
00047 TOKENFLAG_UNTIL_BLANK = 0x01,
00048 };
00049
00050
00051
00052 struct SFaceOBJ
00053 {
00054 std::vector<u32> CoordIndices;
00055 std::vector<u32> TexCoordIndices;
00056 std::vector<u32> NormalIndices;
00057 };
00058
00059 struct SMaterialOBJ
00060 {
00061 SMaterialOBJ() : ColorMap(0)
00062 {
00063 }
00064 ~SMaterialOBJ()
00065 {
00066 }
00067
00068
00069 io::stringc Name;
00070 video::color Diffuse;
00071 video::color Ambient;
00072 video::color Specular;
00073 video::color Emission;
00074 video::color VertexColor;
00075 video::Texture* ColorMap;
00076 };
00077
00078 struct SGroupOBJ
00079 {
00080 SGroupOBJ() : Material(0)
00081 {
00082 }
00083 ~SGroupOBJ()
00084 {
00085 }
00086
00087
00088 io::stringc Name;
00089 SMaterialOBJ* Material;
00090 std::list<SFaceOBJ> Faces;
00091 };
00092
00093
00094
00095 typedef std::map<std::string, SMaterialOBJ> MaterialType;
00096
00097
00098
00099 bool parseFile(io::File* CurFile);
00100 bool buildModel();
00101
00102 void createNewGroup(const io::stringc &Name);
00103 void createNewMaterial(const io::stringc &Name);
00104 void checkGroupExistence();
00105
00106 bool exitWithError(const io::stringc &Message, bool PrintLineNr = true);
00107
00108 bool getNextToken();
00109 bool parseCurrentLineInFile();
00110
00111 bool parseVertexCoord();
00112 bool parseVertexTexCoord();
00113 bool parseVertexNormal();
00114 bool parseFace();
00115 bool parseGroup();
00116 bool parseUseMaterial();
00117 bool parseMaterialLibrary();
00118 bool parseNewMaterial();
00119 bool parseTexture();
00120 bool parseColorDiffuse();
00121 bool parseObject();
00122
00123
00124
00125 io::stringc Line_, Token_;
00126 u32 CurLineNr_;
00127
00128 s32 TokenFlags_;
00129
00130 std::vector<dim::vector3df> VertexCoords_;
00131 std::vector<dim::point2df> VertexTexCoords_;
00132 std::vector<dim::vector3df> VertexNormals_;
00133
00134 SGroupOBJ* CurGroup_;
00135 std::list<SGroupOBJ> GroupList_;
00136
00137 SMaterialOBJ* CurMaterial_;
00138 MaterialType Materials_;
00139
00140 };
00141
00142
00143 }
00144
00145 }
00146
00147
00148 #endif
00149
00150 #endif
00151
00152
00153
00154