allowing transform blocks inside boolean shapes, but using a shape reference to a boolean shape does not propagate transform properly

git-svn-id: svn://anubis/fart/trunk@286 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop committed 2010-07-09 18:33:26 +00:00
1 parent fc2c62d5ac
commit b4a2c8ef8e
7 files changed
+73 -36

No files matched your search

+63 -21
View File
@@ -45,17 +45,13 @@ void Scene::processNode(refptr<Node> node)
{
processOptions(node);
}
else if ( typeid(*node) == typeid(TranslateBlockNode) )
else if (node->isTransformBlock())
{
processTransformBlock(node);
}
else if ( typeid(*node) == typeid(RotateBlockNode) )
{
processTransformBlock(node);
}
else if ( typeid(*node) == typeid(ScaleBlockNode) )
{
processTransformBlock(node);
vector< refptr<Shape> > shapes = processTransformBlock(node);
for (int i = 0, sz = shapes.size(); i < sz; i++)
{
m_shapes.push_back(shapes[i]);
}
}
else if ( typeid(*node) == typeid(MaterialDefinitionNode) )
{
@@ -131,15 +127,9 @@ refptr<Shape> Scene::processShape(refptr<Node> node)
{
return processCyl(node);
}
else if ( typeid(*node) == typeid(IntersectNode) )
{
return processBool(node);
}
else if ( typeid(*node) == typeid(UnionNode) )
{
return processBool(node);
}
else if ( typeid(*node) == typeid(SubtractNode) )
else if ( typeid(*node) == typeid(IntersectNode)
|| typeid(*node) == typeid(UnionNode)
|| typeid(*node) == typeid(SubtractNode) )
{
return processBool(node);
}
@@ -151,6 +141,11 @@ refptr<Shape> Scene::processShape(refptr<Node> node)
{
return processShapeRef(node);
}
else
{
cerr << "Error: Unknown shape!" << endl;
exit(3);
}
return refptr<Shape>(NULL);
}
@@ -225,7 +220,7 @@ void Scene::processOptions(refptr<Node> node)
}
}
void Scene::processTransformBlock(refptr<Node> node)
vector< refptr<Shape> > Scene::processTransformBlock(refptr<Node> node)
{
if ( typeid(*node) == typeid(TranslateBlockNode) )
{
@@ -244,9 +239,39 @@ void Scene::processTransformBlock(refptr<Node> node)
m_transforms.top().scale(node->getVector());
}
processChildren(node);
vector< refptr<Shape> > shapes;
for (Node_Iterator it = node->getChildren().begin();
it != node->getChildren().end();
it++)
{
if ((*it)->isTransformBlock())
{
vector< refptr<Shape> > in = processTransformBlock(*it);
for (int i = 0, sz = in.size(); i < sz; i++)
{
shapes.push_back(in[i]);
}
}
else if ( (*it)->isShape() )
{
shapes.push_back(processShape(*it));
}
else if ( typeid(**it) == typeid(ShapeDefinitionNode) )
{
processShapeDefinition(*it);
}
else
{
cerr << "Unknown transform block item: " << typeid(**it).name()
<< endl;
exit(3);
}
}
m_transforms.pop();
return shapes;
}
void Scene::processMaterialDefinition(refptr<Node> node)
@@ -522,6 +547,23 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
{
material = processMaterial(*it);
}
else if ( (*it)->isTransformBlock() )
{
vector< refptr<Shape> > in = processTransformBlock(*it);
for (int i = 0, sz = in.size(); i < sz; i++)
{
shapes.push_back(in[i]);
}
}
else if ( typeid(**it) == typeid(ShapeDefinitionNode) )
{
processShapeDefinition(*it);
}
else
{
cerr << "Error: unknown boolean object item" << endl;
exit(3);
}
}
if (shapes.size() < 2)
+1 -1
View File
@@ -76,7 +76,7 @@ class Scene
bool processTransforms(refptr<Node> node);
void processCamera(refptr<Node> node);
void processOptions(refptr<Node> node);
void processTransformBlock(refptr<Node> node);
std::vector< refptr<Shape> > processTransformBlock(refptr<Node> node);
void processMaterialDefinition(refptr<Node> node);
void processShapeDefinition(refptr<Node> node);