示例#1
0
static void readMaterial(const uint8_t* ptr, a3dsDataT* a3ds) {
    chunkT* chunk = (chunkT*)ptr;
    ptr = chunk->data;

    assert(chunk->id == 0xafff);

    a3dsMaterialDataT* material = calloc(1, sizeof(a3dsMaterialDataT));
    arrayAdd(a3ds->materials, &material);

    material->ambient   = (vec3) { 0.0f, 0.0f, 0.0f };
    material->diffuse   = (vec3) { 0.5f, 0.5f, 0.5f };
    material->specular  = (vec3) { 1.0f, 1.0f, 1.0f };
    material->shininess = 10.0f;

    void* chunk_end = (uint8_t*)chunk + chunk->length;
    while (ptr < chunk_end) {
        chunk = (chunkT*)ptr;

        if (chunk->id == 0xa000)
            material->name = (string*)chunk->data;
        else if (chunk->id == 0xa010)
            material->ambient = readColorChunk((uint8_t*)chunk->data);
        else if (chunk->id == 0xa020)
            material->diffuse = readColorChunk((uint8_t*)chunk->data);
        else if (chunk->id == 0xa030)
            material->specular = readColorChunk((uint8_t*)chunk->data);
        else if (chunk->id == 0xa040)
            material->shininess = readPercentageChunk((uint8_t*)chunk->data);
        else if (chunk->id == 0xa200)
            readMaterialTexture(ptr, material);

        ptr = (uint8_t*)chunk + chunk->length;
    }
}
示例#2
0
bool readMaterialPass(CMaterial& material, IOReadBase* pRead, const std::string& strFilename)
{
	std::string strCommand;
	std::vector<std::string> setWords;

	strCommand = getLineCommand(pRead,setWords);
	if ("{"!=strCommand)
	{
		return false;
	}
	while (!pRead->IsEof())
	{
		strCommand = getLineCommand(pRead,setWords);
		if ("ambient"==strCommand)
		{
			// 3
		}
		else if ("diffuse"==strCommand)
		{
			// 3
		}
		else if ("specular"==strCommand)
		{
			//4
		}
		else if ("emissive"==strCommand)
		{
			// 3
		}
		else if ("depth_write"==strCommand)
		{
			if (setWords.size()>0)
			{
				if ("off"==setWords[0])
				{
					material.bDepthWrite=false;
				}
				else
				{
					MessageBoxA(NULL,setWords[0].c_str(),"Unknon in depth_write!",0);
				}
			}
		}
		else if ("scene_blend"==strCommand)
		{
			if (setWords.size()==1)
			{
				if ("alpha_blend"==setWords[0])
				{
					material.bBlend=true;
				}
				else
				{
					MessageBoxA(NULL,setWords[0].c_str(),"Unknon in scene_blend!",0);
				}
			}
			else if (setWords.size()==2)
			{
				MessageBoxA(NULL,setWords[0].c_str(),"Unknon in scene_blend!",0);
			}
		}
		else if ("alpha_rejection"==strCommand)
		{
			if (setWords.size()==2)
			{
				material.bAlphaTest=true;
				material.uAlphaTestValue=atoi(setWords[1].c_str());
			}
		}
		else if ("lighting"==strCommand)
		{
			material.bLightingEnabled=true;
			// 1
		}
		else if ("texture_unit"==strCommand)
		{
			if (!readMaterialTexture(material,pRead,strFilename))
			{
				MessageBoxA(NULL,"readMaterialTexture()","Error!",0);
				return false;
			}
		}
		else if ("}"==strCommand)
		{
			break;
		}
		else
		{
			MessageBoxA(NULL,strCommand.c_str(),"Unknon in pass!",0);
		}
	}
	return true;
}