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
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OSGOBJSCENEFILETYPE_H_
00040 #define _OSGOBJSCENEFILETYPE_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045 #include <OSGBaseTypes.h>
00046
00047 #include "OSGSceneFileType.h"
00048
00049 #include <map>
00050
00051
00052 OSG_BEGIN_NAMESPACE
00053
00057 class OSG_SYSTEMLIB_DLLMAPPING OBJSceneFileType : public SceneFileType
00058 {
00059
00060 public:
00061
00062
00066 static OBJSceneFileType &the(void);
00067
00069
00073 virtual ~OBJSceneFileType(void);
00074
00076
00080 virtual const Char8 *getName(void) const;
00081
00083
00087 virtual NodePtr read(std::istream &is,
00088 const Char8 *fileNameOrExtension) const;
00089
00091
00095 virtual bool write(const NodePtr &node, std::ostream &os,
00096 const Char8 *fileNameOrExtension) const;
00097
00099
00100 protected:
00101
00102
00106 static const Char8 *_suffixA[];
00107 static OBJSceneFileType _the;
00108
00110
00114 OBJSceneFileType(const Char8 *suffixArray[],
00115 UInt16 suffixByteCount,
00116 bool override,
00117 UInt32 overridePriority,
00118 UInt32 flags);
00119
00120 OBJSceneFileType(const OBJSceneFileType &obj);
00121
00123
00124 private:
00125
00126 typedef SceneFileType Inherited;
00127
00128 enum DataElem
00129 {
00130 UNKNOWN_DE = 0,
00131
00132 VERTEX_DE, VERTEX_TEXTURECOORD_DE, VERTEX_NORMAL_DE,
00133 FACE_DE,
00134
00135 LIB_MTL_DE,
00136 USE_MTL_DE,
00137
00138 GROUP_DE, SMOOTHING_GROUP_DE, OBJECT_DE
00139 };
00140
00141 std::map<std::string, DataElem> _dataElemMap;
00142
00143 enum MaterialElem
00144 {
00145 UNKNOWN_ME = 0,
00146
00147 NEW_MTL_ME,
00148 MTL_DIFFUSE_ME, MTL_AMBIENT_ME, MTL_SPECULAR_ME,
00149 MTL_SHININESS_ME, MTL_ILLUM_ME,
00150 MTL_TRANSPARENCY_ME, MTL_DISSOLVE_ME,
00151 MTL_MAP_KD_ME, MTL_MAP_KA_ME, MTL_MAP_KS_ME,
00152 MTL_REFL_ME
00153 };
00154
00155 std::map<std::string, MaterialElem> _mtlElemMap;
00156
00157 void initElemMap(void);
00158
00159 class Mesh;
00160 friend class Mesh;
00161
00162 class Face;
00163 friend class Face;
00164
00165 struct TiePoint
00166 {
00167 Int32 index[3];
00168 TiePoint( Int32 v = -1, Int32 vt = -1, Int32 vn = -1 )
00169 { index[0] = v; index[1] = vt; index[2] = vn; }
00170 inline void set ( Int32 v = -1, Int32 vt = -1, Int32 vn = -1 )
00171 { index[0] = v; index[1] = vt; index[2] = vn; }
00172 };
00173
00174 struct Face
00175 {
00176 std::vector<TiePoint> tieVec;
00177 };
00178
00179 struct Mesh {
00180 std::string name;
00181 std::list<Face> faceList;
00182 SimpleMaterialPtr mtlPtr;
00183 };
00184
00185
00186 Int32 readMTL (const Char8 *fileName,
00187 std::map<std::string,
00188 SimpleTexturedMaterialPtr> &mtlMap ) const;
00189
00190 void write(const NodePtr &node,
00191 std::ostream &os,
00192 UInt32 &pIndex,
00193 UInt32 &nIndex,
00194 UInt32 &tIndex) const;
00195
00196
00197 void operator =(const OBJSceneFileType &source);
00198 };
00199
00200 typedef OBJSceneFileType* OBJSceneFileTypeP;
00201
00202 OSG_END_NAMESPACE
00203
00204 #define OSGOBJSCENEFILETYPE_HEADER_CVSID "@(#)$Id: OSGOBJSceneFileType.h,v 1.12 2002/02/04 16:08:09 dirk Exp $"
00205
00206 #endif // _OSGOBJSCENEFILETYPE_H_
00207