From cd2f565df30a06a9f40a5095e581c2680d6c5012 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 1 Oct 2010 15:01:51 +0000 Subject: [PATCH] introduced ScaleScalarNode() node type to avoid evaluating expression multiple times git-svn-id: svn://anubis/fart/branches/scene-file-scripting@327 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/nodes.h | 16 ++++++++++++++++ parser/parser.yy | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/parser/nodes.h b/parser/nodes.h index 7e76233..e8ebe75 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -325,6 +325,22 @@ class ScaleBlockNode : public ScaleNode bool isTransformBlock() { return true; } }; +class ScaleScalarNode : public Node +{ + public: + ScaleScalarNode(refptr expr) + : m_expr(expr) + { + } + refptr getVector() + { + double x = m_expr->getNumber(); + return new Vector(x, x, x); + } + protected: + refptr m_expr; +}; + class SceneNode : public Node { }; diff --git a/parser/parser.yy b/parser/parser.yy index 2372e9a..0ab8b37 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -365,7 +365,7 @@ offset_items: /* empty */ ; offset_item: SCALE expression { - $$ = new ScaleNode(new VectorNode($2, $2, $2)); + $$ = new ScaleNode(new ScaleScalarNode($2)); } | SCALE vector2 { $$ = new ScaleNode($2); @@ -542,7 +542,7 @@ transform: TRANSLATE vector3 { $$ = new ScaleNode($2); } | SCALE expression { - $$ = new ScaleNode(new VectorNode($2, $2, $2)); + $$ = new ScaleNode(new ScaleScalarNode($2)); } ; @@ -559,7 +559,7 @@ transform_block: TRANSLATE vector3 LCURLY general_items RCURLY { $$->addChildren($4); } | SCALE expression LCURLY general_items RCURLY { - $$ = new ScaleBlockNode(new VectorNode($2, $2, $2)); + $$ = new ScaleBlockNode(new ScaleScalarNode($2)); $$->addChildren($4); } ;