Scene-load.cc handling material definitions

git-svn-id: svn://anubis/fart/trunk@178 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2009-03-03 02:56:33 +00:00
parent fce4d82a73
commit 31e2604f98
3 changed files with 45 additions and 5 deletions

View File

@ -57,6 +57,10 @@ void Scene::processNode(refptr<Node> node)
{ {
processTransformBlock(node); processTransformBlock(node);
} }
else if ( typeid(*node) == typeid(MaterialDefinitionNode) )
{
processMaterialDefinition(node);
}
else else
{ {
cerr << __FILE__ << ": " << __LINE__ cerr << __FILE__ << ": " << __LINE__
@ -183,8 +187,38 @@ void Scene::processTransformBlock(refptr<Node> node)
m_transforms.pop(); m_transforms.pop();
} }
void Scene::processMaterialDefinition(refptr<Node> node)
{
map< string, refptr<Material> >::iterator it =
m_materials.find(node->getString());
if ( it == m_materials.end() )
{
m_materials[node->getString()] = processMaterial(node);
}
else
{
cerr << "Error: duplicate material definition for material '"
<< node->getString() << "'" << endl;
exit(4);
}
}
refptr<Material> Scene::processMaterial(refptr<Node> node) refptr<Material> Scene::processMaterial(refptr<Node> node)
{ {
if ( typeid(*node) == typeid(MaterialRefNode) )
{
map< string, refptr<Material> >::iterator it =
m_materials.find(node->getString());
if ( it == m_materials.end() )
{
cerr << "Undefined material '" << node->getString()
<< "' requested!" << endl;
exit(4);
}
return m_materials[node->getString()];
}
refptr<Material> material = new Material(); refptr<Material> material = new Material();
for (Node_Iterator it = node->getChildren().begin(); for (Node_Iterator it = node->getChildren().begin();
@ -236,7 +270,7 @@ refptr<Shape> Scene::processBox(refptr<Node> node)
{ {
size = (*it)->getVector(); size = (*it)->getVector();
} }
else if ( typeid(**it) == typeid(MaterialNode) ) else if ( (*it)->isMaterial() )
{ {
material = processMaterial(*it); material = processMaterial(*it);
} }
@ -273,7 +307,7 @@ refptr<Shape> Scene::processCyl(refptr<Node> node)
radius2 = v[1]; radius2 = v[1];
height = v[2]; height = v[2];
} }
else if ( typeid(**it) == typeid(MaterialNode) ) else if ( (*it)->isMaterial() )
{ {
material = processMaterial(*it); material = processMaterial(*it);
} }
@ -340,7 +374,7 @@ refptr<Shape> Scene::processPlane(refptr<Node> node)
normal = *(*it)->getVector(); normal = *(*it)->getVector();
dist = (*it)->getNumber(); dist = (*it)->getNumber();
} }
else if ( typeid(**it) == typeid(MaterialNode) ) else if ( (*it)->isMaterial() )
{ {
material = processMaterial(*it); material = processMaterial(*it);
} }
@ -375,7 +409,7 @@ refptr<Shape> Scene::processSphere(refptr<Node> node)
{ {
radius = (*it)->getNumber(); radius = (*it)->getNumber();
} }
else if ( typeid(**it) == typeid(MaterialNode) ) else if ( (*it)->isMaterial() )
{ {
material = processMaterial(*it); material = processMaterial(*it);
} }
@ -415,7 +449,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
} }
shapes_seen++; shapes_seen++;
} }
else if ( typeid(**it) == typeid(MaterialNode) ) else if ( (*it)->isMaterial() )
{ {
material = processMaterial(*it); material = processMaterial(*it);
} }

View File

@ -70,6 +70,7 @@ class Scene
void processCamera(refptr<Node> node); void processCamera(refptr<Node> node);
void processOptions(refptr<Node> node); void processOptions(refptr<Node> node);
void processTransformBlock(refptr<Node> node); void processTransformBlock(refptr<Node> node);
void processMaterialDefinition(refptr<Node> node);
/* rendering parameters */ /* rendering parameters */
int m_width; int m_width;
@ -89,6 +90,7 @@ class Scene
int m_multisample_level_squared; int m_multisample_level_squared;
double m_sample_span; double m_sample_span;
double m_half_sample_span; double m_half_sample_span;
std::map< std::string, refptr<Material> > m_materials;
/* framebuffer */ /* framebuffer */
unsigned char * m_data; unsigned char * m_data;

View File

@ -22,6 +22,7 @@ class Node
return refptr<Vector>(NULL); return refptr<Vector>(NULL);
} }
virtual bool isShape() { return false; } virtual bool isShape() { return false; }
virtual bool isMaterial() { return false; }
virtual std::string getString() { return ""; } virtual std::string getString() { return ""; }
protected: protected:
@ -135,6 +136,8 @@ class LookAtNode : public VectorNode
class MaterialNode : public Node class MaterialNode : public Node
{ {
public:
bool isMaterial() { return true; }
}; };
class MaterialDefinitionNode : public IdentifierNode class MaterialDefinitionNode : public IdentifierNode
@ -147,6 +150,7 @@ class MaterialRefNode : public IdentifierNode
{ {
public: public:
MaterialRefNode(const std::string & str) : IdentifierNode(str) {} MaterialRefNode(const std::string & str) : IdentifierNode(str) {}
bool isMaterial() { return true; }
}; };
class MultisampleNode : public IntegerNode class MultisampleNode : public IntegerNode