Эффект дождя для х64

Тема в разделе "WASM.GUI", создана пользователем Mikl___, 14 дек 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.167
    Написано под влиянием программы manhunter Эффект водной поверхности на Ассемблере. За это manhunter'у огромный респект и уважуха! :thank_you2:Переделано с диалекта FASM 32-разряда на 64-разрядный MASM.
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ID_IMG = 101
    4. ID_BMP = 102
    5. IDC_DIALOG = 200
    6. DIB_RGB_COLORS = 0
    7. F_WO_ACTIVE = 1
    8. F_WO_NEED_UPDATE= 2
    9. F_WO_EFFECT = 4
    10. F_WO_ELLIPSE = 8
    11. RGBQUAD struct
    12.         rgbBlue         db ?
    13.         rgbGreen        db ?
    14.         rgbRed          db ?
    15.         rgbReserved     db ?
    16. RGBQUAD ends
    17. BITMAPINFO struct
    18.         bmiHeader      BITMAPINFOHEADER <>
    19.         bmiColors       RGBQUAD <>
    20. BITMAPINFO ends
    21. WAVE_OBJECT struct
    22.        hWnd            QWORD ?
    23.        dwFlag          DWORD ?
    24.        hDcRender       QWORD ?
    25.        hBmpRender      QWORD ?
    26.        lpDIBitsSource  QWORD ?
    27.        lpDIBitsRender  QWORD ?
    28.        lpWave1         QWORD ?
    29.        lpWave2         QWORD ?
    30.        dwBmpWidth      DWORD ?
    31.        dwBmpHeight     DWORD ?
    32.        dwDIByteWidth   DWORD ?
    33.        dwWaveByteWidth DWORD ?
    34.        dwRandom        DWORD ?
    35.        dwEffectType    DWORD ?
    36.        dwEffectParam1  DWORD ?
    37.        dwEffectParam2  DWORD ?
    38.        dwEffectParam3  DWORD ?
    39.        dwEff2X         DWORD ?
    40.        dwEff2Y         DWORD ?
    41.        dwEff2XAdd      DWORD ?
    42.        dwEff2YAdd      DWORD ?
    43.        dwEff2Flip      DWORD ?
    44.        stBmpInfo BITMAPINFO <>
    45. WAVE_OBJECT ends
    46. .code
    47. WinMain PROC
    48.         enter 30h,0
    49.         and qword ptr[rsp+20h],0
    50.         invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,&DialogProc
    51.         invoke  RtlExitUserProcess,0
    52. WinMain ENDP
    53. DialogProc proc  hwnddlg:qword,msg:qword,wparam:qword,lparam:qword
    54. local hBitmap:QWORD
    55.         mov hwnddlg,rcx
    56.         mov wparam,r8
    57.         mov lparam,r9
    58. for msg,<INITDIALOG,CLOSE,COMMAND,PAINT,LBUTTONDOWN,MOUSEMOVE>
    59.         cmp     edx,WM_&msg
    60.         je      wm&msg
    61. endm
    62.         jmp     processed
    63. wmINITDIALOG:invoke LoadBitmapA,IMAGE_BASE,ID_BMP; Загрузить битмап
    64.         mov     hBitmap,rax
    65.         invoke  GetDlgItem,hwnddlg,ID_IMG
    66.         invoke _WaveInit,&stWaveObj,eax,hBitmap; Инициализация водной поверхности
    67.         invoke  DeleteObject,hBitmap
    68.         mov qword ptr[rsp+20h],250
    69.         invoke _WaveEffect,&stWaveObj,1,5,4; Настроить эффекты
    70.         jmp     finish
    71. wmPAINT:invoke  invoke  GetDlgItem,hwnddlg,ID_IMG
    72.         invoke  GetDC,eax
    73.         invoke _WaveUpdateFrame,&stWaveObj,eax,TRUE
    74.         jmp     processed
    75. wmLBUTTONDOWN:mov r8,r9;получить координаты клика левой кнопкой мышки
    76.         movzx   edx,r9w ; x
    77.         shr     r8,16          ; y
    78.          mov qword ptr[rsp+20h],256
    79.          invoke _WaveDropStone,&stWaveObj,,,2
    80.         invoke  ReleaseCapture; Перетаскивание окна за любое место
    81.         invoke  SendMessageA,hwnddlg,WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0
    82.         jmp     processed
    83. wmMOUSEMOVE:mov r8,r9;координаты курсора мыши при движении над изображением
    84.         movzx   edx,r8w ; x
    85.         shr     r8,16          ; y
    86.        mov qword ptr[rsp+20h],256
    87.        invoke _WaveDropStone,&stWaveObj,,,2
    88.         jmp     processed
    89. wmCOMMAND:cmp wparam,BN_CLICKED shl 16 + IDCANCEL
    90.         jne     processed
    91. wmCLOSE:invoke _WaveFree,&stWaveObj
    92.         invoke EndDialog,hwnddlg,0
    93. processed:xor eax,eax
    94. finish: leave
    95.         retn
    96. DialogProc endp
    97. _WaveInit proc  _lpWaveObject:QWORD,_hWnd:QWORD,_hBmp:QWORD
    98. local dummy[10]:qword
    99. local   dwReturn:DWORD
    100. local   stBmp:BITMAP
    101. local temp:qword
    102.         mov _lpWaveObject,rcx
    103.         mov _hWnd,rdx
    104.         mov _hBmp,r8
    105.         xor eax,eax
    106.         and     dwReturn,eax
    107.         mov     rbx,rcx
    108.         mov rdi,rcx
    109.         mov ecx,(sizeof WAVE_OBJECT)/4
    110.         rep stosd
    111.         mov     [rbx].WAVE_OBJECT.hWnd,rdx;_hWnd
    112.         invoke  GetTickCount
    113.         mov     [rbx].WAVE_OBJECT.dwRandom,eax
    114.         invoke  GetObject,_hBmp,sizeof BITMAP,&stBmp
    115.         or      eax,eax
    116.         jnz loc_endif_1
    117. @@:    inc     dwReturn
    118.         jmp     .Ret
    119. loc_endif_1:mov eax,stBmp.bmHeight
    120.         mov     [rbx].WAVE_OBJECT.dwBmpHeight,eax
    121.         cmp     eax,3
    122.         jle     @b
    123.         mov     eax,stBmp.bmWidth
    124.         mov     [rbx].WAVE_OBJECT.dwBmpWidth,eax
    125.         cmp     eax,3
    126.         jle     @b
    127.         push rax
    128.         shl     eax,2
    129.         mov     [rbx].WAVE_OBJECT.dwWaveByteWidth,eax
    130.         pop rax
    131.         lea     eax,[rax+rax*2+3]
    132.         and     eax,not 0011b
    133.         mov     [rbx].WAVE_OBJECT.dwDIByteWidth,eax
    134.         invoke  GetDC,_hWnd
    135.         mov     esi,eax
    136.         invoke  CreateCompatibleDC,eax
    137.         mov     [rbx].WAVE_OBJECT.hDcRender,rax
    138.         invoke  CreateCompatibleBitmap,esi,[rbx].WAVE_OBJECT.dwBmpWidth,\
    139.         [rbx].WAVE_OBJECT.dwBmpHeight
    140.         mov     [rbx].WAVE_OBJECT.hBmpRender,rax
    141.         invoke  SelectObject,[rbx].WAVE_OBJECT.hDcRender,rax
    142.         mov     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    143.         mul     [rbx].WAVE_OBJECT.dwBmpHeight
    144.         mov     edi,eax
    145.         invoke  GlobalAlloc,GPTR,edi
    146.         mov     [rbx].WAVE_OBJECT.lpWave1,rax
    147.         invoke  GlobalAlloc,GPTR,edi
    148.         mov     [rbx].WAVE_OBJECT.lpWave2,rax
    149.         mov     eax,[rbx].WAVE_OBJECT.dwDIByteWidth
    150.         mul     [rbx].WAVE_OBJECT.dwBmpHeight
    151.         mov     edi,eax
    152.         invoke  GlobalAlloc,GPTR,edi
    153.         mov     [rbx].WAVE_OBJECT.lpDIBitsSource,rax
    154.         invoke  GlobalAlloc,GPTR,edi
    155.         mov     [rbx].WAVE_OBJECT.lpDIBitsRender,rax
    156.         mov     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biSize,sizeof BITMAPINFOHEADER
    157.         mov eax,[rbx].WAVE_OBJECT.dwBmpWidth
    158.         mov     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biWidth,eax
    159.         mov     eax,[rbx].WAVE_OBJECT.dwBmpHeight
    160.         neg     eax
    161.         mov     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biHeight,eax
    162.         inc     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biPlanes
    163.         mov     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biBitCount,24
    164.         mov     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biCompression,BI_RGB
    165.         and     [rbx].WAVE_OBJECT.stBmpInfo.bmiHeader.biSizeImage,0
    166.         invoke  CreateCompatibleDC,esi
    167.         mov temp,rax
    168.         invoke  SelectObject,eax,_hBmp
    169.         invoke  ReleaseDC,_hWnd,esi
    170.         mov rax,temp
    171.         mov     esi,eax
    172.         and qword ptr[rsp+30h],DIB_RGB_COLORS
    173.         lea     eax,[rbx].WAVE_OBJECT.stBmpInfo
    174.         mov [rsp+28h],rax
    175.         mov rax,[rbx].WAVE_OBJECT.lpDIBitsSource
    176.         mov [rsp+20h],rax
    177.         invoke  GetDIBits,esi,_hBmp,0,[rbx].WAVE_OBJECT.dwBmpHeight
    178.         and qword ptr[rsp+30h],DIB_RGB_COLORS
    179.         lea     eax,[rbx].WAVE_OBJECT.stBmpInfo
    180.         mov [rsp+28h],rax
    181.         mov rax,[rbx].WAVE_OBJECT.lpDIBitsRender
    182.         mov [rsp+20h],rax
    183.         invoke  GetDIBits,esi,_hBmp,0,[rbx].WAVE_OBJECT.dwBmpHeight
    184.         invoke  DeleteDC,esi
    185.         cmp     [rbx].WAVE_OBJECT.lpWave1,0
    186.         je      @f
    187.         cmp     [rbx].WAVE_OBJECT.lpWave2,0
    188.         je      @f
    189.         cmp     [rbx].WAVE_OBJECT.lpDIBitsSource,0
    190.         je      @f
    191.         cmp     [rbx].WAVE_OBJECT.lpDIBitsRender,0
    192.         je      @f
    193.         cmp     [rbx].WAVE_OBJECT.hDcRender,0
    194.         jnz     loc_endif_2
    195. @@:     invoke _WaveFree,ebx
    196.         inc     dwReturn
    197. loc_endif_2:invoke SetTimer,_hWnd,ebx,30,&_WaveTimerProc
    198.         or      [rbx].WAVE_OBJECT.dwFlag,F_WO_ACTIVE or F_WO_NEED_UPDATE
    199.         invoke _WaveRender,ebx
    200.         invoke  GetDC,[rbx].WAVE_OBJECT.hWnd
    201.         invoke _WaveUpdateFrame,ebx,eax,TRUE
    202.         invoke  ReleaseDC,[rbx].WAVE_OBJECT.hWnd,eax
    203. .Ret:   leave
    204.         mov     eax,dwReturn
    205.         ret
    206. _WaveInit endp
    207. ; Установка или изменение типа и параметров эффекта
    208. ; _dwType = тип эффекта:
    209. ;       0 - нет никаких эффектов
    210. ;       1 - мелкий дождик
    211. ;       2 - глайдер
    212. ;       3 - проливной дождь
    213. ; _dwParam1 = скорость применения эффекта
    214. ; _dwParam2 = сила падения капель
    215. ; _dwParam3 = количество одновременных кругов на воде
    216. _WaveEffect proc _lpWaveObject:QWORD,_dwType:QWORD,_dwParam1:DWORD,_dwParam2:DWORD,_dwParam3:DWORD
    217. local   dwMaxY:DWORD
    218. local   dwMaxX:DWORD
    219.         mov _dwType,rdx
    220.         mov _dwParam1,r8d
    221.         mov _dwParam2,r9d
    222.         mov     rbx,rcx
    223.         mov     rax,_dwType
    224.         cmp     eax,0
    225.         jne     loc_else_1
    226.         and     [rbx].WAVE_OBJECT.dwFlag,not F_WO_EFFECT
    227.         mov     [rbx].WAVE_OBJECT.dwEffectType,eax
    228.         jmp     loc_endif
    229. loc_else_1:cmp eax,2
    230.         jne     loc_else_2
    231.         mov     eax,_dwParam1
    232.         mov     [rbx].WAVE_OBJECT.dwEff2XAdd,eax
    233.         mov     [rbx].WAVE_OBJECT.dwEff2YAdd,eax
    234.         mov     edx,[rbx].WAVE_OBJECT.dwBmpWidth
    235.         sub     edx,2
    236.         invoke _WaveRandom,rbx
    237.         inc     eax
    238.         mov     [rbx].WAVE_OBJECT.dwEff2X,eax
    239.         mov     edx,[rbx].WAVE_OBJECT.dwBmpHeight
    240.         sub     edx,2
    241.         invoke _WaveRandom,ebx
    242.         inc     eax
    243.         mov     [rbx].WAVE_OBJECT.dwEff2Y,eax
    244. loc_else_2:mov rax,_dwType
    245.         mov     [rbx].WAVE_OBJECT.dwEffectType,eax
    246.         mov eax,_dwParam1
    247.         mov     [rbx].WAVE_OBJECT.dwEffectParam1,eax
    248.         mov eax,_dwParam2
    249.         mov     [rbx].WAVE_OBJECT.dwEffectParam2,eax
    250.         mov eax,_dwParam3
    251.         mov     [rbx].WAVE_OBJECT.dwEffectParam3,eax
    252.         or      [rbx].WAVE_OBJECT.dwFlag,F_WO_EFFECT
    253. loc_endif:leave
    254.         ret
    255. _WaveEffect endp
    256. ; Генераторы случайных чисел
    257. _WaveRandom16 proc  _lpWaveObject:DWORD
    258.         mov     rbx,rcx
    259.         push    rdx
    260.         mov     eax,[rbx].WAVE_OBJECT.dwRandom
    261.         mov     ecx,32768-1     ; 2^15-1
    262.         mul     ecx
    263.         add     eax,2048-1      ; 2^11-1
    264.         adc     edx,0
    265.         mov     ecx,2147483647  ; 2^31-1
    266.         div     ecx
    267.         mov     eax,[rbx].WAVE_OBJECT.dwRandom
    268.         mov     [rbx].WAVE_OBJECT.dwRandom,edx
    269.         and     eax,0FFFFh
    270.         pop     rdx
    271.         leave
    272.         ret
    273. _WaveRandom16 endp
    274. _WaveRandom proc  _lpWaveObject:QWORD, _dwMax:DWORD
    275. local temp:dword
    276.         mov rbx,rcx
    277.         mov _dwMax,edx
    278.         push    rcx
    279.         push rdx
    280.         invoke _WaveRandom16,rbx
    281.         mov     temp,eax
    282.         invoke _WaveRandom16,rbx
    283.         shl     eax,16
    284.         or      eax,temp
    285.         mov     ecx,_dwMax
    286.         or      ecx,ecx
    287.         jz      @f
    288.         xor     edx,edx
    289.         div     ecx
    290.         mov     eax,edx
    291. @@:     pop rcx
    292.         pop     rdx
    293.         leave
    294.         ret
    295. _WaveRandom endp
    296. ; Перемешивание волн
    297. ; Wave2(x,y) = (Wave1(x+1,y)+Wave1(x-1,y)+Wave1(x,y+1)+Wave1(x,y-1))/2-Wave2(x,y)
    298. ; Wave2(x,y) = Wave2(x,y) - Wave2(x,y) >> 5
    299. ; xchg Wave1,Wave2
    300. _WaveSpread proc _lpWaveObject:QWORD
    301.         mov     rbx,rcx;_lpWaveObject
    302.         test    [rbx].WAVE_OBJECT.dwFlag,F_WO_ACTIVE
    303.         jz      .Ret
    304.         mov     rsi,[rbx].WAVE_OBJECT.lpWave1
    305.         mov     rdi,[rbx].WAVE_OBJECT.lpWave2
    306.         mov     ecx,[rbx].WAVE_OBJECT.dwBmpWidth
    307.         mov     eax,[rbx].WAVE_OBJECT.dwBmpHeight
    308.         dec     eax
    309.         mul     ecx
    310.         jmp     loc_while_chk
    311. loc_while:push rax
    312.         test    [rbx].WAVE_OBJECT.dwFlag,F_WO_ELLIPSE
    313.         jz      loc_else
    314.         mov     edx,[rsi+rcx*4-1*4]
    315.         add     edx,[rsi+rcx*4+1*4]
    316.         add     edx,[rsi+rcx*4-2*4]
    317.         add     edx,[rsi+rcx*4+2*4]
    318.         lea     edx,[rdx+rdx*2]
    319.         add     edx,[rsi+rcx*4-3*4]
    320.         add     edx,[rsi+rcx*4-3*4]
    321.         add     edx,[rsi+rcx*4+3*4]
    322.         add     edx,[rsi+rcx*4+3*4]
    323.         lea     eax,[rsi+rcx*4]
    324.         sub     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    325.         mov     eax,[rax]
    326.         shl     eax,3
    327.         add     edx,eax
    328.         lea     eax,[rsi+rcx*4]
    329.         add     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    330.         mov     eax,[rax]
    331.         shl     eax,3
    332.         add     edx,eax
    333.         sar     edx,4
    334.         sub     edx,[rdi+rcx*4]
    335.         mov     eax,edx
    336.         sar     eax,5
    337.         sub     edx,eax
    338.         mov     [rdi+rcx*4],edx
    339.         jmp     loc_endif
    340. loc_else:mov edx,[rsi+rcx*4-1*4]
    341.         add     edx,[rsi+rcx*4+1*4]
    342.         lea     eax,[rsi+rcx*4]
    343.         sub     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    344.         add     edx,[rax]
    345.         lea     eax,[rsi+rcx*4]
    346.         add     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    347.         add     edx,[rax]
    348.         sar     edx,1
    349.         sub     edx,[rdi+rcx*4]
    350.         mov     eax,edx
    351.         sar     eax,5
    352.         sub     edx,eax
    353.         mov     [rdi+rcx*4],edx
    354. loc_endif:pop rax
    355.         inc     ecx
    356. loc_while_chk:cmp ecx,eax
    357.         jb      loc_while
    358.         mov     [rbx].WAVE_OBJECT.lpWave1,rdi
    359.         mov     [rbx].WAVE_OBJECT.lpWave2,rsi
    360. .Ret:  leave
    361.         ret
    362. _WaveSpread endp
    363. ; Отрисовка волн
    364. ; posx = Wave1(x-1,y)-Wave1(x+1,y)+x
    365. ; posy = Wave1(x,y-1)-Wave1(x,y+1)+y
    366. ; SourceBmp(x,y) = DestBmp(posx,posy)
    367. _WaveRender proc _lpWaveObject:DWORD
    368. local   dwFlag:DWORD
    369. local   dwPtrSource:DWORD
    370. local   dwPosY:DWORD
    371. local   dwPosX:DWORD
    372. local temp:QWORD
    373.         mov rbx,rcx
    374.         and     dwFlag,0
    375.         test    [rbx].WAVE_OBJECT.dwFlag,F_WO_ACTIVE
    376.         jz      .Ret
    377.         or      [rbx].WAVE_OBJECT.dwFlag,F_WO_NEED_UPDATE
    378.         mov     rsi,[rbx].WAVE_OBJECT.lpWave1
    379.         mov     edi,[rbx].WAVE_OBJECT.dwWaveByteWidth
    380.         mov     ecx,1
    381. .Loop1: xor     edx,edx
    382. .Loop2: mov temp,rdx
    383.         mov     eax,edi
    384.         sub     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    385.         mov     eax,[rsi+rax]
    386.         mov     dwPosY,eax
    387.         mov     eax,[rbx].WAVE_OBJECT.dwWaveByteWidth
    388.         lea     eax,[rdi+rax]
    389.         mov     eax,[rsi+rax]
    390.         sub     dwPosY,eax
    391.         add     dwPosY,ecx
    392.         mov     eax,[rsi+rdi-4]
    393.         sub     eax,[rsi+rdi+4]
    394.         add     eax,edx                 ;@dwPosX = eax
    395.         mov     dwPosX,eax
    396.         cmp     eax,0
    397.         jl      .Continue
    398.         cmp     eax,[rbx].WAVE_OBJECT.dwBmpWidth
    399.         jge     .Continue
    400.         mov     eax,dwPosY
    401.         cmp     eax,0
    402.         jl      .Continue
    403.         cmp     eax,[rbx].WAVE_OBJECT.dwBmpHeight
    404.         jge     .Continue
    405. ; ptrSource = dwPosY * dwDIByteWidth + dwPosX * 3
    406. ; ptrDest = i * dwDIByteWidth + j * 3
    407.         mov     eax,dwPosX
    408.         lea     eax,[rax+rax*2]
    409.         mov     dwPosX,eax
    410.         push    rdx
    411.         mov     eax,dwPosY
    412.         mul     [rbx].WAVE_OBJECT.dwDIByteWidth
    413.         add     eax,dwPosX
    414.         mov     dwPtrSource,eax
    415.         mov     eax,ecx
    416.         mul     [rbx].WAVE_OBJECT.dwDIByteWidth
    417.         pop     rdx
    418.         lea     edx,[rdx+rdx*2]
    419.         add     eax,edx                 ;@dwPtrDest = eax
    420.         push rcx
    421.         push rdi
    422.         push rsi
    423.         mov     ecx,dwPtrSource
    424.         mov     rsi,[rbx].WAVE_OBJECT.lpDIBitsSource
    425.         mov     rdi,[rbx].WAVE_OBJECT.lpDIBitsRender
    426.         lea     esi,[rsi+rcx]
    427.         lea     edi,[rdi+rax]
    428.         cmp     ecx,eax
    429.         jz      .loc_else
    430.         or      dwFlag,1
    431.         mov     ecx,[rbx].WAVE_OBJECT.dwDIByteWidth
    432. .loc_else:movsd
    433. .loc_endif:pop rsi
    434.        pop rdi
    435.        pop rcx
    436. .Continue:mov rdx,temp
    437.         inc     edx
    438.         add     edi,4
    439.         cmp     edx,[rbx].WAVE_OBJECT.dwBmpWidth
    440.         jb      .Loop2
    441.         inc     ecx
    442.         mov     eax,[rbx].WAVE_OBJECT.dwBmpHeight
    443.         dec     eax
    444.         cmp     ecx,eax
    445.         jb      .Loop1
    446.         and qword ptr[rsp+30h],DIB_RGB_COLORS
    447.         lea     eax,[rbx].WAVE_OBJECT.stBmpInfo
    448.         mov [rsp+28h],rax
    449.         mov rax,[rbx].WAVE_OBJECT.lpDIBitsRender
    450.         mov [rsp+20h],rax
    451.         invoke  SetDIBits,[rbx].WAVE_OBJECT.hDcRender,[rbx].WAVE_OBJECT.hBmpRender,\
    452.         0,[rbx].WAVE_OBJECT.dwBmpHeight
    453.         cmp     dwFlag,0
    454.         jnz     .Ret
    455.         and     [rbx].WAVE_OBJECT.dwFlag,not F_WO_ACTIVE
    456. .Ret:   leave
    457.         ret
    458. _WaveRender endp
    459. ; Обновление изображения
    460. _WaveUpdateFrame proc  _lpWaveObject:QWORD,_hDc:QWORD,_bIfForce:QWORD
    461. local dummy[2]:qword
    462.         mov     rbx,rcx
    463.         mov _hDc,rdx
    464.         mov _bIfForce,r8
    465.         cmp     _bIfForce,0
    466.         jnz     @f
    467.         test    [rbx].WAVE_OBJECT.dwFlag, F_WO_NEED_UPDATE
    468.         jz loc_endif
    469. @@:    mov qword ptr[rsp+40h],SRCCOPY
    470.         xor edx,edx
    471.         mov [rsp+38h],rdx
    472.         mov [rsp+30h],rdx
    473.         mov rax,[rbx].WAVE_OBJECT.hDcRender
    474.         mov [rsp+28h],rax
    475.         mov eax,[rbx].WAVE_OBJECT.dwBmpHeight
    476.         mov [rsp+20h],rax
    477.         invoke  BitBlt,_hDc,,0,[rbx].WAVE_OBJECT.dwBmpWidth
    478.         and     [rbx].WAVE_OBJECT.dwFlag,not F_WO_NEED_UPDATE
    479. loc_endif:leave
    480.         ret
    481. _WaveUpdateFrame endp
    482. ; Отработка падения капли, например, по таймеру или при движении курсора
    483. _WaveDropStone proc _lpWaveObject:QWORD,_dwX:QWORD,_dwY:QWORD,_dwSize:QWORD,_dwWeight:QWORD
    484. local   dwMaxY:DWORD
    485. local   dwMaxX:DWORD
    486.         mov     rbx,rcx;_lpWaveObject
    487.         mov _dwX,rdx
    488.         mov _dwY,r8
    489.         mov _dwSize,r9
    490.         mov     rdx,r9;_dwSize
    491.         shr     edx,1
    492.         mov     rax,_dwX
    493.         mov     rsi,_dwY
    494.         mov     ecx,eax
    495.         mov     edi,esi
    496.         add     eax,edx         ; x + size
    497.         sub     ecx,edx         ; x - size
    498.         push    rdx
    499.         test    [rbx].WAVE_OBJECT.dwFlag,F_WO_ELLIPSE
    500.         jz      @f
    501.         shr     edx,1
    502. @@:    add     esi,edx         ; y + size
    503.         sub     edi,edx         ; y - size
    504.         pop     rdx
    505.         shl     edx,1
    506.         or      edx,edx
    507.         jnz     @f
    508.         inc     edx
    509. @@:     mov     _dwSize,rdx
    510.         inc     eax
    511.         cmp     eax,[rbx].WAVE_OBJECT.dwBmpWidth
    512.         jge     .Ret
    513.         cmp     ecx,1
    514.         jl      .Ret
    515.         inc     esi
    516.         cmp     esi,[rbx].WAVE_OBJECT.dwBmpHeight
    517.         jge     .Ret
    518.         cmp     edi,1
    519.         jl      .Ret
    520.         dec     eax
    521.         dec     esi
    522.         mov     dwMaxX,eax
    523.         mov     dwMaxY,esi
    524.         jmp     .loc_endw_1
    525. .loc_while_1:push rdi
    526.         jmp     .loc_endw_2
    527. .loc_while_2:mov eax,ecx
    528.         sub     rax,_dwX
    529.         imul    eax
    530.         push    rax
    531.         mov     eax,edi
    532.         sub     rax,_dwY
    533.         imul    eax
    534.         pop     rdx
    535.         add     eax,edx
    536.         push    rax
    537.         mov     rax,_dwSize
    538.         imul    eax
    539.         pop     rdx
    540.         cmp     edx,eax
    541.         ja      @f
    542.         mov     eax,edi
    543.         mul     [rbx].WAVE_OBJECT.dwBmpWidth
    544.         add     eax,ecx
    545.         shl     eax,2
    546.         add     rax,[rbx].WAVE_OBJECT.lpWave1
    547.         push    _dwWeight
    548.         pop     qword ptr [rax]
    549. @@:     inc     edi
    550. .loc_endw_2:cmp edi,dwMaxY
    551.         jbe     .loc_while_2
    552.         pop     rdi
    553.         inc     ecx
    554. .loc_endw_1:cmp ecx,dwMaxX
    555.         jbe     .loc_while_1
    556.         or      [rbx].WAVE_OBJECT.dwFlag,F_WO_ACTIVE
    557. .Ret:   leave
    558.         ret
    559. _WaveDropStone endp
    560. ; Вызов эффекта по таймеру
    561. _WaveTimerProc proc _hWnd:QWORD,_uMsg:QWORD,_idEvent:QWORD,_dwTime:QWORD
    562. local temp1:qword
    563. local temp2:qword
    564. local dummy[10]:qword
    565.         mov _hWnd,rcx
    566.         mov _uMsg,rdx
    567.         mov _idEvent,r8
    568.         mov _dwTime,r9
    569.         mov     rbx,r8;_idEvent
    570.         invoke _WaveSpread,ebx
    571.         invoke _WaveRender,ebx
    572.         test    [rbx].WAVE_OBJECT.dwFlag,F_WO_NEED_UPDATE
    573.         jz      @f
    574.         invoke  GetDC,[rbx].WAVE_OBJECT.hWnd
    575.         invoke _WaveUpdateFrame,ebx,eax,FALSE
    576.         invoke  ReleaseDC,[rbx].WAVE_OBJECT.hWnd,eax
    577. @@:     test    [rbx].WAVE_OBJECT.dwFlag,F_WO_EFFECT
    578.         jz      .Ret
    579.         mov     eax,[rbx].WAVE_OBJECT.dwEffectType
    580. ; Type1  - мелкий дождь
    581. ; Param1 - скорость
    582. ; Param2 - сила падения капель
    583. ; Param3 - количество кругов на воде
    584.         cmp     eax,1
    585.         jne     .loc_else_1
    586.         mov     edx,[rbx].WAVE_OBJECT.dwEffectParam1
    587.         or      edx,edx
    588.         jz      @f
    589.         invoke _WaveRandom,ebx
    590.         or      eax,eax
    591.         jnz     .Ret
    592. @@:     mov     edx,[rbx].WAVE_OBJECT.dwBmpWidth
    593.         sub     edx,2
    594.         invoke _WaveRandom,ebx
    595.         inc     eax
    596.         mov     temp2,rax
    597.         mov     edx,[rbx].WAVE_OBJECT.dwBmpHeight
    598.         sub     edx,2
    599.         invoke _WaveRandom,ebx
    600.         inc     eax
    601.         mov     temp1,rax
    602.         invoke _WaveRandom,ebx,[rbx].WAVE_OBJECT.dwEffectParam2
    603.         inc     eax
    604.         mov     esi,eax
    605.         invoke _WaveRandom,ebx,[rbx].WAVE_OBJECT.dwEffectParam3
    606.         add     eax,50
    607.         mov [rsp+20h],rax
    608.         invoke _WaveDropStone,ebx,temp2,temp1,esi
    609.         jmp     .loc_endif_1
    610. ; Type2  - глайдер
    611. ; Param1 - скорость движения глайдера
    612. ; Param2 - сила волны
    613. ; Param3 - количество кругов на воде
    614. .loc_else_1:cmp eax,2
    615.         jne     .loc_else_2
    616.         inc     [rbx].WAVE_OBJECT.dwEff2Flip
    617.         test    [rbx].WAVE_OBJECT.dwEff2Flip,1
    618.         jnz     .Ret
    619.         mov     ecx,[rbx].WAVE_OBJECT.dwEff2X
    620.         mov     edx,[rbx].WAVE_OBJECT.dwEff2Y
    621.         add     ecx,[rbx].WAVE_OBJECT.dwEff2XAdd
    622.         add     edx,[rbx].WAVE_OBJECT.dwEff2YAdd
    623.         cmp     ecx,1
    624.         jge     @f
    625.         sub     ecx,1
    626.         neg     ecx
    627.         neg     [rbx].WAVE_OBJECT.dwEff2XAdd
    628. @@:     cmp     edx,1
    629.         jge     @f
    630.         sub     edx,1
    631.         neg     edx
    632.         neg     [rbx].WAVE_OBJECT.dwEff2YAdd
    633. @@:     mov     eax,[rbx].WAVE_OBJECT.dwBmpWidth
    634.         dec     eax
    635.         cmp     ecx,eax
    636.         jl      @f
    637.         sub     ecx,eax
    638.         xchg    eax,ecx
    639.         sub     ecx,eax
    640.         neg     [rbx].WAVE_OBJECT.dwEff2XAdd
    641. @@:     mov     eax,[rbx].WAVE_OBJECT.dwBmpHeight
    642.         dec     eax
    643.         cmp     edx,eax
    644.         jl      @f
    645.         sub     edx,eax
    646.         xchg    eax,edx
    647.         sub     edx,eax
    648.         neg     [rbx].WAVE_OBJECT.dwEff2YAdd
    649. @@:     mov     [rbx].WAVE_OBJECT.dwEff2X,ecx
    650.        mov temp1,rcx
    651.         mov     [rbx].WAVE_OBJECT.dwEff2Y,edx
    652.         mov temp2,rdx
    653.         mov eax,[rbx].WAVE_OBJECT.dwEffectParam3
    654.        mov [rsp+20h],rax
    655.         invoke _WaveDropStone,ebx,temp1,temp2,[rbx].WAVE_OBJECT.dwEffectParam2
    656.         jmp     .loc_endif_1
    657. ; Type3  - проливной дождь
    658. ; Param1 - скорость
    659. ; Param2 - сила падения капель
    660. ; Param3 - количество кругов на воде
    661. .loc_else_2:cmp eax,3
    662.         jne     .loc_endif_1
    663.         xor     edi,edi
    664.         jmp     .loc_endw
    665. .loc_while:mov edx,[rbx].WAVE_OBJECT.dwBmpWidth
    666.         sub     edx,2
    667.         invoke _WaveRandom,ebx
    668.         inc     eax
    669.         mov     temp2,rax
    670.         mov     edx,[rbx].WAVE_OBJECT.dwBmpHeight
    671.         sub     edx,2
    672.         invoke _WaveRandom,ebx
    673.         inc     eax
    674.         mov     temp1,rax
    675.         invoke _WaveRandom,ebx,[rbx].WAVE_OBJECT.dwEffectParam2
    676.         inc     eax
    677.         mov     esi,eax
    678.         invoke _WaveRandom,ebx,[rbx].WAVE_OBJECT.dwEffectParam3
    679.         mov [rsp+20h],rax
    680.         invoke _WaveDropStone,ebx,temp2,temp1,esi
    681.         inc     edi
    682. .loc_endw:cmp edi,[rbx].WAVE_OBJECT.dwEffectParam1
    683.         jbe     .loc_while
    684. .loc_endif_1:
    685. .Ret:   leave
    686.         ret
    687. _WaveTimerProc endp
    688. ; Освобождение ресурсов
    689. _WaveFree proc _lpWaveObject:DWORD
    690.         mov     rbx,rcx
    691.         cmp     [rcx].WAVE_OBJECT.hDcRender,0
    692.         je      @f
    693.         invoke  DeleteDC,[rcx].WAVE_OBJECT.hDcRender
    694. @@:     cmp     [rbx].WAVE_OBJECT.hBmpRender,0
    695.         je      @f
    696.         invoke  DeleteObject,[rbx].WAVE_OBJECT.hBmpRender
    697. @@:     cmp     [rbx].WAVE_OBJECT.lpDIBitsSource,0
    698.         je      @f
    699.         invoke  GlobalFree,[rbx].WAVE_OBJECT.lpDIBitsSource
    700. @@:     cmp     [rbx].WAVE_OBJECT.lpDIBitsRender,0
    701.         je      @f
    702.         invoke  GlobalFree,[rbx].WAVE_OBJECT.lpDIBitsRender
    703. @@:     cmp     [rbx].WAVE_OBJECT.lpWave1,0
    704.         je      @f
    705.         invoke  GlobalFree,[rbx].WAVE_OBJECT.lpWave1
    706. @@:     cmp     [rbx].WAVE_OBJECT.lpWave2,0
    707.         je      @f
    708.         invoke  GlobalFree,[rbx].WAVE_OBJECT.lpWave2
    709. @@:     invoke  KillTimer,[rbx].WAVE_OBJECT.hWnd,ebx
    710.         xor eax,eax
    711.         mov edi,ebx
    712.         mov ecx,sizeof WAVE_OBJECT
    713.         rep stosd
    714.         leave
    715.         ret
    716. _WaveFree endp
    717. .data
    718. stWaveObj       WAVE_OBJECT <>
    719. end
    rc-файл
    Код (C++):
    1. #include "Resource.h"
    2. #define ID_IMG 101
    3. #define ID_BMP 102
    4. #define IDCANCEL 2
    5. #define IDC_DIALOG 200
    6. ID_BMP BITMAP "water.bmp"
    7. IDC_DIALOG DIALOG 0, 0, 346, 250
    8. STYLE DS_CENTER | WS_POPUP | WS_MAXIMIZE | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU
    9. EXSTYLE WS_EX_DLGMODALFRAME
    10. CAPTION "Эффект дождя"
    11. FONT 10, "Arial"
    12. BEGIN
    13.    CONTROL ID_BMP,ID_IMG,"STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 1, 1, 300, 223
    14.    CONTROL "Exit",IDCANCEL,"BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 120, 235, 90, 12
    15. END
    во вложении asm-/rc-/exe-/bmp-файлы

    1.png
     

    Вложения:

    • water.zip
      Размер файла:
      1,5 МБ
      Просмотров:
      93
    miilalex, M0rg0t, GRAFik и ещё 1-му нравится это.