diff options
| -rwxr-xr-x | filebrowser/run | 2 | ||||
| -rwxr-xr-x | map2globe.py | 6 | ||||
| -rw-r--r-- | src/HACKING | 20 | ||||
| -rw-r--r-- | src/Makefile | 21 | ||||
| -rw-r--r-- | src/common.h | 19 | ||||
| -rw-r--r-- | src/config.h | 5 | ||||
| -rw-r--r-- | src/graphics_c2.c | 41 | ||||
| -rw-r--r-- | src/graphics_c2.h | 17 | ||||
| -rw-r--r-- | src/graphics_c2_opengl.c | 193 | ||||
| -rw-r--r-- | src/graphics_c2_opengl.h (renamed from src/graphics_opengl.h) | 0 | ||||
| -rw-r--r-- | src/graphics_c3.c (renamed from src/graphics.c) | 225 | ||||
| -rw-r--r-- | src/graphics_c3.h (renamed from src/graphics.h) | 2 | ||||
| -rw-r--r-- | src/graphics_cs.h (renamed from src/graphics_backend.h) | 8 | ||||
| -rw-r--r-- | src/graphics_cs_opengl.c | 0 | ||||
| -rw-r--r-- | src/graphics_cs_x11.c (renamed from src/graphics_x11.c) | 116 | ||||
| -rw-r--r-- | src/graphics_opengl.c | 151 | ||||
| -rw-r--r-- | src/hackvr.c | 106 | ||||
| -rw-r--r-- | src/math.c | 15 | ||||
| -rw-r--r-- | src/math.h | 1 | ||||
| -rwxr-xr-x | src/testit.sh | 4 | 
20 files changed, 569 insertions, 383 deletions
diff --git a/filebrowser/run b/filebrowser/run index d088d2e..c3bc1d3 100755 --- a/filebrowser/run +++ b/filebrowser/run @@ -1,3 +1,3 @@  #!/bin/bash  cd "$(dirname "$0")" -./hackvr-frontend.sh +./frontend-hackvr.sh ./backend-gopher.sh diff --git a/map2globe.py b/map2globe.py index 8e58752..7b8ffb0 100755 --- a/map2globe.py +++ b/map2globe.py @@ -16,7 +16,8 @@ z="0"  # / 90 * math.pi  #they need to be in the range 0 to 2pi? -print("globe addshape 1 0 0 0 1 -1 0") +print("globe addshape 1 0 0 0 0 1 0") +rotation=0  while(1):   #print (plat,plon,lat,lon) @@ -42,6 +43,9 @@ while(1):    break   if(lat and lon and x and y and z and plat and plon and px and py and pz): #if the previouses exist    print("globe addshape 3 " + x + " " + y + " " + z + " " + x + " " + y + " " + z + " " + px + " " + py + " " + pz) +  print("globe rotate 0 " + str(rotation) + " 0") +  rotation+=1 +  rotation%=360  #set previouses to currents   (plat,plon,px,py,pz)=(lat,lon,x,y,z) diff --git a/src/HACKING b/src/HACKING new file mode 100644 index 0000000..98bac03 --- /dev/null +++ b/src/HACKING @@ -0,0 +1,20 @@ +oh god. I have no idea what I'm doing. + +may the gods have mercy on my soul for this monstrosity.. + +so. + +hackvr.c can optionally use graphics or not. + +if you choose to have graphics you can choose between: + +x11 or opengl+glut + +There are three layers of the graphics code.. + +I'm not exactly sure how I'm going to combine these. + +graphics_c3.c uses functions defined in a graphics_c2* file. +graphics_c2.c uses function defined in a graphics_cs* file. + +some graphical backends may provide their own graphics_c3.c? diff --git a/src/Makefile b/src/Makefile index d3e80a2..c41781e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,17 +1,18 @@  CFLAGS=-Wall -pedantic -std=c99 -DGRAPHICAL -ffast-math -#all: hackvr_headless hackvr_x11 hackvr_opengl slowcat ### when hackvr_opengl gets useful at all I'll start including it in default build. -all: hackvr_headless hackvr_x11 slowcat -	ln -s hackvr_x11 hackvr +all: hackvr_headless hackvr_x11 hackvr_opengl slowcat ### when hackvr_opengl gets useful at all I'll start including it in default build. +#all: hackvr_headless hackvr_x11 slowcat +	ln -sf hackvr_x11 hackvr  hackvr_headless: LDLIBS=-lm  hackvr_headless: hackvr_headless.o math.o  hackvr_x11: LDLIBS=-lm -lX11 -hackvr_x11: hackvr_x11.o graphics.o graphics_x11.o math.o +hackvr_x11: hackvr_x11.o graphics_c3.o graphics_c2.o graphics_cs_x11.o math.o +#notice how all the targets have generic graphics objects up until a specific one.  hackvr_opengl: LDLIBS=-lm -lGL -lGLU -lglut -hackvr_opengl: hackvr_opengl.o graphics.o graphics_opengl.o math.o +hackvr_opengl: hackvr_opengl.o graphics_c3.o graphics_c2_opengl.o graphics_cs_opengl.o math.o  hackvr_opengl.o: LDLIBS=-lm -lGL -lGLU -lglut  hackvr_x11.o: LDLIBS=-lm -lX11 @@ -19,9 +20,13 @@ hackvr_x11.o: LDLIBS=-lm -lX11  hackvr_headless.o: CFLAGS=-Wall -pedantic -std=c99 -ffast-math  hackvr_headless.o: LDLIBS=-lm -graphics.o: LDLIBS=-lm -graphics_x11.o: LDLIBS=-lm -lX11 -graphics_opengl.o: LDLIBS=-lm -lGL -lGLU -lglut +graphics_c3.o: LDLIBS=-lm +graphics_c2.o: LDLIBS=-lm + +graphics_cs_x11.o: LDLIBS=-lm -lX11 + +graphics_c2_opengl.o: LDLIBS=-lm -lGL -lGLU -lglut +graphics_cs_opengl.o: LDLIBS=-lm -lGL -lGLU -lglut  math.o: LDLIBS=-lm  clean: diff --git a/src/common.h b/src/common.h index 859c826..bdabb4f 100644 --- a/src/common.h +++ b/src/common.h @@ -1,9 +1,15 @@  #include "config.h" +#include "math.h"  #ifndef _HACKVR_COMMON_H_  #include <X11/Xlib.h>  #define _HACKVR_COMMON_H_ +#define TOP     240.0 +#define BOTTOM  -240.0 +#define RIGHT   320.0 +#define LEFT    -320.0 +  #define min(a,b) (((a)<(b))?(a):(b))  #define max(a,b) (((a)>(b))?(a):(b)) @@ -33,17 +39,17 @@ typedef struct {   short y;  } cs_t; -typedef struct c3_rotation { +typedef struct {    degrees x;    degrees y;    degrees z;  } c3_rot_t; -struct camera { -  c3_t p; +typedef struct { +  char *id;    c3_rot_t r; -  real zoom; -} camera; +  c3_t p; +} c3_group_rot_t;  typedef struct c3_line {   char *id; @@ -80,6 +86,9 @@ struct global {    real mmz;    struct c3_shape *shape[SHAPES];    int shapes; +  c3_group_rot_t *group_rot[256];//meh +  c3_group_rot_t camera; +  real zoom;    int derp;    real split;  }; diff --git a/src/config.h b/src/config.h index 08ce918..2ef2d1a 100644 --- a/src/config.h +++ b/src/config.h @@ -8,14 +8,15 @@  #define DEBUG 1  #define WALK_SPEED 1 -#define SPLIT_SCREEN 2 +#define SPLIT_SCREEN 1  #define CAMERA_SEPARATION -1 -#define RED_AND_BLUE 1 +#define RED_AND_BLUE 0  #define SHAPES 16386  #define MAX_SIDES 8  #define WIDTH 4000  #define HEIGHT 3000  #define DEFAULT_MINIMAP 0  #define FORCE_REDRAW 1 +#define MAXSHAPES 3000  #endif diff --git a/src/graphics_c2.c b/src/graphics_c2.c new file mode 100644 index 0000000..17f1828 --- /dev/null +++ b/src/graphics_c2.c @@ -0,0 +1,41 @@ +#include "graphics_cs.h" +#include "graphics_c3.h" + +extern struct gra_global gra_global; + +int c2sX(real x) { return (gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen: 1))) * ((x + RIGHT) / (RIGHT *2)) + gra_global.xoff; } +int s2cX(real x) { return (x/(gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue?gra_global.split_screen :1))))*(RIGHT*2)-RIGHT; } + +int c2sY(real y) { return gra_global.height * ((TOP-y) / (TOP*2)); } +int s2cY(real y) { return -((y/gra_global.height) * (TOP*2) - TOP); } + +cs_t c2_to_cs(c2_t p) { + return (cs_t){c2sX(p.x),c2sY(p.y)}; +} +c2_t cs_to_c2(cs_t p) { + return (c2_t){s2cX(p.x),s2cY(p.y)}; +} + +void draw_c2_line(c2_t p1,c2_t p2) { +  draw_cs_line(c2_to_cs(p1),c2_to_cs(p2)); +} + +void draw_c2_shape(c2_s_t s) { +  int i; +  cs_s_t ss; +  ss.len=s.len; +  ss.id=s.id; +  for(i=0;i<s.len;i++) { +   ss.p[i]=c2_to_cs(s.p[i]); +  } +  draw_cs_shape(ss); +} + +void draw_c2_filled_shape(c2_s_t s) { +  draw_c2_shape(s);//heh. TODO: fixme +} + +void draw_c2_text(c2_t p,char *text) { + cs_t p2=c2_to_cs(p); + draw_cs_text(p2,text); +} diff --git a/src/graphics_c2.h b/src/graphics_c2.h new file mode 100644 index 0000000..35920fd --- /dev/null +++ b/src/graphics_c2.h @@ -0,0 +1,17 @@ +#ifndef _HACKVR_GRAPHICS_C2_H_ +#define _HACKVR_GRAPHICS_C2_H_ + +#include "math.h" + +int c2sX(real x); +int s2cX(real x); +int c2sY(real y); +int s2cY(real y); +cs_t c2_to_cs(c2_t p); +c2_t cs_to_c2(cs_t p); +void draw_c2_line(c2_t p1,c2_t p2); +void draw_c2_shape(c2_s_t s); +void draw_c2_filled_shape(c2_s_t s); +void draw_c2_text(c2_t p,char *text); + +#endif diff --git a/src/graphics_c2_opengl.c b/src/graphics_c2_opengl.c new file mode 100644 index 0000000..3429193 --- /dev/null +++ b/src/graphics_c2_opengl.c @@ -0,0 +1,193 @@ +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <GL/glut.h> +#include <GL/freeglut_ext.h> + +#include "common.h" +#include "graphics_cs.h" +#include "graphics_c2.h" +#include "graphics_c3.h" + +extern struct gra_global gra_global; + +GLenum doubleBuffer; +GLubyte ubImage[65536]; + +#define RIGHT   320.0 +#define LEFT    -320.0 +#define TOP     240.0 +#define BOTTOM  -240.0 + +int c2sX(real x) { return (gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen: 1))) * ((x + RIGHT) / (RIGHT *2)) + gra_global.xoff; } +int s2cX(real x) { return (x/(gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue?gra_global.split_screen :1))))*(RIGHT*2)-RIGHT; } + +int c2sY(real y) { return gra_global.height * ((TOP-y) / (TOP*2)); } +int s2cY(real y) { return -((y/gra_global.height) * (TOP*2) - TOP); } + +cs_t c2_to_cs(c2_t p) { + return (cs_t){c2sX(p.x),c2sY(p.y)}; +} + +c2_t cs_to_c2(cs_t p) { + return (c2_t){s2cX(p.x),s2cY(p.y)}; +} + +void set_aspect_ratio(int w,int h) { +  glViewport(0,0,w,h); +//  glMatrixMode(GL_PROJECTION); +//  glLoadIdentity(); +//  glOrtho(LEFT,RIGHT,BOTTOM,TOP,0,0); +//  glTranslatef(0,-h,0); +} + +void set_color_based_on_distance(real d) { + //scale this color based on distance... closer is lighter. +// float g; +// g=d/100.0 + glColor3f(0.0, 1.0, 0.0); +} + +void set_clipping_rectangle(int x,int y,int w,int h) { + +} + +void draw_c2_line(c2_t p1,c2_t p2) { + //glBegin(GL_TRIANGLES); + glBegin(GL_LINES); + glColor3f(0.0, 1.0, 0.0); + glVertex2i(p1.x,p1.y); + glVertex2i(p2.x,p2.y); + //glVertex2i(p2.x,p2.y); + glEnd(); +} + +void draw_c2_text(c2_t p,char *s) { +// printf("@%lF,%lF: %s\n",p.x,p.y,s); +} + +void draw_c2_shape(c2_s_t s) { +  int i; +//  printf("drawing shaep!\n"); +  for(i=0;i<s.len+(s.len==1);i++) {//this shape is closed! +    draw_c2_line(s.p[i],s.p[(i+1)%(s.len+(s.len==1))]); +  } +/*  glBegin(GL_LINE_STRIP); +  glColor3f(0.0, 1.0, 0.0); +  for(i=0;i<s.len+(s.len==1);i++) { +    glVertex2i(s.p[i].x,s.p[i].y); +  } +  glEnd(); +*/ +} + +void draw_c2_filled_shape(c2_s_t s) { +  draw_c2_shape(s); +//  glBegin(GL_POLYGON); +//  glVertex2s(); +//  glEnd(); +} + +void set_color() { + glColor3f(0.0, 1.0, 0.0); +} + +void set_color_red() { + glColor3f(1.0, 0.0, 0.0); +} + +void set_color_blue() { + glColor3f(0.0, 0.0, 1.0); +} + +void clear_backbuffer() { +  glClearColor(0.0, 0.0, 0.0, 1.0); +  glClear(GL_COLOR_BUFFER_BIT); +//  glFlush(); +} + +void flipscreen() { +//  glutSwapBuffers(); +  glFlush(); +} + +void red_and_blue_magic() { + +} + +void keypress_handler(unsigned char key, int x, int y) {//x and y are mouse positions. +  switch (key) { +  case 27: +    exit(0); +  } +} + +/* draw_screen is in graphics.c +void draw_screen(void) +{ + + +}*/ + + +void derp_screen() { + printf("derpsceen being called.\n"); + clear_backbuffer(); + set_color(); + + //this should work for draw_c2_line, not cs_line... merp. +// draw_c2_line((c2_t){LEFT,0},(c2_t){RIGHT,0}); //horizon +// draw_cs_line((cs_t){0,0},(cs_t){1,1}); +// draw_cs_line((cs_t){-1,0},(cs_t){0,1}); +// draw_cs_line((cs_t){0,0},(cs_t){-1,1}); + /*draw_cs_line((cs_t){10,10},(cs_t){200,210}); + draw_cs_line((cs_t){50,10},(cs_t){200,210}); + draw_cs_line((cs_t){0,60},(cs_t){200,210});*/ + flipscreen(); +} + +void empty() { +} + +int graphics_sub_init(void) +{ +//  GLenum type; + +//  type = GLUT_RGB; +//  type |= GLUT_DOUBLE; +  int argc=0; +  char *argv[]={"derp",0}; +  glutInit(&argc,argv); +//  glutInitDisplayMode(type); +  glutCreateWindow("hackvr opengl and glut testing"); +  glutInitWindowSize(320,240); +  glScalef((1.0/320.0),(1.0/240.0),-1);//only do this once! +//  glMatrixMode(GL_PROJECTION); +//  glLoadIdentity(); +//  gluPerspective(60.0, 1.0, 0.1, 1000.0); +//  glMatrixMode(GL_MODELVIEW); +//  glDisable(GL_DITHER); + +  printf("test"); + +  glutKeyboardFunc(keypress_handler); +  glutDisplayFunc(draw_screen);//this is probably what should happen... +  glutReshapeFunc(set_aspect_ratio); +  return 0;//we're fine +} + + +int graphics_event_handler() {//return values: -1 exit, 0 don't redraw, anything else redraw + glutMainLoopEvent(); + glutPostRedisplay();//heh. wonder if this works... + return 1; +} + +/* +void main(int argc,char *argv[]) { +  graphics_init(); +  while(1) { +    graphics_event_handler(); +  } +} +*/ diff --git a/src/graphics_opengl.h b/src/graphics_c2_opengl.h index a5aa15d..a5aa15d 100644 --- a/src/graphics_opengl.h +++ b/src/graphics_c2_opengl.h diff --git a/src/graphics.c b/src/graphics_c3.c index 3cb973f..5d18db3 100644 --- a/src/graphics.c +++ b/src/graphics_c3.c @@ -14,8 +14,10 @@  #include "config.h"  #include "common.h" -#include "graphics_backend.h" //this header includes all the functions you'll need to implement if you want to port hackvr to something else -#include "graphics.h" +//#include "graphics_cs.h" //this header includes all the functions you'll need to implement if you want to port hackvr to something else +#include "graphics_c3.h"//we're defining these functions in this file. +#include "graphics_c2.h"//we're using these functions make them. +#include "graphics_cs.h"//we'll need generic function that don't give a damn about which dimension it is?  //typedef float real; //think this conflicts? @@ -39,18 +41,6 @@ struct gra_global gra_global;  #define RIGHT   320.0  #define LEFT    -320.0 -int c2sX(real x) { return (gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue ? gra_global.split_screen: 1))) * ((x + RIGHT) / (RIGHT *2)) + gra_global.xoff; } -int s2cX(real x) { return (x/(gra_global.width/(gra_global.split_screen / (gra_global.red_and_blue?gra_global.split_screen :1))))*(RIGHT*2)-RIGHT; } - -int c2sY(real y) { return gra_global.height * ((TOP-y) / (TOP*2)); } -int s2cY(real y) { return -((y/gra_global.height) * (TOP*2) - TOP); } - -cs_t c2_to_cs(c2_t p) { - return (cs_t){c2sX(p.x),c2sY(p.y)}; -} -c2_t cs_to_c2(cs_t p) { - return (c2_t){s2cX(p.x),s2cY(p.y)}; -}  /*  real distance2(c2_t p1,c2_t p2) {   return sqrtl(( (p1.x-p2.x)*(p1.x-p2.x) )+( (p1.y-p2.y)*(p1.y-p2.y) )); @@ -152,20 +142,53 @@ int get_2D_intersection_Y(x,y,d,x,z,d) {  }  */ -void draw_c2_line(c2_t p1,c2_t p2) { -  draw_cs_line(c2_to_cs(p1),c2_to_cs(p2)); +c3_t c3_add(c3_t p1,c3_t p2) { + return (c3_t){p1.x+p2.x,p1.y+p2.y,p1.z+p2.z}; +} + +c3_t c3_subtract(c3_t p1,c3_t p2) { + return (c3_t){p1.x-p2.x,p1.y-p2.y,p1.z-p2.z}; +} + +#define MAGIC(x) (1.0l-(1.0l/powl(1.01l,(x)))) //??? might want to have some changables in here + +real magic(real x) { +  return MAGIC(x); +} + +c2_t c3_to_c2(c3_t p3) { //DO NOT DRAW STUFF IN HERE +  c2_t p2; +//  c3_t tmp1; +//  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,global.camera.p,d2r(global.camera.r.y));//rotate everything around the camera's location. +  //now to rotate the shape around it's group's center. +//  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)); +//  final=rotate_c3_zr(tmp2,camera.p,d2r(camera.zr)); +  real delta_x=(global.camera.p.x - final.x); +  real delta_y=(global.camera.p.y - final.y); +  real delta_z=(global.camera.p.z - final.z); +//  real d=distance3(camera.p,final); +  p2.y=global.zoom * (delta_y * MAGIC(delta_z) - delta_y); +  p2.x=global.zoom * (delta_x * MAGIC(delta_z) - delta_x); +  return p2;  }  void draw_c3_shape(c3_s_t s) {//outlined. needs to be filled? //draw minimap shit in here too? probably...    int i; -  cs_s_t ss; -  ss.id=s.id;//it shouldn't disappear and we shouldn't need to make a copy. -  ss.len=s.len; +  c2_s_t s2; +  s2.id=s.id;//it shouldn't disappear and we shouldn't need to make a copy. +  s2.len=s.len; +  c3_group_rot_t *gr=get_group_rotation(s.id);    for(i=0;i<s.len+(s.len==1);i++) { -    ss.p[i]=c3_to_cs(s.p[i]); +    s2.p[i]=c3_to_c2(gr?c3_add(gr->p,rotate_c3_yr(s.p[i],gr->p,d2r(gr->r.y))):s.p[i]);    }    if(gra_global.draw3d == 1) { -    draw_cs_shape(ss); +    draw_c2_shape(s2);    }    if(gra_global.draw3d == 2) {      //set foreground to a gray based on distance @@ -173,20 +196,14 @@ void draw_c3_shape(c3_s_t s) {//outlined. needs to be filled? //draw minimap shi  //    color_based_on_distance();//I don't have the distance in here. :/  //foreground_set();  //how... I want to draw the outline as one color and the fill as another. -    draw_cs_filled_shape(ss); +    draw_c2_filled_shape(s2);      set_color();//resets it to the default color. -    if(!strcmp(global.selected_object,ss.id)) { -      draw_cs_shape(ss); +    if(!strcmp(global.selected_object,s2.id)) { +      draw_c2_shape(s2);      }    }  } -#define MAGIC(x) (1.0l-(1.0l/powl(1.01l,(x)))) //??? might want to have some changables in here - -real magic(real x) { -  return MAGIC(x); -} -  void draw_graph(real (*fun)(real x)) {   c2_t pa;   draw_c2_line((c2_t){LEFT,0},(c2_t){RIGHT,0}); @@ -202,37 +219,18 @@ void draw_graph(real (*fun)(real x)) {   }  } -c2_t c3_to_c2(c3_t p3) { //DO NOT DRAW STUFF IN HERE -  c2_t p2; -//  c3_t tmp1; -//  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.r.y));//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)); -//  final=rotate_c3_zr(tmp2,camera.p,d2r(camera.zr)); -  real delta_x=(camera.p.x - final.x); -  real delta_y=(camera.p.y - final.y); -  real delta_z=(camera.p.z - final.z); -//  real d=distance3(camera.p,final); -  p2.y=camera.zoom * (delta_y * MAGIC(delta_z) - delta_y); -  p2.x=camera.zoom * (delta_x * MAGIC(delta_z) - delta_x); -  return p2; -}  void draw_c3_line(c3_t p1,c3_t p2) {  // if(!between_angles(points_to_angle((c2_t){camera.p.x,camera.p.z},(c2_t){p1.x,p1.z}),0,90) ||  //    !between_angles(points_to_angle((c2_t){camera.p.x,camera.p.z},(c2_t){p2.x,p2.z}),0,90)) return;   if(gra_global.drawminimap == 1) { -  draw_c2_line((c2_t){(camera.p.x-2)*global.mmz,(camera.p.z+2)*global.mmz},(c2_t){(camera.p.x+2)*global.mmz,(camera.p.z-2)*global.mmz}); -  draw_c2_line((c2_t){(camera.p.x+2)*global.mmz,(camera.p.z+2)*global.mmz},(c2_t){(camera.p.x-2)*global.mmz,(camera.p.z-2)*global.mmz}); +  draw_c2_line((c2_t){(global.camera.p.x-2)*global.mmz,(global.camera.p.z+2)*global.mmz},(c2_t){(global.camera.p.x+2)*global.mmz,(global.camera.p.z-2)*global.mmz}); +  draw_c2_line((c2_t){(global.camera.p.x+2)*global.mmz,(global.camera.p.z+2)*global.mmz},(c2_t){(global.camera.p.x-2)*global.mmz,(global.camera.p.z-2)*global.mmz});    draw_c2_line((c2_t){p1.x*global.mmz,p1.z*global.mmz},(c2_t){p2.x*global.mmz,p2.z*global.mmz});   }   if(gra_global.drawminimap == 2) {//map rotates. -  c3_t t1=rotate_c3_yr(p1,camera.p,d2r(camera.r.y)); -  c3_t t2=rotate_c3_yr(p2,camera.p,d2r(camera.r.y)); +  c3_t t1=rotate_c3_yr(p1,global.camera.p,d2r(global.camera.r.y)); +  c3_t t2=rotate_c3_yr(p2,global.camera.p,d2r(global.camera.r.y));    draw_c2_line((c2_t){t1.x*global.mmz,t1.z*global.mmz},(c2_t){t2.x*global.mmz,t2.z*global.mmz});   }   if(gra_global.draw3d != 0) draw_c2_line(c3_to_c2(p1),c3_to_c2(p2)); @@ -251,13 +249,18 @@ real shitdist2(c3_t p1,c3_t p2) {          ((p1.z - p2.z) * (p1.z - p2.z)));  } -real shitdist(struct c3_shape *s,c3_t p) { -// apply rotation then find distance? +real shitdist(struct c3_shape *s,c3_t p) {//this function is a killer. :/   int i;   real total=0;   for(i=0;i< s->len+(s->len==1);i++) { -//  total=total+shitdist2(rotate_c3_yr(s->p[i],(c3_t){0,0,0},d2r(camera.yr)),camera.p); -  total=total+shitdist2(rotate_c3_yr(s->p[i],camera.p,d2r(camera.r.y)),camera.p); +  c3_group_rot_t *gr=get_group_rotation(s->id); +  total=total+shitdist2( +                rotate_c3_yr(//we're rotating the point around the camera... +                  gr? +                    c3_add(gr->p,rotate_c3_yr(s->p[i],gr->p,d2r(gr->r.y)))://after applying the rotation of the group it is in. +                    s->p[i],global.camera.p +                  ,d2r(global.camera.r.y)) +              ,global.camera.p);   }   return (total) / (real)(s->len+(s->len==1));  } @@ -289,14 +292,9 @@ void HatchLines(c2_t p1,c2_t p2,c2_t p3,int density) {  //black out the rest of the triangle first?  //sounds alright to me... -void draw_c2_text(c2_t p,char *text) { - cs_t p2=c2_to_cs(p); - draw_cs_text(p2,text); -} -  void draw_c3_text(c3_t p,char *text) { - cs_t p2=c3_to_cs(p); - draw_cs_text(p2,text); + c2_t p2=c3_to_c2(p); + draw_c2_text(p2,text);  }  /* @@ -342,20 +340,20 @@ void draw_screen() {    char tmp[256];    zsort_t zs[SHAPES];    clear_backbuffer(); -  real oldx=camera.p.x; -  real oldz=camera.p.z; +  real oldx=global.camera.p.x; +  real oldz=global.camera.p.z;    for(i=0;global.shape[i];i++) zs[i].s=global.shape[i]; -  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. +  for(i=0;global.shape[i];i++) zs[i].d=shitdist(zs[i].s,global.camera.p); +  qsort(&zs,i,sizeof(zs[0]),(__compar_fn_t)compar);//sort these zs structs based on d. farthest first.    if(i > 0 && zs[i-1].s) strcpy(global.selected_object,zs[i-1].s->id);    if(gra_global.split_screen > 1) {  //oh... this will need to be a couple more lines -   radians tmprad=d2r((degrees){camera.r.y.d+180}); -   radians tmprad2=d2r((degrees){camera.r.y.d+180}); -   camera.p.z-=(gra_global.split_flip)*((gra_global.split/gra_global.split_screen)*cosl( tmprad.r )); -   camera.p.x-=(gra_global.split_flip)*((gra_global.split/gra_global.split_screen)*sinl( tmprad2.r )); +   radians tmprad=d2r((degrees){global.camera.r.y.d+180}); +   radians tmprad2=d2r((degrees){global.camera.r.y.d+180}); +   global.camera.p.z-=(gra_global.split_flip)*((gra_global.split/gra_global.split_screen)*cosl( tmprad.r )); +   global.camera.p.x-=(gra_global.split_flip)*((gra_global.split/gra_global.split_screen)*sinl( tmprad2.r ));    }    for(cn=0;cn<gra_global.split_screen;cn++) {      set_color();//restart each draw with the default color. @@ -386,15 +384,17 @@ void draw_screen() {       gra_global.fps=0;      }      //XSetForeground(global.dpy, global.backgc, global.green.pixel); -    if(global.debug) { +    if(global.debug) {//the way I have text done won't scale... +/*      draw_c2_text((cs_t){0,0},global.user);        snprintf(tmp,sizeof(tmp)-1,"debug: %s minimap: %d 3d: %d fps: %d shapes: %d",global.debug?"on":"off",gra_global.drawminimap,gra_global.draw3d,gra_global.oldfps,global.shapes); -      draw_cs_text((cs_t){gra_global.xoff,(gra_global.height/2)+10},tmp); +      draw_c2_text((cs_t){gra_global.xoff,(gra_global.height/2)+10},tmp);        snprintf(tmp,sizeof(tmp)-1,"x: %d y: %d",gra_global.mousex,gra_global.mousey); -      draw_cs_text((cs_t){gra_global.xoff,(gra_global.height/2)+20},tmp); -      snprintf(tmp,sizeof(tmp)-1,"cx: %Lf cy: %Lf cz: %Lf",camera.p.x,camera.p.y,camera.p.z); -      draw_cs_text((cs_t){gra_global.xoff,(gra_global.height/2)+30},tmp); -      snprintf(tmp,sizeof(tmp)-1,"xr: %d yr: %d zr: %d",camera.r.x.d,camera.r.y.d,camera.r.z.d); -      draw_cs_text((cs_t){gra_global.xoff,(gra_global.height/2)+40},tmp); +      draw_c2_text((cs_t){gra_global.xoff,(gra_global.height/2)+20},tmp); +      snprintf(tmp,sizeof(tmp)-1,"cx: %Lf cy: %Lf cz: %Lf",global.camera.p.x,global.camera.p.y,global.camera.p.z); +      draw_c2_text((cs_t){gra_global.xoff,(gra_global.height/2)+30},tmp); +      snprintf(tmp,sizeof(tmp)-1,"xr: %d yr: %d zr: %d",global.camera.r.x.d,global.camera.r.y.d,global.camera.r.z.d); +      draw_c2_text((cs_t){gra_global.xoff,(gra_global.height/2)+40},tmp); +*/      }  //  if(global.drawminimap) {//this isn't even useful I guess. @@ -407,16 +407,19 @@ void draw_screen() {  //   draw_c2_line((c2_t){10,10},(c2_t){-10,10});  //  } -   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. +    for(i=0;global.shape[i];i++) { +     zs[i].d=shitdist(zs[i].s,global.camera.p); +    } +    qsort(&zs,i,sizeof(zs[0]),(__compar_fn_t)compar);//sort these zs structs based on d.     //draw all triangles -   if(global.debug) { -    snprintf(tmp,sizeof(tmp)-1,"selected object: %s",global.selected_object); -    draw_cs_text((cs_t){gra_global.xoff,(gra_global.height/2)+50},tmp); -   } -   for(i=0;global.shape[i];i++) { +    if(global.debug) { +     snprintf(tmp,sizeof(tmp)-1,"selected object: %s",global.selected_object); +     draw_c2_text((c2_t){gra_global.xoff,(gra_global.height/2)+50},tmp); +    } +   //i already equals the length of the array. +   i-=gra_global.maxshapes; +   if(i<0) i=0; +   for(;global.shape[i];i++) {      //now we pick the color of this triangle!      if(gra_global.red_and_blue) {       if(cn%2==0) { @@ -439,12 +442,11 @@ void draw_screen() {      //}     }  //   XSetForeground(global.dpy, global.backgc, global.green.pixel); -   radians tmprad=d2r((degrees){camera.r.y.d+180}); -   radians tmprad2=d2r((degrees){camera.r.y.d+180}); -   camera.p.z+=(gra_global.split_flip)*(gra_global.split*cosl( tmprad.r )); -   camera.p.x+=(gra_global.split_flip)*(gra_global.split*sinl( tmprad2.r )); +   radians tmprad=d2r((degrees){global.camera.r.y.d+180}); +   radians tmprad2=d2r((degrees){global.camera.r.y.d+180}); +   global.camera.p.z+=(gra_global.split_flip)*(gra_global.split*cosl( tmprad.r )); +   global.camera.p.x+=(gra_global.split_flip)*(gra_global.split*sinl( tmprad2.r ));    } -  //TODO: figure out what all this shit is and either update or remove.  //DONT USE WIDTH for shit.  /* @@ -474,7 +476,40 @@ void draw_screen() {    y2=nextY(x1,y1,d2r(camera.yr-90),c);    XDrawLine(global.dpy,w,gc,x1,y1,x2,y2);  */ -  camera.p.x = oldx; -  camera.p.z = oldz; //-= cn*CAMERA_SEPARATION; +  global.camera.p.x = oldx; +  global.camera.p.z = oldz; //-= cn*CAMERA_SEPARATION;    flipscreen();  } + +int graphics_init() { + + global.zoom=30.0l; + global.camera.r.x.d=270; + global.camera.r.y.d=90; + global.camera.r.z.d=0; + global.mmz=1; + global.camera.p.x=0; + global.camera.p.z=-6; + global.camera.p.y=5; + + gra_global.split_screen=SPLIT_SCREEN; + gra_global.split_flip=-1; + gra_global.split=CAMERA_SEPARATION; + gra_global.maxshapes=MAXSHAPES; + gra_global.red_and_blue=RED_AND_BLUE; + gra_global.greyscale=1; + gra_global.zsort=1; + if(gra_global.red_and_blue) { +  gra_global.width=WIDTH; + } else { +  gra_global.width=WIDTH*gra_global.split_screen; + } + gra_global.height=HEIGHT; + gra_global.mapxoff=gra_global.width/2; + gra_global.mapyoff=gra_global.height/2; + gra_global.drawminimap=DEFAULT_MINIMAP; + gra_global.draw3d=1; + gra_global.force_redraw=FORCE_REDRAW; + graphics_sub_init(); + return 0;//we're fine +} diff --git a/src/graphics.h b/src/graphics_c3.h index eadaa54..b6e1a5a 100644 --- a/src/graphics.h +++ b/src/graphics_c3.h @@ -29,6 +29,7 @@ struct gra_global {    int rmousex;    int rmousey;    int buttonpressed; +  int maxshapes;  };  typedef struct { @@ -37,6 +38,7 @@ typedef struct {  } zsort_t;  int graphics_init(); +int graphics_sub_init();  int graphics_event_handler();  void draw_screen();  void set_aspect_ratio(); diff --git a/src/graphics_backend.h b/src/graphics_cs.h index 1f88ec6..b5e02fb 100644 --- a/src/graphics_backend.h +++ b/src/graphics_cs.h @@ -1,5 +1,7 @@ -#ifndef _HACKVR_GRAPHICS_BACKEND_H_ -#define _HACKVR_GRAPHICS_BACKEND_H_ +#ifndef _HACKVR_GRAPHICS_CS_H_ +#define _HACKVR_GRAPHICS_CS_H_ + +#include "math.h"  //these are just the functions that all backends need to implement to work with hackvr.  //the list of functions are subject to change. @@ -15,7 +17,7 @@ void set_color();  void set_color_red();  void set_color_blue();  void clear_backbuffer(); -int keypress_handler(int sym); +void keypress_handler(unsigned char sym,int x,int y);  int graphics_init();  int graphics_event_handler();  void set_clipping_rectangle(int x,int y,int width,int height); diff --git a/src/graphics_cs_opengl.c b/src/graphics_cs_opengl.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/graphics_cs_opengl.c diff --git a/src/graphics_x11.c b/src/graphics_cs_x11.c index 31a78e4..ab80368 100644 --- a/src/graphics_x11.c +++ b/src/graphics_cs_x11.c @@ -18,9 +18,9 @@  #include "config.h"  #include "common.h" -#include "graphics.h" +#include "graphics_c3.h"//not needed?  #include "graphics_x11.h" -#include "graphics_backend.h" +#include "graphics_cs.h"  //typedef float real; //think this conflicts? @@ -135,7 +135,7 @@ void red_and_blue_magic() {  }  //void draw_sky() { -//  XCopyArea(x11_global.dpy,skypixmap,x11_global.backbuffer,x11_global.backgc,((camera.yr.d*5)+SKYW)%SKYW,0,WIDTH,gra_global.height/2,0,0); +//  XCopyArea(x11_global.dpy,skypixmap,x11_global.backbuffer,x11_global.backgc,((global.camera.yr.d*5)+SKYW)%SKYW,0,WIDTH,gra_global.height/2,0,0);  //}  void set_color() { @@ -164,7 +164,7 @@ void set_aspect_ratio() {   XSetWMNormalHints(x11_global.dpy,x11_global.w,hints);  } -int keypress_handler(int sym) { +void x11_keypress_handler(int sym,int x,int y) {    char line[1024];    radians tmprad;    radians tmprad2; @@ -177,78 +177,68 @@ int keypress_handler(int sym) {      selfcommand(line);      break;     case XK_Up: -    tmprad=d2r((degrees){camera.r.y.d+90}); -    tmprad2=d2r((degrees){camera.r.y.d+90}); +    tmprad=d2r((degrees){global.camera.r.y.d+90}); +    tmprad2=d2r((degrees){global.camera.r.y.d+90});      tmpx=WALK_SPEED*sinl(tmprad.r);      tmpz=WALK_SPEED*cosl(tmprad2.r); -    camera.p.x+=tmpx; -    camera.p.z+=tmpz; -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,tmpx,tmpz); +    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,-tmpx,tmpz);      selfcommand(line);      break;     case XK_Down: -    tmprad=d2r((degrees){camera.r.y.d+270}); -    tmprad2=d2r((degrees){camera.r.y.d+270}); +    tmprad=d2r((degrees){global.camera.r.y.d+270}); +    tmprad2=d2r((degrees){global.camera.r.y.d+270});      tmpx=WALK_SPEED*sinl(tmprad.r);      tmpz=WALK_SPEED*cosl(tmprad2.r); -    camera.p.x+=tmpx; -    camera.p.z+=tmpz; -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,tmpx,tmpz); +    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,-tmpx,tmpz);      selfcommand(line);      break;     case XK_Left: -    tmprad=d2r(camera.r.y); -    tmprad2=d2r(camera.r.y); +    tmprad=d2r(global.camera.r.y); +    tmprad2=d2r(global.camera.r.y);      tmpx=WALK_SPEED*sinl(tmprad.r);      tmpz=WALK_SPEED*cosl(tmprad2.r); -    camera.p.x+=tmpx; -    camera.p.z+=tmpz; -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,tmpx,tmpz); +    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,-tmpx,tmpz);      selfcommand(line);      break;     case XK_Right: -    tmprad=d2r((degrees){camera.r.y.d+180}); -    tmprad2=d2r((degrees){camera.r.y.d+180}); +    tmprad=d2r((degrees){global.camera.r.y.d+180}); +    tmprad2=d2r((degrees){global.camera.r.y.d+180});      tmpx=WALK_SPEED*sinl(tmprad.r);      tmpz=WALK_SPEED*cosl(tmprad2.r); -    camera.p.x+=tmpx; -    camera.p.z+=tmpz; -    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,tmpx,tmpz); +    snprintf(line,sizeof(line)-1,"%s move %Lf 0 %Lf 0 0 0 0 0 0\n",global.user,-tmpx,tmpz);      selfcommand(line);      break;     case XK_w: -    camera.p.y+=1;      snprintf(line,sizeof(line)-1,"%s move 0 1 0 0 0 0 0 0 0\n",global.user);      selfcommand(line);      break;     case XK_s: -    camera.p.y-=1;      snprintf(line,sizeof(line)-1,"%s move 0 -1 0 0 0 0 0 0 0\n",global.user);      selfcommand(line);      break;     case XK_r: -    camera.r.x.d+=5; -    while(camera.r.x.d > 360) camera.r.x.d-=360; +    snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d+5); +    selfcommand(line);      break;     case XK_y: -    camera.r.x.d-=5; -    while(camera.r.x.d < 0) camera.r.x.d+=360; +    snprintf(line,sizeof(line)-1,"%s rotate %d 0 0\n",global.user,global.camera.r.x.d-5); +    selfcommand(line);      break;     case XK_q: -    camera.r.y.d+=5; -    while(camera.r.y.d > 360) camera.r.y.d-=360; +    snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d+5); +    selfcommand(line);      break;     case XK_e: -    camera.r.y.d-=5; -    while(camera.r.y.d < 0) camera.r.y.d+=360; +    snprintf(line,sizeof(line)-1,"%s rotate 0 %d 0\n",global.user,global.camera.r.y.d-5); +    selfcommand(line);      break;     case XK_u: -    camera.r.z.d+=5; -    while(camera.r.z.d > 360) camera.r.z.d-=360; +    snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d+5); +    selfcommand(line);      break;     case XK_o: -    camera.r.z.d-=5; -    while(camera.r.z.d < 0) camera.r.z.d+=360; +    snprintf(line,sizeof(line)-1,"%s rotate 0 0 %d\n",global.user,global.camera.r.z.d-5); +    selfcommand(line);      break;     case XK_p:      gra_global.split+=.1; @@ -256,12 +246,14 @@ int keypress_handler(int sym) {     case XK_l:      gra_global.split-=.1;      break; -   case XK_z: camera.zoom+=1; break; -   case XK_x: camera.zoom-=1; break; +   case XK_z: global.zoom+=1; break; +   case XK_x: global.zoom-=1; break;     case XK_c: global.mmz*=1.1; break;     case XK_v: global.mmz/=1.1; break;     case XK_h: global.split+=1; break;     case XK_j: global.split-=1; break; +   case XK_6: gra_global.maxshapes+=10; break; +   case XK_7: gra_global.maxshapes-=10; break;     case XK_d:      global.debug ^= 1;      break; @@ -280,16 +272,14 @@ int keypress_handler(int sym) {      gra_global.draw3d %= 4;      break;     case XK_Escape: -    return -1; +    exit(0);     default: -    return 0;      break;   } - return 1;  }  #endif -int graphics_init() { +int graphics_sub_init() {   int i;   char tmp[64];   Cursor cursor; @@ -310,11 +300,7 @@ int graphics_init() {   }   printf("# done.\n");   assert(x11_global.dpy); - gra_global.split_screen=SPLIT_SCREEN; - gra_global.split_flip=-1; - gra_global.split=CAMERA_SEPARATION;   x11_global.root_window=0; - gra_global.red_and_blue=RED_AND_BLUE;   //global.colors[0]=BlackPixel(x11_global.dpy,DefaultScreen(x11_global.dpy));  // int whiteColor = //WhitePixel(x11_global.dpy, DefaultScreen(x11_global.dpy));   attributes.background_pixel=x11_global.colors[0].pixel; @@ -328,18 +314,11 @@ int graphics_init() {   }   XMapWindow(x11_global.dpy,x11_global.w);   XStoreName(x11_global.dpy,x11_global.w,"hackvr"); - gra_global.greyscale=1; - gra_global.zsort=1;   global.shape[0]=0;//we'll allocate as we need more. + global.camera.id=global.user; + global.group_rot[0]=&global.camera; + global.group_rot[1]=0;   x11_global.gc=XCreateGC(x11_global.dpy,x11_global.w, 0, 0); - - if(gra_global.red_and_blue) { -  gra_global.width=WIDTH; - } else { -  gra_global.width=WIDTH*gra_global.split_screen; - } - gra_global.height=HEIGHT; -   x11_global.backbuffer=XCreatePixmap(x11_global.dpy,x11_global.w,gra_global.width,gra_global.height,DefaultDepth(x11_global.dpy,DefaultScreen(x11_global.dpy)));   x11_global.cleanbackbuffer=XCreatePixmap(x11_global.dpy,x11_global.w,gra_global.width,gra_global.height,DefaultDepth(x11_global.dpy,DefaultScreen(x11_global.dpy))); @@ -380,22 +359,8 @@ int graphics_init() {   }   printf("done.\n");  */ - gra_global.mapxoff=gra_global.width/2; - gra_global.mapyoff=gra_global.height/2; - gra_global.drawminimap=DEFAULT_MINIMAP; - gra_global.draw3d=1; - gra_global.force_redraw=FORCE_REDRAW;//use this for checking proper fps I guess. -//this should be in graphics.c ? - camera.zoom=30.0l; - camera.r.x.d=270; - camera.r.y.d=90; - camera.r.z.d=0; - global.mmz=1; - camera.p.x=0; - camera.p.z=-6; - camera.p.y=5; - return 0; + return 0;//we're fine  }  int graphics_event_handler() { @@ -447,10 +412,7 @@ int graphics_event_handler() {      case KeyPress:        if(global.debug >= 2) printf("# KeyPress\n");        redraw=1; -      if(keypress_handler(XLookupKeysym(&e.xkey,0)) == -1) { -       printf("# exiting\n"); -       return -1; -      } +      x11_keypress_handler(XLookupKeysym(&e.xkey,0),gra_global.mousex,gra_global.mousey);        break;      default:  //      printf("# received unknown event with type: %d\n",e.type); diff --git a/src/graphics_opengl.c b/src/graphics_opengl.c deleted file mode 100644 index 5d2e600..0000000 --- a/src/graphics_opengl.c +++ /dev/null @@ -1,151 +0,0 @@ -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <GL/glut.h> -#include <GL/freeglut_ext.h> - -#include "common.h" - -GLenum doubleBuffer; -GLubyte ubImage[65536]; - -void set_aspect_ratio(int w,int h) { -  glViewport(0,0,w,h); -  glMatrixMode(GL_PROJECTION); -  glLoadIdentity(); -  glOrtho(0,w,0,h,-1,1); -//  glScalef(1,-1,1); -//  glTranslatef(0,-h,0); -} - -void set_color_based_on_distance(real d) { - //scale this color based on distance... closer is lighter. -// float g; -// g=d/100.0 - glColor3f(0.0, 1.0, 0.0); -} - -void set_clipping_rectangle(int x,int y,int w,int h) { - -} - -void draw_cs_line(cs_t p1,cs_t p2) { - glBegin(GL_LINES); - glColor3f(0.0, 1.0, 0.0); - glVertex2i(p1.x,p1.y); - glVertex2i(p2.x,p2.y); - glEnd(); -} - -void draw_cs_text() { -  -} - -void draw_cs_shape(cs_s_t s) { -  int i; -  for(i=0;i<s.len+(s.len==1);i++) {//this shape is closed! -    draw_cs_line(s.p[i],s.p[(i+1)%(s.len+(s.len==1))]); -  } -/*  glBegin(GL_LINE_STRIP); -  glColor3f(0.0, 1.0, 0.0); -  for(i=0;i<s.len+(s.len==1);i++) { -    glVertex2i(s.p[i].x,s.p[i].y); -  } -  glEnd(); -*/ -} - -void draw_cs_filled_shape(cs_s_t s) { -  draw_cs_shape(s); -//  glBegin(GL_POLYGON); -//  glVertex2s(); -//  glEnd(); -} - -void set_color() { - glColor3f(0.0, 1.0, 0.0); -} - -void set_color_red() { - glColor3f(1.0, 0.0, 0.0); -} - -void set_color_blue() { - glColor3f(0.0, 0.0, 1.0); -} - -void clear_backbuffer() { -  glClearColor(0.0, 0.0, 0.0, 1.0); -  glClear(GL_COLOR_BUFFER_BIT); -} - -void flipscreen() { -//  glutSwapBuffers(); -  glFlush(); -} - -void red_and_blue_magic() { - -} - -void keypress_handler(unsigned char key, int x, int y) { -  switch (key) { -  case 27: -    exit(0); -  } -} - -/* draw_screen is in graphics.c -void draw_screen(void) -{ - - -}*/ - - -/*void derp_screen() { -  glClear(GL_COLOR_BUFFER_BIT); - -  draw_cs_line((cs_t){0,10},(cs_t){200,210}); - -// clear_backbuffer(); -// set_color(); - flipscreen(); -}*/ - -void graphics_init(void) -{ -//  GLenum type; - -//  type = GLUT_RGB; -//  type |= GLUT_DOUBLE; -  int argc=0; -  char *argv[]={"derp",0}; -  glutInit(&argc,argv); -//  glutInitDisplayMode(type); -  glutCreateWindow("hackvr opengl and glut testing"); - -  glMatrixMode(GL_PROJECTION); -  glLoadIdentity(); -  gluPerspective(60.0, 1.0, 0.1, 1000.0); -  glMatrixMode(GL_MODELVIEW); -  glDisable(GL_DITHER); - -  glutKeyboardFunc(keypress_handler); -//  glutDisplayFunc(derp_screen); -  glutReshapeFunc(set_aspect_ratio); -} - - -void graphics_event_handler() { -  glutMainLoopEvent(); -} - -/* -void main(int argc,char *argv[]) { -  graphics_init(); -  while(1) { -    graphics_event_handler(); -  } -} -*/ diff --git a/src/hackvr.c b/src/hackvr.c index 6828f59..c8e3899 100644 --- a/src/hackvr.c +++ b/src/hackvr.c @@ -16,7 +16,7 @@  #include "common.h"  #include "math.h"  #ifdef GRAPHICAL -#include "graphics.h" +#include "graphics_c3.h"  extern struct gra_global gra_global;  #endif @@ -210,13 +210,13 @@ int load_stdin() {     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.r.x %d\n",global.user,camera.r.x.d); -   printf("%s set camera.r.y %d\n",global.user,camera.r.y.d); -   printf("%s set camera.r.z %d\n",global.user,camera.r.z.d); -   printf("%s set camera.zoom %Lf\n",global.user,camera.zoom); +   printf("%s set global.camera.p.x %Lf\n",global.user,global.camera.p.x); +   printf("%s set global.camera.p.y %Lf\n",global.user,global.camera.p.y); +   printf("%s set global.camera.p.z %Lf\n",global.user,global.camera.p.z); +   printf("%s set global.camera.r.x %d\n",global.user,global.camera.r.x.d); +   printf("%s set global.camera.r.y %d\n",global.user,global.camera.r.y.d); +   printf("%s set global.camera.r.z %d\n",global.user,global.camera.r.z.d); +   printf("%s set global.zoom %Lf\n",global.user,global.zoom);     continue;    }    if(!strcmp(command,"quit")) { @@ -227,13 +227,13 @@ int load_stdin() {     if(len == 4) {      if(0);  #ifdef GRAPHICAL -    else 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.r.x")) camera.r.x.d=atoi(a[3]); -    else if(!strcmp(a[2],"camera.r.y")) camera.r.y.d=atoi(a[3]); -    else if(!strcmp(a[2],"camera.r.z")) camera.r.z.d=atoi(a[3]); +    else if(!strcmp(a[2],"camera.p.x")) global.camera.p.x=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.p.y")) global.camera.p.y=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.p.z")) global.camera.p.z=strtold(a[3],0); +    else if(!strcmp(a[2],"global.zoom")) global.zoom=strtold(a[3],0); +    else if(!strcmp(a[2],"camera.r.x")) global.camera.r.x.d=atoi(a[3]); +    else if(!strcmp(a[2],"camera.r.y")) global.camera.r.y.d=atoi(a[3]); +    else if(!strcmp(a[2],"camera.r.z")) global.camera.r.z.d=atoi(a[3]);  #endif      else printf("# unknown variable: %s\n",a[2]);      continue; @@ -246,12 +246,13 @@ int load_stdin() {     printf("# %s toggled!\n",a[2]);     continue;    } -  if(!strcmp(command,"addshape")) { +  if(!strcmp(command,"addshape")) {//need to add a grouprot with this.     if(len > 3) {      if(len != ((strtold(a[2],0)+(strtold(a[2],0)==1))*3)+3) {       printf("# ERROR: wrong amount of parts for addshape. got: %d expected %d\n",len,((int)strtold(a[2],0)+(strtold(a[2],0)==1))*3+3);       continue;      } +    for(i=0;global.shape[i];i++);//just take me to the end.      global.shape[i]=malloc(sizeof(struct c3_shape));      global.shape[i]->len=strtold(a[2],0);      global.shape[i]->id=strdup(id); @@ -263,6 +264,23 @@ int load_stdin() {      i++;      global.shapes=i;      global.shape[i]=0; + +    for(i=0;global.group_rot[i];i++) { +     if(!strcmp(global.group_rot[i]->id,id)) { +      break; +     } +    } +    if(global.group_rot[i] == 0) {//we have ourselves a new grouprot! +     global.group_rot[i]=malloc(sizeof(c3_group_rot_t)); +     global.group_rot[i]->id=strdup(id); +     global.group_rot[i+1]=0; +     global.group_rot[i]->p.x=0; +     global.group_rot[i]->p.y=0; +     global.group_rot[i]->p.z=0; +     global.group_rot[i]->r.x=(degrees){0}; +     global.group_rot[i]->r.y=(degrees){0}; +     global.group_rot[i]->r.z=(degrees){0}; +    }     }     continue;    } @@ -293,37 +311,50 @@ int load_stdin() {     }     continue;    } -  if(!strcmp(command,"rotate")) {//this probably won't be needed with the new rotation structs per group. +  if(!strcmp(command,"rotate")) {     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+(global.shape[i]->len==1);j++) { -       radians tmprad=points_to_angle((c2_t){global.shape[i]->p[j].x,global.shape[i]->p[j].z},(c2_t){0,0}); -       radians tmprad2=d2r((degrees){atoi(a[2])}); -       global.shape[i]->p[j]=rotate_c3_yr(global.shape[i]->p[j],(c3_t){0,0,0},(radians){tmprad.r+tmprad2.r}); -       //global.shape[i]->p[j]=rotate_c3_yr(global.shape[i]->p[j],(c3_t){0,0,0},d2r(atoi(a[3]))); -       //global.shape[i]->p[j]=rotate_c3_zr(global.shape[i]->p[j],(c3_t){0,0,0},d2r(atoi(a[4]))); -      } +    for(i=0;global.group_rot[i];i++) { +     if(!strcmp(global.group_rot[i]->id,id)) { +      break;       }      } +    if(global.group_rot[i] == 0) {//we have ourselves a new grouprot! +     global.group_rot[i]=malloc(sizeof(c3_group_rot_t)); +     global.group_rot[i]->id=strdup(id); +     global.group_rot[i+1]=0; +     global.group_rot[i]->p.x=0;//only set these if new. +     global.group_rot[i]->p.y=0; +     global.group_rot[i]->p.z=0; +    } +    global.group_rot[i]->r.x=(degrees){atoi(a[2])}; +    global.group_rot[i]->r.y=(degrees){atoi(a[3])}; +    global.group_rot[i]->r.z=(degrees){atoi(a[4])};     } +   continue;    }    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+(global.shape[i]->len==1);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); -      } +    for(i=0;global.group_rot[i];i++) { +     if(!strcmp(global.group_rot[i]->id,id)) { +      break;       }      } +    if(global.group_rot[i] == 0) {//we have ourselves a new grouprot! +     global.group_rot[i]=malloc(sizeof(c3_group_rot_t)); +     global.group_rot[i]->id=strdup(id); +     global.group_rot[i+1]=0; +     global.group_rot[i]->r.x=(degrees){0};//only set these if new. +     global.group_rot[i]->r.y=(degrees){0}; +     global.group_rot[i]->r.z=(degrees){0}; +    } +    global.group_rot[i]->p.x+=strtold(a[2],0); +    global.group_rot[i]->p.y+=strtold(a[3],0); +    global.group_rot[i]->p.z+=strtold(a[4],0);     }     else {      printf("# ERROR: wrong amount of parts for move. got: %d expected: 11\n",len);     } -   continue;//??? +   continue;    }    printf("# I don't know what command you're talking about. %s\n",command);    free(line); @@ -363,9 +394,10 @@ int main(int argc,char *argv[]) {      if((redraw=graphics_event_handler()) == -1) {       return 0;      } -    if((redraw || gra_global.force_redraw) && !global.headless) { -     draw_screen(); -    } +//    printf("redraw=%d gra_global.force_redraw=%d global.headless=%d\n",redraw,gra_global.force_redraw,global.headless); +    //if((redraw || gra_global.force_redraw) && !global.headless) { +    // draw_screen(); +    //}  #endif      switch(load_stdin()) {       case -1: @@ -1,6 +1,19 @@ +#include <string.h> +#include "common.h"  #include "math.h" -//should these use the radians struct? +extern struct global global; + +//might change this to use hashtables for faster lookups. +c3_group_rot_t *get_group_rotation(char *id) { +  int i; +  for(i=0;global.group_rot[i];i++) { +    if(!strcmp(global.group_rot[i]->id,id)) { +      return global.group_rot[i]; +    } +  } +  return 0;//need to be sure to check return value for this function! +}  c3_t rotate_c3_xr(c3_t p1,c3_t p2,radians xr) {//rotate y and z around camera based on xr (looking up and down)    c2_t tmp; @@ -12,6 +12,7 @@ c2_t rotate_c2(c2_t p1,c2_t p2,radians dr);  c3_t rotate_c3_xr(c3_t p1,c3_t p2,radians xr);  c3_t rotate_c3_yr(c3_t p1,c3_t p2,radians yr);  c3_t rotate_c3_zr(c3_t p1,c3_t p2,radians zr); +c3_group_rot_t *get_group_rotation(char *id);  radians d2r(degrees d);  radians points_to_angle(c2_t p1,c2_t p2); diff --git a/src/testit.sh b/src/testit.sh index 86aca19..ceb7698 100755 --- a/src/testit.sh +++ b/src/testit.sh @@ -3,5 +3,5 @@ cat <(sort -R ../meshes/female_basemesh1_2.hackvr) \   <(echo "woman move 10 0 -50") \   <(sort -R ../meshes/female_basemesh1_2.hackvr | sed 's/woman/woman2/g') \   <(echo "woman2 move -10 0 -200") \ - <(sort -R ../meshes/female_basemesh1_2.hackvr | sed 's/woman/woamn3/g') | ./slowcat 10000 | ./hackvr $USER -#../tools/obj2hackvr.pl woman ../meshes/female_basemesh1_2.obj | ./hackvr epoch + <(sort -R ../meshes/female_basemesh1_2.hackvr | sed 's/woman/woamn3/g') | ./slowcat 10000 | ./hackvr_opengl $USER +#../tools/obj2hackvr.pl woman ../meshes/female_basemesh1_2.obj | ./hackvr_opengl epoch  | 
