added shape definition processing and shape cloning capabilities

git-svn-id: svn://anubis/fart/trunk@284 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop committed 2010-07-09 17:11:14 +00:00
1 parent 5308913bdb
commit c1f39da3e2
21 files changed
+100 -2

No files matched your search

+28
View File
@@ -61,6 +61,10 @@ void Scene::processNode(refptr<Node> node)
{
processMaterialDefinition(node);
}
else if ( typeid(*node) == typeid(ShapeDefinitionNode) )
{
processShapeDefinition(node);
}
else
{
cerr << __FILE__ << ": " << __LINE__
@@ -143,6 +147,10 @@ refptr<Shape> Scene::processShape(refptr<Node> node)
{
return processExtrude(node);
}
else if ( typeid(*node) == typeid(ShapeRefNode) )
{
return processShapeRef(node);
}
return refptr<Shape>(NULL);
}
@@ -659,6 +667,20 @@ refptr<Polygon> Scene::processNGon(refptr<Node> node)
return p;
}
refptr<Shape> Scene::processShapeRef(refptr<Node> node)
{
if (m_shape_definitions.find(node->getString())
!= m_shape_definitions.end())
{
refptr<Shape> shape = m_shape_definitions[node->getString()]->clone();
shape->setTransform(m_transforms.top());
return shape;
}
cerr << "Error: no shape definition for '" << node->getString()
<< "' found!" << endl;
exit(3);
}
bool Scene::processTransforms(refptr<Node> node)
{
bool did_any = false;
@@ -699,3 +721,9 @@ bool Scene::processTransforms(refptr<Node> node)
return did_any;
}
void Scene::processShapeDefinition(refptr<Node> node)
{
m_shape_definitions[node->getString()]
= processShape(node->getChildren()[0]);
}
+3 -1
View File
@@ -70,6 +70,7 @@ class Scene
refptr<Shape> processShape(refptr<Node> node);
refptr<Shape> processBool(refptr<Node> node);
refptr<Shape> processExtrude(refptr<Node> node);
refptr<Shape> processShapeRef(refptr<Node> node);
refptr<Polygon> processPolygon(refptr<Node> node);
refptr<Polygon> processNGon(refptr<Node> node);
bool processTransforms(refptr<Node> node);
@@ -77,6 +78,7 @@ class Scene
void processOptions(refptr<Node> node);
void processTransformBlock(refptr<Node> node);
void processMaterialDefinition(refptr<Node> node);
void processShapeDefinition(refptr<Node> node);
/* rendering parameters */
int m_width;
@@ -90,7 +92,7 @@ class Scene
/* private data */
std::vector< refptr<Shape> > m_shapes;
std::vector< refptr<Shape> > m_shape_definitions;
std::map< std::string, refptr<Shape> > m_shape_definitions;
std::vector< refptr<Light> > m_lights;
std::stack<Transform> m_transforms;
double m_view_plane_dist;