
#include <stdio.h>
#include <ri.h>
#define ASPECT_RATIO 1.33333 /* define as 1.33333 for usual 4:3 image */
#define TEXTURE_ROWS 256 /* a power of two */
#define IMAGE_ROWS 300
main()
{
RiBegin(RI_NULL);
SetupOptions();
RiFrameBegin(0);
SetupCamera();
RiWorldBegin();
SetupModel();
RiWorldEnd();
RiFrameEnd();
RiEnd();
}
/*
* Set RenderMan options for medium quality/speed tradeoff.
*/
SetupOptions()
{
static RtInt gsz = 32;
static RtInt bktsz[2] = {12, 12};
RtInt splits = 5;
RiOption("limits", "gridsize", (RtPointer) &gsz,
"eyesplits", (RtPointer) &splits,
"bucketsize", (RtPointer) bktsz, RI_NULL);
RiShadingRate(2.);
RiPixelSamples(2., 2.);
RiPixelFilter(RiBoxFilter, 1., 1.);
#ifdef REFLECTION
RiDisplay("refl.tif", RI_FILE, RI_RGBA, RI_NULL);
RiFormat(TEXTURE_ROWS, TEXTURE_ROWS, ASPECT_RATIO);
#else
RiDisplay("foo", RI_FRAMEBUFFER, RI_RGBA, RI_NULL);
RiFormat((RtInt)(IMAGE_ROWS*ASPECT_RATIO), IMAGE_ROWS, 1.0);
#endif
}
/*
* Set RenderMan camera parameters.
*/
SetupCamera()
{
static RtMatrix m = { /* an arbitrary viewing matrix */
.970143, -0.004705, -.24249, 0,
0, .999812, -0.0193992, 0,
.242536, 0.01882, .96996, 0,
-7.27607, -1.96434, 53.406, 1
};
RtFloat fov = 25.;
RiProjection(RI_PERSPECTIVE, (RtToken) "fov", (RtPointer) &fov, RI_NULL);
RiTransform(m);
#ifdef REFLECTION
/* Transform z=0 plane to coincide with reflection plane. */
RiTranslate(0., 0., -0.05);
/* Reflect camera through the reflection plane z=0. */
RiScale(1., 1., -1.);
/* Transform reflection plane back to z=0. */
RiTranslate(0., 0., 0.05);
#endif
}
/*
* The model consists of three "walls" of a room (actually two
* walls and the floor) with a mirror on one of the walls.
* When rendering the REFLECTION image, the mirror
* and the wall it is hanging on are both removed so that
* the camera can see into the room from the other side of
* the wall.
*/
SetupModel()
{
static RtColor c[4] = { /* various colors */
{ 0.5, 0.4, 0.1}, { 0.3, 0.5, 0.5},
{ 1, 1, 1}, { 0.4, 0.2, 0.7}
};
int i;
#ifdef REFLECTION
#define NWALLS 2 /* Just do two walls. */
static RtPoint walls[NWALLS][4] = {
{ 0, 0, -100}, { 0, 0, 0}, { 100, 0, -100}, {100, 0, 0},
{ 0, 100, -100}, {0, 100, 0}, { 0, 0, -100}, { 0, 0, 0},
};
#else
#define NWALLS 3 /* Do three walls and mirror. */
static RtPoint walls[NWALLS][4] = {
{ 0, 0, -100}, { 0, 0, 0}, { 100, 0, -100}, {100, 0, 0},
{ 0, 100, -100}, {0, 100, 0}, { 0, 0, -100}, { 0, 0, 0},
{ 0, 100, 0}, { 100, 100, 0}, { 0, 0, 0 }, { 100, 0, 0}
};
static RtPoint mirror[4] = {
{ 5, 10.5, -.05}, { 10, 10.5, -.05},
{5, 0.5, -.05}, { 10, 0.5, -.05}
};
RiAttributeBegin();
RiColor(c[2]);
RiSurface("refl", RI_NULL);
RiPatch(RI_BILINEAR, RI_P, (RtPointer) mirror, RI_NULL);
RiAttributeEnd();
#endif
RiColor(c[0]);
for (i = 0; i < NWALLS; i++) {
RiPatch(RI_BILINEAR, RI_P, (RtPointer) walls[i], RI_NULL);
RiColor(c[1]);
}
/* Put a teapot in the room. */
RiColor(c[3]);
RiTransformBegin();
RiTranslate(5., 1., -2.);
RiRotate(90., 0., 1., 0.);
RiRotate(-90., 1., 0., 0.);
RiGeometry("teapot", RI_NULL);
RiTransformEnd();
}
|
Pixar Animation Studios
|