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:
parent
7014605fe3
commit
91ea5a20e0
@ -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);
|
||||||
|
|
||||||
|
23
main/Scene.h
23
main/Scene.h
@ -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;
|
||||||
|
@ -125,6 +125,7 @@ class Shape
|
|||||||
refptr<Material> m_material;
|
refptr<Material> m_material;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef refptr<Shape> ShapeRef;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user