From 4d5faf83629b7ef2c8d7debeed3da6c3a4660a9b Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 16 Feb 2009 20:19:01 +0000 Subject: [PATCH] updating parser nodes, introducing conflicts, still not compiling git-svn-id: svn://anubis/fart/trunk@108 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/nodes.cc | 3 +++ parser/nodes.h | 53 ++++++++++++++++++++++++++++++++++++++++++- parser/parser.lex | 1 + parser/parser.yy | 57 ++++++++++++++++++++++++++++++++++------------- 4 files changed, 98 insertions(+), 16 deletions(-) diff --git a/parser/nodes.cc b/parser/nodes.cc index b7cb8d2..0853e75 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -5,6 +5,9 @@ using namespace std; void Node::addChildren(refptr other) { + if (other.isNull()) + return; + for (typeof(other.m_children)::const_iterator it = other.m_children.begin(); it != other.m_children.end(); it++) diff --git a/parser/nodes.h b/parser/nodes.h index 7e48853..2416171 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -2,6 +2,8 @@ #ifndef NODES_H #define NODES_H NODES_H +#include "util/Vector.h" +#include "main/Material.h" #include class Node @@ -17,13 +19,62 @@ class Node return refptr(NULL); } + virtual double getNumber() { return 0.0; } + + virtual refptr getVector() + { + return refptr(NULL); + } + protected: std::vector< refptr > m_children; }; -class SceneItemsNode : public Node +class CameraNode : public Node { }; +class ItemsNode : public Node +{ +}; + +class LightNode : public Node +{ +}; + +class MaterialNode : public Node +{ +}; + +class NumberNode : public Node +{ + public: + double getNumber() { return m_number; } +}; + +class RadiusNode +{ + public: + RadiusNode(double radius) { m_radius = radius; } + double getNumber() { return m_radius; } + + protected: + double m_radius; +}; + +class ShapeNode : public Node +{ +}; + +class VectorNode : public Node +{ + public: + VectorNode(refptr vector) { m_vector = vector; } + refptr getVector() { return m_vector; } + + protected: + refptr m_vector; +}; + #endif diff --git a/parser/parser.lex b/parser/parser.lex index d69d8f8..02139f1 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -45,6 +45,7 @@ multisample return MULTISAMPLE; options return OPTIONS; plane return PLANE; position return POSITION; +radius return RADIUS; reflectance return REFLECTANCE; scene return SCENE; shininess return SHININESS; diff --git a/parser/parser.yy b/parser/parser.yy index 2fb23ee..f211ead 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -74,6 +74,7 @@ static Scene * g_scene; %token OPTIONS; %token PLANE; %token POSITION; +%token RADIUS; %token REFLECTANCE; %token SCENE; %token SHININESS; @@ -327,18 +328,23 @@ plane: PLANE LPAREN vector COMMA number RPAREN LCURLY plane_items RCURLY { plane_items: shape_items { $$ = $1; } ; +radius: RADIUS number { + $$ = new RadiusNode($2->getNumber()); + } + ; + scene_items: /* empty */ | scene_item scene_items { - $$ = new SceneItemsNode(); + $$ = new ItemsNode(); $$->addChild($1); $$->addChildren($2); } ; -scene_item: camera { $$ = $1; $$->type = Node_Camera; } - | shape { $$ = $1; $$->type = Node_Shape; } - | options { $$ = $1; $$->type = Node_Options; } - | light { $$ = $1; $$->type = Node_Light; } +scene_item: camera { $$ = $1; } + | shape { $$ = $1; } + | options { $$ = $1; } + | light { $$ = $1; } ; shape: plane { $$ = $1; } @@ -350,19 +356,41 @@ shape: plane { $$ = $1; } ; shape_items: /* empty */ - | material { $$ = $1; } + | shape_item shape_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; -sphere: SPHERE LPAREN number RPAREN LCURLY sphere_items RCURLY { +shape_item: + | material { $$ = $1; } + ; + +sphere: SPHERE LCURLY sphere_items RCURLY { Sphere * sphere = new Sphere(*($3->the_double)); - $$ = new Node(); + $$ = new SphereNode(); $$->the_Shape = sphere; } ; -sphere_items: shape_items { $$ = $1; } +sphere_items: /* empty */ + | sphere_item sphere_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + | shape_item sphere_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; +sphere_item: radius { $$ = $1; } + | shape_item { $$ = $1; } + ; + subtract: SUBTRACT LCURLY boolean_items RCURLY ; @@ -370,12 +398,11 @@ union: UNION LCURLY boolean_items RCURLY ; vector: LESS number COMMA number COMMA number GREATER { - Vector * ptr = new Vector(); - (*ptr)[0] = * $2->the_double; - (*ptr)[1] = * $4->the_double; - (*ptr)[2] = * $6->the_double; - $$ = new Node(); - $$->the_Vector = ptr; + refptr vector = new Vector(); + (*vector)[0] = * $2->getNumber(); + (*vector)[1] = * $4->getNumber(); + (*vector)[2] = * $6->getNumber(); + $$ = new VectorNode(vector); } ;