SEXP R_igraph_getsphere(SEXP pos, SEXP radius, SEXP color, SEXP bgcolor, SEXP lightpos, SEXP lightcolor, SEXP width, SEXP height) { /* All error checking is done at the R level */ int i; double *spos=REAL(pos); double *scolor=REAL(color); double *svgcolor=REAL(bgcolor); int no_lights=GET_LENGTH(lightpos); RayTracer* p_ray_tracer; Sphere * sphere; int swidth=INTEGER(width)[0]; int sheight=INTEGER(height)[0]; int nopixels=swidth * sheight; SEXP result, dim; Image image; p_ray_tracer = new RayTracer(); p_ray_tracer->EyePoint(Point(0,0,0)); for (i=0; i<no_lights; i++) { double *lpos=REAL(VECTOR_ELT(lightpos, i)); double *lcol=REAL(VECTOR_ELT(lightcolor, i)); Light *light = new Light(Point(lpos[0], lpos[1], lpos[2])); light->Intensity(1); light->LightColor(Color(lcol[0], lcol[1], lcol[2])); p_ray_tracer->AddLight(light); } sphere = new Sphere(Point(spos[0], spos[1], spos[2]), REAL(radius)[0]); sphere->ShapeColor(Color(scolor[0], scolor[1], scolor[2])); p_ray_tracer->AddShape(sphere); PROTECT(result=NEW_NUMERIC(nopixels * 4)); PROTECT(dim=NEW_INTEGER(3)); INTEGER(dim)[0]=swidth; INTEGER(dim)[1]=sheight; INTEGER(dim)[2]=4; SET_DIM(result, dim); image.width=swidth; image.height=sheight; image.red=REAL(result); image.green=image.red + nopixels; image.blue=image.green + nopixels; image.trans=image.blue + nopixels; p_ray_tracer->RayTrace(image); delete p_ray_tracer; UNPROTECT(2); return result; }