00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __IFD_Output_h__
00021 #define __IFD_Output_h__
00022
00023 #include "IFD_API.h"
00024 #include <sys/types.h>
00025 #include <iostream.h>
00026 #include <UT/UT_ErrorManager.h>
00027 #include <UT/UT_Signal.h>
00028 #include <UT/UT_SysClone.h>
00029 #include "IFD_Include.h"
00030 #include "IFD_StreamEvent.h"
00031 #include "IFD_Error.h"
00032
00033 class GU_Detail;
00034 class IFD_Scene;
00035 class IFD_CameraParms;
00036 class IFD_ObjectParms;
00037 class IFD_RenderDefinition;
00038 class IFD_RenderStream;
00039
00040 class IFD_API IFD_Output {
00041 public:
00042 IFD_Output();
00043 virtual ~IFD_Output();
00044
00045
00046 virtual const char *renderer() const = 0;
00047
00048 virtual int openMultiFrame(IFD_Scene &scene,
00049 fpreal start, fpreal end, int nframes);
00050 virtual int doSingleFrame(IFD_Scene &scene, float time);
00051 virtual int doField(IFD_Scene &, float time,
00052 const char *fields, float time_inc=0);
00053 virtual int createArchive(IFD_Scene &scene, float time);
00054 virtual int closeMultiFrame(IFD_Scene &scene);
00055
00056
00057
00058 virtual void setObjectParms(IFD_ObjectParms &parms, float now,
00059 IFD_Scene &scene);
00060
00061 void setTargetName(const char *name);
00062 void setTargetVersion(int major, int minor)
00063 {
00064 myTargetVersion = major*1000 + minor;
00065 }
00066 void getTargetVersion(int &major, int &minor) const
00067 {
00068 major = myTargetVersion / 1000;
00069 minor = myTargetVersion % 1000;
00070 }
00071 const char *getTargetName(const char *def=0)
00072 { return myTargetName.isstring()
00073 ? (const char *)myTargetName : def ;
00074 }
00075 int isVersion(int major, int minor) const
00076 {
00077 return myTargetVersion >= major*1000 + minor;
00078 }
00079
00080 IFD_RenderStream *getStream() { return myStream; }
00081
00082 void addSystemError(const char *msg = 0)
00083 { UTaddSystemError(msg); }
00084 void addError(int code, const char *msg = 0)
00085 { UTaddError("IFD", code, msg); }
00086 void addWarning(int code, const char *msg = 0)
00087 { UTaddWarning("IFD", code, msg); }
00088
00089 UT_NotifierImpl<IFD_StreamEvent &>
00090 &getEventNotifier() { return myEventNotifier; }
00091
00092 protected:
00093
00094
00095
00096
00097 int moveDetail(GU_Detail *gdp, float direction);
00098
00099 fpreal computeTimeStep(fpreal start, fpreal end, int nframes)
00100 {
00101 return (end - start) / (fpreal)nframes;
00102 }
00103
00104 ostream *openStream(IFD_Scene &scene, float time);
00105 void closeStream();
00106
00107 void getTimeRange(float &tstart, float &tend, float &fps);
00108 float getFPS() const { return myFPS; }
00109 int isLightUsed(IFD_Scene &scene, int lidx, float now);
00110
00111 void writeIncludeBuffer(ostream &os,
00112 const UT_WorkBuffer &buf);
00113
00114 int myTargetVersion;
00115 UT_String myTargetName;
00116
00117
00118
00119
00120 int getMotionBlur(IFD_Scene &scene, float &shutter,
00121 const IFD_CameraParms &parms, float now,
00122 int num_motion_segments=2) const;
00123 protected:
00124 UT_NotifierImpl<IFD_StreamEvent &> myEventNotifier;
00125 IFD_RenderStream *myStream;
00126 float myFPS;
00127 };
00128
00129 #endif