Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TRENDERRESOURCEMANAGER_INCLUDED
Toshihiro Shimizu 890ddd
#define TRENDERRESOURCEMANAGER_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TFX_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
Toshihiro Shimizu 890ddd
class TRenderer;
Toshihiro Shimizu 890ddd
class TRenderResourceManager;
Toshihiro Shimizu 890ddd
class TRenderResourceManagerGenerator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=================================
Toshihiro Shimizu 890ddd
//    Render Resource Managers
Toshihiro Shimizu 890ddd
//---------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
The TRenderResourceManager is a base class used to develop resource
Toshihiro Shimizu 890ddd
handlers for Toonz rendering contexts.
Toshihiro Shimizu 890ddd
\a Resources are hereby intended as data which possess special scope and
Toshihiro Shimizu 890ddd
duration with respect to one or more rendering processes. A most notable
Toshihiro Shimizu 890ddd
example of this is the internal Fxs cache, which is specialized to
Toshihiro Shimizu 890ddd
maintain a group of intermediate rendered tiles which may be shared in input
Toshihiro Shimizu 890ddd
by multiple fxs.
Toshihiro Shimizu 890ddd
\n \n
Toshihiro Shimizu 890ddd
Creation of a resource manager requires the implementation of both the
Toshihiro Shimizu 890ddd
manager itself, and that of a TRenderResourceManagerGenerator class which
Toshihiro Shimizu 890ddd
is used internally to allocate manager instances at the most appropriate times.
Toshihiro Shimizu 890ddd
The manager's generator needs to be instanced at  file scope <\b> to
Toshihiro Shimizu 890ddd
be correctly registered by Toonz.
Toshihiro Shimizu 890ddd
\n \n
Toshihiro Shimizu 890ddd
Observe that the default scope of a resource manager is limited to a TRenderer
Toshihiro Shimizu 890ddd
instance; specifically meaning that the swatch viewer, preview fx command,
Toshihiro Shimizu 890ddd
camstand preview and render/preview commands build different managers.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class TRenderResourceManager {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TRenderResourceManager() {}
Shinya Kitaoka 120a6e
  virtual ~TRenderResourceManager() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void onRenderInstanceStart(unsigned long id) {}
Shinya Kitaoka 120a6e
  virtual void onRenderInstanceEnd(unsigned long id) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void onRenderFrameStart(double f) {}
Shinya Kitaoka 120a6e
  virtual void onRenderFrameEnd(double f) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void onRenderStatusStart(int renderStatus) {}
Shinya Kitaoka 120a6e
  virtual void onRenderStatusEnd(int renderStatus) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual bool renderHasOwnership() { return true; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================
Toshihiro Shimizu 890ddd
//    Render Resource Manager Generators
Toshihiro Shimizu 890ddd
//-------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
The TRenderResourceManagerGenerator class is used to construct resource managers
Toshihiro Shimizu 890ddd
that will be used by TRenderers.
Toshihiro Shimizu 890ddd
Please refer to the TRenderResourceManager documentation for the details.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
\note Resource managers may be constructed with a  render instance <\i> scope
Shinya Kitaoka 120a6e
rather
Shinya Kitaoka 120a6e
than the default render context (ie TRenderer) scope. This can be achieved by
Shinya Kitaoka 120a6e
passing
Toshihiro Shimizu 890ddd
\c true at the generator's constructor, proving especially useful considering
Shinya Kitaoka 120a6e
that the same TRenderer may virtually start multiple render instances at the
Shinya Kitaoka 120a6e
same time.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI TRenderResourceManagerGenerator {
Shinya Kitaoka 120a6e
  int m_managerIndex;
Shinya Kitaoka 120a6e
  bool m_instanceScope;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TRenderResourceManagerGenerator(bool renderInstanceScope = false);
Shinya Kitaoka 120a6e
  ~TRenderResourceManagerGenerator() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getGeneratorIndex() const { return m_managerIndex; }
Shinya Kitaoka 120a6e
  static std::vector<trenderresourcemanagergenerator *=""> &generators();</trenderresourcemanagergenerator>
Shinya Kitaoka 120a6e
  static std::vector<trenderresourcemanagergenerator *=""> &generators(</trenderresourcemanagergenerator>
Shinya Kitaoka 120a6e
      bool instanceScope);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual TRenderResourceManager *operator()(void) = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool hasInstanceScope() const { return m_instanceScope; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRenderResourceManager *getManager(const TRenderer &renderer) const;
Shinya Kitaoka 120a6e
  TRenderResourceManager *getManager(unsigned long renderId) const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================
Toshihiro Shimizu 890ddd
//    Declaration macros
Toshihiro Shimizu 890ddd
//---------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!  \def MANAGER_DECLARATION(managerClass)
Toshihiro Shimizu 890ddd
Declares a TRenderResourceManager class, it must be used inside the manager
Toshihiro Shimizu 890ddd
definition.
Toshihiro Shimizu 890ddd
For example:
Toshihiro Shimizu 890ddd
\code
Shinya Kitaoka d1f6c4
class MyManager final : public TRenderResourceManager
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  T_RENDER_RESOURCE_MANAGER
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  ...
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
\endcode
Toshihiro Shimizu 890ddd
In particular, this macro is used to decorate the manager definition with the
Toshihiro Shimizu 890ddd
static method \c gen(), which can be used to access the manager's generator.
Toshihiro Shimizu 890ddd
The method declaration is:
Toshihiro Shimizu 890ddd
\code
Toshihiro Shimizu 890ddd
static TRenderResourceManagerGenerator* gen();
Toshihiro Shimizu 890ddd
\endcode
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#define T_RENDER_RESOURCE_MANAGER                                              \
Shinya Kitaoka 120a6e
  \
Shinya Kitaoka 120a6e
public:                                                                        \
Shinya Kitaoka 120a6e
  static TRenderResourceManagerGenerator *gen();                               \
Shinya Kitaoka 120a6e
  static TRenderResourceManagerGenerator *deps();                              \
Shinya Kitaoka 120a6e
  \
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!  \def MANAGER_FILESCOPE_DECLARATION(managerClass, generatorClass)
Toshihiro Shimizu 890ddd
This macro must be used at file scope to bind the manager to its generator
Toshihiro Shimizu 890ddd
instance - just place it after the generator definition.
Toshihiro Shimizu 890ddd
\note In case the manager is dependant on some other manager, use the
Toshihiro Shimizu 890ddd
\c MANAGER_FILESCOPE_DECLARATION_DEP macro instead.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#define MANAGER_FILESCOPE_DECLARATION(managerClass, generatorClass)            \
Shinya Kitaoka 120a6e
                                                                               \
Shinya Kitaoka 120a6e
  TRenderResourceManagerGenerator *managerClass::gen() {                       \
Shinya Kitaoka 120a6e
    static generatorClass theInstance;                                         \
Shinya Kitaoka 120a6e
    return &theInstance;                                                       \
Shinya Kitaoka 120a6e
  }                                                                            \
Shinya Kitaoka 120a6e
  TRenderResourceManagerGenerator *managerClass::deps() {                      \
Shinya Kitaoka 120a6e
    return managerClass::gen();                                                \
Shinya Kitaoka 120a6e
  }                                                                            \
Shinya Kitaoka 120a6e
                                                                               \
Shinya Kitaoka 120a6e
  namespace {                                                                  \
Shinya Kitaoka 120a6e
  generatorClass *generatorClass##Instance =                                   \
Shinya Kitaoka 120a6e
      (generatorClass *)managerClass::deps();                                  \
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*!  \def MANAGER_FILESCOPE_DECLARATION_DEP(managerClass, generatorClass,
Shinya Kitaoka 120a6e
depsList)
Shinya Kitaoka 120a6e
A variation of the MANAGER_FILESCOPE_DECLARATION macro used to declare
Shinya Kitaoka 120a6e
dependencies between
Shinya Kitaoka 120a6e
resource managers. A manager always receives start notifications \a after those
Shinya Kitaoka 120a6e
from which
Shinya Kitaoka 120a6e
it depends, and viceversa for end notifications. The same applies for
Shinya Kitaoka 120a6e
constructors and destructors.
Toshihiro Shimizu 890ddd
\n \n
Shinya Kitaoka 120a6e
The dependencies declarations list is a sequence of static \c
Shinya Kitaoka 120a6e
<dependencyresourcemanager>::deps()</dependencyresourcemanager>
Toshihiro Shimizu 890ddd
calls separated by a comma.
Toshihiro Shimizu 890ddd
Here is an example:
Toshihiro Shimizu 890ddd
\code
Toshihiro Shimizu 890ddd
MANAGER_FILESCOPE_DECLARATION_DEP(
Shinya Kitaoka 120a6e
  MyResourceManager,
Toshihiro Shimizu 890ddd
  MyResourceManagerGenerator,
Toshihiro Shimizu 890ddd
  TPredictiveCacheManager::deps(); TOfflineGLManager::deps(); \\etc...
Toshihiro Shimizu 890ddd
)
Toshihiro Shimizu 890ddd
\endcode
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#define MANAGER_FILESCOPE_DECLARATION_DEP(managerClass, generatorClass,        \
Shinya Kitaoka 120a6e
                                          depsList)                            \
Shinya Kitaoka 120a6e
                                                                               \
Shinya Kitaoka 120a6e
  TRenderResourceManagerGenerator *managerClass::gen() {                       \
Shinya Kitaoka 120a6e
    static generatorClass theInstance;                                         \
Shinya Kitaoka 120a6e
    return &theInstance;                                                       \
Shinya Kitaoka 120a6e
  }                                                                            \
Shinya Kitaoka 120a6e
  TRenderResourceManagerGenerator *managerClass::deps() {                      \
Shinya Kitaoka 120a6e
    depsList;                                                                  \
Shinya Kitaoka 120a6e
    return managerClass::gen();                                                \
Shinya Kitaoka 120a6e
  }                                                                            \
Shinya Kitaoka 120a6e
                                                                               \
Shinya Kitaoka 120a6e
  namespace {                                                                  \
Shinya Kitaoka 120a6e
  generatorClass *generatorClass##Instance =                                   \
Shinya Kitaoka 120a6e
      (generatorClass *)managerClass::deps();                                  \
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // TRENDERRESOURCEMANAGER_INCLUDED