home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HOT Scene Stuff
/
hotscenestuffzyklop1996.iso
/
demos
/
sunknown
/
zoom.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-07
|
10KB
|
532 lines
// ZOOM.CPP /////////////////////////////////////////////////////////////////
// Thomas H.
// INCLUDES /////////////////////////////////////////////////////////////////
#include <alloc.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#include "stdio.h"
#include "timer.h"
#include "xgraf.h"
#include "vx.h"
#include "seg.h"
// DEFINES /////////////////////////////////////////////////////////////////
#define HITIT 69050
#define MAXFRAMES 1564
#define FRAMES 34
#define EXT 192
#define ROUGHSPLITS 12
#define FRACX 0
#define FRACY 0
#define RGBR 3
#define RGBG 2
#define RGBB 6
// EXTERNALS ////////////////////////////////////////////////////////////////
// FUNCTIONS
extern "C" void asmzoom(void);
extern void newhandler(void);
// VARS
extern ulong musicstart;
extern long far copper_32,
plustimer;
extern timer_C timer;
extern vx_C vx;
extern byte *pressed,
rgb[];
extern long far farfrac1, far farfrac2, far fartwist;
extern word far fartune;
extern int far shx,
far shy,
far sdx,
far sdy,
far khx,
far khy,
far kdx,
far kdy;
// VARS /////////////////////////////////////////////////////////////////////
word zoomvramptr=0xa000;
static byte *bitdata[FRAMES-1],
*frac1b,
*frac2b,
*frac3b,
*frac1,
*frac2,
*frac3;
word datalengths[FRAMES-1];
word innerlen,
innerleft,
innertop,
innerfac,
inneradr,
farfac;
byte startx,
starty,
nearstartx,
nearstarty,
*globalbmp,
*datas,
datamask,
lastpopped;
int csdata=0;
// FUNCTIONS ////////////////////////////////////////////////////////////////
// SETZCOLORS
void setzcolors(void)
{
for (int count=1; count<256; count++)
{
float r=sin(count*0.5*RGBR*2*M_PI/256);
float g=sin(count*0.5*RGBG*2*M_PI/256);
float b=sin(count*0.5*RGBB*2*M_PI/256);
r=fabs(r)*63;
g=fabs(g)*63;
b=fabs(b)*63;
vx.setrgb(count,r,g,b);
}
}
// ROUGHSPLIT
void roughsplit(byte *from, byte *to,word stripno)
{
long from_ptr=(long)from;
long to_ptr=(long)to;
to_ptr+=256*stripno*(EXT/ROUGHSPLITS);
from_ptr+=(EXT/4)+(EXT/4)*256+(256*stripno*(EXT/ROUGHSPLITS)/2);
asm pusha
asm push ds
asm cld
asm les di,to_ptr
asm lds si,from_ptr
asm mov bx,es
asm mov ch,(EXT/ROUGHSPLITS)/2
nextline:
asm mov cl,EXT/2
nextpixel:
asm mov al,[si]
asm inc si
asm mov ah,al
asm mov [es:di+256],ax
asm mov [es:di],ax
asm inc di
asm inc di
asm dec cl
asm jnz nextpixel
asm add di,EXT+128
asm add si,EXT/2+64
asm dec ch
asm jnz nextline
asm pop ds
asm popa
}
// POPBIT
byte _fastcall popbit(void)
{
asm les bx,dword ptr datas
asm mov al,[es:bx]
asm and al,datamask
asm shr datamask,1
asm jnc ok
asm mov datamask,128
asm inc word ptr datas
ok:
return _AL; // Return value already in AL
}
// CTEST
void near _pascal ctest(int x,int y,byte len)
{
#ifdef NOTUNE
return;
#endif
static byte p,fac;
int yy,xx;
asm les bx,dword ptr datas
asm mov yy,2
newx:
asm mov xx,2
nextx:
asm les bx,dword ptr datas
asm mov al,[es:bx]
asm and al,datamask
asm shr datamask,1
asm jnc ok
asm mov datamask,128
asm inc word ptr datas
ok:
asm and al,al
asm jnz doit
goto staylow;
doit:
if (len>2)
{
static word nx,ny;
word len2=len;
len2>>=1;
nx=0;
ny=0;
if (xx==1)
nx=len2;
if (yy==1)
ny=len2;
ctest(x+nx,y+ny,len2);
}
else
{
byte color=0;
asm les bx,dword ptr datas
asm mov al,[es:bx]
asm and al,datamask
asm shr datamask,1
asm jnc againok
asm mov datamask,128
asm inc word ptr datas
againok:
asm and al,al
asm jz notvip
if (popbit())
color=1;
else
color=-1;
goto vipdone;
notvip:
color=0;
p=popbit();
fac=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (p)
color+=2;
else
{
color+=247;
if (color==247)
{
fac=1;
color=0;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
if (popbit()) color+=fac; fac<<=1;
}
}
vipdone:
globalbmp[(x+2-xx)+((y+2-yy)<<8)]+=color;
}
staylow:
asm dec xx
asm jz xdone
asm jmp nextx
xdone:
asm dec yy
asm jz ydone
asm jmp newx
ydone:
}
// FINEMASK
void finemask(byte *bits,byte *bmp,word no)
{
static long bit_ptr;
bit_ptr=(long)bits;
if (!no)
datas=(byte *)bit_ptr;
globalbmp=bmp;
datamask=128;
ctest((no%6)*(EXT/6),(no/6)*(EXT/6),(EXT/6));
while (datamask<0x80)
popbit();
}
// CONV
word conv(int x,int y,int tune)
{
float fx,fy;
float nearmov=tune/48.0;
float mov=nearmov/2;
fx=x-FRACX-EXT/2;
fy=y-FRACY-EXT/2;
fx/=EXT/2.0;
fy/=EXT/2.0;
float fxx=fx*(EXT/2)*(1-mov)+EXT/2;
float fyy=fy*(EXT/2)*(1-mov)+EXT/2;
int xxx=fxx;
int yyy=fyy;
fxx-=xxx;
fyy-=yyy;
startx=255.99*fxx;
starty=255.99*fyy;
farfac=255.99*(1-mov);
return yyy+EXT*xxx;
}
// SETZOOM
void setzoom(int zfac)
{
if (!zfac)
{
innerleft=FRACX+EXT/4;
innertop=FRACY+EXT/4;
innerlen=EXT/2+1;
innerfac=255;
return;
}
float mov=zfac/48.0;
float innerlenf=EXT/(2.0-mov);
innerlen=innerlenf;
float realinnerleft=FRACX+EXT/2-innerlen/2;
float realinnertop=FRACY+EXT/2-innerlen/2;
innertop=realinnertop;
innerleft=realinnerleft;
realinnerleft-=innerleft;
realinnertop-=innertop;
nearstartx=0;
nearstarty=0;
inneradr=innerleft+80*innertop;
innerfac=255*(2.0-mov);
innerfac-=256;
}
// DRAWZOOM
void drawzoom(long frac2,long frac1,int tune1)
{
float v=v=M_PI*tune1/96.0;
tune1%=48;
float fac=1.0/(2-tune1/48.0);
float si=sin(v);
float co=cos(v);
float fdx=-256*si/fac;
float fdy=256*co/fac;
sdx=fdx;
sdy=fdy;
kdx=fdx/2;
kdy=fdy/2;
shx=(256*96-128)-80*fdy-60*fdx;
shy=(256*96-128)+80*fdx-60*fdy;
khx=(256*96-128)-40*fdy-30*fdx;
khy=(256*96-128)+40*fdx-30*fdy;
if (tune1>45)
tune1=45;
asm pusha
asm push ds
farfrac1=frac1;
farfrac2=frac2;
fartune=tune1;
asm mov ax,zoomvramptr
asm mov es,ax
asmzoom();
asm pop ds
asm popa
}
// SETUPZOOMPAGE
void setupzoompage(void)
{
vx.blockfill(0,30000,0);
vx.blockfill(30000,65535,0);
vx.setoffset(0);
}
// ZOOM
// frac1=closest, center of picture
// frac2=coming up, closest next time
// frac3=under construction
void zoom(void)
{
outport(0x3d4,0x4309);
seg_C s1(EXT*256l);
seg_C s2(EXT*256l);
seg_C s3(EXT*256l);
frac1=s1.ptr;
frac2=s2.ptr;
frac3=s3.ptr;
FILE *infile=fopen(FRACTWIST,"rb");
byte *fa=(byte*)fartwist;
for (int count=0; count<14720; count++)
{
byte temp;
fread(&temp,1,1,infile);
*(fa++)=temp;
}
fclose(infile);
setupzoompage();
for (word bl=0; bl<EXT*256l; bl++)
frac1[bl]=frac2[bl]=frac3[bl]=0;
setpalette(ZOOMPAL);
FILE *f3;
f3=fopen(FRACFILE6,"rb");
for (int xx=0; xx<192; xx++)
for (int yy=0; yy<192; yy++)
{
byte temp;
fread(&temp,1,1,f3);
frac1[xx+256l*yy]=temp;
}
fclose(f3);
f3=fopen(FRACFILE7,"rb");
fread(datalengths,2,FRAMES-1,f3);
long sum=0;
long forrigepos;
FILE *o05=fopen(FRACFILE5,"rb");
for (int su=0; su<FRAMES-1; su++)
{
forrigepos=sum;
sum+=datalengths[su]+32;
word len;
byte *temp;
if (sum<3l*96l*128l)
{
temp=(byte*)(copper_32+forrigepos);
csdata++;
len=datalengths[su];
}
else
temp=(byte *)farmalloc((len=datalengths[su])+32);
if (!temp)
newhandler();
fread(temp,1,len,o05);
bitdata[su]=temp;
}
fclose(o05);
long estart,saalangt;
byte *fixfirst=bitdata[0];
long left;
float per;
for (int t=0; t<48; t++)
{
if (t<12)
roughsplit(frac1,frac2,t);
else
finemask(fixfirst,frac2,t-12);
}
long akkurat;
long fno=0;
float hitto=HITIT;
for (int runde=0; runde<FRAMES-1; runde++)
{
byte *thisjust=bitdata[runde+1];
for (int tune=0; tune<48; tune++)
{
fno++;
if (tune<12)
roughsplit(frac2,frac3,tune);
else
if (runde<FRAMES)
finemask(thisjust,frac3,tune-12);
setzoom(tune);
if (!(runde+tune))
{
vx.setoffset((zoomvramptr-0xa000+1200)*16);
drawzoom((long)frac1,(long)frac2,tune+48*runde);
switchpage(0xa000,0xa000+1200,0);
}
else
{
if (!runde && tune==1)
{
long now,gone;
do
{
now=timer.readtimer();
gone=timer.elapsed(musicstart,now);
} while (gone<HITIT);
per=(END_FRACT-HITIT)/((float)MAXFRAMES);
}
drawzoom((long)frac1,(long)frac2,tune+48*runde);
}
vx.setoffset((zoomvramptr-0xa000)*16);
zoomvramptr+=1200;
if (zoomvramptr==0xa000+3600)
zoomvramptr=0xa000;
while ((akkurat=timer.elapsed(musicstart,timer.readtimer()))<hitto);
hitto+=per;
if (akkurat>END_FRACT)
{
modex();
goto nomore;
}
if (fno>=MAXFRAMES)
goto nomore;
}
byte *temp=frac3;
frac3=frac1;
frac1=frac2;
frac2=temp;
}
nomore:
for (int fr=0; fr<FRAMES-1; fr++)
{
byte *temp=bitdata[fr];
if(temp && fr>=csdata)
farfree(temp);
}
outport(0x3d4,0x4109);
}