?? engine.c
字號:
/* * "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman * Ken Silverman's official web site: "http://www.advsys.net/ken" * See the included license file "BUILDLIC.TXT" for license info. * This file has been modified from Ken Silverman's original release *//* SUPERBUILD define is in engine.h ... */#define ENGINE/* set this to something non-zero to get loadtile() debugging info on stderr. */#define BUILD_CACHEDEBUG 0#include <string.h>#include <malloc.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#if (defined USE_OPENGL)#include "buildgl.h"#endif#include "pragmas.h"#include "platform.h"#include "build.h"#include "cache1d.h"#include "engine.h"long stereowidth = 23040, stereopixelwidth = 28, ostereopixelwidth = -1;volatile long stereomode = 0, visualpage, activepage, whiteband, blackband;volatile char oa1, o3c2, ortca, ortcb, overtbits, laststereoint;#include "display.h"#define MAXCLIPNUM 512#define MAXPERMS 512#define MAXTILEFILES 256#define MAXYSAVES ((MAXXDIM*MAXSPRITES)>>7)#define MAXNODESPERLINE 42 /* Warning: This depends on MAXYSAVES & MAXYDIM! */#define MAXWALLSB 2048#define MAXCLIPDIST 1024#ifdef PLATFORM_DOS /* MUST CALL MALLOC THIS WAY TO FORCE CALLS TO KMALLOC! */void *kmalloc(size_t size) { return(malloc(size)); }void *kkmalloc(size_t size);#pragma aux kkmalloc =\ "call kmalloc",\ parm [eax]\ /* MUST CALL FREE THIS WAY TO FORCE CALLS TO KFREE! */void kfree(void *buffer) { free(buffer); }void kkfree(void *buffer);#pragma aux kkfree =\ "call kfree",\ parm [eax]\#endif#ifdef SUPERBUILD /* MUST CALL LOADVOXEL THIS WAY BECAUSE WATCOM STINKS! *//* !!! wtf does this do?! --ryan. */static void loadvoxel(long voxindex){ voxindex = 0; /* prevent compiler whining. */}#if ((defined __WATCOMC__) && (defined PLATFORM_DOS))void kloadvoxel(long voxindex);#pragma aux kloadvoxel =\ "call loadvoxel",\ parm [eax]\#else#define kloadvoxel(a) (loadvoxel(a))#endif /* These variables need to be copied into BUILD */#define MAXXSIZ 128#define MAXYSIZ 128#define MAXZSIZ 200#define MAXVOXELS 512#define MAXVOXMIPS 5long voxoff[MAXVOXELS][MAXVOXMIPS], voxlock[MAXVOXELS][MAXVOXMIPS];static long ggxinc[MAXXSIZ+1], ggyinc[MAXXSIZ+1];static long lowrecip[1024], nytooclose, nytoofar;static unsigned long distrecip[16384];#endif/* used to be static. --ryan. */char moustat = 0;long transarea = 0, totalarea = 0, beforedrawrooms = 1;/* used to be static. --ryan. */long oxdimen = -1, oviewingrange = -1, oxyaspect = -1;/* used to be static. --ryan. */long curbrightness = 0; /* Textured Map variables */static char globalpolytype;static short *dotp1[MAXYDIM], *dotp2[MAXYDIM];static unsigned char tempbuf[MAXWALLS];long ebpbak, espbak;long slopalookup[2048];/* * !!! used to be static. If we ever put the original setgamemode() back, this * !!! can be made static again. --ryan. */unsigned char permanentlock = 255;long artversion, mapversion;char *pic = NULL;char picsiz[MAXTILES], tilefilenum[MAXTILES];long lastageclock;long tilefileoffs[MAXTILES];long artsize = 0, cachesize = 0;static short radarang[1280], radarang2[MAXXDIM];static unsigned short sqrtable[4096], shlookup[4096+256];char pow2char[8] = {1,2,4,8,16,32,64,-128};long pow2long[32] ={ 1L,2L,4L,8L, 16L,32L,64L,128L, 256L,512L,1024L,2048L, 4096L,8192L,16384L,32768L, 65536L,131072L,262144L,524288L, 1048576L,2097152L,4194304L,8388608L, 16777216L,33554432L,67108864L,134217728L, 268435456L,536870912L,1073741824L,2147483647L,};long reciptable[2048], fpuasm;char kensmessage[128];/* rcg02132001 Cygwin support. */#if (defined C_IDENTIFIERS_UNDERSCORED)#define SYM_sqrtable "_sqrtable"#define SYM_walock "_walock"#define SYM_shlookup "_shlookup"#define SYM_pow2char "_pow2char"#define SYM_gotpic "_gotpic"#define SYM_dmval "_dmval"#else#define SYM_sqrtable "sqrtable"#define SYM_walock "walock"#define SYM_shlookup "shlookup"#define SYM_pow2char "pow2char"#define SYM_gotpic "gotpic"#define SYM_dmval "dmval"#endifchar britable[16][64];char textfont[1024], smalltextfont[1024];static long xb1[MAXWALLSB], yb1[MAXWALLSB], xb2[MAXWALLSB], yb2[MAXWALLSB];static long rx1[MAXWALLSB], ry1[MAXWALLSB], rx2[MAXWALLSB], ry2[MAXWALLSB];static short p2[MAXWALLSB], thesector[MAXWALLSB], thewall[MAXWALLSB];static short bunchfirst[MAXWALLSB], bunchlast[MAXWALLSB];static short smost[MAXYSAVES], smostcnt;static short smoststart[MAXWALLSB];static char smostwalltype[MAXWALLSB];static long smostwall[MAXWALLSB], smostwallcnt = -1L;static short maskwall[MAXWALLSB], maskwallcnt;static long spritesx[MAXSPRITESONSCREEN];static long spritesy[MAXSPRITESONSCREEN+1];static long spritesz[MAXSPRITESONSCREEN];static spritetype *tspriteptr[MAXSPRITESONSCREEN];short umost[MAXXDIM], dmost[MAXXDIM];static short bakumost[MAXXDIM], bakdmost[MAXXDIM];short uplc[MAXXDIM], dplc[MAXXDIM];static short uwall[MAXXDIM], dwall[MAXXDIM];static long swplc[MAXXDIM], lplc[MAXXDIM];static long swall[MAXXDIM], lwall[MAXXDIM+4];long xdimen = -1, xdimenrecip, halfxdimen, xdimenscale, xdimscale;long wx1, wy1, wx2, wy2, ydimen;long viewoffset, frameoffset;static long rxi[8], ryi[8], rzi[8], rxi2[8], ryi2[8], rzi2[8];static long xsi[8], ysi[8];/* used to be static. --ryan. */long *horizlookup, *horizlookup2, horizycent;long globalposx, globalposy, globalposz, globalhoriz;short globalang, globalcursectnum;long globalpal, cosglobalang, singlobalang;long cosviewingrangeglobalang, sinviewingrangeglobalang;char *globalpalwritten;long globaluclip, globaldclip, globvis;long globalvisibility, globalhisibility, globalpisibility, globalcisibility;char globparaceilclip, globparaflorclip;long xyaspect, viewingrangerecip;long asm1, asm2, asm3, asm4;long vplce[4], vince[4], palookupoffse[4], bufplce[4];char globalxshift, globalyshift;long globalxpanning, globalypanning, globalshade;short globalpicnum, globalshiftval;long globalzd, globalbufplc, globalyscale, globalorientation;long globalx1, globaly1, globalx2, globaly2, globalx3, globaly3, globalzx;long globalx, globaly, globalz;static short sectorborder[256], sectorbordercnt;static char tablesloaded = 0;long pageoffset, ydim16, qsetmode = 0;long startposx, startposy, startposz;short startang, startsectnum;short pointhighlight, linehighlight, highlightcnt;static long lastx[MAXYDIM];char *transluc = NULL, paletteloaded = 0;#define FASTPALGRIDSIZ 8static long rdist[129], gdist[129], bdist[129];static char colhere[((FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2))>>3];static char colhead[(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)];static long colnext[256];static char coldist[8] = {0,1,2,3,4,3,2,1};static long colscan[27];static short clipnum, hitwalls[4];long hitscangoalx = (1<<29)-1, hitscangoaly = (1<<29)-1;typedef struct { long x1, y1, x2, y2; } linetype;static linetype clipit[MAXCLIPNUM];static short clipsectorlist[MAXCLIPNUM], clipsectnum;static short clipobjectval[MAXCLIPNUM];typedef struct{ long sx, sy, z; short a, picnum; signed char dashade; unsigned char dapalnum, dastat, pagesleft; long cx1, cy1, cx2, cy2;} permfifotype;static permfifotype permfifo[MAXPERMS];static long permhead = 0, permtail = 0;short numscans, numhits, numbunches;short editstatus = 0;short searchit;long searchx = -1, searchy; /* search input */short searchsector, searchwall, searchstat; /* search output */static char artfilename[20];static long numtilefiles, artfil = -1, artfilnum, artfilplc;static char inpreparemirror = 0;static long mirrorsx1, mirrorsy1, mirrorsx2, mirrorsy2;long totalclocklock;/* !!! can we move this somewhere? --ryan. */#if ((defined USE_I386_ASM) && (defined __WATCOMC__))extern long mmxoverlay();#pragma aux mmxoverlay modify [eax ebx ecx edx];extern long sethlinesizes(long,long,long);#pragma aux sethlinesizes parm [eax][ebx][ecx];extern long setpalookupaddress(char *);#pragma aux setpalookupaddress parm [eax];extern long setuphlineasm4(long,long);#pragma aux setuphlineasm4 parm [eax][ebx];extern long hlineasm4(long,long,long,long,long,long);#pragma aux hlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setuprhlineasm4(long,long,long,long,long,long);#pragma aux setuprhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long rhlineasm4(long,long,long,long,long,long);#pragma aux rhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setuprmhlineasm4(long,long,long,long,long,long);#pragma aux setuprmhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long rmhlineasm4(long,long,long,long,long,long);#pragma aux rmhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setupqrhlineasm4(long,long,long,long,long,long);#pragma aux setupqrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long qrhlineasm4(long,long,long,long,long,long);#pragma aux qrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setvlinebpl(long);#pragma aux setvlinebpl parm [eax];extern long fixtransluscence(long);#pragma aux fixtransluscence parm [eax];extern long prevlineasm1(long,long,long,long,long,long);#pragma aux prevlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long vlineasm1(long,long,long,long,long,long);#pragma aux vlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setuptvlineasm(long);#pragma aux setuptvlineasm parm [eax];extern long tvlineasm1(long,long,long,long,long,long);#pragma aux tvlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setuptvlineasm2(long,long,long);#pragma aux setuptvlineasm2 parm [eax][ebx][ecx];extern long tvlineasm2(long,long,long,long,long,long);#pragma aux tvlineasm2 parm [eax][ebx][ecx][edx][esi][edi];extern long mvlineasm1(long,long,long,long,long,long);#pragma aux mvlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setupvlineasm(long);#pragma aux setupvlineasm parm [eax];extern long vlineasm4(long,long);#pragma aux vlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi];extern long setupmvlineasm(long);#pragma aux setupmvlineasm parm [eax];extern long mvlineasm4(long,long);#pragma aux mvlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi];extern void setupspritevline(long,long,long,long,long,long);#pragma aux setupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void spritevline(long,long,long,long,long,long);#pragma aux spritevline parm [eax][ebx][ecx][edx][esi][edi];extern void msetupspritevline(long,long,long,long,long,long);#pragma aux msetupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void mspritevline(long,long,long,long,long,long);#pragma aux mspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void tsetupspritevline(long,long,long,long,long,long);#pragma aux tsetupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void tspritevline(long,long,long,long,long,long);#pragma aux tspritevline parm [eax][ebx][ecx][edx][esi][edi];extern long mhline(long,long,long,long,long,long);#pragma aux mhline parm [eax][ebx][ecx][edx][esi][edi];extern long mhlineskipmodify(long,long,long,long,long,long);#pragma aux mhlineskipmodify parm [eax][ebx][ecx][edx][esi][edi];extern long msethlineshift(long,long);#pragma aux msethlineshift parm [eax][ebx];extern long thline(long,long,long,long,long,long);#pragma aux thline parm [eax][ebx][ecx][edx][esi][edi];extern long thlineskipmodify(long,long,long,long,long,long);#pragma aux thlineskipmodify parm [eax][ebx][ecx][edx][esi][edi];extern long tsethlineshift(long,long);#pragma aux tsethlineshift parm [eax][ebx];extern long setupslopevlin(long,long,long);#pragma aux setupslopevlin parm [eax][ebx][ecx] modify [edx];extern long slopevlin(long,long,long,long,long,long);#pragma aux slopevlin parm [eax][ebx][ecx][edx][esi][edi];extern long settransnormal();#pragma aux settransnormal parm;extern long settransreverse();#pragma aux settransreverse parm;extern long setupdrawslab(long,long);#pragma aux setupdrawslab parm [eax][ebx];extern long drawslab(long,long,long,long,long,long);#pragma aux drawslab parm [eax][ebx][ecx][edx][esi][edi];#else#include "a.h"#endif#if (defined USE_I386_ASM) #if (defined __WATCOMC__) long nsqrtasm(int param); #pragma aux nsqrtasm =\ "test eax, 0xff000000",\ "mov ebx, eax",\ "jnz short over24",\ "shr ebx, 12",\ "mov cx, word ptr shlookup[ebx*2]",\ "jmp short under24",\ "over24: shr ebx, 24",\ "mov cx, word ptr shlookup[ebx*2+8192]",\ "under24: shr eax, cl",\ "mov cl, ch",\ "mov ax, word ptr sqrtable[eax*2]",\ "shr eax, cl",\ parm nomemory [eax]\ modify exact [eax ebx ecx]\ #elif (defined __GNUC__) static long nsqrtasm(int i1) { long retval; __asm__ __volatile__ ( "\n\t" "testl $0xff000000, %%eax\n\t" "movl %%eax, %%ebx\n\t" "jnz nsqrover24\n\t" "shrl $12, %%ebx\n\t" "movw " SYM_shlookup "(, %%ebx, 2), %%cx\n\t" "jmp nsqrunder24\n\t" "nsqrover24: shr $24, %%ebx\n\t" "movw (" SYM_shlookup "+ 8192)(, %%ebx, 2), %%cx\n\t" "nsqrunder24: shrl %%cl, %%eax\n\t" "movb %%ch, %%cl\n\t" "movw " SYM_sqrtable "(, %%eax, 2), %%ax\n\t" "shrl %%cl, %%eax\n\t" : "=a" (retval) : "a" (i1) : "ebx", "ecx", "cc"); return(retval); } /* nsqrtasm */ #else #error Please write Assembly code for your platform! #endif#else /* !defined USE_I386_ASM */ static long nsqrtasm(long eax) { return((long) sqrt(eax)); /* !!! this might be wrong, due to precision issues. */ } /* nsqrtasm */#endif /* defined USE_I386_ASM */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -