chiark / gitweb /
3d nice and everything
authorIan Jackson <ian@davenant.relativity.greenend.org.uk>
Mon, 31 Dec 2007 01:46:24 +0000 (01:46 +0000)
committerIan Jackson <ian@davenant.relativity.greenend.org.uk>
Mon, 31 Dec 2007 01:46:24 +0000 (01:46 +0000)
project.c

index 0fac499..a2e3f91 100644 (file)
--- a/project.c
+++ b/project.c
@@ -104,8 +104,7 @@ static int wwidth=WSZ, wheight=WSZ, wmindim=WSZ, wmaxdim=WSZ;
 static int ncut, currentbuffer, x11depth, x11screen;
 XVisualInfo visinfo;
 
-static struct { double scale, eyes_apart; } sizeadj= { 0.3, 0.0 };
-static double scale_wmindim;
+static double sizeadj_scale= 0.3, eyes_apart, scale_wmindim;
 static double eye_z= -10, eye_x=0;
 static double cut_z= -9;
 
@@ -201,13 +200,13 @@ static void display_conformation(void) {
 
   XA( XFillRectangle(display,pixmap,dmwhite.fillgc,0,0,wwidth,wheight) );
 
-  if (sizeadj.eyes_apart > 0) {
-    const double preferred=100, beyond=200;
+  if (eyes_apart > 0) {
+    const double preferred=0.05, beyond=0.07;
 
-    eye_x= sizeadj.eyes_apart < preferred ? sizeadj.eyes_apart :
-           sizeadj.eyes_apart < beyond ? preferred :
-           sizeadj.eyes_apart - (beyond - preferred);
-    eye_x /= scale_wmindim;
+    eye_x= eyes_apart < preferred ? eyes_apart :
+           eyes_apart < beyond ? preferred :
+           eyes_apart - (beyond - preferred);
+    eye_x /= sizeadj_scale;
     drawtriangles(&dmblue);
     eye_x= -eye_x;
     drawtriangles(&dmred);
@@ -222,7 +221,7 @@ static void display_conformation(void) {
 }
 
 static void show(void) {
-  scale_wmindim= sizeadj.scale * wmindim;
+  scale_wmindim= sizeadj_scale * wmindim;
   read_input();
   transform_coordinates();
   generate_display_list();
@@ -389,15 +388,19 @@ static void drag_rotate_delta(double dx, double dy) {
 DRAG_SAVING(rotate, transform);
 
 static void drag_sizeadj_delta(double dx, double dy) {
-  const double min_eyes_apart= -200;
-  sizeadj.scale *= pow(3.0, dy);
-  
-  sizeadj.eyes_apart += dx * wmaxdim;
-  if (sizeadj.eyes_apart < min_eyes_apart) sizeadj.eyes_apart= min_eyes_apart;
-  printf("sizeadj eyes_apart %g\n", sizeadj.eyes_apart);
+  sizeadj_scale *= pow(3.0, -dy);
+  show();
+}
+DRAG_SAVING(sizeadj, sizeadj_scale);
+
+static void drag_3d_delta(double dx, double dy) {
+  const double min_eyes_apart= -0.02;
+  eyes_apart += dx * 0.1;
+  if (eyes_apart < min_eyes_apart) eyes_apart= min_eyes_apart;
+  printf("sizeadj eyes_apart %g\n", eyes_apart);
   show();
 }
-DRAG_SAVING(sizeadj, sizeadj);
+DRAG_SAVING(3d, eyes_apart);
 
 static const Drag *drag= &drag_none;
 
@@ -423,7 +426,7 @@ static void event_button(XButtonEvent *e) {
     switch (e->button) {
     case Button1: drag= &drag_rotate;  break;
     case Button2: drag= &drag_sizeadj; break;
-    case Button3: drag= &drag_3d; break;
+    case Button3: drag= &drag_3d;      break;
     default: printf("unknown drag start %d\n", e->button);
     }
     printf("drag=%s press button=%lu start %d,%d\n",