void * GetTexBody(parsehandle * ph, SceneHandle scene, int modeflag) { char tmp[255]; float a,b,c,d, phong, phongexp; int phongtype; apitexture tex; void * voidtex; errcode rc; rc = GetString(ph, "AMBIENT"); fscanf(ph->ifp, "%f", &a); tex.ambient=a; rc |= GetString(ph, "DIFFUSE"); fscanf(ph->ifp, "%f", &b); tex.diffuse=b; rc |= GetString(ph, "SPECULAR"); fscanf(ph->ifp, "%f", &c); tex.specular=c; rc |= GetString(ph, "OPACITY"); fscanf(ph->ifp, "%f", &d); tex.opacity=d; fscanf(ph->ifp, "%s", tmp); if (!stringcmp(tmp, "PHONG")) { fscanf(ph->ifp, "%s", tmp); if (!stringcmp(tmp, "METAL")) { phongtype = RT_PHONG_METAL; } else if (!stringcmp(tmp, "PLASTIC")) { phongtype = RT_PHONG_PLASTIC; } else { phongtype = RT_PHONG_PLASTIC; } fscanf(ph->ifp, "%f", &phong); GetString(ph, "PHONG_SIZE"); fscanf(ph->ifp, "%f", &phongexp); fscanf(ph->ifp, "%s", tmp); } else { /* assume we found "COLOR" otherwise */ phong = 0.0; phongexp = 100.0; phongtype = RT_PHONG_PLASTIC; } /* if we're processing normal objects, use the regular */ /* texture definition pattern. */ /* VCSTri objects skip the normal color and texture */ /* function definition since they are unused. */ if (modeflag == 0) { if (stringcmp(tmp, "COLOR")) { rc |= PARSEBADSYNTAX; } fscanf(ph->ifp, "%f %f %f", &a, &b, &c); tex.col.r = a; tex.col.g = b; tex.col.b = c; rc |= GetString(ph, "TEXFUNC"); /* this really ought to be a string, not a number... */ fscanf(ph->ifp, "%d", &tex.texturefunc); switch (tex.texturefunc) { case RT_TEXTURE_CONSTANT: default: break; case RT_TEXTURE_3D_CHECKER: case RT_TEXTURE_GRIT: case RT_TEXTURE_MARBLE: case RT_TEXTURE_WOOD: case RT_TEXTURE_GRADIENT: case RT_TEXTURE_CYLINDRICAL_CHECKER: rc |= GetString(ph, "CENTER"); rc |= GetVector(ph, &tex.ctr); rc |= GetString(ph, "ROTATE"); rc |= GetVector(ph, &tex.rot); rc |= GetString(ph, "SCALE"); rc |= GetVector(ph, &tex.scale); break; case RT_TEXTURE_CYLINDRICAL_IMAGE: case RT_TEXTURE_SPHERICAL_IMAGE: fscanf(ph->ifp, "%s", tex.imap); rc |= GetString(ph, "CENTER"); rc |= GetVector(ph, &tex.ctr); rc |= GetString(ph, "ROTATE"); rc |= GetVector(ph, &tex.rot); rc |= GetString(ph, "SCALE"); rc |= GetVector(ph, &tex.scale); break; case RT_TEXTURE_PLANAR_IMAGE: fscanf(ph->ifp, "%s", tex.imap); rc |= GetString(ph, "CENTER"); rc |= GetVector(ph, &tex.ctr); rc |= GetString(ph, "ROTATE"); rc |= GetVector(ph, &tex.rot); rc |= GetString(ph, "SCALE"); rc |= GetVector(ph, &tex.scale); rc |= GetString(ph, "UAXIS"); rc |= GetVector(ph, &tex.uaxs); rc |= GetString(ph, "VAXIS"); rc |= GetVector(ph, &tex.vaxs); break; } } else { if (stringcmp(tmp, "VCST")) { rc |= PARSEBADSYNTAX; } /* if we're processing VCSTri objects, set some defaults */ tex.col.r = 1.0; tex.col.g = 1.0; tex.col.b = 1.0; tex.texturefunc = 0; /* set to none by default, gets reset anyway */ } voidtex = rt_texture(scene, &tex); rt_tex_phong(voidtex, phong, phongexp, phongtype); return voidtex; }
void * GetTexBody(FILE * dfile) { char tmp[255]; float a,b,c,d, phong, phongexp, phongtype; apitexture tex; void * voidtex; errcode rc; rc = GetString(dfile, "AMBIENT"); fscanf(dfile, "%f", &a); tex.ambient=a; rc |= GetString(dfile, "DIFFUSE"); fscanf(dfile, "%f", &b); tex.diffuse=b; rc |= GetString(dfile, "SPECULAR"); fscanf(dfile, "%f", &c); tex.specular=c; rc |= GetString(dfile, "OPACITY"); fscanf(dfile, "%f", &d); tex.opacity=d; fscanf(dfile, "%s", tmp); if (!stringcmp("PHONG", tmp)) { fscanf(dfile, "%s", tmp); if (!stringcmp("METAL", tmp)) { phongtype = RT_PHONG_METAL; } else if (!stringcmp("PLASTIC", tmp)) { phongtype = RT_PHONG_PLASTIC; } else { phongtype = RT_PHONG_PLASTIC; } fscanf(dfile, "%f", &phong); GetString(dfile, "PHONG_SIZE"); fscanf(dfile, "%f", &phongexp); fscanf(dfile, "%s", tmp); } else { phong = 0.0; phongexp = 100.0; phongtype = RT_PHONG_PLASTIC; } fscanf(dfile, "%f %f %f", &a, &b, &c); tex.col.r = a; tex.col.g = b; tex.col.b = c; rc |= GetString(dfile, "TEXFUNC"); fscanf(dfile, "%d", &tex.texturefunc); if (tex.texturefunc >= 7) { /* if its an image map, we need a filename */ fscanf(dfile, "%s", tex.imap); } if (tex.texturefunc != 0) { rc |= GetString(dfile, "CENTER"); rc |= GetVector(dfile, &tex.ctr); rc |= GetString(dfile, "ROTATE"); rc |= GetVector(dfile, &tex.rot); rc |= GetString(dfile, "SCALE"); rc |= GetVector(dfile, &tex.scale); } if (tex.texturefunc == 9) { rc |= GetString(dfile, "UAXIS"); rc |= GetVector(dfile, &tex.uaxs); rc |= GetString(dfile, "VAXIS"); rc |= GetVector(dfile, &tex.vaxs); } voidtex = rt_texture(&tex); rt_tex_phong(voidtex, phong, phongexp, (int) phongtype); return voidtex; }