nuclear@0: /* nuclear@0: --------------------------------------------------------------------------- nuclear@0: Open Asset Import Library (assimp) nuclear@0: --------------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2018, assimp team nuclear@0: nuclear@0: nuclear@0: nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the following nuclear@0: conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: --------------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file material.inl nuclear@0: * @brief Defines the C++ getters for the material system nuclear@0: */ nuclear@0: nuclear@0: #pragma once nuclear@0: #ifndef AI_MATERIAL_INL_INC nuclear@0: #define AI_MATERIAL_INL_INC nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiPropertyTypeInfo ai_real_to_property_type_info(float) nuclear@0: { nuclear@0: return aiPTI_Float; nuclear@0: } nuclear@0: nuclear@0: inline aiPropertyTypeInfo ai_real_to_property_type_info(double) nuclear@0: { nuclear@0: return aiPTI_Double; nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: nuclear@0: //! @cond never nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::GetTexture( aiTextureType type, nuclear@0: unsigned int index, nuclear@0: C_STRUCT aiString* path, nuclear@0: aiTextureMapping* mapping /*= NULL*/, nuclear@0: unsigned int* uvindex /*= NULL*/, nuclear@0: ai_real* blend /*= NULL*/, nuclear@0: aiTextureOp* op /*= NULL*/, nuclear@0: aiTextureMapMode* mapmode /*= NULL*/) const nuclear@0: { nuclear@0: return ::aiGetMaterialTexture(this,type,index,path,mapping,uvindex,blend,op,mapmode); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline unsigned int aiMaterial::GetTextureCount(aiTextureType type) const nuclear@0: { nuclear@0: return ::aiGetMaterialTextureCount(this,type); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx, Type* pOut, nuclear@0: unsigned int* pMax) const nuclear@0: { nuclear@0: unsigned int iNum = pMax ? *pMax : 1; nuclear@0: nuclear@0: const aiMaterialProperty* prop; nuclear@0: const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx, nuclear@0: (const aiMaterialProperty**)&prop); nuclear@0: if ( AI_SUCCESS == ret ) { nuclear@0: nuclear@0: if (prop->mDataLength < sizeof(Type)*iNum) { nuclear@0: return AI_FAILURE; nuclear@0: } nuclear@0: nuclear@0: if (prop->mType != aiPTI_Buffer) { nuclear@0: return AI_FAILURE; nuclear@0: } nuclear@0: nuclear@0: iNum = std::min((size_t)iNum,prop->mDataLength / sizeof(Type)); nuclear@0: ::memcpy(pOut,prop->mData,iNum * sizeof(Type)); nuclear@0: if (pMax) { nuclear@0: *pMax = iNum; nuclear@0: } nuclear@0: } nuclear@0: return ret; nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,Type& pOut) const nuclear@0: { nuclear@0: const aiMaterialProperty* prop; nuclear@0: const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx, nuclear@0: (const aiMaterialProperty**)&prop); nuclear@0: if ( AI_SUCCESS == ret ) { nuclear@0: nuclear@0: if (prop->mDataLength < sizeof(Type)) { nuclear@0: return AI_FAILURE; nuclear@0: } nuclear@0: nuclear@0: if (prop->mType != aiPTI_Buffer) { nuclear@0: return AI_FAILURE; nuclear@0: } nuclear@0: nuclear@0: ::memcpy( &pOut, prop->mData, sizeof( Type ) ); nuclear@0: } nuclear@0: return ret; nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,ai_real* pOut, nuclear@0: unsigned int* pMax) const nuclear@0: { nuclear@0: return ::aiGetMaterialFloatArray(this,pKey,type,idx,pOut,pMax); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,int* pOut, nuclear@0: unsigned int* pMax) const nuclear@0: { nuclear@0: return ::aiGetMaterialIntegerArray(this,pKey,type,idx,pOut,pMax); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,ai_real& pOut) const nuclear@0: { nuclear@0: return aiGetMaterialFloat(this,pKey,type,idx,&pOut); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,int& pOut) const nuclear@0: { nuclear@0: return aiGetMaterialInteger(this,pKey,type,idx,&pOut); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,aiColor4D& pOut) const nuclear@0: { nuclear@0: return aiGetMaterialColor(this,pKey,type,idx,&pOut); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,aiColor3D& pOut) const nuclear@0: { nuclear@0: aiColor4D c; nuclear@0: const aiReturn ret = aiGetMaterialColor(this,pKey,type,idx,&c); nuclear@0: pOut = aiColor3D(c.r,c.g,c.b); nuclear@0: return ret; nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,aiString& pOut) const nuclear@0: { nuclear@0: return aiGetMaterialString(this,pKey,type,idx,&pOut); nuclear@0: } nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type, nuclear@0: unsigned int idx,aiUVTransform& pOut) const nuclear@0: { nuclear@0: return aiGetMaterialUVTransform(this,pKey,type,idx,&pOut); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template nuclear@0: aiReturn aiMaterial::AddProperty (const TYPE* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(TYPE), nuclear@0: pKey,type,index,aiPTI_Buffer); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const float* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(float), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const double* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(double), nuclear@0: pKey,type,index,aiPTI_Double); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiUVTransform), nuclear@0: pKey,type,index,ai_real_to_property_type_info(pInput->mRotation)); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiColor4D), nuclear@0: pKey,type,index,ai_real_to_property_type_info(pInput->a)); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiColor3D), nuclear@0: pKey,type,index,ai_real_to_property_type_info(pInput->b)); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiVector3D), nuclear@0: pKey,type,index,ai_real_to_property_type_info(pInput->x)); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: inline aiReturn aiMaterial::AddProperty(const int* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(int), nuclear@0: pKey,type,index,aiPTI_Integer); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: // The template specializations below are for backwards compatibility. nuclear@0: // The recommended way to add material properties is using the non-template nuclear@0: // overloads. nuclear@0: // --------------------------------------------------------------------------- nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const float* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(float), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const double* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(double), nuclear@0: pKey,type,index,aiPTI_Double); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiUVTransform), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiColor4D), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiColor3D), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(aiVector3D), nuclear@0: pKey,type,index,aiPTI_Float); nuclear@0: } nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: template<> nuclear@0: inline aiReturn aiMaterial::AddProperty(const int* pInput, nuclear@0: const unsigned int pNumValues, nuclear@0: const char* pKey, nuclear@0: unsigned int type, nuclear@0: unsigned int index) nuclear@0: { nuclear@0: return AddBinaryProperty((const void*)pInput, nuclear@0: pNumValues * sizeof(int), nuclear@0: pKey,type,index,aiPTI_Integer); nuclear@0: } nuclear@0: nuclear@0: //! @endcond nuclear@0: nuclear@0: #endif //! AI_MATERIAL_INL_INC