gpmark
diff src/render3d.cpp @ 0:5019d031b485
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 05 Jun 2013 22:33:37 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/render3d.cpp Wed Jun 05 22:33:37 2013 +0300 1.3 @@ -0,0 +1,1785 @@ 1.4 +#include <math.h> 1.5 +#include <stdlib.h> 1.6 +#include <string.h> 1.7 + 1.8 +#include "engine3d.h" 1.9 +#include "render3d.h" 1.10 +#include "main.h" 1.11 + 1.12 +unsigned char ball_c[256]; 1.13 +unsigned int ball_p[256]; 1.14 + 1.15 +extern unsigned short swp[MAXDATA]; 1.16 +int zdata[MAXDATA]; 1.17 + 1.18 +extern point3d fpts[MAXDATA]; 1.19 +extern point3d norms[MAXDATA]; 1.20 +extern point3d pt_norms[MAXDATA]; 1.21 +extern point2d spts[MAXDATA]; 1.22 +extern point3d spls[MAXDATA]; 1.23 +tcord point_tc[MAXDATA]; 1.24 + 1.25 +unsigned int RenderMode = ENVMAP; 1.26 + 1.27 +unsigned int zbuffer[ScreenSize]; 1.28 + 1.29 +int pdiv[4096]; 1.30 + 1.31 +extern int prticks; 1.32 +int zb = 1; 1.33 + 1.34 +int mlk = 8; 1.35 + 1.36 +void initRender3D() 1.37 +{ 1.38 + int fp = 16; 1.39 + int i; 1.40 + for (i=0; i<4096; i++) 1.41 + { 1.42 + if ((i-2048)!=0) 1.43 + pdiv[i] = (1<<fp)/(i-2048); 1.44 + else 1.45 + pdiv[i] = (1<<fp); 1.46 + } 1.47 +} 1.48 + 1.49 +static inline void drawpoint(point2d point, unsigned short *vram) 1.50 +{ 1.51 + if (point.x>=0 && point.x<ScreenWidth && point.y>=0 && point.y<ScreenHeight) 1.52 + *(vram + point.x + point.y * ScreenWidth) = 0xFFFF; 1.53 +} 1.54 + 1.55 + 1.56 +static inline void drawline (line2d line, unsigned short *vram) 1.57 +{ 1.58 + 1.59 + int x1 = spts[line.p0].x; 1.60 + int y1 = spts[line.p0].y; 1.61 + int x2 = spts[line.p1].x; 1.62 + int y2 = spts[line.p1].y; 1.63 + int c = line.c; 1.64 + 1.65 + int dx, dy, n, l; 1.66 + int x00, y00; 1.67 + int fp = 12; 1.68 + int vramofs; 1.69 + 1.70 + int x, y; 1.71 + 1.72 + dx = x2 - x1; 1.73 + dy = y2 - y1; 1.74 + 1.75 + if (abs(dy) < abs(dx)) 1.76 + { 1.77 + if (x1>x2) 1.78 + { 1.79 + n = x1; x1 = x2; x2 = n; 1.80 + n = y1; y1 = y2; y2 = n; 1.81 + } 1.82 + 1.83 + if (dx!=0) l = ((dy<<fp)*pdiv[dx+2048])>>16; 1.84 + y00 = y1<<fp; 1.85 + for (x=x1; x<x2; x++) 1.86 + { 1.87 + vramofs = ((y00 += l)>>fp)*ScreenWidth + x; 1.88 + if (vramofs>=0 && vramofs<ScreenSize) *(vram + vramofs) = c; 1.89 + } 1.90 + } 1.91 + else 1.92 + { 1.93 + if (y1>y2) 1.94 + { 1.95 + n = y1; y1 = y2; y2 = n; 1.96 + n = x1; x1 = x2; x2 = n; 1.97 + } 1.98 + 1.99 + if (dy!=0) l = ((dx<<fp)*pdiv[dy+2048])>>16; 1.100 + x00 = x1<<fp; 1.101 + 1.102 + for (y=y1; y<y2; y++) 1.103 + { 1.104 + vramofs = y*ScreenWidth + ((x00 += l)>>fp); 1.105 + if (vramofs>=0 && vramofs<ScreenSize) * (vram + vramofs) = c; 1.106 + } 1.107 + 1.108 + } 1.109 +} 1.110 + 1.111 + 1.112 +static inline void DrawFlatTriangle (poly2d poly, unsigned short *vram, unsigned short shade[]) 1.113 +{ 1.114 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.115 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.116 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.117 +int c = shade[poly.c]; 1.118 + 1.119 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.120 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.121 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.122 + 1.123 +//156-187 1.124 +// ===== Sort ===== 1.125 + 1.126 +int temp; 1.127 +if (y1<y0) 1.128 +{ 1.129 + temp = x0; x0 = x1; x1 = temp; 1.130 + temp = y0; y0 = y1; y1 = temp; 1.131 +} 1.132 +if (y2<y0) 1.133 +{ 1.134 + temp = x0; x0 = x2; x2 = temp; 1.135 + temp = y0; y0 = y2; y2 = temp; 1.136 +} 1.137 +if (y2<y1) 1.138 +{ 1.139 + temp = x1; x1 = x2; x2 = temp; 1.140 + temp = y1; y1 = y2; y2 = temp; 1.141 +} 1.142 + 1.143 +// ===== Interpolation variables ===== 1.144 + 1.145 +int n, fp = 8; 1.146 +int lx01=0, lx12=0, lx02=0; 1.147 + 1.148 +int dx01 = x1 - x0; 1.149 +int dy01 = y1 - y0; 1.150 + 1.151 + if (dy01!=0) 1.152 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.153 + 1.154 +int dx12 = x2 - x1; 1.155 +int dy12 = y2 - y1; 1.156 + 1.157 + if (dy12!=0) 1.158 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.159 + 1.160 +int dx02 = x2 - x0; 1.161 +int dy02 = y2 - y0; 1.162 + 1.163 + if (dy02!=0) 1.164 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.165 + 1.166 +int vramofs; 1.167 +int x, y; 1.168 + 1.169 +int x01 = x0<<fp; 1.170 +int x02 = x01; 1.171 + 1.172 +int sx1, sx2; 1.173 + 1.174 + int yp = y0 * ScreenWidth; 1.175 + for (y = y0; y<y1; y++) 1.176 + { 1.177 + sx1 = x01>>fp; 1.178 + sx2 = x02>>fp; 1.179 + 1.180 + if (sx1>sx2) 1.181 + { 1.182 + temp = sx1; sx1 = sx2; sx2 = temp; 1.183 + } 1.184 + 1.185 + yp+=ScreenWidth; 1.186 + vramofs = yp + sx1; 1.187 + for (x = sx1; x<sx2; x++) 1.188 + { 1.189 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.190 + *(vram+vramofs)=c; 1.191 + vramofs++; 1.192 + } 1.193 + x01+=lx01; 1.194 + x02+=lx02; 1.195 + } 1.196 + 1.197 + x01 = x1<<fp; 1.198 + 1.199 + yp = y1 * ScreenWidth; 1.200 + for (y = y1; y<y2; y++) 1.201 + { 1.202 + sx1 = x01>>fp; 1.203 + sx2 = x02>>fp; 1.204 + 1.205 + if (sx1>sx2) 1.206 + { 1.207 + temp = sx1; sx1 = sx2; sx2 = temp; 1.208 + } 1.209 + 1.210 + yp+=ScreenWidth; 1.211 + vramofs = yp + sx1; 1.212 + for (x = sx1; x<sx2; x++) 1.213 + { 1.214 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.215 + *(vram+vramofs)=c; 1.216 + vramofs++; 1.217 + } 1.218 + x01+=lx12; 1.219 + x02+=lx02; 1.220 + } 1.221 +} 1.222 + 1.223 + 1.224 +static inline void DrawFlatTriangleZB (poly2d poly, unsigned short *vram, unsigned short shade[]) 1.225 +{ 1.226 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.227 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.228 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.229 +int c = shade[poly.c]; 1.230 + 1.231 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.232 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.233 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.234 + 1.235 +int z0 = fpts[poly.p0].z; 1.236 +int z1 = fpts[poly.p1].z; 1.237 +int z2 = fpts[poly.p2].z; 1.238 + 1.239 +// ===== Sort ===== 1.240 + 1.241 +int temp; 1.242 +if (y1<y0) 1.243 +{ 1.244 + temp = x0; x0 = x1; x1 = temp; 1.245 + temp = y0; y0 = y1; y1 = temp; 1.246 + temp = z0; z0 = z1; z1 = temp; 1.247 +} 1.248 +if (y2<y0) 1.249 +{ 1.250 + temp = x0; x0 = x2; x2 = temp; 1.251 + temp = y0; y0 = y2; y2 = temp; 1.252 + temp = z0; z0 = z2; z2 = temp; 1.253 +} 1.254 +if (y2<y1) 1.255 +{ 1.256 + temp = x1; x1 = x2; x2 = temp; 1.257 + temp = y1; y1 = y2; y2 = temp; 1.258 + temp = z1; z1 = z2; z2 = temp; 1.259 +} 1.260 + 1.261 +// ===== Interpolation variables ===== 1.262 + 1.263 +int n, fp = 8; 1.264 +int lx01=0, lx12=0, lx02=0; 1.265 +int lz01=0, lz12=0, lz02=0; 1.266 + 1.267 + 1.268 +int dx01 = x1 - x0; 1.269 +int dy01 = y1 - y0; 1.270 +int dz01 = z1 - z0; 1.271 + 1.272 + if (dy01!=0) 1.273 + { 1.274 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.275 + lz01 = (dz01*pdiv[dy01+2048])>>16; 1.276 + } 1.277 + 1.278 +int dx12 = x2 - x1; 1.279 +int dy12 = y2 - y1; 1.280 +int dz12 = z2 - z1; 1.281 + 1.282 + if (dy12!=0) 1.283 + { 1.284 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.285 + lz12 = (dz12*pdiv[dy12+2048])>>16; 1.286 + } 1.287 + 1.288 +int dx02 = x2 - x0; 1.289 +int dy02 = y2 - y0; 1.290 +int dz02 = z2 - z0; 1.291 + 1.292 + if (dy02!=0) 1.293 + { 1.294 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.295 + lz02 = (dz02*pdiv[dy02+2048])>>16; 1.296 + } 1.297 + 1.298 +int vramofs; 1.299 +int x, y; 1.300 + 1.301 +int x01 = x0<<fp; 1.302 +int x02 = x01; 1.303 +int z01 = z0; 1.304 +int z02 = z01; 1.305 + 1.306 +int dz; 1.307 +int sx1, sx2; 1.308 +int sz1, sz2; 1.309 + 1.310 + int yp = y0 * ScreenWidth; 1.311 + for (y = y0; y<y1; y++) 1.312 + { 1.313 + sx1 = x01>>fp; 1.314 + sx2 = x02>>fp; 1.315 + sz1 = z01; 1.316 + sz2 = z02; 1.317 + 1.318 + if (sx1>sx2) 1.319 + { 1.320 + temp = sx1; sx1 = sx2; sx2 = temp; 1.321 + temp = sz1; sz1 = sz2; sz2 = temp; 1.322 + } 1.323 + if (sx2!=sx1) dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.324 + 1.325 + yp+=ScreenWidth; 1.326 + vramofs = yp + sx1; 1.327 + for (x = sx1; x<sx2; x++) 1.328 + { 1.329 + sz1+=dz; 1.330 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.331 + { 1.332 + zbuffer[vramofs] = sz1; 1.333 + *(vram+vramofs)=c; 1.334 + } 1.335 + 1.336 + 1.337 + vramofs++; 1.338 + } 1.339 + x01+=lx01; 1.340 + x02+=lx02; 1.341 + z01+=lz01; 1.342 + z02+=lz02; 1.343 + } 1.344 + 1.345 + x01 = x1<<fp; 1.346 + z01 = z1; 1.347 + 1.348 + yp = y1 * ScreenWidth; 1.349 + for (y = y1; y<y2; y++) 1.350 + { 1.351 + sx1 = x01>>fp; 1.352 + sx2 = x02>>fp; 1.353 + sz1 = z01; 1.354 + sz2 = z02; 1.355 + 1.356 + if (sx1>sx2) 1.357 + { 1.358 + temp = sx1; sx1 = sx2; sx2 = temp; 1.359 + temp = sz1; sz1 = sz2; sz2 = temp; 1.360 + } 1.361 + 1.362 + if (sx2!=sx1) dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.363 + 1.364 + yp+=ScreenWidth; 1.365 + vramofs = yp + sx1; 1.366 + for (x = sx1; x<sx2; x++) 1.367 + { 1.368 + sz1+=dz; 1.369 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.370 + { 1.371 + zbuffer[vramofs] = sz1; 1.372 + *(vram+vramofs)=c; 1.373 + } 1.374 + vramofs++; 1.375 + } 1.376 + x01+=lx12; 1.377 + x02+=lx02; 1.378 + z01+=lz12; 1.379 + z02+=lz02; 1.380 + } 1.381 +} 1.382 + 1.383 +static inline void DrawGouraudTriangle (poly2d poly, unsigned short *vram, unsigned short shade[]) 1.384 +{ 1.385 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.386 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.387 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.388 + 1.389 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.390 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.391 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.392 + 1.393 +int c; 1.394 +int c0 = spts[poly.p0].c; 1.395 +int c1 = spts[poly.p1].c; 1.396 +int c2 = spts[poly.p2].c; 1.397 + 1.398 +// ===== Sort ===== 1.399 + 1.400 +int temp; 1.401 +if (y1<y0) 1.402 +{ 1.403 + temp = c0; c0 = c1; c1 = temp; 1.404 + temp = x0; x0 = x1; x1 = temp; 1.405 + temp = y0; y0 = y1; y1 = temp; 1.406 +} 1.407 +if (y2<y0) 1.408 +{ 1.409 + temp = c0; c0 = c2; c2 = temp; 1.410 + temp = x0; x0 = x2; x2 = temp; 1.411 + temp = y0; y0 = y2; y2 = temp; 1.412 +} 1.413 +if (y2<y1) 1.414 +{ 1.415 + temp = c1; c1 = c2; c2 = temp; 1.416 + temp = x1; x1 = x2; x2 = temp; 1.417 + temp = y1; y1 = y2; y2 = temp; 1.418 +} 1.419 + 1.420 +// ===== Interpolation variables ===== 1.421 + 1.422 +int n; 1.423 +int fp = 8; 1.424 +int lx01=0, lx12=0, lx02=0; 1.425 +int lc01=0, lc12=0, lc02=0; 1.426 + 1.427 +int dx01 = x1 - x0; 1.428 +int dy01 = y1 - y0; 1.429 +int dc01 = c1 - c0; 1.430 + 1.431 + if (dy01!=0) 1.432 + { 1.433 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.434 + lc01 = ((dc01<<fp)*pdiv[dy01+2048])>>16; 1.435 + } 1.436 + 1.437 +int dx12 = x2 - x1; 1.438 +int dy12 = y2 - y1; 1.439 +int dc12 = c2 - c1; 1.440 + 1.441 + if (dy12!=0) 1.442 + { 1.443 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.444 + lc12 = ((dc12<<fp)*pdiv[dy12+2048])>>16; 1.445 + } 1.446 + 1.447 +int dx02 = x2 - x0; 1.448 +int dy02 = y2 - y0; 1.449 +int dc02 = c2 - c0; 1.450 + 1.451 + if (dy02!=0) 1.452 + { 1.453 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.454 + lc02 = ((dc02<<fp)*pdiv[dy02+2048])>>16; 1.455 + } 1.456 + 1.457 +int vramofs; 1.458 +int x, y; 1.459 + 1.460 +int x01 = x0<<fp; 1.461 +int x02 = x01; 1.462 +int c01 = c0<<fp; 1.463 +int c02 = c01; 1.464 + 1.465 +int dc; 1.466 +int sc1, sc2; 1.467 +int sx1, sx2; 1.468 + 1.469 + int yp = y0 * ScreenWidth; 1.470 + for (y = y0; y<y1; y++) 1.471 + { 1.472 + sx1 = x01>>fp; 1.473 + sx2 = x02>>fp; 1.474 + sc1 = c01; 1.475 + sc2 = c02; 1.476 + 1.477 + if (sx1>sx2) 1.478 + { 1.479 + temp = sx1; sx1 = sx2; sx2 = temp; 1.480 + temp = sc1; sc1 = sc2; sc2 = temp; 1.481 + } 1.482 + 1.483 + if (sx2!=sx1) 1.484 + dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; 1.485 + 1.486 + yp+=ScreenWidth; 1.487 + vramofs = yp + sx1; 1.488 + for (x = sx1; x<sx2; x++) 1.489 + { 1.490 + sc1+=dc; 1.491 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.492 + { 1.493 + c = sc1>>fp; 1.494 + if (c<0) c = 0; 1.495 + *(vram+vramofs)=shade[c]; 1.496 + } 1.497 + vramofs++; 1.498 + } 1.499 + x01+=lx01; 1.500 + x02+=lx02; 1.501 + c01+=lc01; 1.502 + c02+=lc02; 1.503 + } 1.504 + 1.505 + x01 = x1<<fp; 1.506 + c01 = c1<<fp; 1.507 + 1.508 + yp = y1 * ScreenWidth; 1.509 + for (y = y1; y<y2; y++) 1.510 + { 1.511 + sx1 = x01>>fp; 1.512 + sx2 = x02>>fp; 1.513 + sc1 = c01; 1.514 + sc2 = c02; 1.515 + 1.516 + if (sx1>sx2) 1.517 + { 1.518 + temp = sx1; sx1 = sx2; sx2 = temp; 1.519 + temp = sc1; sc1 = sc2; sc2 = temp; 1.520 + } 1.521 + 1.522 + if (sx2!=sx1) 1.523 + dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; 1.524 + 1.525 + yp+=ScreenWidth; 1.526 + vramofs = yp + sx1; 1.527 + for (x = sx1; x<sx2; x++) 1.528 + { 1.529 + sc1+=dc; 1.530 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.531 + { 1.532 + c = sc1>>fp; 1.533 + if (c<0) c = 0; 1.534 + *(vram+vramofs)=shade[c]; 1.535 + } 1.536 + vramofs++; 1.537 + } 1.538 + x01+=lx12; 1.539 + x02+=lx02; 1.540 + c01+=lc12; 1.541 + c02+=lc02; 1.542 + } 1.543 +} 1.544 + 1.545 +static inline void DrawGouraudTriangleZB (poly2d poly, unsigned short *vram, unsigned short shade[]) 1.546 +{ 1.547 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.548 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.549 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.550 + 1.551 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.552 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.553 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.554 + 1.555 +int c; 1.556 +int c0 = spts[poly.p0].c; 1.557 +int c1 = spts[poly.p1].c; 1.558 +int c2 = spts[poly.p2].c; 1.559 + 1.560 +int z0 = fpts[poly.p0].z; 1.561 +int z1 = fpts[poly.p1].z; 1.562 +int z2 = fpts[poly.p2].z; 1.563 + 1.564 +// ===== Sort ===== 1.565 + 1.566 +int temp; 1.567 +if (y1<y0) 1.568 +{ 1.569 + temp = c0; c0 = c1; c1 = temp; 1.570 + temp = z0; z0 = z1; z1 = temp; 1.571 + temp = x0; x0 = x1; x1 = temp; 1.572 + temp = y0; y0 = y1; y1 = temp; 1.573 +} 1.574 +if (y2<y0) 1.575 +{ 1.576 + temp = c0; c0 = c2; c2 = temp; 1.577 + temp = z0; z0 = z2; z2 = temp; 1.578 + temp = x0; x0 = x2; x2 = temp; 1.579 + temp = y0; y0 = y2; y2 = temp; 1.580 +} 1.581 +if (y2<y1) 1.582 +{ 1.583 + temp = c1; c1 = c2; c2 = temp; 1.584 + temp = z1; z1 = z2; z2 = temp; 1.585 + temp = x1; x1 = x2; x2 = temp; 1.586 + temp = y1; y1 = y2; y2 = temp; 1.587 +} 1.588 + 1.589 +// ===== Interpolation variables ===== 1.590 + 1.591 +int n; 1.592 +int fp = 8; 1.593 +int lx01=0, lx12=0, lx02=0; 1.594 +int lc01=0, lc12=0, lc02=0; 1.595 +int lz01=0, lz12=0, lz02=0; 1.596 + 1.597 +int dx01 = x1 - x0; 1.598 +int dy01 = y1 - y0; 1.599 +int dc01 = c1 - c0; 1.600 +int dz01 = z1 - z0; 1.601 + 1.602 + if (dy01!=0) 1.603 + { 1.604 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.605 + lc01 = ((dc01<<fp)*pdiv[dy01+2048])>>16; 1.606 + lz01 = (dz01*pdiv[dy01+2048])>>16; 1.607 + } 1.608 + 1.609 +int dx12 = x2 - x1; 1.610 +int dy12 = y2 - y1; 1.611 +int dc12 = c2 - c1; 1.612 +int dz12 = z2 - z1; 1.613 + 1.614 + if (dy12!=0) 1.615 + { 1.616 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.617 + lc12 = ((dc12<<fp)*pdiv[dy12+2048])>>16; 1.618 + lz12 = (dz12*pdiv[dy12+2048])>>16; 1.619 + } 1.620 + 1.621 +int dx02 = x2 - x0; 1.622 +int dy02 = y2 - y0; 1.623 +int dc02 = c2 - c0; 1.624 +int dz02 = z2 - z0; 1.625 + 1.626 + if (dy02!=0) 1.627 + { 1.628 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.629 + lc02 = ((dc02<<fp)*pdiv[dy02+2048])>>16; 1.630 + lz02 = (dz02*pdiv[dy02+2048])>>16; 1.631 + } 1.632 + 1.633 +int vramofs; 1.634 +int x, y; 1.635 + 1.636 +int x01 = x0<<fp; 1.637 +int x02 = x01; 1.638 +int c01 = c0<<fp; 1.639 +int c02 = c01; 1.640 +int z01 = z0; 1.641 +int z02 = z01; 1.642 + 1.643 +int dc, dz; 1.644 +int sc1, sc2; 1.645 +int sx1, sx2; 1.646 +int sz1, sz2; 1.647 + 1.648 + int yp = y0 * ScreenWidth; 1.649 + for (y = y0; y<y1; y++) 1.650 + { 1.651 + sx1 = x01>>fp; 1.652 + sx2 = x02>>fp; 1.653 + sc1 = c01; 1.654 + sc2 = c02; 1.655 + sz1 = z01; 1.656 + sz2 = z02; 1.657 + 1.658 + if (sx1>sx2) 1.659 + { 1.660 + temp = sx1; sx1 = sx2; sx2 = temp; 1.661 + temp = sc1; sc1 = sc2; sc2 = temp; 1.662 + temp = sz1; sz1 = sz2; sz2 = temp; 1.663 + } 1.664 + 1.665 + if (sx2!=sx1) 1.666 + { 1.667 + dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; 1.668 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.669 + } 1.670 + 1.671 + yp+=ScreenWidth; 1.672 + vramofs = yp + sx1; 1.673 + for (x = sx1; x<sx2; x++) 1.674 + { 1.675 + sc1+=dc; 1.676 + sz1+=dz; 1.677 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.678 + { 1.679 + c = sc1>>fp; 1.680 + if (c<0) c=0; 1.681 + zbuffer[vramofs] = sz1; 1.682 + *(vram+vramofs)=shade[c]; 1.683 + } 1.684 + vramofs++; 1.685 + } 1.686 + x01+=lx01; 1.687 + x02+=lx02; 1.688 + c01+=lc01; 1.689 + c02+=lc02; 1.690 + z01+=lz01; 1.691 + z02+=lz02; 1.692 + } 1.693 + 1.694 + x01 = x1<<fp; 1.695 + c01 = c1<<fp; 1.696 + z01 = z1; 1.697 + 1.698 + yp = y1 * ScreenWidth; 1.699 + for (y = y1; y<y2; y++) 1.700 + { 1.701 + sx1 = x01>>fp; 1.702 + sx2 = x02>>fp; 1.703 + sc1 = c01; 1.704 + sc2 = c02; 1.705 + sz1 = z01; 1.706 + sz2 = z02; 1.707 + 1.708 + if (sx1>sx2) 1.709 + { 1.710 + temp = sx1; sx1 = sx2; sx2 = temp; 1.711 + temp = sc1; sc1 = sc2; sc2 = temp; 1.712 + temp = sz1; sz1 = sz2; sz2 = temp; 1.713 + } 1.714 + 1.715 + if (sx2!=sx1) 1.716 + { 1.717 + dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; 1.718 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.719 + } 1.720 + 1.721 + yp+=ScreenWidth; 1.722 + vramofs = yp + sx1; 1.723 + for (x = sx1; x<sx2; x++) 1.724 + { 1.725 + sc1+=dc; 1.726 + sz1+=dz; 1.727 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.728 + { 1.729 + c = sc1>>fp; 1.730 + if (c<0) c=0; 1.731 + zbuffer[vramofs] = sz1; 1.732 + *(vram+vramofs)=shade[c]; 1.733 + } 1.734 + vramofs++; 1.735 + } 1.736 + x01+=lx12; 1.737 + x02+=lx02; 1.738 + c01+=lc12; 1.739 + c02+=lc02; 1.740 + z01+=lz12; 1.741 + z02+=lz02; 1.742 + } 1.743 +} 1.744 + 1.745 +static inline void DrawTextureTriangle(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) 1.746 +{ 1.747 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.748 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.749 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.750 + 1.751 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.752 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.753 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.754 + 1.755 +int c; 1.756 + 1.757 +int u0 = poly.tc0.u; int v0 = poly.tc0.v; 1.758 +int u1 = poly.tc1.u; int v1 = poly.tc1.v; 1.759 +int u2 = poly.tc2.u; int v2 = poly.tc2.v; 1.760 + 1.761 +// ===== Sort ===== 1.762 + 1.763 +int temp; 1.764 +if (y1<y0) 1.765 +{ 1.766 + temp = u0; u0 = u1; u1 = temp; 1.767 + temp = v0; v0 = v1; v1 = temp; 1.768 + temp = x0; x0 = x1; x1 = temp; 1.769 + temp = y0; y0 = y1; y1 = temp; 1.770 +} 1.771 +if (y2<y0) 1.772 +{ 1.773 + temp = u0; u0 = u2; u2 = temp; 1.774 + temp = v0; v0 = v2; v2 = temp; 1.775 + temp = x0; x0 = x2; x2 = temp; 1.776 + temp = y0; y0 = y2; y2 = temp; 1.777 +} 1.778 +if (y2<y1) 1.779 +{ 1.780 + temp = u1; u1 = u2; u2 = temp; 1.781 + temp = v1; v1 = v2; v2 = temp; 1.782 + temp = x1; x1 = x2; x2 = temp; 1.783 + temp = y1; y1 = y2; y2 = temp; 1.784 +} 1.785 + 1.786 +// ===== Interpolation variables ===== 1.787 + 1.788 +int n; 1.789 +int fp = 8; 1.790 +int lx01=0, lx12=0, lx02=0; 1.791 +int lu01=0, lu12=0, lu02=0; 1.792 +int lv01=0, lv12=0, lv02=0; 1.793 + 1.794 +int dx01 = x1 - x0; 1.795 +int dy01 = y1 - y0; 1.796 +int du01 = u1 - u0; 1.797 +int dv01 = v1 - v0; 1.798 + 1.799 + if (dy01!=0) 1.800 + { 1.801 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.802 + lu01 = ((du01<<fp)*pdiv[dy01+2048])>>16; 1.803 + lv01 = ((dv01<<fp)*pdiv[dy01+2048])>>16; 1.804 + } 1.805 + 1.806 +int dx12 = x2 - x1; 1.807 +int dy12 = y2 - y1; 1.808 +int du12 = u2 - u1; 1.809 +int dv12 = v2 - v1; 1.810 + 1.811 + if (dy12!=0) 1.812 + { 1.813 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.814 + lu12 = ((du12<<fp)*pdiv[dy12+2048])>>16; 1.815 + lv12 = ((dv12<<fp)*pdiv[dy12+2048])>>16; 1.816 + } 1.817 + 1.818 +int dx02 = x2 - x0; 1.819 +int dy02 = y2 - y0; 1.820 +int du02 = u2 - u0; 1.821 +int dv02 = v2 - v0; 1.822 + 1.823 + if (dy02!=0) 1.824 + { 1.825 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.826 + lu02 = ((du02<<fp)*pdiv[dy02+2048])>>16; 1.827 + lv02 = ((dv02<<fp)*pdiv[dy02+2048])>>16; 1.828 + } 1.829 + 1.830 +int vramofs; 1.831 +int x, y; 1.832 + 1.833 +int x01 = x0<<fp; 1.834 +int x02 = x01; 1.835 +int u01 = u0<<fp; 1.836 +int u02 = u01; 1.837 +int v01 = v0<<fp; 1.838 +int v02 = v01; 1.839 + 1.840 +int du, dv; 1.841 +int su1, su2; 1.842 +int sv1, sv2; 1.843 +int sx1, sx2; 1.844 + 1.845 +int px, py; 1.846 + 1.847 + int yp = y0 * ScreenWidth; 1.848 + for (y = y0; y<y1; y++) 1.849 + { 1.850 + sx1 = x01>>fp; 1.851 + sx2 = x02>>fp; 1.852 + su1 = u01; 1.853 + su2 = u02; 1.854 + sv1 = v01; 1.855 + sv2 = v02; 1.856 + 1.857 + if (sx1>sx2) 1.858 + { 1.859 + temp = sx1; sx1 = sx2; sx2 = temp; 1.860 + temp = su1; su1 = su2; su2 = temp; 1.861 + temp = sv1; sv1 = sv2; sv2 = temp; 1.862 + } 1.863 + 1.864 + if (sx2!=sx1) 1.865 + { 1.866 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.867 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.868 + } 1.869 + 1.870 + yp+=ScreenWidth; 1.871 + vramofs = yp + sx1; 1.872 + for (x = sx1; x<sx2; x++) 1.873 + { 1.874 + su1+=du; 1.875 + sv1+=dv; 1.876 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.877 + { 1.878 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.879 + *(vram+vramofs) = c; 1.880 + } 1.881 + vramofs++; 1.882 + } 1.883 + x01+=lx01; 1.884 + x02+=lx02; 1.885 + u01+=lu01; 1.886 + u02+=lu02; 1.887 + v01+=lv01; 1.888 + v02+=lv02; 1.889 + } 1.890 + 1.891 + x01 = x1<<fp; 1.892 + u01 = u1<<fp; 1.893 + v01 = v1<<fp; 1.894 + 1.895 + yp = y1 * ScreenWidth; 1.896 + for (y = y1; y<y2; y++) 1.897 + { 1.898 + sx1 = x01>>fp; 1.899 + sx2 = x02>>fp; 1.900 + su1 = u01; 1.901 + su2 = u02; 1.902 + sv1 = v01; 1.903 + sv2 = v02; 1.904 + 1.905 + if (sx1>sx2) 1.906 + { 1.907 + temp = sx1; sx1 = sx2; sx2 = temp; 1.908 + temp = su1; su1 = su2; su2 = temp; 1.909 + temp = sv1; sv1 = sv2; sv2 = temp; 1.910 + } 1.911 + 1.912 + if (sx2!=sx1) 1.913 + { 1.914 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.915 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.916 + } 1.917 + 1.918 + yp+=ScreenWidth; 1.919 + vramofs = yp + sx1; 1.920 + for (x = sx1; x<sx2; x++) 1.921 + { 1.922 + su1+=du; 1.923 + sv1+=dv; 1.924 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.925 + { 1.926 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.927 + *(vram+vramofs) = c; 1.928 + } 1.929 + vramofs++; 1.930 + } 1.931 + x01+=lx12; 1.932 + x02+=lx02; 1.933 + u01+=lu12; 1.934 + u02+=lu02; 1.935 + v01+=lv12; 1.936 + v02+=lv02; 1.937 + } 1.938 +} 1.939 + 1.940 +static inline void DrawTextureTriangleZB(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) 1.941 +{ 1.942 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.943 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.944 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.945 + 1.946 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.947 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.948 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.949 + 1.950 +int c; 1.951 + 1.952 +int u0 = poly.tc0.u; int v0 = poly.tc0.v; 1.953 +int u1 = poly.tc1.u; int v1 = poly.tc1.v; 1.954 +int u2 = poly.tc2.u; int v2 = poly.tc2.v; 1.955 + 1.956 +int z0 = fpts[poly.p0].z; 1.957 +int z1 = fpts[poly.p1].z; 1.958 +int z2 = fpts[poly.p2].z; 1.959 + 1.960 +// ===== Sort ===== 1.961 + 1.962 +int temp; 1.963 +if (y1<y0) 1.964 +{ 1.965 + temp = u0; u0 = u1; u1 = temp; 1.966 + temp = v0; v0 = v1; v1 = temp; 1.967 + temp = z0; z0 = z1; z1 = temp; 1.968 + temp = x0; x0 = x1; x1 = temp; 1.969 + temp = y0; y0 = y1; y1 = temp; 1.970 +} 1.971 +if (y2<y0) 1.972 +{ 1.973 + temp = u0; u0 = u2; u2 = temp; 1.974 + temp = v0; v0 = v2; v2 = temp; 1.975 + temp = z0; z0 = z2; z2 = temp; 1.976 + temp = x0; x0 = x2; x2 = temp; 1.977 + temp = y0; y0 = y2; y2 = temp; 1.978 +} 1.979 +if (y2<y1) 1.980 +{ 1.981 + temp = u1; u1 = u2; u2 = temp; 1.982 + temp = v1; v1 = v2; v2 = temp; 1.983 + temp = z1; z1 = z2; z2 = temp; 1.984 + temp = x1; x1 = x2; x2 = temp; 1.985 + temp = y1; y1 = y2; y2 = temp; 1.986 +} 1.987 + 1.988 +// ===== Interpolation variables ===== 1.989 + 1.990 +int n; 1.991 +int fp = 8; 1.992 +int lx01=0, lx12=0, lx02=0; 1.993 +int lu01=0, lu12=0, lu02=0; 1.994 +int lv01=0, lv12=0, lv02=0; 1.995 +int lz01=0, lz12=0, lz02=0; 1.996 + 1.997 +int dx01 = x1 - x0; 1.998 +int dy01 = y1 - y0; 1.999 +int du01 = u1 - u0; 1.1000 +int dv01 = v1 - v0; 1.1001 +int dz01 = z1 - z0; 1.1002 + 1.1003 + if (dy01!=0) 1.1004 + { 1.1005 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.1006 + lu01 = ((du01<<fp)*pdiv[dy01+2048])>>16; 1.1007 + lv01 = ((dv01<<fp)*pdiv[dy01+2048])>>16; 1.1008 + lz01 = (dz01*pdiv[dy01+2048])>>16; 1.1009 + } 1.1010 + 1.1011 +int dx12 = x2 - x1; 1.1012 +int dy12 = y2 - y1; 1.1013 +int du12 = u2 - u1; 1.1014 +int dv12 = v2 - v1; 1.1015 +int dz12 = z2 - z1; 1.1016 + 1.1017 + if (dy12!=0) 1.1018 + { 1.1019 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.1020 + lu12 = ((du12<<fp)*pdiv[dy12+2048])>>16; 1.1021 + lv12 = ((dv12<<fp)*pdiv[dy12+2048])>>16; 1.1022 + lz12 = (dz12*pdiv[dy12+2048])>>16; 1.1023 + } 1.1024 + 1.1025 +int dx02 = x2 - x0; 1.1026 +int dy02 = y2 - y0; 1.1027 +int du02 = u2 - u0; 1.1028 +int dv02 = v2 - v0; 1.1029 +int dz02 = z2 - z0; 1.1030 + 1.1031 + if (dy02!=0) 1.1032 + { 1.1033 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.1034 + lu02 = ((du02<<fp)*pdiv[dy02+2048])>>16; 1.1035 + lv02 = ((dv02<<fp)*pdiv[dy02+2048])>>16; 1.1036 + lz02 = (dz02*pdiv[dy02+2048])>>16; 1.1037 + } 1.1038 + 1.1039 +int vramofs; 1.1040 +int x, y; 1.1041 + 1.1042 +int x01 = x0<<fp; 1.1043 +int x02 = x01; 1.1044 +int u01 = u0<<fp; 1.1045 +int u02 = u01; 1.1046 +int v01 = v0<<fp; 1.1047 +int v02 = v01; 1.1048 +int z01 = z0; 1.1049 +int z02 = z01; 1.1050 + 1.1051 +int du, dv, dz; 1.1052 +int su1, su2; 1.1053 +int sv1, sv2; 1.1054 +int sx1, sx2; 1.1055 +int sz1, sz2; 1.1056 + 1.1057 +int px, py; 1.1058 + 1.1059 + int yp = y0 * ScreenWidth; 1.1060 + for (y = y0; y<y1; y++) 1.1061 + { 1.1062 + sx1 = x01>>fp; 1.1063 + sx2 = x02>>fp; 1.1064 + su1 = u01; 1.1065 + su2 = u02; 1.1066 + sv1 = v01; 1.1067 + sv2 = v02; 1.1068 + sz1 = z01; 1.1069 + sz2 = z02; 1.1070 + 1.1071 + if (sx1>sx2) 1.1072 + { 1.1073 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1074 + temp = su1; su1 = su2; su2 = temp; 1.1075 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1076 + temp = sz1; sz1 = sz2; sz2 = temp; 1.1077 + } 1.1078 + 1.1079 + if (sx2!=sx1) 1.1080 + { 1.1081 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1082 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1083 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.1084 + } 1.1085 + 1.1086 + yp+=ScreenWidth; 1.1087 + vramofs = yp + sx1; 1.1088 + for (x = sx1; x<sx2; x++) 1.1089 + { 1.1090 + su1+=du; 1.1091 + sv1+=dv; 1.1092 + sz1+=dz; 1.1093 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.1094 + { 1.1095 + zbuffer[vramofs] = sz1; 1.1096 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1097 + *(vram+vramofs) = c; 1.1098 + } 1.1099 + vramofs++; 1.1100 + } 1.1101 + x01+=lx01; 1.1102 + x02+=lx02; 1.1103 + u01+=lu01; 1.1104 + u02+=lu02; 1.1105 + v01+=lv01; 1.1106 + v02+=lv02; 1.1107 + z01+=lz01; 1.1108 + z02+=lz02; 1.1109 + } 1.1110 + 1.1111 + x01 = x1<<fp; 1.1112 + u01 = u1<<fp; 1.1113 + v01 = v1<<fp; 1.1114 + z01 = z1; 1.1115 + 1.1116 + yp = y1 * ScreenWidth; 1.1117 + for (y = y1; y<y2; y++) 1.1118 + { 1.1119 + sx1 = x01>>fp; 1.1120 + sx2 = x02>>fp; 1.1121 + su1 = u01; 1.1122 + su2 = u02; 1.1123 + sv1 = v01; 1.1124 + sv2 = v02; 1.1125 + sz1 = z01; 1.1126 + sz2 = z02; 1.1127 + 1.1128 + if (sx1>sx2) 1.1129 + { 1.1130 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1131 + temp = su1; su1 = su2; su2 = temp; 1.1132 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1133 + temp = sz1; sz1 = sz2; sz2 = temp; 1.1134 + } 1.1135 + 1.1136 + if (sx2!=sx1) 1.1137 + { 1.1138 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1139 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1140 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.1141 + } 1.1142 + 1.1143 + yp+=ScreenWidth; 1.1144 + vramofs = yp + sx1; 1.1145 + for (x = sx1; x<sx2; x++) 1.1146 + { 1.1147 + su1+=du; 1.1148 + sv1+=dv; 1.1149 + sz1+=dz; 1.1150 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.1151 + { 1.1152 + zbuffer[vramofs] = sz1; 1.1153 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1154 + *(vram+vramofs) = c; 1.1155 + } 1.1156 + vramofs++; 1.1157 + } 1.1158 + x01+=lx12; 1.1159 + x02+=lx02; 1.1160 + u01+=lu12; 1.1161 + u02+=lu02; 1.1162 + v01+=lv12; 1.1163 + v02+=lv02; 1.1164 + z01+=lz12; 1.1165 + z02+=lz02; 1.1166 + } 1.1167 +} 1.1168 + 1.1169 +static inline void DrawEnvmappedTriangle(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) 1.1170 +{ 1.1171 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.1172 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.1173 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.1174 + 1.1175 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.1176 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.1177 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.1178 + 1.1179 +int c; 1.1180 + 1.1181 +int u0 = point_tc[poly.p0].u; int v0 = point_tc[poly.p0].v; 1.1182 +int u1 = point_tc[poly.p1].u; int v1 = point_tc[poly.p1].v; 1.1183 +int u2 = point_tc[poly.p2].u; int v2 = point_tc[poly.p2].v; 1.1184 + 1.1185 +// ===== Sort ===== 1.1186 + 1.1187 +int temp; 1.1188 +if (y1<y0) 1.1189 +{ 1.1190 + temp = u0; u0 = u1; u1 = temp; 1.1191 + temp = v0; v0 = v1; v1 = temp; 1.1192 + temp = x0; x0 = x1; x1 = temp; 1.1193 + temp = y0; y0 = y1; y1 = temp; 1.1194 +} 1.1195 +if (y2<y0) 1.1196 +{ 1.1197 + temp = u0; u0 = u2; u2 = temp; 1.1198 + temp = v0; v0 = v2; v2 = temp; 1.1199 + temp = x0; x0 = x2; x2 = temp; 1.1200 + temp = y0; y0 = y2; y2 = temp; 1.1201 +} 1.1202 +if (y2<y1) 1.1203 +{ 1.1204 + temp = u1; u1 = u2; u2 = temp; 1.1205 + temp = v1; v1 = v2; v2 = temp; 1.1206 + temp = x1; x1 = x2; x2 = temp; 1.1207 + temp = y1; y1 = y2; y2 = temp; 1.1208 +} 1.1209 + 1.1210 +// ===== Interpolation variables ===== 1.1211 + 1.1212 +int n; 1.1213 +int fp = 8; 1.1214 +int lx01=0, lx12=0, lx02=0; 1.1215 +int lu01=0, lu12=0, lu02=0; 1.1216 +int lv01=0, lv12=0, lv02=0; 1.1217 + 1.1218 +int dx01 = x1 - x0; 1.1219 +int dy01 = y1 - y0; 1.1220 +int du01 = u1 - u0; 1.1221 +int dv01 = v1 - v0; 1.1222 + 1.1223 + if (dy01!=0) 1.1224 + { 1.1225 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.1226 + lu01 = ((du01<<fp)*pdiv[dy01+2048])>>16; 1.1227 + lv01 = ((dv01<<fp)*pdiv[dy01+2048])>>16; 1.1228 + } 1.1229 + 1.1230 +int dx12 = x2 - x1; 1.1231 +int dy12 = y2 - y1; 1.1232 +int du12 = u2 - u1; 1.1233 +int dv12 = v2 - v1; 1.1234 + 1.1235 + if (dy12!=0) 1.1236 + { 1.1237 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.1238 + lu12 = ((du12<<fp)*pdiv[dy12+2048])>>16; 1.1239 + lv12 = ((dv12<<fp)*pdiv[dy12+2048])>>16; 1.1240 + } 1.1241 + 1.1242 +int dx02 = x2 - x0; 1.1243 +int dy02 = y2 - y0; 1.1244 +int du02 = u2 - u0; 1.1245 +int dv02 = v2 - v0; 1.1246 + 1.1247 + if (dy02!=0) 1.1248 + { 1.1249 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.1250 + lu02 = ((du02<<fp)*pdiv[dy02+2048])>>16; 1.1251 + lv02 = ((dv02<<fp)*pdiv[dy02+2048])>>16; 1.1252 + } 1.1253 + 1.1254 +int vramofs; 1.1255 +int x, y; 1.1256 + 1.1257 +int x01 = x0<<fp; 1.1258 +int x02 = x01; 1.1259 +int u01 = u0<<fp; 1.1260 +int u02 = u01; 1.1261 +int v01 = v0<<fp; 1.1262 +int v02 = v01; 1.1263 + 1.1264 +int du, dv; 1.1265 +int su1, su2; 1.1266 +int sv1, sv2; 1.1267 +int sx1, sx2; 1.1268 + 1.1269 +int px, py; 1.1270 + 1.1271 + int yp = y0 * ScreenWidth; 1.1272 + for (y = y0; y<y1; y++) 1.1273 + { 1.1274 + sx1 = x01>>fp; 1.1275 + sx2 = x02>>fp; 1.1276 + su1 = u01; 1.1277 + su2 = u02; 1.1278 + sv1 = v01; 1.1279 + sv2 = v02; 1.1280 + 1.1281 + if (sx1>sx2) 1.1282 + { 1.1283 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1284 + temp = su1; su1 = su2; su2 = temp; 1.1285 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1286 + } 1.1287 + 1.1288 + if (sx2!=sx1) 1.1289 + { 1.1290 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1291 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1292 + } 1.1293 + 1.1294 + yp+=ScreenWidth; 1.1295 + vramofs = yp + sx1; 1.1296 + for (x = sx1; x<sx2; x++) 1.1297 + { 1.1298 + su1+=du; 1.1299 + sv1+=dv; 1.1300 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.1301 + { 1.1302 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1303 + *(vram+vramofs) = c; 1.1304 + } 1.1305 + vramofs++; 1.1306 + } 1.1307 + x01+=lx01; 1.1308 + x02+=lx02; 1.1309 + u01+=lu01; 1.1310 + u02+=lu02; 1.1311 + v01+=lv01; 1.1312 + v02+=lv02; 1.1313 + } 1.1314 + 1.1315 + x01 = x1<<fp; 1.1316 + u01 = u1<<fp; 1.1317 + v01 = v1<<fp; 1.1318 + 1.1319 + yp = y1 * ScreenWidth; 1.1320 + for (y = y1; y<y2; y++) 1.1321 + { 1.1322 + sx1 = x01>>fp; 1.1323 + sx2 = x02>>fp; 1.1324 + su1 = u01; 1.1325 + su2 = u02; 1.1326 + sv1 = v01; 1.1327 + sv2 = v02; 1.1328 + 1.1329 + if (sx1>sx2) 1.1330 + { 1.1331 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1332 + temp = su1; su1 = su2; su2 = temp; 1.1333 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1334 + } 1.1335 + 1.1336 + if (sx2!=sx1) 1.1337 + { 1.1338 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1339 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1340 + } 1.1341 + 1.1342 + yp+=ScreenWidth; 1.1343 + vramofs = yp + sx1; 1.1344 + for (x = sx1; x<sx2; x++) 1.1345 + { 1.1346 + su1+=du; 1.1347 + sv1+=dv; 1.1348 + if (vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) 1.1349 + { 1.1350 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1351 + *(vram+vramofs) = c; 1.1352 + } 1.1353 + vramofs++; 1.1354 + } 1.1355 + x01+=lx12; 1.1356 + x02+=lx02; 1.1357 + u01+=lu12; 1.1358 + u02+=lu02; 1.1359 + v01+=lv12; 1.1360 + v02+=lv02; 1.1361 + } 1.1362 +} 1.1363 + 1.1364 + 1.1365 +static inline void DrawEnvmappedTriangleZB(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) 1.1366 +{ 1.1367 +int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; 1.1368 +int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; 1.1369 +int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; 1.1370 + 1.1371 +if ((x0<-mlk || x0>ScreenWidth+mlk || y0<-mlk || y0>ScreenHeight+mlk) && 1.1372 + (x1<-mlk || x1>ScreenWidth+mlk || y1<-mlk || y1>ScreenHeight+mlk) && 1.1373 + (x2<-mlk || x2>ScreenWidth+mlk || y2<-mlk || y2>ScreenHeight+mlk)) return; 1.1374 + 1.1375 +int c; 1.1376 + 1.1377 +int u0 = point_tc[poly.p0].u; int v0 = point_tc[poly.p0].v; 1.1378 +int u1 = point_tc[poly.p1].u; int v1 = point_tc[poly.p1].v; 1.1379 +int u2 = point_tc[poly.p2].u; int v2 = point_tc[poly.p2].v; 1.1380 + 1.1381 +int z0 = fpts[poly.p0].z; 1.1382 +int z1 = fpts[poly.p1].z; 1.1383 +int z2 = fpts[poly.p2].z; 1.1384 + 1.1385 +// ===== Sort ===== 1.1386 + 1.1387 +int temp; 1.1388 +if (y1<y0) 1.1389 +{ 1.1390 + temp = u0; u0 = u1; u1 = temp; 1.1391 + temp = v0; v0 = v1; v1 = temp; 1.1392 + temp = z0; z0 = z1; z1 = temp; 1.1393 + temp = x0; x0 = x1; x1 = temp; 1.1394 + temp = y0; y0 = y1; y1 = temp; 1.1395 +} 1.1396 +if (y2<y0) 1.1397 +{ 1.1398 + temp = u0; u0 = u2; u2 = temp; 1.1399 + temp = v0; v0 = v2; v2 = temp; 1.1400 + temp = z0; z0 = z2; z2 = temp; 1.1401 + temp = x0; x0 = x2; x2 = temp; 1.1402 + temp = y0; y0 = y2; y2 = temp; 1.1403 +} 1.1404 +if (y2<y1) 1.1405 +{ 1.1406 + temp = u1; u1 = u2; u2 = temp; 1.1407 + temp = v1; v1 = v2; v2 = temp; 1.1408 + temp = z1; z1 = z2; z2 = temp; 1.1409 + temp = x1; x1 = x2; x2 = temp; 1.1410 + temp = y1; y1 = y2; y2 = temp; 1.1411 +} 1.1412 + 1.1413 +// ===== Interpolation variables ===== 1.1414 + 1.1415 +int n; 1.1416 +int fp = 8; 1.1417 +int lx01=0, lx12=0, lx02=0; 1.1418 +int lu01=0, lu12=0, lu02=0; 1.1419 +int lv01=0, lv12=0, lv02=0; 1.1420 +int lz01=0, lz12=0, lz02=0; 1.1421 + 1.1422 +int dx01 = x1 - x0; 1.1423 +int dy01 = y1 - y0; 1.1424 +int du01 = u1 - u0; 1.1425 +int dv01 = v1 - v0; 1.1426 +int dz01 = z1 - z0; 1.1427 + 1.1428 + if (dy01!=0) 1.1429 + { 1.1430 + lx01 = ((dx01<<fp)*pdiv[dy01+2048])>>16; 1.1431 + lu01 = ((du01<<fp)*pdiv[dy01+2048])>>16; 1.1432 + lv01 = ((dv01<<fp)*pdiv[dy01+2048])>>16; 1.1433 + lz01 = (dz01*pdiv[dy01+2048])>>16; 1.1434 + } 1.1435 + 1.1436 +int dx12 = x2 - x1; 1.1437 +int dy12 = y2 - y1; 1.1438 +int du12 = u2 - u1; 1.1439 +int dv12 = v2 - v1; 1.1440 +int dz12 = z2 - z1; 1.1441 + 1.1442 + if (dy12!=0) 1.1443 + { 1.1444 + lx12 = ((dx12<<fp)*pdiv[dy12+2048])>>16; 1.1445 + lu12 = ((du12<<fp)*pdiv[dy12+2048])>>16; 1.1446 + lv12 = ((dv12<<fp)*pdiv[dy12+2048])>>16; 1.1447 + lz12 = (dz12*pdiv[dy12+2048])>>16; 1.1448 + } 1.1449 + 1.1450 +int dx02 = x2 - x0; 1.1451 +int dy02 = y2 - y0; 1.1452 +int du02 = u2 - u0; 1.1453 +int dv02 = v2 - v0; 1.1454 +int dz02 = z2 - z0; 1.1455 + 1.1456 + if (dy02!=0) 1.1457 + { 1.1458 + lx02 = ((dx02<<fp)*pdiv[dy02+2048])>>16; 1.1459 + lu02 = ((du02<<fp)*pdiv[dy02+2048])>>16; 1.1460 + lv02 = ((dv02<<fp)*pdiv[dy02+2048])>>16; 1.1461 + lz02 = (dz02*pdiv[dy02+2048])>>16; 1.1462 + } 1.1463 + 1.1464 +int vramofs; 1.1465 +int x, y; 1.1466 + 1.1467 +int x01 = x0<<fp; 1.1468 +int x02 = x01; 1.1469 +int u01 = u0<<fp; 1.1470 +int u02 = u01; 1.1471 +int v01 = v0<<fp; 1.1472 +int v02 = v01; 1.1473 +int z01 = z0; 1.1474 +int z02 = z01; 1.1475 + 1.1476 +int du, dv, dz; 1.1477 +int su1, su2; 1.1478 +int sv1, sv2; 1.1479 +int sx1, sx2; 1.1480 +int sz1, sz2; 1.1481 + 1.1482 +int px, py; 1.1483 + 1.1484 + int yp = y0 * ScreenWidth; 1.1485 + for (y = y0; y<y1; y++) 1.1486 + { 1.1487 + sx1 = x01>>fp; 1.1488 + sx2 = x02>>fp; 1.1489 + su1 = u01; 1.1490 + su2 = u02; 1.1491 + sv1 = v01; 1.1492 + sv2 = v02; 1.1493 + sz1 = z01; 1.1494 + sz2 = z02; 1.1495 + 1.1496 + if (sx1>sx2) 1.1497 + { 1.1498 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1499 + temp = su1; su1 = su2; su2 = temp; 1.1500 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1501 + temp = sz1; sz1 = sz2; sz2 = temp; 1.1502 + } 1.1503 + 1.1504 + if (sx2!=sx1) 1.1505 + { 1.1506 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1507 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1508 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.1509 + } 1.1510 + 1.1511 + yp+=ScreenWidth; 1.1512 + vramofs = yp + sx1; 1.1513 + for (x = sx1; x<sx2; x++) 1.1514 + { 1.1515 + su1+=du; 1.1516 + sv1+=dv; 1.1517 + sz1+=dz; 1.1518 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.1519 + { 1.1520 + zbuffer[vramofs] = sz1; 1.1521 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1522 + *(vram+vramofs) = c; 1.1523 + } 1.1524 + vramofs++; 1.1525 + } 1.1526 + x01+=lx01; 1.1527 + x02+=lx02; 1.1528 + u01+=lu01; 1.1529 + u02+=lu02; 1.1530 + v01+=lv01; 1.1531 + v02+=lv02; 1.1532 + z01+=lz01; 1.1533 + z02+=lz02; 1.1534 + } 1.1535 + 1.1536 + x01 = x1<<fp; 1.1537 + u01 = u1<<fp; 1.1538 + v01 = v1<<fp; 1.1539 + z01 = z1; 1.1540 + 1.1541 + yp = y1 * ScreenWidth; 1.1542 + for (y = y1; y<y2; y++) 1.1543 + { 1.1544 + sx1 = x01>>fp; 1.1545 + sx2 = x02>>fp; 1.1546 + su1 = u01; 1.1547 + su2 = u02; 1.1548 + sv1 = v01; 1.1549 + sv2 = v02; 1.1550 + sz1 = z01; 1.1551 + sz2 = z02; 1.1552 + 1.1553 + if (sx1>sx2) 1.1554 + { 1.1555 + temp = sx1; sx1 = sx2; sx2 = temp; 1.1556 + temp = su1; su1 = su2; su2 = temp; 1.1557 + temp = sv1; sv1 = sv2; sv2 = temp; 1.1558 + temp = sz1; sz1 = sz2; sz2 = temp; 1.1559 + } 1.1560 + 1.1561 + if (sx2!=sx1) 1.1562 + { 1.1563 + du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; 1.1564 + dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; 1.1565 + dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; 1.1566 + } 1.1567 + 1.1568 + yp+=ScreenWidth; 1.1569 + vramofs = yp + sx1; 1.1570 + for (x = sx1; x<sx2; x++) 1.1571 + { 1.1572 + su1+=du; 1.1573 + sv1+=dv; 1.1574 + sz1+=dz; 1.1575 + if ((vramofs>=0 && vramofs<ScreenSize && x>=0 && x<ScreenWidth) && sz1<zbuffer[vramofs]) 1.1576 + { 1.1577 + zbuffer[vramofs] = sz1; 1.1578 + c = texture[((su1>>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; 1.1579 + *(vram+vramofs) = c; 1.1580 + } 1.1581 + vramofs++; 1.1582 + } 1.1583 + x01+=lx12; 1.1584 + x02+=lx02; 1.1585 + u01+=lu12; 1.1586 + u02+=lu02; 1.1587 + v01+=lv12; 1.1588 + v02+=lv02; 1.1589 + z01+=lz12; 1.1590 + z02+=lz02; 1.1591 + } 1.1592 +} 1.1593 + 1.1594 +void zsort(int zsortdata[], object3d *obj) 1.1595 +{ 1.1596 + int i, mz; 1.1597 + for (i=0; i<obj->npls; i++) 1.1598 + { 1.1599 + mz = (fpts[obj->poly[i].p0].z + fpts[obj->poly[i].p1].z + fpts[obj->poly[i].p2].z)>>2; 1.1600 + zsortdata[i] = -mz; 1.1601 + swp[i] = i; 1.1602 + } 1.1603 +} 1.1604 + 1.1605 + 1.1606 +inline void ClearZbuffer() 1.1607 +{ 1.1608 + memset(zbuffer, 0xFFFFFF, sizeof(unsigned int) * ScreenSize); 1.1609 +} 1.1610 + 1.1611 +void Render(object3d *obj, unsigned short shade[], unsigned short texture[], unsigned short texture_size, unsigned short *vram) 1.1612 +{ 1.1613 + int i, j; 1.1614 + int vx0, vy0, vx1, vy1, n; 1.1615 + int tu, tv, s; 1.1616 + int texshr = (int)(log(256 / texture_size)/ log(2)); 1.1617 + 1.1618 + int rmode; 1.1619 + if (zb==1 && RenderMode>=FLAT) rmode = RenderMode | ZBUFFER; 1.1620 + else rmode = RenderMode; 1.1621 + 1.1622 + switch (rmode) 1.1623 + { 1.1624 + 1.1625 + case POINTS: 1.1626 + for (i=obj->npts-1; i>=0; i--) 1.1627 + if (spts[i].x>=0 && spts[i].x<ScreenWidth && spts[i].y>=0 && spts[i].y<ScreenHeight) 1.1628 + *(vram + spts[i].x + spts[i].y * ScreenWidth) = 0xFFFF; 1.1629 + break; 1.1630 + 1.1631 + 1.1632 + case WIRE: 1.1633 + for (i=obj->nlns-1; i>=0; i--) 1.1634 + drawline(obj->line[i], vram); 1.1635 + break; 1.1636 + 1.1637 + case FLAT: 1.1638 + rotate3d_normals(obj); 1.1639 + CalcPolyColor(obj); 1.1640 + 1.1641 + zsort (zdata, obj); 1.1642 + quicksort(0, obj->npls - 1, zdata); 1.1643 + 1.1644 + for (i=0; i<obj->npls; i++) 1.1645 + { 1.1646 + j = swp[i]; 1.1647 + vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; 1.1648 + vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; 1.1649 + vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; 1.1650 + vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; 1.1651 + n = vx0 * vy1 - vx1 * vy0; 1.1652 + if (n<0) 1.1653 + { 1.1654 + obj->poly[j].c = spls[j].c; 1.1655 + DrawFlatTriangle(obj->poly[j], vram, shade); 1.1656 + } 1.1657 + } 1.1658 + break; 1.1659 + 1.1660 + case (FLAT | ZBUFFER): 1.1661 + rotate3d_normals(obj); 1.1662 + CalcPolyColor(obj); 1.1663 + 1.1664 + ClearZbuffer(); 1.1665 + for (i=obj->npls-1; i>=0; i--) 1.1666 + { 1.1667 + obj->poly[i].c = spls[i].c; 1.1668 + if (norms[i].z>=0) 1.1669 + DrawFlatTriangleZB(obj->poly[i], vram, shade); 1.1670 + } 1.1671 + break; 1.1672 + 1.1673 + case GOURAUD: 1.1674 + rotate3d_pt_normals(obj); 1.1675 + CalcPointColor(obj); 1.1676 + 1.1677 + zsort (zdata, obj); 1.1678 + quicksort(0, obj->npls - 1, zdata); 1.1679 + 1.1680 + for (i=0; i<obj->npls; i++) 1.1681 + { 1.1682 + j = swp[i]; 1.1683 + vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; 1.1684 + vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; 1.1685 + vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; 1.1686 + vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; 1.1687 + n = vx0 * vy1 - vx1 * vy0; 1.1688 + if (n<0) 1.1689 + DrawGouraudTriangle(obj->poly[j], vram, shade); 1.1690 + } 1.1691 + break; 1.1692 + 1.1693 + case (GOURAUD | ZBUFFER): 1.1694 + rotate3d_normals(obj); 1.1695 + rotate3d_pt_normals(obj); 1.1696 + 1.1697 + CalcPointColor(obj); 1.1698 + ClearZbuffer(); 1.1699 + for (i=obj->npls-1; i>=0; i--) 1.1700 + { 1.1701 + if (norms[i].z>=0) 1.1702 + DrawGouraudTriangleZB(obj->poly[i], vram, shade); 1.1703 + } 1.1704 + break; 1.1705 + 1.1706 + case (TEXTURE): 1.1707 + zsort (zdata, obj); 1.1708 + quicksort(0, obj->npls - 1, zdata); 1.1709 + 1.1710 + for (i=0; i<obj->npls; i++) 1.1711 + { 1.1712 + j = swp[i]; 1.1713 + vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; 1.1714 + vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; 1.1715 + vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; 1.1716 + vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; 1.1717 + n = vx0 * vy1 - vx1 * vy0; 1.1718 + if (n<0) 1.1719 + { 1.1720 + DrawTextureTriangle(obj->poly[j], vram, texshr, texture); 1.1721 + } 1.1722 + } 1.1723 + break; 1.1724 + 1.1725 + case (TEXTURE | ZBUFFER): 1.1726 + rotate3d_normals(obj); 1.1727 + 1.1728 + ClearZbuffer(); 1.1729 + for (i=obj->npls-1; i>=0; i--) 1.1730 + { 1.1731 + if (norms[i].z>=0) 1.1732 + DrawTextureTriangleZB(obj->poly[i], vram, 0, texture); 1.1733 + } 1.1734 + break; 1.1735 + 1.1736 + case (ENVMAP): 1.1737 + rotate3d_pt_normals(obj); 1.1738 + 1.1739 + zsort (zdata, obj); 1.1740 + quicksort(0, obj->npls - 1, zdata); 1.1741 + 1.1742 + for (i=0; i<obj->npts; i++) 1.1743 + { 1.1744 + tu = (pt_norms[i].x>>9) + 127; 1.1745 + tv = (pt_norms[i].y>>9) + 127; 1.1746 + point_tc[i].u = abs(tu) & 255; 1.1747 + point_tc[i].v = abs(tv) & 255; 1.1748 + } 1.1749 + 1.1750 + for (i=0; i<obj->npls; i++) 1.1751 + { 1.1752 + j = swp[i]; 1.1753 + vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; 1.1754 + vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; 1.1755 + vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; 1.1756 + vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; 1.1757 + n = vx0 * vy1 - vx1 * vy0; 1.1758 + if (n<0) 1.1759 + DrawEnvmappedTriangle(obj->poly[j], vram, texshr, texture); 1.1760 + } 1.1761 + break; 1.1762 + 1.1763 + case (ENVMAP | ZBUFFER): 1.1764 + rotate3d_normals(obj); 1.1765 + rotate3d_pt_normals(obj); 1.1766 + 1.1767 + ClearZbuffer(); 1.1768 + for (i=obj->npts-1; i>=0; i--) 1.1769 + { 1.1770 + tu = (pt_norms[i].x>>9) + 127; 1.1771 + tv = (pt_norms[i].y>>9) + 127; 1.1772 + point_tc[i].u = abs(tu) & 255; 1.1773 + point_tc[i].v = abs(tv) & 255; 1.1774 + } 1.1775 + 1.1776 + 1.1777 + for (i=obj->npls-1; i>=0; i--) 1.1778 + { 1.1779 + if (norms[i].z>=0) 1.1780 + DrawEnvmappedTriangleZB(obj->poly[i], vram, 2, texture); 1.1781 + } 1.1782 + break; 1.1783 + 1.1784 + default: 1.1785 + break; 1.1786 + } 1.1787 + 1.1788 +}