This is the fastest way to get this without a shader.
http://forum.thegamecreators.com/?m=forum_view&t=145552&b=6
Here is my really fast version (dll is written in assembler).
sync on : sync rate 0 :randomize timer() : autocam off
color backdrop rgb(64, 64, 255)
set ambient light 35
ink rgb(0, 255, 255), 0
PerlinDll()
load dll "temp.dat", 1
rem image and noise size (128, 256, 512, 1024)
rem above 512 a update make no sens (not recommanded)
call dll 1, "PerlinMakeNoise", 1, 128
make object plain 1, 640, 480
move object 1, - 399
texture object 1, 1
ghost object on 1
rem interpolation line(0) oder cos(1)
rem cosinus is somewhat better (but slow)
call dll 1,"PerlinSetMode", 1
rem smoothing (1-5)
call dll 1,"PerlinSetSmoothing", 1
rem cloud cover (0-100)
call dll 1,"PerlinSetOpacity", 25
rem sharpness (0.50 - 0.99)
call dll 1,"PerlinSetSharpness", 0.95
repeat
set cursor 0, 0
print "FPS: ", screen fps()
scroll object texture 1, 0.001, 0.001
rem noise updaten to next frame
call dll 1, "PerlinUpdateNoise"
sync
until mouseclick()
rem free all
call dll 1, "PerlinDeleteNoise"
end
`---------------------------------------------------------------------------------
function PerlinDll()
if file exist("temp.dat") then delete file "temp.dat"
open to write 1,"temp.dat"
do
read d$
if not len(d$) then exit
for i = 1 to len(d$) step 2
write byte 1, GetByte(d$, i)
next i
loop
dummy = memblock exist(1)
close file 1
endfunction
function GetByte(d$, i)
h = asc(mid$(d$, i)) - 48
l = asc(mid$(d$, i + 1)) - 48
b = (h - (h > 9) * 7) << 4
b = b + (l - (l > 9) * 7)
endfunction b
`---------------------------------------------------------------------------------
data "4D5A80000100000004001000FFFF0000400100000000000040000000000000000000000000000000"
data "0000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD215468"
data "69732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0A24"
data "0000000000000000504500004C0105008851B4490000000000000000E0000E210B010143000C0000"
data "00080000000000000020000000200000001000000000400000100000000200000100000000000000"
data "04000000000000000060000000040000FD3B00000200000000100000001000000000010000000000"
data "000000001000000000400000F200000000300000C800000000000000000000000000000000000000"
data "000000000000000000500000B6000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "000000000000000000000000000000002E6461746100000058000000001000000002000000040000"
data "000000000000000000000000400000C02E636F64650000002A0B000000200000000C000000060000"
data "000000000000000000000000200000602E69646174610000C8000000003000000002000000120000"
data "000000000000000000000000400000C02E65646174610000F2000000004000000002000000140000"
data "000000000000000000000000400000402E72656C6F630000B6000000005000000002000000160000"
data "00000000000000000000000040000002000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "000000008000000000010000000200000004000002000000190000003333733F0000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "000000000000000000000000000000005589E583EC04E80E000000444250726F436F72652E646C6C"
data "00FF1552304000E80F0000003F526E644C4C404059414848405A0050FF1556304000A300104000E8"
data "18000000444250726F4D656D626C6F636B7344656275672E646C6C00FF15523040008945FCE81700"
data "00003F4D616B654D656D626C6F636B40405941584848405A00FF75FCFF1556304000A304104000E8"
data "180000003F4765744D656D626C6F636B507472404059414B48405A00FF75FCFF1556304000A30810"
data "4000E8220000003F437265617465496D61676546726F6D4D656D626C6F636B40405941584848405A"
data "00FF75FCFF1556304000A30C104000E8170000003F4D656D626C6F636B4578697374404059414848"
data "405A00FF75FCFF1556304000A310104000E8180000003F44656C6574654D656D626C6F636B404059"
data "415848405A00FF75FCFF1556304000A314104000B801000000C9C20C005589E56801010000FF1510"
data "10400083C40409C07404C9C20800FF75088F0530104000BE3C104000B904000000FCAD3B450C7409"
data "E2F8C7450C000100008B450CA31C104000F7E0C1E00283C00C506801010000FF150410400083C408"
data "6801010000FF150810400083C40489C783C00CA318104000A11C104000FCABABC70720000000C1E8"
data "0383C002A32C104000F7252C104000C1E002506820104000E8BD070000506824104000E8B2070000"
data "506828104000E8A7070000FF3520104000E8AD000000E860030000C9C208005589E5FF75088F0534"
data "104000C9C204005589E5FF75088F054C104000C9C204005589E5FF75088F0550104000C9C2040055"
data "89E5FF75088F0554104000C9C20400833D3810400000751AC7053810400020000000FF3524104000"
data "E846000000E8B9050000FF0D38104000E821060000E8E9020000C3FF3520104000E833070000FF35"
data "24104000E828070000FF3528104000E81D0700006801010000FF151410400083C404C35589E583EC"
data "08C745F801000000C745FC0100000068FF000000FF150010400083C40450FF75FCFF75F8FF7508E8"
data "3D060000A12C10400048FF45FC3945FC75D5FF45F83945F875C6FF7508E83C010000FF7508E80400"
data "0000C9C204005589E583EC0C8B0D4C104000C745F401000000C745F801000000FF75F8FF75F4FF75"
data "08E8D0050000C1E8028945FCFF4DF4FF75F8FF75F4FF7508E8B905000089C38345F402FF75F8FF75"
data "F4FF7508E8A505000001C3FF4DF4FF4DF8FF75F8FF75F4FF7508E88F05000001C38345F802FF75F8"
data "FF75F4FF7508E87B05000001C3FF4DF8C1EB03015DFCFF4DF4FF4DF8FF75F8FF75F4FF7508E85C05"
data "000089C38345F402FF75F8FF75F4FF7508E84805000001C38345F802FF75F8FF75F4FF7508E83405"
data "000001C3836DF402FF75F8FF75F4FF7508E82005000001C3FF45F4FF4DF8C1EB04015DFCFF75FCFF"
data "75F8FF75F4FF7508E81C050000A12C10400048FF45F83945F80F8511FFFFFFFF45F43945F40F85FE"
data "FEFFFFFF7508E813000000490F85E8FEFFFFFF7508E8E1000000C9C204005589E583EC14C745FC01"
data "000000C745EC01000000A12C104000488945F4488945F0C745F800000000FF75FCFF75ECFF7508E8"
data "9204000050FF75FCFF75F4FF7508E89E040000FF75FCFF75F0FF7508E87504000050FF75FCFF75F8"
data "FF7508E881040000A12C10400048FF45FC3945FC75B8C745FC00000000C745EC01000000A12C1040"
data "00488945F4488945F0C745F800000000FF75ECFF75FCFF7508E82804000050FF75F4FF75FCFF7508"
data "E834040000FF75F0FF75FCFF7508E80B04000050FF75F8FF75FCFF7508E817040000A12C104000FF"
data "45FC3945FC75B9C9C204005589E583EC08C745F800000000C745FC00000000FF75FCFF75F8FF7508"
data "E8C903000050E8FD04000050FF75FCFF75F8FF7508E8CF030000A12C104000FF45FC3945FC75D0FF"
data "45F83945F875C1C9C204005589E583EC14C745F400000000C745F801000000C745FC080000008B3D"
data "18104000A11C104000F7E089C131C0FCF3ABC745EC00000000C745F000000000FF75F8FF75ECE810"
data "05000089C3FF75F8FF75F0E8030500005053E84F00000098F775FC50FF75F0FF75ECE8A7030000A1"
data "1C104000FF45F03945F075C4FF45EC3945EC75B5D165F8D16DFCFF45F4837DF404759FE8A3010000"
data "6801010000FF3530104000FF150C10400083C408C9C35589E583EC18FF7508E82C0400008945E850"
data "FF7508E880040000894508FF750CE8150400008945EC50FF750CE86904000089450C8B1D2C104000"
data "83EB0253FF75E8E8D40300008945F0FF45E853FF75E8E8C50300008945F453FF75ECE8B903000089"
data "45F8FF45EC53FF75ECE8AA0300008945FC833D34104000010F849B000000FF75FCFF75F0FF352010"
data "4000E85F02000089C3FF75FCFF75F4FF3520104000E84C0200005350E828040000FF750850E83204"
data "00005350E80504000089C3FF75F8FF75F0FF3520104000E82202000089C1FF75F8FF75F4FF352010"
data "4000E80F0200005150E8EB030000FF750850E8F50300005150E8C803000089C15053E8D2030000FF"
data "750C50E8DC0300005150E8AF03000050E823030000C9C20800FF75FCFF75F0FF3520104000E8C401"
data "000089C3FF75FCFF75F4FF3520104000E8B1010000FF75085053E87902000050FF75F8FF75F0FF35"
data "20104000E89501000089C3FF75F8FF75F4FF3520104000E882010000FF75085053E84A0200005BFF"
data "750C5350E83F02000050E8B1020000C9C208005589E583EC08C745F800000000C745FC00000000FF"
data "75FCFF75F8E87D010000BBFF0000002B1D5010400029D883F8007F05B80000000050FF3554104000"
data "E89D0200006800007F4350E80C030000506800007F43E8EE02000050E84F02000088C4C1E00888E0"
data "50FF75FCFF75F8E849010000A11C104000FF45FC3945FC7596FF45F83945F87587C9C35589E583EC"
data "08C745F800000000C745FC00000000FF75FCFF75F8FF3520104000E8B600000089C3FF75FCFF75F8"
data "FF3524104000E8A30000005350E87F020000680000004250E89A02000050FF75FCFF75F8FF352810"
data "4000E89A000000A12C104000FF45FC3945FC75ABFF45F83945F8759CC9C35589E583EC08C745F800"
data "000000C745FC00000000FF75FCFF75F8FF3520104000E84300000089C3FF75FCFF75F8FF35281040"
data "00E8300000005350E8F901000050FF75FCFF75F8FF3520104000E832000000A12C104000FF45FC39"
data "45FC75B6FF45F83945F875A7C9C35589E58B7508A12C104000F7651003450CC1E00201C6ADC9C20C"
data "005589E58B7D08A12C104000F7651003450CC1E00201C78B4514ABC9C210005589E58B3518104000"
data "A11C104000F7650C034508C1E00201C6ADC9C208005589E58B3D18104000A11C104000F7650C0345"
data "08C1E00201C78B4510ABC9C20C005589E58B3518104000A11C104000F7650C034508C1E00201C689"
data "F7AD034510ABC9C20C005589E550FF750C6A00FF155A30400050FF155E3040008B7D08AB58C9C208"
data "005589E5FF7508FF156230400050FF1566304000C9C204005589E568DB0F4940FF7510E814010000"
data "50E88200000050680000803FE8F0000000680000004050E80B01000089C350680000803FE8D80000"
data "0050FF7508E8E200000089C153FF750CE8D70000005150E8AA000000C9C20C005589E58B450898F7"
data "750C89D0C9C208005589E5DB4508D95D088B4508C9C204005589E583EC049BD97DFC66814DFC000C"
data "D96DFCD94508DB5D088B4508C9C204005589E5D94508D9FFD95D088B4508C9C204005589E5837D0C"
data "007509B80000803FC9C20800837D0C01740F8B4D0C49D94508D84D08E2FBD95D088B4508C9C20800"
data "5589E5D94508DA650CD95D0C8B450CC9C208005589E5DB4508DA750CD95D0C8B450CC9C208005589"
data "E5D94508D8450CD95D0C8B450CC9C208005589E5D94508D8650CD95D0C8B450CC9C208005589E5D9"
data "4508D84D0CD95D0C8B450CC9C208005589E5D94508D8750CD95D0C8B450CC9C20800000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000003630000000000000000000002830000052300000000000000000000000000000"
data "00000000000000004B45524E454C33322E444C4C00006E3000008230000094300000A2300000AE30"
data "0000BC300000000000006E3000008230000094300000A2300000AE300000BC300000000000000000"
data "4765744D6F64756C6548616E646C65410000000047657450726F6341646472657373000000004C6F"
data "63616C416C6C6F63000000004C6F63616C4C6F636B0000004C6F63616C48616E646C650000004C6F"
data "63616C46726565000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "0000000000000000000000006E400000010000000700000007000000284000004440000060400000"
data "4D21000017220000272200003722000047220000572200008B220000E04000007940000089400000"
data "AA400000BB40000097400000CE40000006000000010003000400020005005045524C494E2E444C4C"
data "005065726C696E4D616B654E6F697365005065726C696E5365744D6F6465005065726C696E536574"
data "536D6F6F7468696E67005065726C696E5365744F706163697479005065726C696E53657453686172"
data "706E657373005065726C696E5570646174654E6F697365005065726C696E44656C6574654E6F6973"
data "65000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "000000000000000000000000000000000000000000000000000000000000000000200000B6000000"
data "1B3036303B305E3086308B30B130B630E630EB30103115313B31403157316B3170318D31A131AF31"
data "BC31C131D531DB31E431EF31FA3105321F322F323F324F32593262326C327C328D329832A332B332"
data "D632ED321E330E345B34A934C53413355B3590359535E0350F36153654369336A636B936E336F636"
data "4137543770378337D137E4371D384F38623886389038C238D538EE38F838153930394C3951396A39"
data "6F398B399039B539BC39D139D8390000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
data "000000000000000000000000000000000000000000000000"
If you need the assembler code.
; ============================
; = DLL Perlin Noise for DBP =
; ============================
format PE GUI 4.0 DLL
entry DllEntryPoint
include 'includewin32ax.inc'
section '.data' data readable writeable
NOISE_MB = 257
DBP_Rnd dd 0
DBP_MakeMemblock dd 0
DBP_GetMemblockPtr dd 0
DBP_MakeImageFromMemblock dd 0
DBP_MemblockExist dd 0
DBP_DeleteMemblock dd 0
pNoiseMem dd 0
oNoiseMem dd 0
pNoiseSource dd 0
pNoiseTarget dd 0
pNoiseFading dd 0
oNoiseMap dd 0
NoiseImage dd 0
NoiseMode dd 0
NoiseFrame dd 0
NoiseSize dd 128, 256, 512, 1024
NoiseSmooth dd 2
NoiseOpacity dd 25
NoiseSharp dd 0.95
NoiseSteps dd 32
section '.code' code readable executable
proc DllEntryPoint hinstDLL, fdwReason, lpvReserved
local hModule dd ?
invoke GetModuleHandle, "DBProCore.dll"
invoke GetProcAddress, eax, "?RndLL@@YAHH@Z"
mov [DBP_Rnd], eax
invoke GetModuleHandle, "DBProMemblocksDebug.dll"
mov [hModule], eax
invoke GetProcAddress, [hModule], "?MakeMemblock@@YAXHH@Z"
mov [DBP_MakeMemblock], eax
invoke GetProcAddress, [hModule], "?GetMemblockPtr@@YAKH@Z"
mov [DBP_GetMemblockPtr], eax
invoke GetProcAddress, [hModule], "?CreateImageFromMemblock@@YAXHH@Z"
mov [DBP_MakeImageFromMemblock], eax
invoke GetProcAddress, [hModule], "?MemblockExist@@YAHH@Z"
mov [DBP_MemblockExist], eax
invoke GetProcAddress, [hModule], "?DeleteMemblock@@YAXH@Z"
mov [DBP_DeleteMemblock], eax
mov eax, TRUE
ret
endp
; global functions ------------------------------------------------------------
proc PerlinMakeNoise Image, Size
cinvoke DBP_MemblockExist, NOISE_MB
or eax, eax
jz .L1
ret
.L1: push [Image]
pop [NoiseImage]
mov esi, NoiseSize
mov ecx, 4
cld
.L2: lodsd
cmp eax, [Size]
je .L3
loop .L2
mov [Size], 256
.L3: mov eax, [Size]
mov [oNoiseMem], eax
mul eax
shl eax, 2
add eax, 12
cinvoke DBP_MakeMemblock, NOISE_MB, eax
cinvoke DBP_GetMemblockPtr, NOISE_MB
mov edi, eax
add eax, 12
mov [pNoiseMem], eax
mov eax, [oNoiseMem]
cld
stosd
stosd
mov [edi], dword 32
shr eax, 3
add eax, 2
mov [oNoiseMap], eax
mul [oNoiseMap]
shl eax, 2
stdcall AllocMem, pNoiseSource, eax
stdcall AllocMem, pNoiseTarget, eax
stdcall AllocMem, pNoiseFading, eax
stdcall MakeNoise, [pNoiseSource]
stdcall ViewNoise
ret
endp
proc PerlinSetMode Var
push [Var]
pop [NoiseMode]
ret
endp
proc PerlinSetSmoothing Var
push [Var]
pop [NoiseSmooth]
ret
endp
proc PerlinSetOpacity Var
push [Var]
pop [NoiseOpacity]
ret
endp
proc PerlinSetSharpness Var
push [Var]
pop [NoiseSharp]
ret
endp
proc PerlinUpdateNoise
mov eax, [NoiseSteps]
cmp [NoiseFrame], eax
jne .L1
mov [NoiseFrame], 32
stdcall MakeNoise, [pNoiseTarget]
stdcall MakeNoiseFade
.L1: dec [NoiseFrame]
stdcall FadeNoise
stdcall ViewNoise
ret
endp
proc PerlinDeleteNoise
stdcall FreeMem, [pNoiseSource]
stdcall FreeMem, [pNoiseTarget]
stdcall FreeMem, [pNoiseFading]
cinvoke DBP_DeleteMemblock, NOISE_MB
ret
endp
; global functions ------------------------------------------------------------
; perlin functions ------------------------------------------------------------
proc MakeNoise pMap
local X dd ?, Y dd ?
mov [X], 1
.X: mov [Y], 1
.Y: cinvoke DBP_Rnd, 255
stdcall SaveNoiseMap, [pMap], [X], [Y], eax
mov eax, [oNoiseMap]
dec eax
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X], eax
jne .X
stdcall MatchNoise, [pMap]
stdcall SmoothNoise, [pMap]
ret
endp
proc SmoothNoise pMap
local X dd ?, Y dd ?, D dd ?
mov ecx, [NoiseSmooth]
.S: mov [X], 1
.X: mov [Y], 1
.Y: stdcall LoadNoiseMap, [pMap], [X], [Y]
shr eax, 2
mov [D], eax
dec [X]
stdcall LoadNoiseMap, [pMap], [X], [Y]
mov ebx, eax
add [X], 2
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
dec [X]
dec [Y]
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
add [Y], 2
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
dec [Y]
shr ebx, 3
add [D], ebx
dec [X]
dec [Y]
stdcall LoadNoiseMap, [pMap], [X], [Y]
mov ebx, eax
add [X], 2
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
add [Y], 2
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
sub [X], 2
stdcall LoadNoiseMap, [pMap], [X], [Y]
add ebx, eax
inc [X]
dec [Y]
shr ebx, 4
add [D], ebx
stdcall SaveNoiseMap, [pMap], [X], [Y], [D]
mov eax, [oNoiseMap]
dec eax
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X], eax
jne .X
stdcall MatchNoise, [pMap]
dec ecx
jnz .S
stdcall FloatNoise, [pMap]
ret
endp
proc MatchNoise pMap
local S1 dd ?, S2 dd ?, D1 dd ?, D2 dd ?, ID dd ?
mov [ID], 1
mov [S1], 1
mov eax, [oNoiseMap]
dec eax
mov [D1], eax
dec eax
mov [S2], eax
mov [D2], 0
.V: stdcall LoadNoiseMap, [pMap], [S1], [ID]
stdcall SaveNoiseMap, [pMap], [D1], [ID], eax
stdcall LoadNoiseMap, [pMap], [S2], [ID]
stdcall SaveNoiseMap, [pMap], [D2], [ID], eax
mov eax, [oNoiseMap]
dec eax
inc [ID]
cmp [ID], eax
jne .V
mov [ID], 0
mov [S1], 1
mov eax, [oNoiseMap]
dec eax
mov [D1], eax
dec eax
mov [S2], eax
mov [D2], 0
.H: stdcall LoadNoiseMap, [pMap], [ID], [S1]
stdcall SaveNoiseMap, [pMap], [ID], [D1], eax
stdcall LoadNoiseMap, [pMap], [ID], [S2]
stdcall SaveNoiseMap, [pMap], [ID], [D2], eax
mov eax, [oNoiseMap]
inc [ID]
cmp [ID], eax
jne .H
ret
endp
proc FloatNoise, pMap
local X dd ?, Y dd ?
mov [X], 0
.X: mov [Y], 0
.Y: stdcall LoadNoiseMap, [pMap], [X], [Y]
stdcall Float, eax
stdcall SaveNoiseMap, [pMap], [X], [Y], eax
mov eax, [oNoiseMap]
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X], eax
jne .X
ret
endp
proc ViewNoise
local X dd ?, Y dd ?, O dd ?, F dd ?, A dd ?
mov [O], 0
mov [F], 1
mov [A], 8
mov edi, [pNoiseMem]
mov eax, [oNoiseMem]
mul eax
mov ecx, eax
xor eax, eax
cld
rep stosd
.O: mov [X], 0
.X: mov [Y], 0
.Y: stdcall IntDivInt, [X], [F]
mov ebx, eax
stdcall IntDivInt, [Y], [F]
stdcall InterpolateNoise, ebx, eax
cwde
div [A]
stdcall AddNoiseMem, [X], [Y], eax
mov eax, [oNoiseMem]
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X],eax
jne .X
shl [F], 1
shr [A], 1
inc [O]
cmp [O], 4
jne .O
stdcall CurveNoise
cinvoke DBP_MakeImageFromMemblock, [NoiseImage], NOISE_MB
ret
endp
proc InterpolateNoise fX, fY
local X dd ?, Y dd ?, X1 dd ?, X2 dd ?, Y1 dd ?, Y2 dd ?
stdcall Integer, [fX]
mov [X], eax
stdcall FltSubInt, [fX], eax
mov [fX], eax
stdcall Integer, [fY]
mov [Y], eax
stdcall FltSubInt, [fY], eax
mov [fY], eax
mov ebx, [oNoiseMap]
sub ebx, 2
stdcall Modulo, [X], ebx
mov [X1], eax
inc [X]
stdcall Modulo, [X], ebx
mov [X2], eax
stdcall Modulo, [Y], ebx
mov [Y1], eax
inc [Y]
stdcall Modulo, [Y], ebx
mov [Y2], eax
cmp [NoiseMode], 1
je .M
stdcall LoadNoiseMap, [pNoiseSource], [X1], [Y2]
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseSource], [X2], [Y2]
stdcall FltSubFlt, eax, ebx
stdcall FltMulFlt, eax, [fX]
stdcall FltAddFlt, eax, ebx
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseSource], [X1], [Y1]
mov ecx, eax
stdcall LoadNoiseMap, [pNoiseSource], [X2], [Y1]
stdcall FltSubFlt, eax, ecx
stdcall FltMulFlt, eax, [fX]
stdcall FltAddFlt, eax, ecx
mov ecx, eax
stdcall FltSubFlt, ebx, eax
stdcall FltMulFlt, eax, [fY]
stdcall FltAddFlt, eax, ecx
stdcall Integer, eax
ret
.M: stdcall LoadNoiseMap, [pNoiseSource], [X1], [Y2]
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseSource], [X2], [Y2]
stdcall CosInterpolate, ebx, eax, [fX]
push eax
stdcall LoadNoiseMap, [pNoiseSource], [X1], [Y1]
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseSource], [X2], [Y1]
stdcall CosInterpolate, ebx, eax, [fX]
pop ebx
stdcall CosInterpolate, eax, ebx, [fY]
stdcall Integer, eax
ret
endp
proc CurveNoise
local X dd ?, Y dd ?
mov [X], 0
.X: mov [Y], 0
.Y: stdcall LoadNoiseMem, [X], [Y]
mov ebx, 255
sub ebx, [NoiseOpacity]
sub eax, ebx
cmp eax, 0
jg .G
mov eax, 0
.G: stdcall FltExpInt, [NoiseSharp], eax
stdcall FltMulFlt, eax, 255.0
stdcall FltSubFlt, 255.0, eax
stdcall Integer, eax
mov ah, al
shl eax, 8
mov al, ah
stdcall SaveNoiseMem, [X], [Y], eax
mov eax, [oNoiseMem]
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X],eax
jne .X
ret
endp
proc MakeNoiseFade
local X dd ?, Y dd ?
mov [X], 0
.X: mov [Y], 0
.Y: stdcall LoadNoiseMap, [pNoiseSource], [X], [Y]
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseTarget], [X], [Y]
stdcall FltSubFlt, eax, ebx
stdcall FltDivFlt, eax, 32.0
stdcall SaveNoiseMap, [pNoiseFading], [X], [Y], eax
mov eax, [oNoiseMap]
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X], eax
jne .X
ret
endp
proc FadeNoise
local X dd ?, Y dd ?
mov [X], 0
.X: mov [Y], 0
.Y: stdcall LoadNoiseMap, [pNoiseSource], [X], [Y]
mov ebx, eax
stdcall LoadNoiseMap, [pNoiseFading], [X], [Y]
stdcall FltAddFlt, eax, ebx
stdcall SaveNoiseMap, [pNoiseSource], [X], [Y], eax
mov eax, [oNoiseMap]
inc [Y]
cmp [Y], eax
jne .Y
inc [X]
cmp [X], eax
jne .X
ret
endp
proc LoadNoiseMap pMap, X, Y
mov esi, [pMap]
mov eax, [oNoiseMap]
mul [Y]
add eax, [X]
shl eax, 2
add esi, eax
lodsd
ret
endp
proc SaveNoiseMap pMap, X, Y, D
mov edi, [pMap]
mov eax, [oNoiseMap]
mul [Y]
add eax, [X]
shl eax, 2
add edi, eax
mov eax, [D]
stosd
ret
endp
proc LoadNoiseMem X, Y
mov esi, [pNoiseMem]
mov eax, [oNoiseMem]
mul [Y]
add eax, [X]
shl eax, 2
add esi, eax
lodsd
ret
endp
proc SaveNoiseMem X, Y, D
mov edi, [pNoiseMem]
mov eax, [oNoiseMem]
mul [Y]
add eax, [X]
shl eax, 2
add edi, eax
mov eax, [D]
stosd
ret
endp
proc AddNoiseMem X, Y, D
mov esi, [pNoiseMem]
mov eax, [oNoiseMem]
mul [Y]
add eax, [X]
shl eax, 2
add esi, eax
mov edi, esi
lodsd
add eax, [D]
stosd
ret
endp
; end of perlin functions -----------------------------------------------------
; local functions -------------------------------------------------------------
proc AllocMem pMem, Size
push eax
invoke LocalAlloc, 0, [Size]
invoke LocalLock, eax
mov edi, [pMem]
stosd
pop eax
ret
endp
proc FreeMem pMem
invoke LocalHandle, [pMem]
invoke LocalFree, eax
ret
endp
proc CosInterpolate, A, B, X
stdcall FltMulFlt, [X], 3.1415927
stdcall Cosine, eax
stdcall FltSubFlt, 1.0, eax
stdcall FltDivFlt, eax, 2.0
mov ebx, eax
stdcall FltSubFlt, 1.0, eax
stdcall FltMulFlt, [A], eax
mov ecx, eax
stdcall FltMulFlt, [B], ebx
stdcall FltAddFlt, eax, ecx
ret
endp
proc Modulo A, B
mov eax, [A]
cwde
div [B]
mov eax, edx
ret
endp
proc Float A
fild [A]
fstp [A]
mov eax, [A]
ret
endp
proc Integer A
local CW dw ?
fstcw [CW]
or [CW], 0x0c00
fldcw [CW]
fld [A]
fistp [A]
mov eax, [A]
ret
endp
proc Cosine A
fld [A]
fcos
fstp [A]
mov eax, [A]
ret
endp
proc FltExpInt A, B
cmp [B], 0
jne .L1
mov eax, 1.0
ret
.L1: cmp [B], 1
je .L3
mov ecx, [B]
dec ecx
fld [A]
.L2: fmul [A]
loop .L2
fstp [A]
.L3: mov eax, [A]
ret
endp
proc FltSubInt A, B
fld [A]
fisub [B]
fstp [B]
mov eax, [B]
ret
endp
proc IntDivInt A, B
fild [A]
fidiv [B]
fstp [B]
mov eax, [B]
ret
endp
proc FltAddFlt A, B
fld [A]
fadd [B]
fstp [B]
mov eax, [B]
ret
endp
proc FltSubFlt A, B
fld [A]
fsub [B]
fstp [B]
mov eax, [B]
ret
endp
proc FltMulFlt A, B
fld [A]
fmul [B]
fstp [B]
mov eax, [B]
ret
endp
proc FltDivFlt A, B
fld [A]
fDiv [B]
fstp [B]
mov eax, [B]
ret
endp
; end of local functions ------------------------------------------------------
section '.idata' import data readable writeable
library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL'
import kernel32,
GetModuleHandle, 'GetModuleHandleA',
GetProcAddress, 'GetProcAddress',
LocalAlloc, 'LocalAlloc',
LocalLock, 'LocalLock',
LocalHandle, 'LocalHandle',
LocalFree, 'LocalFree'
section '.edata' export data readable
export 'PERLIN.DLL',
PerlinMakeNoise, 'PerlinMakeNoise',
PerlinSetMode, 'PerlinSetMode',
PerlinSetSmoothing, 'PerlinSetSmoothing',
PerlinSetOpacity, 'PerlinSetOpacity',
PerlinSetSharpness, 'PerlinSetSharpness',
PerlinUpdateNoise, 'PerlinUpdateNoise',
PerlinDeleteNoise, 'PerlinDeleteNoise'
section '.reloc' fixups data discardable
This code is written for FASM Assembler.
You want it faster

:
PerlinMakeNoise 128
PerlinSetMode 0
PerlinSetSmoothing 4
PerlinSetOpacity 30
PerlinSetSharpness 0.80
I think it's ok ...