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:
1 parent
5308913bdb
commit
c1f39da3e2
21 files changed
+100
-2
No files matched your search
@@ -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
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user