diff --git a/main/Scene-load.cc b/main/Scene-load.cc index f7b92a7..b3cccac 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -190,7 +190,7 @@ refptr Scene::processMaterial(refptr node) refptr Scene::processBox(refptr node) { - Vector size(1, 1, 1); + refptr size = new Vector(1, 1, 1); refptr material; bool restore_transform = processTransforms(node); @@ -201,24 +201,60 @@ refptr Scene::processBox(refptr node) { if ( typeid(**it) == typeid(SizeNode) ) { - size = *(*it)->getVector(); + size = (*it)->getVector(); } else if ( typeid(**it) == typeid(MaterialNode) ) { material = processMaterial(*it); } } + + refptr box = new Box(size); + if ( ! material.isNull() ) + box->setMaterial(material); + box->setTransform(m_transforms.top()); if (restore_transform) m_transforms.pop(); - return refptr(NULL); + return box; } refptr Scene::processCyl(refptr node) { - /* TODO: finish */ - return refptr(NULL); + double radius1 = 1.0; + double radius2 = 1.0; + double height = 1.0; + refptr material; + + bool restore_transform = processTransforms(node); + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(SizeNode) ) + { + const Vector & v = *(*it)->getVector(); + radius1 = v[0]; + radius2 = v[1]; + height = v[2]; + } + else if ( typeid(**it) == typeid(MaterialNode) ) + { + material = processMaterial(*it); + } + } + + refptr cyl = new Cyl(radius1, radius2, height); + if ( ! material.isNull() ) + cyl->setMaterial(material); + cyl->setTransform(m_transforms.top()); + + if (restore_transform) + m_transforms.pop(); + + return cyl; } refptr Scene::processLight(refptr node) @@ -235,8 +271,34 @@ refptr Scene::processPlane(refptr node) refptr Scene::processSphere(refptr node) { - /* TODO: finish */ - return refptr(NULL); + double radius = 1.0; + refptr material; + + bool restore_transform = processTransforms(node); + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(RadiusNode) ) + { + radius = (*it)->getNumber(); + } + else if ( typeid(**it) == typeid(MaterialNode) ) + { + material = processMaterial(*it); + } + } + + refptr sphere = new Sphere(radius); + if ( ! material.isNull() ) + sphere->setMaterial(material); + sphere->setTransform(m_transforms.top()); + + if (restore_transform) + m_transforms.pop(); + + return sphere; } bool Scene::processTransforms(refptr node) diff --git a/parser/nodes.h b/parser/nodes.h index e874b1a..68bbf9b 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -78,6 +78,10 @@ class ColorNode : public VectorNode ColorNode(refptr vector) : VectorNode(vector) {} }; +class CylNode : public Node +{ +}; + class DiffuseNode : public VectorNode { public: diff --git a/parser/parser.lex b/parser/parser.lex index d6d2d66..8ca2aae 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -43,6 +43,7 @@ ambient return AMBIENT; box return BOX; camera return CAMERA; color return COLOR; +cyl return CYL; diffuse return DIFFUSE; height return HEIGHT; intersect return INTERSECT; diff --git a/parser/parser.yy b/parser/parser.yy index cbe2024..42d1832 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -62,6 +62,7 @@ static refptr parsed_scene_node; %token BOX; %token CAMERA; %token COLOR; +%token CYL; %token DIFFUSE; %token HEIGHT; %token INTERSECT; @@ -149,6 +150,26 @@ camera_item: POSITION vector { } ; +cyl: CYL LCURLY cyl_items RCURLY { + $$ = new CylNode(); + $$->addChildren($3); + } + ; + +cyl_items: /* empty */ + | cyl_item cyl_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +cyl_item: SIZE vector { + $$ = new SizeNode($2->getVector()); + } + | shape_item { $$ = $1; } + ; + intersect: INTERSECT LCURLY shape shape shape_items RCURLY { $$ = new IntersectNode(); $$->addChild($3); @@ -289,6 +310,7 @@ scene_item: camera { $$ = $1; } shape: plane { $$ = $1; } | sphere { $$ = $1; } | box { $$ = $1; } + | cyl { $$ = $1; } | union { $$ = $1; } | intersect { $$ = $1; } | subtract { $$ = $1; }