SecondReality/PLZPART/PLZFILL.C
2017-09-24 01:45:36 +02:00

186 lines
5.3 KiB
C

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include "tweak.h"
extern far do_line(char far *to, int dx, int dy, int cnt, char far *from, long txx1, long txy1, long txx2, long txy2, int dseg);
extern far do_block(int ycnt);
extern far do_clear(char far *vmem, int far *otau, int far *ntau);
extern int acstau[256];
int sini[2000];
char (* far vmem)[160]=MK_FP(0x0a000,0);
extern char far kuva1[128][256];
extern char far kuva2[128][256];
extern char far kuva3[128][256];
extern char far dist1[128][256];
char far buu[1000];
char sinx[128], siny[128];
char pal[768];
int clrtau[8][256][2];
int clrptr=0;
initvect() {
int a,b,x,y,s,d=0,p=0,ch;
for(a=0;a<1524;a++)
{
sini[a]=s=sin(a/1024.0*M_PI*4)*127;
s-=sini[a];
}
/* for(a=0;a<65;a++) for(b=0;b<256;b++) // chessboard
{ x=1; if((a>>4)&1) x^=3; if((b>>5)&1) x^=3; kuva[a][b]=x; }
pal[0*192+3*1]=pal[0*192+3*1+1]=pal[0*192+3*1+2]=40;
pal[0*192+3*2]=pal[0*192+3*2+1]=pal[0*192+3*2+2]=60;
*/
for(a=1;a<32;a++) // must-sini-valk
{ pal[0*192+a*3]=0; pal[0*192+a*3+1]=0; pal[0*192+a*3+2]=a*2; }
for(a=0;a<32;a++)
{ pal[0*192+a*3+32*3]=a*2; pal[0*192+a*3+1+32*3]=a*2; pal[0*192+a*3+2+32*3]=63; }
for(a=0;a<32;a++) // must-pun-kelt
{ pal[1*192+a*3]=a*2; pal[1*192+a*3+1]=0; pal[1*192+a*3+2]=0; }
for(a=0;a<32;a++)
{ pal[1*192+a*3+32*3]=63; pal[1*192+a*3+1+32*3]=a*2; pal[1*192+a*3+2+32*3]=0; }
for(a=0;a<32;a++) // must-orans-viol
{ pal[2*192+a*3]=a; pal[2*192+a*3+1]=0; pal[2*192+a*3+2]=a*2/3; }
for(a=0;a<32;a++)
{ pal[2*192+a*3+32*3]=31-a; pal[2*192+a*3+1+32*3]=a*2; pal[2*192+a*3+2+32*3]=21; }
for(y=0;y<64;y++) for(x=0;x<256;x++)
{
kuva1[y][x]=sini[(y*4+sini[x*2])&511]/4+32;
kuva2[y][x]=sini[(y*4+sini[x*2])&511]/4+32+64;
kuva3[y][x]=sini[(y*4+sini[x*2])&511]/4+32+128;
}
for(y=0;y<128;y++) for(x=0;x<256;x++)
dist1[y][x]=sini[y*8]/3;
for(a=0;a<8*256;a++) { clrtau[0][a][0]=640; clrtau[0][a][1]=0; }
}
extern far char * to;
extern far char * from;
extern far int * ctau;
extern far int dseg;
extern far int xx, yy;
extern far long ay1,ay2,ax1,ax2,xx1,yy1,xx2,yy2;
extern far long txx1,txy1,tay1,tax1;
extern far long txx2,txy2,tay2,tax2;
int kuvataus[]={FP_SEG(kuva1),FP_SEG(kuva2),FP_SEG(kuva3),FP_SEG(kuva1)};
int disttaus[]={FP_SEG(dist1),FP_SEG(dist1),FP_SEG(dist1),FP_SEG(dist1)};
do_poly(x1,y1,x2,y2,x3,y3,x4,y4,color, dd)
int x1,y1,x2,y2,x3,y3,x4,y4,color, dd;
{
int a,b,c,d,n=0,m,s1,s2,d1,d2,dx1,dy1,dx2,dy2;
struct points {
int x,y; } pnts[4],txt[4]={{64,4},{190,4},{190,60},{64,60}};
// int x,y; } pnts[4],txt[4]={{1,1},{63,1},{63,63},{1,63}};
dd=(dd+1)&63;
pnts[0].x=x1; pnts[0].y=y1;
pnts[1].x=x2; pnts[1].y=y2;
pnts[2].x=x3; pnts[2].y=y3;
pnts[3].x=x4; pnts[3].y=y4;
for(n=0,a=1;a<4;a++) if(pnts[a].y<pnts[n].y) n=a;
s1=n; s2=n; d1=(s1+1)&3; d2=(s2-1)&3;
dx1=pnts[d1].x-pnts[s1].x;
dy1=pnts[d1].y-pnts[s1].y; if(dy1==0) dy1++;
ax1=65536L*dx1/dy1;
xx1=((long)pnts[s1].x<<16)+0x8000L;
txx1=((long)txt[s1].x<<16)+0x8000L;
txy1=((long)txt[s1].y<<16)+0x8000L;
tax1=65536L*(txt[d1].x-txt[s1].x)/dy1;
tay1=65536L*(txt[d1].y-txt[s1].y)/dy1;
dx2=pnts[d2].x-pnts[s2].x;
dy2=pnts[d2].y-pnts[s2].y; if(dy2==0) dy2++;
ax2=65536L*dx2/dy2;
xx2=((long)pnts[s2].x<<16)+0x8000L;
txx2=((long)txt[s2].x<<16)+0x8000L;
txy2=((long)txt[s2].y<<16)+0x8000L;
tax2=65536L*(txt[d2].x-txt[s2].x)/dy2;
tay2=65536L*(txt[d2].y-txt[s2].y)/dy2;
yy=(long)pnts[s1].y;
from=MK_FP(kuvataus[color],0);
to=vmem[yy]; // initialize gfx pointers
dseg=disttaus[color]+dd*16;
ctau=&clrtau[clrptr][yy];
for(n=0;n<4;)
{
if(pnts[d1].y<pnts[d2].y) m=pnts[d1].y; else m=pnts[d2].y;
do_block(m-yy); yy=m;
if(pnts[d1].y==pnts[d2].y)
{
s1=d1; d1=(s1+1)&3;
s2=d2; d2=(s2-1)&3; n+=2;
dx1=pnts[d1].x-pnts[s1].x;
dy1=pnts[d1].y-pnts[s1].y; if(dy1==0) dy1++;
ax1=65536L*dx1/dy1;
xx1=((long)pnts[s1].x<<16)+0x8000L;
txx1=((long)txt[s1].x<<16)+0x8000L;
txy1=((long)txt[s1].y<<16)+0x8000L;
tax1=65536L*(txt[d1].x-txt[s1].x)/dy1;
tay1=65536L*(txt[d1].y-txt[s1].y)/dy1;
dx2=pnts[d2].x-pnts[s2].x;
dy2=pnts[d2].y-pnts[s2].y; if(dy2==0) dy2++;
ax2=65536L*dx2/dy2;
xx2=((long)pnts[s2].x<<16)+0x8000L;
txx2=((long)txt[s2].x<<16)+0x8000L;
txy2=((long)txt[s2].y<<16)+0x8000L;
tax2=65536L*(txt[d2].x-txt[s2].x)/dy2;
tay2=65536L*(txt[d2].y-txt[s2].y)/dy2;
}
else if(pnts[d1].y<pnts[d2].y)
{
s1=d1; d1=(s1+1)&3; n++;
dx1=pnts[d1].x-pnts[s1].x;
dy1=pnts[d1].y-pnts[s1].y; if(dy1==0) dy1++;
ax1=65536L*dx1/dy1;
xx1=((long)pnts[s1].x<<16)+0x8000L;
txx1=((long)txt[s1].x<<16)+0x8000L;
txy1=((long)txt[s1].y<<16)+0x8000L;
tax1=65536L*(txt[d1].x-txt[s1].x)/dy1;
tay1=65536L*(txt[d1].y-txt[s1].y)/dy1;
}
else {
s2=d2; d2=(s2-1)&3; n++;
dx2=pnts[d2].x-pnts[s2].x;
dy2=pnts[d2].y-pnts[s2].y; if(dy2==0) dy2++;
ax2=65536L*dx2/dy2;
xx2=((long)pnts[s2].x<<16)+0x8000L;
txx2=((long)txt[s2].x<<16)+0x8000L;
txy2=((long)txt[s2].y<<16)+0x8000L;
tax2=65536L*(txt[d2].x-txt[s2].x)/dy2;
tay2=65536L*(txt[d2].y-txt[s2].y)/dy2;
}
}
}
clear()
{
int *otau=clrtau[(clrptr-3)&7], *ntau=clrtau[clrptr];
clrptr=(clrptr+1)&7;
do_clear(vmem[0],otau,ntau);
}