static void inittree(void) { int i; float dist; for(i=0;i<NUMTREE;i++) do { treepos[i][0]=vrnd()*TREEOUTR*2.0-TREEOUTR; treepos[i][1]=0.0; treepos[i][2]=vrnd()*TREEOUTR*2.0-TREEOUTR; dist=sqrt(treepos[i][0]*treepos[i][0]+treepos[i][2]*treepos[i][2]); } while((dist<TREEINR) || (dist>TREEOUTR)); }
/* initialise new rain particle */ static void setnewrain(firestruct * fs, rain * r) { r->age=0.0f; vinit(r->acc,0.0f,-0.98f,0.0f); vinit(r->vel,0.0f,0.0f,0.0f); r->partLength=0.2f; vinit(r->oldpos,fs->min[0]+(fs->max[0]-fs->min[0])*vrnd(), fs->max[1]+0.2f*fs->max[1]*vrnd(), fs->min[2]+(fs->max[2]-fs->min[2])*vrnd()); vequ(r->pos,r->oldpos); vadds(r->oldpos,-(r->partLength),r->vel); r->pos[1]=(fs->max[1]-fs->min[1])*vrnd()+fs->min[1]; r->oldpos[1]=r->pos[1]-r->partLength*r->vel[1]; }
/* init tree array and positions */ static Bool inittree(ModeInfo * mi) { firestruct *fs = &fire[MI_SCREEN(mi)]; int i; float dist; /* allocate treepos array */ if ((fs->treepos = (treestruct *) malloc(fs->num_trees * sizeof(treestruct))) == NULL) { return False; } /* initialise positions */ for(i=0;i<fs->num_trees;i++) do { fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR; fs->treepos[i].y =0.0; fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR; dist=sqrt(fs->treepos[i].x *fs->treepos[i].x +fs->treepos[i].z *fs->treepos[i].z ); } while((dist<TREEINR) || (dist>TREEOUTR)); return True; }
/* initialise new fire particle */ static void setnewpart(firestruct * fs, part * p) { float a, vi[3], *c; p->age = 0; a = vrnd() * M_PI * 2.0; vinit(vi, sin(a) * fs->eject_r * vrnd(), 0.15, cos(a) * fs->eject_r * vrnd()); vinit(p->p[0], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri); vinit(p->p[1], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri); vinit(p->p[2], vi[0] + vrnd() * fs->ridtri, vi[1] + vrnd() * fs->ridtri, vi[2] + vrnd() * fs->ridtri); vinit(p->v, vi[0] * fs->eject_vl / (fs->eject_r / 2), vrnd() * fs->eject_vy + fs->eject_vy / 2, vi[2] * fs->eject_vl / (fs->eject_r / 2)); c = partcol1; vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0); vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0); vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0); }
static void setnewpart(part *p) { float a,v[3],*c; p->age=0; a=vrnd()*3.14159265359*2.0; vinit(v,sin(a)*eject_r*vrnd(),0.15,cos(a)*eject_r*vrnd()); vinit(p->p[0],v[0]+vrnd()*ridtri,v[1]+vrnd()*ridtri,v[2]+vrnd()*ridtri); vinit(p->p[1],v[0]+vrnd()*ridtri,v[1]+vrnd()*ridtri,v[2]+vrnd()*ridtri); vinit(p->p[2],v[0]+vrnd()*ridtri,v[1]+vrnd()*ridtri,v[2]+vrnd()*ridtri); vinit(p->v,v[0]*eject_vl/(eject_r/2),vrnd()*eject_vy+eject_vy/2,v[2]*eject_vl/(eject_r/2)); c=blu; vinit4(p->c[0],c[0]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[1]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[2]*((1.0-RIDCOL)+vrnd()*RIDCOL), 1.0); vinit4(p->c[1],c[0]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[1]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[2]*((1.0-RIDCOL)+vrnd()*RIDCOL), 1.0); vinit4(p->c[2],c[0]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[1]*((1.0-RIDCOL)+vrnd()*RIDCOL), c[2]*((1.0-RIDCOL)+vrnd()*RIDCOL), 1.0); }
static void inittextures(void) { GLenum gluerr; GLubyte tex[128][128][4]; glGenTextures(1, &groundid); glBindTexture(GL_TEXTURE_2D, groundid); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); #ifndef MONA if (!LoadRGBMipmaps("../images/s128.rgb", GL_RGB)) { #else if (!LoadRGBMipmaps("/MESA/S128.RGB", GL_RGB)) { #endif fprintf(stderr, "Error reading a texture.\n"); exit(-1); } glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glGenTextures(1, &treeid); glBindTexture(GL_TEXTURE_2D, treeid); if (1) { int w, h; GLenum format; int x, y; GLubyte *image = LoadRGBImage("../images/tree3.rgb", &w, &h, &format); if (!image) { fprintf(stderr, "Error reading a texture.\n"); exit(-1); } for (y = 0; y < 128; y++) for (x = 0; x < 128; x++) { tex[x][y][0] = image[(y + x * 128) * 3]; tex[x][y][1] = image[(y + x * 128) * 3 + 1]; tex[x][y][2] = image[(y + x * 128) * 3 + 2]; if ((tex[x][y][0] == tex[x][y][1]) && (tex[x][y][1] == tex[x][y][2]) && (tex[x][y][2] == 255)) tex[x][y][3] = 0; else tex[x][y][3] = 255; } if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) (tex)))) { fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr)); exit(-1); } } else { if (!LoadRGBMipmaps("../images/tree2.rgba", GL_RGBA)) { fprintf(stderr, "Error reading a texture.\n"); exit(-1); } } glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } static void inittree(void) { int i; float dist; for (i = 0; i < NUMTREE; i++) do { treepos[i][0] = vrnd() * TREEOUTR * 2.0 - TREEOUTR; treepos[i][1] = 0.0; treepos[i][2] = vrnd() * TREEOUTR * 2.0 - TREEOUTR; dist = sqrt(treepos[i][0] * treepos[i][0] + treepos[i][2] * treepos[i][2]); } while ((dist < TREEINR) || (dist > TREEOUTR)); }
// Very simple printf. Only for debugging prints. // Do not add to this without checking with Rob. static void vprintf(int8 *s, byte *arg) { int8 *p, *lp; byte *narg; // lock(&debuglock); lp = p = s; for(; *p; p++) { if(*p != '%') continue; if(p > lp) write(fd, lp, p-lp); p++; narg = nil; switch(*p) { case 't': narg = arg + 1; break; case 'd': // 32-bit case 'x': arg = vrnd(arg, 4); narg = arg + 4; break; case 'D': // 64-bit case 'U': case 'X': case 'f': arg = vrnd(arg, sizeof(uintptr)); narg = arg + 8; break; case 'p': // pointer-sized case 's': arg = vrnd(arg, sizeof(uintptr)); narg = arg + sizeof(uintptr); break; case 'S': // pointer-aligned but bigger arg = vrnd(arg, sizeof(uintptr)); narg = arg + sizeof(String); break; case 'a': // pointer-aligned but bigger arg = vrnd(arg, sizeof(uintptr)); narg = arg + sizeof(Slice); break; case 'i': // pointer-aligned but bigger case 'e': arg = vrnd(arg, sizeof(uintptr)); narg = arg + sizeof(Eface); break; } switch(*p) { case 'a': ·printslice(*(Slice*)arg); break; case 'd': ·printint(*(int32*)arg); break; case 'D': ·printint(*(int64*)arg); break; case 'e': ·printeface(*(Eface*)arg); break; case 'f': ·printfloat(*(float64*)arg); break; case 'i': ·printiface(*(Iface*)arg); break; case 'p': ·printpointer(*(void**)arg); break; case 's': prints(*(int8**)arg); break; case 'S': ·printstring(*(String*)arg); break; case 't': ·printbool(*(bool*)arg); break; case 'U': ·printuint(*(uint64*)arg); break; case 'x': ·printhex(*(uint32*)arg); break; case 'X': ·printhex(*(uint64*)arg); break; case '!': ·panicl(-1); } arg = narg; lp = p+1; } if(p > lp) write(fd, lp, p-lp); // unlock(&debuglock); }