void drawPoints(u8 col) { if (flatDrawing) { Vect2D_s16 v[4]; const Vect3D_f16 *norm; const u16 *poly_ind; u16 i; norm = cube_face_norm; poly_ind = cube_poly_ind; i = 6; while (i--) { Vect2D_s16 *pt_dst = v; fix16 dp; u8 col = 2; *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst = pts_2D[*poly_ind++]; dp = fix16Mul(transformation.lightInv.x, norm->x) + fix16Mul(transformation.lightInv.y, norm->y) + fix16Mul(transformation.lightInv.z, norm->z); norm++; if (dp > 0) col += (dp >> (FIX16_FRAC_BITS - 2)); if (!BMP_isPolygonCulled(v, 4)) BMP_drawPolygon(v, 4, col); } } else {
/* Polygon sort, 3D->2D projection, polygon drawing */ void inline drawPoints(u8 col) { Vect2D_s16 v[4]; const Vect3D_f16 *norm; const short *poly_ind; u16 i, j; fix16 z_sum; norm = mesh_face_norm; poly_ind = mesh_poly_ind; // Depth sort the polygons if (zsort_switch == 0) { // Feed an index table with the sum of the Z coordinate // of each polygon in the current mesh for(i = 0; i < poly_count; i++) { j = i << 2; poly_zsort[i].index = i; /* Is it a quad or a triangle ? */ if (poly_ind[j+3] != -1) z_sum = fix16Add(fix16Add(pts_3D[poly_ind[j]].z, pts_3D[poly_ind[j+1]].z), fix16Add(pts_3D[poly_ind[j+2]].z, pts_3D[poly_ind[j+3]].z)); else z_sum = fix16Add(fix16Add(pts_3D[poly_ind[j]].z, pts_3D[poly_ind[j+1]].z), pts_3D[poly_ind[j+2]].z); poly_zsort[i].value = z_sum; } // Quicksort the table and order the polygons by depth QuickSort(poly_count, poly_zsort); } // Count 16 frames until the next depth sort zsort_switch++; zsort_switch &= 0xF; // Draws the polygons i = poly_count; while(i--) { Vect2D_s16 *pt_dst = v; fix16 dp; u8 col = 2; poly_ind = &mesh_poly_ind[poly_zsort[i].index << 2]; /* Is it a quad or a triangle ? */ if (*(poly_ind + 3) != -1) { *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst++ = pts_2D[*poly_ind++]; *pt_dst = pts_2D[*poly_ind++]; // If the polygon is facing the camera if (!BMP_isPolygonCulled(v, 4)) { // Compute the lighting of the polygon norm = &mesh_face_norm[poly_zsort[i].index]; dp = fix16Mul(transformation.lightInv.x, norm->x) + fix16Mul(transformation.lightInv.y, norm->y) + fix16Mul(transformation.lightInv.z, norm->z); if (dp > 0) col += (dp >> (FIX16_FRAC_BITS - 2)); BMP_drawPolygon(v, 4, col | (col << 4)); } }