From 7d844667c3fdf99382b1ff2424377609945c3f2a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 1 Jul 2010 20:04:44 +0000 Subject: [PATCH] added Extrude and Polygon classes, still in progress git-svn-id: svn://anubis/fart/trunk@269 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- main/Scene-load.cc | 59 ++++++++++++++++++++++++++++++++++++++++++++++ main/Scene.h | 4 ++++ parser/parser.yy | 29 ++++++++++++++++++++++- shapes/Extrude.cc | 27 +++++++++++++++++++++ shapes/Extrude.h | 22 +++++++++++++++++ shapes/shapes.h | 1 + util/Polygon.cc | 2 ++ util/Polygon.h | 14 +++++++++++ 8 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 shapes/Extrude.cc create mode 100644 shapes/Extrude.h create mode 100644 util/Polygon.cc create mode 100644 util/Polygon.h diff --git a/main/Scene-load.cc b/main/Scene-load.cc index e63fa7c..13da0eb 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -1,10 +1,12 @@ #include #include + #include "Scene.h" #include "Light.h" #include "parser/parser.h" #include "parser/nodes.h" +#include "util/Polygon.h" using namespace std; @@ -135,6 +137,10 @@ refptr Scene::processShape(refptr node) { return processBool(node); } + else if ( typeid(*node) == typeid(ExtrudeNode) ) + { + return processExtrude(node); + } return refptr(NULL); } @@ -539,6 +545,59 @@ refptr Scene::processBool(refptr node) return shape; } +refptr Scene::processExtrude(refptr node) +{ + refptr material; + Extrude * extrude = new Extrude(); + + bool restore_transform = processTransforms(node); + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(PolygonNode) ) + { + extrude->addPolygon(processPolygon(*it)); + } + else if ( typeid(**it) == typeid(NGonNode) ) + { + extrude->addPolygon(processNGon(*it)); + } + else if ( typeid(**it) == typeid(OffsetNode) ) + { + /* FIXME */ + } + else if ( (*it)->isMaterial() ) + { + material = processMaterial(*it); + } + } + + if ( ! material.isNull() ) + extrude->setMaterial(material); + extrude->setTransform(m_transforms.top()); + + if (restore_transform) + m_transforms.pop(); + + return extrude; +} + +refptr Scene::processPolygon(refptr node) +{ + refptr p = new Polygon(); + /* FIXME */ + return p; +} + +refptr Scene::processNGon(refptr node) +{ + refptr p = new Polygon(); + /* FIXME */ + return p; +} + bool Scene::processTransforms(refptr node) { bool did_any = false; diff --git a/main/Scene.h b/main/Scene.h index d95e64b..eccfa08 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -12,6 +12,7 @@ #include "util/Ray.h" #include "util/Color.h" #include "util/Material.h" +#include "util/Polygon.h" #include "shapes/shapes.h" @@ -66,6 +67,9 @@ class Scene refptr processSphere(refptr node); refptr processShape(refptr node); refptr processBool(refptr node); + refptr processExtrude(refptr node); + refptr processPolygon(refptr node); + refptr processNGon(refptr node); bool processTransforms(refptr node); void processCamera(refptr node); void processOptions(refptr node); diff --git a/parser/parser.yy b/parser/parser.yy index 0cc1ebc..2b36f32 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -207,6 +207,7 @@ extrude_items: /* empty */ extrude_item: polygon { $$ = $1; } | ngon { $$ = $1; } | offset { $$ = $1; } + | shape_item { $$ = $1; } ; intersect: INTERSECT LCURLY bool_items RCURLY { @@ -309,9 +310,35 @@ number: DEC_NUMBER { $$ = $1; } ngon: NGON DEC_NUMBER { $$ = new NGonNode($2->getInteger()); } ; -offset: OFFSET number { $$ = new OffsetNode($2->getNumber()); } +offset: OFFSET number { + $$ = new OffsetNode($2->getNumber()); + } + | OFFSET number LCURLY offset_items RCURLY { + $$ = new OffsetNode($2->getNumber()); + $$->addChildren($4); + } ; +offset_items: /* empty */ + | offset_item offset_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +offset_item: SCALE number { + $$ = new ScaleNode(new Vector($2->getNumber(), $2->getNumber(), + $2->getNumber())); + } + | SCALE vector2 { + $$ = new ScaleNode($2->getVector()); + } + | POSITION vector2 { + $$ = new PositionNode($2->getVector()); + } + ; + options: OPTIONS LCURLY options_items RCURLY { $$ = new OptionsNode(); $$->addChildren($3); diff --git a/shapes/Extrude.cc b/shapes/Extrude.cc new file mode 100644 index 0000000..c946659 --- /dev/null +++ b/shapes/Extrude.cc @@ -0,0 +1,27 @@ + +#include + +#include + +#include "Extrude.h" +#include "util/Solver.h" + +using namespace std; + +#define FP_EQUAL(x,y) (fabs((x)-(y)) < 0.000001) + +Extrude::Extrude() +{ +} + +Shape::IntersectionList Extrude::intersect(refptr _this, const Ray & ray) +{ + Ray ray_inv = m_inverse.transform_ray(ray); + IntersectionList res; + + return res; +} + +void Extrude::addPolygon(refptr polygon) +{ +} diff --git a/shapes/Extrude.h b/shapes/Extrude.h new file mode 100644 index 0000000..80e4f49 --- /dev/null +++ b/shapes/Extrude.h @@ -0,0 +1,22 @@ + +#ifndef EXTRUDE_H +#define EXTRUDE_H EXTRUDE_H + +#include + +#include "util/Polygon.h" +#include "Shape.h" + +class Extrude : public Shape +{ + public: + Extrude(); + IntersectionList intersect(refptr _this, const Ray & ray); + void addPolygon(refptr polygon); + + protected: + std::vector< refptr > m_polygons; +}; + +#endif + diff --git a/shapes/shapes.h b/shapes/shapes.h index 7cbcb5c..afbbd05 100644 --- a/shapes/shapes.h +++ b/shapes/shapes.h @@ -2,6 +2,7 @@ #include "BoolShape.h" #include "Box.h" #include "Cyl.h" +#include "Extrude.h" #include "Intersect.h" #include "Plane.h" #include "Sphere.h" diff --git a/util/Polygon.cc b/util/Polygon.cc new file mode 100644 index 0000000..ccf9415 --- /dev/null +++ b/util/Polygon.cc @@ -0,0 +1,2 @@ + +#include "Polygon.h" diff --git a/util/Polygon.h b/util/Polygon.h new file mode 100644 index 0000000..3226d99 --- /dev/null +++ b/util/Polygon.h @@ -0,0 +1,14 @@ + +#ifndef POLYGON_H +#define POLYGON_H + +#include + +#include "refptr.h" +#include "Vector.h" + +class Polygon : public std::vector< refptr > +{ +}; + +#endif