#ifndef NODES_H #define NODES_H NODES_H #include "util/refptr.h" #include "util/Vector.h" #include #include class Node { public: virtual ~Node(); void addChild(refptr child) { m_children.push_back(child); } void addChildren(refptr other); std::vector< refptr > & getChildren() { return m_children; } virtual int getInteger() { std::cerr << "Warning: Node::getInteger() called!" << std::endl; return 0; } virtual double getNumber() { std::cerr << "Warning: Node::getNumber() called!" << std::endl; return 0.0; } virtual refptr getVector() { std::cerr << "Warning: Node::getVector() called!" << std::endl; return refptr(NULL); } virtual std::string getString() { std::cerr << "Warning: Node::getString() called!" << std::endl; return ""; } virtual bool isShape() { return false; } virtual bool isMaterial() { return false; } virtual bool isTransformBlock() { return false; } virtual bool isExpression() { return false; } protected: std::vector< refptr > m_children; }; class IntegerNode : public Node { public: IntegerNode(int number) { m_number = number; } virtual int getInteger() { return m_number; } virtual double getNumber() { return m_number; } protected: int m_number; }; class NumberNode : public Node { public: NumberNode(double number) { m_number = number; m_direct = true; } NumberNode(refptr expr) { m_expr = expr; m_direct = false; } virtual double getNumber() { return m_direct ? m_number : m_expr->getNumber(); } protected: double m_number; refptr m_expr; bool m_direct; }; class VectorNode : public Node { public: VectorNode(refptr a, refptr b, refptr c) : m_a(a), m_b(b), m_c(c), m_direct(true) { } VectorNode(refptr node) : m_a(node), m_direct(false) { } refptr getVector() { return m_direct ? new Vector(m_a->getNumber(), m_b->getNumber(), m_c->getNumber()) : m_a->getVector(); } protected: refptr m_a, m_b, m_c; bool m_direct; }; class AmbientNode : public VectorNode { public: AmbientNode(refptr vector) : VectorNode(vector) {} }; class AmbientOcclusionNode : public IntegerNode { public: AmbientOcclusionNode(int i) : IntegerNode(i) {} }; class BoxNode : public Node { public: bool isShape() { return true; } }; class CameraNode : public Node { }; class ColorNode : public VectorNode { public: ColorNode(refptr vector) : VectorNode(vector) {} }; class CylNode : public Node { public: bool isShape() { return true; } }; class DiffuseNode : public VectorNode { public: DiffuseNode(refptr vector) : VectorNode(vector) {} }; class ExposureNode : public NumberNode { public: ExposureNode(refptr e) : NumberNode(e) {} }; class ExtrudeNode : public Node { public: bool isShape() { return true; } }; class HeightNode : public IntegerNode { public: HeightNode(int i) : IntegerNode(i) {} }; class IdentifierNode : public Node { public: IdentifierNode(const std::string & str) { m_string = str; } std::string getString() { return m_string; } protected: std::string m_string; }; class IntersectNode : public Node { public: bool isShape() { return true; } }; class ItemsNode : public Node { }; class JitterNode : public NumberNode { public: JitterNode(refptr e) : NumberNode(e) {} int getInteger() { return getNumber(); } }; class LightNode : public Node { }; class LookAtNode : public VectorNode { public: LookAtNode(refptr vector) : VectorNode(vector) {} }; class MaterialNode : public Node { public: bool isMaterial() { return true; } }; class MaterialDefinitionNode : public IdentifierNode { public: MaterialDefinitionNode(const std::string & str) : IdentifierNode(str) {} }; class MaterialRefNode : public IdentifierNode { public: MaterialRefNode(const std::string & str) : IdentifierNode(str) {} bool isMaterial() { return true; } }; class MaxDepthNode : public IntegerNode { public: MaxDepthNode(int i) : IntegerNode(i) {} }; class MultisampleNode : public IntegerNode { public: MultisampleNode(int i) : IntegerNode(i) {} }; class NGonNode : public NumberNode { public: NGonNode(refptr e) : NumberNode(e) {} int getInteger() { return getNumber(); } }; class OffsetNode : public NumberNode { public: OffsetNode(refptr e) : NumberNode(e) {} }; class OptionsNode : public Node { }; class PlaneNode : public Node { public: bool isShape() { return true; } }; class PlanePositionNode : public VectorNode { public: PlanePositionNode(refptr vec_node, refptr dist) : VectorNode(vec_node) { m_dist = dist; } double getNumber() { return m_dist->getNumber(); } protected: refptr m_dist; }; class PolygonNode : public Node { }; class PositionNode : public VectorNode { public: PositionNode(refptr vector) : VectorNode(vector) {} }; class RadiusNode : public NumberNode { public: RadiusNode(refptr e) : NumberNode(e) {} }; class ReflectanceNode : public NumberNode { public: ReflectanceNode(refptr e) : NumberNode(e) {} }; class RotateNode : public VectorNode { public: RotateNode(refptr angle, refptr vec_node) : VectorNode(vec_node) { m_angle = angle; } double getNumber() { return m_angle->getNumber(); } protected: refptr m_angle; }; class RotateBlockNode : public RotateNode { public: RotateBlockNode(refptr angle, refptr vec_node) : RotateNode(angle, vec_node) {} bool isTransformBlock() { return true; } }; class ScaleNode : public VectorNode { public: ScaleNode(refptr vector) : VectorNode(vector) {} }; class ScaleBlockNode : public ScaleNode { public: ScaleBlockNode(refptr vector) : ScaleNode(vector) {} bool isTransformBlock() { return true; } }; class SceneNode : public Node { }; class ShapeDefinitionNode : public IdentifierNode { public: ShapeDefinitionNode(const std::string & str) : IdentifierNode(str) {} }; class ShapeRefNode : public IdentifierNode { public: ShapeRefNode(const std::string & str) : IdentifierNode(str) {} bool isShape() { return true; } }; class ShininessNode : public NumberNode { public: ShininessNode(refptr e) : NumberNode(e) {} }; class SizeNode : public VectorNode { public: SizeNode(refptr vector) : VectorNode(vector) {} }; class SpecularNode : public VectorNode { public: SpecularNode(refptr vector) : VectorNode(vector) {} }; class SphereNode : public Node { public: bool isShape() { return true; } }; class SubtractNode : public Node { public: bool isShape() { return true; } }; class TranslateNode : public VectorNode { public: TranslateNode(refptr vector) : VectorNode(vector) {} }; class TranslateBlockNode : public TranslateNode { public: TranslateBlockNode(refptr vector) : TranslateNode(vector) {} bool isTransformBlock() { return true; } }; class TransparencyNode : public NumberNode { public: TransparencyNode(refptr e) : NumberNode(e) {} }; class UnionNode : public Node { public: bool isShape() { return true; } }; class UpNode : public VectorNode { public: UpNode(refptr vector) : VectorNode(vector) {} }; class VFOVNode : public NumberNode { public: VFOVNode(refptr e) : NumberNode(e) {} }; class WidthNode : public IntegerNode { public: WidthNode(int i) : IntegerNode(i) {} }; /******** scripting nodes ********/ class ExpressionNode : public Node { public: bool isExpression() { return true; } virtual double getNumber() = 0; virtual int getInteger() { return getNumber(); } }; class BinOpNode : public ExpressionNode { public: BinOpNode(char op, refptr one, refptr two) : m_op(op), one(one), two(two) { } virtual double getNumber(); protected: char m_op; refptr one; refptr two; }; #endif