Go to the documentation of this file.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 #if !defined(LoadOBJ_INCLUDE_ONCE)
00033 #define LoadOBJ_INCLUDE_ONCE
00034
00035 #include <vlCore/String.hpp>
00036 #include <vlGraphics/Geometry.hpp>
00037 #include <vlCore/ResourceLoadWriter.hpp>
00038 #include <vlCore/ResourceDatabase.hpp>
00039 #include <map>
00040
00041 namespace vl
00042 {
00043 class VirtualFile;
00044
00045
00047 VLGRAPHICS_EXPORT ref<ResourceDatabase> loadOBJ( const String& path );
00048
00050 VLGRAPHICS_EXPORT ref<ResourceDatabase> loadOBJ( VirtualFile* file );
00051
00052
00053
00057 class LoadWriterOBJ: public ResourceLoadWriter
00058 {
00059 public:
00060 virtual const char* className() { return "vl::LoadWriterOBJ"; }
00061 LoadWriterOBJ(): ResourceLoadWriter("|obj|", "|obj|") {}
00062
00063 void registerLoadWriter();
00064
00065 ref<ResourceDatabase> loadResource(const String& path) const
00066 {
00067 return loadOBJ(path);
00068 }
00069
00070 ref<ResourceDatabase> loadResource(VirtualFile* file) const
00071 {
00072 return loadOBJ(file);
00073 }
00074
00076 bool writeResource(const String& , ResourceDatabase* ) const
00077 {
00078 return false;
00079 }
00080
00082 bool writeResource(VirtualFile* , ResourceDatabase* ) const
00083 {
00084 return false;
00085 }
00086 };
00087
00088
00089
00091 class VLGRAPHICS_EXPORT ObjTexture
00092 {
00093 public:
00094 ObjTexture();
00095 const ObjTexture& parseLine(const String& line, const String& file);
00096 bool valid() const { return !mFileName.empty(); }
00098 void print();
00099
00101 const String& path() const { return mFileName; }
00103 bool blendU() const { return mBlendU; }
00105 bool blendV() const { return mBlendV; }
00107 bool cc() const { return mCC; }
00109 bool clamp() const { return mClamp; }
00111 float mm_Base() const { return mMM_Base; }
00113 float mm_Gain() const { return mMM_Gain; }
00115 const fvec3& o_UVW() const { return mO_UVW; }
00117 const fvec3& s_UVW() const { return mS_UVW; }
00119 const fvec3& t_UVW() const { return mT_UVW; }
00121 float texres_Value() const { return mTexres_Value; }
00123 char imfchan() const { return mImfchan; }
00125 float bm() const { return mBM; }
00126
00128 void setPath(const String& filename) { mFileName = filename; }
00130 void setBlendU(bool on) { mBlendU = on; }
00132 void setBlendV(bool on) { mBlendV = on; }
00134 void setCC(bool on) { mCC = on; }
00136 void setClamp(bool on) { mClamp = on; }
00138 void setMM_Base(float base) { mMM_Base = base; }
00140 void setMM_Gain(float gain) { mMM_Gain = gain; }
00142 void setO_UVW(const fvec3& o_uvw) { mO_UVW = o_uvw; }
00144 void setS_UVW(const fvec3& s_uvw) { mS_UVW = s_uvw; }
00146 void setT_UVW(const fvec3& t_uvw) { mT_UVW = t_uvw; }
00148 void setTexres_Value(float value) { mTexres_Value = value; }
00150 void setImfchan(char val) { mImfchan = val; }
00152 void setBM(float bm) { mBM = bm; }
00153
00154 protected:
00156 String mFileName;
00158 bool mBlendU;
00160 bool mBlendV;
00162 bool mCC;
00164 bool mClamp;
00166 float mMM_Base;
00168 float mMM_Gain;
00170 fvec3 mO_UVW;
00172 fvec3 mS_UVW;
00174 fvec3 mT_UVW;
00176 float mTexres_Value;
00178 char mImfchan;
00180 float mBM;
00181 };
00182
00183
00184
00186 class ObjMaterial: public Object
00187 {
00188 public:
00189 virtual const char* className() { return "vl::ObjMaterial"; }
00190
00191 ObjMaterial(): mTr(1.0f), mNs(0.0f), mIllum(0), mNi(1.0f) {}
00192
00194 const fvec3& ka() const { return mKa; }
00196 const fvec3& kd() const { return mKd; }
00198 const fvec3& ks() const { return mKs; }
00200 const fvec3& ke() const { return mKe; }
00202 float tr() const { return mTr; }
00204 float ns() const { return mNs; }
00206 int illum() const { return mIllum; }
00208 float ni() const { return mNi; }
00210 const ObjTexture& map_Kd() const { return mMap_Kd; }
00212 const ObjTexture& map_Ka() const { return mMap_Ka; }
00214 const ObjTexture& map_Ks() const { return mMap_Ks; }
00216 const ObjTexture& map_Ns() const { return mMap_Ns; }
00218 const ObjTexture& map_d() const { return mMap_d; }
00220 const ObjTexture& map_Decal() const { return mMap_Decal; }
00222 const ObjTexture& map_Disp() const { return mMap_Disp; }
00224 const ObjTexture& map_Bump() const { return mMap_Bump; }
00225
00227 void setKa(const fvec3& ka) { mKa = ka; }
00229 void setKd(const fvec3& kd) { mKd = kd; }
00231 void setKs(const fvec3& ks) { mKs = ks; }
00233 void setKe(const fvec3& ke) { mKe = ke; }
00235 void setTr(float tr) { mTr = tr; }
00237 void setNs(float ns) { mNs = ns; }
00239 void setIllum(int illum) { mIllum = illum; }
00241 void setNi(float ni) { mNi = ni; }
00243 void setMap_Kd(const ObjTexture& map_kd) { mMap_Kd = map_kd; }
00245 void setMap_Ka(const ObjTexture& map_ka) { mMap_Ka = map_ka; }
00247 void setMap_Ks(const ObjTexture& map_ks) { mMap_Ks = map_ks; }
00249 void setMap_Ns(const ObjTexture& map_ns) { mMap_Ns = map_ns; }
00251 void setMap_d(const ObjTexture& map_d) { mMap_d = map_d; }
00253 void setMap_Decal(const ObjTexture& map_decal) { mMap_Decal = map_decal; }
00255 void setMap_Disp(const ObjTexture& map_disp) { mMap_Disp = map_disp; }
00257 void setMap_Bump(const ObjTexture& map_bump) { mMap_Bump = map_bump; }
00258
00259 protected:
00261 fvec3 mKa;
00263 fvec3 mKd;
00265 fvec3 mKs;
00267 fvec3 mKe;
00269 float mTr;
00271 float mNs;
00273 int mIllum;
00275 float mNi;
00277 ObjTexture mMap_Kd;
00279 ObjTexture mMap_Ka;
00281 ObjTexture mMap_Ks;
00283 ObjTexture mMap_Ns;
00285 ObjTexture mMap_d;
00287 ObjTexture mMap_Decal;
00289 ObjTexture mMap_Disp;
00291 ObjTexture mMap_Bump;
00292 };
00293
00294
00295
00297 class ObjMesh: public Object
00298 {
00299 public:
00300 virtual const char* className() { return "vl::ObjMesh"; }
00301
00303 void setMaterial(ObjMaterial* mat) { mMaterial = mat; }
00304
00306 const ObjMaterial* material() const { return mMaterial.get(); }
00308 const std::vector<int>& facePositionIndex() const { return mFace_icoords; }
00310 const std::vector<int>& faceNormalIndex() const { return mFace_inormals; }
00312 const std::vector<int>& faceTexCoordIndex() const { return mFace_itexcoords; }
00315 const std::vector<int>& face_type() const { return mFace_type; }
00316
00318 ObjMaterial* material() { return mMaterial.get(); }
00320 std::vector<int>& facePositionIndex() { return mFace_icoords; }
00322 std::vector<int>& faceNormalIndex() { return mFace_inormals; }
00324 std::vector<int>& faceTexCoordIndex() { return mFace_itexcoords; }
00327 std::vector<int>& face_type() { return mFace_type; }
00328
00329 protected:
00330 ref<ObjMaterial> mMaterial;
00331 std::vector<int> mFace_icoords;
00332 std::vector<int> mFace_inormals;
00333 std::vector<int> mFace_itexcoords;
00334 std::vector<int> mFace_type;
00335 };
00336
00337
00338
00340 class ObjLoader
00341 {
00342 public:
00343 const std::vector<fvec4>& vertexArray() const { return mCoords; }
00344 const std::vector<fvec3>& normalArray() const { return mNormals; }
00345 const std::vector<fvec3>& texCoordsArray() const { return mTexCoords; }
00346 const std::map< std::string, ref<ObjMaterial> >& materials() const { return mMaterials; }
00347 const std::vector< ref<ObjMesh> >& meshes() const { return mMeshes; }
00348
00349 std::vector<fvec4>& vertexArray() { return mCoords; }
00350 std::vector<fvec3>& normalArray() { return mNormals; }
00351 std::vector<fvec3>& texCoordsArray() { return mTexCoords; }
00352 std::map< std::string, ref<ObjMaterial> >& materials() { return mMaterials; }
00353 std::vector< ref<ObjMesh> >& meshes() { return mMeshes; }
00354
00357 ref<ResourceDatabase> loadOBJ( VirtualFile* file );
00358
00362 void loadObjMaterials(VirtualFile* file, std::vector<ObjMaterial>& materials );
00363
00364 protected:
00365 std::vector<fvec4> mCoords;
00366 std::vector<fvec3> mNormals;
00367 std::vector<fvec3> mTexCoords;
00368 std::map< std::string, ref<ObjMaterial> > mMaterials;
00369 std::vector< ref<ObjMesh> > mMeshes;
00370 };
00371
00372 }
00373
00374 #endif