diff options
Diffstat (limited to 'Master/texmf/asymptote/three_light.asy')
-rw-r--r-- | Master/texmf/asymptote/three_light.asy | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/Master/texmf/asymptote/three_light.asy b/Master/texmf/asymptote/three_light.asy index 54ca7a47151..8e5a6281795 100644 --- a/Master/texmf/asymptote/three_light.asy +++ b/Master/texmf/asymptote/three_light.asy @@ -82,42 +82,45 @@ struct light { pen background; // Background color of the 3D canvas. real specularfactor; bool viewport; // Are the lights specified (and fixed) in the viewport frame? - triple[] position; // Only directional lights are implemented. + triple[] position; // Only directional lights are currently implemented. transform3 T=identity(4); // Transform to apply to normal vectors. bool on() {return position.length > 0;} - void operator init(pen[] diffuse=array(position.length,white), - pen[] ambient=array(position.length,black), - pen[] specular=diffuse, pen background=nullpen, + void operator init(pen[] diffuse, + pen[] ambient=array(diffuse.length,black), + pen[] specular=diffuse, pen background=nullpen, real specularfactor=1, - bool viewport=true, triple[] position) { - this.position=new triple[position.length]; - this.diffuse=new real[position.length][]; - this.ambient=new real[position.length][]; - this.specular=new real[position.length][]; + bool viewport=true, triple[] position) { + int n=diffuse.length; + assert(ambient.length == n && specular.length == n && position.length == n); + + this.diffuse=new real[n][]; + this.ambient=new real[n][]; + this.specular=new real[n][]; this.background=background; + this.position=new triple[n]; for(int i=0; i < position.length; ++i) { - this.position[i]=unit(position[i]); this.diffuse[i]=rgba(diffuse[i]); this.ambient[i]=rgba(ambient[i]); this.specular[i]=rgba(specular[i]); + this.position[i]=unit(position[i]); } this.specularfactor=specularfactor; this.viewport=viewport; } void operator init(pen diffuse=white, pen ambient=black, pen specular=diffuse, - pen background=nullpen, real specularfactor=1, - bool viewport=true...triple[] position) { + pen background=nullpen, real specularfactor=1, + bool viewport=true...triple[] position) { int n=position.length; operator init(array(n,diffuse),array(n,ambient),array(n,specular), - background,specularfactor,viewport,position); + background,specularfactor,viewport,position); } void operator init(pen diffuse=white, pen ambient=black, pen specular=diffuse, - pen background=nullpen, bool viewport=true, + pen background=nullpen, bool viewport=true, real x, real y, real z) { operator init(diffuse,ambient,specular,background,viewport,(x,y,z)); } @@ -146,9 +149,9 @@ struct light { triple L=viewport ? position[i] : T*position[i]; real Ldotn=max(dot(normal,L),0); p += ambient[i]*Ambient+Ldotn*diffuse[i]*Diffuse; -// Apply specularfactor to partially compensate non-pixel-based rendering. + // Apply specularfactor to partially compensate non-pixel-based rendering. if(Ldotn > 0) // Phong-Blinn model of specular reflection - p += dot(normal,unit(L+Z))^s*specularfactor*specular[i]*Specular; + p += dot(normal,unit(L+Z))^s*specularfactor*specular[i]*Specular; } return rgb(p[0],p[1],p[2])+opacity(opacity(m.diffuse())); } @@ -165,10 +168,14 @@ light operator * (transform3 t, light light) light operator cast(triple v) {return light(v);} -light currentlight=light(ambient=rgb(0.1,0.1,0.1),specularfactor=3, +light currentlight=light(ambient=gray(0.1),specularfactor=3, (0.25,-0.25,1)); -light adobe=light(gray(0.4),specularfactor=3,viewport=false, - (0.5,-0.5,-0.25),(0.5,0.5,0.25), - (0.5,-0.5,0.2),(-0.5,0.5,-0.2)); +light White=light(new pen[] {rgb(0.38,0.38,0.45),rgb(0.6,0.6,0.67), + rgb(0.5,0.5,0.57)},specularfactor=3,viewport=false, + new triple[] {(-2,-1.5,-0.5),(2,1.1,-2.5),(-0.5,0,2)}); + +light Headlamp=light(gray(0.9),ambient=gray(0.1),specularfactor=3, + (0.5,0.5,1/sqrt(2)),specular=gray(0.7)); + light nolight; |