diff -Naur -x .gil _pvr.3/_pvr/_pvr.c _pvr.4/_pvr/_pvr.c
--- _pvr.3/_pvr/_pvr.c	2026-03-10 04:44:25.441801866 +0100
+++ _pvr.4/_pvr/_pvr.c	2026-03-10 08:30:11.664910042 +0100
@@ -41,7 +41,35 @@
   f[1]=(float)t[1]; f[1]/=255.0;
   f[2]=(float)t[2]; f[2]/=255.0;
   fprintf(stdout, "sphere{\n <%d,%d,%d>, %.2g\n", c[0],c[1],c[2], r );
-  fprintf(stdout, " texture { pigment { color rgb <%.2g,%.2g,%.2g> } }\n", f[0],f[1],f[2] );
+  fprintf(stdout, " texture{ pigment{ color rgb <%.2g,%.2g,%.2g> }}\n", f[0],f[1],f[2] );
   fprintf(stdout, " translate <%.2g,%.2g,%.2g>\n}\n", p[0],p[1],p[2] );
 }
 
+void
+pv_cb(float sh, int *c, float *p)
+{ float _sh; _sh=-sh;
+  float t[3];
+  t[0]=(float)c[0]; t[0]/=255.0;
+  t[1]=(float)c[1]; t[1]/=255.0;
+  t[2]=(float)c[2]; t[2]/=255.0;
+  fprintf(stdout, "box{\n <%.2g,%.2g,%.2g>, <%.2g,%.2g,%.2g>\n", _sh,_sh,_sh,  sh,sh,sh );
+  fprintf(stdout, " texture{ pigment{ color rgb <%.2g,%.2g,%.2g> }}\n", t[0],t[1],t[2] );
+  fprintf(stdout, " translate <%.2g,%.2g,%.2g>\n}\n", p[0],p[1],p[2] );
+}
+
+void
+pv_gd(int *c1, int *c2)
+{ float t1[3];
+  float t2[3];
+  t1[0]=(float)c1[0]; t1[0]/=255.0;
+  t1[1]=(float)c1[1]; t1[1]/=255.0;
+  t1[2]=(float)c1[2]; t1[2]/=255.0;
+
+  t2[0]=(float)c2[0]; t2[0]/=255.0;
+  t2[1]=(float)c2[1]; t2[1]/=255.0;
+  t2[2]=(float)c2[2]; t2[2]/=255.0;
+  fprintf(stdout, "plane{\n <0,1,0>, 0\n");
+  fprintf(stdout, " texture{ pigment{ checker color rgb <%.2g,%.2g,%.2g>, color rgb <%.2g,%.2g,%.2g> }}\n}\n",
+   t1[0],t1[1],t1[2], t2[0],t2[1],t2[2] );
+}
+
diff -Naur -x .gil _pvr.3/_pvr/_pvr.h _pvr.4/_pvr/_pvr.h
--- _pvr.3/_pvr/_pvr.h	2026-03-10 04:44:25.441801866 +0100
+++ _pvr.4/_pvr/_pvr.h	2026-03-10 08:30:14.291909960 +0100
@@ -10,4 +10,10 @@
 void
 pv_sh(int *c, float r, int *t, float *p);
 
+void
+pv_cb(float sh, int *c, float *p);
+
+void
+pv_gd(int *c1, int *c2);
+
 #endif /* _PVR_H_ */
diff -Naur -x .gil _pvr.3/_pvr-nt/pvr.ml _pvr.4/_pvr-nt/pvr.ml
--- _pvr.3/_pvr-nt/pvr.ml	2026-03-10 04:44:25.438801866 +0100
+++ _pvr.4/_pvr-nt/pvr.ml	2026-03-10 08:32:38.093905468 +0100
@@ -10,3 +10,7 @@
   = "caml_pv_gs"
 external pv_sh : int * int * int -> float -> int * int * int -> float * float * float -> unit
   = "caml_pv_sh"
+external pv_cb : float -> int * int * int -> float * float * float -> unit
+  = "caml_pv_cb"
+external pv_gd : int * int * int -> int * int * int -> unit
+  = "caml_pv_gd"
diff -Naur -x .gil _pvr.3/_pvr-nt/pvr.mli _pvr.4/_pvr-nt/pvr.mli
--- _pvr.3/_pvr-nt/pvr.mli	2026-03-10 04:44:25.438801866 +0100
+++ _pvr.4/_pvr-nt/pvr.mli	2026-03-10 08:32:55.042904927 +0100
@@ -5,3 +5,6 @@
 val pv_gs : int * int * int -> unit
 val pv_sh : int * int * int -> float -> int * int * int -> float * float * float -> unit
 (* pv_sh c r t p *)
+val pv_cb : float -> int * int * int -> float * float * float -> unit
+(* pv_cb h c p *)
+val pv_gd : int * int * int -> int * int * int -> unit
diff -Naur -x .gil _pvr.3/_pvr-nt/pvr_stub.c _pvr.4/_pvr-nt/pvr_stub.c
--- _pvr.3/_pvr-nt/pvr_stub.c	2026-03-10 04:44:25.438801866 +0100
+++ _pvr.4/_pvr-nt/pvr_stub.c	2026-03-10 08:33:16.360904263 +0100
@@ -67,3 +67,31 @@
 
   pv_sh(c, r, t, p); return Val_unit; }
 
+CAMLprim value
+caml_pv_gd(value caml_c1, value caml_c2)
+{ int c1[3];
+  int c2[3];
+  c1[0]=Long_val(Field(caml_c1,0));
+  c1[1]=Long_val(Field(caml_c1,1));
+  c1[2]=Long_val(Field(caml_c1,2));
+
+  c2[0]=Long_val(Field(caml_c2,0));
+  c2[1]=Long_val(Field(caml_c2,1));
+  c2[2]=Long_val(Field(caml_c2,2));
+
+  pv_gd(c1, c2); return Val_unit; }
+
+CAMLprim value
+caml_pv_cb(value caml_h, value caml_c, value caml_p)
+{ float h;
+  int c[3];
+  float p[3];
+  c[0]=Long_val(Field(caml_c,0));
+  c[1]=Long_val(Field(caml_c,1));
+  c[2]=Long_val(Field(caml_c,2));
+  h=Double_val(caml_h);
+  p[0]=Double_val(Field(caml_p,0));
+  p[1]=Double_val(Field(caml_p,1));
+  p[2]=Double_val(Field(caml_p,2));
+  pv_cb(h, c, p); return Val_unit; }
+
diff -Naur -x .gil _pvr.3/_tst/_ga.ml _pvr.4/_tst/_ga.ml
--- _pvr.3/_tst/_ga.ml	2026-03-10 04:44:25.440801866 +0100
+++ _pvr.4/_tst/_ga.ml	2026-03-10 08:27:35.882915081 +0100
@@ -4,11 +4,21 @@
 let () =
   pv_ci ();
   pv_bg (20,35,112);
-  pv_cm (2,5,2) (0,1,0);
+  pv_cm (2,4,2) (0,1,0);
 
   pv_ls (3,5,4) (204,204,154);
   pv_ls (3,5,-4) (154,154,102);
 
   pv_gs (50,25,76);
-  pv_sh (0, 0, 0) 0.2 (0,25,255) (-0.8,0.,-0.4);
+  pv_sh (0,0,0) 0.21 (7,29,255) (-0.8,0.,-0.4);
+  pv_sh (0,0,0) 0.19 (3,13,134) (-1.7,0.,-0.7);
+  pv_sh (0,0,0) 0.17 (70,29,255) (-0.9,0.,-1.3);
+
+  pv_cb 0.11 (1,3,17) (-0.6,0.02,-2.0);
+  pv_cb 0.11 (1,3,17) (-1.0,0.02,-2.0);
+  pv_cb 0.11 (1,3,17) (-1.4,0.02,-2.0);
+  pv_cb 0.11 (1,3,17) (-1.8,0.02,-2.0);
+  pv_cb 0.11 (1,3,17) (-2.2,0.02,-2.0);
+
+  pv_gd (11,7,67) (13,11,71);
 ;;
