Phil Jones' pitch and roll example

Blitz3D Forums/Blitz3D Programming/Phil Jones' pitch and roll example

Woah, that's all way over my head.. Maybe I should just use a sin/cosine/tan equation to create what I'm looking for.

Then again, this linepick does sound interesting, so I tried what Stevie suggested, here's an external-less media code of what I'm ussing. It was in the water competition awhile back but a little different since I started toying with it. btw props to fredborg for create code.

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()


;
; Prepare stuff
Cube_Init()

;
; Make a camera
Global camera=CreateCamera()
CameraClsMode camera,False,True
CameraRange camera,1,10000
CameraFogColor camera,96,140,183
CameraFogRange camera,2000,9000
CameraFogMode camera,1

;
; Make a stunning light
light=CreateLight()
RotateEntity light,25,0,0
AmbientLight 100,105,120

;
; Make a pivot which the camera points at
center=CreatePivot()

;
; Make a sky sphere
;skytex = LoadTexture("sky.png",1+8+16+32)
;sky = CreateSphere(16)
;FlipMesh sky
;ScaleEntity sky,5000,5000,5000
;EntityOrder sky,1000
;EntityFX sky,1+16
;EntityTexture sky,skytex

;
; A duck
duck=CreateCube("")
ScaleEntity duck,1000,1000,1000


;
; Some great variables
size# = 128*50.0
a#=180
storm# = 2.5
height# = 13.0
crystal# = 0.6
Animat = True
cubeupd = True
help = True

;
; And then we are ready
While KeyDown(1)=0
	
	sx# = MouseXSpeed()
	sy# = MouseYSpeed()
	
	a2# = (a2+.01) Mod 360
	
	;
	; Animate camera or control it with mouse + keys
If animat
a#=(a+.1) Mod 360
	PositionEntity camera, Sin(a)*(.5*size),500+(Sin(a)*400),Cos(a)*(.5*size)
	PointEntity camera, center
	Else
		TurnEntity camera,sy,-sx,0
		RotateEntity camera,EntityPitch(camera,True),EntityYaw(camera,True),0
		MoveEntity camera,(KeyDown(32)-KeyDown(30))*10,0,(KeyDown(17)-KeyDown(31))*10
	EndIf
	
	;
	; Move the duck
	
	
	;
	; Change fog if below water level
	If EntityY(camera,True)<0
		CameraFogColor camera,50,90,100
		CameraFogRange camera,500,3000
	Else
		CameraFogColor camera,96,140,183
		CameraFogRange camera,2000,9000
	EndIf
	
	;
	; Reposition sky
	;PositionEntity sky,EntityX(camera,1),EntityY(camera,1),EntityZ(camera,1),1

	;
	; Animate the waves
	Cube_Waves(camera,storm,height,crystal)
	
	;
	; Update reflection?
	;If cubeupd
;		Cube_Update(camera,sky)
	;EndIf

	RenderWorld()

	
	;
	; Fps counter	
	curTime = MilliSecs()
	If curTime > checkTime Then
		checkTime = curTime + 1000
		curFPS = fpscounter
		fpscounter = 0
		If currentFrame>75
			If curFPS<fps_low Then fps_low = curFPS
		EndIf
	Else
		fpscounter = fpscounter + 1
	End If
	
	Flip False
Wend

;
; We're done!
End

;
; Water 
;
; By Mikkel Fredborg
; Use as you please!

;
; A bunch of global variables
Global cubetex	
Global cubetex2
Global cubetex3
Global cubetex4
Global cubetex5
Global cubesize	
Global cubereflect
Global cuberefract
Global cubecamA[5]
Global cubewater
Global cubetile[9999]
Global cubewave#
Global cuberes
Global cubescale#
Global cubeoffset# 
Global cubebase
Global cubeinfinite
Global cubered#,cubegreen#,cubeblue#

Dim cubewavemap#(16,16,8)
Dim tempwavemap#(16,16,1)

Global slope_x#,slope_y#,slope_z#

Function Cube_Init(res=15,tres=256,soften=0,scale#=1500.0)

	cubescale = scale

	Dim cubewavemap#(res,res,8)

		Dim cubewavemap#(res,res,8)
	cubetex2 = CreateTexture(256,256,1+2)
	;cubetex2 = LoadTexture("waterfoam00.png",1+2)
	cubetex3 = CreateTexture(256,256,1+2)
	;cubetex3 = LoadTexture("waterfoam00.png",1+2)
	ScaleTexture cubetex2,0.5,0.5
	RotateTexture cubetex3,45
	ScaleTexture cubetex3,2,2
	
	
	cubetex4 = CreateTexture(256,256,1+2)
	;cubetex4 = LoadTexture("wateralpha00.png",1+2)
	cubetex5 = CreateTexture(256,256,1+2)
	;cubetex5 = LoadTexture("wateralpha00.png",1+2)
	RotateTexture cubetex4,45
	ScaleTexture cubetex4,2,2

	cubetex		= CreateTexture(tres,tres,1 + 128 + 256)
	cubesize	= TextureWidth(cubetex)
	
	cubereflect = CreatePivot()
	HideEntity cubereflect
	
	For i=0 To 5
		cubecamA[i] = CreateCamera(cubereflect)
		CameraClsMode cubecamA[i],False,True
		CameraRange cubecamA[i],1,15000
	Next

	RotateEntity cubecamA[0],0,90,0 ; right
	CameraViewport cubecamA[0],0,0,cubesize,cubesize
	RotateEntity cubecamA[1],0,0,0 ; forw
	CameraViewport cubecamA[1],cubesize,0,cubesize,cubesize
	RotateEntity cubecamA[2],0,-90,0 ; left
	CameraViewport cubecamA[2],cubesize*2,0,cubesize,cubesize
	RotateEntity cubecamA[3],0,180,0 ; back
	CameraViewport cubecamA[3],0,cubesize,cubesize,cubesize
	RotateEntity cubecamA[4],-90,0,0 ; up
	CameraViewport cubecamA[4],cubesize,cubesize,cubesize,cubesize
	RotateEntity cubecamA[5],90,0,0 ; down
	CameraViewport cubecamA[5],cubesize*2,cubesize,cubesize,cubesize

	cubewater = Cube_CreatePlane(res,True)	
	ScaleMesh cubewater,scale,1,scale

	br1 = CreateBrush()
	BrushTexture br1,cubetex4
	BrushTexture br1,cubetex5,0,1
	BrushTexture br1,cubetex,0,2
	BrushFX br1,2+32+16+1
	BrushShininess br1,1.0
	s1 = GetSurface(cubewater,2)
	PaintSurface s1,br1

	br2 = CreateBrush()
	BrushTexture br2,cubetex2
	BrushTexture br2,cubetex3,0,1
	BrushFX br2,1+2+32
	s2 = GetSurface(cubewater,1)
	PaintSurface s2,br2

	cubered		= 140 ;* 1.2
	cubegreen	= 180 ;* 1.2
	cubeblue	= 200 ;* 1.2

	br2 = CreateBrush()
	BrushFX br2,1+2+32+16
	BrushAlpha br2,0.75
	
	tcount = 5

	i = 0
	For x = -tcount To tcount
		For z = -tcount To tcount
			If x<>0 Or z<>0
				cubetile[i] = CopyEntity(cubewater)
				PositionEntity cubetile[i],x*scale,0,z*scale
				;d# = Abs(x)
				;If Abs(z)>d Then d = Abs(z)
				;If d>1
				;	ScaleEntity cubetile[i],1,1.0-(d/(tcount+0.01)),1
				;EndIf
				i = i + 1
			EndIf
		Next
	Next
	
	i = 0
	For x = -tcount To tcount
		For z = -tcount To tcount
			If x<>0 Or z<>0
				If cubetile[i]
					EntityParent cubetile[i],cubewater
				EndIf
				i = i + 1
			EndIf
		Next
	Next

	cubebase = CreatePivot()

	mmx# = 0.35

	BrushFX br2,1+2+32
	pr1 = Cube_CreatePlane(16,False)
	EntityParent pr1,cubebase
	PaintEntity pr1,br2
	;PositionEntity pr1,0,-0.5,0
	ScaleEntity pr1,scale*tcount*2,1,scale*tcount*2
	EntityOrder pr1,1
	surf = GetSurface(pr1,1)
	n_verts = CountVertices(surf)-1
	For v = 0 To n_verts
		vx# = VertexX(surf,v)*2.0
		vz# = VertexZ(surf,v)*2.0
		d# = Sqr(vx*vx + vz*vz)
		a# = 1.0-d
		VertexColor surf,v,cubered*mmx,cubegreen*mmx,cubeblue*mmx,a
	Next
	
	cuberes = res
	
	For x = 0 To res
		For z = 0 To res
			cubewavemap(x,z,0) = Rnd(-1.0,1.0)*360.0*(16.0/cuberes)
			cubewavemap(x,z,1) = Rnd(-1.0,1.0)
		Next
	Next

	For i = 1 To soften
		Cube_BlurWaveMap()
	Next
	
	For x = 0 To res
		For z = 0 To res
			xz# = ((x/Float(res)) - (z/Float(res)));/2.0
		
			cubewavemap(x,z,0) = (xz*360.0) + cubewavemap(x,z,0)
;			cubewavemap(x,z,1) = ACos(cubewavemap(x,z,1));+(z*(res/360.0))
			
			i = x
			j = z
			If i = res Then i = 0
			If j = res Then j = 0
			cubewavemap(x,z,0) = cubewavemap(i,j,0)
			cubewavemap(x,z,1) = cubewavemap(i,j,1)				
		Next
	Next
	
End Function

Function Cube_BlurWaveMap()
	
	Dim tempwavemap(cuberes,cuberes,1)
	
	For x = 0 To cuberes
		For z = 0 To cuberes
			
			For xx = -1 To 1
				For zz = -1 To 1
					x2 = xx+x
					z2 = zz+z
					If x2<0 Then x2 = cuberes
					If x2>cuberes Then x2 = 0
					If z2<0 Then z2 = cuberes
					If z2>cuberes Then z2 = 0
					tempwavemap(x,z,0) = tempwavemap(x,z,0) + (cubewavemap(x2,z2,0)/9.0)
					tempwavemap(x,z,1) = tempwavemap(x,z,1) + (cubewavemap(x2,z2,1)/9.0)
				Next
			Next
			
		Next
	Next

	For x = 0 To cuberes
		For z = 0 To cuberes
			cubewavemap(x,z,0) = tempwavemap(x,z,0)
			cubewavemap(x,z,1) = tempwavemap(x,z,1)
		Next
	Next
		
End Function

Function Cube_GetHeight#(x#,z#)

	x# = (x/cubescale)-0.5
	z# = (z/cubescale)-0.5

	basex = Floor(x)
	basez = Floor(z)

	deltax# = x-basex
	deltaz# = z-basez

	basex = basex Mod cuberes
	basey = basey Mod cuberes
	If basex<0 Then basex = basex + cuberes
	If basez<0 Then basez = basez + cuberes

	xy0#	= cubewavemap(basex,basez,  1) + (cubewavemap(basex+1,basez  ,1)-cubewavemap(basex,basez  ,1))*deltax
	xy1#	= cubewavemap(basex,basez+1,1) + (cubewavemap(basex+1,basez+1,1)-cubewavemap(basex,basez+1,1))*deltax
	cY#		= xy0 + (xy1-xy0)*deltaz
	
	Return cY
	
End Function

Function Cube_GetSlope#(x#,z#)

	x# = (x/cubescale)-0.5
	z# = (z/cubescale)-0.5

	basex = Floor(x)
	basez = Floor(z)

	deltax# = x-basex
	deltaz# = z-basez

	basex = basex Mod cuberes
	basey = basey Mod cuberes
	If basex<0 Then basex = basex + cuberes
	If basez<0 Then basez = basez + cuberes

	xy0#	 = cubewavemap(basex,basez,  2) + (cubewavemap(basex+1,basez  ,2)-cubewavemap(basex,basez  ,2))*deltax
	xy1#	 = cubewavemap(basex,basez+1,2) + (cubewavemap(basex+1,basez+1,2)-cubewavemap(basex,basez+1,2))*deltax
	slope_x# = xy0 + (xy1-xy0)*deltaz

	xy0#	 = cubewavemap(basex,basez,  3) + (cubewavemap(basex+1,basez  ,3)-cubewavemap(basex,basez  ,3))*deltax
	xy1#	 = cubewavemap(basex,basez+1,3) + (cubewavemap(basex+1,basez+1,3)-cubewavemap(basex,basez+1,3))*deltax
	slope_y# = xy0 + (xy1-xy0)*deltaz
	
	xy0#	 = cubewavemap(basex,basez,  4) + (cubewavemap(basex+1,basez  ,4)-cubewavemap(basex,basez  ,4))*deltax
	xy1#	 = cubewavemap(basex,basez+1,4) + (cubewavemap(basex+1,basez+1,4)-cubewavemap(basex,basez+1,4))*deltax
	slope_z# = xy0 + (xy1-xy0)*deltaz
		
	Return cY
	
End Function

Function Cube_Waves(cam,stormy#=0.5,waveheight#=30.0,crystal#=0.9)

	;EntityAlpha cubeinfinite,crystal

	d# = (MilliSecs()/10000.0)*stormy
	PositionTexture cubetex2,d*0.5,d
	PositionTexture cubetex3,-d*0.5,-d

	PositionTexture cubetex4, d*0.65, d*1.1
	PositionTexture cubetex5,-d*0.65,-d*1.1

    x#=EntityX(cam,True)
    z#=EntityZ(cam,True)

	PositionEntity cubebase,x,0,z

	px = x/cubescale
	pz = z/cubescale
	PositionEntity cubewater,px*cubescale,0,pz*cubescale

	surf = GetSurface(cubewater,2)
	surf2 = GetSurface(cubewater,1)
	
	vert = 0
	For x = 0 To cuberes
		
		For z = 0 To cuberes
			cubewavemap(x,z,0) = (cubewavemap(x,z,0) + stormy) ;Mod 360
			If cubewavemap(x,z,0)<0
				cubewavemap(x,z,0) = cubewavemap(x,z,0) + 360.0
			ElseIf cubewavemap(x,z,0)=>360.0
				cubewavemap(x,z,0) = cubewavemap(x,z,0) - 360.0
			EndIf
			cubewavemap(x,z,1) = (((Sin(cubewavemap(x,z,0))+1.0)*0.5)) * waveheight# 
			vert = vert+1
		Next
	Next
	
	delta# = cubescale/cuberes
	For x = 0 To cuberes-1
		For z = 0 To cuberes-1
			;Edge vector v1-v0
			Ax# = 0
			Ay# = cubewavemap(x,z+1,1)-cubewavemap(x,z,1)
			Az# = delta
	
			;Edge vector v2-v0
			Bx# = delta
			By# = cubewavemap(x+1,z,1)-cubewavemap(x,z,1)
			Bz# = 0
	
			;crossproduct = normal
			cubewavemap(x,z,2) = Ay# * Bz# - By# * Az#
		    cubewavemap(x,z,3) = Az# * Bx# - Bz# * Ax#
		    cubewavemap(x,z,4) = Ax# * By# - Bx# * Ay#
		Next
	Next
			
	exa# = 15.0
	TFormNormal 0,0,-1,cam,0
	nx# = TFormedX()
	ny# = TFormedY()
	nz# = TFormedZ()

	;alp# = 1.0-((EntityY(cam,True)-200.0)/1000.0)
	;If alp>1.0 Then alp = 1.0
	;If alp<0.0 Then alp = 0.0

	alp# = 1.0

	If waveheight<20.0
		alpmul# = 1.0/20.0
	Else
		alpmul# = 1.0/waveheight
	EndIf

	vert = 0
	For x = 0 To cuberes
		For z = 0 To cuberes
		
			If x<cuberes And z<cuberes	
				TriNormalX# = 0.0 
				TriNormalY# = 0.0
				TriNormalZ# = 0.0
				
				For xx = -1 To 1
					For zz = -1 To 1
						x2 = x+xx
						z2 = z+zz
						If x2<0 Then x2=cuberes-1
						If z2<0 Then z2=cuberes-1
						TriNormalX = TriNormalX + cubewavemap(x2,z2,2)
						TriNormalY = TriNormalY + cubewavemap(x2,z2,3)
						TriNormalZ = TriNormalZ + cubewavemap(x2,z2,4)
					Next
				Next

				d# = Sqr(TriNormalX*TriNormalX + TriNormalY*TriNormalY + TriNormalZ*TriNormalZ)
				TriNormalX = TriNormalX/d
				TriNormalY = TriNormalY/d
				TriNormalZ = TriNormalZ/d
				
				VertexCoords surf,vert,VertexX(surf,vert),cubewavemap(x,z,1),VertexZ(surf,vert)
				VertexNormal surf,vert,TriNormalX,TriNormalY,TriNormalZ
				dot# = (TriNormalY*ny + TriNormalX*exa*nx + TriNormalZ*exa*nz);*0.0001
				If dot<0 Then dot = 0
				If dot>1 Then dot = 1
				;dot = dot*dot
				;add# = (VertexY(surf,vert)-waveheight)*2.5
				;VertexColor surf,vert,cubered+add,cubegreen+add,cubeblue+add,(crystal-(dot*crystal))*alp
				VertexColor surf,vert,255,255,255,(crystal-(dot*crystal))*alp
				
				VertexCoords surf2,vert,VertexX(surf,vert),cubewavemap(x,z,1),VertexZ(surf,vert)
				
				alpha# = cubewavemap(x,z,1)*alpmul
				alpha2# = alpha * alpha * alpha
				VertexColor surf2,vert,255,255,255,(alp*alpha2*0.5)+0.05
			Else
				x2 = x
				z2 = z
				If x2 = cuberes Then x2 = 0
				If z2 = cuberes Then z2 = 0
				vert2 = x2*(cuberes+1) + z2
				VertexCoords surf,vert,VertexX(surf,vert),VertexY(surf,vert2),VertexZ(surf,vert)
				VertexColor surf,vert,VertexRed(surf,vert2),VertexGreen(surf,vert2),VertexBlue(surf,vert2),VertexAlpha(surf,vert2)
				VertexNormal surf,vert,VertexNX(surf,vert2),VertexNY(surf,vert2),VertexNZ(surf,vert2)
				
				VertexCoords surf2,vert,VertexX(surf2,vert),VertexY(surf,vert2),VertexZ(surf2,vert)
				VertexColor surf2,vert,VertexRed(surf2,vert2),VertexGreen(surf2,vert2),VertexBlue(surf2,vert2),VertexAlpha(surf2,vert2)
			EndIf
			vert = vert+1
		Next
	Next
	
	;UpdateNormals cubewater
	
	cubewave# = (cubewave#+stormy#) Mod 360
	cubeoffset# = (cubeoffset+stormy) Mod cuberes
	
End Function





Function Cube_Update(camera,sky)

	HideEntity cubewater
	HideEntity cubebase
    HideEntity camera

    x#=EntityX(camera,1)
    y#=EntityY(cubewater,1)-EntityY(camera,1)
    z#=EntityZ(camera,1)

	ox# = EntityX(sky,True)
	oy# = EntityY(sky,True)
	oz# = EntityZ(sky,True)
	
	ShowEntity cubereflect
	If y<0
		ScaleEntity cubereflect,1,1,1
		PositionEntity cubereflect,x,y,z
	Else
		y = -y
		ScaleEntity cubereflect,1,-1,1
		PositionEntity cubereflect,x,y,z
	EndIf

	PositionEntity sky,x,y,z,True
	
	RenderWorld()
	
	SetCubeFace cubetex,0
	CopyRect 0,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	SetCubeFace cubetex,1
	CopyRect cubesize,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	SetCubeFace cubetex,2
	CopyRect cubesize*2,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	SetCubeFace cubetex,3
	CopyRect 0,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	SetCubeFace cubetex,4
	CopyRect cubesize,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	SetCubeFace cubetex,5
	CopyRect cubesize*2,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
	
	ShowEntity cubebase
	ShowEntity cubewater
	HideEntity cubereflect
    ShowEntity camera

	PositionEntity sky,ox,oy,oz,True

End Function

;Creates a single sided face
;segmented
Function Cube_CreatePlane(segs=1,dual=True,double=False,parent=0,uvscale#=8.0)
	mesh=CreateMesh( parent )
	surf=CreateSurface( mesh )
	If dual
		surf2 = CreateSurface( mesh )
	EndIf
	stx#=-0.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)
			i = AddVertex(surf,x,0,y,u*uvscale,v*uvscale) ; swap these for a different start orientation
			If dual
				i = AddVertex(surf2,x,0,y,u*uvscale,v*uvscale)
			EndIf
;			VertexTexCoords surf,i,u*uvscale,(1.0-v)*uvscale,1.0,1
			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,v2,v1 )
			AddTriangle( surf,v0,v3,v2 )
			If dual
				AddTriangle( surf2,v0,v2,v1 )
				AddTriangle( surf2,v0,v3,v2 )
			EndIf
		Next
	Next
	
	UpdateNormals mesh
	If double=True Then EntityFX mesh,16
	Return mesh
End Function