added ShapeRef typedef, added Scene::processGeneralItems()

git-svn-id: svn://anubis/fart/branches/scene-file-scripting@330 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2010-10-04 20:47:39 +00:00
parent 7014605fe3
commit 91ea5a20e0
3 changed files with 54 additions and 42 deletions

View File

@ -33,7 +33,7 @@ void Scene::processNode(refptr<Node> node)
} }
else if ( node->isShape() ) else if ( node->isShape() )
{ {
refptr<Shape> shape = processShape(node); ShapeRef shape = processShape(node);
if ( ! shape.isNull() ) if ( ! shape.isNull() )
m_shapes.push_back(shape); m_shapes.push_back(shape);
} }
@ -49,7 +49,7 @@ void Scene::processNode(refptr<Node> node)
} }
else if (node->isTransformBlock()) else if (node->isTransformBlock())
{ {
vector< refptr<Shape> > shapes = processTransformBlock(node); vector<ShapeRef> shapes = processTransformBlock(node);
for (int i = 0, sz = shapes.size(); i < sz; i++) for (int i = 0, sz = shapes.size(); i < sz; i++)
{ {
m_shapes.push_back(shapes[i]); m_shapes.push_back(shapes[i]);
@ -111,7 +111,7 @@ void Scene::processScene(refptr<Node> node)
} }
} }
refptr<Shape> Scene::processShape(refptr<Node> node) ShapeRef Scene::processShape(refptr<Node> node)
{ {
if ( typeid(*node) == typeid(BoxNode) ) if ( typeid(*node) == typeid(BoxNode) )
{ {
@ -149,7 +149,7 @@ refptr<Shape> Scene::processShape(refptr<Node> node)
exit(3); exit(3);
} }
return refptr<Shape>(NULL); return ShapeRef(NULL);
} }
void Scene::processCamera(refptr<Node> node) void Scene::processCamera(refptr<Node> node)
@ -222,7 +222,7 @@ void Scene::processOptions(refptr<Node> node)
} }
} }
vector< refptr<Shape> > Scene::processTransformBlock(refptr<Node> node) vector<ShapeRef> Scene::processTransformBlock(refptr<Node> node)
{ {
if ( typeid(*node) == typeid(TranslateBlockNode) ) if ( typeid(*node) == typeid(TranslateBlockNode) )
{ {
@ -240,8 +240,22 @@ vector< refptr<Shape> > Scene::processTransformBlock(refptr<Node> node)
m_transforms.push(m_transforms.top()); m_transforms.push(m_transforms.top());
m_transforms.top().scale(node->getVector()); m_transforms.top().scale(node->getVector());
} }
else
{
cerr << "Unknown transformation block node type!" << endl;
exit(4);
}
vector< refptr<Shape> > shapes; vector<ShapeRef> shapes = processGeneralItems(node);
m_transforms.pop();
return shapes;
}
vector<ShapeRef> Scene::processGeneralItems(refptr<Node> node)
{
vector<ShapeRef> shapes;
for (Node_Iterator it = node->getChildren().begin(); for (Node_Iterator it = node->getChildren().begin();
it != node->getChildren().end(); it != node->getChildren().end();
@ -249,30 +263,26 @@ vector< refptr<Shape> > Scene::processTransformBlock(refptr<Node> node)
{ {
if ((*it)->isTransformBlock()) if ((*it)->isTransformBlock())
{ {
vector< refptr<Shape> > in = processTransformBlock(*it); vector<ShapeRef> in = processTransformBlock(*it);
for (int i = 0, sz = in.size(); i < sz; i++) for (int i = 0, sz = in.size(); i < sz; i++)
{ {
shapes.push_back(in[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) ) else if ( typeid(**it) == typeid(ShapeDefinitionNode) )
{ {
processShapeDefinition(*it); processShapeDefinition(*it);
} }
else else if ( (*it)->isShape() )
{ {
cerr << "Unknown transform block item: " << typeid(**it).name() shapes.push_back(processShape(*it));
<< endl;
exit(3);
} }
} }
m_transforms.pop();
return shapes; return shapes;
} }
@ -348,7 +358,7 @@ refptr<Material> Scene::processMaterial(refptr<Node> node)
return material; return material;
} }
refptr<Shape> Scene::processBox(refptr<Node> node) ShapeRef Scene::processBox(refptr<Node> node)
{ {
refptr<Vector> size = new Vector(1, 1, 1); refptr<Vector> size = new Vector(1, 1, 1);
refptr<Material> material; refptr<Material> material;
@ -369,7 +379,7 @@ refptr<Shape> Scene::processBox(refptr<Node> node)
} }
} }
refptr<Shape> box = new Box(size); ShapeRef box = new Box(size);
if ( ! material.isNull() ) if ( ! material.isNull() )
box->setMaterial(material); box->setMaterial(material);
box->setTransform(m_transforms.top()); box->setTransform(m_transforms.top());
@ -380,7 +390,7 @@ refptr<Shape> Scene::processBox(refptr<Node> node)
return box; return box;
} }
refptr<Shape> Scene::processCyl(refptr<Node> node) ShapeRef Scene::processCyl(refptr<Node> node)
{ {
double radius1 = 1.0; double radius1 = 1.0;
double radius2 = 1.0; double radius2 = 1.0;
@ -406,7 +416,7 @@ refptr<Shape> Scene::processCyl(refptr<Node> node)
} }
} }
refptr<Shape> cyl = new Cyl(radius1, radius2, height); ShapeRef cyl = new Cyl(radius1, radius2, height);
if ( ! material.isNull() ) if ( ! material.isNull() )
cyl->setMaterial(material); cyl->setMaterial(material);
cyl->setTransform(m_transforms.top()); cyl->setTransform(m_transforms.top());
@ -459,7 +469,7 @@ refptr<Light> Scene::processLight(refptr<Node> node)
return light; return light;
} }
refptr<Shape> Scene::processPlane(refptr<Node> node) ShapeRef Scene::processPlane(refptr<Node> node)
{ {
Vector normal(0, 0, 1); Vector normal(0, 0, 1);
double dist = 0; double dist = 0;
@ -482,7 +492,7 @@ refptr<Shape> Scene::processPlane(refptr<Node> node)
} }
} }
refptr<Shape> plane = new Plane(normal[0], ShapeRef plane = new Plane(normal[0],
normal[1], normal[1],
normal[2], normal[2],
dist); dist);
@ -496,7 +506,7 @@ refptr<Shape> Scene::processPlane(refptr<Node> node)
return plane; return plane;
} }
refptr<Shape> Scene::processSphere(refptr<Node> node) ShapeRef Scene::processSphere(refptr<Node> node)
{ {
double radius = 1.0; double radius = 1.0;
refptr<Material> material; refptr<Material> material;
@ -517,7 +527,7 @@ refptr<Shape> Scene::processSphere(refptr<Node> node)
} }
} }
refptr<Shape> sphere = new Sphere(radius); ShapeRef sphere = new Sphere(radius);
if ( ! material.isNull() ) if ( ! material.isNull() )
sphere->setMaterial(material); sphere->setMaterial(material);
sphere->setTransform(m_transforms.top()); sphere->setTransform(m_transforms.top());
@ -528,9 +538,9 @@ refptr<Shape> Scene::processSphere(refptr<Node> node)
return sphere; return sphere;
} }
refptr<Shape> Scene::processBool(refptr<Node> node) ShapeRef Scene::processBool(refptr<Node> node)
{ {
vector< refptr<Shape> > shapes; vector<ShapeRef> shapes;
refptr<Material> material; refptr<Material> material;
bool restore_transform = processTransforms(node); bool restore_transform = processTransforms(node);
@ -542,7 +552,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
{ {
if ( (*it)->isShape() ) if ( (*it)->isShape() )
{ {
refptr<Shape> shape = processShape(*it); ShapeRef shape = processShape(*it);
if ( ! shape.isNull() ) if ( ! shape.isNull() )
shapes.push_back(shape); shapes.push_back(shape);
} }
@ -552,7 +562,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
} }
else if ( (*it)->isTransformBlock() ) else if ( (*it)->isTransformBlock() )
{ {
vector< refptr<Shape> > in = processTransformBlock(*it); vector<ShapeRef> in = processTransformBlock(*it);
for (int i = 0, sz = in.size(); i < sz; i++) for (int i = 0, sz = in.size(); i < sz; i++)
{ {
shapes.push_back(in[i]); shapes.push_back(in[i]);
@ -571,7 +581,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
exit(3); exit(3);
} }
refptr<Shape> shape; ShapeRef shape;
if ( typeid(*node) == typeid(IntersectNode) ) if ( typeid(*node) == typeid(IntersectNode) )
shape = new Intersect(shapes); shape = new Intersect(shapes);
else if ( typeid(*node) == typeid(UnionNode) ) else if ( typeid(*node) == typeid(UnionNode) )
@ -596,7 +606,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
return shape; return shape;
} }
refptr<Shape> Scene::processExtrude(refptr<Node> node) ShapeRef Scene::processExtrude(refptr<Node> node)
{ {
refptr<Material> material; refptr<Material> material;
Extrude * extrude = new Extrude(); Extrude * extrude = new Extrude();
@ -708,7 +718,7 @@ refptr<Polygon> Scene::processNGon(refptr<Node> node)
return p; return p;
} }
refptr<Shape> Scene::processShapeRef(refptr<Node> node) ShapeRef Scene::processShapeRef(refptr<Node> node)
{ {
if (m_shape_definitions.find(node->getString()) if (m_shape_definitions.find(node->getString())
== m_shape_definitions.end()) == m_shape_definitions.end())
@ -719,7 +729,7 @@ refptr<Shape> Scene::processShapeRef(refptr<Node> node)
} }
refptr<Material> material; refptr<Material> material;
refptr<Shape> shape = m_shape_definitions[node->getString()]->clone(); ShapeRef shape = m_shape_definitions[node->getString()]->clone();
bool restore_transform = processTransforms(node); bool restore_transform = processTransforms(node);

View File

@ -62,21 +62,22 @@ class Scene
void processChildren(refptr<Node> node); void processChildren(refptr<Node> node);
void processScene(refptr<Node> node); void processScene(refptr<Node> node);
refptr<Material> processMaterial(refptr<Node> node); refptr<Material> processMaterial(refptr<Node> node);
refptr<Shape> processBox(refptr<Node> node); ShapeRef processBox(refptr<Node> node);
refptr<Shape> processCyl(refptr<Node> node); ShapeRef processCyl(refptr<Node> node);
refptr<Light> processLight(refptr<Node> node); refptr<Light> processLight(refptr<Node> node);
refptr<Shape> processPlane(refptr<Node> node); ShapeRef processPlane(refptr<Node> node);
refptr<Shape> processSphere(refptr<Node> node); ShapeRef processSphere(refptr<Node> node);
refptr<Shape> processShape(refptr<Node> node); ShapeRef processShape(refptr<Node> node);
refptr<Shape> processBool(refptr<Node> node); ShapeRef processBool(refptr<Node> node);
refptr<Shape> processExtrude(refptr<Node> node); ShapeRef processExtrude(refptr<Node> node);
refptr<Shape> processShapeRef(refptr<Node> node); ShapeRef processShapeRef(refptr<Node> node);
refptr<Polygon> processPolygon(refptr<Node> node); refptr<Polygon> processPolygon(refptr<Node> node);
refptr<Polygon> processNGon(refptr<Node> node); refptr<Polygon> processNGon(refptr<Node> node);
bool processTransforms(refptr<Node> node); bool processTransforms(refptr<Node> node);
void processCamera(refptr<Node> node); void processCamera(refptr<Node> node);
void processOptions(refptr<Node> node); void processOptions(refptr<Node> node);
std::vector< refptr<Shape> > processTransformBlock(refptr<Node> node); std::vector<ShapeRef> processTransformBlock(refptr<Node> node);
std::vector<ShapeRef> processGeneralItems(refptr<Node> node);
void processMaterialDefinition(refptr<Node> node); void processMaterialDefinition(refptr<Node> node);
void processShapeDefinition(refptr<Node> node); void processShapeDefinition(refptr<Node> node);
@ -91,8 +92,8 @@ class Scene
int m_ambient_occlusion_level; int m_ambient_occlusion_level;
/* private data */ /* private data */
std::vector< refptr<Shape> > m_shapes; std::vector<ShapeRef> m_shapes;
std::map< std::string, refptr<Shape> > m_shape_definitions; std::map<std::string, ShapeRef> m_shape_definitions;
std::vector< refptr<Light> > m_lights; std::vector< refptr<Light> > m_lights;
std::stack<Transform> m_transforms; std::stack<Transform> m_transforms;
double m_view_plane_dist; double m_view_plane_dist;

View File

@ -125,6 +125,7 @@ class Shape
refptr<Material> m_material; refptr<Material> m_material;
}; };
typedef refptr<Shape> ShapeRef;
#endif #endif