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