added Scene::processNode() and Scene::processChildren()

git-svn-id: svn://anubis/fart/trunk@126 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2009-02-18 01:10:57 +00:00
parent 30932d00e9
commit b9cc1fe9f9
5 changed files with 52 additions and 13 deletions

View File

@ -7,6 +7,7 @@
#include <map> #include <map>
#include <algorithm> /* sort() */ #include <algorithm> /* sort() */
#include <functional> /* binary_function */ #include <functional> /* binary_function */
#include <typeinfo> /* typeid operator support */
#include <math.h> #include <math.h>
#include "BMP.h" #include "BMP.h"
#include "util/Color.h" #include "util/Color.h"
@ -77,9 +78,44 @@ Scene::~Scene()
delete m_data; delete m_data;
} }
void Scene::processNode(refptr<Node> node)
{
if (node.isNull())
return;
if ( typeid(*node) == typeid(SceneNode) )
{
processChildren(node);
}
else if ( typeid(*node) == typeid(BoxNode) )
{
cout << "saw a box" << endl;
}
else if ( typeid(*node) == typeid(PlaneNode) )
{
cout << "saw a plane" << endl;
}
else if ( typeid(*node) == typeid(SphereNode) )
{
cout << "saw a sphere" << endl;
}
}
void Scene::processChildren(refptr<Node> node)
{
std::vector< refptr<Node> > & children = node->getChildren();
for (int i = 0, sz = children.size(); i < sz; i++)
{
processNode(children[i]);
}
}
void Scene::load(const char * filename) void Scene::load(const char * filename)
{ {
refptr<Node> node = parse(filename); refptr<Node> node = parse(filename);
processNode(node);
/* TODO: parse file somehow */ /* TODO: parse file somehow */
refptr<Shape> plane = new Plane(0, 0, 1, -2); refptr<Shape> plane = new Plane(0, 0, 1, -2);

View File

@ -12,6 +12,8 @@
#include "shapes/Shape.h" #include "shapes/Shape.h"
#include "Light.h" #include "Light.h"
#include "parser/parser.h"
#define SCENE_MAX_TRANSPARENT_HITS 8 #define SCENE_MAX_TRANSPARENT_HITS 8
#define SCENE_TRANSPARENCY_THRESHOLD 0.01 #define SCENE_TRANSPARENCY_THRESHOLD 0.01
@ -45,6 +47,8 @@ class Scene
void renderPixel(int x, int y, unsigned char * pixel); void renderPixel(int x, int y, unsigned char * pixel);
Color traceRay(const Ray & ray); Color traceRay(const Ray & ray);
std::vector<ShapeDistance> getRayHits(const Ray & ray); std::vector<ShapeDistance> getRayHits(const Ray & ray);
void processNode(refptr<Node> node);
void processChildren(refptr<Node> node);
/* rendering parameters */ /* rendering parameters */
int m_width; int m_width;

View File

@ -12,6 +12,7 @@ class Node
virtual ~Node(); virtual ~Node();
void addChild(refptr<Node> child) { m_children.push_back(child); } void addChild(refptr<Node> child) { m_children.push_back(child); }
void addChildren(refptr<Node> other); void addChildren(refptr<Node> other);
std::vector< refptr<Node> > & getChildren() { return m_children; }
virtual int getInteger() { return 0; } virtual int getInteger() { return 0; }
virtual double getNumber() { return 0.0; } virtual double getNumber() { return 0.0; }

View File

@ -113,9 +113,8 @@ box_item: SIZE vector {
; ;
camera: CAMERA LCURLY camera_items RCURLY { camera: CAMERA LCURLY camera_items RCURLY {
Vector default_position(0, -1, 0); $$ = new CameraNode();
Vector default_look_at(0, 0, 0); $$->addChildren($3);
Vector default_up(0, 0, 1);
} }
; ;

View File

@ -1,6 +1,4 @@
#define mirror material { reflectance 1.0 }
scene scene
{ {
options options
@ -14,15 +12,15 @@ scene
{ {
position <0, -2, 0> position <0, -2, 0>
look_at <0, 0, 0> look_at <0, 0, 0>
up <0, 0, 1>; up <0, 0, 1>
} }
plane { position <1, 0, 0>, -2 mirror } plane { position <1, 0, 0>, -2 }
plane { position <-1, 0, 0>, -2 mirror } plane { position <-1, 0, 0>, -2 }
plane { position <0, 1, 0>, -2 mirror } plane { position <0, 1, 0>, -2 }
plane { position <0, -1, 0>, -2 mirror } plane { position <0, -1, 0>, -2 }
plane { position <0, 0, 1>, -2 mirror } plane { position <0, 0, 1>, -2 }
plane { position <0, 0, -1>, -2 mirror } plane { position <0, 0, -1>, -2 }
sphere sphere
{ {
@ -30,7 +28,8 @@ scene
material material
{ {
reflectance 0.2 reflectance 0.2
color <0.5, 0.5, 0.5> ambient <0.5, 0.5, 0.5>
diffuse <0.5, 0.5, 0.5>
shininess 80 shininess 80
} }
} }