FEATURE: First prototype for ObjFile material-importer, the assimp data structure will not be created yet.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@17 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
kimmi 2008-05-16 17:57:48 +00:00
parent 2eb6fca408
commit a052251bcf
8 changed files with 281 additions and 71 deletions

View File

@ -38,7 +38,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/
#ifndef OBJ_FILEDATA_H_INC
#define OBJ_FILEDATA_H_INC
@ -174,6 +173,7 @@ struct Model
std::vector<aiVector3D*> m_Normals;
//! Groupmap
GroupMap m_Groups;
//! Group to face id assignment
std::vector<unsigned int> *m_pGroupFaceIDs;
//! Active group
std::string m_strActiveGroup;

View File

@ -1,13 +1,14 @@
#include "ObjFileImporter.h"
#include "ObjFileParser.h"
#include "ObjFileData.h"
#include "../include/IOStream.h"
#include "../include/IOSystem.h"
#include "../include/aiMesh.h"
#include "../include/aiScene.h"
#include "IOStream.h"
#include "IOSystem.h"
#include "aiMesh.h"
#include "aiScene.h"
#include "aiAssert.h"
#include "MaterialSystem.h"
#include "DefaultLogger.h"
#include <boost/scoped_ptr.hpp>
#include <boost/format.hpp>
@ -47,7 +48,6 @@ bool ObjFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) c
if (pFile.empty())
return false;
DefaultLogger::get()->info("ObjFileImporter::CanRead");
string::size_type pos = pFile.find_last_of(".");
if (string::npos == pos)
return false;

View File

@ -1,12 +1,31 @@
#include "ObjFileMtlImporter.h"
#include "aiTypes.h"
#include "ObjTools.h"
#include "ObjFileData.h"
#include "aiAssert.h"
#include "fast_atof.h"
namespace Assimp
{
// -------------------------------------------------------------------
ObjFileMtlImporter::ObjFileMtlImporter()
ObjFileMtlImporter::ObjFileMtlImporter( std::vector<char> &buffer,
const std::string &strAbsPath,
ObjFile::Model *pModel ) :
m_DataIt( buffer.begin() ),
m_DataItEnd( buffer.end() ),
m_uiLine( 0 ),
m_pModel( NULL )
{
// TODO: Inplement this
ai_assert ( NULL != m_pModel );
if ( NULL == m_pModel->m_pDefaultMaterial )
{
m_pModel->m_pDefaultMaterial = new ObjFile::Material();
//m_pModel->m_pDefaultMaterial->
}
load();
}
// -------------------------------------------------------------------
@ -22,33 +41,154 @@ ObjFileMtlImporter::ObjFileMtlImporter(const ObjFileMtlImporter &rOther)
}
// -------------------------------------------------------------------
ObjFileMtlImporter &ObjFileMtlImporter::operator = (const ObjFileMtlImporter &rOther)
ObjFileMtlImporter &ObjFileMtlImporter::operator = (
const ObjFileMtlImporter &rOther)
{
return *this;
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::getColorRGBA()
void ObjFileMtlImporter::load()
{
if ( m_DataIt == m_DataItEnd )
return;
while ( m_DataIt != m_DataItEnd )
{
switch (*m_DataIt)
{
case 'K':
{
++m_DataIt;
if (*m_DataIt == 'a') // Ambient color
{
getColorRGBA( &m_pModel->m_pCurrentMaterial->ambient );
}
else if (*m_DataIt == 'd') // Diffuse color
{
getColorRGBA( &m_pModel->m_pCurrentMaterial->diffuse );
}
else if (*m_DataIt == 's')
{
getColorRGBA( &m_pModel->m_pCurrentMaterial->specular );
}
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
case 'd': // Alpha value
{
getFloatValue( m_pModel->m_pCurrentMaterial->alpha );
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
case 'N': // Shineness
{
getIlluminationModel( m_pModel->m_pCurrentMaterial->illumination_model );
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
case 'm': // Texture
{
getTexture();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
case 'n': // New material name
{
createMaterial();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
case 'i': // Illumination model
{
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
default:
{
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
}
}
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::getIlluminationModel()
void ObjFileMtlImporter::getColorRGBA( aiColor3D *pColor )
{
ai_assert( NULL != pColor );
float r, g, b;
m_DataIt = CopyNextWord<DataArrayIt>( m_DataIt, m_DataItEnd, m_buffer, BUFFERSIZE );
r = (float) fast_atof(m_buffer);
m_DataIt = CopyNextWord<DataArrayIt>( m_DataIt, m_DataItEnd, m_buffer, BUFFERSIZE );
g = (float) fast_atof(m_buffer);
m_DataIt = CopyNextWord<DataArrayIt>( m_DataIt, m_DataItEnd, m_buffer, BUFFERSIZE );
b = (float) fast_atof(m_buffer);
pColor->r = r;
pColor->g = g;
pColor->b = b;
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::getFloatValue()
void ObjFileMtlImporter::getIlluminationModel( int &illum_model )
{
m_DataIt = CopyNextWord<DataArrayIt>( m_DataIt, m_DataItEnd, m_buffer, BUFFERSIZE );
illum_model = atoi(m_buffer);
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::getFloatValue( float &value )
{
m_DataIt = CopyNextWord<DataArrayIt>( m_DataIt, m_DataItEnd, m_buffer, BUFFERSIZE );
value = (float) fast_atof(m_buffer);
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::createMaterial()
{
m_pModel->m_pCurrentMaterial = new ObjFile::Material();
/*m_DataIt = getNextToken<DataArrayIt>( m_DataIt, m_DataItEnd );
if (m_DataIt == m_DataItEnd)
return;
char *pStart = &(*m_DataIt);
while ( !isSpace(*m_DataIt) && m_DataIt != m_DataItEnd )
++m_DataIt;
// Get name
std::string strName(pStart, &(*m_DataIt));
if ( strName.empty() )
return;*/
std::string strName;
m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strName );
if ( m_DataItEnd == m_DataIt )
return;
m_pModel->m_pCurrentMaterial->MaterialName.Set( strName );
m_pModel->m_MaterialLib.push_back( strName );
m_pModel->m_MaterialMap[ strName ] = m_pModel->m_pCurrentMaterial;
}
// -------------------------------------------------------------------
void ObjFileMtlImporter::getTexture()
{
std::string strTexture;
m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strTexture );
if ( m_DataItEnd == m_DataIt )
return;
m_pModel->m_pCurrentMaterial->texture.Set( strTexture );
}
// -------------------------------------------------------------------

View File

@ -35,25 +35,41 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/
----------------------------------------------------------------------*/
#ifndef OBJFILEMTLIMPORTER_H_INC
#define OBJFILEMTLIMPORTER_H_INC
#include <vector>
struct aiColor3D;
namespace Assimp
{
namespace ObjFile
{
struct Model;
struct Material;
}
/**
* @class ObjFileMtlImporter
* @brief Loads the material description from a mtl file.
*/
class ObjFileMtlImporter
{
public:
static const size_t BUFFERSIZE = 1024;
typedef std::vector<char> DataArray;
typedef std::vector<char>::iterator DataArrayIt;
typedef std::vector<char>::const_iterator ConstDataArrayIt;
public:
//! \brief Default constructor
ObjFileMtlImporter();
ObjFileMtlImporter( std::vector<char> &buffer, const std::string &strAbsPath,
ObjFile::Model *pModel );
//! \brief DEstructor
~ObjFileMtlImporter();
@ -65,11 +81,20 @@ private:
//! \brief Assignment operator, returns only a reference of this instance.
ObjFileMtlImporter &operator = (const ObjFileMtlImporter &rOther);
void getColorRGBA();
void getIlluminationModel();
void getFloatValue();
void load();
void getColorRGBA( aiColor3D *pColor);
void getIlluminationModel( int &illum_model );
void getFloatValue( float &value );
void createMaterial();
void getTexture();
private:
std::string m_strAbsPath;
DataArrayIt m_DataIt;
DataArrayIt m_DataItEnd;
ObjFile::Model *m_pModel;
unsigned int m_uiLine;
char m_buffer[BUFFERSIZE];
};
} // Namespace Assimp

View File

@ -118,7 +118,7 @@ void ObjFileParser::parseFile()
default:
{
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
break;
}
@ -174,12 +174,13 @@ void ObjFileParser::getVector3(std::vector<aiVector3D*> &point3d_array)
z = (float) fast_atof(m_buffer);
point3d_array.push_back(new aiVector3D(x,y,z));
skipLine();
//skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
// Get values for a new 2D vector instance
void ObjFileParser::getVector2(std::vector<aiVector2D*> &point2d_array)
void ObjFileParser::getVector2( std::vector<aiVector2D*> &point2d_array )
{
float x, y;
copyNextWord(m_buffer, BUFFERSIZE);
@ -189,20 +190,8 @@ void ObjFileParser::getVector2(std::vector<aiVector2D*> &point2d_array)
y = (float) fast_atof(m_buffer);
point2d_array.push_back(new aiVector2D(x, y));
skipLine();
}
// -------------------------------------------------------------------
// Skips a line
void ObjFileParser::skipLine()
{
while (m_DataIt != m_DataItEnd && *m_DataIt != '\n')
++m_DataIt;
if (m_DataIt != m_DataItEnd)
{
++m_DataIt;
++m_uiLine;
}
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -212,6 +201,7 @@ void ObjFileParser::getFace()
copyNextLine(m_buffer, BUFFERSIZE);
if (m_DataIt == m_DataItEnd)
return;
char *pPtr = m_buffer;
char *pEnd = &pPtr[BUFFERSIZE];
pPtr = getNextToken<char*>(pPtr, pEnd);
@ -296,7 +286,7 @@ void ObjFileParser::getFace()
m_pModel->m_pCurrent->m_Faces.push_back(face);
// Skip the rest of the line
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -319,14 +309,14 @@ void ObjFileParser::getMaterialDesc()
// Search for material
std::string strFile;
std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find(strName);
std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find( strName );
if (it == m_pModel->m_MaterialMap.end())
{
m_pModel->m_pCurrentMaterial = new ObjFile::Material();
m_pModel->m_MaterialMap[strName] = m_pModel->m_pCurrentMaterial;
m_pModel->m_MaterialMap[ strName ] = m_pModel->m_pCurrentMaterial;
}
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -366,7 +356,7 @@ void ObjFileParser::getMaterialLib()
std::string absName = m_strAbsPath + IOSystem.getOsSeparator() + strMatName;
if (!IOSystem.Exists(absName))
{
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
return;
}
@ -379,20 +369,20 @@ void ObjFileParser::getMaterialLib()
if (0L != pFile)
{
size_t size = pFile->FileSize();
char *pBuffer = new char[size];
size_t read_size = pFile->Read(pBuffer, sizeof(char), size);
FileSystem.Close(pFile);
std::vector<char> buffer;
buffer.resize( size );
size_t read_size = pFile->Read( &buffer[ 0 ], sizeof(char), size );
FileSystem.Close( pFile );
// TODO: Load mtl file
delete [] pBuffer;
}
// Load material library (all materials will be created)
m_pModel->m_MaterialLib.push_back(strMatName);
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -421,7 +411,7 @@ void ObjFileParser::getNewMaterial()
m_pModel->m_pCurrentMaterial = (*it).second;
}
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -458,16 +448,16 @@ void ObjFileParser::getGroupName()
}
m_pModel->m_strActiveGroup = strGroupName;
}
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
// Not supported
void ObjFileParser::getGroupNumber()
{
// TODO: Implement this
// Not used
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
@ -509,7 +499,7 @@ void ObjFileParser::getObjectName()
m_pModel->m_Objects.push_back(m_pModel->m_pCurrent);*/
}
}
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
// -------------------------------------------------------------------
// Creates a new object instance
@ -528,7 +518,8 @@ void ObjFileParser::createObject(const std::string &strObjectName)
void ObjFileParser::reportErrorTokenInFace()
{
std::string strErr("");
skipLine();
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
std::cerr << "Not supported token in face desc. detected : " << strErr << std::endl;
}

View File

@ -78,7 +78,7 @@ inline Char_T getNextWord(Char_T pBuffer, Char_T pEnd)
* @param pBuffer Pointer to data buffer
* @param pEnd Pointer to end of buffer
* @return Pointer to next token
*/
*/
template<class Char_T>
inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd)
{
@ -91,6 +91,65 @@ inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd)
return getNextWord(pBuffer, pEnd);
}
/** @brief Skips a line
* @param Iterator set to current position
* @param Iterator set to end of scratch buffer for readout
* @param Current linenumber in format
* @return Current-iterator with new position
*/
template<class char_t>
inline char_t skipLine(char_t it, char_t end, unsigned int &uiLine)
{
while ( it != end && *it != '\n' )
++it;
if ( it != end )
{
++it;
++uiLine;
}
return it;
}
template<class char_t>
inline char_t getName( char_t it, char_t end, std::string &name )
{
name = "";
it = getNextToken<char_t>( it, end );
if ( it == end )
return end;
char *pStart = &(*it);
while ( !isSpace(*it) && it != end )
++it;
// Get name
std::string strName(pStart, &(*it));
if ( strName.empty() )
return it;
else
name = strName;
return it;
}
template<class char_t>
inline char_t CopyNextWord( char_t it, char_t end, char *pBuffer, size_t length )
{
size_t index = 0;
it = getNextWord<char_t>( it, end );
while (!isSpace( *it ) && it != end )
{
pBuffer[index] = *it ;
index++;
if (index == length-1)
break;
++it;
}
pBuffer[index] = '\0';
return it;
}
} // Namespace Assimp
#endif

View File

@ -81,7 +81,6 @@ private:
void copyNextLine(char *pBuffer, size_t length);
void getVector3(std::vector<aiVector3D*> &point3d_array);
void getVector2(std::vector<aiVector2D*> &point2d_array);
void skipLine();
void getFace();
void getMaterialDesc();
void getComment();

View File

@ -1,20 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp_view", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
ProjectSection(ProjectDependencies) = postProject
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
EndProjectSection
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp_view", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
ProjectSection(WebsiteProperties) = preProject
Debug.AspNetCompiler.Debug = "True"
Release.AspNetCompiler.Debug = "False"
EndProjectSection
ProjectSection(ProjectDependencies) = postProject
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
EndProjectSection
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -24,6 +20,12 @@ Global
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug_DLL|Win32.ActiveCfg = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug|Win32.ActiveCfg = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug|Win32.Build.0 = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release_DLL|Win32.ActiveCfg = Release|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release|Win32.ActiveCfg = Release|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release|Win32.Build.0 = Release|Win32
{5691E159-2D9B-407F-971F-EA5C592DC524}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32
{5691E159-2D9B-407F-971F-EA5C592DC524}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32
{5691E159-2D9B-407F-971F-EA5C592DC524}.Debug|Win32.ActiveCfg = Debug|Win32
@ -32,12 +34,6 @@ Global
{5691E159-2D9B-407F-971F-EA5C592DC524}.Release_DLL|Win32.Build.0 = Release_DLL|Win32
{5691E159-2D9B-407F-971F-EA5C592DC524}.Release|Win32.ActiveCfg = Release|Win32
{5691E159-2D9B-407F-971F-EA5C592DC524}.Release|Win32.Build.0 = Release|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug_DLL|Win32.ActiveCfg = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug|Win32.ActiveCfg = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Debug|Win32.Build.0 = Debug|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release_DLL|Win32.ActiveCfg = Release|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release|Win32.ActiveCfg = Release|Win32
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE