void rt_heightfield(void * tex, vector ctr, int m, int n, apiflt * field, apiflt wx, apiflt wy) { int xx,yy; vector v0, v1, v2; apiflt xoff, yoff, zoff; xoff=ctr.x - (wx / 2.0); yoff=ctr.z - (wy / 2.0); zoff=ctr.y; for (yy=0; yy<(n-1); yy++) { for (xx=0; xx<(m-1); xx++) { v0.x=wx*(xx )/(m*1.0) + xoff; v0.y=field[(yy )*m + (xx )] + zoff; v0.z=wy*(yy )/(n*1.0) + yoff; v1.x=wx*(xx + 1)/(m*1.0) + xoff; v1.y=field[(yy )*m + (xx + 1)] + zoff; v1.z=wy*(yy )/(n*1.0) + yoff; v2.x=wx*(xx + 1)/(m*1.0) + xoff; v2.y=field[(yy + 1)*m + (xx + 1)] + zoff; v2.z=wy*(yy + 1)/(n*1.0) + yoff; rt_tri(tex, v1, v0, v2); v0.x=wx*(xx )/(m*1.0) + xoff; v0.y=field[(yy )*m + (xx )] + zoff; v0.z=wy*(yy )/(n*1.0) + yoff; v1.x=wx*(xx )/(m*1.0) + xoff; v1.y=field[(yy + 1)*m + (xx )] + zoff; v1.z=wy*(yy + 1)/(n*1.0) + yoff; v2.x=wx*(xx + 1)/(m*1.0) + xoff; v2.y=field[(yy + 1)*m + (xx + 1)] + zoff; v2.z=wy*(yy + 1)/(n*1.0) + yoff; rt_tri(tex, v0, v1, v2); } } } /* end of heightfield */
int NFFGetPolygon(FILE *dfile, SceneHandle scene) { int numverts, i; apivector v0, vold, vnew; fscanf(dfile, "%d", &numverts); NFFGetVector(dfile, &v0); NFFGetVector(dfile, &vold); for (i=2; i<numverts; i++) { NFFGetVector(dfile, &vnew); rt_tri(scene, curtexture, v0, vold, vnew); vold = vnew; } return NFFNOERR; }
static errcode GetTri(parsehandle * ph, SceneHandle scene) { apivector v0,v1,v2; void * tex; errcode rc; rc = GetString(ph, "V0"); rc |= GetVector(ph, &v0); rc |= GetString(ph, "V1"); rc |= GetVector(ph, &v1); rc |= GetString(ph, "V2"); rc |= GetVector(ph, &v2); rc |= GetTexture(ph, scene, &tex); rt_tri(scene, tex, v0, v1, v2); return rc; }
static errcode GetTri(FILE * dfile) { vector v0,v1,v2; void * tex; errcode rc; rc = GetString(dfile, "V0"); rc |= GetVector(dfile, &v0); rc |= GetString(dfile, "V1"); rc |= GetVector(dfile, &v1); rc |= GetString(dfile, "V2"); rc |= GetVector(dfile, &v2); rc |= GetTexture(dfile, &tex); rt_tri(tex, v0, v1, v2); return rc; }
static void gen_triangles(SceneHandle scene, tri_list * tlist, apivector * vertex, apivector * normal) { tri_list * cur; cur = tlist; while (cur != NULL) { if (cur->smooth) { rt_stri(scene, textable[cur->texnum].tex, vertex[cur->v0], vertex[cur->v1], vertex[cur->v2], normal[cur->v0], normal[cur->v1], normal[cur->v2]); } else { rt_tri(scene, textable[cur->texnum].tex, vertex[cur->v0], vertex[cur->v1], vertex[cur->v2]); } cur = cur->next; } }
void rt_tri_box(void * tex, vector min, vector max) { /* -XY face */ rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(min.x, max.y, min.z), rt_vector(max.x, max.y, min.z)); rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(max.x, max.y, min.z), rt_vector(max.x, min.y, min.z)); /* +XY face */ rt_tri(tex, rt_vector(min.x, min.y, max.z), rt_vector(max.x, max.y, max.z), rt_vector(min.x, max.y, max.z)); rt_tri(tex, rt_vector(min.x, min.y, max.z), rt_vector(max.x, min.y, max.z), rt_vector(max.x, max.y, max.z)); /* -YZ face */ rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(min.x, max.y, max.z), rt_vector(min.x, min.y, max.z)); rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(min.x, max.y, min.z), rt_vector(min.x, max.y, max.z)); /* +YZ face */ rt_tri(tex, rt_vector(max.x, min.y, min.z), rt_vector(max.x, min.y, max.z), rt_vector(max.x, max.y, max.z)); rt_tri(tex, rt_vector(max.x, min.y, min.z), rt_vector(max.x, max.y, max.z), rt_vector(max.x, max.y, min.z)); /* -XZ face */ rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(min.x, min.y, max.z), rt_vector(max.x, min.y, max.z)); rt_tri(tex, rt_vector(min.x, min.y, min.z), rt_vector(max.x, min.y, max.z), rt_vector(max.x, min.y, min.z)); /* +XZ face */ rt_tri(tex, rt_vector(min.x, max.y, min.z), rt_vector(max.x, max.y, max.z), rt_vector(min.x, max.y, max.z)); rt_tri(tex, rt_vector(min.x, max.y, min.z), rt_vector(max.x, max.y, min.z), rt_vector(max.x, max.y, max.z)); }
static errcode GetTPolyFile(parsehandle * ph, SceneHandle scene) { void * tex; apivector ctr, rot, scale; apivector v1, v2, v0; char ifname[255]; FILE *ifp; int v, totalpolys; RotMat RotA; errcode rc; totalpolys=0; rc = GetString(ph, "SCALE"); rc |= GetVector(ph, &scale); rc |= GetString(ph, "ROT"); rc |= GetVector(ph, &rot); degvectoradvec(&rot); InitRot3d(&RotA, rot.x, rot.y, rot.z); rc |= GetString(ph, "CENTER"); rc |= GetVector(ph, &ctr); rc |= GetString(ph, "FILE"); fscanf(ph->ifp, "%s", ifname); rc |= GetTexture(ph, scene, &tex); if ((ifp=fopen(ifname, "r")) == NULL) { printf("Can't open data file %s for input!! Aborting...\n", ifname); return PARSEBADSUBFILE; } while (!feof(ifp)) { fscanf(ifp, "%d", &v); if (v != 3) { break; } totalpolys++; v=0; rc |= GetVector(ph, &v0); rc |= GetVector(ph, &v1); rc |= GetVector(ph, &v2); Scale3d(&scale, &v0); Scale3d(&scale, &v1); Scale3d(&scale, &v2); Rotate3d(&RotA, &v0); Rotate3d(&RotA, &v1); Rotate3d(&RotA, &v2); Trans3d(&ctr, &v0); Trans3d(&ctr, &v1); Trans3d(&ctr, &v2); rt_tri(scene, tex, v1, v0, v2); } fclose(ifp); return rc; }