diff options
| -rw-r--r-- | hackvr.c | 566 | 
1 files changed, 296 insertions, 270 deletions
| @@ -20,15 +20,20 @@ int oldtime=0;  int oldfps=0;  int fps=0; +//TODO: optimizations +//TODO: store caches of cs_t, c2_t, and c3_t numbers.  //TODO: don't forget to remake gophervr with this. +//TODO: XSegment or line structs to store some shit?  //TODO: line and triangle intersection for finding what object was clicked on  //if I don't do hiliting I only need to calculate that upon click.  #define WALK_SPEED 1  #define SPLIT_SCREEN 2  #define CAMERA_SEPARATION 4 +#define RED_AND_BLUE 1 -#define TRIANGLES 16386 +#define SHAPES 16386 +#define MAX_SIDES 8  #define min(a,b) (((a)<(b))?(a):(b))  #define max(a,b) (((a)>(b))?(a):(b)) @@ -99,18 +104,10 @@ struct c3_line {   c3_t p2;  }; -#define MAX_NGON 64 //why not? - -struct c3_polygon { - char *id; - c3_t p[MAX_NGON]; -}; - -struct c3_triangle {//use array or linked list? +struct c3_shape {//use array or linked list?    char *id; -  c3_t p1; -  c3_t p2; -  c3_t p3; +  unsigned char len; +  c3_t p[MAX_SIDES];  };  struct mainwin { @@ -154,15 +151,16 @@ struct mainwin {    Pixmap cleanbackbuffer;    GC gc;    GC backgc; -  struct c3_triangle *triangle[TRIANGLES]; -  real tridist[TRIANGLES]; -  int triangles; +  struct c3_shape *shape[SHAPES]; +  int shapes;    int derp;    int root_window;    real split;  } global;  //used to figure out what c2 values are associated with each edge of the window. +//#define TOP     160.0 +//#define BOTTOM  -160.0  #define TOP     240.0  #define BOTTOM  -240.0  #define RIGHT   320.0 @@ -227,12 +225,15 @@ C    b     A (x1,y1)  //I'll need this for collision I guess.  /* + +//use this for finding a line that intersects with what the camera is pointing at  c2_t get_c2_intersection(c2_t p1,real theta,c2_t p2) {    real c;    c=distance2(p1,p2);    theta_a=C A B    b = (c/1) * (theta_a + theta_offset)  } +  int get_2D_intersection_X(x1,y1,theta_offset,x2,y2) {   int x3a,y3a,x3b,y3b;   int a,b,c;//lenght of sides. @@ -331,10 +332,9 @@ c3_t rotate_c3_zr(c3_t p1,c3_t p2,real zr) {//rotate x and y around camera based    return (c3_t){tmp.x,tmp.y,p1.z};  } -void rotate_triangle_yr(struct c3_triangle *t) {//changes input value! - t->p1=rotate_c3_yr(t->p1,camera.p,camera.yr); - t->p2=rotate_c3_yr(t->p2,camera.p,camera.yr); - t->p3=rotate_c3_yr(t->p3,camera.p,camera.yr); +void rotate_shape_yr(struct c3_shape *s) {//changes input value! + int i=0; + for(i=0;i<s->len;i++) s->p[0]=rotate_c3_yr(s->p[0],camera.p,camera.yr);  }  c2_t c3_to_c2(c3_t p3) { //DO NOT DRAW STUFF IN HERE @@ -343,6 +343,7 @@ c2_t c3_to_c2(c3_t p3) { //DO NOT DRAW STUFF IN HERE  //  c3_t tmp2;  //  c3_t tmp3;    c3_t final; +//these rotations need to be about the previous axis after the axis itself has been rotated.    final=rotate_c3_yr(p3,camera.p,d2r(camera.yr));//rotate everything around the camera's location.  //  final=rotate_c3_yr(p3,(c3_t){0,0,0},d2r(camera.yr));//rotate everything around the center no matter what.  //  tmp2=rotate_c3_xr(tmp1,camera.p,d2r(camera.xr)); @@ -379,38 +380,23 @@ cs_t c3_to_cs(c3_t p) {   return c2_to_cs(c3_to_c2(p));  } -void XDrawTriangle(cs_t p1,cs_t p2,cs_t p3) { - //this is probably slower than drawing a triangle. - XPoint p[3]; - p[0]=(XPoint){p1.x,p1.y}; - p[1]=(XPoint){p2.x,p2.y}; - p[2]=(XPoint){p3.x,p3.y}; - XDrawLines(global.dpy,global.backbuffer,global.backgc,p,3,CoordModeOrigin); -// XDrawLine(global.dpy,global.backbuffer,global.backgc,p1.x,p1.y,p2.x,p2.y); -// XDrawLine(global.dpy,global.backbuffer,global.backgc,p2.x,p2.y,p3.x,p3.y); -// XDrawLine(global.dpy,global.backbuffer,global.backgc,p3.x,p3.y,p1.x,p1.y); -} - -void XDrawFilledTriangle(cs_t p1,cs_t p2,cs_t p3) { - XPoint p[3]; - p[0]=(XPoint){p1.x,p1.y};//should I just use XPoint instead of cs_t ? - p[1]=(XPoint){p2.x,p2.y}; - p[2]=(XPoint){p3.x,p3.y}; - XFillPolygon(global.dpy,global.backbuffer,global.backgc,p,3,Convex,CoordModeOrigin); -} -  real shitdist2(c3_t p1,c3_t p2) {   return sqrtl(((p1.x - p2.x) * (p1.x - p2.x)) +          ((p1.y - p2.y) * (p1.y - p2.y)) +          ((p1.z - p2.z) * (p1.z - p2.z)));  } -real shitdist(struct c3_triangle t,c3_t p) { +real shitdist(struct c3_shape s,c3_t p) {  // apply rotation then find distance? - struct c3_triangle t_; - t_=t; - rotate_triangle_yr(&t_); - return (shitdist2(t_.p1,p) + shitdist2(t_.p2,p) + shitdist2(t_.p3,p)) / 3.0l; + int i; + struct c3_shape s_; + real total; + s_=s; + rotate_shape_yr(&s_); + for(i=0;i<s_.len;i++) { +  total+=shitdist2(s_.p[i],camera.p); + } + return (total) / 3.0l;  }  //^ subdivision algorithm for display purposes only. @@ -429,7 +415,7 @@ void HatchLines(c2_t p1,c2_t p2,c2_t p3,int density) {   }  } -void DrawHatchedTriangle(struct c3_triangle t,int d) { +/*void DrawHatchedTriangle(struct c3_triangle t,int d) {   c2_t p1,p2,p3;   p1=c3_to_c2(t.p1);   p2=c3_to_c2(t.p2); @@ -437,7 +423,7 @@ void DrawHatchedTriangle(struct c3_triangle t,int d) {   HatchLines(p1,p2,p3,d);   HatchLines(p2,p3,p1,d);   HatchLines(p1,p3,p2,d); -} +}*/  void draw_cs_text(cs_t p,char *text) {   char t[256]; @@ -459,35 +445,48 @@ void draw_c3_text(c3_t p,char *text) {   draw_cs_text(p2,text);  } -void draw_c3_triangle(struct c3_triangle t) { +/* +cs_t *c3s_to_css(c3_t *p3,int len) { + cs_t *ps=malloc(sizeof(cs_t) * len); + int i; + for(i=0;i<len;i++) ps[i]=c3_to_cs(p3[i]); + return ps; +}*/ + +void draw_c3_shape(struct c3_shape s) { +// char line[1024]; + int i=0; + XPoint p[s.len]; + cs_t tmp;   if(global.draw3d == 2) { //draw it filled in -  XDrawFilledTriangle(c3_to_cs(t.p1),c3_to_cs(t.p2),c3_to_cs(t.p3)); +  for(i=0;i<s.len;i++) { +   tmp=c3_to_cs(s.p[i]); +   p[i]=(XPoint){tmp.x,tmp.y}; +  } +  XFillPolygon(global.dpy,global.backbuffer,global.backgc,p,s.len,Convex,CoordModeOrigin);   }   if(global.draw3d == 3) { //hashed    XSetForeground(global.dpy, global.backgc, global.colors[0].pixel); -  //XDrawFilledTriangle(c3_to_cs(t.p1),c3_to_cs(t.p2),c3_to_cs(t.p3));//clear out this triangle. +  //XDrawFilledShape(c3_to_cs(t.p1),c3_to_cs(t.p2),c3_to_cs(t.p3));//clear out this triangle.    XSetForeground(global.dpy, global.backgc, global.green.pixel); -  DrawHatchedTriangle(t,10 - (shitdist(t,camera.p) / 10));//how to get density? +  //upgrade me! DrawHatchedTriangle(t,10 - (shitdist(t,camera.p) / 10));//how to get density? + } + for(i=0;i<s.len;i++) { +  draw_c3_line(s.p[i],s.p[(i+1)%s.len]); + } + if(global.debug) { +/*  snprintf(line,sizeof(line)-1,"(%Lf,%Lf,%Lf)",t.p1.x,t.p1.y,t.p1.z); +  draw_c3_text(t.p1,line); +  snprintf(line,sizeof(line)-1,"(%Lf,%Lf,%Lf)",t.p2.x,t.p2.y,t.p2.z); +  draw_c3_text(t.p2,line); +  snprintf(line,sizeof(line)-1,"(%Lf,%Lf,%Lf)",t.p3.x,t.p3.y,t.p3.z); +  draw_c3_text(t.p3,line); +*/   } - draw_c3_line(t.p1,t.p2); - draw_c3_line(t.p2,t.p3); - draw_c3_line(t.p3,t.p1); - //draw_c3_text(t.p1,t.id);  } -//is basing this all on triangles best, or should I use polygons? -//void pushTriangle(x1,y1,z1,1) { -//  for(i=0;global.triangle[i];i++); -//  global.triangle[i]=malloc(sizeof(struct triangle)); -//  global.triangle[i]->x1=x1; -//} -//void pushSquare() { -//  pushTriangle(); -//  pushTriangle(); -//} -  typedef struct { - struct c3_triangle *t; + struct c3_shape *s;   real d;  } zsort_t; @@ -516,7 +515,7 @@ void draw_screen(Display *dpy,Window w,GC gc) {    int direction,ascent,descent;    char coords[256];    XGCValues gcval; -  zsort_t zs[TRIANGLES]; +  zsort_t zs[SHAPES];    XCopyArea(global.dpy,global.cleanbackbuffer,global.backbuffer,gc,0,0,global.width,global.height,0,0);//clear the backbuffer.  //  XCopyPlane(global.dpy,global.cleanbackbuffer,global.backbuffer,gc,0,0,global.width,global.height,0,0,1);//clear the backbuffer. @@ -534,21 +533,21 @@ void draw_screen(Display *dpy,Window w,GC gc) {    }    for(cn=0;cn<global.split_screen;cn++) {      if(global.red_and_blue) { +     //set color for left half to red and right half to blue +     //and draw mode for the gc to GXOr       global.xoff=0;       gcval.function=GXor; -     //set color for left half to red and right half to blue  -     //and draw mode for the gc to GXOr       XChangeGC(global.dpy,global.backgc,GCFunction,&gcval);      } else {       global.xoff=(global.width/global.split_screen)*cn;      } -  //  XSetClipRectangles(global.dpy,global.backgc,global.xoff,0,&cliprect,1,Unsorted); +    if(!global.red_and_blue) XSetClipRectangles(global.dpy,global.backgc,global.xoff,0,&cliprect,1,Unsorted);      //if(global.drawminimap == 3) { draw_graph(magic); continue; }      if(global.drawsky) {       XCopyArea(global.dpy,skypixmap,global.backbuffer,global.backgc,((camera.yr*5)+SKYW)%SKYW,0,WIDTH,global.height/2,0,0);      }      if(global.draw3d) { -      draw_c2_line((c2_t){LEFT,0},(c2_t){RIGHT,0}); //horizon +//      draw_c2_line((c2_t){LEFT,0},(c2_t){RIGHT,0}); //horizon      }      if(time(0) == oldtime) {       fps++; @@ -559,10 +558,10 @@ void draw_screen(Display *dpy,Window w,GC gc) {       fps=0;      }      XSetForeground(global.dpy, global.backgc, global.green.pixel); -    snprintf(coords,sizeof(coords)-1,"debug: %s minimap: %d 3d: %d fps: %d triangles: %d",global.debug?"on":"off",global.drawminimap,global.draw3d,oldfps,global.triangles); -    XTextExtents(font,coords,strlen(coords),&direction,&ascent,&descent,&overall); -    XDrawString(global.dpy,global.backbuffer,global.backgc,global.xoff,global.height/2+(descent+0+ascent)*1,coords,strlen(coords));      if(global.debug) { +      snprintf(coords,sizeof(coords)-1,"debug: %s minimap: %d 3d: %d fps: %d shapes: %d",global.debug?"on":"off",global.drawminimap,global.draw3d,oldfps,global.shapes); +      XTextExtents(font,coords,strlen(coords),&direction,&ascent,&descent,&overall); +      XDrawString(global.dpy,global.backbuffer,global.backgc,global.xoff,global.height/2+(descent+0+ascent)*1,coords,strlen(coords));        snprintf(coords,sizeof(coords)-1,"x: %d y: %d",global.mousex,global.mousey);        XTextExtents(font,coords,strlen(coords),&direction,&ascent,&descent,&overall);        XDrawString(global.dpy,global.backbuffer,global.backgc,global.xoff,global.height/2+(descent+0+ascent)*2,coords,strlen(coords)); @@ -579,9 +578,6 @@ void draw_screen(Display *dpy,Window w,GC gc) {     //cy1=(cosl(d2r(camera.yr+270))*7l);     //cx2=(sinl(d2r(camera.yr+90))*7l);     //cy2=(cosl(d2r(camera.yr+90))*7l); -//   XDrawTriangle(camera.x+global.mapxoff,camera.z+global.mapyoff, -//                 camera.x+global.mapxoff+cx1,camera.z+global.mapyoff+cy1, -//                 camera.x+global.mapxoff+cx2,camera.z+global.mapyoff+cy2);  //   draw_c2_line((c2_t){0,0},(c2_t){10,10});  //   draw_c2_line((c2_t){0,0},(c2_t){-10,10});  //   draw_c2_line((c2_t){10,10},(c2_t){-10,10}); @@ -617,22 +613,22 @@ void draw_screen(Display *dpy,Window w,GC gc) {  */     //apply rotation?     // load up the triangles to render... after applying rotation? -   for(i=0;global.triangle[i];i++) { -    zs[i].t=global.triangle[i]; -    //rotate_triangle(zs[i].t); +   for(i=0;global.shape[i];i++) { +    zs[i].s=global.shape[i]; +    //rotate_shape(zs[i].s);     }     //     if(1) {//global.zsort) { -    for(i=0;global.triangle[i];i++) { -     zs[i].d=shitdist(*(zs[i].t),camera.p); +    for(i=0;global.shape[i];i++) { +     zs[i].d=shitdist(*(zs[i].s),camera.p);      }      qsort(&zs,i,sizeof(zs[0]),(__compar_fn_t)compar);//sort these zs structs based on d.     }     //draw all triangles -   if(zs[0].t) { -    strcpy(global.selected_object,zs[0].t->id); +   if(zs[0].s) { +    strcpy(global.selected_object,zs[0].s->id);     } -   for(i=0;global.triangle[i];i++) { +   for(i=0;global.shape[i];i++) {      //now we pick the color of this triangle!      if(global.red_and_blue) {       if(cn==0) { @@ -640,34 +636,37 @@ void draw_screen(Display *dpy,Window w,GC gc) {       } else {        XSetForeground(global.dpy,global.backgc,global.blue.pixel);       } +//tests of blending grayscale with red and blue +//     draw_c3_triangle(*(zs[i].t));      } else { -     if(!strcmp(global.selected_object,zs[i].t->id)) { +     if(!strcmp(global.selected_object,zs[i].s->id)) {        XSetForeground(global.dpy,global.backgc,global.green.pixel);       } else {        if(global.greyscale) {         if(zs[i].d > 0) { -        if(zs[i].d < 100) { +        if(zs[i].d < 10) {           colori=zs[i].d;          }         } -       XSetForeground(global.dpy,global.backgc,global.colors[100-colori].pixel); +       XSetForeground(global.dpy,global.backgc,global.colors[(int)(100.0-(colori * 10.0))].pixel);        }       }      } -    draw_c3_triangle(*(zs[i].t)); +    draw_c3_shape(*(zs[i].s));     }     XSetForeground(global.dpy, global.backgc, global.green.pixel); -   snprintf(coords,sizeof(coords)-1,"selected object: %s",global.selected_object); -   XTextExtents(font,coords,strlen(coords),&direction,&ascent,&descent,&overall); -   XDrawString(global.dpy,global.backbuffer,global.backgc,global.xoff,global.height/2+(descent+0+ascent)*5,coords,strlen(coords)); - +   if(global.debug) { +    snprintf(coords,sizeof(coords)-1,"selected object: %s",global.selected_object); +    XTextExtents(font,coords,strlen(coords),&direction,&ascent,&descent,&overall); +    XDrawString(global.dpy,global.backbuffer,global.backgc,global.xoff,global.height/2+(descent+0+ascent)*5,coords,strlen(coords)); +   }     camera.p.z+=(global.split_flip)*(global.split*cosl(d2r(camera.yr+180)));     camera.p.x+=(global.split_flip)*(global.split*sinl(d2r(camera.yr+180)));    } - +//TODO: figure out what all this shit is and either update or remove.  //DONT USE WIDTH for shit.  /*    x1=nextX(WIDTH/2,HEIGHT/2,d2r(camera.yr),40); @@ -728,7 +727,7 @@ char *read_line_hack(FILE *fp,int len) {  char **line_splitter(char *line,int *rlen) {   char **a;   int len,i=0; - len=1; + len=1;//we're just counting how much we'll need the first loop through.   for(i=0;line[i] && line[i] == ' ';i++);//skip leading space   for(;line[i];len++) {    for(;line[i] && line[i] != ' ';i++);//skip rest of data @@ -752,10 +751,18 @@ char **line_splitter(char *line,int *rlen) {   return a;  } +void set_aspect_ratio() { + XSizeHints *hints=XAllocSizeHints(); + hints->min_aspect.x=4*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)); + hints->min_aspect.y=3; + hints->max_aspect.x=4*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)); + hints->max_aspect.y=3; + hints->flags=PAspect; + XSetWMNormalHints(global.dpy,global.w,hints); +}  int load_stdin() { - struct c3_triangle *to; - struct c3_triangle t; + struct c3_shape s;  // struct c3_line l;   char *command;   char *line; @@ -770,10 +777,10 @@ int load_stdin() {   //FD_ZERO(&master);   //FD_ZERO(&readfs);   //FD_SET(0,&master);//just stdin. - int i;//used to store the last triangle. + int i;//used to store the last triangle. even though I have a global for that. >_>  // printf("# entering load_stdin()\n"); - for(i=0;global.triangle[i];i++) ;//hop to the end. + for(i=0;global.shape[i];i++) ;//hop to the end.   fcntl(0,F_SETFL,O_NONBLOCK);   if(feof(stdin))  {    clearerr(stdin); @@ -787,170 +794,184 @@ int load_stdin() {   // }   // if(FD_ISSET(0,&readfs)) {   while((line=read_line_hack(stdin,0))) {//load as long there's something to load -// while((line=read_line_hack(stdin,0))) {//load as long there's something to load -   if(*line == '#') return 0; -   //printf("# read command: %s\n",line); -   a=line_splitter(line,&len); -   if(len > 1) { -    id=a[0]; -    command=a[1]; -   } else { -    printf("Ohhhh. shit.\n"); -   } -//   for(i=0;i<len;i++) { -//    printf("a[%d]=\"%s\"\n",i,a[i]); -//   } -//   fflush(stdout); -   ret=1; -   if(!strcmp(command,"deleteallexcept")) { -    for(j=0;global.triangle[j];j++) {//mark first. compress later. -     if(strcmp(global.triangle[j]->id,t.id)) { -     // free(global.triangle[j]->id); -     // free(global.triangle[j]); -      global.triangle[j]=0; -     } +  if(*line == '#') return 0; +  //printf("# read command: %s\n",line); +  a=line_splitter(line,&len); +  if(len > 1) { +   id=a[0]; +   command=a[1]; +  } else { +   printf("Ohhhh. shit.\n"); +   return 0; +  } +  ret=1; +  if(!strcmp(command,"deleteallexcept")) { +   for(j=0;global.shape[j];j++) {//mark first. compress later. +    if(strcmp(global.shape[j]->id,a[2])) {//TODO: memory leak! +     //free(global.triangle[j]->id); +     //free(global.triangle[j]); +     global.shape[j]=0;      } -    l=0; -    for(k=0;k<j;k++) { -     while(global.triangle[l] == 0 && l < j) l++; -     global.triangle[k]=global.triangle[l]; +   } +   l=0; +   for(k=0;k<j;k++) { +    while(global.shape[l] == 0 && l < j) l++; +    global.shape[k]=global.shape[l]; +   } +   continue; +  } +  if(!strcmp(command,"deletegroup")) { +   for(j=0;global.shape[j];j++) {//mark first. compress later. +    if(!strcmp(global.shape[j]->id,s.id)) {//??? where is s.id supposed to be set from? +     free(global.shape[j]->id); +     free(global.shape[j]); +     global.shape[j]=0;      } -    continue;     } -   if(!strcmp(command,"deletegroup")) { -    for(j=0;global.triangle[j];j++) {//mark first. compress later. -     if(!strcmp(global.triangle[j]->id,t.id)) { -      free(global.triangle[j]->id); -      free(global.triangle[j]); -      global.triangle[j]=0; +   l=0; +   for(k=0;k<j;k++) { +    while(global.shape[l] == 0 && l < j) l++; +    global.shape[k]=global.shape[l]; +   } +   continue; +  } +  if(!strcmp(command,"assimilate")) { +   if(len == 3) { +    for(j=0;global.shape[j];j++) { +     if(!strcmp(global.shape[j]->id,a[2])) { +      free(global.shape[j]->id); +      global.shape[j]->id=strdup(id);       }      } -    l=0; -    for(k=0;k<j;k++) { -     while(global.triangle[l] == 0 && l < j) l++; -     global.triangle[k]=global.triangle[l]; -    } -    continue;     } -   if(!strcmp(command,"assimilate")) { -    if(len == 3) { -     for(j=0;global.triangle[j];j++) { -      if(!strcmp(global.triangle[j]->id,a[2])) { -       free(global.triangle[j]->id); -       global.triangle[j]->id=strdup(id); -      } +   continue; +  } +  if(!strcmp(command,"renamegroup")) { +   if(len == 4) { +    for(j=0;global.shape[j];j++) { +     if(!strcmp(global.shape[j]->id,a[2])) { +      free(global.shape[j]->id); +      global.shape[j]->id=strdup(a[3]);       }      } -    continue;     } -   if(!strcmp(command,"addtriangle")) { -    if(len == 11) { -     t.id=strdup(id); -     t.p1.x=strtold(a[2],0);//second arg is just for a return value. set to 0 if you don't want it. -     t.p1.y=strtold(a[3],0); -     t.p1.z=strtold(a[4],0); -     t.p2.x=strtold(a[5],0); -     t.p2.y=strtold(a[6],0); -     t.p2.z=strtold(a[7],0); -     t.p3.x=strtold(a[8],0); -     t.p3.y=strtold(a[9],0); -     t.p3.z=strtold(a[10],0); -//     printf("%s[%s]=(%d,%d,%d),(%d,%d,%d),(%d,%d,%d)t.p1.x",command,id,t.p1.x,t.p1.y,t.p1.z,t.p1.); -     global.triangle[i]=malloc(sizeof(struct c3_triangle)); -     to=global.triangle[i]; -     memcpy(to,&t,sizeof(t)); -     i++; -     global.triangles=i; -     global.triangle[i]=0; -    } else { -     printf("# ERROR: wrong amount of parts for addtriangle. got: %d expected: 11\n",len); +   continue; +  } +  if(!strcmp(command,"export")) { +   for(j=0;global.shape[j];j++) { +    if(!strcmp(global.shape[j]->id,a[2])) { +//     to=global.shape[j]; +//     printf("%s addshape %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf\n",a[2], +//            to->p1.x,to->p1.y,to->p1.z, +//            to->p2.x,to->p2.y,to->p2.z, +//            to->p3.x,to->p3.y,to->p3.z +//           );      } +   } +   continue; +  } +  if(!strcmp(command,"dump")) { +   printf("%s set camera.p.x %Lf\n",global.user,camera.p.x); +   printf("%s set camera.p.y %Lf\n",global.user,camera.p.y); +   printf("%s set camera.p.z %Lf\n",global.user,camera.p.z); +   printf("%s set camera.xr %d\n",global.user,camera.xr); +   printf("%s set camera.yr %d\n",global.user,camera.yr); +   printf("%s set camera.zr %d\n",global.user,camera.zr); +   printf("%s set camera.zoom %Lf\n",global.user,camera.zoom); +   continue; +  } +  if(!strcmp(command,"quit")) { +   return -1; +  } +  if(!strcmp(command,"set")) { //set variable //TODO: add more things to this. +   if(len != 3 && len != 4) continue; +   if(len == 4) { +    if(!strcmp(a[2],"camera.p.x")) camera.p.x=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.p.y")) camera.p.y=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.p.z")) camera.p.z=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.zoom")) camera.zoom=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.xr")) camera.xr=atoi(a[3]); +    else if(!strcmp(a[2],"camera.yr")) camera.yr=atoi(a[3]); +    else if(!strcmp(a[2],"camera.zr")) camera.zr=atoi(a[3]); +    else printf("# unknown variable: %s\n",a[2]);      continue; -    //return ret;     } -   if(!strcmp(command,"scaleup")) { -    for(i=0;global.triangle[i];i++) { -     if(!strcmp(global.triangle[i]->id,t.id)) { -      global.triangle[i]->p1.x*=t.p1.x; -      global.triangle[i]->p1.y*=t.p1.x; -      global.triangle[i]->p1.z*=t.p1.x; - -      global.triangle[i]->p2.x*=t.p1.x; -      global.triangle[i]->p2.y*=t.p1.x; -      global.triangle[i]->p2.z*=t.p1.x; - -      global.triangle[i]->p3.x*=t.p1.x; -      global.triangle[i]->p3.y*=t.p1.x; -      global.triangle[i]->p3.z*=t.p1.x; +   if(!strcmp(a[2],"force_redraw")) global.force_redraw^=1; +   else if(!strcmp(a[2],"red_and_blue")) { global.red_and_blue^=1; set_aspect_ratio(); } +   else { printf("# unknown variable: %s\n",a[2]); continue; } +   printf("# %s toggled!\n",a[2]); +   continue; +  } +  if(!strcmp(command,"addshape")) { +   if(len > 3) { +    global.shape[i]=malloc(sizeof(struct c3_shape)); +    global.shape[i]->id=strdup(id); +    global.shape[i]->len=strtold(a[2],0); +    for(j=0;j < global.shape[i]->len;j++) { +     global.shape[i]->p[j].x=strtold(a[(j*3)+3],0);//second arg is just for a return value. set to 0 if you don't want it. +     global.shape[i]->p[j].y=strtold(a[(j*3)+4],0); +     global.shape[i]->p[j].z=strtold(a[(j*3)+5],0); +    } +    i++; +    global.shapes=i; +    global.shape[i]=0; +   } else { +    printf("# ERROR: wrong amount of parts for addshape. got: %d expected: 11\n",len); +   } +   continue; +  } +  if(!strcmp(command,"scaleup")) {//should this scale separately so it can be a deform too? +   for(i=0;global.shape[i];i++) { +    if(!strcmp(global.shape[i]->id,id)) { +     for(j=0;j < global.shape[i]->len;j++) { +      global.shape[i]->p[j].x*=strtold(a[2],0); +      global.shape[i]->p[j].y*=strtold(a[2],0); +      global.shape[i]->p[j].z*=strtold(a[2],0);       }      } -    continue; -    //return ret;     } - -   if(!strcmp(command,"move")) {// extra fun if the arguments are different. -    t.id=strdup(id); -    if(len == 11) { -     t.p1.x=strtold(a[2],0);//second arg is just for a return value. set to 0 if you don't want it. -     t.p1.y=strtold(a[3],0); -     t.p1.z=strtold(a[4],0); -     t.p2.x=strtold(a[5],0); -     t.p2.y=strtold(a[6],0); -     t.p2.z=strtold(a[7],0); -     t.p3.x=strtold(a[8],0); -     t.p3.y=strtold(a[9],0); -     t.p3.z=strtold(a[10],0); -     for(i=0;global.triangle[i];i++) { -      if(!strcmp(global.triangle[i]->id,t.id)) { -       global.triangle[i]->p1.x+=t.p1.x; -       global.triangle[i]->p1.y+=t.p1.y; -       global.triangle[i]->p1.z+=t.p1.z; -       global.triangle[i]->p2.x+=t.p1.x; -       global.triangle[i]->p2.y+=t.p1.y; -       global.triangle[i]->p2.z+=t.p1.z; -       global.triangle[i]->p3.x+=t.p1.x; -       global.triangle[i]->p3.y+=t.p1.y; -       global.triangle[i]->p3.z+=t.p1.z; -/* -       global.triangle[i]->p2.x+=t.p2.x; -       global.triangle[i]->p2.y+=t.p2.y; -       global.triangle[i]->p2.z+=t.p2.z; -       global.triangle[i]->p3.x+=t.p3.x; -       global.triangle[i]->p3.y+=t.p3.y; -       global.triangle[i]->p3.z+=t.p3.z; -*/ +   continue; +    //return ret; +  } +  if(!strcmp(command,"move")) { +   if(len > 4) { +    for(i=0;global.shape[i];i++) { +     if(!strcmp(global.shape[i]->id,id)) { +      for(j=0;j < global.shape[i]->len;j++) { +       global.shape[i]->p[j].x+=strtold(a[2],0); +       global.shape[i]->p[j].y+=strtold(a[3],0); +       global.shape[i]->p[j].z+=strtold(a[4],0);        }       }      } -    else { -     printf("# ERROR: wrong amount of parts for move. got: %d expected: 11\n",len); -    } -    continue; -    //return ret;     } -   printf("# I don't know what command you're talking about. %s\n",command); +   else { +    printf("# ERROR: wrong amount of parts for move. got: %d expected: 11\n",len); +   } +   continue; +   //return ret; +  } +  printf("# I don't know what command you're talking about. %s\n",command);  /*   if(!strcmp(command,"rotate")) { -     for(i=0;global.triangle[i];i++) { -      global.triangle[i]->p1=rotate_c3_about() -      global.triangle[i]->p2= -      global.triangle[i]->p3= +     for(i=0;global.shape[i];i++) { +      global.shape[i]->p1=rotate_c3_about() +      global.shape[i]->p2= +      global.shape[i]->p3=       } -    }*/ -   free(line); -   if(a) free(a); -//  } +*/ +  free(line); +  if(a) free(a);   } -// printf("# leaving load_stdin()\n");   return ret;  } -int export_file(FILE *fp) {//not used yet. maybe export in obj optionally? - struct c3_triangle *to; - int i; - for(i=0;global.triangle[i];i++) { -  to=global.triangle[i]; -  printf("%s addtriangle %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf\n",to->id,to->p1.x,to->p1.y,to->p1.z,to->p2.x,to->p2.y,to->p2.z,to->p3.x,to->p3.y,to->p3.z); - } +int export_file(FILE *fp) {//not used yet. maybe export in obj optionally? no. that should be an external program +// struct c3_shape *to; +// int i; +// for(i=0;global.shape[i];i++) { +//  to=global.shape[i]; +//  printf("%s addshape %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf %Lf\n",to->id,to->p1.x,to->p1.y,to->p1.z,to->p2.x,to->p2.y,to->p2.z,to->p3.x,to->p3.y,to->p3.z); +// }   return 0;  } @@ -1074,9 +1095,9 @@ int keypress_handler(int sym) {   return 1;  } +  int main(int argc,char *argv[]) {    Cursor cursor; -  Window w;    XEvent e;    XSetWindowAttributes attributes;    Window root,child;//why do I have this? @@ -1110,31 +1131,24 @@ int main(int argc,char *argv[]) {    global.split_flip=-1;    global.split=5;    global.root_window=0; -  global.red_and_blue=0; +  global.red_and_blue=RED_AND_BLUE;    //global.colors[0]=BlackPixel(global.dpy,DefaultScreen(global.dpy));  //  int whiteColor = //WhitePixel(global.dpy, DefaultScreen(global.dpy));    attributes.background_pixel=global.colors[0].pixel;    if(global.root_window) { -   w = DefaultRootWindow(global.dpy); //this is still buggy. +   global.w = DefaultRootWindow(global.dpy); //this is still buggy.    } else { -   w = XCreateWindow(global.dpy,DefaultRootWindow(global.dpy),0,0,WIDTH*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)),HEIGHT,1,DefaultDepth(global.dpy,DefaultScreen(global.dpy)),InputOutput,DefaultVisual(global.dpy,DefaultScreen(global.dpy))\ +   global.w = XCreateWindow(global.dpy,DefaultRootWindow(global.dpy),0,0,WIDTH*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)),HEIGHT,1,DefaultDepth(global.dpy,DefaultScreen(global.dpy)),InputOutput,DefaultVisual(global.dpy,DefaultScreen(global.dpy))\                      ,CWBackPixel, &attributes); -   XSizeHints *hints=XAllocSizeHints(); -   hints->min_aspect.x=4*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)); -   hints->min_aspect.y=3; -   hints->max_aspect.x=4*(global.split_screen / (global.red_and_blue ? global.split_screen : 1)); -   hints->max_aspect.y=3; -   hints->flags=PAspect; -   XSelectInput(global.dpy, w, PointerMotionMask|StructureNotifyMask|ButtonPressMask|ButtonReleaseMask|KeyPressMask|ExposureMask); -   XSetWMNormalHints(global.dpy,w,hints); +   set_aspect_ratio(); +   XSelectInput(global.dpy, global.w, PointerMotionMask|StructureNotifyMask|ButtonPressMask|ButtonReleaseMask|KeyPressMask|ExposureMask);    } -  XMapWindow(global.dpy, w); -  XStoreName(global.dpy,w,"hackvr"); -  global.w=w; +  XMapWindow(global.dpy, global.w); +  XStoreName(global.dpy,global.w,"hackvr");    global.greyscale=1;    global.zsort=1; -  global.triangle[0]=0;//we'll allocate as we need more. -  global.gc=XCreateGC(global.dpy, w, 0, 0); +  global.shape[0]=0;//we'll allocate as we need more. +  global.gc=XCreateGC(global.dpy, global.w, 0, 0);    if(global.red_and_blue) {     global.width=WIDTH; @@ -1143,14 +1157,14 @@ int main(int argc,char *argv[]) {    }    global.height=HEIGHT; -  global.backbuffer=XCreatePixmap(global.dpy,w,global.width,global.height,DefaultDepth(global.dpy,DefaultScreen(global.dpy))); -  global.cleanbackbuffer=XCreatePixmap(global.dpy,w,global.width,global.height,DefaultDepth(global.dpy,DefaultScreen(global.dpy))); +  global.backbuffer=XCreatePixmap(global.dpy,global.w,global.width,global.height,DefaultDepth(global.dpy,DefaultScreen(global.dpy))); +  global.cleanbackbuffer=XCreatePixmap(global.dpy,global.w,global.width,global.height,DefaultDepth(global.dpy,DefaultScreen(global.dpy)));  //backbuffer is uninitialized    global.backgc=XCreateGC(global.dpy,global.backbuffer,0,0);    cursor=XCreateFontCursor(global.dpy,XC_crosshair); -  XDefineCursor(global.dpy, w, cursor); +  XDefineCursor(global.dpy, global.w, cursor);    XAllocNamedColor(global.dpy, global.color_map, "green", &global.green, &global.green);    XAllocNamedColor(global.dpy, global.color_map, "red", &global.red, &global.red); @@ -1168,7 +1182,7 @@ int main(int argc,char *argv[]) {  //  XSetForeground(global.dpy, gc, whiteColor);  // this was taking a "long" time.    printf("# generating sky... "); -  skypixmap=XCreatePixmap(global.dpy,w,SKYW,SKYH,DefaultDepth(global.dpy,DefaultScreen(global.dpy))); +  skypixmap=XCreatePixmap(global.dpy,global.w,SKYW,SKYH,DefaultDepth(global.dpy,DefaultScreen(global.dpy)));    for(i=0;i<SKYH;i++) {     for(j=0;j<SKYW;j++) {      if(i==0) sky[i][j]=rand()%2; @@ -1187,10 +1201,10 @@ int main(int argc,char *argv[]) {    global.drawminimap=0;    global.draw3d=1;    global.debug=0; -  global.force_redraw=0;//use this for checking proper fps I guess. +  global.force_redraw=1;//use this for checking proper fps I guess.    camera.zoom=30.0l;    camera.xr=270; -  camera.yr=90; +  camera.yr=270;    camera.zr=0;    global.mmz=1;    camera.p.x=0; @@ -1201,14 +1215,14 @@ int main(int argc,char *argv[]) {      redraw=global.force_redraw;      while(XPending(global.dpy)) {//these are taking too long?       XNextEvent(global.dpy, &e); -     printf("# handling event with type: %d\n",e.type); +//     printf("# handling event with type: %d\n",e.type);       switch(e.type) {  //       case Expose:  //         if(e.xexpose.count == 0) redraw=1;  //         break;         case MotionNotify:           redraw=1; -         XQueryPointer(global.dpy,w,&root,&child,&global.rmousex,&global.rmousey,&global.mousex,&global.mousey,&mask); +         XQueryPointer(global.dpy,global.w,&root,&child,&global.rmousex,&global.rmousey,&global.mousex,&global.mousey,&mask);           break;         case ButtonPress:           redraw=1; @@ -1220,7 +1234,7 @@ int main(int argc,char *argv[]) {           break;         case ConfigureNotify:           redraw=1; -         XGetGeometry(global.dpy,w,&root,&global.x,&global.y,&global.width,&global.height,&global.border_width,&global.depth); +         XGetGeometry(global.dpy,global.w,&root,&global.x,&global.y,&global.width,&global.height,&global.border_width,&global.depth);           if(global.width / (global.split_screen / (global.red_and_blue ? global.split_screen : 1 )) / 4 * 3 != global.height) {            if(global.height * 3 / 4 == global.height) {             printf("math doesn't work.\n"); @@ -1237,17 +1251,29 @@ int main(int argc,char *argv[]) {           break;         case KeyPress:           redraw=1; -         if(keypress_handler(XLookupKeysym(&e.xkey,0)) == -1) return 0; +         if(keypress_handler(XLookupKeysym(&e.xkey,0)) == -1) { +          printf("# exiting\n"); +          return 0; +         }           break;         default: -         printf("# received event with type: %d\n",e.type); +         //printf("# received event with type: %d\n",e.type);           break;       }      } -    if(load_stdin() || redraw) { -     printf("# entering draw_screen\n"); -     draw_screen(global.dpy,w,global.gc); -     printf("# returned from draw_screen\n"); +    switch(load_stdin()) { +     case -1: +      return 0; +      break; +     case 0: +      break; +     default: +      redraw=1; +      break; +    } +    //camera.yr+=2; +    if(redraw) { +     draw_screen(global.dpy,global.w,global.gc);      }      //usleep(10000);    } | 
