diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 32741cb..05aabb4 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -12,7 +12,6 @@ typedef vector< refptr >::const_iterator Node_Iterator; void Scene::load(const char * filename) { - /* TODO: parse file somehow */ refptr node = parse(filename); processNode(node); @@ -122,6 +121,43 @@ void Scene::processNode(refptr node) { processChildren(node); } + else if ( node->isShape() ) + { + refptr shape = processShape(node); + if ( ! shape.isNull() ) + m_shapes.push_back(shape); + } + else if ( typeid(*node) == typeid(LightNode) ) + { + refptr light = processLight(node); + if ( ! light.isNull() ) + m_lights.push_back(light); + } + else if ( typeid(*node) == typeid(CameraNode) ) + { + processCamera(node); + } + else if ( typeid(*node) == typeid(OptionsNode) ) + { + processOptions(node); + } + else if ( typeid(*node) == typeid(TranslateBlockNode) ) + { + processTransformBlock(node); + } + else if ( typeid(*node) == typeid(RotateBlockNode) ) + { + processTransformBlock(node); + } + else if ( typeid(*node) == typeid(ScaleBlockNode) ) + { + processTransformBlock(node); + } + else + { + cerr << __FILE__ << ": " << __LINE__ + << ": error: unrecognized node!" << endl; + } } refptr Scene::processShape(refptr node) @@ -167,6 +203,45 @@ void Scene::processChildren(refptr node) } } +void Scene::processCamera(refptr node) +{ + Vector position(0, 0, 0); + Vector look_at(0, 1, 0); + Vector up(0, 0, 1); + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(PositionNode) ) + { + position = * (*it)->getVector(); + } + else if ( typeid(**it) == typeid(LookAtNode) ) + { + look_at = * (*it)->getVector(); + } + else if ( typeid(**it) == typeid(UpNode) ) + { + up = * (*it)->getVector(); + } + else if ( typeid(**it) == typeid(VFOVNode) ) + { + + } + } + + m_transforms.top().lookAt(position, look_at, up); +} + +void Scene::processOptions(refptr node) +{ +} + +void Scene::processTransformBlock(refptr node) +{ +} + refptr Scene::processMaterial(refptr node) { refptr material = new Material(); @@ -276,7 +351,6 @@ refptr Scene::processCyl(refptr node) refptr Scene::processLight(refptr node) { - /* TODO: finish */ return refptr(NULL); } diff --git a/main/Scene.h b/main/Scene.h index 3b9c70c..a689273 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -67,6 +67,9 @@ class Scene refptr processShape(refptr node); refptr processBool(refptr node); bool processTransforms(refptr node); + void processCamera(refptr node); + void processOptions(refptr node); + void processTransformBlock(refptr node); /* rendering parameters */ int m_width; diff --git a/parser/nodes.h b/parser/nodes.h index df4a417..fdcd6f5 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -113,8 +113,10 @@ class LightNode : public Node { }; -class LookAtNode : public Node +class LookAtNode : public VectorNode { + public: + LookAtNode(refptr vector) : VectorNode(vector) {} }; class MaterialNode : public Node @@ -153,8 +155,10 @@ class PlanePositionNode : public Node double m_dist; }; -class PositionNode : public Node +class PositionNode : public VectorNode { + public: + PositionNode(refptr vector) : VectorNode(vector) {} }; class RadiusNode : public NumberNode @@ -256,8 +260,10 @@ class UnionNode : public Node bool isShape() { return true; } }; -class UpNode : public Node +class UpNode : public VectorNode { + public: + UpNode(refptr vector) : VectorNode(vector) {} }; class VFOVNode : public Node diff --git a/parser/parser.yy b/parser/parser.yy index 42d1832..f7f4017 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -133,16 +133,13 @@ camera_items: /* empty */ ; camera_item: POSITION vector { - $$ = new PositionNode(); - $$->addChild($2); + $$ = new PositionNode($2->getVector()); } | LOOKAT vector { - $$ = new LookAtNode(); - $$->addChild($2); + $$ = new LookAtNode($2->getVector()); } | UP vector { - $$ = new UpNode(); - $$->addChild($2); + $$ = new UpNode($2->getVector()); } | VFOV vector { $$ = new VFOVNode(); @@ -193,8 +190,7 @@ light_items: /* empty */ ; light_item: POSITION vector { - $$ = new PositionNode(); - $$->addChild($2); + $$ = new PositionNode($2->getVector()); } | DIFFUSE vector { $$ = new DiffuseNode($2->getVector());