Hey everyone. I've created some code to create lightning, sort of. Involves deforming a mesh in real-time. You can use these function for whatever. Could a get a fps on the code running as it is though, please? Press space bar to get the TRUE fps reading, thanks :)
It's better when viewed moving. Remember the below code is simply just to rotate them. The functions do the work of creating and deforming the meshes. Hopefully is useful to someone other than me :)

It's better when viewed moving. Remember the below code is simply just to rotate them. The functions do the work of creating and deforming the meshes. Hopefully is useful to someone other than me :)
Graphics3D 800,600 SetBuffer BackBuffer() ;WireFrame True Type bolt Field x#,y#,z# Field mesh Field surf Field segments ; number of segments the cylinder has |===|===| = 2 segments Field divisions ; how smooth the cylinder looks Field seg_length# End Type Global piv=CreatePivot() Global cam=CreateCamera(piv) PositionEntity cam,0,5,-11 RotateEntity cam,30,0,0 CameraRange cam,0.1,100 Global light=CreateLight() TurnEntity light,45,45,45 For loop=0 To 13 l.bolt=New bolt l\x=0 l\y=0 l\z=0 l\mesh=CreateMesh() l\surf=CreateSurface(l\mesh) l\segments=Rand(3,5) l\seg_length=Rand(5,7) l\divisions=3 create_rod(l\mesh,l\surf,l\segments,l\divisions,l\seg_length) UpdateNormals(l\mesh) EntityFX l\mesh,32+2 ;PositionEntity l\mesh,0,0,-(l\seg_length*l\segments)*0.5 ScaleEntity l\mesh,0.2,0.2,1 Next Global sync=1 ; for v-sync Dim random#(7,2) While Not KeyHit(1) If KeyDown(203) Then RotateEntity piv,EntityPitch(piv),EntityYaw(piv)+1,EntityRoll(piv) If KeyDown(205) Then RotateEntity piv,EntityPitch(piv),EntityYaw(piv)-1,EntityRoll(piv) If KeyDown(200) Then RotateEntity piv,EntityPitch(piv)-1,EntityYaw(piv),EntityRoll(piv) If KeyDown(208) Then RotateEntity piv,EntityPitch(piv)+1,EntityYaw(piv),EntityRoll(piv) If KeyHit(57) Then sync=1-sync For l.bolt=Each bolt reset_rod(l\mesh,l\surf,l\segments,l\divisions,l\seg_length) randomise_rod(l\mesh,l\surf,l\segments,l\divisions) TurnEntity l\mesh,0,Rnd(0.1,2),0 Next If MilliSecs()<timer+1000 Then frame=frame+1 Else fps=frame frame=0 timer=MilliSecs() End If UpdateWorld RenderWorld Text 0,0,fps ;Text 0,10," Press SPACE BAR to disable/enable v-sync" Flip sync ;Delay 6 Wend End Function create_rod(mesh,surf,segments,divisions,segment_length) count=0 For loop=0 To segments For loop1=1 To divisions AddVertex(surf, Cos(loop1*(360/divisions)) , Sin(loop1*(360/divisions)) , loop*segment_length ) VertexColor surf,count,70,130,250,0.3 count=count+1 Next Next For loop=0 To segments For loop1=1 To divisions temp=AddVertex(surf, (Cos(loop1*(360/divisions))/4) , (Sin(loop1*(360/divisions))/4) , loop*segment_length ) VertexColor surf,temp,70,130,250,0.7 Next Next For loop=0 To segments-1 For loop1=0 To divisions-1; must always be 1 less than divisions, because vertex index starts at 0 If loop1<divisions-1 Then tri=AddTriangle(surf,loop*divisions+loop1,(loop+1)*divisions+loop1+1,(loop+1)*divisions+loop1) tri1=AddTriangle(surf,loop*divisions+loop1,loop*divisions+loop1+1,(loop+1)*divisions+loop1+1) Else tri=AddTriangle(surf,loop*divisions+loop1,(loop+1)*divisions+0,(loop+1)*divisions+loop1) tri1=AddTriangle(surf,loop*divisions+loop1,loop*divisions+0,(loop+1)*divisions+0) End If Next Next For loop=0 To segments-1 For loop1=0 To divisions-1; must always be 1 less than divisions, because vertex index starts at 0 If loop1<divisions-1 Then tri = AddTriangle(surf , count+ loop*divisions+loop1, count+ (loop+1)*divisions+loop1+1, count+ (loop+1)*divisions+loop1) tri1= AddTriangle(surf , count+ loop*divisions+loop1, count+ loop*divisions+loop1+1, count+ (loop+1)*divisions+loop1+1) Else tri = AddTriangle(surf , count+ loop*divisions+loop1, count+ (loop+1)*divisions+0, count+ (loop+1)*divisions+loop1) tri1= AddTriangle(surf , count+ loop*divisions+loop1, count+ loop*divisions+0, count+ (loop+1)*divisions+0) End If Next Next UpdateNormals(mesh) ;ScaleMesh mesh,0.2,0.2,1 End Function Function reset_rod(mesh,surf,segments,divisions,segment_length) count=0 For loop=0 To segments For loop1=1 To divisions VertexCoords(surf,count, Cos(loop1*(360/divisions)) , Sin(loop1*(360/divisions)) , loop*segment_length ) count=count+1 Next Next count1=0 For loop=0 To segments For loop1=1 To divisions VertexCoords(surf,count+count1, (Cos(loop1*(360/divisions))/4) , (Sin(loop1*(360/divisions))/4) , loop*segment_length ) count1=count1+1 Next Next End Function Function randomise_rod(mesh,surf,segments,divisions,spread=5) count=0 For loop#=0 To segments random(loop,0)=Rnd(-spread,spread) random(loop,0)=random(loop,0) *(loop/segments) ; FOR X VERT. after the * sign, cause the tapering effect. random(loop,1)=Rnd(-spread,spread) ; FOR Y VERT random(loop,1)=random(loop,1) *(loop/segments) random(loop,2)=Rnd(-spread,spread) ; FOR Z VERT random(loop,2)=random(loop,2) *(loop/segments) For loop1=0 To divisions-1 VertexCoords( surf,count,VertexX(surf,count)+(random(loop,0)), VertexY(surf,count)+(random(loop,1)), VertexZ(surf,count)+(random(loop,2)) ) count=count+1 Next Next count1=0 For loop#=0 To segments For loop1=0 To divisions-1 VertexCoords( surf,count+count1,VertexX(surf,count+count1)+(random(loop,0)), VertexY(surf,count+count1)+(random(loop,1)), VertexZ(surf,count+count1)+(random(loop,2)) ) count1=count1+1 Next Next End Function