diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 1130928..1117884 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -33,7 +33,7 @@ void Scene::processNode(refptr node) } else if ( node->isShape() ) { - refptr shape = processShape(node); + ShapeRef shape = processShape(node); if ( ! shape.isNull() ) m_shapes.push_back(shape); } @@ -49,7 +49,7 @@ void Scene::processNode(refptr node) } else if (node->isTransformBlock()) { - vector< refptr > shapes = processTransformBlock(node); + vector shapes = processTransformBlock(node); for (int i = 0, sz = shapes.size(); i < sz; i++) { m_shapes.push_back(shapes[i]); @@ -111,7 +111,7 @@ void Scene::processScene(refptr node) } } -refptr Scene::processShape(refptr node) +ShapeRef Scene::processShape(refptr node) { if ( typeid(*node) == typeid(BoxNode) ) { @@ -149,7 +149,7 @@ refptr Scene::processShape(refptr node) exit(3); } - return refptr(NULL); + return ShapeRef(NULL); } void Scene::processCamera(refptr node) @@ -222,7 +222,7 @@ void Scene::processOptions(refptr node) } } -vector< refptr > Scene::processTransformBlock(refptr node) +vector Scene::processTransformBlock(refptr node) { if ( typeid(*node) == typeid(TranslateBlockNode) ) { @@ -240,8 +240,22 @@ vector< refptr > Scene::processTransformBlock(refptr node) m_transforms.push(m_transforms.top()); m_transforms.top().scale(node->getVector()); } + else + { + cerr << "Unknown transformation block node type!" << endl; + exit(4); + } - vector< refptr > shapes; + vector shapes = processGeneralItems(node); + + m_transforms.pop(); + + return shapes; +} + +vector Scene::processGeneralItems(refptr node) +{ + vector shapes; for (Node_Iterator it = node->getChildren().begin(); it != node->getChildren().end(); @@ -249,30 +263,26 @@ vector< refptr > Scene::processTransformBlock(refptr node) { if ((*it)->isTransformBlock()) { - vector< refptr > in = processTransformBlock(*it); + vector in = processTransformBlock(*it); for (int i = 0, sz = in.size(); i < sz; i++) { shapes.push_back(in[i]); } } - else if ( (*it)->isShape() ) + else if ( typeid(*node) == typeid(MaterialDefinitionNode) ) { - shapes.push_back(processShape(*it)); + processMaterialDefinition(node); } else if ( typeid(**it) == typeid(ShapeDefinitionNode) ) { processShapeDefinition(*it); } - else + else if ( (*it)->isShape() ) { - cerr << "Unknown transform block item: " << typeid(**it).name() - << endl; - exit(3); + shapes.push_back(processShape(*it)); } } - m_transforms.pop(); - return shapes; } @@ -348,7 +358,7 @@ refptr Scene::processMaterial(refptr node) return material; } -refptr Scene::processBox(refptr node) +ShapeRef Scene::processBox(refptr node) { refptr size = new Vector(1, 1, 1); refptr material; @@ -369,7 +379,7 @@ refptr Scene::processBox(refptr node) } } - refptr box = new Box(size); + ShapeRef box = new Box(size); if ( ! material.isNull() ) box->setMaterial(material); box->setTransform(m_transforms.top()); @@ -380,7 +390,7 @@ refptr Scene::processBox(refptr node) return box; } -refptr Scene::processCyl(refptr node) +ShapeRef Scene::processCyl(refptr node) { double radius1 = 1.0; double radius2 = 1.0; @@ -406,7 +416,7 @@ refptr Scene::processCyl(refptr node) } } - refptr cyl = new Cyl(radius1, radius2, height); + ShapeRef cyl = new Cyl(radius1, radius2, height); if ( ! material.isNull() ) cyl->setMaterial(material); cyl->setTransform(m_transforms.top()); @@ -459,7 +469,7 @@ refptr Scene::processLight(refptr node) return light; } -refptr Scene::processPlane(refptr node) +ShapeRef Scene::processPlane(refptr node) { Vector normal(0, 0, 1); double dist = 0; @@ -482,7 +492,7 @@ refptr Scene::processPlane(refptr node) } } - refptr plane = new Plane(normal[0], + ShapeRef plane = new Plane(normal[0], normal[1], normal[2], dist); @@ -496,7 +506,7 @@ refptr Scene::processPlane(refptr node) return plane; } -refptr Scene::processSphere(refptr node) +ShapeRef Scene::processSphere(refptr node) { double radius = 1.0; refptr material; @@ -517,7 +527,7 @@ refptr Scene::processSphere(refptr node) } } - refptr sphere = new Sphere(radius); + ShapeRef sphere = new Sphere(radius); if ( ! material.isNull() ) sphere->setMaterial(material); sphere->setTransform(m_transforms.top()); @@ -528,9 +538,9 @@ refptr Scene::processSphere(refptr node) return sphere; } -refptr Scene::processBool(refptr node) +ShapeRef Scene::processBool(refptr node) { - vector< refptr > shapes; + vector shapes; refptr material; bool restore_transform = processTransforms(node); @@ -542,7 +552,7 @@ refptr Scene::processBool(refptr node) { if ( (*it)->isShape() ) { - refptr shape = processShape(*it); + ShapeRef shape = processShape(*it); if ( ! shape.isNull() ) shapes.push_back(shape); } @@ -552,7 +562,7 @@ refptr Scene::processBool(refptr node) } else if ( (*it)->isTransformBlock() ) { - vector< refptr > in = processTransformBlock(*it); + vector in = processTransformBlock(*it); for (int i = 0, sz = in.size(); i < sz; i++) { shapes.push_back(in[i]); @@ -571,7 +581,7 @@ refptr Scene::processBool(refptr node) exit(3); } - refptr shape; + ShapeRef shape; if ( typeid(*node) == typeid(IntersectNode) ) shape = new Intersect(shapes); else if ( typeid(*node) == typeid(UnionNode) ) @@ -596,7 +606,7 @@ refptr Scene::processBool(refptr node) return shape; } -refptr Scene::processExtrude(refptr node) +ShapeRef Scene::processExtrude(refptr node) { refptr material; Extrude * extrude = new Extrude(); @@ -708,7 +718,7 @@ refptr Scene::processNGon(refptr node) return p; } -refptr Scene::processShapeRef(refptr node) +ShapeRef Scene::processShapeRef(refptr node) { if (m_shape_definitions.find(node->getString()) == m_shape_definitions.end()) @@ -719,7 +729,7 @@ refptr Scene::processShapeRef(refptr node) } refptr material; - refptr shape = m_shape_definitions[node->getString()]->clone(); + ShapeRef shape = m_shape_definitions[node->getString()]->clone(); bool restore_transform = processTransforms(node); diff --git a/main/Scene.h b/main/Scene.h index ed3ff37..d5214d5 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -62,21 +62,22 @@ class Scene void processChildren(refptr node); void processScene(refptr node); refptr processMaterial(refptr node); - refptr processBox(refptr node); - refptr processCyl(refptr node); + ShapeRef processBox(refptr node); + ShapeRef processCyl(refptr node); refptr processLight(refptr node); - refptr processPlane(refptr node); - refptr processSphere(refptr node); - refptr processShape(refptr node); - refptr processBool(refptr node); - refptr processExtrude(refptr node); - refptr processShapeRef(refptr node); + ShapeRef processPlane(refptr node); + ShapeRef processSphere(refptr node); + ShapeRef processShape(refptr node); + ShapeRef processBool(refptr node); + ShapeRef processExtrude(refptr node); + ShapeRef processShapeRef(refptr node); refptr processPolygon(refptr node); refptr processNGon(refptr node); bool processTransforms(refptr node); void processCamera(refptr node); void processOptions(refptr node); - std::vector< refptr > processTransformBlock(refptr node); + std::vector processTransformBlock(refptr node); + std::vector processGeneralItems(refptr node); void processMaterialDefinition(refptr node); void processShapeDefinition(refptr node); @@ -91,8 +92,8 @@ class Scene int m_ambient_occlusion_level; /* private data */ - std::vector< refptr > m_shapes; - std::map< std::string, refptr > m_shape_definitions; + std::vector m_shapes; + std::map m_shape_definitions; std::vector< refptr > m_lights; std::stack m_transforms; double m_view_plane_dist; diff --git a/shapes/Shape.h b/shapes/Shape.h index 5e78d41..df6d083 100644 --- a/shapes/Shape.h +++ b/shapes/Shape.h @@ -125,6 +125,7 @@ class Shape refptr m_material; }; +typedef refptr ShapeRef; #endif