123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /*
- This file contains material related code. This is
- spilitted up from the main file OgreImporter.cpp
- to make it shorter and better amintainable.
- */
- #include "AssimpPCH.h"
- #ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
- #include <vector>
- #include <sstream>
- using namespace std;
- //#include "boost/format.hpp"
- //#include "boost/foreach.hpp"
- using namespace boost;
- #include "OgreImporter.h"
- #include "irrXMLWrapper.h"
- namespace Assimp
- {
- namespace Ogre
- {
- aiMaterial* OgreImporter::LoadMaterial(const std::string MaterialName)
- {
- MaterialHelper *NewMaterial=new MaterialHelper();
- aiString ts(MaterialName.c_str());
- NewMaterial->AddProperty(&ts, AI_MATKEY_NAME);
- /*For bettetr understanding of the material parser, here is a material example file:
- material Sarg
- {
- receive_shadows on
- technique
- {
- pass
- {
- ambient 0.500000 0.500000 0.500000 1.000000
- diffuse 0.640000 0.640000 0.640000 1.000000
- specular 0.500000 0.500000 0.500000 1.000000 12.500000
- emissive 0.000000 0.000000 0.000000 1.000000
- texture_unit
- {
- texture SargTextur.tga
- tex_address_mode wrap
- filtering linear linear none
- }
- }
- }
- }
- */
- string MaterialFileName=m_CurrentFilename.substr(0, m_CurrentFilename.find('.'))+".material";
- DefaultLogger::get()->info(str(format("Trying to load %1%") % MaterialFileName));
- //Read the file into memory and put it in a stringstream
- stringstream ss;
- {// after this block, the temporarly loaded data will be released
- IOStream* MatFilePtr=m_CurrentIOHandler->Open(MaterialFileName);
- if(NULL==MatFilePtr)
- {
- MatFilePtr=m_CurrentIOHandler->Open(m_MaterialLibFilename);
- if(NULL==MatFilePtr)
- {
- DefaultLogger::get()->error(m_MaterialLibFilename+" and "+MaterialFileName + " could not be opned, Material will not be loaded!");
- return NewMaterial;
- }
- }
- scoped_ptr<IOStream> MaterialFile(MatFilePtr);
- vector<char> FileData(MaterialFile->FileSize());
- MaterialFile->Read(&FileData[0], MaterialFile->FileSize(), 1);
- BaseImporter::ConvertToUTF8(FileData);
- ss << &FileData[0];
- }
- string Line;
- ss >> Line;
- // unsigned int Level=0;//Hierarchielevels in the material file, like { } blocks into another
- while(!ss.eof())
- {
- if(Line=="material")
- {
- ss >> Line;
- if(Line==MaterialName)//Load the next material
- {
- ss >> Line;
- if(Line!="{")
- throw DeadlyImportError("empty material!");
- while(Line!="}")//read until the end of the material
- {
- //Proceed to the first technique
- ss >> Line;
- if(Line=="technique")
- {
- ss >> Line;
- if(Line!="{")
- throw DeadlyImportError("empty technique!");
- while(Line!="}")//read until the end of the technique
- {
- ss >> Line;
- if(Line=="pass")
- {
- ss >> Line;
- if(Line!="{")
- throw DeadlyImportError("empty pass!");
- while(Line!="}")//read until the end of the pass
- {
- ss >> Line;
- if(Line=="ambient")
- {
- //read the ambient light values:
- }
- else if(Line=="diffuse")
- {
- }
- else if(Line=="specular")
- {
- }
- else if(Line=="emmisive")
- {
- }
- else if(Line=="texture_unit")
- {
- ss >> Line;
- if(Line!="{")
- throw DeadlyImportError("empty texture unit!");
- while(Line!="}")//read until the end of the texture_unit
- {
- ss >> Line;
- if(Line=="texture")
- {
- ss >> Line;
- aiString ts(Line.c_str());
- NewMaterial->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
- }
- }//end of texture unit
- }
- }
- }
- }//end of technique
-
- }
- DefaultLogger::get()->info(Line);
- //read informations from a custom material:
- if(Line=="set")
- {
- ss >> Line;
- if(Line=="$specular")//todo load this values:
- {
- }
- if(Line=="$diffuse")
- {
- }
- if(Line=="$ambient")
- {
- }
- if(Line=="$colormap")
- {
- ss >> Line;
- aiString ts(Line.c_str());
- NewMaterial->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
- }
- if(Line=="$normalmap")
- {
- ss >> Line;
- aiString ts(Line.c_str());
- NewMaterial->AddProperty(&ts, AI_MATKEY_TEXTURE(aiTextureType_NORMALS, 0));
- }
- }
- }//end of material
- }
- else {} //this is the wrong material, proceed the file until we reach the next material
- }
- ss >> Line;
- }
- return NewMaterial;
- }
- }//namespace Ogre
- }//namespace Assimp
- #endif // !! ASSIMP_BUILD_NO_OGRE_IMPORTER
|