From 4c5444f0536e77c1ac6da054ed6d323e21195507 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 1 Jul 2010 20:35:20 +0000 Subject: [PATCH] creating polygons for extrude objects, ngon takes radius parameter git-svn-id: svn://anubis/fart/trunk@270 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- main/Scene-load.cc | 48 +++++++++++++++++++++++++++++++++++++++++++--- parser/parser.yy | 5 ++++- shapes/Extrude.cc | 7 +++++++ shapes/Extrude.h | 14 ++++++++++++++ 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 13da0eb..69b657e 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -1,4 +1,6 @@ +#include + #include #include @@ -566,7 +568,23 @@ refptr Scene::processExtrude(refptr node) } else if ( typeid(**it) == typeid(OffsetNode) ) { - /* FIXME */ + double distance = (*it)->getNumber(); + Vector scale(1, 1, 1); + Vector position(0, 0, 0); + for (Node_Iterator it2 = (*it)->getChildren().begin(); + it2 != (*it)->getChildren().end(); + it2++) + { + if ( typeid(**it2) == typeid(ScaleNode) ) + { + scale = * (*it2)->getVector(); + } + else if ( typeid(**it2) == typeid(PositionNode) ) + { + position = * (*it2)->getVector(); + } + } + extrude->addOffset(distance, scale, position); } else if ( (*it)->isMaterial() ) { @@ -587,14 +605,38 @@ refptr Scene::processExtrude(refptr node) refptr Scene::processPolygon(refptr node) { refptr p = new Polygon(); - /* FIXME */ + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(VectorNode) ) + { + p->push_back((*it)->getVector()); + } + else + { + cerr << "Error: Unknown polygon sub-object" << endl; + exit(3); + } + } return p; } refptr Scene::processNGon(refptr node) { refptr p = new Polygon(); - /* FIXME */ + double radius = node->getChildren()[0]->getNumber(); + int n = node->getInteger(); + if (n < 3) + n = 3; + double astep = 2.0 * M_PI / n; + for (int i = 0; i < n; i++) + { + p->push_back(new Vector( + radius * cos(i * astep), + radius * sin(i * astep), + 0.0)); + } return p; } diff --git a/parser/parser.yy b/parser/parser.yy index 2b36f32..7c2414f 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -307,7 +307,10 @@ number: DEC_NUMBER { $$ = $1; } | REAL_NUMBER { $$ = $1; } ; -ngon: NGON DEC_NUMBER { $$ = new NGonNode($2->getInteger()); } +ngon: NGON DEC_NUMBER COMMA number { + $$ = new NGonNode($2->getInteger()); + $$->addChild(new RadiusNode($4->getNumber())); + } ; offset: OFFSET number { diff --git a/shapes/Extrude.cc b/shapes/Extrude.cc index c946659..e249f73 100644 --- a/shapes/Extrude.cc +++ b/shapes/Extrude.cc @@ -24,4 +24,11 @@ Shape::IntersectionList Extrude::intersect(refptr _this, const Ray & ray) void Extrude::addPolygon(refptr polygon) { + m_polygons.push_back(polygon); +} + +void Extrude::addOffset(double distance, + const Vector & scale, const Vector & shift) +{ + m_offsets.push_back(Offset(distance, scale, shift)); } diff --git a/shapes/Extrude.h b/shapes/Extrude.h index 80e4f49..02c895e 100644 --- a/shapes/Extrude.h +++ b/shapes/Extrude.h @@ -13,9 +13,23 @@ class Extrude : public Shape Extrude(); IntersectionList intersect(refptr _this, const Ray & ray); void addPolygon(refptr polygon); + void addOffset(double distance, + const Vector & scale, const Vector & shift); + class Offset + { + public: + Offset(double d, const Vector & s, const Vector & p) + : distance(d), scale(s), shift(p) + { + } + double distance; + Vector scale; + Vector shift; + }; protected: std::vector< refptr > m_polygons; + std::vector m_offsets; }; #endif