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; } }
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; }