added Scene::process{Camera,Options,TransformBlock}()
git-svn-id: svn://anubis/fart/trunk@168 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
32fcafc687
commit
bb07e12193
@ -12,7 +12,6 @@ typedef vector< refptr<Node> >::const_iterator Node_Iterator;
|
|||||||
|
|
||||||
void Scene::load(const char * filename)
|
void Scene::load(const char * filename)
|
||||||
{
|
{
|
||||||
/* TODO: parse file somehow */
|
|
||||||
refptr<Node> node = parse(filename);
|
refptr<Node> node = parse(filename);
|
||||||
processNode(node);
|
processNode(node);
|
||||||
|
|
||||||
@ -122,6 +121,43 @@ void Scene::processNode(refptr<Node> node)
|
|||||||
{
|
{
|
||||||
processChildren(node);
|
processChildren(node);
|
||||||
}
|
}
|
||||||
|
else if ( node->isShape() )
|
||||||
|
{
|
||||||
|
refptr<Shape> shape = processShape(node);
|
||||||
|
if ( ! shape.isNull() )
|
||||||
|
m_shapes.push_back(shape);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(LightNode) )
|
||||||
|
{
|
||||||
|
refptr<Light> light = processLight(node);
|
||||||
|
if ( ! light.isNull() )
|
||||||
|
m_lights.push_back(light);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(CameraNode) )
|
||||||
|
{
|
||||||
|
processCamera(node);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(OptionsNode) )
|
||||||
|
{
|
||||||
|
processOptions(node);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(TranslateBlockNode) )
|
||||||
|
{
|
||||||
|
processTransformBlock(node);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(RotateBlockNode) )
|
||||||
|
{
|
||||||
|
processTransformBlock(node);
|
||||||
|
}
|
||||||
|
else if ( typeid(*node) == typeid(ScaleBlockNode) )
|
||||||
|
{
|
||||||
|
processTransformBlock(node);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << __FILE__ << ": " << __LINE__
|
||||||
|
<< ": error: unrecognized node!" << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
refptr<Shape> Scene::processShape(refptr<Node> node)
|
refptr<Shape> Scene::processShape(refptr<Node> node)
|
||||||
@ -167,6 +203,45 @@ void Scene::processChildren(refptr<Node> node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::processCamera(refptr<Node> node)
|
||||||
|
{
|
||||||
|
Vector position(0, 0, 0);
|
||||||
|
Vector look_at(0, 1, 0);
|
||||||
|
Vector up(0, 0, 1);
|
||||||
|
|
||||||
|
for (Node_Iterator it = node->getChildren().begin();
|
||||||
|
it != node->getChildren().end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
if ( typeid(**it) == typeid(PositionNode) )
|
||||||
|
{
|
||||||
|
position = * (*it)->getVector();
|
||||||
|
}
|
||||||
|
else if ( typeid(**it) == typeid(LookAtNode) )
|
||||||
|
{
|
||||||
|
look_at = * (*it)->getVector();
|
||||||
|
}
|
||||||
|
else if ( typeid(**it) == typeid(UpNode) )
|
||||||
|
{
|
||||||
|
up = * (*it)->getVector();
|
||||||
|
}
|
||||||
|
else if ( typeid(**it) == typeid(VFOVNode) )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_transforms.top().lookAt(position, look_at, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::processOptions(refptr<Node> node)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::processTransformBlock(refptr<Node> node)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
refptr<Material> Scene::processMaterial(refptr<Node> node)
|
refptr<Material> Scene::processMaterial(refptr<Node> node)
|
||||||
{
|
{
|
||||||
refptr<Material> material = new Material();
|
refptr<Material> material = new Material();
|
||||||
@ -276,7 +351,6 @@ refptr<Shape> Scene::processCyl(refptr<Node> node)
|
|||||||
|
|
||||||
refptr<Light> Scene::processLight(refptr<Node> node)
|
refptr<Light> Scene::processLight(refptr<Node> node)
|
||||||
{
|
{
|
||||||
/* TODO: finish */
|
|
||||||
return refptr<Light>(NULL);
|
return refptr<Light>(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +67,9 @@ class Scene
|
|||||||
refptr<Shape> processShape(refptr<Node> node);
|
refptr<Shape> processShape(refptr<Node> node);
|
||||||
refptr<Shape> processBool(refptr<Node> node);
|
refptr<Shape> processBool(refptr<Node> node);
|
||||||
bool processTransforms(refptr<Node> node);
|
bool processTransforms(refptr<Node> node);
|
||||||
|
void processCamera(refptr<Node> node);
|
||||||
|
void processOptions(refptr<Node> node);
|
||||||
|
void processTransformBlock(refptr<Node> node);
|
||||||
|
|
||||||
/* rendering parameters */
|
/* rendering parameters */
|
||||||
int m_width;
|
int m_width;
|
||||||
|
@ -113,8 +113,10 @@ class LightNode : public Node
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
class LookAtNode : public Node
|
class LookAtNode : public VectorNode
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
LookAtNode(refptr<Vector> vector) : VectorNode(vector) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class MaterialNode : public Node
|
class MaterialNode : public Node
|
||||||
@ -153,8 +155,10 @@ class PlanePositionNode : public Node
|
|||||||
double m_dist;
|
double m_dist;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PositionNode : public Node
|
class PositionNode : public VectorNode
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
PositionNode(refptr<Vector> vector) : VectorNode(vector) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RadiusNode : public NumberNode
|
class RadiusNode : public NumberNode
|
||||||
@ -256,8 +260,10 @@ class UnionNode : public Node
|
|||||||
bool isShape() { return true; }
|
bool isShape() { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class UpNode : public Node
|
class UpNode : public VectorNode
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
UpNode(refptr<Vector> vector) : VectorNode(vector) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class VFOVNode : public Node
|
class VFOVNode : public Node
|
||||||
|
@ -133,16 +133,13 @@ camera_items: /* empty */
|
|||||||
;
|
;
|
||||||
|
|
||||||
camera_item: POSITION vector {
|
camera_item: POSITION vector {
|
||||||
$$ = new PositionNode();
|
$$ = new PositionNode($2->getVector());
|
||||||
$$->addChild($2);
|
|
||||||
}
|
}
|
||||||
| LOOKAT vector {
|
| LOOKAT vector {
|
||||||
$$ = new LookAtNode();
|
$$ = new LookAtNode($2->getVector());
|
||||||
$$->addChild($2);
|
|
||||||
}
|
}
|
||||||
| UP vector {
|
| UP vector {
|
||||||
$$ = new UpNode();
|
$$ = new UpNode($2->getVector());
|
||||||
$$->addChild($2);
|
|
||||||
}
|
}
|
||||||
| VFOV vector {
|
| VFOV vector {
|
||||||
$$ = new VFOVNode();
|
$$ = new VFOVNode();
|
||||||
@ -193,8 +190,7 @@ light_items: /* empty */
|
|||||||
;
|
;
|
||||||
|
|
||||||
light_item: POSITION vector {
|
light_item: POSITION vector {
|
||||||
$$ = new PositionNode();
|
$$ = new PositionNode($2->getVector());
|
||||||
$$->addChild($2);
|
|
||||||
}
|
}
|
||||||
| DIFFUSE vector {
|
| DIFFUSE vector {
|
||||||
$$ = new DiffuseNode($2->getVector());
|
$$ = new DiffuseNode($2->getVector());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user