static errcode GetSpotLight(parsehandle * ph, SceneHandle scene) { char tmp[255]; apiflt rad, Kc, Kl, Kq; apivector ctr; apitexture tex; apivector direction; apiflt start, end; float r, g, b, a; errcode rc; void * li; memset(&tex, 0, sizeof(apitexture)); rc = GetString(ph, "CENTER"); rc |= GetVector(ph, &ctr); rc |= GetString(ph,"RAD"); fscanf(ph->ifp, "%f", &a); /* read in radius */ rad=a; rc |= GetString(ph, "DIRECTION"); rc |= GetVector(ph, &direction); rc |= GetString(ph, "FALLOFF_START"); fscanf(ph->ifp, "%f",&a); start=a; rc |= GetString(ph, "FALLOFF_END"); fscanf(ph->ifp, "%f", &a); end=a; fscanf(ph->ifp, "%s", tmp); if (!stringcmp(tmp, "COLOR")) { fscanf(ph->ifp, "%f %f %f", &r, &g, &b); tex.col.r=r; tex.col.g=g; tex.col.b=b; li = rt_spotlight(scene, rt_texture(scene, &tex), ctr, rad, direction, start, end); } else { if (stringcmp(tmp, "ATTENUATION")) return -1; rc |= GetString(ph, "CONSTANT"); fscanf(ph->ifp, "%f", &a); Kc=a; rc |= GetString(ph, "LINEAR"); fscanf(ph->ifp, "%f", &a); Kl=a; rc |= GetString(ph, "QUADRATIC"); fscanf(ph->ifp, "%f", &a); Kq=a; rc |= GetColor(ph, &tex.col); li = rt_spotlight(scene, rt_texture(scene, &tex), ctr, rad, direction, start, end); rt_light_attenuation(li, Kc, Kl, Kq); } return rc; }
void * rt_spotlight3fv(SceneHandle voidscene, void * tex, const float *ctr, float rad, const float *dir, float start, float end) { vector vctr, vdir; vctr.x = ctr[0]; vctr.y = ctr[1]; vctr.z = ctr[2]; vdir.x = dir[0]; vdir.y = dir[1]; vdir.z = dir[2]; return rt_spotlight(voidscene, tex, vctr, rad, vdir, start, end); }