fprintf(stderr, "failed to allocate G3D context\n");
return -1;
}
+ st->opt = G3D_CLIP_FRUSTUM;
st->fill_mode = POLYFILL_FLAT;
for(i=0; i<G3D_NUM_MATRICES; i++) {
g3d_viewport(0, 0, width, height);
}
+/* set the framebuffer pointer, without resetting the size */
+void g3d_framebuffer_addr(void *pixels)
+{
+ st->pixels = pixels;
+ pfill_fb.pixels = pixels;
+}
+
void g3d_viewport(int x, int y, int w, int h)
{
st->vport[0] = x;
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<vnum; i++) {
if(v[i].w != 0.0f) {
break;
case 2:
- /* TODO: draw line */
+ {
+ uint16_t col = PACK_RGB16(pv[0].r, pv[0].g, pv[0].b);
+ draw_line(pv[0].x >> 8, pv[0].y >> 8, pv[1].x >> 8, pv[1].y >> 8, col);
+ }
break;
default: