X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fhairball.c;h=89c45c348b50f8baec77718316f97aec748f74b8;hp=5140f99d4e02e4331ce29f499d340c00e39040d2;hb=3398fc6c4188104048f99b650a6cb90beda9b6ed;hpb=21bfd2598698721227d6d9d55d9825334dd9e58c diff --git a/src/hairball.c b/src/hairball.c index 5140f99..89c45c3 100644 --- a/src/hairball.c +++ b/src/hairball.c @@ -1,12 +1,14 @@ #include #include #include +#include #include "demo.h" #include "3dgfx.h" #include "vmath.h" #include "screen.h" #include "util.h" #include "cfgopt.h" +#include "mesh.h" #ifdef MSDOS @@ -15,10 +17,11 @@ void wait_vsync(void); #endif -#define NSPAWNPOS 128 +#define NSPAWNPOS 64 #define SPAWN_RATE 16.0f -#define GRAV (-6.0f) -#define HAIR_LENGTH 32 +//#define GRAV (-6.0f) +#define GRAV 0.0f +#define HAIR_LENGTH 20 struct particle { vec3_t pos; @@ -58,9 +61,12 @@ static struct screen scr = { static long start_time; -static vec3_t *spawnpos, *spawndir; +static float cam_theta, cam_phi = 15; +static float cam_dist = 8; +static vec3_t *spawnpos, *spawndir; static struct hairball hball; +static struct g3d_mesh sphmesh; struct screen *hairball_screen(void) { @@ -69,7 +75,9 @@ struct screen *hairball_screen(void) static int init(void) { - int i; + int i, j, numpt = 0; + + gen_sphere_mesh(&sphmesh, 1.0f, 12, 6); hball.xform[0] = hball.xform[5] = hball.xform[10] = hball.xform[15] = 1.0f; hball.rot.w = 1.0f; @@ -80,8 +88,30 @@ static int init(void) return -1; } - for(i=0; i best_dist) { + spawnpos[numpt] = pos; + best_dist = mindist; + } + } + + spawndir[numpt] = spawnpos[numpt]; + ++numpt; } return 0; @@ -114,19 +144,28 @@ static void update(void) prev_mx = mouse_x; prev_my = mouse_y; - if(mouse_bmask) { - hball.pos.x += mouse_dx * 0.05; - hball.pos.y -= mouse_dy * 0.05; - } - //hball.rot = quat_rotate(hball.rot, dt * 2.0f, 0, 1, 0); + if(opt.sball) { + memcpy(hball.xform, sball_matrix, 16 * sizeof(float)); + + hball.pos.x = hball.xform[12]; + hball.pos.y = hball.xform[13]; + hball.pos.z = hball.xform[14]; + } else { + if(mouse_bmask & MOUSE_BN_MIDDLE) { + hball.pos.x += mouse_dx * 0.05; + hball.pos.y -= mouse_dy * 0.05; + } - quat_to_mat(hball.xform, hball.rot); - hball.xform[12] = hball.pos.x; - hball.xform[13] = hball.pos.y; - hball.xform[14] = hball.pos.z; + quat_to_mat(hball.xform, hball.rot); + hball.xform[12] = hball.pos.x; + hball.xform[13] = hball.pos.y; + hball.xform[14] = hball.pos.z; + } update_hairball(&hball, dt); + + mouse_orbit_update(&cam_theta, &cam_phi, &cam_dist); } static void draw(void) @@ -140,7 +179,9 @@ static void draw(void) g3d_matrix_mode(G3D_MODELVIEW); g3d_load_identity(); - g3d_translate(0, 0, -8); + g3d_translate(0, 0, -cam_dist); + g3d_rotate(cam_phi, 1, 0, 0); + g3d_rotate(cam_theta, 0, 1, 0); draw_hairball(&hball); @@ -194,12 +235,15 @@ static void update_hairball(struct hairball *hb, float dt) struct particle *p = palloc(); float *mat = hb->xform; vec3_t pos = spawnpos[i]; + vec3_t dir = spawndir[i]; p->pos.x = mat[0] * pos.x + mat[4] * pos.y + mat[8] * pos.z + mat[12]; p->pos.y = mat[1] * pos.x + mat[5] * pos.y + mat[9] * pos.z + mat[13]; p->pos.z = mat[2] * pos.x + mat[6] * pos.y + mat[10] * pos.z + mat[14]; - p->vel = spawndir[i]; + p->vel.x = mat[0] * dir.x + mat[4] * dir.y + mat[8] * dir.z; + p->vel.y = mat[1] * dir.x + mat[5] * dir.y + mat[9] * dir.z; + p->vel.z = mat[2] * dir.x + mat[6] * dir.y + mat[10] * dir.z; p->life = HAIR_LENGTH; p->next = hb->plist[i]; @@ -211,18 +255,44 @@ static void update_hairball(struct hairball *hb, float dt) static void draw_hairball(struct hairball *hb) { - int i, j, col; + int i, col; struct particle *p; vec3_t prevpos; + vec3_t start[NSPAWNPOS]; + + for(i=0; ixform[0] * spawnpos[i].x + hb->xform[4] * spawnpos[i].y + hb->xform[8] * spawnpos[i].z + hb->xform[12]; + start[i].y = hb->xform[1] * spawnpos[i].x + hb->xform[5] * spawnpos[i].y + hb->xform[9] * spawnpos[i].z + hb->xform[13]; + start[i].z = hb->xform[2] * spawnpos[i].x + hb->xform[6] * spawnpos[i].y + hb->xform[10] * spawnpos[i].z + hb->xform[14]; + } g3d_begin(G3D_LINES); for(i=0; i= hb->pos.z) continue; p = hb->plist[i]; - prevpos.x = hb->xform[0] * spawnpos[i].x + hb->xform[4] * spawnpos[i].y + hb->xform[8] * spawnpos[i].z + hb->xform[12]; - prevpos.y = hb->xform[1] * spawnpos[i].x + hb->xform[5] * spawnpos[i].y + hb->xform[9] * spawnpos[i].z + hb->xform[13]; - prevpos.z = hb->xform[2] * spawnpos[i].x + hb->xform[6] * spawnpos[i].y + hb->xform[10] * spawnpos[i].z + hb->xform[14]; + prevpos = start[i]; + while(p) { + g3d_color3b(p->r, p->g, p->b); + g3d_vertex(prevpos.x, prevpos.y, prevpos.z); + g3d_vertex(p->pos.x, p->pos.y, p->pos.z); + prevpos = p->pos; + p = p->next; + } + } + g3d_end(); + + + g3d_push_matrix(); + g3d_mult_matrix(hb->xform); + zsort_mesh(&sphmesh); + draw_mesh(&sphmesh); + g3d_pop_matrix(); - j = 0; + g3d_begin(G3D_LINES); + for(i=0; ipos.z) continue; + p = hb->plist[i]; + prevpos = start[i]; while(p) { g3d_color3b(p->r, p->g, p->b); g3d_vertex(prevpos.x, prevpos.y, prevpos.z); @@ -232,6 +302,7 @@ static void draw_hairball(struct hairball *hb) } } g3d_end(); + }