Skip to content

Instantly share code, notes, and snippets.

@danoli3
Last active December 29, 2015 17:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danoli3/7705436 to your computer and use it in GitHub Desktop.
Save danoli3/7705436 to your computer and use it in GitHub Desktop.
Ray Tracer Stereo Snippets
/**
* Implement the following virtual functions in your camera classes.
*/
/** Pinhole.h */
render_stereo(const World& w, float x, int pixel_offset, const std::vector<Pixel>& pixels);
/** Pinhole.cpp */
// ---------------------------------------- render_stereo function
void
Pinhole::render_stereo(const World& w, float x, int pixel_offset, const std::vector<Pixel>& pixels) {
RGBColor L;
ViewPlane vp(w.vp);
Ray ray;
int depth = 0; // recusrion depth
Point2D sp; // sample point in [0,1] x [0,1]
Point2D pp; // sample point on a pixel
vp.s /= zoom;
ray.o = eye;
list<RenderedPixel> render; // for send every row
RenderedPixel pixel; // "
int count = 0;
int jump = 0;
for(int i = 0; i< pixels.size(); i++)
{
Pixel screen_pixel = pixels[i];
L = black;
int sp_count = 0;
int sp_jump = 0;
for (int j = 0; j < vp.num_samples; j++)
{
sp = vp.sampler_ptr->sample_unit_square(sp_count, sp_jump);
pp.x = vp.s * (screen_pixel.x - 0.5 * vp.hres + sp.x) + x; // asymmetric view frustum
pp.y = vp.s * (screen_pixel.y - 0.5 * vp.vres + sp.y);
ray.d = get_direction(pp);
L += w.tracer_ptr->trace_ray(ray, depth, count, jump);
}
L /= vp.num_samples;
L *= exposure_time;
pixel.color = L; // for send every row
pixel.xy = Point2D(screen_pixel.x + pixel_offset,screen_pixel.y); // "
render.push_back(pixel);
if(w.stop_rendering()) // if the program is asked to close, we need end this now
{ w.display_pixel(render);
render.clear();
return; }
if(w.render_display() == EVERY_PIXEL)
{ w.display_pixel(render); // send to the screen buffer every pixel rendered
render.clear();
}
else if(w.render_display() == EVERY_ROW)
{
if(i % (pixels.size()/10) == 0)
{
w.display_pixel(render); // send to the screen buffer every pixel rendered
render.clear();
}
}
}
if(w.render_display() == EVERY_JOB || w.render_display() == EVERY_ROW)
{ w.display_pixel(render); // send to the screen buffer every row of pixels rendered
render.clear();
}
}
//StereoCamera.h
// -----------------------------------------------------------------------------
virtual void
render_scene(const World& w, const std::vector<Pixel>& pixels);
// -----------------------------------------------------------------------------
//StereoCamera.cpp
/***
Also make sure to set the bool "stereo" to true in the following places:
- default contructor
- overloaded constructor
- copy constructor
- assignment operator
Like so:
stereo = true;
( stereo is defined in the Camera.h class )
*/
// ----------------------------------------------------------------------------- render_scene - MT
void
StereoCamera::render_scene(const World& w, const std::vector<Pixel>& pixels)
{
double r = eye.distance(lookat);
double x = r * tan(0.5 * beta * PI_ON_180);
if (viewing_type == parallel) {
left_camera_ptr->render_stereo(w, x, 0, pixels); // left view on left
right_camera_ptr->render_stereo(w, -x, w.vp.hres + offset, pixels); // right view on right
}
if (viewing_type == transverse) {
right_camera_ptr->render_stereo(w, -x, 0, pixels); // right view on left
left_camera_ptr->render_stereo(w, x, w.vp.hres + offset, pixels); // left view on right
}
}
//-------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment