3d lightning like test

Miscellaneous Forums/Blitz Showcase/3d lightning like test

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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 :)



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