X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2F3dgfx.c;h=083f5072e3c959b6244a275631e04bbc21597887;hp=044ab6602897259700f0a3a1208100528831d58d;hb=091586fb9501d613f621fceb70fa21ff97c4898e;hpb=a5c65ceb155188c8acee31a475f8db9f5b58f4b6 diff --git a/src/3dgfx.c b/src/3dgfx.c index 044ab66..083f507 100644 --- a/src/3dgfx.c +++ b/src/3dgfx.c @@ -82,6 +82,7 @@ int g3d_init(void) fprintf(stderr, "failed to allocate G3D context\n"); return -1; } + st->opt = G3D_CLIP_FRUSTUM; st->fill_mode = POLYFILL_FLAT; for(i=0; ipixels = pixels; + pfill_fb.pixels = pixels; +} + void g3d_viewport(int x, int y, int w, int h) { st->vport[0] = x; @@ -434,21 +442,31 @@ void g3d_draw_indexed(int prim, const struct g3d_vertex *varr, int varr_size, v[i].u = v[i].nx * 0.5 + 0.5; v[i].v = v[i].ny * 0.5 + 0.5; } + if(st->opt & G3D_TEXTURE_MAT) { + float *mat = st->mat[G3D_TEXTURE][st->mtop[G3D_TEXTURE]]; + float x = mat[0] * v[i].u + mat[4] * v[i].v + mat[12]; + float y = mat[1] * v[i].u + mat[5] * v[i].v + mat[13]; + float w = mat[3] * v[i].u + mat[7] * v[i].v + mat[15]; + v[i].u = x / w; + v[i].v = y / w; + } xform4_vec3(st->mat[G3D_PROJECTION][ptop], &v[i].x); } /* clipping */ - for(i=0; i<6; i++) { - memcpy(tmpv, v, vnum * sizeof *v); - - if(clip_frustum(v, &vnum, tmpv, vnum, i) < 0) { - /* polygon completely outside of view volume. discard */ - vnum = 0; - break; + if(st->opt & G3D_CLIP_FRUSTUM) { + for(i=0; i<6; i++) { + memcpy(tmpv, v, vnum * sizeof *v); + + if(clip_frustum(v, &vnum, tmpv, vnum, i) < 0) { + /* polygon completely outside of view volume. discard */ + vnum = 0; + break; + } } - } - if(!vnum) continue; + if(!vnum) continue; + } for(i=0; i> 8, pv[0].y >> 8, pv[1].x >> 8, pv[1].y >> 8, col); + } break; default: