mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
661 lines
15 KiB
C
661 lines
15 KiB
C
|
#ifndef _ABOUT_H_
|
||
|
#define _ABOUT_H_
|
||
|
|
||
|
#include <math.h>
|
||
|
|
||
|
|
||
|
#pragma warning(disable : 4731)
|
||
|
|
||
|
static HWND about_hwnd;
|
||
|
|
||
|
#ifndef NO_ABOUT_EGG
|
||
|
|
||
|
#define BITMAP_W 100
|
||
|
#define BITMAP_H 64
|
||
|
static HDC m_hdc;
|
||
|
static HBITMAP m_hbm;
|
||
|
static char *m_dib;
|
||
|
static char ge_fbuf[(BITMAP_H+1)*BITMAP_W+1];
|
||
|
static int ge_tmp;
|
||
|
#define M_NUM_FX 9
|
||
|
static int m_effect;
|
||
|
#define BLOBS_NPOINTS 8
|
||
|
static int BLOBPOINTS[4*BLOBS_NPOINTS];
|
||
|
static int fire_textcnt,fire_textpos;
|
||
|
static char *fire_texts[]={
|
||
|
"nsvplay",
|
||
|
"Nullsoft 2003-8",
|
||
|
"",
|
||
|
"greets to",
|
||
|
"winamp forums",
|
||
|
"#nullsoft",
|
||
|
"britney spears",
|
||
|
"p.s.",
|
||
|
"DrO was here",
|
||
|
" <3",
|
||
|
"",
|
||
|
};
|
||
|
static HDC scrolldc;
|
||
|
static HBITMAP scrollbitmap;
|
||
|
static char *scrolldib;
|
||
|
static const char scrolltext[]="nullsoft presents you nSVpLAY hidden part! cracked by rOn +5 trainer by deadbeef ";
|
||
|
static int scrolloffs;
|
||
|
static char *rototmp;
|
||
|
|
||
|
#endif //NO_ABOUT_EGG
|
||
|
|
||
|
static INT_PTR CALLBACK aboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
#ifndef NO_ABOUT_EGG
|
||
|
{
|
||
|
HBITMAP about_bmp = NULL;
|
||
|
m_effect=M_NUM_FX-1;
|
||
|
|
||
|
// try to use the localised image and then revert to the normal dll image
|
||
|
about_bmp = (HBITMAP)LoadImage((HINSTANCE)lParam,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_SHARED);
|
||
|
if(about_bmp == NULL){
|
||
|
about_bmp = (HBITMAP)LoadImage(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_SHARED);
|
||
|
}
|
||
|
|
||
|
// set on control with id of -1 (0xFFFFFFFF) or 0xFFFF (not sure how/why this happened)
|
||
|
SendDlgItemMessage(hwndDlg,0xFFFF,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)about_bmp);
|
||
|
SendDlgItemMessage(hwndDlg,-1,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)about_bmp);
|
||
|
}
|
||
|
#endif
|
||
|
SetDlgItemText(hwndDlg,IDC_VERSION,WNDMENU_CAPTION);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDCANCEL:
|
||
|
case IDOK:
|
||
|
#ifndef MODAL_ABOUT
|
||
|
DestroyWindow(hwndDlg);
|
||
|
#else
|
||
|
EndDialog(hwndDlg,1);
|
||
|
#endif
|
||
|
return FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
about_hwnd=NULL;
|
||
|
#ifndef NO_ABOUT_EGG
|
||
|
if (m_hbm) DeleteObject(m_hbm);
|
||
|
if (m_hdc) DeleteDC(m_hdc);
|
||
|
if (scrollbitmap) DeleteObject(scrollbitmap);
|
||
|
if (scrolldc) DeleteDC(scrolldc);
|
||
|
m_hbm=0;
|
||
|
m_hdc=0;
|
||
|
scrollbitmap=0;
|
||
|
scrolldc=0;
|
||
|
if (rototmp) free(rototmp);
|
||
|
rototmp=NULL;
|
||
|
#endif
|
||
|
break;
|
||
|
#ifndef NO_ABOUT_EGG
|
||
|
case WM_LBUTTONDBLCLK :
|
||
|
//easter eggs :)
|
||
|
if (++m_effect >= M_NUM_FX) m_effect=1;
|
||
|
|
||
|
KillTimer(hwndDlg,0x1234);
|
||
|
|
||
|
if (m_hbm) DeleteObject(m_hbm);
|
||
|
if (m_hdc) DeleteDC(m_hdc);
|
||
|
if (scrollbitmap) DeleteObject(scrollbitmap);
|
||
|
if (scrolldc) DeleteDC(scrolldc);
|
||
|
scrollbitmap=0;
|
||
|
scrolldc=0;
|
||
|
if (rototmp) free(rototmp);
|
||
|
rototmp=NULL;
|
||
|
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
BITMAPINFO bmi;
|
||
|
RGBQUAD more_bmiColors[256];
|
||
|
LPVOID data;
|
||
|
} m_bitmap;
|
||
|
m_hdc = CreateCompatibleDC(NULL);
|
||
|
m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||
|
m_bitmap.bmi.bmiHeader.biPlanes = 1;
|
||
|
m_bitmap.bmi.bmiHeader.biBitCount = 8;
|
||
|
m_bitmap.bmi.bmiHeader.biCompression = BI_RGB;
|
||
|
m_bitmap.bmi.bmiHeader.biSizeImage = 0;
|
||
|
m_bitmap.bmi.bmiHeader.biClrUsed = 256;
|
||
|
m_bitmap.bmi.bmiHeader.biClrImportant = 256;
|
||
|
m_bitmap.bmi.bmiHeader.biWidth = BITMAP_W;
|
||
|
m_bitmap.bmi.bmiHeader.biHeight = -BITMAP_H;
|
||
|
m_bitmap.bmi.bmiHeader.biSizeImage = BITMAP_W*BITMAP_H;
|
||
|
|
||
|
memset(ge_fbuf,0,BITMAP_W*(BITMAP_H+1));
|
||
|
fire_textcnt=0;
|
||
|
|
||
|
if (m_effect < 3)
|
||
|
{
|
||
|
unsigned char *t=(unsigned char *)m_bitmap.bmi.bmiColors;
|
||
|
int x=255;
|
||
|
int adj=!!m_effect;
|
||
|
t[0]=t[1]=t[2]=0;
|
||
|
t+=4;
|
||
|
while (x)
|
||
|
{
|
||
|
if (m_effect == 2)
|
||
|
{
|
||
|
if (x > 128)
|
||
|
{
|
||
|
t[0]=0;
|
||
|
t[1]=((256-x)*2)/3;
|
||
|
t[2]=(256-x)*2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
t[0]=256-x*2;
|
||
|
t[1]=255/3 + ((256-x)*2)/3;
|
||
|
t[2]=255;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int a=x*2;
|
||
|
if (a>255) a=255;
|
||
|
t[0]=a;
|
||
|
t[2-adj]=a;
|
||
|
a+=a;
|
||
|
if (a > 255) a=255;
|
||
|
t[1+adj]=a;
|
||
|
}
|
||
|
|
||
|
t+=4;
|
||
|
x--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(m_effect==0)
|
||
|
{
|
||
|
//sine scroll
|
||
|
struct
|
||
|
{
|
||
|
BITMAPINFO bmi;
|
||
|
RGBQUAD more_bmiColors[1];
|
||
|
LPVOID data;
|
||
|
} m_bitmap;
|
||
|
scrolldc = CreateCompatibleDC(NULL);
|
||
|
m_bitmap.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||
|
m_bitmap.bmi.bmiHeader.biPlanes = 1;
|
||
|
m_bitmap.bmi.bmiHeader.biBitCount = 8;
|
||
|
m_bitmap.bmi.bmiHeader.biCompression = BI_RGB;
|
||
|
m_bitmap.bmi.bmiHeader.biSizeImage = 0;
|
||
|
m_bitmap.bmi.bmiHeader.biClrUsed = 1;
|
||
|
m_bitmap.bmi.bmiHeader.biClrImportant = 1;
|
||
|
m_bitmap.bmi.bmiHeader.biWidth = 128;
|
||
|
m_bitmap.bmi.bmiHeader.biHeight = -32;
|
||
|
m_bitmap.bmi.bmiHeader.biSizeImage = 128*32;
|
||
|
scrollbitmap = CreateDIBSection(scrolldc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0);
|
||
|
SelectObject(scrolldc,scrollbitmap);
|
||
|
SetBkMode(scrolldc,TRANSPARENT);
|
||
|
scrolldib = (char *)m_bitmap.data;
|
||
|
scrolloffs = 0;
|
||
|
}
|
||
|
|
||
|
if (m_effect == 1)
|
||
|
{
|
||
|
int *t=BLOBPOINTS;
|
||
|
int a=BLOBS_NPOINTS;
|
||
|
while (a)
|
||
|
{
|
||
|
t[0]=(rand()&127) - 64;
|
||
|
t[2]=(rand()&127) - 64;
|
||
|
t[1]=t[3]=a;
|
||
|
t+=4;
|
||
|
a--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if((m_effect >= 3 && m_effect <= 8)) //rotozooms
|
||
|
{
|
||
|
rototmp=(char *)malloc(65536+256);
|
||
|
//generate noise texture
|
||
|
memset(rototmp,0xd0,65536+256);
|
||
|
__asm
|
||
|
{
|
||
|
mov cx,0ffffh
|
||
|
xor ax,ax
|
||
|
xor ebx,ebx
|
||
|
xor dx,dx
|
||
|
mov edi,[rototmp]
|
||
|
TEXGEN:
|
||
|
mov bx,cx
|
||
|
add ax,cx
|
||
|
rol ax,cl
|
||
|
mov dh,al
|
||
|
sar dh,5
|
||
|
adc dl,dh
|
||
|
adc dl,[edi+ebx+255]
|
||
|
shr dl,1
|
||
|
mov [edi+ebx],dl
|
||
|
not bh
|
||
|
mov [edi+ebx],dl
|
||
|
loop TEXGEN
|
||
|
}
|
||
|
|
||
|
if ((!!(GetAsyncKeyState(VK_SHIFT)&0x8000)) ^ (m_effect==5)) // secondary easter egg, hah!
|
||
|
for (int x = 0; x < 256*256; x ++) rototmp[x] = 0x40 + ((x^(x>>8)) & 0x1F);
|
||
|
|
||
|
rototmp[0]=rototmp[1];
|
||
|
rototmp[0xff00]=rototmp[0xff01];
|
||
|
|
||
|
//generate palette
|
||
|
unsigned char *t=((unsigned char *)(&m_bitmap.bmi.bmiColors[0x40]));
|
||
|
for(int i=0;i<0x20;i++)
|
||
|
{
|
||
|
int r,g,b;
|
||
|
switch(m_effect)
|
||
|
{
|
||
|
case 3: r=i*4; g=i*5; b=i*8; break;
|
||
|
case 4: r=i*4; g=i*7; b=i*8; break;
|
||
|
case 5: r=i*8; g=i*2; b=i*2; break;
|
||
|
case 6: r=i*6; g=i*8; b=i*6; break;
|
||
|
case 7: r=i*8; g=i*6; b=i*8; break;
|
||
|
case 8: r=i*6; g=i*6; b=i*8; break;
|
||
|
}
|
||
|
t[0]=b;
|
||
|
t[1]=g;
|
||
|
t[2]=r;
|
||
|
t+=4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_hbm = CreateDIBSection(m_hdc,&m_bitmap.bmi,DIB_RGB_COLORS, &m_bitmap.data, NULL, 0);
|
||
|
SelectObject(m_hdc,m_hbm);
|
||
|
m_dib = (char *)m_bitmap.data;
|
||
|
|
||
|
SetTimer(hwndDlg,0x1234,35,NULL);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_TIMER:
|
||
|
{
|
||
|
int nomemcpy=0;
|
||
|
static float inc=0;
|
||
|
inc++;
|
||
|
if (m_effect == 0) // oldsk00l sine scroll
|
||
|
{
|
||
|
double blah=3.14/BITMAP_W;
|
||
|
double val1=1;
|
||
|
double val2=(BITMAP_H-16)/2;
|
||
|
static double vinc=0;
|
||
|
__asm
|
||
|
{
|
||
|
mov edi, offset ge_fbuf
|
||
|
mov ecx, BITMAP_W*BITMAP_H
|
||
|
xor eax, eax
|
||
|
rep stosb
|
||
|
}
|
||
|
|
||
|
for(int j=0;j<8;j++) {
|
||
|
for(int k=0;k<16;k++) {
|
||
|
int col=255-k*(256/16);
|
||
|
if(col<128) col=128+(128-col);
|
||
|
memset(ge_fbuf+(k+(int)((BITMAP_H-16)*(cos(vinc+(j*8)*3.14/50)+1)/2))*BITMAP_W,col,BITMAP_W);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
__asm
|
||
|
{
|
||
|
mov edi, offset ge_fbuf
|
||
|
mov ecx, 0
|
||
|
mov esi, dword ptr [scrolldib]
|
||
|
|
||
|
SINELOOP:
|
||
|
mov [ge_tmp], ecx
|
||
|
fild dword ptr [ge_tmp]
|
||
|
fmul qword ptr [blah]
|
||
|
fadd qword ptr [vinc]
|
||
|
fcos
|
||
|
fadd qword ptr [val1]
|
||
|
fmul qword ptr [val2]
|
||
|
fistp dword ptr [ge_tmp]
|
||
|
mov eax, [ge_tmp]
|
||
|
mov ebx, eax
|
||
|
|
||
|
mov edx, BITMAP_W
|
||
|
mul edx
|
||
|
|
||
|
mov dh, bl
|
||
|
push ecx
|
||
|
mov ebx, 0
|
||
|
mov ecx, 16
|
||
|
|
||
|
SINELOOP2:
|
||
|
cmp byte ptr [esi+ebx],0
|
||
|
je SINECONT
|
||
|
|
||
|
mov dl,0ffh
|
||
|
sub dl,dh
|
||
|
sub dl,cl
|
||
|
|
||
|
mov [edi+eax], dl
|
||
|
SINECONT:
|
||
|
add eax, BITMAP_W
|
||
|
add ebx, 128
|
||
|
loop SINELOOP2
|
||
|
|
||
|
pop ecx
|
||
|
|
||
|
inc esi
|
||
|
inc edi
|
||
|
|
||
|
inc ecx
|
||
|
cmp ecx, BITMAP_W
|
||
|
jl SINELOOP
|
||
|
|
||
|
mov edi, [scrolldib]
|
||
|
mov esi, edi
|
||
|
inc esi
|
||
|
mov ebx, 32
|
||
|
SINESCROLL:
|
||
|
mov ecx, 127
|
||
|
rep movsb
|
||
|
inc edi
|
||
|
inc esi
|
||
|
dec ebx
|
||
|
jnz SINESCROLL
|
||
|
}
|
||
|
vinc+=0.2;
|
||
|
scrolloffs++;
|
||
|
if((scrolloffs&7)==7)
|
||
|
{
|
||
|
int o=scrolloffs/8;
|
||
|
if(!scrolltext[o]) scrolloffs=0;
|
||
|
else TextOutA(scrolldc,100,0,&scrolltext[o],1);
|
||
|
}
|
||
|
}
|
||
|
else if (m_effect == 1) // blobs
|
||
|
{
|
||
|
int *blobptr=BLOBPOINTS;
|
||
|
int i=BLOBS_NPOINTS*2;
|
||
|
while (i--)
|
||
|
{
|
||
|
if (blobptr[0] > 0) blobptr[1]--;
|
||
|
else blobptr[1]++;
|
||
|
|
||
|
int a=blobptr[1];
|
||
|
if (rand()&1) a++;
|
||
|
else a--;
|
||
|
blobptr[0]+=a/8;
|
||
|
|
||
|
blobptr+=2;
|
||
|
}
|
||
|
|
||
|
int y=BITMAP_H;
|
||
|
unsigned char *p=(unsigned char *)ge_fbuf;
|
||
|
while (y--)
|
||
|
{
|
||
|
int x=BITMAP_W;
|
||
|
while (x--)
|
||
|
{
|
||
|
blobptr=BLOBPOINTS;
|
||
|
i=BLOBS_NPOINTS;
|
||
|
double sum=0.0;
|
||
|
while (i--)
|
||
|
{
|
||
|
double as=(x-(BITMAP_W/2)) - blobptr[0];
|
||
|
double bs=(y-(BITMAP_H/2)) - blobptr[2];
|
||
|
sum+=sqrt(as*as + bs*bs);
|
||
|
blobptr+=4;
|
||
|
}
|
||
|
sum *= 6.0/BLOBS_NPOINTS;
|
||
|
int a=(int)sum;
|
||
|
if (a > 0xff) a= 0xff;
|
||
|
*p++=a;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if(m_effect==2) //gayfire
|
||
|
{
|
||
|
unsigned char *p=(unsigned char *)ge_fbuf;
|
||
|
int x;
|
||
|
unsigned char *t=p + BITMAP_W*BITMAP_H;
|
||
|
for (x = 0; x < BITMAP_W; x ++)
|
||
|
{
|
||
|
int a=*t - 10;
|
||
|
if ((rand()&0x7) == 7) a+=100;
|
||
|
if (a < 0) a=0;
|
||
|
else if (a > 192) a=192;
|
||
|
*t++=a;//rand()&0xf0;
|
||
|
}
|
||
|
int y;
|
||
|
for (y = 0; y < BITMAP_H; y ++)
|
||
|
{
|
||
|
*p++=p[0]/4 + p[BITMAP_W]/2 + p[BITMAP_W+1]/4;
|
||
|
|
||
|
for (x = 1; x < BITMAP_W-1; x ++)
|
||
|
*p++=p[0]/4 + p[BITMAP_W]/4 + p[BITMAP_W-1]/4 + p[BITMAP_W+1]/4;
|
||
|
|
||
|
*p++=p[0]/4 + p[BITMAP_W]/2 + p[BITMAP_W-1]/4;
|
||
|
}
|
||
|
if (fire_textcnt-- <= 0)
|
||
|
{
|
||
|
memcpy(m_dib,ge_fbuf,BITMAP_W*BITMAP_H);
|
||
|
SetBkMode(m_hdc,TRANSPARENT);
|
||
|
SetTextColor(m_hdc,RGB(255,255,255));
|
||
|
RECT r={0,0,BITMAP_W,BITMAP_H};
|
||
|
DrawTextA(m_hdc,fire_texts[fire_textpos%(sizeof(fire_texts)/sizeof(fire_texts[0]))],-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
|
||
|
if (fire_textcnt < -30)
|
||
|
{
|
||
|
memcpy(ge_fbuf,m_dib,BITMAP_W*BITMAP_H);
|
||
|
fire_textpos++;
|
||
|
fire_textcnt=30;
|
||
|
}
|
||
|
else nomemcpy=1;
|
||
|
}
|
||
|
}
|
||
|
else if (m_effect == 3) //rotozoom
|
||
|
{
|
||
|
char *p=ge_fbuf;
|
||
|
static float angle=0;
|
||
|
for(int j=-32;j<32;j++)
|
||
|
for(int i=-50;i<50;i++)
|
||
|
{
|
||
|
//rotozoom
|
||
|
double x=(i*cosf(angle)-j*sinf(angle))*(2+cosf(angle*1.4f));
|
||
|
double y=(i*sinf(angle)+j*cosf(angle))*(2+cosf(angle*1.4f));
|
||
|
//slime
|
||
|
x+=cos(angle*x)*4;
|
||
|
y+=sin(angle*y)*4;
|
||
|
int x2=(int)x & 0xff;
|
||
|
int y2=(int)y & 0xff;
|
||
|
*p++=rototmp[256*y2+x2];
|
||
|
}
|
||
|
|
||
|
angle+=0.01f;
|
||
|
}
|
||
|
else if (m_effect == 4) //rotozoom 2
|
||
|
{
|
||
|
char *p=ge_fbuf;
|
||
|
double angle=cos(inc*0.01f)*2;
|
||
|
for(int j=-32;j<32;j++)
|
||
|
for(int i=-50;i<50;i++)
|
||
|
{
|
||
|
//position
|
||
|
double x=i-cos(inc*0.013f)*64;
|
||
|
double y=j+sin(inc*0.013f)*64;
|
||
|
|
||
|
//slime
|
||
|
x+=cos((angle+i)*50)*cos(angle)*4;
|
||
|
y+=sin((angle+j)*50)*cos(angle)*4;
|
||
|
|
||
|
//rotozoom
|
||
|
double x3=(x*cos(angle)-y*sin(angle))*(2+cos(angle*1.4f));
|
||
|
double y3=(x*sin(angle)+y*cos(angle))*(2+cos(angle*1.4f));
|
||
|
|
||
|
int x2=(int)x3 & 0xff;
|
||
|
int y2=(int)y3 & 0xff;
|
||
|
*p++=rototmp[256*y2+x2];
|
||
|
}
|
||
|
}
|
||
|
else if (m_effect == 5) //3d rotozoom
|
||
|
{
|
||
|
char *p=ge_fbuf;
|
||
|
static float angle=0;
|
||
|
const double b=50;
|
||
|
for(int j=-32;j<32;j++)
|
||
|
for(int i=-50;i<50;i++)
|
||
|
{
|
||
|
//rotozoom
|
||
|
double x=(i*cos(angle)+j*sin(angle));//*(2+cos(angle*1.4f));
|
||
|
double y=(i*sin(angle)-j*cos(angle));//*(2+cos(angle*1.4f));
|
||
|
//gay z-projection
|
||
|
x*=b/(((double)j+32));
|
||
|
y*=b/(((double)j+32));
|
||
|
//position
|
||
|
x-=cos(inc*0.013f)*64;
|
||
|
y+=sin(inc*0.013f)*64;
|
||
|
|
||
|
int x2=(int)x & 0xff;
|
||
|
int y2=(int)y & 0xff;
|
||
|
|
||
|
char c=rototmp[256*y2+x2];
|
||
|
*p++=0x40+((c-0x40)*(j+32)/56);
|
||
|
}
|
||
|
|
||
|
angle+=0.01f;
|
||
|
//b++;
|
||
|
}
|
||
|
else if (m_effect == 6) //tunnel
|
||
|
{
|
||
|
const double TINYNUM=1.0E-6;
|
||
|
const double CONE_RADIUS=128;
|
||
|
const double FOV=120.0;
|
||
|
#define sqr(a) ((a)*(a))
|
||
|
|
||
|
char *p=ge_fbuf;
|
||
|
for(int y=-32;y<32;y++)
|
||
|
for(int x=-50;x<50;x++)
|
||
|
{
|
||
|
double originx=cos(inc*0.025f)*20;
|
||
|
double originy=sin(inc*0.04f)*20;
|
||
|
double originz=inc*4;
|
||
|
double dirx=x/FOV;
|
||
|
double diry=y/FOV;
|
||
|
double dirz=1;
|
||
|
|
||
|
//normalize dir vector
|
||
|
{
|
||
|
double l=1.0f/sqrt(sqr(dirx)+sqr(diry)+sqr(dirz));
|
||
|
dirx*=l;
|
||
|
diry*=l;
|
||
|
dirz*=l;
|
||
|
}
|
||
|
|
||
|
//y-axis rotation
|
||
|
{
|
||
|
double rot=inc*0.015f;
|
||
|
double dirx2=dirx*cos(rot)+dirz*sin(rot);
|
||
|
dirz=dirx*sin(rot)-dirz*cos(rot);
|
||
|
dirx=dirx2;
|
||
|
}
|
||
|
|
||
|
//tunnel algo shit
|
||
|
double a=sqr(dirx)+sqr(diry);
|
||
|
double b=2*(originx*dirx + originy*diry);
|
||
|
double c=sqr(originx)+sqr(originy)-sqr(CONE_RADIUS);
|
||
|
double delta=sqrt(sqr(b)-(4*a*c));
|
||
|
|
||
|
double t1=(-b+delta)/(2*a+TINYNUM);
|
||
|
double t2=(-b-delta)/(2*a+TINYNUM);
|
||
|
|
||
|
double t=t1>0?t1:t2;
|
||
|
|
||
|
double intx=originx+dirx*t;
|
||
|
double inty=originy+diry*t;
|
||
|
double intz=originz+dirz*t;
|
||
|
|
||
|
//tex. coords
|
||
|
int u=(int)(fabs(intz)*0.6);
|
||
|
int v=(int)(fabs(atan2(inty,intx)*256/3.14159265));
|
||
|
|
||
|
//depth
|
||
|
t=20000.0/t;
|
||
|
int z=(int)(t>63?63:t);
|
||
|
|
||
|
u&=0xff;
|
||
|
v&=0xff;
|
||
|
z&=0xff;
|
||
|
|
||
|
{
|
||
|
char c=rototmp[256*u+v];
|
||
|
*p++=0x40+((c-0x40)*z/64);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if(m_effect==7) //washing machine
|
||
|
{
|
||
|
char *p=ge_fbuf;
|
||
|
for(int j=-32;j<32;j++)
|
||
|
for(int i=-50;i<50;i++)
|
||
|
{
|
||
|
double dist=sqrt(double(sqr(i)+sqr(j))); // pythagoras rules :)
|
||
|
double angle=cos(dist*0.05f)*(cos(inc*0.1f)) + inc*0.07f;
|
||
|
//rotozoom
|
||
|
double x=(i*cos(angle)-j*sin(angle));
|
||
|
double y=(i*sin(angle)+j*cos(angle));
|
||
|
int x2=(int)x & 0xff;
|
||
|
int y2=(int)y & 0xff;
|
||
|
*p++=rototmp[256*y2+x2];
|
||
|
}
|
||
|
}
|
||
|
else if(m_effect==8) //reflection-like(?) effect
|
||
|
{
|
||
|
char *p=ge_fbuf;
|
||
|
for(int j=-32;j<32;j++)
|
||
|
for(int i=-50;i<50;i++)
|
||
|
{
|
||
|
double dist=sqrt(double(sqr(i)+sqr(j)));
|
||
|
double zoom=cos(dist*0.05f)*(cos(inc*0.02f)*8)+1;
|
||
|
//rotozoom
|
||
|
double x=i*zoom+inc;
|
||
|
double y=j*zoom+inc;
|
||
|
int x2=(int)x & 0xff;
|
||
|
int y2=(int)y & 0xff;
|
||
|
*p++=rototmp[256*x2+y2];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!nomemcpy) memcpy(m_dib,ge_fbuf,BITMAP_W*BITMAP_H);
|
||
|
if (hwndDlg != NULL)
|
||
|
{
|
||
|
HDC h = GetDC(hwndDlg);
|
||
|
BitBlt(h, 11, 11, BITMAP_W, BITMAP_H, m_hdc, 0, 0, SRCCOPY);
|
||
|
ReleaseDC(hwndDlg, h);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
#endif
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void do_about(HWND hwnd, HINSTANCE hinst) {
|
||
|
#ifndef MODAL_ABOUT
|
||
|
if(about_hwnd) {
|
||
|
SetForegroundWindow(about_hwnd);
|
||
|
return;
|
||
|
}
|
||
|
about_hwnd=CreateDialogParam((!hinst?g_hInstance:hinst),MAKEINTRESOURCE(IDD_ABOUT),hwnd,aboutProc,(LPARAM)hinst);
|
||
|
ShowWindow(about_hwnd,SW_SHOW);
|
||
|
#else
|
||
|
#ifdef LOC_MODAL_ABOUT
|
||
|
WASABI_API_DIALOGBOXPARAMW(IDD_ABOUT,hwnd,aboutProc,(LPARAM)hinst);
|
||
|
#else
|
||
|
DialogBoxParam((!hinst?g_hInstance:hinst),MAKEINTRESOURCE(IDD_ABOUT),hwnd,aboutProc,(LPARAM)hinst);
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#endif//_ABOUT_H_
|