Blob Blame Raw
#ifndef DRAWABLEMESHIMAGE_H
#define DRAWABLEMESHIMAGE_H

#include <memory>

// TnzExt includes
#include "meshtexturizer.h"

// TnzCore includes
#include "tgldisplaylistsmanager.h"

#undef DVAPI
#undef DVVAR
#ifdef TNZEXT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

//***************************************************************************************
//    DrawableMeshImage definition
//***************************************************************************************

//! DrawableTextureData is a MeshTexturizer::TextureData wrapper that
struct DrawableTextureData {
	MeshTexturizer::TextureData *m_textureData; //!< The wrapped texture data

public:
	DrawableTextureData() {}
	~DrawableTextureData();

private:
	friend class TTexturesStorage;

	int m_texId;	 //!< The texture Id in MeshTexturizer
	int m_dlSpaceId; //!< Object's display lists id
	int m_objIdx;	//!< Object index in the container

private:
	// Not copyable

	DrawableTextureData(const DrawableTextureData &);
	DrawableTextureData &operator=(const DrawableTextureData &);
};

typedef std::shared_ptr<DrawableTextureData> DrawableTextureDataP;

//***************************************************************************************
//    TexturesStorage declaration
//***************************************************************************************

/*!
  \brief    TTexturesStorage is the class responsible for the storage of textures associated with mesh rendering.

  \details  This class deals with textures storage and meshes compilation for drawing purposes.
            An OpenGL texture is typically split into several tiles before being rendered. A texturized mesh is then
            compiled against a texture in order to decide which mesh faces must be rendered with a given texture
            tile.

            The TTextureStorage class uses a QCache to store texture objects up to a maximum memory size, plus all
            the already compiled mesh objects against the stored textures. Whenever a texture loading procedure would
            exceed the maximum textures size, the least accessed stored textures are automatically removed from the
            storage to make space for the newly assigned one.

            Textures can be \a stored only if the OpenGL context they are loaded on has a valid known <I>display lists
            proxy</I> submitted in the TGLDisplayListsManager. In case the OpenGL context does not have a proxy, the
            loaded texture is a temporary, and will be deleted as soon as the returned TexturObject is destroyed
            (so, make sure the associated context is still current at that point).

  \note     TTexturesStorage is thread-safe.

  \sa       The TGLDisplayListsManager class.
*/

class DVAPI TTexturesStorage : private TGLDisplayListsManager::Observer
{
public:
	static TTexturesStorage *instance();

	/*!
    \brief    Stores the specified raster to a group of OpenGL textures, returning a reference
              pointer ensuring the texture survival during its lifetime.

    \warning  This class may keep a copy of the specified texture only for a \b limited
              amount of time, \a if the current context has an associated display lists
              space proxy. Users must always be ready to \a reload the texture in case
              it was not found.
  */
	DrawableTextureDataP loadTexture(const std::string &textureId, const TRaster32P &ras, const TRectD &geometry);

	//! Releases the texture associated with the specified texture id.
	void unloadTexture(const std::string &textureId);

	//! Returns the texture data associated to the specified string identifier.
	DrawableTextureDataP getTextureData(const std::string &textureId);

private:
	TTexturesStorage();
	~TTexturesStorage();

	void onDisplayListDestroyed(int dlSpaceId);
};

#endif // DRAWABLEMESHIMAGE_H