1 ////////////////////////////////////////////////////////////////////// 2 // 3 // Pixie 4 // 5 // Copyright � 1999 - 2003, Okan Arikan 6 // 7 // Contact: okan@cs.utexas.edu 8 // 9 // This library is free software; you can redistribute it and/or 10 // modify it under the terms of the GNU Lesser General Public 11 // License as published by the Free Software Foundation; either 12 // version 2.1 of the License, or (at your option) any later version. 13 // 14 // This library is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 // Lesser General Public License for more details. 18 // 19 // You should have received a copy of the GNU Lesser General Public 20 // License along with this library; if not, write to the Free Software 21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 // 23 /////////////////////////////////////////////////////////////////////// 24 /////////////////////////////////////////////////////////////////////// 25 // 26 // File : ribOut.h 27 // Classes : CRibOut 28 // Description : 29 // 30 //////////////////////////////////////////////////////////////////////// 31 #ifndef RIBOUT_H 32 #define RIBOUT_H 33 34 #include "common/global.h" // The global header file 35 #include "common/containers.h" 36 #include "riInterface.h" 37 #include "ri_config.h" 38 39 #ifdef HAVE_ZLIB 40 #include <zlib.h> 41 #endif 42 43 class CVariable; 44 45 /////////////////////////////////////////////////////////////////////// 46 // Class : CRibOut 47 // Description : This class implements a RIB file output 48 // Comments : 49 class CRibOut : public CRiInterface { 50 51 /////////////////////////////////////////////////////////////////////// 52 // Class : CRibAttributes 53 // Description : The attributes holder for the RIB file output 54 // Comments : 55 class CRibAttributes { 56 public: 57 CRibAttributes(); 58 CRibAttributes(CRibAttributes *); 59 ~CRibAttributes(); 60 61 int uStep,vStep; 62 CRibAttributes *next; 63 }; 64 65 66 public: 67 CRibOut(const char *); 68 CRibOut(FILE *); 69 virtual ~CRibOut(); 70 71 virtual void RiDeclare(const char *,const char *); 72 73 virtual void RiFrameBegin(int); 74 virtual void RiFrameEnd(void); 75 virtual void RiWorldBegin(void); 76 virtual void RiWorldEnd(void); 77 78 virtual void RiFormat(int xres,int yres,float aspect); 79 virtual void RiFrameAspectRatio(float aspect); 80 virtual void RiScreenWindow(float left,float right,float bot,float top); 81 virtual void RiCropWindow(float xmin,float xmax,float ymin,float ymax); 82 virtual void RiProjectionV(const char *name,int n,const char *tokens[],const void *params[]); 83 virtual void RiClipping(float hither,float yon); 84 virtual void RiClippingPlane(float x,float y,float z,float nx,float ny,float nz); 85 virtual void RiDepthOfField(float fstop,float focallength,float focaldistance); 86 virtual void RiShutter(float smin,float smax); 87 88 virtual void RiPixelVariance(float variation); 89 virtual void RiPixelSamples(float xsamples,float ysamples); 90 virtual void RiPixelFilter(float (*function)(float,float,float,float),float xwidth,float ywidth); 91 virtual void RiExposure(float gain,float gamma); 92 virtual void RiImagerV(const char *name,int n,const char *tokens[],const void *params[]); 93 virtual void RiQuantize(const char * type,int one,int qmin,int qmax,float ampl); 94 virtual void RiDisplayV(const char *name,const char * type,const char * mode,int n,const char *tokens[],const void *params[]); 95 virtual void RiCustomDisplayV(const char *name, RtToken mode, RtDisplayStartFunction, RtDisplayDataFunction, RtDisplayFinishFunction, RtInt n, RtToken tokens[], RtPointer params[]); 96 virtual void RiDisplayChannelV(const char * channel,int n,const char *tokens[],const void *params[]); 97 98 virtual void RiHiderV(const char * type,int n,const char *tokens[],const void *params[]); 99 virtual void RiColorSamples(int N,float *nRGB,float *RGBn); 100 virtual void RiRelativeDetail(float relativedetail); 101 virtual void RiOptionV(const char *name,int n,const char *tokens[],const void *params[]); 102 103 virtual void RiAttributeBegin(void); 104 virtual void RiAttributeEnd(void); 105 virtual void RiColor(float *Cs); 106 virtual void RiOpacity(float *Cs); 107 virtual void RiTextureCoordinates(float s1,float t1,float s2,float t2,float s3,float t3,float s4,float t4); 108 109 virtual void *RiLightSourceV(const char *name,int n,const char *tokens[],const void *params[]); 110 virtual void *RiAreaLightSourceV(const char *name,int n,const char *tokens[],const void *params[]); 111 112 virtual void RiIlluminate(const void *light,int onoff); 113 virtual void RiSurfaceV(const char *name,int n,const char *tokens[],const void *params[]); 114 virtual void RiAtmosphereV(const char *name,int n,const char *tokens[],const void *params[]); 115 virtual void RiInteriorV(const char *name,int n,const char *tokens[],const void *params[]); 116 virtual void RiExteriorV(const char *name,int n,const char *tokens[],const void *params[]); 117 virtual void RiShadingRate(float size); 118 virtual void RiShadingInterpolation(const char * type); 119 virtual void RiMatte(int onoff); 120 121 virtual void RiBound(float *bound); 122 virtual void RiDetail(float *bound); 123 virtual void RiDetailRange(float minvis,float lowtran,float uptran,float maxvis); 124 virtual void RiGeometricApproximation(const char * type,float value); 125 virtual void RiGeometricRepresentation(const char * type); 126 virtual void RiOrientation(const char * orientation),RiReverseOrientation(void); 127 virtual void RiSides(int nsides); 128 129 virtual void RiIdentity(void); 130 virtual void RiTransform(float transform[][4]); 131 virtual void RiConcatTransform(float transform[][4]); 132 virtual void RiPerspective(float fov); 133 virtual void RiTranslate(float dx,float dy,float dz); 134 virtual void RiRotate(float angle,float dx,float dy,float dz); 135 virtual void RiScale(float dx,float dy,float dz); 136 virtual void RiSkew(float angle,float dx1,float dy1,float dz1,float dx2,float dy2,float dz2); 137 virtual void RiDeformationV(const char *name,int n,const char *tokens[],const void *params[]); 138 virtual void RiDisplacementV(const char *name,int n,const char *tokens[],const void *params[]); 139 virtual void RiCoordinateSystem(const char * space); 140 virtual void RiCoordSysTransform(const char * space); 141 142 virtual RtPoint * RiTransformPoints(const char * fromspace,const char * tospace,int npoints,RtPoint *points); 143 144 virtual void RiTransformBegin(void); 145 virtual void RiTransformEnd(void); 146 147 virtual void RiAttributeV(const char *name,int n,const char *tokens[],const void *params[]); 148 149 150 virtual void RiPolygonV(int nvertices,int n,const char *tokens[],const void *params[]); 151 virtual void RiGeneralPolygonV(int nloops,int *nverts,int n,const char *tokens[],const void *params[]); 152 virtual void RiPointsPolygonsV(int npolys,int *nverts,int *verts,int n,const char *tokens[],const void *params[]); 153 virtual void RiPointsGeneralPolygonsV(int npolys,int *nloops,int *nverts,int *verts,int n,const char *tokens[],const void *params[]); 154 virtual void RiBasis(float ubasis[][4],int ustep,float vbasis[][4],int vstep); 155 virtual void RiPatchV(const char * type,int n,const char *tokens[],const void *params[]); 156 virtual void RiPatchMeshV(const char * type,int nu,const char * uwrap,int nv,const char * vwrap,int n,const char *tokens[],const void *params[]); 157 virtual void RiNuPatchV(int nu,int uorder,float *uknot,float umin,float umax,int nv,int vorder,float *vknot,float vmin,float vmax,int n,const char *tokens[],const void *params[]); 158 virtual void RiTrimCurve(int nloops,int *ncurves,int *order,float *knot,float *amin,float *amax,int *n,float *u,float *v,float *w); 159 160 virtual void RiSphereV(float radius,float zmin,float zmax,float thetamax,int n,const char *tokens[],const void *params[]); 161 virtual void RiConeV(float height,float radius,float thetamax,int n,const char *tokens[],const void *params[]); 162 virtual void RiCylinderV(float radius,float zmin,float zmax,float thetamax,int n,const char *tokens[],const void *params[]); 163 virtual void RiHyperboloidV(float *point1,float *point2,float thetamax,int n,const char *tokens[],const void *params[]); 164 virtual void RiParaboloidV(float rmax,float zmin,float zmax,float thetamax,int n,const char *tokens[],const void *params[]); 165 virtual void RiDiskV(float height,float radius,float thetamax,int n,const char *tokens[],const void *params[]); 166 virtual void RiTorusV(float majorrad,float minorrad,float phimin,float phimax,float thetamax,int n,const char *tokens[],const void *params[]); 167 virtual void RiProcedural(void * data,float *bound,void (*subdivfunc)(void *,float),void (*freefunc)(void *)); 168 virtual void RiGeometryV(const char * type,int n,const char *tokens[],const void *params[]); 169 170 virtual void RiCurvesV(const char * degree,int ncurves,int nverts[],const char * wrap,int n,const char *tokens[],const void *params[]); 171 virtual void RiPointsV(int npts,int n,const char *tokens[],const void *params[]); 172 virtual void RiSubdivisionMeshV(const char * scheme,int nfaces,int nvertices[],int vertices[],int ntags,const char * tags[],int nargs[],int intargs[],float floatargs[],int n,const char *tokens[],const void *params[]); 173 virtual void RiBlobbyV(int nleaf,int ncode,int code[],int nflt,float flt[],int nstr,const char *str[],int n,const char *tokens[],const void *params[]); 174 175 virtual void RiProcDelayedReadArchive(const char * data,float detail); 176 virtual void RiProcRunProgram(const char * data,float detail); 177 virtual void RiProcDynamicLoad(const char * data,float detail); 178 179 virtual void RiProcFree(const char *); 180 181 virtual void RiSolidBegin(const char * type); 182 virtual void RiSolidEnd(void); 183 virtual void *RiObjectBegin(void); 184 185 virtual void RiObjectEnd(void); 186 virtual void RiObjectInstance(const void *handle); 187 virtual void RiMotionBeginV(int N,float times[]); 188 virtual void RiMotionEnd(void); 189 190 virtual void RiMakeTextureV(const char *pic,const char *tex,const char * swrap,const char * twrap,float (*filterfunc)(float,float,float,float),float swidth,float twidth,int n,const char *tokens[],const void *params[]); 191 virtual void RiMakeBumpV(const char *pic,const char *tex,const char * swrap,const char * twrap,float (*filterfunc)(float,float,float,float),float swidth,float twidth,int n,const char *tokens[],const void *params[]); 192 virtual void RiMakeLatLongEnvironmentV(const char *pic,const char *tex,float (*filterfunc)(float,float,float,float),float swidth,float twidth,int n,const char *tokens[],const void *params[]); 193 virtual void RiMakeCubeFaceEnvironmentV(const char *px,const char *nx,const char *py,const char *ny,const char *pz,const char *nz,const char *tex,float fov,float (*filterfunc)(float,float,float,float),float swidth,float twidth,int n,const char *tokens[],const void *params[]); 194 virtual void RiMakeShadowV(const char *pic,const char *tex,int n,const char *tokens[],const void *params[]); 195 virtual void RiMakeBrickMapV(int n,const char **src,const char *dest,int numTokens,const char *tokens[],const void *params[]); 196 197 virtual void RiErrorHandler(void (*handler)(int,int,const char *)); 198 199 virtual void RiArchiveRecord(const char * type,const char *format,va_list args); 200 virtual void RiReadArchiveV(const char *filename,void (*callback)(const char *,...),int n,const char *tokens[],const void *params[]); 201 202 virtual void *RiArchiveBeginV(const char *name, int n,const char *tokens[],const void *parms[]); 203 virtual void RiArchiveEnd(void); 204 205 virtual void RiResourceV(const char *handle,const char *type,int n,const char *tokens[],const void *parms[]); 206 virtual void RiResourceBegin(void); 207 virtual void RiResourceEnd(void); 208 209 virtual void RiIfBeginV(const char *expr,int n,const char *tokens[],const void *parms[]); 210 virtual void RiElseIfV(const char *expr,int n,const char *tokens[],const void *parms[]); 211 virtual void RiElse(void); 212 virtual void RiIfEnd(void); 213 214 private: 215 void writePL(int,const char *[],const void *[]); 216 void writePL(int numVertex,int numVarying,int numFaceVarying,int numUniform,int,const char *[],const void *[]); 217 void declareVariable(const char *,const char *); 218 void declareDefaultVariables(); 219 220 const char *outName; 221 FILE *outFile; 222 int outputCompressed; 223 int outputIsPipe; 224 CDictionary<const char *,CVariable *> *declaredVariables; // Declared variables 225 int numLightSources; 226 int numObjects; 227 CRibAttributes *attributes; 228 char *scratch; 229 230 /////////////////////////////////////////////////////////////////////// 231 // Class : CRibOut 232 // Method : vout 233 // Description : Write a variable argument list 234 // Return Value : - 235 // Comments : vout(const char * mes,va_list args)236 void vout(const char *mes,va_list args) { 237 const int l = vsprintf(scratch,mes,args); 238 239 #ifdef HAVE_ZLIB 240 if (outputCompressed) gzwrite((gzFile)outFile,scratch,l); 241 else fwrite(scratch,1,l,outFile); 242 #else 243 fwrite(scratch,1,l,outFile); 244 #endif 245 } 246 247 /////////////////////////////////////////////////////////////////////// 248 // Class : CRibOut 249 // Method : out 250 // Description : Write an argument list 251 // Return Value : - 252 // Comments : out(const char * mes,...)253 void out(const char *mes,...) { 254 va_list args; 255 256 va_start(args,mes); 257 258 const int l = vsprintf(scratch,mes,args); 259 260 #ifdef HAVE_ZLIB 261 if (outputCompressed) gzwrite((gzFile)outFile,scratch,l); 262 else fwrite(scratch,1,l,outFile); 263 #else 264 fwrite(scratch,1,l,outFile); 265 #endif 266 267 va_end(args); 268 } 269 270 }; 271 272 273 #endif 274 275