fart/main/Scene-load.cc
2009-02-28 17:07:30 +00:00

184 lines
4.7 KiB
C++

#include <typeinfo>
#include <iostream>
#include "Scene.h"
#include "Light.h"
#include "parser/parser.h"
#include "parser/nodes.h"
using namespace std;
void Scene::load(const char * filename)
{
/* TODO: parse file somehow */
// refptr<Node> node = parse(filename);
// processNode(node);
refptr<Shape> shape = new Plane(0, 0, 1, 2);
shape->setTransform(m_transform);
m_shapes.push_back(shape);
m_transform.translate(1.0, 5.0, 0.5);
refptr<Material> m = new Material();
m->setDiffuseColor(Color::red);
m->setAmbientColor(Color::red);
shape = new Sphere(1.0);
shape->setTransform(m_transform);
shape->setMaterial(m);
m_shapes.push_back(shape);
m_transform.translate(-1.0, -5.0, -0.5);
m_transform.translate(-1, 3, -0.5);
refptr<Shape> shape1 = new Sphere(0.8);
shape1->setMaterial(m);
shape1->setTransform(m_transform);
refptr<Shape> shape2 = new Box(new Vector(2, 2, 0.6));
m = new Material();
m->setDiffuseColor(Color::magenta);
m->setAmbientColor(Color::magenta);
shape2->setMaterial(m);
m_transform.rotate(20, 0, 1, 0);
shape2->setTransform(m_transform);
shape = new Intersect(shape1, shape2);
m_shapes.push_back(shape);
m_transform.rotate(-20, 0, 1, 0);
m_transform.translate(1, -3, 0.5);
m_transform.translate(1.5, 3.2, -0.7);
m_transform.rotate(15, 0, 0, 1);
m = new Material();
m->setDiffuseColor(Color::magenta);
m->setAmbientColor(Color::magenta);
shape1 = new Box(new Vector(1, 1, 1));
shape1->setMaterial(m);
shape1->setTransform(m_transform);
m = new Material();
m->setDiffuseColor(Color::yellow);
m->setAmbientColor(Color::yellow);
shape2 = new Sphere(0.6);
m_transform.translate(-0.5, -0.5, 0.5);
shape2->setTransform(m_transform);
shape2->setMaterial(m);
shape = new Subtract(shape1, shape2);
m_shapes.push_back(shape);
m_transform.rotate(-15, 0, 0, 1);
m_transform.translate(-1.0, -2.7, 0.2);
m_transform.translate(1, 5, -1.5);
m = new Material();
m->setDiffuseColor(Color::blue);
m->setAmbientColor(Color::blue);
shape = new Box(new Vector(1.8, 1.8, 0.5));
shape->setTransform(m_transform);
shape->setMaterial(m);
m_shapes.push_back(shape);
m_transform.translate(-1, -5, 1.5);
m_transform.translate(0.2, 6.5, 1.5);
m_transform.rotate(45, 1, 0, 0);
m = new Material();
m->setDiffuseColor(Color::cyan);
m->setAmbientColor(Color::cyan);
shape = new Cyl(1.0, 0.0, 2.0);
shape->setTransform(m_transform);
shape->setMaterial(m);
m_shapes.push_back(shape);
m_transform.rotate(-45, 1, 0, 0);
m_transform.translate(-0.2, -6.5, -1.5);
m_transform.translate(-1.5, 5.0, 2.5);
m_transform.rotate(45, 0, 0, 1);
m_transform.rotate(45, 1, 0, 0);
m = new Material();
m->setDiffuseColor(Color::yellow);
m->setAmbientColor(Color::yellow);
shape = new Box(new Vector(1, 1, 1));
shape->setTransform(m_transform);
shape->setMaterial(m);
m_shapes.push_back(shape);
m_transform.rotate(-45, 1, 0, 0);
m_transform.rotate(-45, 0, 0, 1);
m_transform.translate(1.5, -5.0, -2.5);
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]);
}
}
refptr<Material> processMaterial(refptr<Node> node)
{
if (typeid(*node) != typeid(MaterialNode))
return refptr<Material>(NULL);
refptr<Material> material = new Material();
/* TODO: finish */
return material;
}
refptr<Shape> processBox(refptr<Node> node)
{
/* TODO: finish */
return refptr<Shape>(NULL);
}
refptr<Shape> processCyl(refptr<Node> node)
{
/* TODO: finish */
return refptr<Shape>(NULL);
}
refptr<Light> processLight(refptr<Node> node)
{
/* TODO: finish */
return refptr<Light>(NULL);
}
refptr<Shape> processPlane(refptr<Node> node)
{
/* TODO: finish */
return refptr<Shape>(NULL);
}
refptr<Shape> processSphere(refptr<Node> node)
{
/* TODO: finish */
return refptr<Shape>(NULL);
}