Weird issw with TurnEntity (Possibly Float issue)

Blitz3D Forums/Blitz3D Programming/Weird issw with TurnEntity (Possibly Float issue)

The following should be run-able as is. Check out the Yaw values, though, I dunno why I can't seem to fix them to stay to 90 degree increments. :S

;Dungeon 

 
Graphics3D 800,600,32,2

SetBuffer BackBuffer()

Global screenbk=CreateImage(GraphicsWidth(),GraphicsHeight())
Global underw_a
;*****************************INITIALISE******************************

SeedRnd MilliSecs()

AmbientLightR=128
AmbientLightG= 128
AmbientLightB= 128

MasterFogRangeNear=-12
MasterFogRangeFar=8

Global cam=CreateCamera()

EntityType cam,2,0

CameraViewport cam,0,0,800,600

ScaleEntity cam,0.5,1,0.5

CameraFogMode cam,1
CameraFogColor cam,AmbientLightR /8,AmbientLightG /8,AmbientLightB /8
CameraFogRange cam,MasterFogRangeNear,MasterFogRangeFar
CameraRange cam,0.01,MasterFogRangeFar+2

ViewFar=MasterFogRangeFar
ViewNear=MasterFogRangeNear

camlight=CreateLight(2)
EntityParent camlight,cam,1

LightRange camlight,4
EntityRadius cam,0.3

Global fpcounter#
Global timer

Global TORCH=0
Global poison=0
Global tempPoison#=0
Global tpadd#=0.01
;****************************BUILD ARRAYS *****************************

Dim vpos#(1,1)
Dim Map(200)

;***************************CREATE QUICK RANDOM MAP**********************


Fl=CreatePlane()
MoveEntity fl,0,-1,0
;ftx=LoadTexture("Floor.bmp")
;EntityTexture Fl,ftx
;FreeTexture ftx

	For f= 1 To 200

		Map(f)=CreateWall()
					
		ScaleMesh Map(f),1,4,1
		
				Morph(Map(f))
						
		PositionEntity Map(f),Rand(-15,15),0,Rand(-15,15)
				
		Next
	
	
;******************************* SET COLLISIONS ******************

Collisions 2,3,3,1

;*************************** MAIN LOOP ****************************

Global fps#=0

timer=MilliSecs()

While Not KeyDown(1)

;*************************CONTROLS*****************************

PositionEntity cam,Int(EntityX(cam)),0,Int(EntityZ(cam)),1
RotateEntity cam,0,Floor(EntityYaw(cam)),0,1



If KeyDown(200) Then walkforward(cam)
If KeyDown(208) Then walkbackward(cam)

If KeyDown(203) Then turnleft(cam)
If KeyDown(205) Then turnright(cam)

If KeyDown(25)

			Delay 150
			
			poison = (1-poison)
			
			If poison=1
				AmbientLightR=AmbientLightR-64
				AmbientLightB=AmbientLightB-64
			End If	
					
			If poison=0 
				CameraZoom cam,1
				AmbientLightR=AmbientLightR+64
				AmbientLightB=AmbientLightB+64
			EndIf

		AmbientLight AmbientLightR,AmbientLightG,AmbientLightB

EndIf


If KeyDown(20) 
			
			Delay 150
			
			TORCH=(Not TORCH)
			
			If TORCH
				AmbientLightR=AmbientLightR+64
				AmbientLightG=AmbientLightG+64
				AmbientLightB=AmbientLightB+32
			
			FogRangeFar=MasterFogRangeFar+2
			CameraRange cam,0.01,FogRangeFar+2
			CameraFogRange cam,FogRangeNear,Rand(FogRangeFar,FogRangeFar+4)

			LightColor camlight,Rand(32)+16+AmbientLightR,Rand(32)+16+AmbientLightG,AmbientLightB+16

			ShowEntity camlight
	
			ViewFar=(ViewFar*2)
	
			EndIf	
			
			If Not TORCH			
				AmbientLightR=AmbientLightR-64
				AmbientLightG=AmbientLightG-64	
				AmbientLightB=AmbientLightB-32
					
				CameraFogRange cam,FogRangeNear,MasterFogRangeFar
				CameraRange cam,0.01,MasterFogRangeFar-2	
					
				HideEntity camlight					
			EndIf
				
		AmbientLight AmbientLightR,AmbientLightG,AmbientLightB
		CameraFogColor cam,AmbientLightR/8,AmbientLightG/8,AmbientLightB/8
	
CameraFogColor cam,AmbientLightR /8,AmbientLightG /8,AmbientLightB /8
CameraFogRange cam,FogRangeNear,FogRangeFar
CameraRange cam,0.01,FogRangeFar+2
	
			
EndIf

If TORCH
EndIf

;*************************TORCHLIGHT*******************************

		render()


Wend
End

;*******************************************FUNCTIONS************************




Function walkforward(entity)

	If poison=1
		CameraClsMode cam,0,0
	End If

For f= 1 To 5 

MoveEntity entity,0,0.05,0.1


render()

Next

For f= 1 To 5 

MoveEntity entity,0,-0.05,0.1


render()

Next

	If poison=1	Then CameraClsMode cam,1,1

End Function




Function walkbackward(entity)

	If poison=1
		CameraClsMode cam,0,0
	End If

For f= 1 To 5 

MoveEntity entity,0,0.1,-0.1


render()

Next

For f= 1 To 5 

MoveEntity entity,0,-0.1,-0.1

render()

Next

	If poison=1
		CameraClsMode cam,1,1
	End If

End Function


Function turnleft(entity)
yw=Int(Floor(EntityYaw(entity)))

For f=0 To 20

TurnEntity entity,0,4.5,0,True
	render()
Next

RotateEntity entity,0,yw+90,0,True
;q=EntityYaw(entity,True) Mod 90
;If q<>0 Then TurnEntity entity,0,-q,0,True

End Function


Function turnright(entity)
yw=Int(Floor(EntityYaw(entity)))
For f=0 To 20
TurnEntity entity,0,-4.5,0,True
	render()
Next

;RotateEntity entity,0,yw-90,0,True

;q=EntityYaw(entity,True) Mod 90
;If q<>0 Then TurnEntity entity,0,q,0,True
End Function







Function CreateWall()

;*****************************CREATE SEGMENTED CUBE FROM 6 SIDES **************

	mesh=CreateMesh()
	
	segs=3
	
	For scnt=0 To 3
		surf=CreateSurface( mesh )
		stx#=-.5
		sty#=stx
		stp#=Float(1)/Float(segs)
		y#=sty
		For a=0 To segs
			x#=stx
			v#=a/Float(segs)
			For b=0 To segs
				u#=b/Float(segs)
				AddVertex(surf,x,y,0.5,u,v)
				x=x+stp
			Next
			y=y+stp
		Next
		For a=0 To segs-1
			For b=0 To segs-1
				v0=a*(segs+1)+b:v1=v0+1
				v2=(a+1)*(segs+1)+b+1:v3=v2-1
				AddTriangle( surf,v0,v1,v2 )
				AddTriangle( surf,v0,v2,v3 )
			Next
		Next
		RotateMesh mesh,0,90,0
	Next

	UpdateNormals mesh
	
	EntityType Mesh,3,1
	
	EntityBox mesh,-0.5,0,-0.5,1,4,1

;wtx=LoadTexture("Wall.bmp")
;EntityTexture Mesh,wtx
;FreeTexture wtx

Return mesh
End Function


;**************************MORPH VERTS*****************************

Function Morph(mesh)

surftotal=CountSurfaces(mesh)

For xx= 1 To surftotal
as1=GetSurface(mesh,xx)

; record the locations of the verts
Dim vpos#(CountVertices(as1)-1,3)
For n=0 To CountVertices(as1)-1
	vpos(n,0)=VertexX(as1,n)
	vpos(n,1)=VertexY(as1,n)
	vpos(n,2)=VertexZ(as1,n)
	vpos(n,3)=0
Next

For n=0 To CountVertices(as1)-1

; change these to make it more or less messy
xm#=Rnd(-.1,.1)
ym#=Rnd(-.1,.1)
zm#=Rnd(-.1,.1)

	For nn=0 To CountVertices(as1)-1
	
	; if the vert has not been monkeyed with monkey away
	If vpos(nn,3)=0
		If vpos(n,0)=vpos(nn,0) And vpos(n,1)=vpos(nn,1) And vpos(n,2)=vpos(nn,2)
			VertexCoords as1,nn,vpos(nn,0)+xm,vpos(nn,1)+ym,vpos(nn,2)+zm
			vpos(nn,3)=1
			EndIf
		EndIf
		
	Next
Next

Next

Return mesh

End Function


Function render()

;*************************MAINTAIN FACING*******************

RotateEntity cam,0,EntityYaw(cam),0,True

	If poison=1
		tempPoison#=tempPoison#+tpadd#
		If TempPoison#>1 Then tpadd#=(0-0.01)
		If TempPoison#<0.8 Then tpadd#=0.01
			CameraZoom cam,tempPoison#
	EndIf

UpdateWorld
RenderWorld

Text 600,50,EntityX(cam,True)+" , "+EntityZ(cam,True),1,1
Text 600,70,EntityYaw(cam,True)

Text 0,100,"POLYS: "+TrisRendered(),0,1

Text 0,200,"FPS: "+fps#,0,1

If poison Text 0,250,"POISON AFFLICTION APPLIED",0,1
If TORCH Text 0,280,"TORCHLIGHT ACTIVE",0,1

fpcounter#=fpcounter#+1

	If (MilliSecs()-timer)>=1000
		timer=MilliSecs()
		fps#=fpcounter#
		fpcounter#=0
	EndIf

If poison=1
	CaptureScreen()
	WobbleView()
End If
	Flip
End Function


; COLLISIONS INDECES

;1 = PLAYER
;2 = CAMERA
;3 = WALL

















Function capturescreen()
 CopyRect 0,0,GraphicsWidth(),GraphicsHeight(),0,0,BackBuffer(),ImageBuffer(screenbk)
End Function

Function WobbleView()
 gw#=GraphicsWidth()
 gh#=GraphicsHeight()
 underw_a=(underw_a+4)
 steph#=gh/32
 mu8#=gh/60
 If underw_a>359 Then underw_a=0
  For iif#=0 To gh-4  Step .001
   wsin#=(Sin((underw_a+iif)Mod 360.0)*mu8#)
   CopyRect 0,  iif,         gw,steph+4, 0,iif+wsin#, ImageBuffer(screenbk),BackBuffer()
   iif=iif+steph
  Next
End Function