Katana Plug-in APIs 0.1

RenderBase.h

00001 // Copyright (c) 2013 The Foundry Visionmongers Ltd. All Rights Reserved.
00002 
00003 #ifndef FNRENDER_RENDERBASE_H
00004 #define FNRENDER_RENDERBASE_H
00005 
00006 #include <stdlib.h>
00007 
00008 #include "FnAttribute/FnAttribute.h"
00009 
00010 #include "FnPluginSystem/FnPlugin.h"
00011 #include "FnPluginSystem/FnPluginSystem.h"
00012 
00013 #include "FnRender/FnRenderAPI.h"
00014 #include "FnRender/plugin/DiskRenderOutputProcess.h"
00015 #include "FnRender/suite/FnRenderPluginSuite.h"
00016 
00017 #include "FnScenegraphIterator/FnScenegraphIterator.h"
00018 
00019 namespace Foundry
00020 {
00021 namespace Katana
00022 {
00023 namespace Render
00024 {
00051     class FNRENDER_API RenderBase
00052     {
00053     public:
00064         RenderBase(
00065             FNSCENEGRAPHITERATOR_NAMESPACE::FnScenegraphIterator rootIterator,
00066             FnAttribute::GroupAttribute arguments) :
00067                 _rootIterator(rootIterator),
00068                 _arguments(arguments)
00069         {
00070         }
00071         virtual ~RenderBase() {}
00072 
00079         virtual int setup() { return 0; }
00080 
00086         virtual int cleanup() { return 0; }
00087 
00094         virtual void setRootIterator(
00095             FNSCENEGRAPHITERATOR_NAMESPACE::FnScenegraphIterator rootIterator)
00096         {
00097             _rootIterator = rootIterator;
00098         }
00099 
00109         virtual int start() = 0;
00110 
00118         virtual int pause() { return 0; }
00119 
00127         virtual int resume() { return 0; }
00128 
00136         virtual int stop() { return 0; }
00137 
00143         virtual int startLiveEditing() { return 0; }
00144 
00150         virtual int stopLiveEditing() { return 0; }
00151 
00160         virtual int processControlCommand(const std::string & command) { return 0; }
00161 
00192         virtual int queueDataUpdates(FnAttribute::GroupAttribute updateAttribute) { return 0; }
00193 
00206         virtual int applyPendingDataUpdates() { return 0; }
00207 
00216         virtual bool hasPendingDataUpdates() const { return false; }
00217 
00249         virtual void configureDiskRenderOutputProcess(DiskRenderOutputProcess& diskRenderOutputProcess,
00250                                                       const std::string& outputName,
00251                                                       const std::string& outputPath,
00252                                                       const std::string& renderMethodName,
00253                                                       const float& frameTime) const {}
00254 
00255         // non-virtual implementations to do conversions from virtual functions above
00256         FnAttribute::Attribute _configureDiskRenderOutputProcess(const std::string& outputName,
00257                                                     const std::string& outputPath,
00258                                                     const std::string& renderMethodName,
00259                                                     const float& frameTime) const;
00260 
00261         static FnPlugStatus setHost(FnPluginHost* host);
00262         static FnPluginHost* getHost();
00263 
00264         static FnRenderPluginSuite createSuite(FnRenderPluginHandle(*create)(
00265             FnSgIteratorHandle, FnAttributeHandle));
00266         static FnRenderPluginHandle newRenderHandle(RenderBase* renderBase);
00267 
00268         static unsigned int _apiVersion;
00269         static const char*  _apiName;
00270 
00271     protected:
00282         FNSCENEGRAPHITERATOR_NAMESPACE::FnScenegraphIterator
00283         getRootIterator() const { return _rootIterator; }
00284 
00297         std::string getRenderMethodName() const;
00298 
00310         std::string findArgument(const std::string& argumentName, const std::string & defaultValue="") const;
00311 
00322         bool applyRenderThreadsOverride(int& numberOfRenderThreads) const;
00323 
00327         std::string getKatanaBasePath() const { return findArgument("katanaRoot"); }
00328 
00335         std::string getKatanaTempDirectory() const { return findArgument("tempDir"); }
00336 
00344         std::string getKatanaHost() const { return findArgument("host"); }
00345 
00353         float getRenderTime() const;
00354 
00368         bool useRenderPassID() const;
00369 
00378         std::string getRenderOutputFile() const { return findArgument("renderOutputFile"); }
00379 
00391         bool isExpandProceduralActive(bool defaultValue=false) const;
00392 
00398         std::string getRenderPluginDirectory() const { return findArgument("pluginDsoPath"); }
00399 
00405         std::string getEnvironmentVariable(const std::string& name) const;
00406 
00421         template <typename T, typename A>
00422         T getAttrValue(const FnAttribute::Attribute& attr, const T& defaultValue) const
00423         {
00424             A typedAttr = attr;
00425             if(typedAttr.isValid())
00426                 return typedAttr.getValue();
00427 
00428             return defaultValue;
00429         }
00430 
00439         inline std::string getStringAttrValue(const FnAttribute::Attribute& attr, const std::string & defaultValue = "") const
00440         {
00441             return getAttrValue<std::string, FnAttribute::StringAttribute>(attr, defaultValue);
00442         }
00443 
00444     private:
00445         FNSCENEGRAPHITERATOR_NAMESPACE::FnScenegraphIterator _rootIterator;
00446         FnAttribute::GroupAttribute _arguments;
00447 
00448         static FnPluginHost* _host;
00449     };
00453 }
00454 }
00455 }
00456 
00457 namespace FnKat = Foundry::Katana;
00458 
00459 // Plugin Registering Macro.
00460 #define DEFINE_RENDER_PLUGIN(RENDER_CLASS)                               \
00461                                                                          \
00462     FnPlugin RENDER_CLASS##_plugin;                                      \
00463                                                                          \
00464     FnRenderPluginHandle RENDER_CLASS##_create(FnSgIteratorHandle sg,    \
00465                                                FnAttributeHandle args)   \
00466     {                                                                    \
00467         return Foundry::Katana::Render::RenderBase::newRenderHandle(     \
00468                 RENDER_CLASS::create(                                    \
00469                         Foundry::Katana::FnScenegraphIterator(sg),       \
00470                         FnAttribute::Attribute::CreateAndRetain(args))); \
00471     }                                                                    \
00472                                                                          \
00473     FnRenderPluginSuite RENDER_CLASS##_suite =                           \
00474             Foundry::Katana::Render::RenderBase::createSuite(            \
00475                     RENDER_CLASS##_create);                              \
00476                                                                          \
00477     const void* RENDER_CLASS##_getSuite()                                \
00478     {                                                                    \
00479         return &RENDER_CLASS##_suite;                                    \
00480     }
00481 
00482 #endif
 All Classes Functions Variables Typedefs Enumerations Enumerator