Procedural Programming Competition Final Rules

Blitz3D Forums/Blitz3D Programming/Procedural Programming Competition Final Rules

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.

I can't see your picture mate.

It's not optimised in any shape or form and a bit sloppy but for what it's worth ...

Graphics3D 640,480,16,1

Global camera
Global plane
Global light 
Global track
Global p1.CarType
Global p2.CarType
Global Points=0
Global PP=0
Global Pivot=CreatePivot()

Type PointType
	Field x#, y#,z#
End Type

Type CarType
	Field Model
	Field Target
	Field Vx#, Vy#, Vz#
	Field Acceleration#
	Field Brakes#
	Field Traction#
	Field Speed#
	Field TopSpeed#
	Field Wheel[3]
End Type

Dim Point.PointType( 2000 )
Dim TP.PointType( 6, 20000 )

GAMEinit()
TRACKinit()
RACEinit()
	
While Not KeyDown(1)

	GAMEupdate()

Wend

End

;=================================================
;=================================================
;=================================================

Function RACEinit()
	
	PositionEntity P1\Model,TP(3,0 )\x,TP(3,0)\y,TP(3,0)\z
	PositionEntity Pivot,TP(3,1)\x, TP(3,1)\y, TP(3,1)\z
	PointEntity P1\Model, Pivot

	PositionEntity P2\Model,TP(3,0 )\x,TP(3,0)\y,TP(3,0)\z
	PositionEntity Pivot,TP(3,1)\x, TP(3,1)\y, TP(3,1)\z
	PointEntity P2\Model, Pivot
	
End Function

;=================================================
;=================================================
;=================================================

Function CARupdate( c.Cartype )

	jx# = -JoyX():If Abs(jx) < .25 jx = 0
	jb =JoyDown(3)

	TurnEntity c\Model, 0, jx * 3.0,0
	For w = 0 To 1
		RotateEntity c\wheel[w],EntityPitch(c\wheel[w]),jx*45.0,0
	Next
		
	c\Speed = LIMIT ( c\Speed + ( jb * c\Acceleration ) - ( ( Not jb ) * c\Brakes ) , 0, c\TopSpeed )
	TFormVector 0,0,(1.0 - c\Traction ), c\Model, 0
	c\Vx = ( c\Vx * c\Traction ) + ( TFormedX() * c\Speed )
	c\Vz = ( c\Vz * c\Traction ) + ( TFormedZ() * c\Speed )
	c\Vy = ( c\Vy * c\Traction ) + ( TFormedY() * c\Speed ) - gravity

	TranslateEntity c\Model, c\Vx, c\vy , c\Vz
	
	For l = 0 To 3
		TurnEntity c\wheel[l],c\Speed * 90.0 / (Pi),0,0
	Next
	
	;collisions
	unused = LinePick ( EntityX(c\Model,1),EntityY(c\model,1)+5,EntityZ(c\model,1),0,-20,.2 )
	picked = PickedEntity()
	If picked = Track Or picked = plane
		;hug track
		TranslateEntity c\Model,0,PickedY()-EntityY(c\Model)+.1,0
		nx#=PickedNX():ny#=PickedNY():nz#=PickedNZ()
		AlignToVector c\Model,nx,ny,nz,2,.25
	EndIf 
	
End Function

;=================================================
;=================================================
;=================================================

Function GAMEupdate()

	CARupdate( p1 )
	CAMERAupdate()
	RenderWorld()
	Flip

End Function

;=================================================
;=================================================
;=================================================

Function CAMERAupdate()
	tx# = ( EntityX( P1\Target,1 ) - EntityX( Camera ) ) * .25
	ty# = ( EntityY( P1\Target,1) - EntityY( Camera) ) *.25
	tz# = ( EntityZ( P1\Target,1 ) - EntityZ( Camera ) ) *.25
	TranslateEntity Camera, tx, ty, tz
	PointEntity Camera, p1\Model,EntityRoll( p1\Model)
End Function

;=================================================
;=================================================
;=================================================

Function WRAP#( q#, b#)

	If q>=b Then q=q-b
	If q<0 Then q=b+q
	Return q	

End Function

;=================================================
;=================================================
;=================================================

Function LIMIT#(n#,n1#,n2#)
	
	If n>n2 Then n=n2
	If n<n1 Then n=n1	
	Return n

End Function

;=================================================
;=================================================
;=================================================

Function JOIN (x1,y1,z1,vx,vy,vz,x2,y2,z2)

	For t#=.1 To 1 Step .1 
		TP( 3, pp ) = New PointType
		TP(3,pp)\x = x1*(1-t)^3 + 3*vx*(1-t)^2*t + 3*vx*(1-t)*t^2 + x2*t^3
		TP(3,pp)\y = limit( y1*(1-t)^3 + 3*vy*(1-t)^2*t + 3*vy*(1-t)*t^2 + y2*t^3 , 0, 10.0 )
		TP(3,pp)\z = z1*(1-t)^3 + 3*vz*(1-t)^2*t + 3*vz*(1-t)*t^2 + z2*t^3
		pp=pp+1
	Next

End Function

;=================================================
;=================================================
;=================================================

Function GAMEinit()

	plane = CreatePlane()
	EntityColor plane,150,100,75
	EntityPickMode plane, 2
	EntityOrder plane,1
	EntityFX plane,1+16
	
	camera = CreateCamera()
	CameraClsColor camera,50,100,200
	PositionEntity camera,0,500,0
		
	light = CreateLight()
	RotateEntity light,30,-60,0 
		
	P1 = MESHcar( 200,200,50 )
	P2 = MESHcar( 50,200,200 )

End Function

;=================================================
;=================================================
;=================================================

Function TRACKinit()

	;points
	Restore LEVELdata
	Read points
	For l = 0 To points-1
		point( l*2 ) = New pointtype
		Read point(l*2)\x
		Read point(l*2)\y 
		Read point(l*2)\z
	Next
		
	;mid points
	For l= 0 To points-1 
		m = l*2+1
		v = ( l+1 ) Mod points
		point( m) = New pointtype
		point( m)\x = ( point(l*2)\x + point(v*2)\x ) * .5
		point( m)\y = ( point(l*2)\y + point(v*2)\y ) * .5
		point( m)\z = ( point(l*2)\z + point(v*2)\z ) * .5
	Next
	points = points * 2 
		
	;smooth bezier curves
	For l= 0 To points-1 Step 2
		k = ( l+1) Mod points
		n = ( l + 2 ) Mod points
		m = ( l + 3 ) Mod points
		JOIN ( point( k )\x , point( k )\y, point( k )\z, point( n )\x, point ( n )\y, point(n)\z, point( m)\x, point(m)\y , point(m)\z )
	Next
	
	;tangents
	Color 255,255,255
	For l = 0 To pp-1
		m = ( l-1+pp ) Mod pp
		n = ( l + 1 ) Mod pp
		dx# = TP(3, l )\x - TP(3,m)\x
		dz# = TP(3, l )\z - TP(3,m)\z
		d#  = Sqr ( dx*dx + dz*dz) * 2.0
		ax# = dx/d
		az# = dz/d
		dx# = TP(3, n )\x - TP(3,l)\x
		dz# = TP(3, n )\z - TP(3,l)\z
		d#  = Sqr ( dx*dx + dz*dz) * 2.0
		ax# = ax# + dx/d
		az# = az# + dz/d
				
		For q = 0 To 6
			
			dr# = Sgn(q-3)
			
			Select Abs(q-3)
				Case 1 
					Width# = 5.0
					Height# = TP(3,l)\y
				Case 2 
					Width# = 6.0
					Height# = TP(3,l)\y+.5
				Case 3 
					width# = 10.0
					Height# = 0
					If TP(3,l)\y = 10.0 
						Height = TP(3,l)\y-2.5
						Width = 7.0
					EndIf 
			End Select
	
			If q<>3
				TP(q,l) = New pointtype
				TP(q,l)\x = TP(3,l)\x - az * width *dr
				TP(q,l)\y = Height 
				TP(q,l)\z = TP(3,l)\z + ax * width * dr
			EndIf
			
		Next
		
	Next	
			
	;show tangents
	For l = 0 To pp-1
		n = ( l + 1 ) Mod pp
		For q = 0 To 6	
			Select q
				Case 3 Color 200,50,50
				Default Color 50,50,50
			End Select	
			Line TP(q,l)\x+320, 240-TP(q,l)\z, TP(q,n)\x+320, 240 - TP(q,n)\z
		Next
		Color 50,50,200
		Line TP(2,l)\x+320, 240-TP(4,l)\z, TP(2,l)\x+320, 240-TP(4,l)\z
		Color 255,255,255
		Text TP(3,l)\x + 320, 240-TP(3,l)\z,Str$(l),1,1
	Next
	Flip
	MouseWait
	
	;make 3d mesh
	Track = MESHtrack()
	
End Function

;=================================================
;=================================================
;=================================================

Function MESHtrack()

	mesh = CreateMesh()
	s = CreateSurface( mesh )
	For l = 0 To pp-1
		n = ( l + 1 ) Mod pp
		d = ( l Mod 2 )

		;road
		v0 = AddVertex( s, TP(2,n)\x, TP(2,n)\y, TP(2,n)\z )
		v1 = AddVertex( s, TP(4,n)\x, TP(4,n)\y, TP(4,n)\z )
		v2 = AddVertex( s, TP(4,l)\x, TP(4,l)\y, TP(4,l)\z )
		v3 = AddVertex( s, TP(2,l)\x, TP(2,l)\y, TP(2,l)\z )
		For v = v0 To v3
			Select d
				Case 0 r=100:g=100:b=150
				Case 1 r=150:g=150:b=200
			End Select
			VertexColor s,v,r,g,b
		Next
		AddTriangle s,v2,v1,v0
		AddTriangle s,v0,v3,v2
		
		;kerb
		v4 = AddVertex( s, TP(0,n)\x, TP(0,n)\y, TP(0,n)\z )
		v5 = AddVertex( s, TP(1,n)\x, TP(1,n)\y, TP(1,n)\z )
		v6 = AddVertex( s, TP(1,l)\x, TP(1,l)\y, TP(1,l)\z )
		v7 = AddVertex( s, TP(0,l)\x, TP(0,l)\y, TP(0,l)\z )
		v8 = AddVertex( s, TP(5,n)\x, TP(5,n)\y, TP(5,n)\z )
		v9 = AddVertex( s, TP(6,n)\x, TP(6,n)\y, TP(6,n)\z )
		v10 = AddVertex( s, TP(6,l)\x, TP(6,l)\y, TP(6,l)\z )
		v11 = AddVertex( s, TP(5,l)\x, TP(5,l)\y, TP(5,l)\z )
		For v = v4 To v11
			Select d
				Case 0 r=50:g=150:b=50
				Case 1 r=75:g=200:b=75
			End Select
			VertexColor s,v,r,g,b
		Next
		AddTriangle s,v6,v5,v4
		AddTriangle s,v4,v7,v6
		AddTriangle s,v10,v9,v8
		AddTriangle s,v8,v11,v10
		
		;grass
		v12 = AddVertex( s, TP(1,n)\x, TP(1,n)\y, TP(1,n)\z )
		v13 = AddVertex( s, TP(2,n)\x, TP(2,n)\y, TP(2,n)\z )
		v14 = AddVertex( s, TP(2,l)\x, TP(2,l)\y, TP(2,l)\z )
		v15 = AddVertex( s, TP(1,l)\x, TP(1,l)\y, TP(1,l)\z )
		v16 = AddVertex( s, TP(4,n)\x, TP(4,n)\y, TP(4,n)\z )
		v17 = AddVertex( s, TP(5,n)\x, TP(5,n)\y, TP(5,n)\z )
		v18 = AddVertex( s, TP(5,l)\x, TP(5,l)\y, TP(5,l)\z )
		v19 = AddVertex( s, TP(4,l)\x, TP(4,l)\y, TP(4,l)\z )
		For v = v12 To v19
			Select d
				Case 0 r=200:g=50:b=50
				Case 1 r=200:g=200:b=200
			End Select
			VertexColor s,v,r,g,b
		Next
		AddTriangle s,v14,v13,v12
		AddTriangle s,v12,v15,v14
		AddTriangle s,v18,v17,v16
		AddTriangle s,v16,v19,v18
		
		;underside	
		If TP(3, n )\y =10 Or TP(3, l )\y=10
			v20 = AddVertex( s, TP(0,n)\x, TP(0,n)\y, TP(0,n)\z )
			v21 = AddVertex( s, TP(6,n)\x, TP(6,n)\y, TP(6,n)\z )
			v22 = AddVertex( s, TP(6,l)\x, TP(6,l)\y, TP(6,l)\z )
			v23 = AddVertex( s, TP(0,l)\x, TP(0,l)\y, TP(0,l)\z )
			For v = v20 To v23
				Select d
					Case 0 r=50:g=50:b=200
					Case 1 r=50:g=50:b=150
				End Select
				VertexColor s,v,r,g,b
			Next
			AddTriangle s, v20,v21,v22
			AddTriangle s,v22,v23,v20 
		EndIf
			
	Next
	
	EntityFX mesh,2
	EntityPickMode mesh,2
	UpdateNormals mesh
	Return mesh

End Function

;=================================================
;=================================================
;=================================================

Function MESHcar.CarType( r,g,b)

	c.CarType = New CarType
	c\Model = CreateCube()
	PositionMesh c\Model,0,1,0
	ScaleMesh c\Model,.5,.5,1
	UpdateNormals c\Model
	EntityColor c\Model,r,g,b
			
	c\Target = CreatePivot( c\Model )
	PositionEntity c\Target,0,4,-8
	
	temp = CreateCylinder( 5 )
	RotateMesh temp,0,0,90
	ScaleMesh temp,.25,.5,.5
	EntityColor temp,50,50,50
	w=0
	For z# = .75 To -1 Step -1.75
		For x# = -1 To 1 Step 2
			c\Wheel[w] = CopyEntity( temp, c\Model )
			UpdateNormals c\Wheel[w]
			PositionEntity c\Wheel[w],x,.5,z
			w = w + 1
		Next
	Next
	FreeEntity temp
	
	shadow = CreateCube( c\Model )
	ScaleEntity shadow,1.25,.01,1.25
	EntityColor shadow,50,50,50
	EntityAlpha shadow,.5
	
	c\Acceleration = .01
	c\Brakes = .005
	c\Traction = .95
	c\Speed = 0.0
	c\TopSpeed = 1.25
	c\Vx = 0
	c\Vy = 0
	c\Vz = 0
			
	Return c

End Function

;=================================================
;=================================================
;=================================================

.LEVELdata

Data 25
Data 32,0,80
Data -32,0,80
Data -64,1,48
Data -96,3,-16
Data -128,0,-16
Data -160,3,48
Data -160,0,112
Data -160,5,176
Data -96,0,176
Data -32,0,208
Data 32,0,208
Data 96,5,176
Data 96,5,144
Data 32,0,144
Data -32,0,144
Data -128,11,144
Data -192,11,144
Data -224,0,112
Data -224,0,16
Data -256,8,-16
Data -256,8,-48
Data -192,3,-112
Data -128,0,-112
Data -64,5,-144
Data 32,7,-112
Data 96,0,16