MiniPartikelEngine

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Matthias

Betreff: MiniPartikelEngine

BeitragDi, Aug 12, 2008 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Da mir im Moment etwas langweilig war habe ich mir überlegt mal eine MiniPatikelEngine zu schreiben . Vieleicht kann jemand sie gebrauchen oder erweitert sie sogar.

Wichtig war mir dabei das sie leicht einzusetzen ist, und möglichst schnell.

user posted image

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
Global PatikelPivot
Global PatikelTextur=LoadTexture("PTextur.png",2)
;-------Umgebung erstellen-----------
Fontane1=CreateCube()
Fontane2=CreateCube()
Fontane3=CreateCube()

PositionEntity Fontane2,10,10,10
PositionEntity Fontane3,-10,10,10


Camera=CreateCamera()
PositionEntity Camera,0,3,-5
CameraClsColor Camera,0,0,200

Plane=CreatePlane():EntityColor Plane,0,200,0
Light=CreateLight():TurnEntity Light,45,45,0

;------------Patikeltypen-----
PTyp1=CreatePatikleTyp()
PTyp2=CreatePatikleTyp()
PTyp3=CreatePatikleTyp()
PTyp4=CreatePatikleTyp()

PatikelTexturID(PTyp1,0,128)
PatikelTexturID(PTyp2,1,128)
PatikelTexturID(PTyp3,2,128)
PatikelTexturID(PTyp4,3,128)
SetPatikelSize(PTyp1,.3)
SetPatikelSize(PTyp2,.1)
SetPatikelSize(PTyp3,.1)
SetPatikelSize(PTyp4,.1)

SetPVector(PTyp1,-.02,.02,-.05,-.1,-.02,.02)
SetPVector(PTyp2,-.04,.04,-.05,-.1,-.04,.04)
SetPVector(PTyp3,-.1,-.04,-.01,.01,-.01,.01)
SetPVector(PTyp4,.04,.1,-.01,.01,-.01,.01)






Timer=CreateTimer(60)
SetBuffer BackBuffer()
;-----------Mainloop----------------
Repeat:MS=MilliSecs()
   FPSz=FPSz+1:If MS>FPSt Then
     FPSt=MS+999:FPS=FPSz:FPSz=0
   End If
   ;50=Menge
   ;500=Lebenszeit in ms
   AddPatikel(Fontane1,PTyp1,50,500)
   AddPatikel(Fontane1,PTyp2,10,1500)
   AddPatikel(Fontane1,PTyp3,10,1500)
   AddPatikel(Fontane1,PTyp4,10,1500)

   AddPatikel(Fontane2,PTyp2,100,600)
   AddPatikel(Fontane2,PTyp3,5,3000)
   
   AddPatikel(Fontane3,PTyp2,100,600)
   AddPatikel(Fontane3,PTyp4,5,3000)

   UpdatePatikle()
   
   TranslateEntity Fontane1,0,.01,.01
   TranslateEntity Fontane2,-.01,-.01,0
   TranslateEntity Fontane3,.01,-.01,0

   RenderWorld
   Pat=(TrisRendered()/2)
   Text 10,10,"Patikel:"+Pat+" FPS:"+FPS



Flip 0:;WaitTimer(Timer)
Until KeyDown(1)=1
End








Function AddPatikel(Mesh,TBank,PMax,LTime)
   Local X#,Y#,Z#,MX#,MY#,MZ#,EX#,EY#,EZ#
   Local MinX#,MinY#,MinZ#,MaxX#,MaxY#,MaxZ#
   Local Ua#,Ub#,Va#,Vb#,S#,FPat=-4

   MS=MilliSecs()+LTime:PMax=PMax-1


   Child=FindChild(PatikelPivot,Mesh)
   If Child=0 Then ;Neues Surface erstellen
      Child=CreateMesh(PatikelPivot)
      EntityTexture Child,PatikelTextur,0,0
      Surf=CreateSurface(Child):EntityFX Child,17
      NameEntity Child,Mesh
   End If


   Surf=GetSurface(Child,1):MaxV=CountVertices(Surf)-4
   EX=EntityX(Mesh,1):EY=EntityY(Mesh,1)
   EZ=EntityZ(Mesh,1):S=PeekFloat(TBank,40)
   Ua=PeekFloat(TBank,0):Ub=PeekFloat(TBank,4)
   Va=PeekFloat(TBank,8):Vb=PeekFloat(TBank,12)
   MinX=PeekFloat(TBank,16):MaxX=PeekFloat(TBank,20)
   MinY=PeekFloat(TBank,24):MaxY=PeekFloat(TBank,28)
   MinZ=PeekFloat(TBank,32):MaxZ=PeekFloat(TBank,36)
   
   
   For I=0 To PMax
      MX=Rnd(MinX,MaxX):X=MX+EX
      MY=Rnd(MinY,MaxY):Y=MY+EY
      MZ=Rnd(MinZ,MaxZ):Z=MZ+EZ         

      ;Frein Patikel suchen
      If FPat<MaxV Then
         Repeat:FPat=FPat+4
            If VertexY(Surf,FPat)<-9998 Exit 
         Until FPat=>MaxV 
      End If

      If FPat=>MaxV Then ;Neuen Patikel erstellen
         If MaxV+I>32767 Then Return 
         V0=AddVertex(Surf,-S+X,-S+Y,Z,Ua,Va)
         V1=AddVertex(Surf, S+X,-S+Y,Z,Ub,Va)
         V2=AddVertex(Surf, S+X, S+Y,Z,Ub,Vb)
         V3=AddVertex(Surf,-S+X, S+Y,Z,Ua,Vb)
         AddTriangle Surf,V0,V1,V2
         AddTriangle Surf,V0,V2,V3
         VertexNormal Surf,V0,MX,MY,MZ
         VertexNormal Surf,V1,MS,0,0 
       Else  ;gefundenen freien Patikel ändern
         VertexCoords(Surf,FPat,  -S+X,-S+Y,Z)
         VertexCoords(Surf,FPat+1, S+X,-S+Y,Z)
         VertexCoords(Surf,FPat+2, S+X, S+Y,Z)
         VertexCoords(Surf,FPat+3,-S+X, S+Y,Z)
         VertexTexCoords Surf,FPat,Ua,Va
         VertexTexCoords Surf,FPat+1,Ub,Va
         VertexTexCoords Surf,FPat+2,Ub,Vb
         VertexTexCoords Surf,FPat+3,Ua,Vb
         VertexNormal Surf,FPat,MX,MY,MZ
         VertexNormal Surf,FPat+1,MS,0,0
       End If 
    Next
End Function

Function UpdatePatikle()
    Local X#,Y#,Z#,NX#,NY#,NZ#

 
     MaxChild=CountChildren(PatikelPivot)
     ;AppTitle MaxChild
     MS=MilliSecs():If MaxChild=0 Then Return     

     For ChildZ=1 To MaxChild
       Child=GetChild(PatikelPivot,ChildZ)
            Surf=GetSurface(Child,1)
       MaxV=CountVertices(Surf)-4:KPat=MaxV

       For V0=0 To MaxV Step 4
          V1=V0+1:V2=V0+2:V3=V0+3
          If MS<VertexNX(Surf,V1) Then
         
             NX=VertexNX(Surf,V0)
             NY=VertexNY(Surf,V0):NZ=VertexNZ(Surf,V0)
       
             X=VertexX(Surf,V0)+NX:Y=VertexY(Surf,V0)+NY
             VertexCoords Surf,V0,X,Y,VertexZ(Surf,V0)+NZ
     
             X=VertexX(Surf,V1)+NX:Y=VertexY(Surf,V1)+NY
             VertexCoords Surf,V1,X,Y,VertexZ(Surf,V1)+NZ
       
             X=VertexX(Surf,V2)+NX:Y=VertexY(Surf,V2)+NY
             VertexCoords Surf,V2,X,Y,VertexZ(Surf,V2)+NZ
       
             X=VertexX(Surf,V3)+NX:Y=VertexY(Surf,V3)+NY
             VertexCoords Surf,V3,X,Y,VertexZ(Surf,V3)+NZ
   
          Else:KPat=KPat-4
             VertexCoords Surf,V0,0,-9999,0
             VertexCoords Surf,V1,0,-9999,0
             VertexCoords Surf,V2,0,-9999,0
             VertexCoords Surf,V3,0,-9999,0
             If KPat<4 FreeEntity Child:Return
          End If
       Next
    Next
End Function

Function SetPatikelSize(TBank,PSize#)
   PokeFloat(TBank,40,PSize)

End Function


Function PatikelTexturID(TBank,ID,TSize)
   TW=TextureWidth(PatikelTextur)/TSize
   Um#=1/Float(TW):V#=Floor(ID/TW)*Um
   U#=(ID-(Floor(ID/TW)*TW))*Um
   PokeFloat(TBank,0,U):PokeFloat(TBank,4,U+Um)
   PokeFloat(TBank,8,V):PokeFloat(TBank,12,V+Um)   
End Function

Function CreatePatikleTyp()
   If PatikelPivot=0 Then
      PatikelPivot=CreatePivot()
   End If
   Bank=CreateBank(100):Return Bank
End Function

Function SetPVector(Bank,A#,B#,C#,D#,E#,F#)
   PokeFloat(Bank,16,A):PokeFloat(Bank,20,B)
   PokeFloat(Bank,24,C):PokeFloat(Bank,28,D)
   PokeFloat(Bank,32,E):PokeFloat(Bank,36,F)
End Function   


(22000Patikel bei 75FPS 2x3GHz. 8500GT)

BladeRunner

Moderator

BeitragDi, Aug 12, 2008 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Partikel, danke schön. Sonst ganz nett.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

ToeB

BeitragFr, Aug 15, 2008 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also sieht echt geil aus Smile

Aber ich glaub den Rauch und das Feuer kenn ich irgentwo her Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Matthias

BeitragFr, Aug 15, 2008 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@ToeB. Ja die Texturen sind aus deinem Racketen Demo.

Vieleicht hilft dir das Beispiel etwas.

Mfg Matthias.

ToeB

BeitragFr, Aug 15, 2008 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso sollte mir das Beispiel helfen Evil or Very Mad ? Ich hab doch schon eine Engine geschrieben... Wie man in meiner Demo gemrkt hat Confused

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group