diff options
-rw-r--r-- | src/config.h | 2 | ||||
-rw-r--r-- | src/graphics_c3.c | 20 | ||||
-rw-r--r-- | src/hackvr.c | 144 | ||||
-rw-r--r-- | src/math.c | 15 |
4 files changed, 111 insertions, 70 deletions
diff --git a/src/config.h b/src/config.h index 8017254..4df7467 100644 --- a/src/config.h +++ b/src/config.h @@ -15,7 +15,7 @@ #define SHAPES 65535 #define PERIODIC_OUTPUT 100 -#define MAX_SIDES 8 +#define MAX_SIDES 20 #define MAXWIDTH 4000 #define WIDTH 1024 #define MAXHEIGHT 3000 diff --git a/src/graphics_c3.c b/src/graphics_c3.c index 9db6657..5f89c34 100644 --- a/src/graphics_c3.c +++ b/src/graphics_c3.c @@ -192,6 +192,10 @@ void draw_minimap_line(c3_t p1,c3_t p2) { } */ +void draw_c3_line(c3_group_rot_t eye,c3_t p1, c3_t p2) { + draw_c2_line(c3_to_c2(eye,p1),c3_to_c2(eye,p2)); +} + void draw_c3_shape(c3_group_rot_t eye,c3_s_t s) {//outlined. needs to be filled? //draw minimap shit in here too? probably... int i; char drawthefucker=0;//I don't wanna! @@ -478,18 +482,32 @@ void draw_screen() { draw_c2_line((c2_t){0,0},rotate_c2((c2_t){-40,0},(c2_t){0,0},d2r((degrees){360-global.eye[en].r.y.d}))); set_color_blue(); draw_c2_line((c2_t){0,0},rotate_c2((c2_t){40,0},(c2_t){0,0},d2r(global.eye[en].r.z))); + + c3_t mouse_v3 = (c3_t){gra_global.mouse.x,gra_global.mouse.y,0};//dunno about the 'z' for mouse. + set_color_red(); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){ 1,0,0}),c3_add(mouse_v3,(c3_t){ 5,0,0})); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){-1,0,0}),c3_add(mouse_v3,(c3_t){-5,0,0})); + set_color(); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){0, 1,0}),c3_add(mouse_v3,(c3_t){0, 5,0})); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){0,-1,0}),c3_add(mouse_v3,(c3_t){0,-5,0})); + set_color_blue(); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){0,0, 1}),c3_add(mouse_v3,(c3_t){0,0, 5})); + draw_c3_line(global.eye[en],c3_add(mouse_v3,(c3_t){0,0,-1}),c3_add(mouse_v3,(c3_t){0,0,-5})); } //just draw a line from center to 40 away from the center at the angle of the camera's y-rotation //this should be minimap shit //draw a line from the center to 80 away from the center in the angle of what should point at the mouse. //draw_c2_line((c2_t){0,0},gra_global.mouse); + + //software mouse cursor set_color(); draw_c2_line(c2_add(gra_global.mouse,(c2_t){0,1}) , c2_add(gra_global.mouse,(c2_t){0,5}) ); draw_c2_line(c2_add(gra_global.mouse,(c2_t){0,-1}) , c2_add(gra_global.mouse,(c2_t){0,-5}) ); draw_c2_line(c2_add(gra_global.mouse,(c2_t){1,0}) , c2_add(gra_global.mouse,(c2_t){5,0}) ); draw_c2_line(c2_add(gra_global.mouse,(c2_t){-1,0}) , c2_add(gra_global.mouse,(c2_t){-5,0}) ); - set_color(); + + //if(points_on_same_side_of_line(gra_global.mouse,(c2_t){80,80},(c2_t){0,0},(c2_t){0,80})) { //draw_c2_line((c2_t){0,0},rotate_c2((c2_t){80,0},(c2_t){0,0},points_to_angle((c2_t){0,0},gra_global.mouse))); //} diff --git a/src/hackvr.c b/src/hackvr.c index b895f58..cf441ea 100644 --- a/src/hackvr.c +++ b/src/hackvr.c @@ -38,7 +38,7 @@ struct hvr_global global; int lum_based_on_distance(c3_s_t *s) { int i; - real sum; + real sum=0; for(i=0;i < s->len;i++) { sum+=distance2((c2_t){s->p[i].x,s->p[i].z},(c2_t){0,0}); } @@ -154,11 +154,14 @@ int hackvr_handler(char *line) { int ret=0; int len; int j,i,k,l; + int key_count; c3_group_rot_t *gr; real tmpx,tmpy,tmpz; char **a; + char **keys; char tmp[256]; struct entry *m; + struct entry *next; char helping=0;//a flag that we can check for to see if we need to output our help // radians tmpradx,tmprady,tmpradz; radians tmprady; @@ -167,6 +170,8 @@ int hackvr_handler(char *line) { //might use these so make command code easier to read. char *command; //char **args; + + if(!line) return -1;//EOF if(*line == '#') return 0; // fprintf(stderr,"# read command: %s\n",line); @@ -177,31 +182,31 @@ int hackvr_handler(char *line) { // printf("\n"); id=a[0]; if(len > 1) { - command=a[1]; + command=a[1]; } else { - command=a[0];//meh + command=a[0];//meh } if(len < 2) { - if(!strcmp(id,"version")) { - hvr_version(); - return 0; - } - if(!strcmp(id,"help")) { - helping=1; + if(!strcmp(id,"version")) { + hvr_version(); + return 0; + } + if(!strcmp(id,"help")) { + helping=1; #ifdef GRAPHICAL - fprintf(stderr,"# NOT built headless.\n"); + fprintf(stderr,"# NOT built headless.\n"); #else - fprintf(stderr,"# built headless.\n"); + fprintf(stderr,"# built headless.\n"); #endif - fprintf(stderr,"# commands that don't get prepended with groupname: help, version\n"); - fprintf(stderr,"# command format:\n"); - fprintf(stderr,"# group names can be globbed in some cases to operate on multiple groups\n"); - fprintf(stderr,"# some commands that take numbers as arguments can be made to behave relative\n"); - fprintf(stderr,"# by putting + before the number. makes negative relative a bit odd like:\n"); - fprintf(stderr,"# user move +-2 +-2 0\n"); - fprintf(stderr,"# groupnam* command arguments\n"); - fprintf(stderr,"# commands:\n"); - } + fprintf(stderr,"# commands that don't get prepended with groupname: help, version\n"); + fprintf(stderr,"# command format:\n"); + fprintf(stderr,"# group names can be globbed in some cases to operate on multiple groups\n"); + fprintf(stderr,"# some commands that take numbers as arguments can be made to behave relative\n"); + fprintf(stderr,"# by putting + before the number. makes negative relative a bit odd like:\n"); + fprintf(stderr,"# user move +-2 +-2 0\n"); + fprintf(stderr,"# groupnam* command arguments\n"); + fprintf(stderr,"# commands:\n"); + } } ret=1; @@ -209,36 +214,44 @@ int hackvr_handler(char *line) { /* ---------- */ if(helping) fprintf(stderr,"# deleteallexcept grou*\n"); if(!strcmp(command,"deleteallexcept")) { - if(len == 3) { - for(j=0;global.shape[j] && j < MAXSHAPES;j++) {//mark first. compress later. - if(glob_match(a[2],global.shape[j]->id)) { - free(global.shape[j]->id); - free(global.shape[j]); - global.shape[j]=0; - } - } - for(k=0;k<j;k++) { - if(global.shape[k]) continue; - for(l=k;global.shape[l] == 0 && l<j;l++); - global.shape[k]=global.shape[l]; - global.shape[l]=0; - } - ret=1; - //now do the same stuff but for the group_rot structs. - for(i=0;i < global.ht_group.kl;i++) {//for each bucket and item in each bucket... - for(m=global.ht_group.bucket[global.ht_group.keys[i]]->ll;m;m=m->next) { - if(!glob_match(a[2],m->original)) { - if(m->target != &global.camera) { - gr=m->target; - ht_delete(&global.ht_group,gr->id); - free(gr->id); - free(gr);//pretty sure this does NOT get free()d by ht_delete, because the HT can't /know/ its value is a pointer to something malloc()d - } + if(len == 3) { + for(j=0;global.shape[j] && j < MAXSHAPES;j++) {//mark first. compress later. + if(glob_match(a[2],global.shape[j]->id)) { + free(global.shape[j]->id); + free(global.shape[j]); + global.shape[j]=0; + } } - } + for(k=0;k<j;k++) {//compress the shape array around the gaps + if(global.shape[k]) continue; + for(l=k;global.shape[l] == 0 && l<j;l++); + global.shape[k]=global.shape[l]; + global.shape[l]=0; + } + //now do the same stuff but for the group_rot structs. + if(!strchr(a[2],'*')) {//no globs, this is easy... + ht_delete(&global.ht_group,m->original); + } else { + keys=ht_getkeys(&global.ht_group,&key_count); + for(i=0;i<key_count;i++) { + if((m=ht_getentry(&global.ht_group,keys[i]))) { + if(!glob_match(a[2],m->original)) { + if(m->target != &global.camera) { + free(m->target->id); + free(m->target);//ht_delete doesn't know that the target is a malloc()d structure, so we have to do this. + ht_delete(&global.ht_group,m->original); + } + } + } else { + fprintf(stderr,"# somehow an item is in the list of keys but ht_getentry failed. '%s'\n",a[2]); + abort(); + } + } + free(keys); + } + ret=1; + return ret; } - return ret; - } } @@ -261,18 +274,23 @@ int hackvr_handler(char *line) { global.shape[k]=global.shape[l]; global.shape[l]=0; } - //we need to glob match all keys... - for(i=0;i < global.ht_group.kl;i++) {//for each bucket and item in each bucket... - for(m=global.ht_group.bucket[global.ht_group.keys[i]]->ll;m;m=m->next) { - if(!glob_match(a[2],m->original)) { - if(m->target != &global.camera) {//ah! don't delete the camera! - gr=m->target;//this almost CERTAINLY exists... I think. - ht_delete(&global.ht_group,gr->id); - free(gr->id); - free(gr); - } + if(!strchr(a[2],'*') {//don't bother looping over everything if it isn't a glob.. + ht_delete(&global.ht_group,a[2]); + } else { + keys=ht_getkeys(&global.ht_group,&key_count); + for(i=0;i<key_count;i++) { + if((m=ht_getentry(&global.ht_group,keys[i]))) { + if(m->target != &global.camera) { + free(m->target->id); + free(m->target); + ht_delete(&global.ht_group,m->original); + } + } else { + fprintf(stderr,"# somehow an item is in the list of keys but ht_getentry failed. '%s'\n",a[2]); + abort(); + } } - } + free(keys); } ret=1; return ret; @@ -669,8 +687,9 @@ int hackvr_handler(char *line) { tmpx=0; tmpz=0; } - snprintf(tmp,sizeof(tmp)-1,"%s move +%f +%f +%f\n",global.user,tmpx,tmpy,tmpz); - selfcommand(tmp);//selfcommand inside move is ugly. :/ just set it the right way. + gr->p.x+=tmpx; + gr->p.y+=tmpy; + gr->p.z+=tmpz; } else { fprintf(stderr,"# ERROR: wrong amount of parts for move. got: %d expected: 4 or 2\n",len); } @@ -733,6 +752,9 @@ int main(int argc,char *argv[]) { //I could just read } global.user=strdup(getenv("USER"));//this gets free()d later so we need to strdup it. + if(!strcmp(global.user,"help") || !strcmp(global.user,"version")) { + fprintf(stderr,"# /!\\ WARNING /!\\/ a USER of help or version maybe cause problems when piped into another hackvr. right now it is '%s'\n",global.user); + } global.localecho=1; inittable(&global.ht_group,65536); @@ -2,6 +2,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <assert.h> #include "common.h" #include "math.h" @@ -11,20 +12,20 @@ extern struct hvr_global global; //ONE OF THESE DAYS I NEED TO RENAME ALL THE GROUP_ROT SHIT TO GROUP_REL since it doesn't just have rotations anymore. //this function needs to create a group_relative if one doesn't already exist. -c3_group_rot_t *get_group_relative(char *id) {//crashes in here somehwere... +c3_group_rot_t *get_group_relative(char *id) { c3_group_rot_t *gr; - struct entry *tmp; - if((tmp=ht_getnode(&global.ht_group,id))) { - gr=tmp->target;//target is a void * + if((gr=ht_getvalue(&global.ht_group,id))) { if(gr) return gr; } //if we got here, we need to make a new one. - gr=malloc(sizeof(c3_group_rot_t)); + assert(gr=malloc(sizeof(c3_group_rot_t)));//just exit on malloc error? sure... memset(gr,0,sizeof(c3_group_rot_t)); gr->s=(c3_t){1,1,1};//scale needs to be all 1s, since it is multiplied against the coordinates. gr->id=strdup(id);//don't forget to free this when it gets deleted. - ht_setkey(&global.ht_group,gr->id,gr); - return gr;//check only for the case of malloc errors. + if(ht_setkey(&global.ht_group,id,gr)) { + abort(); + } + return gr; } 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) |