Fixed mesh loading

stable-5.2
Armin Burgmeier 2009-07-11 01:09:48 +02:00
parent 3d359840a1
commit a3f1ccf66e
3 changed files with 23 additions and 9 deletions

View File

@ -129,6 +129,10 @@ public:
class StdMeshMatManager class StdMeshMatManager
{ {
public: public:
// Remove all materials from manager. Make sure there is no StdMesh
// referencing any out there before calling this.
void Clear();
// Parse a material script file, and add the materials to the manager. // Parse a material script file, and add the materials to the manager.
// filename may be NULL if the source is not a file. It will only be used // filename may be NULL if the source is not a file. It will only be used
// for error messages. // for error messages.

View File

@ -47,7 +47,7 @@ private:
StdMeshXML::StdMeshXML(const char* filename, const char* xml_data): StdMeshXML::StdMeshXML(const char* filename, const char* xml_data):
FileName(filename) FileName(filename)
{ {
Document.Parse(filename); Document.Parse(xml_data);
if(Document.Error()) if(Document.Error())
throw StdMeshError(StdStrBuf(Document.ErrorDesc()), FileName.getData(), Document.ErrorRow()); throw StdMeshError(StdStrBuf(Document.ErrorDesc()), FileName.getData(), Document.ErrorRow());
} }
@ -338,6 +338,11 @@ void StdMesh::InitXML(const char* filename, const char* xml_data, StdMeshSkeleto
TiXmlElement* submesh_elem = mesh.RequireFirstChild(submeshes_elem, "submesh"); TiXmlElement* submesh_elem = mesh.RequireFirstChild(submeshes_elem, "submesh");
TiXmlElement* geometry_elem = mesh.RequireFirstChild(submesh_elem, "geometry"); TiXmlElement* geometry_elem = mesh.RequireFirstChild(submesh_elem, "geometry");
const char* material = mesh.RequireStrAttribute(submesh_elem, "material");
Material = manager.GetMaterial(material);
if(!Material)
mesh.Error(FormatString("There is no such material named '%s'", material), submesh_elem);
int VertexCount = mesh.RequireIntAttribute(geometry_elem, "vertexcount"); int VertexCount = mesh.RequireIntAttribute(geometry_elem, "vertexcount");
Vertices.resize(VertexCount); Vertices.resize(VertexCount);
@ -557,7 +562,7 @@ void StdMesh::InitXML(const char* filename, const char* xml_data, StdMeshSkeleto
TiXmlElement* translate_elem = skeleton.RequireFirstChild(keyframe_elem, "translate"); TiXmlElement* translate_elem = skeleton.RequireFirstChild(keyframe_elem, "translate");
TiXmlElement* rotate_elem = skeleton.RequireFirstChild(keyframe_elem, "rotate"); TiXmlElement* rotate_elem = skeleton.RequireFirstChild(keyframe_elem, "rotate");
TiXmlElement* scale_elem = skeleton.RequireFirstChild(scale_elem, "scale"); TiXmlElement* scale_elem = skeleton.RequireFirstChild(keyframe_elem, "scale");
TiXmlElement* axis_elem = skeleton.RequireFirstChild(rotate_elem, "axis"); TiXmlElement* axis_elem = skeleton.RequireFirstChild(rotate_elem, "axis");
float dx = skeleton.RequireFloatAttribute(translate_elem, "x"); float dx = skeleton.RequireFloatAttribute(translate_elem, "x");

View File

@ -289,22 +289,22 @@ void StdMeshMaterialPass::Load(StdMeshMaterialParserCtx& ctx)
} }
else if(token_name == "specular") else if(token_name == "specular")
{ {
Diffuse[0] = ctx.AdvanceFloat(); Specular[0] = ctx.AdvanceFloat();
Diffuse[1] = ctx.AdvanceFloat(); Specular[1] = ctx.AdvanceFloat();
Diffuse[2] = ctx.AdvanceFloat(); Specular[2] = ctx.AdvanceFloat();
// The fourth argument is optional, not the fifth: // The fourth argument is optional, not the fifth:
float diffuse3 = ctx.AdvanceFloat(); float specular3 = ctx.AdvanceFloat();
float shininess; float shininess;
if(ctx.AdvanceFloatOptional(shininess)) if(ctx.AdvanceFloatOptional(shininess))
{ {
Diffuse[3] = diffuse3; Specular[3] = specular3;
Shininess = shininess; Shininess = shininess;
} }
else else
{ {
Shininess = diffuse3; Shininess = specular3;
} }
} }
else if(token_name == "emissive") else if(token_name == "emissive")
@ -373,13 +373,18 @@ void StdMeshMaterial::Load(StdMeshMaterialParserCtx& ctx)
ctx.Error(StdStrBuf("'") + token_name.getData() + "' unexpected"); ctx.Error(StdStrBuf("'") + token_name.getData() + "' unexpected");
} }
void StdMeshMatManager::Clear()
{
Materials.clear();
}
void StdMeshMatManager::Parse(const char* mat_script, const char* filename, StdMeshMaterialTextureLoader& tex_loader) void StdMeshMatManager::Parse(const char* mat_script, const char* filename, StdMeshMaterialTextureLoader& tex_loader)
{ {
StdMeshMaterialParserCtx ctx(mat_script, filename, tex_loader); StdMeshMaterialParserCtx ctx(mat_script, filename, tex_loader);
Token token; Token token;
StdStrBuf token_name; StdStrBuf token_name;
while((token = ctx.AdvanceNonEOF(token_name)) == TOKEN_IDTF) while((token = ctx.Advance(token_name)) == TOKEN_IDTF)
{ {
if(token_name == "material") if(token_name == "material")
{ {