1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.1.0 (2010/03/30)
#ifndef OBJLOADER_H
#define OBJLOADER_H
#include "MtlLoader.h"
class ObjLoader
{
public:
ObjLoader (const string& path, const string& filename);
~ObjLoader ();
enum ErrorCode
{
EC_SUCCESSFUL,
EC_LOGFILE_OPEN_FAILED,
EC_FILE_OPEN_FAILED,
EC_NO_TOKENS,
EC_TOO_FEW_TOKENS,
EC_TOO_MANY_TOKENS,
EC_UNEXPECTED_TOKEN,
EC_NOT_YET_IMPLEMENTED,
EC_FAILED_TO_LOAD_MATERIALS,
EC_FAILED_TO_FIND_MATERIAL,
EC_INVALID_VERTEX,
EC_MAX_ERROR_CODES
};
class Float2
{
public:
float x, y;
};
class Float3
{
public:
float x, y, z;
};
class Vertex
{
public:
Vertex ()
:
PosIndex(-1),
TcdIndex(-1),
NorIndex(-1)
{
}
bool operator< (const Vertex& vertex) const
{
if (PosIndex < vertex.PosIndex)
{
return true;
}
if (PosIndex > vertex.PosIndex)
{
return false;
}
if (TcdIndex < vertex.TcdIndex)
{
return true;
}
if (TcdIndex > vertex.TcdIndex)
{
return false;
}
if (NorIndex < vertex.NorIndex)
{
return true;
}
return false;
}
int PosIndex, TcdIndex, NorIndex;
};
class Face
{
public:
vector<Vertex> Vertices;
};
class Mesh
{
public:
int MtlIndex;
vector<Face> Faces;
};
class Group
{
public:
string Name;
int PosStart, TcdStart, NorStart;
vector<Mesh> Meshes;
};
inline ErrorCode GetCode () const;
inline const vector<MtlLoader::Material>& GetMaterials () const;
inline const vector<Group>& GetGroups () const;
inline const vector<Float3>& GetPositions () const;
inline const vector<Float2>& GetTCoords () const;
inline const vector<Float3>& GetNormals () const;
private:
void GetTokens (const string& line, vector<string>& tokens);
bool GetMaterialLibrary (const string& path,
const vector<string>& tokens);
bool GetDefaultGroup (const vector<string>& tokens);
bool GetPosition (const vector<string>& tokens);
bool GetTCoord (const vector<string>& tokens);
bool GetNormal (const vector<string>& tokens);
bool GetGroup (const vector<string>& tokens);
bool GetMaterialAndMesh (const vector<string>& tokens);
bool GetFace (const vector<string>& tokens);
ErrorCode mCode;
FILE* mLogFile;
vector<MtlLoader::Material> mMaterials;
int mCurrentGroup, mCurrentPos, mCurrentTcd, mCurrentNor;
int mCurrentMtl, mCurrentMesh;
vector<Group> mGroups;
vector<Float3> mPositions;
vector<Float2> mTCoords;
vector<Float3> mNormals;
static const char* msCodeString[EC_MAX_ERROR_CODES];
};
#include "ObjLoader.inl"
#endif
|