struct MTL{ char[] name; //Ka Color ambient = {[51,51,51,255]}; //Kd and d Color diffuse = {[204,204,204,255]}; //Ks Color specular = {[255,255,255,255]}; //Ns float shininess = 0.0; //map_Ka char[] texture; } MTL[] handleMTL(char[] source){ char[] file = cast(char[])read(source); char[][] lines = splitlines(file); MTL[] mats; void handleLine(char[] line){ char[][] words = split(line, " "); if(words.length != 0){ switch(words[0]){ case "newmtl": MTL m; m.name = line[7..$]; mats ~= m; break; case "Ka": mats[$-1].ambient = Color(fromWords3(words)); break; case "Kd": Vec3f rgb = fromWords3(words); mats[$-1].diffuse.r = cast(ubyte)(rgb.x * 255.0); mats[$-1].diffuse.g = cast(ubyte)(rgb.y * 255.0); mats[$-1].diffuse.b = cast(ubyte)(rgb.z * 255.0); break; case "Ks": mats[$-1].specular = Color(fromWords3(words)); break; case "Tr": case "d": mats[$-1].diffuse.a = cast(ubyte)(toFloat(words[1]) * 255.0); break; case "Ns": mats[$-1].shininess = toFloat(words[1]); break; case "map_Ka": mats[$-1].texture = words[1]; break; case "illum": break; default: break; } } } foreach(inout line; lines){ line = strip(line); handleLine(line); } return mats; }