Scene-load.cc handling material definitions
git-svn-id: svn://anubis/fart/trunk@178 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
fce4d82a73
commit
31e2604f98
@ -57,6 +57,10 @@ void Scene::processNode(refptr<Node> node)
|
||||
{
|
||||
processTransformBlock(node);
|
||||
}
|
||||
else if ( typeid(*node) == typeid(MaterialDefinitionNode) )
|
||||
{
|
||||
processMaterialDefinition(node);
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << __FILE__ << ": " << __LINE__
|
||||
@ -183,8 +187,38 @@ void Scene::processTransformBlock(refptr<Node> node)
|
||||
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)
|
||||
{
|
||||
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();
|
||||
|
||||
for (Node_Iterator it = node->getChildren().begin();
|
||||
@ -236,7 +270,7 @@ refptr<Shape> Scene::processBox(refptr<Node> node)
|
||||
{
|
||||
size = (*it)->getVector();
|
||||
}
|
||||
else if ( typeid(**it) == typeid(MaterialNode) )
|
||||
else if ( (*it)->isMaterial() )
|
||||
{
|
||||
material = processMaterial(*it);
|
||||
}
|
||||
@ -273,7 +307,7 @@ refptr<Shape> Scene::processCyl(refptr<Node> node)
|
||||
radius2 = v[1];
|
||||
height = v[2];
|
||||
}
|
||||
else if ( typeid(**it) == typeid(MaterialNode) )
|
||||
else if ( (*it)->isMaterial() )
|
||||
{
|
||||
material = processMaterial(*it);
|
||||
}
|
||||
@ -340,7 +374,7 @@ refptr<Shape> Scene::processPlane(refptr<Node> node)
|
||||
normal = *(*it)->getVector();
|
||||
dist = (*it)->getNumber();
|
||||
}
|
||||
else if ( typeid(**it) == typeid(MaterialNode) )
|
||||
else if ( (*it)->isMaterial() )
|
||||
{
|
||||
material = processMaterial(*it);
|
||||
}
|
||||
@ -375,7 +409,7 @@ refptr<Shape> Scene::processSphere(refptr<Node> node)
|
||||
{
|
||||
radius = (*it)->getNumber();
|
||||
}
|
||||
else if ( typeid(**it) == typeid(MaterialNode) )
|
||||
else if ( (*it)->isMaterial() )
|
||||
{
|
||||
material = processMaterial(*it);
|
||||
}
|
||||
@ -415,7 +449,7 @@ refptr<Shape> Scene::processBool(refptr<Node> node)
|
||||
}
|
||||
shapes_seen++;
|
||||
}
|
||||
else if ( typeid(**it) == typeid(MaterialNode) )
|
||||
else if ( (*it)->isMaterial() )
|
||||
{
|
||||
material = processMaterial(*it);
|
||||
}
|
||||
|
@ -70,6 +70,7 @@ class Scene
|
||||
void processCamera(refptr<Node> node);
|
||||
void processOptions(refptr<Node> node);
|
||||
void processTransformBlock(refptr<Node> node);
|
||||
void processMaterialDefinition(refptr<Node> node);
|
||||
|
||||
/* rendering parameters */
|
||||
int m_width;
|
||||
@ -89,6 +90,7 @@ class Scene
|
||||
int m_multisample_level_squared;
|
||||
double m_sample_span;
|
||||
double m_half_sample_span;
|
||||
std::map< std::string, refptr<Material> > m_materials;
|
||||
|
||||
/* framebuffer */
|
||||
unsigned char * m_data;
|
||||
|
@ -22,6 +22,7 @@ class Node
|
||||
return refptr<Vector>(NULL);
|
||||
}
|
||||
virtual bool isShape() { return false; }
|
||||
virtual bool isMaterial() { return false; }
|
||||
virtual std::string getString() { return ""; }
|
||||
|
||||
protected:
|
||||
@ -135,6 +136,8 @@ class LookAtNode : public VectorNode
|
||||
|
||||
class MaterialNode : public Node
|
||||
{
|
||||
public:
|
||||
bool isMaterial() { return true; }
|
||||
};
|
||||
|
||||
class MaterialDefinitionNode : public IdentifierNode
|
||||
@ -147,6 +150,7 @@ class MaterialRefNode : public IdentifierNode
|
||||
{
|
||||
public:
|
||||
MaterialRefNode(const std::string & str) : IdentifierNode(str) {}
|
||||
bool isMaterial() { return true; }
|
||||
};
|
||||
|
||||
class MultisampleNode : public IntegerNode
|
||||
|
Loading…
x
Reference in New Issue
Block a user