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:
1 parent
fc2c62d5ac
commit
b4a2c8ef8e
7 files changed
+73
-36
No files matched your search
+63
-21
@@ -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
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user