Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Волны
ProcedureDLL UpdateWater_tm()
ForEach Water()
Lis.l=ListIndex(water())
If PeekL(water()\surf+36)<>0
;=================
If water()\ss
hdd.f=0.06
dimple(ListIndex(water()),Random(water()\width),Ra ndom(water()\depth),hdd.f)
EndIf
;--------------------------
For xm= 1 To water()\width+1
For zm=1 To water()\depth +5
If zm<water()\depth-1 And xm<water()\width-1
yv.f=nU(Lis,xm,zm)*water()\h
PokeF (memM(Lis,xm,zm)+4,yv.f)
heiM (Lis,xm,zm)=yv.f
laplas.f=(nU(Lis,xm-1,zm)+nU(Lis,xm+1,zm)+nU(Lis,xm,zm+1)+nU(Lis,xm,zm-1))*0.25-nU(Lis,xm,zm)
pU(Lis,xm,zm)=((2.0-water()\sd)*nU(Lis,xm,zm)-pU(Lis,xm,zm)*(1.0-water()\sd)+laplas)
EndIf
;================================================= =
If zm>4
zmn=zm-5
xmn=xm-1
;-----------------normal-------
e1.f And e0.f=heiM (Lis,xmn,zmn)
If xmn<water()\width
e0.f=heiM (Lis,xmn+1,zmn)
EndIf
If xmn>0
e1.f=heiM (Lis,xmn-1,zmn)
EndIf
xn.f=-(e0.f-e1.f)
e1.f And e0.f=heiM (Lis,xmn,zmn)
If zmn<water()\depth
e0.f=heiM (Lis,xmn,zmn+1)
EndIf
If zmn>0
e1.f=heiM (Lis,xmn,zmn-1)
EndIf
zn.f=e0.f-e1.f
yn.f=4
;--------------------normalisate--------
;-------------------------
PokeF (memM(Lis,xmn,zmn)+12,xn.f)
PokeF (memM(Lis,xmn,zmn)+16,yn.f)
PokeF (memM(Lis,xmn,zmn)+20,zn.f)
EndIf
Next
Next
;================================
;EndIf
*Sw=AllocateMemory(65535)
RtlMoveMemory_(*Sw,@pU(Lis,0,0),65535)
RtlMoveMemory_(@pU(Lis,0,0),@nU(Lis,0,0),65535)
RtlMoveMemory_(@nU(Lis,0,0),*Sw,65535)
FreeMemory(*Sw)
PokeL(water()\surf+36,0)
EndIf
Next
EndProcedure
;================================
__________________
|