texmanager.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // texmanager.cpp
  2. //
  3. // Copyright (C) 2001 Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include "celestia.h"
  10. #include <celutil/debug.h>
  11. #include <iostream>
  12. #include <fstream>
  13. #include "multitexture.h"
  14. #include "texmanager.h"
  15. using namespace std;
  16. static TextureManager* textureManager = NULL;
  17. static const char *directories[]=
  18. {
  19.     "/lores/",
  20.     "/medres/",
  21.     "/hires/"
  22. };
  23. TextureManager* GetTextureManager()
  24. {
  25.     if (textureManager == NULL)
  26.         textureManager = new TextureManager("textures");
  27.     return textureManager;
  28. }
  29. static string resolveWildcard(const string& filename)
  30. {
  31.     string base(filename, 0, filename.length() - 1);
  32.     string pngfile = base + "png";
  33.     {
  34.         ifstream in(pngfile.c_str());
  35.         if (in.good())
  36.             return pngfile;
  37.     }
  38.     string jpgfile = base + "jpg";
  39.     {
  40.         ifstream in(jpgfile.c_str());
  41.         if (in.good())
  42.             return jpgfile;
  43.     }
  44.     string ddsfile = base + "dds";
  45.     {
  46.         ifstream in(ddsfile.c_str());
  47.         if (in.good())
  48.             return ddsfile;
  49.     }
  50.     string dxt5file = base + "dxt5nm";
  51.     {
  52.         ifstream in(dxt5file.c_str());
  53.         if (in.good())
  54.             return dxt5file;
  55.     }
  56.     string ctxfile = base + "ctx";
  57.     {
  58.         ifstream in(ctxfile.c_str());
  59.         if (in.good())
  60.             return ctxfile;
  61.     }
  62.     return "";
  63. }
  64. string TextureInfo::resolve(const string& baseDir)
  65. {
  66.     bool wildcard = false;
  67.     if (!source.empty() && source.at(source.length() - 1) == '*')
  68.         wildcard = true;
  69.     if (!path.empty())
  70.     {
  71.         string filename = path + "/textures" + directories[resolution] + source;
  72.         // cout << "Resolve: testing [" << filename << "]n";
  73.         if (wildcard)
  74.         {
  75.             filename = resolveWildcard(filename);
  76.             if (!filename.empty())
  77.                 return filename;
  78.         }
  79.         else
  80.         {
  81.             ifstream in(filename.c_str());
  82.             if (in.good())
  83.                 return filename;
  84.         }
  85.     }
  86.     string filename = baseDir + directories[resolution] + source;
  87.     if (wildcard)
  88.     {
  89.         string matched = resolveWildcard(filename);
  90.         if (matched.empty())
  91.             return filename; // . . . for lack of any better way to handle it.
  92.         else
  93.             return matched;
  94.     }
  95.     else
  96.     {
  97.         return filename;
  98.     }
  99. }
  100. Texture* TextureInfo::load(const string& name)
  101. {
  102.     Texture::AddressMode addressMode = Texture::EdgeClamp;
  103.     Texture::MipMapMode mipMode = Texture::DefaultMipMaps;
  104.     if (flags & WrapTexture)
  105.         addressMode = Texture::Wrap;
  106.     else if (flags & BorderClamp)
  107.         addressMode = Texture::BorderClamp;
  108.     if (flags & NoMipMaps)
  109.         mipMode = Texture::NoMipMaps;
  110.     else if (flags & AutoMipMaps)
  111.         mipMode = Texture::AutoMipMaps;
  112.     if (bumpHeight == 0.0f)
  113.     {
  114.         DPRINTF(0, "Loading texture: %sn", name.c_str());
  115.         // cout << "Loading texture: " << name << 'n';
  116.         return LoadTextureFromFile(name, addressMode, mipMode);
  117.     }
  118.     else
  119.     {
  120.         DPRINTF(0, "Loading bump map: %sn", name.c_str());
  121.         // cout << "Loading texture: " << name << 'n';
  122.         return LoadHeightMapFromFile(name, bumpHeight, addressMode);
  123.     }
  124.     return NULL;
  125. }