//draw a texture-mapped face. //returns 1 if off screen, 0 if drew bool G3DrawTexPoly (int nv, g3sPoint **pointlist, uvl *uvl_list, vmsVector *norm, grsBitmap *bm) { int i; g3sPoint **bufptr, *p; g3s_codes cc; cc.or = 0; cc.and = 0xff; bufptr = Vbuf0; for (i=0;i<nv;i++) { p = bufptr[i] = pointlist[i]; cc.and &= p->p3_codes; cc.or |= p->p3_codes; p->p3_u = uvl_list[i].u; p->p3_v = uvl_list[i].v; p->p3_l = uvl_list[i].l; p->p3Flags |= PF_UVS + PF_LS; } if (cc.and) return 1; //all points off screen if (cc.or) return must_clip_tmap_face (nv, cc, bm); //now make list of 2d coords (& check for overflow) for (i=0;i<nv;i++) { p = bufptr[i]; if (! (p->p3Flags&PF_PROJECTED)) G3ProjectPoint (p); if (p->p3Flags&PF_OVERFLOW) { Int3 (); //should not overflow after clip return 255; } } (*tmap_drawer_ptr) (bm, nv, bufptr); return 0; //say it drew }
//draw a texture-mapped face. //returns 1 if off screen, 0 if drew bool g3_draw_tmap(int nv,g3s_point **pointlist,g3s_uvl *uvl_list,g3s_lrgb *light_rgb,grs_bitmap *bm) { int i; g3s_point **bufptr; g3s_codes cc; cc.uor = 0; cc.uand = 0xff; bufptr = Vbuf0; for (i=0;i<nv;i++) { g3s_point *p; p = bufptr[i] = pointlist[i]; cc.uand &= p->p3_codes; cc.uor |= p->p3_codes; p->p3_u = uvl_list[i].u; p->p3_v = uvl_list[i].v; p->p3_l = (light_rgb[i].r+light_rgb[i].g+light_rgb[i].b)/3; p->p3_flags |= PF_UVS + PF_LS; } if (cc.uand) return 1; //all points off screen if (cc.uor) return must_clip_tmap_face(nv,cc,bm); //now make list of 2d coords (& check for overflow) for (i=0;i<nv;i++) { g3s_point *p = bufptr[i]; if (!(p->p3_flags&PF_PROJECTED)) g3_project_point(p); if (p->p3_flags&PF_OVERFLOW) { Int3(); //should not overflow after clip return 255; } } (*tmap_drawer_ptr)(bm,nv,bufptr); return 0; //say it drew }