Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
#ifndef MESHTEXTURIZER_H
Toshihiro Shimizu 890ddd
#define MESHTEXTURIZER_H
Toshihiro Shimizu 890ddd
Shinya Kitaoka 262a92
#include <memory></memory>
Shinya Kitaoka 262a92
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "traster.h"
Shinya Kitaoka 120a6e
#include "tgl.h"  // OpenGL includes
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// STL includes
Toshihiro Shimizu 890ddd
#include <vector></vector>
Toshihiro Shimizu 890ddd
#include <deque></deque>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TNZEXT_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    MeshTexturizer  declaration
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Shinya Kitaoka 120a6e
  \brief    The MeshTexturizer class acts as a management wrapper to OpenGL
Shinya Kitaoka 120a6e
  texturing
Toshihiro Shimizu 890ddd
            capabilities, in particular concerning texture virtualization.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  \details  The first step in OpenGL texturing requires copying a texture into
Shinya Kitaoka 120a6e
  the video ram
Shinya Kitaoka 120a6e
            (\a VRAM). Now, OpenGL documentation specifies that, although there
Shinya Kitaoka 120a6e
  is no limit
Shinya Kitaoka 120a6e
            to the \a number of allowed textures, there \a are limits to the \b
Shinya Kitaoka 120a6e
  size of said
Shinya Kitaoka 120a6e
            textures, which can be tested by asking OpenGL whether it can
Shinya Kitaoka 120a6e
  accomodate specific
Toshihiro Shimizu 890ddd
            texture requests or not.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
            Technically, the MeshTexturizer class acts as a virtualization
Shinya Kitaoka 120a6e
  manager that can be
Shinya Kitaoka 120a6e
            used to allow texturization with arbitrary texture sizes. The
Shinya Kitaoka 120a6e
  manager accepts raster
Toshihiro Shimizu 890ddd
            images that are cut up into tiles and bound to VRAM.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
            Please, observe that the number of texture objects is typically not
Shinya Kitaoka 120a6e
  an issue, as
Shinya Kitaoka 120a6e
            OpenGL is able to swap texture objects between RAM and VRAM,
Shinya Kitaoka 120a6e
  depending on which
Shinya Kitaoka 120a6e
            textures have been used most frequently. In other words, since
Shinya Kitaoka 120a6e
  MeshTexturizer ensures
Shinya Kitaoka 120a6e
            the granularity required by OpenGL, textures can be used until the
Shinya Kitaoka 120a6e
  process runs out of
Toshihiro Shimizu 890ddd
            memory - of course, swapping can be a source of slowdowns, though.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  \remark   Subdivision into tiles is designed to work for both premultiplied \a
Shinya Kitaoka 120a6e
  and
Toshihiro Shimizu 890ddd
            non-premultiplied textures.
Toshihiro Shimizu 890ddd
  \remark   MeshTexturizer instances are thread-safe.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI MeshTexturizer {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  struct TextureData;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  enum PremultMode     //! Premultiplication specifier for texture binding.
Shinya Kitaoka 120a6e
  { NONPREMULTIPLIED,  //!< Texture is not premultiplied.
Shinya Kitaoka 120a6e
    PREMULTIPLIED,     //!< Texture is premultiplied.
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  MeshTexturizer();
Shinya Kitaoka 120a6e
  ~MeshTexturizer();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \details  The bindTexture() function is used to specify a 32-bit fullcolor
Shinya Kitaoka 120a6e
          raster as a texture to be used for mesh rendering. The supplied
Shinya Kitaoka 120a6e
          geometry rect defines its position with respect to compiled meshes.
Shinya Kitaoka 120a6e
\remark   The premultiplication specifier is used to tell the texturizer how
Shinya Kitaoka 120a6e
          to add a proper transparent border surrounding texture tiles.
Shinya Kitaoka 120a6e
          This border is essential to draw transparent pixels beyond a texture
Shinya Kitaoka 120a6e
          tile's content.
Shinya Kitaoka 120a6e
\returns  The internal id used to reference to the input raster. */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int bindTexture(
Shinya Kitaoka 120a6e
      const TRaster32P &ras,
Shinya Kitaoka 120a6e
      const TRectD
Shinya Kitaoka 120a6e
          &geometry,  //!< Moves a \a copy of the supplied raster image to VRAM,
Shinya Kitaoka 120a6e
      PremultMode premultiplyMode =
Shinya Kitaoka 120a6e
          NONPREMULTIPLIED);  //!  and assigns an identification number to it.
Shinya Kitaoka 120a6e
                              //!  \param ras  Texture to be copied to VRAM.
Shinya Kitaoka 120a6e
                              //!  \param geometry  The texture's geometry in
Shinya Kitaoka 120a6e
                              //!  the world - with respect to compiled meshes.
Shinya Kitaoka 120a6e
                              //!  \param premultiplyMode  Specified whether ras
Shinya Kitaoka 120a6e
                              //!  is to be intended premultiplied or not.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \warning  The pointer returned by getTextureData() is owned by this
Shinya Kitaoka 120a6e
     class -
Shinya Kitaoka 120a6e
          it must not be deleted. */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TextureData *getTextureData(
Shinya Kitaoka 120a6e
      int textureId);  //!< Retrieves the texture data built from a previously
Shinya Kitaoka 120a6e
  //!  bound texture image.                                       \param
Shinya Kitaoka 120a6e
  //!  textureId  Identifier of the texture to be retrieved  \returns See
Shinya Kitaoka 120a6e
  //!  summary.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \details  The texture identifier specified to rebindTexture() is retained,
Shinya Kitaoka 120a6e
          and the effect is that of an unbindTexture() - bindTexture() combo.
Shinya Kitaoka 120a6e
\note     Pre-compiled mesh data against the old texture can be retained \b if
Shinya Kitaoka 120a6e
          the newly supplied texture size and geometry are the \b same as the
Shinya Kitaoka 120a6e
old one.  */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void rebindTexture(
Shinya Kitaoka 120a6e
      int textureId, const TRaster32P &ras,
Shinya Kitaoka 120a6e
      const TRectD
Shinya Kitaoka 120a6e
          &geometry,  //!< Rebinds the image bound to the specified texture
Shinya Kitaoka 120a6e
      PremultMode premultiplyMode = NONPREMULTIPLIED);  //!  id to a new image.
Shinya Kitaoka 120a6e
  void unbindTexture(int textureId);  //!< Deletes the texture associated to the
Shinya Kitaoka 38fd86
                                      //! passed id.           \param textureId
Shinya Kitaoka 38fd86
  //! Identifier of the texture to be
Shinya Kitaoka 38fd86
  //! unbound.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  class Imp;
Shinya Kitaoka 120a6e
  std::unique_ptr<imp> m_imp;</imp>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // Not copyable
Shinya Kitaoka 120a6e
  MeshTexturizer(const MeshTexturizer &);
Shinya Kitaoka 120a6e
  MeshTexturizer &operator=(const MeshTexturizer &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    MeshTexturizer:::CompiledData  definition
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    The MeshTexturizer-owned data about a texture.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  \details  The purpose of MeshTexturizer is that of storing in VRAM a set of
Shinya Kitaoka 120a6e
  textures
Shinya Kitaoka 120a6e
            cut up into tiles. This struture holds the data about the
Shinya Kitaoka 120a6e
  end-product of
Toshihiro Shimizu 890ddd
            texture loading into a MeshTexturizer instance.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct MeshTexturizer::TextureData {
Shinya Kitaoka 120a6e
  struct TileData  //!  Data structure for a texture tile.
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    GLuint m_textureId;     //!< OpenGL texture identifier.
Shinya Kitaoka 120a6e
    TRectD m_tileGeometry;  //!< The tile's world geometry.
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TRectD m_geom;  //!< The original texture's world geometry.
Shinya Kitaoka 120a6e
  std::vector<tiledata></tiledata>
Shinya Kitaoka 120a6e
      m_tileDatas;  //!< The texture tiles the original texture was split into.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TextureData() {}
Shinya Kitaoka 120a6e
  TextureData(const TRectD &geom) : m_geom(geom) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ~TextureData() {
Shinya Kitaoka 120a6e
    int t, tilesCount = m_tileDatas.size();
Shinya Kitaoka 120a6e
    for (t = 0; t < tilesCount; ++t)
Shinya Kitaoka 120a6e
      glDeleteTextures(1, &m_tileDatas[t].m_textureId);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // Not copyable
Shinya Kitaoka 120a6e
  TextureData(const TextureData &);
Shinya Kitaoka 120a6e
  TextureData &operator=(const TextureData &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // MESHTEXTURIZER_H