Explosionsfake mittels Spheren

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

vanjolo

Betreff: Explosionsfake mittels Spheren

BeitragFr, Aug 21, 2009 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche jetzt seit heute morgen eine Explosion zu erstellen die zum Grafikstil von Harrier Assault passen soll.

Ich möchte dabei 4 Spheren (8) die ineinander aufgebaut sind skalieren lassen. Jede Sphere ist Transparent und mit einer Farbe von Gelb über Orange bis Dunkelrot eingefärbt.

Da ich einfach zu doof bin das in Code umzusetzen habe ich in Paintshop eine kleine Animation gebastelt die zeigt soll wie es aussehen soll.

user posted image

Für Hilfe wäre ich dankbar.

Grüße
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault

Tobchen

BeitragFr, Aug 21, 2009 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2

AmbientLight 255, 255, 255

Tex = CreateTexture(256, 256, 64)
SetBuffer TextureBuffer(Tex)
   Color 128, 0, 0
   Rect 0, 0, 255, 255
   Color 255, 0, 0
   Oval 20, 20, 215, 215
   Color 255, 128, 0
   Oval 40, 40, 175, 175
   Color 255, 255, 0
   Oval 60, 60, 135, 135
SetBuffer BackBuffer()

Sph = CreateSphere(8)
EntityTexture Sph, Tex

Kam = CreateCamera()
PositionEntity Kam, 0, 0, -3

Repeat
   UpdateWorld
   RenderWorld
   Flip
Until KeyDown(1)

End


Ich habe eine Textur im Modus 64 auf nur eine Kugel gemacht.
Nun musst du die Kugel nur noch skalieren, die Textur eventuell anpassen.
Ich hoffe, du blickst im Code selbst durch.

Ich hoffe, dass dein Problem war, dass es blöde aussieht, so wie du es machst.
Du kannst nicht erwarten, dass dir hier jeder einen Code gibt, in dem Kugeln skaliert werden.

Und an alle die, die fragen, wieso man kein Sprite nehmen sollte:
Wenn man Explosionen am Boden hat, dann würde das Sprite in den Boden reinschneiden und eine glatte Kante geben. Bei einer Kugel hat man hingegen einen Schnittkreis. Viel attraktiver. Und eine einzige Kugel werden heutige Grafikkarten ja wohl packen.
Tobchen - die Welt von Tobi!
 

vanjolo

BeitragFr, Aug 21, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein es ist nicht das was ich meine. Ich möchte nicht 1 Kugel machen sondern 4 Kugeln die Transparent sind.
In etwa so
....
For i = 1 To 4
explosion\mesh[i] = CreateSphere()
PositionEntity explosion\mesh[i], x, y, z
EntityFX explosion\mesh[i], 1+16
EntityShininess explosion\mesh[i], 1
Select i
Case 1: EntityColor explosion\mesh[i], 255, 0, 0
Case 2: EntityColor explosion\mesh[i], 255, 128, 0
Case 3: EntityColor explosion\mesh[i], 255, 255, 0
Case 4: EntityColor explosion\mesh[i], 255, 255, 0

......
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 21, 2009 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier hab ich mal schnell was gemacht. Ist allerdings noch überhaupt nicht optimiert etc...

Wie gesagt, eben mal schnell gecodet:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
PositionEntity Camera,0,10,-50
Local Plane=CreatePlane()
EntityColor Plane,0,255,0

Local T.Exp

Type Exp
   Field Fandle%
   Field XSpeed#
   Field YSpeed#
   Field ZSpeed#
   Field SSpeed#
   Field Size#
   Field Alpha#
End Type




While Not KeyHit(1)
   
   
   
   
   If KeyHit(57) Then
      T.Exp=New Exp
      T\Fandle=CreateSphere(12)
      T\XSpeed=0
      T\YSpeed=0
      T\ZSpeed=0
      T\SSpeed=2
      T\Size=3
      T\Alpha=1
      
      For A=1 To 5
         T.Exp=New Exp
         T\Fandle=CreateSphere(8)
         F1=Rand(200,1200)
         F2=Rand(F1,F1*2)
         EntityColor T\Fandle,F2,F1/2,F1/4
         T\XSpeed=Rnd(-0.2,+0.2)
         T\YSpeed=Rnd(+0.0,+0.5)
         T\ZSpeed=Rnd(-0.2,+0.2)
         T\SSpeed=0.1
         T\Size=2
         T\Alpha=Rnd(4.10)
      Next
   End If
   
   
   
   
   For T.Exp=Each Exp
      
      MoveEntity T\Fandle,T\XSpeed,T\YSpeed,T\ZSpeed
      
      T\Size=T\Size+T\SSpeed
      ScaleEntity T\Fandle,T\Size,T\Size,T\Size
      
      EntityAlpha T\Fandle,T\Alpha
      
      T\Alpha=T\Alpha-0.05
      If T\Alpha=<0 Then
         FreeEntity T\Fandle
         Delete T
      End If
   Next
   
   
   
   
   WaitTimer Timer
   RenderWorld
   Text 20,20,"SPACE Drücken"
   Flip 0
Wend
End


Falls es so ähnlich sein soll, dann könnte ich für dich eine optimierte Version erstellen. Die dann mit zwei Surfaces und viel mehr Partikeln aufkommen kann.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chrise

BeitragFr, Aug 21, 2009 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Man, jetzt war ich mal wieder viel zu langsam... xD

EDIT: Oh, habe gemerkt, dass die Herangehensweise von Hectic und mir sehr ähnlich sind. Aber beide ein völlig unterschiedliches Ergebnis erzielen. Sehr schön mit deiner grauen Druckwelle, hectic Smile

BlitzBasic: [AUSKLAPPEN]

SeedRnd MilliSecs()
Graphics3D 640, 480, 0, 2
Timer=CreateTimer(60)

Plane=CreatePlane()
EntityColor Plane,32,32,32

Pivot=CreatePivot()
Camera=CreateCamera()
PositionEntity Camera,0,2,-5
PointEntity Camera,Pivot

Counter=1
While Not KeyHit(1)
Counter=Counter-1
If Counter=0 Then
AddExplosion(Rnd(-10,10),0,Rnd(-10,10),Rand(4,8),Rand(30,120),Rnd(0.5,3))
Counter=Rand(1,40)
EndIf

UpdateExplosion(1)

RenderWorld
WaitTimer Timer
Flip 0
Wend
End

Function UpdateExplosion(Alpha=0)
Local E.Explosion
For E.Explosion=Each Explosion
E\CurLength=E\CurLength+1
For Index=0 To E\EStep-1
P#=Float(E\Curlength)/E\Length
E\Scale#=E\Size#*P#+Index*0.1
ScaleEntity E\Mesh[Index],E\Scale#,E\Scale#,E\Scale#
If Alpha=1 Then EntityAlpha E\Mesh[Index],1-P#
Next
If P#=>1.0 Then
For Index=0 To E\EStep-1
FreeEntity E\Mesh[Index]
Next
Delete E.Explosion
EndIf
Next
End Function
Function AddExplosion(X#=0,Y#=0,Z#=0,EStep=4,Length=30,Size#=1)
Local E.Explosion
CStep=255/EStep
E.Explosion=New Explosion
E\EStep=EStep
E\Length=Length
E\Size#=Size#
For Index=0 To EStep-1
E\Mesh[Index]=CreateSphere(32)
PositionEntity E\Mesh[Index],X#,Y#,Z#
EntityColor E\Mesh[Index],255,255-Index*CStep,0
EntityFX E\Mesh[Index],1
EntityBlend E\Mesh[Index],3
E\Scale#=0+Index*Size#*0.05
ScaleEntity E\Mesh[Index],E\Scale#,E\Scale#,E\Scale#
Next
End Function
Type Explosion
Field Mesh[7],EStep,Scale#,Alpha#,CurLength,Length,Size#
End Type
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
  • Zuletzt bearbeitet von Chrise am Fr, Aug 21, 2009 17:45, insgesamt einmal bearbeitet
 

vanjolo

BeitragFr, Aug 21, 2009 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
WoW Hectic,

Shocked

das sieht jetzt zwar völlig anders aus als das was ich machen möchte, aber es ist klasse! Very Happy


@Chrise
das hat auch was.

Crying or Very sad und ich sitz stunden rum und probiere und krieg nichts gebacken.
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault

Chrise

BeitragFr, Aug 21, 2009 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du statt UpdateExplosion(1) - UpdateExplosion(0) nimmst könnte es näher an deinen Wunsch ran kommen. Du kannst auch zusätzlich in der Update-Funktion +Index*0.1 auch etwas abändern, z.b. statt 0.1 irgendwie 0.4 oder so, dann kommts vll auch näher ran.
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
 

vanjolo

BeitragFr, Aug 21, 2009 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt bin ich ganz hin und hergerissen.

Hectic dein Code erinnert mich im Aussehen und Wirkung stark and die Explosionen in SU-27 Flanker.
Chrise deine Lösung paßt perfekt für große Explosionen.

Ich würde wenn ihr erlaubt gerne beide verwenden und euch in den Credits nennen!
***************************
in Entwicklung:
Tank Battles - Panzeraction
Pacific Battles - Rundenstrategie
abgeschlossenes Projekt: Harrier Assault

Chrise

BeitragFr, Aug 21, 2009 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab was meinen Code betrifft nichts dagegen. Hab ihn ja extra grade für dich gecodet.
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
 

Krischan

BeitragSa, Aug 22, 2009 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst ja noch ein Mesh dabei zerbröseln lassen, so wie hier:

Code: [AUSKLAPPEN]
;
; Explodable mesh demo.
;
; Chris Chadwick 2003
;

   Graphics3D 800,600,32

   WireFrame 0
   AntiAlias 0

   SeedRnd MilliSecs()

   ; Create a check pattern texture.
   tex = CreateTexture(64,64)
   SetBuffer TextureBuffer(tex)
   For y = 0 To 63 Step 4
      For x = 0 To 63 Step 2
         If c Then Color 255,255,255 Else Color 255,0,0
         c = Not c
         Rect x,y,2,4
      Next
      c = Not c
   Next
   SetBuffer BackBuffer()
   Color 255,255,255

   ; Set to value between 0 and 1 to say when during an explosion animation
   ; the pieces should start to fade out.
   ; e.g. 1 to start immediately, .5 to start halfway through, 0 to never fade.
   Const FADE_START# = 0.5
      
   Type tri_linkT
      Field prev.tri_linkT
      Field surf
      Field tri
      Field dx#,dy#,dz#
      Field pitch#,yaw#,roll#
   End Type

   Type explode_ctrlT
      Field tri_list.tri_linkT
      Field mesh
      Field life%
      Field fader#
      Field fade_start%
      Field exploding%
   End Type   
   
   Global frame_count%
   Global fps%
   Global fps_timeout%
   Global frame_time%
   Global slowest_frame%
   Global frame_start%
   fps_timer = CreateTimer(60)


   Global cam = CreateCamera()
   PositionEntity cam,0,0,-8
   
   light = CreateLight()
   TurnEntity light,0,90,0
   
   ; Scratch pad single tri mesh for doing rotations.
   Global tri_mesh = CreateMesh()
   Global tri_surf = CreateSurface(tri_mesh)
   AddVertex(tri_surf,0,0,0)
   AddVertex(tri_surf,0,0,0)
   AddVertex(tri_surf,0,0,0)
   AddTriangle(tri_surf,0,1,2)
   HideEntity tri_mesh

   ; Scratch pad mesh used by copy_tri_explode().
   Global t_mesh = CreateMesh()
   Global t_surf = CreateSurface(t_mesh)
   HideEntity t_mesh
   
   cube = CreateCube()
   sphere = CreateSphere(16)
   diamond = CreateSphere(2)
   pyramid = CreateCone(4)
   cone = CreateCone(16)
   cylinder = CreateCylinder(16)
      
   shape1.explode_ctrlT = copy_mesh_explode(cube,200,3)
   PositionEntity shape1\mesh,-4,-1.5,0
   EntityTexture shape1\mesh,tex
      
   shape2.explode_ctrlT = copy_mesh_explode(sphere,200)
   PositionEntity shape2\mesh,0,-1.5,0
   EntityTexture shape2\mesh,tex

   shape3.explode_ctrlT = copy_mesh_explode(cone,200,2)
   PositionEntity shape3\mesh,4,-1.5,0
   EntityTexture shape3\mesh,tex

   shape4.explode_ctrlT = copy_mesh_explode(cylinder,200,2)
   PositionEntity shape4\mesh,4,3,0
   EntityTexture shape4\mesh,tex

   shape5.explode_ctrlT = copy_mesh_explode(diamond,200,3)
   PositionEntity shape5\mesh,0,3,0
   EntityTexture shape5\mesh,tex

   shape6.explode_ctrlT = copy_mesh_explode(pyramid,200,3)
   PositionEntity shape6\mesh,-4,3,0
   EntityTexture shape6\mesh,tex

   FreeEntity cube
   FreeEntity sphere
   FreeEntity diamond
   FreeEntity cone
   FreeEntity cylinder
   FreeEntity pyramid
   
   ; Main loop
   While Not KeyHit(1)

      frame_start = MilliSecs()

      If KeyHit(57) Then bang = True

      For ctrl.explode_ctrlT = Each explode_ctrlT
         If ctrl\exploding = False
            If bang
               bang = False
               ctrl\exploding = True
               EntityFX ctrl\mesh,16
            Else            
               TurnEntity ctrl\mesh,1,0,.5
            EndIf
         EndIf
      Next
      
      update_mesh_explode()
      
      UpdateWorld
      RenderWorld

      Text 400,550,"Press SPACE to explode a shape!",1

      frame_time = MilliSecs() - frame_start   
      show_info()
            
      WaitTimer(fps_timer)
      Flip(1)

   Wend
   
   ClearWorld
   End




;
; Updates ALL explodable meshes that are currently exploding.
;
Function update_mesh_explode()

   For this.explode_ctrlT = Each explode_ctrlT
      
      If this\exploding
         
         If this\life
            tri.tri_linkT = this\tri_list
         
            If this\life <= this\fade_start
               EntityAlpha this\mesh,this\life * this\fader
            EndIf
            
            ; Update all tris in linked list.
            While tri <> Null
               v0 = TriangleVertex(tri\surf,tri\tri,0)
               v1 = TriangleVertex(tri\surf,tri\tri,1)
               v2 = TriangleVertex(tri\surf,tri\tri,2)

               x0# = VertexX(tri\surf,v0)
               y0# = VertexY(tri\surf,v0)
               z0# = VertexZ(tri\surf,v0)
               x1# = VertexX(tri\surf,v1)
               y1# = VertexY(tri\surf,v1)
               z1# = VertexZ(tri\surf,v1)
               x2# = VertexX(tri\surf,v2)
               y2# = VertexY(tri\surf,v2)
               z2# = VertexZ(tri\surf,v2)
               cx# = VertexX(tri\surf,v2+1)
               cy# = VertexY(tri\surf,v2+1)
               cz# = VertexZ(tri\surf,v2+1)
         
               ; Load scratch pad tri mesh.
               VertexCoords tri_surf,0,x0-cx,y0-cy,z0-cz
               VertexCoords tri_surf,1,x1-cx,y1-cy,z1-cz
               VertexCoords tri_surf,2,x2-cx,y2-cy,z2-cz
               VertexNormal tri_surf,0,VertexNX(tri\surf,v0),VertexNY(tri\surf,v0),VertexNZ(tri\surf,v0)
               VertexNormal tri_surf,1,VertexNX(tri\surf,v1),VertexNY(tri\surf,v1),VertexNZ(tri\surf,v1)
               VertexNormal tri_surf,2,VertexNX(tri\surf,v2),VertexNY(tri\surf,v2),VertexNZ(tri\surf,v2)
         
               ; Do rotations.
               RotateMesh tri_mesh,tri\pitch,tri\yaw,tri\roll
               
               ; Copy back to mesh tri.
               x0# = VertexX(tri_surf,0)
               y0# = VertexY(tri_surf,0)
               z0# = VertexZ(tri_surf,0)
               x1# = VertexX(tri_surf,1)
               y1# = VertexY(tri_surf,1)
               z1# = VertexZ(tri_surf,1)
               x2# = VertexX(tri_surf,2)
               y2# = VertexY(tri_surf,2)
               z2# = VertexZ(tri_surf,2)
               
               VertexCoords tri\surf,v0,x0+cx+tri\dx,y0+cy+tri\dy,z0+cz+tri\dz
               VertexCoords tri\surf,v1,x1+cx+tri\dx,y1+cy+tri\dy,z1+cz+tri\dz
               VertexCoords tri\surf,v2,x2+cx+tri\dx,y2+cy+tri\dy,z2+cz+tri\dz
               VertexNormal tri\surf,v0,VertexNX(tri_surf,0),VertexNY(tri_surf,0),VertexNZ(tri_surf,0)
               VertexNormal tri\surf,v1,VertexNX(tri_surf,1),VertexNY(tri_surf,1),VertexNZ(tri_surf,1)
               VertexNormal tri\surf,v2,VertexNX(tri_surf,2),VertexNY(tri_surf,2),VertexNZ(tri_surf,2)
         
               VertexCoords tri\surf,v2+1,cx+tri\dx,cy+tri\dy,cz+tri\dz
               
               tri = tri\prev
            Wend
         
            this\life = this\life - 1
         Else
            ; Mesh has finished exploding.
            free_mesh_explode(this)
         EndIf

      EndIf

   Next

End Function


;
; Creates a subdivided (optional), unwelded copy of an existing mesh.
; Explode info for all tris in the new mesh are kept in a separate linked list
; contained in the control variable returned to the caller.
; Note: the source mesh being copied remains completely unaltered.
;
; Params:
; s_mesh     - Source mesh to be copied.
; life       - Duration of explosion animation (in frames) to use when exploded.
; divs       - Number of times to perform x4 sub-division on each source tri.
; keep_surfs - True to keep the same amount of surfaces in
;              the copy as in the source mesh.
;              False (Default) to copy all tris in the source mesh
;              to a single surface in the copy.
;
; Returns:
; Pointer to the control variable (of type explode_ctrlT) for the
; new explodable mesh created.
;
Function copy_mesh_explode.explode_ctrlT(s_mesh,life%,divs=0,keep_surfs%=False)

   tri_list.tri_linkT = Null

   d_mesh = CreateMesh()
         
   For sno = 1 To CountSurfaces(s_mesh)
      
      s_surf = GetSurface(s_mesh,sno)
      nt = CountTriangles(s_surf)

      If sno = 1 Or keep_surfs Then d_surf = CreateSurface(d_mesh)
      
      For tno = 0 To nt-1
         tri_list = copy_tri_explode(s_surf,tno,d_surf,divs,tri_list)
      Next
   
   Next

   ; Create and return this explodable mesh's control variable.
   ctrl.explode_ctrlT = New explode_ctrlT
   ctrl\tri_list = tri_list
   ctrl\mesh = d_mesh
   ctrl\life = life
   ctrl\fade_start = Ceil(Float(life)*FADE_START#)
   ctrl\fader = 1.0/(ctrl\fade_start+1)
   ctrl\exploding = False
      
   Return ctrl
   
End Function


;
; Adds an unwelded copy of a tri from the source surface to the destination
; surface, performing any sub-division requested.
;
; Sub-division is done by calling this function recursively, splitting the
; source tri into 4 unwelded tris each time, like so:
;
;           v1
;           /\
;         /____\
;       /  \  /  \
;     /_____\/_____\
;    v0            v2
;
; Params:
; s_surf   - Source surface containing tri to be copied.
; tri      - Index of tri to be copied.
; d_surf   - Destination surface to copy the source tri to.
; divs     - Number of times to perform x4 sub-division on the source tri.
; tri_list - Current top item in the linked list.
; reset    - True (default) to clear scratch pad mesh.
;            False to not clear scratch pad mesh (used internally only!).
;
; Returns:
; The current top item in the linked list.
;
Function copy_tri_explode.tri_linkT(s_surf,tri,d_surf,divs,tri_list.tri_linkT,reset%=True)

   If reset Then ClearSurface(t_surf)
   
   sv0 = TriangleVertex(s_surf,tri,0)
   sv1 = TriangleVertex(s_surf,tri,1)
   sv2 = TriangleVertex(s_surf,tri,2)

   ; Get coords of all 3 vertices of source tri.
   x0# = VertexX(s_surf,sv0)
   y0# = VertexY(s_surf,sv0)
   z0# = VertexZ(s_surf,sv0)
   x1# = VertexX(s_surf,sv1)
   y1# = VertexY(s_surf,sv1)
   z1# = VertexZ(s_surf,sv1)
   x2# = VertexX(s_surf,sv2)
   y2# = VertexY(s_surf,sv2)
   z2# = VertexZ(s_surf,sv2)
   
   ; Get normals of all 3 vertices of source tri.
   nx0# = VertexNX(s_surf,sv0)
   ny0# = VertexNY(s_surf,sv0)
   nz0# = VertexNZ(s_surf,sv0)
   nx1# = VertexNX(s_surf,sv1)
   ny1# = VertexNY(s_surf,sv1)
   nz1# = VertexNZ(s_surf,sv1)
   nx2# = VertexNX(s_surf,sv2)
   ny2# = VertexNY(s_surf,sv2)
   nz2# = VertexNZ(s_surf,sv2)

   ; Get tex coords of all 3 vertices of source tri.
   u0# = VertexU(s_surf,sv0)
   v0# = VertexV(s_surf,sv0)
   w0# = VertexW(s_surf,sv0)
   u1# = VertexU(s_surf,sv1)
   v1# = VertexV(s_surf,sv1)
   w1# = VertexW(s_surf,sv1)
   u2# = VertexU(s_surf,sv2)
   v2# = VertexV(s_surf,sv2)
   w2# = VertexW(s_surf,sv2)

   ; Get colour of all 3 vertices of source tri.
   r0# = VertexRed(s_surf,sv0)
   g0# = VertexGreen(s_surf,sv0)
   b0# = VertexBlue(s_surf,sv0)
   r1# = VertexRed(s_surf,sv1)
   g1# = VertexGreen(s_surf,sv1)
   b1# = VertexBlue(s_surf,sv1)
   r2# = VertexRed(s_surf,sv2)
   g2# = VertexGreen(s_surf,sv2)
   b2# = VertexBlue(s_surf,sv2)

   If divs
      ; Calculate coords of the 3 discrete vertices used by sub-division.
      x3# = x0 + ((x1-x0)/2)
      y3# = y0 + ((y1-y0)/2)
      z3# = z0 + ((z1-z0)/2)
      x4# = x1 + ((x2-x1)/2)
      y4# = y1 + ((y2-y1)/2)
      z4# = z1 + ((z2-z1)/2)
      x5# = x2 + ((x0-x2)/2)
      y5# = y2 + ((y0-y2)/2)
      z5# = z2 + ((z0-z2)/2)
      
      ; Calculate normals of the 3 discrete vertices used by sub-division.
      nx3# = nx0 + ((nx1-nx0)/2)
      ny3# = ny0 + ((ny1-ny0)/2)
      nz3# = nz0 + ((nz1-nz0)/2)
      nx4# = nx1 + ((nx2-nx1)/2)
      ny4# = ny1 + ((ny2-ny1)/2)
      nz4# = nz1 + ((nz2-nz1)/2)
      nx5# = nx2 + ((nx0-nx2)/2)
      ny5# = ny2 + ((ny0-ny2)/2)
      nz5# = nz2 + ((nz0-nz2)/2)
   
      ; Calculate tex coords of the 3 discrete vertices used by sub-division.
      u3# = u0 + ((u1-u0)/2)
      v3# = v0 + ((v1-v0)/2)
      w3# = w0 + ((w1-w0)/2)
      u4# = u1 + ((u2-u1)/2)
      v4# = v1 + ((v2-v1)/2)
      w4# = w1 + ((w2-w1)/2)
      u5# = u2 + ((u0-u2)/2)
      v5# = v2 + ((v0-v2)/2)
      w5# = w2 + ((w0-w2)/2)
   
      ; Calculate colour of the 3 discrete vertices used by sub-division.
      r3# = r0 + ((r1-r0)/2)
      g3# = g0 + ((g1-g0)/2)
      b3# = b0 + ((b1-b0)/2)
      r4# = r1 + ((r2-r1)/2)
      g4# = g1 + ((g2-g1)/2)
      b4# = b1 + ((b2-b1)/2)
      r5# = r2 + ((r0-r2)/2)
      g5# = g2 + ((g0-g2)/2)
      b5# = b2 + ((b0-b2)/2)
      
      ; Add the 4 unwelded tris comprising the sub-division to the
      ; temporary, scratch pad mesh surface.
      tv0 = AddVertex(t_surf,x0,y0,z0)
      tv3 = AddVertex(t_surf,x3,y3,z3)
      tv5 = AddVertex(t_surf,x5,y5,z5)
      tri0 = AddTriangle(t_surf,tv0,tv3,tv5)
      VertexNormal t_surf,tv0,nx0,ny0,nz0
      VertexNormal t_surf,tv3,nx3,ny3,nz3
      VertexNormal t_surf,tv5,nx5,ny5,nz5
      VertexColor t_surf,tv0,r0,g0,b0
      VertexColor t_surf,tv3,r3,g3,b3
      VertexColor t_surf,tv5,r5,g5,b5
      VertexTexCoords t_surf,tv0,u0,v0,w0
      VertexTexCoords t_surf,tv3,u3,v3,w3
      VertexTexCoords t_surf,tv5,u5,v5,w5
      
      tv1 = AddVertex(t_surf,x1,y1,z1)
      tv4 = AddVertex(t_surf,x4,y4,z4)
      tv3b = AddVertex(t_surf,x3,y3,z3)
      tri1 = AddTriangle(t_surf,tv1,tv4,tv3b)
      VertexNormal t_surf,tv1,nx1,ny1,nz1
      VertexNormal t_surf,tv4,nx4,ny4,nz4
      VertexNormal t_surf,tv3b,nx3,ny3,nz3
      VertexColor t_surf,tv1,r1,g1,b1
      VertexColor t_surf,tv4,r4,g4,b4
      VertexColor t_surf,tv3b,r3,g3,b3
      VertexTexCoords t_surf,tv1,u1,v1,w1
      VertexTexCoords t_surf,tv4,u4,v4,w4
      VertexTexCoords t_surf,tv3b,u3,v3,w3

      tv2 = AddVertex(t_surf,x2,y2,z2)
      tv5b = AddVertex(t_surf,x5,y5,z5)
      tv4b = AddVertex(t_surf,x4,y4,z4)
      tri2 = AddTriangle(t_surf,tv2,tv5b,tv4b)
      VertexNormal t_surf,tv2,nx2,ny2,nz2
      VertexNormal t_surf,tv5b,nx5,ny5,nz5
      VertexNormal t_surf,tv4b,nx4,ny4,nz4
      VertexColor t_surf,tv2,r2,g2,b2
      VertexColor t_surf,tv5b,r5,g5,b5
      VertexColor t_surf,tv4b,r4,g4,b4
      VertexTexCoords t_surf,tv2,u2,v2,w2
      VertexTexCoords t_surf,tv5b,u5,v5,w5
      VertexTexCoords t_surf,tv4b,u4,v4,w4
   
      tv3c = AddVertex(t_surf,x3,y3,z3)
      tv4c = AddVertex(t_surf,x4,y4,z4)
      tv5c = AddVertex(t_surf,x5,y5,z5)
      tri3 = AddTriangle(t_surf,tv3c,tv4c,tv5c)
      VertexNormal t_surf,tv3c,nx3,ny3,nz3
      VertexNormal t_surf,tv4c,nx4,ny4,nz4
      VertexNormal t_surf,tv5c,nx5,ny5,nz5
      VertexColor t_surf,tv3c,r3,g3,b3
      VertexColor t_surf,tv4c,r4,g4,b4
      VertexColor t_surf,tv5c,r5,g5,b5
      VertexTexCoords t_surf,tv3c,u3,v3,w3
      VertexTexCoords t_surf,tv4c,u4,v4,w4
      VertexTexCoords t_surf,tv5c,u5,v5,w5
   
      divs = divs - 1
   
      tri_list = copy_tri_explode(t_surf,tri0,d_surf,divs,tri_list,False)
      tri_list = copy_tri_explode(t_surf,tri1,d_surf,divs,tri_list,False)
      tri_list = copy_tri_explode(t_surf,tri2,d_surf,divs,tri_list,False)
      tri_list = copy_tri_explode(t_surf,tri3,d_surf,divs,tri_list,False)

   Else

      dv0 = AddVertex(d_surf,x0,y0,z0)
      dv1 = AddVertex(d_surf,x1,y1,z1)
      dv2 = AddVertex(d_surf,x2,y2,z2)
      
      ; Calculate and add a lone 'centre of tri'
      ; vertex (needed for per-tri rotations).
      tx# = x1 + ((x2-x1)/2)
      ty# = y1 + ((y2-y1)/2)
      tz# = z1 + ((z2-z1)/2)
      cvx# = tx - ((tx-x0)/3)
      cvy# = ty - ((ty-y0)/3)
      cvz# = tz - ((tz-z0)/3)
      AddVertex(d_surf,cvx,cvy,cvz)
      
      real_tri = AddTriangle(d_surf,dv0,dv1,dv2)
      
      VertexNormal d_surf,dv0,nx0,ny0,nz0
      VertexNormal d_surf,dv1,nx1,ny1,nz1
      VertexNormal d_surf,dv2,nx2,ny2,nz2
      VertexColor d_surf,dv0,r0,g0,b0
      VertexColor d_surf,dv1,r1,g1,b1
      VertexColor d_surf,dv2,r2,g2,b2
      VertexTexCoords d_surf,dv0,u0,v0,w0
      VertexTexCoords d_surf,dv1,u1,v1,w1
      VertexTexCoords d_surf,dv2,u2,v2,w2

      ; Add this tri to the linked list.
      link.tri_linkT = New tri_linkT
      link\prev = tri_list
      link\surf = d_surf
      link\tri = real_tri
      r = Rnd(10,80)
      link\dx = cvx/r
      link\dy = cvy/r
      link\dz = cvz/r
      link\pitch = Rnd(-10,10)
      link\yaw = Rnd(-10,10)
      link\roll = Rnd(-10,10)

      tri_list = link   
   EndIf
   
   Return tri_list
   
End Function


;
; Free all mem used by an explodable mesh created with copy_mesh_explode().
;
; Params:
; ctrl - Control variable of the explodable mesh to be freed.
;
Function free_mesh_explode(ctrl.explode_ctrlT)

   this.tri_linkT = ctrl\tri_list
   
   While this <> Null
      delme.tri_linkT = this
      this = delme\prev
      Delete delme
   Wend
   
   FreeEntity ctrl\mesh
   Delete ctrl
   
End Function


;
; Display debug info.
;
Function show_info()
   
   frame_count = frame_count + 1

   If MilliSecs() > fps_timeout Then
      fps_timeout = MilliSecs() + 1000
      fps = frame_count
      frame_count = 0
   EndIf
   
   If frame_time > slowest_frame Then slowest_frame = frame_time
   
   Text 10,10," Triangles: " + TrisRendered()
   Text 10,25," Millisecs: " + frame_time
   Text 10,40,"   Slowest: " + slowest_frame
   Text 10,55,"       FPS: " + fps

End Function

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group