From e5e4f991fbc4496bed4d5c976b973263d83136c6 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 28 Sep 2010 19:31:26 +0000 Subject: [PATCH] added optional block following shape references which can contain transforms or materials specific to the shape instance git-svn-id: svn://anubis/fart/trunk@312 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- main/Scene-load.cc | 35 ++++++++++++++++++++++++++++------- parser/parser.yy | 17 ++++++++++++++++- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 8fa78ca..9a4c75a 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -709,15 +709,36 @@ refptr Scene::processNGon(refptr node) refptr Scene::processShapeRef(refptr node) { if (m_shape_definitions.find(node->getString()) - != m_shape_definitions.end()) + == m_shape_definitions.end()) { - refptr shape = m_shape_definitions[node->getString()]->clone(); - shape->setTransform(m_transforms.top() * shape->getTransform()); - return shape; + cerr << "Error: no shape definition for '" << node->getString() + << "' found!" << endl; + exit(3); } - cerr << "Error: no shape definition for '" << node->getString() - << "' found!" << endl; - exit(3); + + refptr material; + refptr shape = m_shape_definitions[node->getString()]->clone(); + + bool restore_transform = processTransforms(node); + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( (*it)->isMaterial() ) + { + material = processMaterial(*it); + } + } + + if ( ! material.isNull() ) + shape->setMaterial(material); + shape->setTransform(m_transforms.top() * shape->getTransform()); + + if (restore_transform) + m_transforms.pop(); + + return shape; } bool Scene::processTransforms(refptr node) diff --git a/parser/parser.yy b/parser/parser.yy index 4b3c3b5..ebcb092 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -458,9 +458,24 @@ shape_definition: DEFINE SHAPE IDENTIFIER shape { } ; -shape_ref: SHAPE IDENTIFIER { $$ = new ShapeRefNode($2->getString()); } +shape_ref: SHAPE IDENTIFIER shape_ref_more { + $$ = new ShapeRefNode($2->getString()); + $$->addChildren($3); + } ; +shape_ref_more: /* empty */ + | LCURLY shape_ref_items RCURLY { $$ = $2; } + ; + +shape_ref_items: /* empty */ + | shape_item shape_ref_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + shape_item: material { $$ = $1; } | material_ref { $$ = $1; } | transform { $$ = $1; }