Exemplo n.º 1
0
// -------------------------------------------------------------------
//	Gets a texture name from data.
void ObjFileMtlImporter::getTexture()
{
	aiString* out = NULL;

	// FIXME: just a quick'n'dirty hack, consider cleanup later

	// Diffuse texture
	if (!ASSIMP_strincmp(&(*m_DataIt),"map_kd",6))
		out = & m_pModel->m_pCurrentMaterial->texture;

	// Ambient texture
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ka",6))
		out = & m_pModel->m_pCurrentMaterial->textureAmbient;

	// Specular texture
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ks",6))
		out = & m_pModel->m_pCurrentMaterial->textureSpecular;

	// Opacity texture
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_d",5))
		out = & m_pModel->m_pCurrentMaterial->textureOpacity;

	// Ambient texture
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ka",6))
		out = & m_pModel->m_pCurrentMaterial->textureAmbient;

	// Bump texture
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_bump",8) || !ASSIMP_strincmp(&(*m_DataIt),"bump",4))
		out = & m_pModel->m_pCurrentMaterial->textureBump;

	// Specularity scaling (glossiness)
	else if (!ASSIMP_strincmp(&(*m_DataIt),"map_ns",6))
		out = & m_pModel->m_pCurrentMaterial->textureSpecularity;

	else
	{
		DefaultLogger::get()->error("OBJ/MTL: Encountered unknown texture type");
		return;
	}

	std::string strTexture;
	m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strTexture );
	if ( m_DataItEnd == m_DataIt )
		return;

	out->Set( strTexture );
}
Exemplo n.º 2
0
/* /////////////////////////////////////////////////////////////////////////////
 * Texture Option
 * /////////////////////////////////////////////////////////////////////////////
 * According to http://en.wikipedia.org/wiki/Wavefront_.obj_file#Texture_options
 * Texture map statement can contains various texture option, for example:
 *
 *	map_Ka -o 1 1 1 some.png
 *	map_Kd -clamp on some.png
 *
 * So we need to parse and skip these options, and leave the last part which is 
 * the url of image, otherwise we will get a wrong url like "-clamp on some.png".
 *
 * Because aiMaterial supports clamp option, so we also want to return it
 * /////////////////////////////////////////////////////////////////////////////
 */
void ObjFileMtlImporter::getTextureOption(bool &clamp)
{
	m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);

	//If there is any more texture option
	while (!isEndOfBuffer(m_DataIt, m_DataItEnd) && *m_DataIt == '-')
	{
		const char *pPtr( &(*m_DataIt) );
		//skip option key and value
		int skipToken = 1;

		if (!ASSIMP_strincmp(pPtr, ClampOption.c_str(), ClampOption.size()))
		{
			DataArrayIt it = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
			char value[3];
			CopyNextWord(it, m_DataItEnd, value, sizeof(value) / sizeof(*value));
			if (!ASSIMP_strincmp(value, "on", 2))
			{
				clamp = true;
			}

			skipToken = 2;
		}
		else if (  !ASSIMP_strincmp(pPtr, BlendUOption.c_str(), BlendUOption.size())
				|| !ASSIMP_strincmp(pPtr, BlendVOption.c_str(), BlendVOption.size())
				|| !ASSIMP_strincmp(pPtr, BoostOption.c_str(), BoostOption.size())
				|| !ASSIMP_strincmp(pPtr, ResolutionOption.c_str(), ResolutionOption.size())
				|| !ASSIMP_strincmp(pPtr, BumpOption.c_str(), BumpOption.size())
				|| !ASSIMP_strincmp(pPtr, ChannelOption.c_str(), ChannelOption.size())
				|| !ASSIMP_strincmp(pPtr, TypeOption.c_str(), TypeOption.size()) )
		{
			skipToken = 2;
		}
		else if (!ASSIMP_strincmp(pPtr, ModifyMapOption.c_str(), ModifyMapOption.size()))
		{
			skipToken = 3;
		}
		else if (  !ASSIMP_strincmp(pPtr, OffsetOption.c_str(), OffsetOption.size())
				|| !ASSIMP_strincmp(pPtr, ScaleOption.c_str(), ScaleOption.size())
				|| !ASSIMP_strincmp(pPtr, TurbulenceOption.c_str(), TurbulenceOption.size())
				)
		{
			skipToken = 4;
		}

		for (int i = 0; i < skipToken; ++i)
		{
			m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
		}
	}
}
Exemplo n.º 3
0
// -------------------------------------------------------------------
//	Gets a texture name from data.
void ObjFileMtlImporter::getTexture() {
	aiString *out( NULL );
	int clampIndex = -1;

	const char *pPtr( &(*m_DataIt) );
	if ( !ASSIMP_strincmp( pPtr, DiffuseTexture.c_str(), DiffuseTexture.size() ) ) {
		// Diffuse texture
		out = & m_pModel->m_pCurrentMaterial->texture;
		clampIndex = ObjFile::Material::TextureDiffuseType;
	} else if ( !ASSIMP_strincmp( pPtr,AmbientTexture.c_str(),AmbientTexture.size() ) ) {
		// Ambient texture
		out = & m_pModel->m_pCurrentMaterial->textureAmbient;
		clampIndex = ObjFile::Material::TextureAmbientType;
	} else if (!ASSIMP_strincmp( pPtr, SpecularTexture.c_str(), SpecularTexture.size())) {
		// Specular texture
		out = & m_pModel->m_pCurrentMaterial->textureSpecular;
		clampIndex = ObjFile::Material::TextureSpecularType;
	} else if ( !ASSIMP_strincmp( pPtr, OpacityTexture.c_str(), OpacityTexture.size() ) ) {
		// Opacity texture
		out = & m_pModel->m_pCurrentMaterial->textureOpacity;
		clampIndex = ObjFile::Material::TextureOpacityType;
	} else if (!ASSIMP_strincmp( pPtr,"map_ka",6)) {
		// Ambient texture
		out = & m_pModel->m_pCurrentMaterial->textureAmbient;
		clampIndex = ObjFile::Material::TextureAmbientType;
	} else if (!ASSIMP_strincmp(&(*m_DataIt),"map_emissive",6)) {
		// Emissive texture
		out = & m_pModel->m_pCurrentMaterial->textureEmissive;
		clampIndex = ObjFile::Material::TextureEmissiveType;
	} else if ( !ASSIMP_strincmp( pPtr, BumpTexture1.c_str(), BumpTexture1.size() ) ||
		        !ASSIMP_strincmp( pPtr, BumpTexture2.c_str(), BumpTexture2.size() ) || 
		        !ASSIMP_strincmp( pPtr, BumpTexture3.c_str(), BumpTexture3.size() ) ) {
		// Bump texture 
		out = & m_pModel->m_pCurrentMaterial->textureBump;
		clampIndex = ObjFile::Material::TextureBumpType;
	} else if (!ASSIMP_strincmp( pPtr,NormalTexture.c_str(), NormalTexture.size())) { 
		// Normal map
		out = & m_pModel->m_pCurrentMaterial->textureNormal;
		clampIndex = ObjFile::Material::TextureNormalType;
	} else if (!ASSIMP_strincmp( pPtr, DisplacementTexture.c_str(), DisplacementTexture.size() ) ) {
		// Displacement texture
		out = &m_pModel->m_pCurrentMaterial->textureDisp;
		clampIndex = ObjFile::Material::TextureDispType;
	} else if (!ASSIMP_strincmp( pPtr, SpecularityTexture.c_str(),SpecularityTexture.size() ) ) {
		// Specularity scaling (glossiness)
		out = & m_pModel->m_pCurrentMaterial->textureSpecularity;
		clampIndex = ObjFile::Material::TextureSpecularityType;
	} else {
		DefaultLogger::get()->error("OBJ/MTL: Encountered unknown texture type");
		return;
	}

	bool clamp = false;
	getTextureOption(clamp);
	m_pModel->m_pCurrentMaterial->clamp[clampIndex] = clamp;

	std::string strTexture;
	m_DataIt = getName<DataArrayIt>( m_DataIt, m_DataItEnd, strTexture );
	out->Set( strTexture );
}