summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hackvr.c83
1 files changed, 47 insertions, 36 deletions
diff --git a/src/hackvr.c b/src/hackvr.c
index 5ec27dc..aa5286b 100644
--- a/src/hackvr.c
+++ b/src/hackvr.c
@@ -235,6 +235,7 @@ int hackvr_handler(char *line) {
//now do the same stuff but for the group_rot structs.
for(j=1;global.group_rot[j] && j < MAXSHAPES;j++) {//start at 1 so we skip the camera. fuck it. let's delete camera.
if(glob_match(a[2],global.group_rot[j]->id)) {
+ ht_delete(&global.ht_group,global.group_rot[j]->id);
free(global.group_rot[j]->id);
free(global.group_rot[j]);
global.group_rot[j]=0;
@@ -269,6 +270,7 @@ int hackvr_handler(char *line) {
//now for the group_rot struct that goes with it. there should only be one, but might be a few due to bugs elsewhere. heh. let's just get all of them I guess.
for(j=1;global.group_rot[j] && j < MAXSHAPES;j++) {//start at 1 to skip passed the camera. it isn't malloc()d and will crash if we try to free it.
if(!glob_match(a[2],global.group_rot[j]->id)) {
+ ht_delete(&global.ht_group,global.group_rot[j]->id);
free(global.group_rot[j]->id);
free(global.group_rot[j]);
global.group_rot[j]=0;
@@ -304,7 +306,7 @@ int hackvr_handler(char *line) {
global.shape[j]->id=strdup(a[3]);
}
}
- gr=get_group_relative(a[2]);//this shouldn't be used here.
+ gr=get_group_relative(a[2]);//this shouldn't be used here. why?
if(gr) {
free(gr->id);
gr->id=strdup(a[3]);
@@ -365,7 +367,7 @@ int hackvr_handler(char *line) {
ret=1;
return ret;
}
- if(!strcmp(command,"control")) {//change what shape key commands affect.
+ if(!strcmp(command,"control")) {
if(len > 2) {
free(global.user);//need to ensure this is on the heap
global.user=strdup(a[2]); // :D
@@ -403,6 +405,7 @@ int hackvr_handler(char *line) {
}
if(global.group_rot[i] == 0) {//we have ourselves a new grouprot!
global.group_rot[i]=malloc(sizeof(c3_group_rot_t));
+ ht_setkey(&global.ht_group,id,global.group_rot[i]);//point directly at it...
global.group_rot[i]->id=strdup(id);
global.group_rot[i+1]=0;
global.group_rot[i]->p.x=0;
@@ -437,7 +440,7 @@ int hackvr_handler(char *line) {
return ret;
}
//should scaleup even be inside hackvr? seems like something an external program could do... but it wouldn't act on hackvr's state. so nevermind.
- if(!strcmp(command,"scaleup")) {//should this scale separately so it can be a deform too?
+ if(!strcmp(command,"scale")) {//this doesn't just scale *up*, it can scale down too. also, make the group relative stuff keep scale factors. we can flatten if we want later.
for(i=0;global.shape[i];i++) {
if(!glob_match(id,global.shape[i]->id)) { //we're allowing globbing in this command I guess.
for(j=0;j < global.shape[i]->len+(global.shape[i]->len==1);j++) {
@@ -452,25 +455,25 @@ int hackvr_handler(char *line) {
if(!strcmp(command,"rotate")) {
if(len > 4) {
for(i=0;global.group_rot[i];i++) {
- if(!strcmp(global.group_rot[i]->id,id)) {
- break;
+ if(!glob_match(id,global.group_rot[i]->id)) {
+ if(global.group_rot[i] == 0) {//we have ourselves a new grouprot!
+ global.group_rot[i]=malloc(sizeof(c3_group_rot_t));
+ ht_setkey(&global.ht_group,id,global.group_rot[i]);
+ 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){(a[2][0]=='+'?global.group_rot[i]->r.x.d:0)+atoi(a[2]+(a[2][0]=='+'))};
+ global.group_rot[i]->r.y=(degrees){(a[3][0]=='+'?global.group_rot[i]->r.y.d:0)+atoi(a[3]+(a[3][0]=='+'))};
+ global.group_rot[i]->r.z=(degrees){(a[4][0]=='+'?global.group_rot[i]->r.z.d:0)+atoi(a[4]+(a[4][0]=='+'))};
+ //now to sanitize them into 0 <= degrees < 360
+ global.group_rot[i]->r.x.d -= (-(global.group_rot[i]->r.x.d < 0)+(global.group_rot[i]->r.x.d / 360)) * 360;
+ global.group_rot[i]->r.y.d -= (-(global.group_rot[i]->r.y.d < 0)+(global.group_rot[i]->r.y.d / 360)) * 360;
+ global.group_rot[i]->r.z.d -= (-(global.group_rot[i]->r.z.d < 0)+(global.group_rot[i]->r.z.d / 360)) * 360;
}
}
- 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){(a[2][0]=='+'?global.group_rot[i]->r.x.d:0)+atoi(a[2]+(a[2][0]=='+'))};
- global.group_rot[i]->r.y=(degrees){(a[3][0]=='+'?global.group_rot[i]->r.y.d:0)+atoi(a[3]+(a[3][0]=='+'))};
- global.group_rot[i]->r.z=(degrees){(a[4][0]=='+'?global.group_rot[i]->r.z.d:0)+atoi(a[4]+(a[4][0]=='+'))};
- //now to sanitize them into 0 <= degrees < 360
- global.group_rot[i]->r.x.d -= (-(global.group_rot[i]->r.x.d < 0)+(global.group_rot[i]->r.x.d / 360)) * 360;
- global.group_rot[i]->r.y.d -= (-(global.group_rot[i]->r.y.d < 0)+(global.group_rot[i]->r.y.d / 360)) * 360;
- global.group_rot[i]->r.z.d -= (-(global.group_rot[i]->r.z.d < 0)+(global.group_rot[i]->r.z.d / 360)) * 360;
}
ret=1;
return ret;
@@ -501,23 +504,28 @@ int hackvr_handler(char *line) {
}
}
if(!strcmp(command,"flatten")) {
- if(len > 1) {
- //for each shape, we need to apply_group_relative..
- gr = get_group_relative(id);
- for(i=0;global.shape[i];i++) {
- if(!strcmp(global.shape[i]->id,id)) {
- //this doesn't need to bother with free() or malloc(). it does struct assignment. ;)
- (*global.shape[i])=apply_group_relative((*global.shape[i]),gr);//the old id string gets used in here
+ if(len > 1) {//we need to loop over each group_rot
+ for(i=0;global.group_rot[i];i++) {
+ //this need to be replaced with a "loop over all group_relatives that match a glob"
+ //might also store the hash table as a tree.
+ //descend down tree like this:
+ //tree[id[0]]->c[id[1]]->c[id[2]]
+ //then for each child after we get to the *, we use every one of those.
+ if(!glob_match(id,global.group_rot[i]->id)) {
+ gr=get_group_relative(global.group_rot[i]->id);
+ for(j=0;global.shape[j];j++) {
+ if(!strcmp(global.shape[j]->id,global.group_rot[i]->id)) {
+ (*global.shape[j])=apply_group_relative((*global.shape[j]),0);
+ }
+ }
+ gr->r.x.d=0;
+ gr->r.y.d=0;
+ gr->r.z.d=0;
+ gr->p.x=0;
+ gr->p.y=0;
+ gr->p.z=0;
}
}
- //clean out the gr struct so it won't be applied anymore.
- //might split the rotation and translation into separate commands later.
- gr->r.x.d=0;
- gr->r.y.d=0;
- gr->r.z.d=0;
- gr->p.x=0;
- gr->p.y=0;
- gr->p.z=0;
}
return ret;
}
@@ -530,6 +538,7 @@ int hackvr_handler(char *line) {
}
if(global.group_rot[i] == 0) {//we have ourselves a new grouprot!
global.group_rot[i]=malloc(sizeof(c3_group_rot_t));
+ ht_setkey(&global.ht_group,id,global.group_rot[i]);
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.
@@ -558,7 +567,7 @@ int hackvr_handler(char *line) {
tmpy=WALK_SPEED*1;
} else if(!strcmp(a[2],"down")) {
tmprady=d2r((degrees){global.camera.r.y.d});//doesn't matter. yet.
- tmpy=WALK_SPEED*1;
+ tmpy=-WALK_SPEED*1;
} else if(!strcmp(a[2],"left")) {
tmprady=d2r((degrees){global.camera.r.y.d+270});
//snprintf(tmp,sizeof(tmp)-1,"%s move +%f +0 +%f\n",global.user,tmpx,tmpz);
@@ -630,6 +639,8 @@ int main(int argc,char *argv[]) {
global.user=strdup(getenv("USER"));//this gets free()d later so we need to strdup it.
global.localecho=1;
+ inittable(&global.ht_group,65536);
+
fcntl(1,F_SETFL,O_NONBLOCK);//won't work
setbuf(stdin,0);
setbuf(stdout,0);