Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Организация системы частиц
;MsgDebug(str())
;******************************************
Declare RGBA(rl.l,g.l,b.l,l.l)
Structure v
x.f
y.f
z.f
EndStructure
Structure pas
mem.l[4]
surf.l
ver.l
EndStructure
Structure Sf
surf.l
entity.l
ver.l
EndStructure
Structure act
mem.l[4]
surf.l
ver.l
x.f ;position
y.f
z.f
xr.f ;rotate position entity
yr.f
;zr.f
xm.f ;move entity
ym.f
zm.f
xmd.f ;delta move
ymd.f
zmd.f
xt.f ;turn entity
yt.f
xtd.f ;delta turn
ytd.f
xd.f ;speed translate
yd.f
zd.f
xda.f ;delta speedT
yda.f
zda.f
r.f ;color
g.f
b.f
rd.f ;delta color
gd.f
bd.f
rot.f ;rotate texture
al.f ;alpha
sc.f ;size
osc.f ;size obraz
fsqr.l ;flag sqr
rotd.f ;delta rotate
ald.f ;delta alpha
scd.f ;delta scale
liv.f ;lives
bild.l
EndStructure
ProcedureDLL AttachProcess(Hinstance)
Global camera.l,vec
Global surfPart
Global a.act
Global p.pas
Global countP,countA
NewList a.act()
NewList p.pas()
NewList s.Sf()
Dim d.f(3,3)
EndProcedure
;*******************************************************************
ProcedureDLL CreateBank_tm(surf.l,count,cam)
f.l= PeekL(surf+28)
camera=cam
For ver.l=0 To count-1 Step 4
AddElement(p())
;MsgDebug(Str(ver))
p()\ver=ver
For i=0 To 3
p()\mem[i]=f.l+((ver+i)*64)
p()\surf=surf.l
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
Next
AddElement(s())
s()\surf=surf
s()\entity=mesh
s()\ver=count-1
;MsgDebug(Str(s()\ver))
EndProcedure
;=====================================
ProcedureDLL AddBank_tm(surf.l,count)
f.l= PeekL(surf+28)
ForEach s()
If s()\surf=surf
vera.l=s()\ver
; MsgDebug(Str(vera))
s()\ver=s()\ver+count*4
EndIf
Next
;------------------------
For ver.l=vera+1 To vera+count*4 Step 4
AddElement(p())
p()\surf=surf.l
p()\ver=ver
For i=0 To 3
p()\mem[i]=f.l+((ver+i)*64)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
Next
;--------------------------
ForEach a()
If a()\surf=surf
;MsgDebug(Str(a()\ver))
For i=0 To 3
a()\mem[i]=f.l+((a()\ver+i)*64)
Next
EndIf
Next
;----------------------------
ForEach p()
If p()\surf=surf
For i=0 To 3
p()\mem[i]=f.l+((p()\ver+i)*64)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
EndIf
Next
;-------------------
;
EndProcedure
;===============================
ProcedureDLL DeleteBank_tm(surf.l)
ForEach a()
If a()\surf=surf
DeleteElement(a())
EndIf
Next
ForEach p()
If p()\surf=surf
DeleteElement(p())
EndIf
Next
ForEach s()
If s()\surf=surf
DeleteElement(s())
EndIf
Next
EndProcedure
;================================
ProcedureDLL AddParticle_tm(surf.l,x.f, y.f, z.f, xr.f,yr.f,xm.f,ym.f,zm.f, xmd.f,ymd.f,zmd.f, xt.f,yt.f, xtd.f,ytd.f, xd.f, yd.f, zd.f,xda.f, yda.f, zda.f,r.f,g.f,b.f,rd.f,gd.f,bd.f, rot.f,rotd.f, al.f, ald.f, sc.f, scd.f,fsqr.l, liv.f,bild.l)
yspeh=0
e=LastElement(p())
ee:
If e<>0
If p()\surf<>surf
e=PreviousElement(p())
Goto ee
EndIf
;----------------------------
yspeh=1
AddElement(a())
a()\ver=p()\ver
For i=0 To 3
a()\mem[i]=p()\mem[i]
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
a()\surf=p()\surf
a()\x=x
a()\y=y
a()\z=z
a()\xr=xr*0.017453
a()\yr=yr*0.017453
a()\xm=xm
a()\ym=ym
a()\zm=zm
a()\xmd=xmd
a()\ymd=ymd
a()\zmd=zmd
a()\xt=xt
a()\yt=yt
a()\ xtd=xtd
a()\ ytd=ytd
a()\xd=xd
a()\yd=yd
a()\zd=zd
a()\xda=xda
a()\yda=yda
a()\zda=zda
a()\r=r
a()\g=g
a()\b=b
a()\rd=rd
a()\gd=gd
a()\bd=bd
a()\rot=(rot-45)*0.017453
a()\al=al
a()\sc=sc
a()\osc=sc
a()\ rotd=rotd*0.017453
a()\ald=ald
a()\scd=scd
a()\fsqr=fsqr.l
a()\liv=liv
a()\bild=bild
;=============================
PokeF (a()\mem[0],a()\x-1)
PokeF (a()\mem[0]+4,a()\y+1)
PokeF (a()\mem[0]+8,a()\z)
PokeF (a()\mem[1],a()\x+1)
PokeF (a()\mem[1]+4,a()\y+1)
PokeF (a()\mem[1]+8,a()\z)
PokeF (a()\mem[2],a()\x+1)
PokeF (a()\mem[2]+4,a()\y-1)
PokeF (a()\mem[2]+8,a()\z)
PokeF (a()\mem[3],a()\x-1)
PokeF (a()\mem[3]+4,a()\y-1)
PokeF (a()\mem[3]+8,a()\z)
DeleteElement(p())
EndIf
ProcedureReturn yspeh
EndProcedure
;================================
ProcedureDLL UpdateParticle_tm()
countA=0
;============================
camX.f=PeekF(camera+16*4)
camY.f=PeekF(camera+17*4)
camZ.f=PeekF(camera+18*4)
ForEach a()
;countA=countA+1
;-------------------color===========
a()\r=a()\r+a()\rd
a()\g=a()\g+a()\gd
a()\b=a()\b+a()\bd
If a()\r>255
a()\r=255
EndIf
If a()\g>255
a()\g=255
EndIf
If a()\b>255
a()\b=255
EndIf
If a()\r<0
a()\r=0
EndIf
If a()\g<0
a()\g=0
EndIf
If a()\b<0
a()\b=0
EndIf
;===========alpha==========
a()\al=a()\al+a()\ald
If a()\al>255
a()\al=255
EndIf
If a()\al<0
a()\al=0
EndIf
;==============turn===========
a()\ rot=a()\ rot+a()\ rotd ;texture
a()\xt=a()\xt+a()\xtd
a()\yt=a()\yt+a()\ytd
a()\xr=a()\xr+a()\xt
a()\yr=a()\yr+a()\yt
;===============move===========
If a()\xm>0
a()\xm=a()\xm*a()\xmd
EndIf
If a()\ym>0
a()\ym=a()\ym*a()\ymd
EndIf
If a()\zm>0
a()\zm=a()\zm*a()\zmd
EndIf
sinXm.f=Sin(a()\xr)
sinYm.f=Sin(a()\yr)
cosXm.f=Cos(a()\xr)
cosYm.f=Cos(a()\yr)
a()\x=a()\x +( a()\xm*cosYm+a()\ym*-sinXm*sinYm+a()\zm*-sinYm*cosXm)
a()\y=a()\y+( a()\ym*cosXm+a()\zm*-sinXm )
a()\z=a()\z+( a()\xm*sinYm+a()\ym*sinXm*cosYm+a()\zm*cosYm*cosXm)
;a()\x=a()\x +( a()\xm*Cos(a()\yr)+a()\ym*-Sin(a()\xr)*Sin(a()\yr)+a()\zm*-Sin(a()\yr)*Cos(a()\xr) )
;a()\y=a()\y+( a()\ym*Cos(a()\xr)+a()\zm*-Sin(a()\xr) )
;a()\z=a()\z+( a()\xm*Sin(a()\yr)+a()\ym*Sin(a()\xr)*Cos(a()\yr)+a()\zm*Cos(a()\yr)*Cos(a()\xr) )
;===========translate==========
a()\xd=a()\xd+a()\xda
a()\yd=a()\yd+a()\yda
a()\zd=a()\zd+a()\zda
a()\x=a()\x +a()\xd
a()\y=a()\y+a()\yd
a()\z=a()\z+a()\zd
;========scale==========
If a()\fsqr
a()\sc=a()\sc* (a()\scd*0.5* Sqr(a()\osc/a()\sc)+a()\scd*0.5)
Else
a()\sc=a()\sc*a()\scd
EndIf
If a()\bild=0
xn.f=a()\x-camX
yn.f=a()\y-camY
zn.f=a()\z-camZ
Else
xn.f=1
yn.f=0
zn.f=100
EndIf
;--------------------normalisate--------
l.f = Sqr(xn*xn + yn*yn + zn*zn)
vecy.f = yn.f/l
l.f = Sqr(xn*xn + zn*zn)
zna.f=zn.f/l
;------------------angle normals----------
anX.f=ACos(vecy )-1.57
anY.f=ACos(zna)*-(xn/Abs(xn))
;-----------------------------
sina.f=a()\sc*Sin(a()\ rot)*0.7
cosa.f=a()\sc*Cos(a()\ rot)*0.7
sinX.f=Sin(anX)
sinY.f=Sin(anY)
cosx.f=Cos(anX)
cosY.f=Cos(anY)
d(0,0)=-sina*cosY+cosa*(-sinX*sinY)+a()\x
d(0,1)=cosa*cosx+a()\y
d(0,2)=-sina*sinY+cosa*sinX*cosx+a()\z
d(1,0)=cosa*cosY+sina*(-sinX*sinY)+a()\x
d(1,1)=sina*cosx+a()\y
d(1,2)=cosa*sinY+sina*sinX*cosY+a()\z
d(2,0)=sina*cosY-cosa*(-sinX*sinY)+a()\x
d(2,1)=-cosa*cosx+a()\y
d(2,2)=sina*sinY-cosa*sinX*Cos(anY)+a()\z
d(3,0)=-cosa*cosY-sina*(-sinX*sinY)+a()\x
d(3,1)=-sina*cosx+a()\y
d(3,2)=-cosa*sinY-sina*sinX*cosY+a()\z
;----------------------------------
For i=0 To 3
PokeF (a()\mem[i],d(i,0))
PokeF (a()\mem[i]+4,d(i,1))
PokeF (a()\mem[i]+8,d(i,2))
PokeL(a()\mem[i]+24,RGBA(a()\al,a()\r,a()\g,a()\b))
Next
;===============live=============
a()\liv=a()\liv-1
If a()\liv<0 Or a()\al<0.01
AddElement(p())
p()\surf=a()\surf
p()\ver=a()\ver
For i=0 To 3
p()\mem[i]=a()\mem[i]
c.f=Random(10)*i
PokeF (p()\mem[i],a()\x+c)
PokeF (p()\mem[i]+4,a()\y+c)
PokeF (p()\mem[i]+8,a()\z-c)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
;=============================
DeleteElement(a())
EndIf
Next
ForEach s()
PokeL(s()\surf+64,0)
Next
ProcedureReturn CountList(a())
EndProcedure
;================================
Procedure RGBA(rl.l,gl.l,bl.l,l.l)
MOV eax,rl
SHL eax,24
MOV ebx,gl
SHL ebx,16
MOV edx,bl
SHL edx,8
OR eax,ebx
OR eax,edx
OR eax,l
ProcedureReturn
EndProcedure
;==============================
; IDE Options = PureBasic 4.10 Beta 2 (Windows - x86)
; ExecutableFormat = Shared Dll
; CursorPosition = 81
; FirstLine = 67
; Folding = --
; EnableAsm
; Executable = particle_amt.dll
; ExecutableFormat=Shared Dll
; EnableAsm
;
; EOF
__________________
|