moved processNode(), processChildren(), and load() into main/Scene-load.cc
git-svn-id: svn://anubis/fart/trunk@138 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
354edb9662
commit
5949a813df
102
main/Scene-load.cc
Normal file
102
main/Scene-load.cc
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "Scene.h"
|
||||||
|
#include "Light.h"
|
||||||
|
#include "PointLight.h"
|
||||||
|
#include "parser/parser.h"
|
||||||
|
#include "parser/nodes.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void Scene::load(const char * filename)
|
||||||
|
{
|
||||||
|
refptr<Node> node = parse(filename);
|
||||||
|
processNode(node);
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: parse file somehow */
|
||||||
|
refptr<Shape> plane = new Plane(0, 0, 1, -2);
|
||||||
|
m_shapes.push_back(plane);
|
||||||
|
|
||||||
|
refptr<Material> m = new Material();
|
||||||
|
m->setDiffuseColor(Color::red);
|
||||||
|
m->setAmbientColor(Color::red);
|
||||||
|
|
||||||
|
refptr<Shape> shape = new Sphere(1.0);
|
||||||
|
m_transform.translate(1.0, 5.0, 0.5);
|
||||||
|
shape->setTransform(m_transform);
|
||||||
|
shape->setMaterial(m);
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
|
m = new Material();
|
||||||
|
m->setDiffuseColor(Color::blue);
|
||||||
|
m->setAmbientColor(Color::blue);
|
||||||
|
|
||||||
|
shape = new Box(new Vector(1.8, 1.8, 0.5));
|
||||||
|
m_transform.translate(0, 0, -2.0);
|
||||||
|
shape->setTransform(m_transform);
|
||||||
|
shape->setMaterial(m);
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
|
m = new Material();
|
||||||
|
m->setDiffuseColor(Color::cyan);
|
||||||
|
m->setAmbientColor(Color::cyan);
|
||||||
|
|
||||||
|
shape = new Cyl(1.0, 0.0, 2.0);
|
||||||
|
m_transform.translate(-1.3, 2.5, 3.5);
|
||||||
|
m_transform.rotate(45, 1, 0, 0);
|
||||||
|
shape->setTransform(m_transform);
|
||||||
|
shape->setMaterial(m);
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
|
m = new Material();
|
||||||
|
m->setDiffuseColor(Color::yellow);
|
||||||
|
m->setAmbientColor(Color::yellow);
|
||||||
|
|
||||||
|
shape = new Box(new Vector(1, 1, 1));
|
||||||
|
m_transform.rotate(-45, 1, 0, 0);
|
||||||
|
m_transform.translate(-1.7, -0.5, -2.0);
|
||||||
|
m_transform.rotate(45, 0, 0, 1);
|
||||||
|
m_transform.rotate(45, 1, 0, 0);
|
||||||
|
shape->setTransform(m_transform);
|
||||||
|
shape->setMaterial(m);
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
|
||||||
|
refptr<Light> light = new PointLight();
|
||||||
|
light->setPosition(Vector(2, -1, 2));
|
||||||
|
m_lights.push_back(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -78,98 +78,6 @@ 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)
|
|
||||||
{
|
|
||||||
refptr<Node> node = parse(filename);
|
|
||||||
processNode(node);
|
|
||||||
|
|
||||||
|
|
||||||
/* TODO: parse file somehow */
|
|
||||||
refptr<Shape> plane = new Plane(0, 0, 1, -2);
|
|
||||||
m_shapes.push_back(plane);
|
|
||||||
|
|
||||||
refptr<Material> m = new Material();
|
|
||||||
m->setDiffuseColor(Color::red);
|
|
||||||
m->setAmbientColor(Color::red);
|
|
||||||
|
|
||||||
refptr<Shape> shape = new Sphere(1.0);
|
|
||||||
m_transform.translate(1.0, 5.0, 0.5);
|
|
||||||
shape->setTransform(m_transform);
|
|
||||||
shape->setMaterial(m);
|
|
||||||
m_shapes.push_back(shape);
|
|
||||||
|
|
||||||
m = new Material();
|
|
||||||
m->setDiffuseColor(Color::blue);
|
|
||||||
m->setAmbientColor(Color::blue);
|
|
||||||
|
|
||||||
shape = new Box(new Vector(1.8, 1.8, 0.5));
|
|
||||||
m_transform.translate(0, 0, -2.0);
|
|
||||||
shape->setTransform(m_transform);
|
|
||||||
shape->setMaterial(m);
|
|
||||||
m_shapes.push_back(shape);
|
|
||||||
|
|
||||||
m = new Material();
|
|
||||||
m->setDiffuseColor(Color::cyan);
|
|
||||||
m->setAmbientColor(Color::cyan);
|
|
||||||
|
|
||||||
shape = new Cyl(1.0, 0.0, 2.0);
|
|
||||||
m_transform.translate(-1.3, 2.5, 3.5);
|
|
||||||
m_transform.rotate(45, 1, 0, 0);
|
|
||||||
shape->setTransform(m_transform);
|
|
||||||
shape->setMaterial(m);
|
|
||||||
m_shapes.push_back(shape);
|
|
||||||
|
|
||||||
m = new Material();
|
|
||||||
m->setDiffuseColor(Color::yellow);
|
|
||||||
m->setAmbientColor(Color::yellow);
|
|
||||||
|
|
||||||
shape = new Box(new Vector(1, 1, 1));
|
|
||||||
m_transform.rotate(-45, 1, 0, 0);
|
|
||||||
m_transform.translate(-1.7, -0.5, -2.0);
|
|
||||||
m_transform.rotate(45, 0, 0, 1);
|
|
||||||
m_transform.rotate(45, 1, 0, 0);
|
|
||||||
shape->setTransform(m_transform);
|
|
||||||
shape->setMaterial(m);
|
|
||||||
m_shapes.push_back(shape);
|
|
||||||
|
|
||||||
refptr<Light> light = new PointLight();
|
|
||||||
light->setPosition(Vector(2, -1, 2));
|
|
||||||
m_lights.push_back(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Scene::render()
|
void Scene::render()
|
||||||
{
|
{
|
||||||
if (m_verbose)
|
if (m_verbose)
|
||||||
|
@ -44,10 +44,12 @@ class Scene
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
/* private methods */
|
/* private methods */
|
||||||
void load(const char * filename);
|
|
||||||
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);
|
||||||
|
|
||||||
|
/* In Scene-load.cc */
|
||||||
|
void load(const char * filename);
|
||||||
void processNode(refptr<Node> node);
|
void processNode(refptr<Node> node);
|
||||||
void processChildren(refptr<Node> node);
|
void processChildren(refptr<Node> node);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user