Initiual commit: AssetImporter source moved from ZFXCE repository to its own repository. PLease do not use the ZFXCE repo any more.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
This commit is contained in:
285
code/MaterialSystem.cpp
Normal file
285
code/MaterialSystem.cpp
Normal file
@@ -0,0 +1,285 @@
|
||||
|
||||
|
||||
#include "assimp.h"
|
||||
#include "aiMaterial.h"
|
||||
#include "assimp.hpp"
|
||||
#include "MaterialSystem.h"
|
||||
|
||||
|
||||
#include "../include/aiAssert.h"
|
||||
|
||||
using namespace Assimp;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn aiGetMaterialProperty(const aiMaterial* pMat,
|
||||
const char* pKey,
|
||||
const aiMaterialProperty** pPropOut)
|
||||
{
|
||||
#if (defined DEBUG)
|
||||
|
||||
ai_assert (pMat != NULL);
|
||||
ai_assert (pKey != NULL);
|
||||
ai_assert (pPropOut != NULL);
|
||||
|
||||
#endif // ASSIMP_DEBUG
|
||||
|
||||
for (unsigned int i = 0; i < pMat->mNumProperties;++i)
|
||||
{
|
||||
if (NULL != pMat->mProperties[i])
|
||||
{
|
||||
if (0 == ASSIMP_stricmp( pMat->mProperties[i]->mKey->data, pKey ))
|
||||
{
|
||||
*pPropOut = pMat->mProperties[i];
|
||||
return AI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
*pPropOut = NULL;
|
||||
return AI_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat,
|
||||
const char* pKey,
|
||||
float* pOut,
|
||||
unsigned int* pMax)
|
||||
{
|
||||
#if (defined DEBUG)
|
||||
|
||||
ai_assert (pMat != NULL);
|
||||
ai_assert (pKey != NULL);
|
||||
ai_assert (pOut != NULL);
|
||||
|
||||
#endif // ASSIMP_DEBUG
|
||||
|
||||
for (unsigned int i = 0; i < pMat->mNumProperties;++i)
|
||||
{
|
||||
if (NULL != pMat->mProperties[i])
|
||||
{
|
||||
if (0 == ASSIMP_stricmp( pMat->mProperties[i]->mKey->data, pKey ))
|
||||
{
|
||||
// data is given in floats, simply copy it
|
||||
if( aiPTI_Float == pMat->mProperties[i]->mType ||
|
||||
aiPTI_Buffer == pMat->mProperties[i]->mType)
|
||||
{
|
||||
unsigned int iWrite = pMat->mProperties[i]->
|
||||
mDataLength / sizeof(float);
|
||||
|
||||
if (NULL != pMax)
|
||||
iWrite = *pMax < iWrite ? *pMax : iWrite;
|
||||
|
||||
memcpy (pOut, pMat->mProperties[i]->mData, iWrite * sizeof (float));
|
||||
|
||||
if (NULL != pMax)
|
||||
*pMax = iWrite;
|
||||
}
|
||||
// data is given in ints, convert to float
|
||||
else if( aiPTI_Integer == pMat->mProperties[i]->mType)
|
||||
{
|
||||
unsigned int iWrite = pMat->mProperties[i]->
|
||||
mDataLength / sizeof(int);
|
||||
|
||||
if (NULL != pMax)
|
||||
iWrite = *pMax < iWrite ? *pMax : iWrite;
|
||||
|
||||
for (unsigned int a = 0; a < iWrite;++a)
|
||||
{
|
||||
pOut[a] = (float) ((int*)pMat->mProperties[i]->mData)[a];
|
||||
}
|
||||
if (NULL != pMax)
|
||||
*pMax = iWrite;
|
||||
}
|
||||
// it is a string ... no way to read something out of this
|
||||
else
|
||||
{
|
||||
if (NULL != pMax)
|
||||
*pMax = 0;
|
||||
return AI_FAILURE;
|
||||
}
|
||||
return AI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
return AI_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn aiGetMaterialIntegerArray(const aiMaterial* pMat,
|
||||
const char* pKey,
|
||||
int* pOut,
|
||||
unsigned int* pMax)
|
||||
{
|
||||
#if (defined DEBUG)
|
||||
|
||||
ai_assert (pMat != NULL);
|
||||
ai_assert (pKey != NULL);
|
||||
ai_assert (pOut != NULL);
|
||||
|
||||
#endif // ASSIMP_DEBUG
|
||||
|
||||
for (unsigned int i = 0; i < pMat->mNumProperties;++i)
|
||||
{
|
||||
if (NULL != pMat->mProperties[i])
|
||||
{
|
||||
if (0 == ASSIMP_stricmp( pMat->mProperties[i]->mKey->data, pKey ))
|
||||
{
|
||||
// data is given in ints, simply copy it
|
||||
if( aiPTI_Integer == pMat->mProperties[i]->mType ||
|
||||
aiPTI_Buffer == pMat->mProperties[i]->mType)
|
||||
{
|
||||
unsigned int iWrite = pMat->mProperties[i]->
|
||||
mDataLength / sizeof(int);
|
||||
|
||||
if (NULL != pMax)
|
||||
iWrite = *pMax < iWrite ? *pMax : iWrite;
|
||||
|
||||
memcpy (pOut, pMat->mProperties[i]->mData, iWrite * sizeof (int));
|
||||
|
||||
if (NULL != pMax)
|
||||
*pMax = iWrite;
|
||||
}
|
||||
// data is given in floats convert to int (lossy!)
|
||||
else if( aiPTI_Float == pMat->mProperties[i]->mType)
|
||||
{
|
||||
unsigned int iWrite = pMat->mProperties[i]->
|
||||
mDataLength / sizeof(float);
|
||||
|
||||
if (NULL != pMax)
|
||||
iWrite = *pMax < iWrite ? *pMax : iWrite;
|
||||
|
||||
for (unsigned int a = 0; a < iWrite;++a)
|
||||
{
|
||||
pOut[a] = (int) ((float*)pMat->mProperties[i]->mData)[a];
|
||||
}
|
||||
if (NULL != pMax)
|
||||
*pMax = iWrite;
|
||||
}
|
||||
// it is a string ... no way to read something out of this
|
||||
else
|
||||
{
|
||||
if (NULL != pMax)
|
||||
*pMax = 0;
|
||||
return AI_FAILURE;
|
||||
}
|
||||
return AI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
return AI_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn aiGetMaterialColor(const aiMaterial* pMat,
|
||||
const char* pKey,
|
||||
aiColor4D* pOut)
|
||||
{
|
||||
unsigned int iMax = 4;
|
||||
aiReturn eRet = aiGetMaterialFloatArray(pMat,pKey,(float*)pOut,&iMax);
|
||||
|
||||
// if no alpha channel is provided set it to 1.0 by default
|
||||
if (3 == iMax)pOut->a = 1.0f;
|
||||
return eRet;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn aiGetMaterialString(const aiMaterial* pMat,
|
||||
const char* pKey,
|
||||
aiString* pOut)
|
||||
{
|
||||
#if (defined DEBUG)
|
||||
|
||||
ai_assert (pMat != NULL);
|
||||
ai_assert (pKey != NULL);
|
||||
ai_assert (pOut != NULL);
|
||||
|
||||
#endif // ASSIMP_DEBUG
|
||||
|
||||
for (unsigned int i = 0; i < pMat->mNumProperties;++i)
|
||||
{
|
||||
if (NULL != pMat->mProperties[i])
|
||||
{
|
||||
if (0 == ASSIMP_stricmp( pMat->mProperties[i]->mKey->data, pKey ))
|
||||
{
|
||||
if( aiPTI_String == pMat->mProperties[i]->mType)
|
||||
{
|
||||
memcpy (pOut, pMat->mProperties[i]->mData,
|
||||
sizeof(aiString));
|
||||
}
|
||||
// wrong type
|
||||
else return AI_FAILURE;
|
||||
return AI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
return AI_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn MaterialHelper::AddBinaryProperty (const void* pInput,
|
||||
const unsigned int pSizeInBytes,
|
||||
const char* pKey,
|
||||
aiPropertyTypeInfo pType)
|
||||
{
|
||||
#if (defined DEBUG)
|
||||
|
||||
ai_assert (pInput != NULL);
|
||||
ai_assert (pKey != NULL);
|
||||
ai_assert (0 != pSizeInBytes);
|
||||
|
||||
#endif // ASSIMP_DEBUG
|
||||
|
||||
aiMaterialProperty* pcNew = new aiMaterialProperty();
|
||||
|
||||
// fill this
|
||||
pcNew->mKey = new aiString();
|
||||
pcNew->mType = pType;
|
||||
|
||||
pcNew->mDataLength = pSizeInBytes;
|
||||
pcNew->mData = new char[pSizeInBytes];
|
||||
memcpy (pcNew->mData,pInput,pSizeInBytes);
|
||||
|
||||
pcNew->mKey->length = strlen(pKey);
|
||||
ai_assert ( MAXLEN > pcNew->mKey->length);
|
||||
strcpy( pcNew->mKey->data, pKey );
|
||||
|
||||
// resize the array ... allocate
|
||||
// storage for 5 other properties
|
||||
if (this->mNumProperties == this->mNumAllocated)
|
||||
{
|
||||
unsigned int iOld = this->mNumAllocated;
|
||||
this->mNumAllocated += 5;
|
||||
|
||||
aiMaterialProperty** ppTemp = new aiMaterialProperty*[this->mNumAllocated];
|
||||
if (NULL == ppTemp)return AI_OUTOFMEMORY;
|
||||
|
||||
memcpy (ppTemp,this->mProperties,iOld * sizeof(void*));
|
||||
|
||||
delete[] this->mProperties;
|
||||
this->mProperties = ppTemp;
|
||||
}
|
||||
// push back ...
|
||||
this->mProperties[this->mNumProperties++] = pcNew;
|
||||
return AI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
aiReturn MaterialHelper::AddProperty (const aiString* pInput,
|
||||
const char* pKey)
|
||||
{
|
||||
return this->AddBinaryProperty(pInput,
|
||||
sizeof(aiString),pKey,aiPTI_String);
|
||||
}
|
||||
Reference in New Issue
Block a user