From: John Tsiombikas Date: Sat, 25 Nov 2023 09:59:36 +0000 (+0200) Subject: foo X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=fb815fed7c8d6088fdb9506d6434b4035a6e65c8;p=dos_low3d foo --- diff --git a/src/3dgfx.c b/src/3dgfx.c index 535fa98..f53ead6 100644 --- a/src/3dgfx.c +++ b/src/3dgfx.c @@ -70,10 +70,12 @@ void g3d_draw(int prim, struct g3d_vertex *varr, int vcount) int32_t vpscale(int32_t x, int32_t s, int32_t shift); #pragma aux vpscale = \ "add eax, 0x100" \ - "mul ebx" \ + "imul ebx" \ "shrd eax, edx, cl" \ parm [eax] [ebx] [ecx] \ - value [eax]; + value [eax] \ + modify [eax edx]; + void g3d_draw_prim(int prim, struct g3d_vertex *varr) { @@ -97,6 +99,9 @@ void g3d_draw_prim(int prim, struct g3d_vertex *varr) if(v[i].w != 0) { v[i].x = (v[i].x << 4) / (v[i].w >> 4); v[i].y = (v[i].y << 4) / (v[i].w >> 4); + } else { + v[i].x >>= 8; + v[i].y >>= 8; } /* viewport transform */ diff --git a/src/lut.asm b/src/lut.asm index 0501467..c4db165 100644 --- a/src/lut.asm +++ b/src/lut.asm @@ -1,59 +1,59 @@ - bits 32 - section .rodata - - global _sintab -_sintab: - dw 0, 100, 201, 301, 401, 502, 602, 702, 802, 902, 1002, 1102, 1202 - dw 1301, 1400, 1499, 1598, 1696, 1794, 1892, 1990, 2087, 2184, 2281 - dw 2378, 2474, 2569, 2664, 2759, 2854, 2948, 3041, 3134, 3227, 3319 - dw 3411, 3502, 3593, 3683, 3772, 3861, 3950, 4037, 4124, 4211, 4297 - dw 4382, 4467, 4551, 4634, 4717, 4798, 4879, 4960, 5039, 5118, 5196 - dw 5274, 5350, 5426, 5501, 5575, 5648, 5721, 5792, 5863, 5933, 6001 - dw 6069, 6136, 6203, 6268, 6332, 6395, 6458, 6519, 6579, 6639, 6697 - dw 6755, 6811, 6866, 6921, 6974, 7026, 7077, 7127, 7176, 7224, 7271 - dw 7317, 7361, 7405, 7447, 7489, 7529, 7568, 7606, 7643, 7678, 7713 - dw 7746, 7778, 7809, 7839, 7867, 7895, 7921, 7946, 7970, 7992, 8014 - dw 8034, 8053, 8071, 8087, 8103, 8117, 8130, 8142, 8152, 8161, 8169 - dw 8176, 8182, 8186, 8189, 8191, 8192, 8191, 8189, 8186, 8182, 8176 - dw 8169, 8161, 8152, 8142, 8130, 8117, 8103, 8087, 8071, 8053, 8034 - dw 8014, 7992, 7970, 7946, 7921, 7895, 7867, 7839, 7809, 7778, 7746 - dw 7713, 7678, 7643, 7606, 7568, 7529, 7489, 7447, 7405, 7361, 7317 - dw 7271, 7224, 7176, 7127, 7077, 7026, 6974, 6921, 6866, 6811, 6755 - dw 6697, 6639, 6579, 6519, 6458, 6395, 6332, 6268, 6203, 6136, 6069 - dw 6001, 5933, 5863, 5792, 5721, 5648, 5575, 5501, 5426, 5350, 5274 - dw 5196, 5118, 5039, 4960, 4879, 4798, 4717, 4634, 4551, 4467, 4382 - dw 4297, 4211, 4124, 4037, 3950, 3861, 3772, 3683, 3593, 3502, 3411 - dw 3319, 3227, 3134, 3041, 2948, 2854, 2759, 2664, 2569, 2474, 2378 - dw 2281, 2184, 2087, 1990, 1892, 1794, 1696, 1598, 1499, 1400, 1301 - dw 1202, 1102, 1002, 902, 802, 702, 602, 502, 401, 301, 201, 100 - dw 0, -100, -201, -301, -401, -502, -602, -702, -802, -902, -1002 - dw -1102, -1202, -1301, -1400, -1499, -1598, -1696, -1794, -1892 - dw -1990, -2087, -2184, -2281, -2378, -2474, -2569, -2664, -2759 - dw -2854, -2948, -3041, -3134, -3227, -3319, -3411, -3502, -3593 - dw -3683, -3772, -3861, -3950, -4037, -4124, -4211, -4297, -4382 - dw -4467, -4551, -4634, -4717, -4798, -4879, -4960, -5039, -5118 - dw -5196, -5274, -5350, -5426, -5501, -5575, -5648, -5721, -5792 - dw -5863, -5933, -6001, -6069, -6136, -6203, -6268, -6332, -6395 - dw -6458, -6519, -6579, -6639, -6697, -6755, -6811, -6866, -6921 - dw -6974, -7026, -7077, -7127, -7176, -7224, -7271, -7317, -7361 - dw -7405, -7447, -7489, -7529, -7568, -7606, -7643, -7678, -7713 - dw -7746, -7778, -7809, -7839, -7867, -7895, -7921, -7946, -7970 - dw -7992, -8014, -8034, -8053, -8071, -8087, -8103, -8117, -8130 - dw -8142, -8152, -8161, -8169, -8176, -8182, -8186, -8189, -8191 - dw -8192, -8191, -8189, -8186, -8182, -8176, -8169, -8161, -8152 - dw -8142, -8130, -8117, -8103, -8087, -8071, -8053, -8034, -8014 - dw -7992, -7970, -7946, -7921, -7895, -7867, -7839, -7809, -7778 - dw -7746, -7713, -7678, -7643, -7606, -7568, -7529, -7489, -7447 - dw -7405, -7361, -7317, -7271, -7224, -7176, -7127, -7077, -7026 - dw -6974, -6921, -6866, -6811, -6755, -6697, -6639, -6579, -6519 - dw -6458, -6395, -6332, -6268, -6203, -6136, -6069, -6001, -5933 - dw -5863, -5792, -5721, -5648, -5575, -5501, -5426, -5350, -5274 - dw -5196, -5118, -5039, -4960, -4879, -4798, -4717, -4634, -4551 - dw -4467, -4382, -4297, -4211, -4124, -4037, -3950, -3861, -3772 - dw -3683, -3593, -3502, -3411, -3319, -3227, -3134, -3041, -2948 - dw -2854, -2759, -2664, -2569, -2474, -2378, -2281, -2184, -2087 - dw -1990, -1892, -1794, -1696, -1598, -1499, -1400, -1301, -1202 - dw -1102, -1002, -902, -802, -702, -602, -502, -401, -301, -201, -100 - - -; vi:ft=nasm ts=8 sts=8 sw=8: + bits 32 + section .rodata + + global _sintab +_sintab: + dw 0, 100, 201, 301, 401, 502, 602, 702, 802, 902, 1002, 1102, 1202 + dw 1301, 1400, 1499, 1598, 1696, 1794, 1892, 1990, 2087, 2184, 2281 + dw 2378, 2474, 2569, 2664, 2759, 2854, 2948, 3041, 3134, 3227, 3319 + dw 3411, 3502, 3593, 3683, 3772, 3861, 3950, 4037, 4124, 4211, 4297 + dw 4382, 4467, 4551, 4634, 4717, 4798, 4879, 4960, 5039, 5118, 5196 + dw 5274, 5350, 5426, 5501, 5575, 5648, 5721, 5792, 5863, 5933, 6001 + dw 6069, 6136, 6203, 6268, 6332, 6395, 6458, 6519, 6579, 6639, 6697 + dw 6755, 6811, 6866, 6921, 6974, 7026, 7077, 7127, 7176, 7224, 7271 + dw 7317, 7361, 7405, 7447, 7489, 7529, 7568, 7606, 7643, 7678, 7713 + dw 7746, 7778, 7809, 7839, 7867, 7895, 7921, 7946, 7970, 7992, 8014 + dw 8034, 8053, 8071, 8087, 8103, 8117, 8130, 8142, 8152, 8161, 8169 + dw 8176, 8182, 8186, 8189, 8191, 8192, 8191, 8189, 8186, 8182, 8176 + dw 8169, 8161, 8152, 8142, 8130, 8117, 8103, 8087, 8071, 8053, 8034 + dw 8014, 7992, 7970, 7946, 7921, 7895, 7867, 7839, 7809, 7778, 7746 + dw 7713, 7678, 7643, 7606, 7568, 7529, 7489, 7447, 7405, 7361, 7317 + dw 7271, 7224, 7176, 7127, 7077, 7026, 6974, 6921, 6866, 6811, 6755 + dw 6697, 6639, 6579, 6519, 6458, 6395, 6332, 6268, 6203, 6136, 6069 + dw 6001, 5933, 5863, 5792, 5721, 5648, 5575, 5501, 5426, 5350, 5274 + dw 5196, 5118, 5039, 4960, 4879, 4798, 4717, 4634, 4551, 4467, 4382 + dw 4297, 4211, 4124, 4037, 3950, 3861, 3772, 3683, 3593, 3502, 3411 + dw 3319, 3227, 3134, 3041, 2948, 2854, 2759, 2664, 2569, 2474, 2378 + dw 2281, 2184, 2087, 1990, 1892, 1794, 1696, 1598, 1499, 1400, 1301 + dw 1202, 1102, 1002, 902, 802, 702, 602, 502, 401, 301, 201, 100 + dw 0, -100, -201, -301, -401, -502, -602, -702, -802, -902, -1002 + dw -1102, -1202, -1301, -1400, -1499, -1598, -1696, -1794, -1892 + dw -1990, -2087, -2184, -2281, -2378, -2474, -2569, -2664, -2759 + dw -2854, -2948, -3041, -3134, -3227, -3319, -3411, -3502, -3593 + dw -3683, -3772, -3861, -3950, -4037, -4124, -4211, -4297, -4382 + dw -4467, -4551, -4634, -4717, -4798, -4879, -4960, -5039, -5118 + dw -5196, -5274, -5350, -5426, -5501, -5575, -5648, -5721, -5792 + dw -5863, -5933, -6001, -6069, -6136, -6203, -6268, -6332, -6395 + dw -6458, -6519, -6579, -6639, -6697, -6755, -6811, -6866, -6921 + dw -6974, -7026, -7077, -7127, -7176, -7224, -7271, -7317, -7361 + dw -7405, -7447, -7489, -7529, -7568, -7606, -7643, -7678, -7713 + dw -7746, -7778, -7809, -7839, -7867, -7895, -7921, -7946, -7970 + dw -7992, -8014, -8034, -8053, -8071, -8087, -8103, -8117, -8130 + dw -8142, -8152, -8161, -8169, -8176, -8182, -8186, -8189, -8191 + dw -8192, -8191, -8189, -8186, -8182, -8176, -8169, -8161, -8152 + dw -8142, -8130, -8117, -8103, -8087, -8071, -8053, -8034, -8014 + dw -7992, -7970, -7946, -7921, -7895, -7867, -7839, -7809, -7778 + dw -7746, -7713, -7678, -7643, -7606, -7568, -7529, -7489, -7447 + dw -7405, -7361, -7317, -7271, -7224, -7176, -7127, -7077, -7026 + dw -6974, -6921, -6866, -6811, -6755, -6697, -6639, -6579, -6519 + dw -6458, -6395, -6332, -6268, -6203, -6136, -6069, -6001, -5933 + dw -5863, -5792, -5721, -5648, -5575, -5501, -5426, -5350, -5274 + dw -5196, -5118, -5039, -4960, -4879, -4798, -4717, -4634, -4551 + dw -4467, -4382, -4297, -4211, -4124, -4037, -3950, -3861, -3772 + dw -3683, -3593, -3502, -3411, -3319, -3227, -3134, -3041, -2948 + dw -2854, -2759, -2664, -2569, -2474, -2378, -2281, -2184, -2087 + dw -1990, -1892, -1794, -1696, -1598, -1499, -1400, -1301, -1202 + dw -1102, -1002, -902, -802, -702, -602, -502, -401, -301, -201, -100 + + +; vi:ft=nasm ts=8 sts=8 sw=8: diff --git a/src/polyfill.c b/src/polyfill.c index c5298d4..ff62225 100644 --- a/src/polyfill.c +++ b/src/polyfill.c @@ -1,118 +1,124 @@ -#include -#include -#include "3dgfx.h" -#include "util.h" - -static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2); -static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2); - -void g3d_polyfill(struct g3d_vertex *verts) -{ - int i, topidx, botidx, mididx; - int32_t dx, dy, dym; - struct g3d_vertex vtmp; - - topidx = botidx = 0; - for(i=1; i<3; i++) { - if(verts[i].y < verts[topidx].y) { - topidx = i; - } - if(verts[i].y > verts[botidx].y) { - botidx = i; - } - } - mididx = (topidx + 1) % 3; - if(mididx == botidx) mididx = (mididx + 1) % 3; - - dy = verts[botidx].y - verts[topidx].y; - if(dy == 0) return; - - dx = verts[botidx].x - verts[topidx].x; - dym = verts[mididx].y - verts[topidx].y; - vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */ - vtmp.y = verts[mididx].y; - - if(verts[topidx].y != verts[mididx].y) { - filltop(verts + topidx, verts + mididx, &vtmp); - } - if(verts[mididx].y != verts[botidx].y) { - fillbot(verts + mididx, &vtmp, verts + botidx); - } -} - -static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2) -{ - struct g3d_vertex *vtmp; - int x, xn, y, endy, len; - int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy; - unsigned char *fbptr; - - if(v1->x > v2->x) { - vtmp = v1; - v1 = v2; - v2 = vtmp; - } - - y = v0->y >> 8; - endy = v1->y >> 8; - x = v0->x >> 8; - - fbptr = g3d_fbpixels + y * XRES + x; - - xl = xr = v0->x; - dy = v1->y - v0->y; - dxl = v1->x - v0->x; - dxr = v2->x - v0->x; - dxldy = (dxl << 8) / dy; - dxrdy = (dxr << 8) / dy; - - while(y++ < endy) { - len = (xr - xl) >> 8; - if(len > 0) memset(fbptr, g3d_curcidx, len); - - xl += dxldy; - xr += dxrdy; - xn = xl >> 8; - fbptr += XRES + (xn - x); - x = xn; - } -} - -static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2) -{ - struct g3d_vertex *vtmp; - int x, xn, y, endy, len; - int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy; - unsigned char *fbptr; - - if(v0->x > v1->x) { - vtmp = v0; - v0 = v1; - v1 = vtmp; - } - - y = v0->y >> 8; - endy = v2->y >> 8; - x = v0->x >> 8; - - fbptr = g3d_fbpixels + y * XRES + x; - - xl = v0->x; - xr = v1->x; - dy = v2->y - v0->y; - dxl = v2->x - v0->x; - dxr = v2->x - v1->x; - dxldy = (dxl << 8) / dy; - dxrdy = (dxr << 8) / dy; - - while(y++ < endy) { - len = (xr - xl) >> 8; - if(len > 0) memset(fbptr, g3d_curcidx, len); - - xl += dxldy; - xr += dxrdy; - xn = xl >> 8; - fbptr += XRES + (xn - x); - x = xn; - } -} +#include +#include +#include "3dgfx.h" +#include "util.h" + +static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2); +static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2); + +void g3d_polyfill(struct g3d_vertex *verts) +{ + int i, topidx, botidx, mididx; + int32_t dx, dy, dym; + struct g3d_vertex vtmp; + + topidx = botidx = 0; + for(i=1; i<3; i++) { + if(verts[i].y < verts[topidx].y) { + topidx = i; + } + if(verts[i].y > verts[botidx].y) { + botidx = i; + } + } + mididx = (topidx + 1) % 3; + if(mididx == botidx) mididx = (mididx + 1) % 3; + + dy = verts[botidx].y - verts[topidx].y; + if(dy == 0) return; + + dx = verts[botidx].x - verts[topidx].x; + dym = verts[mididx].y - verts[topidx].y; + vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */ + vtmp.y = verts[mididx].y; + + if(verts[topidx].y != verts[mididx].y) { + filltop(verts + topidx, verts + mididx, &vtmp); + } + if(verts[mididx].y != verts[botidx].y) { + fillbot(verts + mididx, &vtmp, verts + botidx); + } +} + +static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2) +{ + struct g3d_vertex *vtmp; + int x, xn, y, endy, len; + int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy; + unsigned char *fbptr; + + if(v1->x > v2->x) { + vtmp = v1; + v1 = v2; + v2 = vtmp; + } + + y = v0->y >> 8; + endy = v1->y >> 8; + if(endy > YRES) endy = YRES; + x = v0->x >> 8; + + fbptr = g3d_fbpixels + y * XRES + x; + + xl = xr = v0->x; + dy = v1->y - v0->y; + dxl = v1->x - v0->x; + dxr = v2->x - v0->x; + dxldy = (dxl << 8) / dy; + dxrdy = (dxr << 8) / dy; + + while(y++ < endy) { + if(y > 0) { + len = (xr - xl) >> 8; + if(len > 0) memset(fbptr, g3d_curcidx, len); + } + + xl += dxldy; + xr += dxrdy; + xn = xl >> 8; + fbptr += XRES + (xn - x); + x = xn; + } +} + +static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2) +{ + struct g3d_vertex *vtmp; + int x, xn, y, endy, len; + int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy; + unsigned char *fbptr; + + if(v0->x > v1->x) { + vtmp = v0; + v0 = v1; + v1 = vtmp; + } + + y = v0->y >> 8; + endy = v2->y >> 8; + if(endy > YRES) endy = YRES; + x = v0->x >> 8; + + fbptr = g3d_fbpixels + y * XRES + x; + + xl = v0->x; + xr = v1->x; + dy = v2->y - v0->y; + dxl = v2->x - v0->x; + dxr = v2->x - v1->x; + dxldy = (dxl << 8) / dy; + dxrdy = (dxr << 8) / dy; + + while(y++ < endy) { + if(y > 0) { + len = (xr - xl) >> 8; + if(len > 0) memset(fbptr, g3d_curcidx, len); + } + + xl += dxldy; + xr += dxrdy; + xn = xl >> 8; + fbptr += XRES + (xn - x); + x = xn; + } +} diff --git a/src/types.h b/src/types.h index 2a747c3..fd0b235 100644 --- a/src/types.h +++ b/src/types.h @@ -1,6 +1,7 @@ #ifndef TYPES_H_ #define TYPES_H_ +#if defined(__WATCOMC__) && __WATCOMC__ < 1200 typedef signed char int8_t; typedef short int16_t; typedef long int32_t; @@ -11,5 +12,8 @@ typedef unsigned long uint32_t; typedef long intptr_t; typedef unsigned long uintptr_t; +#else +#include +#endif #endif /* TYPES_H_ */ diff --git a/src/util.h b/src/util.h index 9488b9b..0cb3da2 100644 --- a/src/util.h +++ b/src/util.h @@ -1,25 +1,25 @@ -#ifndef UTIL_H_ -#define UTIL_H_ - -#include "types.h" - -#define SINLUT_SIZE 512 -#define SINLUT_MASK (SINLUT_SIZE - 1) -#define SINLUT_SCALE 8192 - -extern int16_t sintab[]; - -/* sin(x) lookup -> 16.16 fixed point */ -#define XSIN(x) (sintab[(x) & SINLUT_MASK] << 3) -#define XCOS(x) (sintab[((x) + SINLUT_SIZE / 4) & SINLUT_MASK] << 3) - -/* perform x * s / d without loss of precision */ -int32_t muldiv(int32_t x, int32_t s, int32_t d); -#pragma aux muldiv = \ - "imul ebx" \ - "idiv ecx" \ - parm [eax] [ebx] [ecx] \ - value [eax] \ - modify [eax edx]; - -#endif /* UTIL_H_ */ +#ifndef UTIL_H_ +#define UTIL_H_ + +#include "types.h" + +#define SINLUT_SIZE 512 +#define SINLUT_MASK (SINLUT_SIZE - 1) +#define SINLUT_SCALE 8192 + +extern int16_t sintab[]; + +/* sin(x) lookup -> 16.16 fixed point */ +#define XSIN(x) (sintab[(x) & SINLUT_MASK] << 3) +#define XCOS(x) (sintab[((x) + SINLUT_SIZE / 4) & SINLUT_MASK] << 3) + +/* perform x * s / d without loss of precision */ +int32_t muldiv(int32_t x, int32_t s, int32_t d); +#pragma aux muldiv = \ + "imul ebx" \ + "idiv ecx" \ + parm [eax] [ebx] [ecx] \ + value [eax] \ + modify [eax edx]; + +#endif /* UTIL_H_ */