Include "Xors3d.bb"
Const PI_180 = (0.0174532925199433)
Const WaterMapSize = 512
; setup maximum supported AntiAlias Type
xSetAntiAliasType(xGetMaxAntiAlias())
; set application window caption
xAppTitle("Simple Water")
; initialize Graphics mode
xGraphics3D(800, 600, 0, False, True)
xSetBuffer(xBackBuffer())
xHidePointer()
xAntiAlias(True)
; create camera
camera = xCreateCamera()
xPositionEntity(camera, 0, 10, -10)
xCameraFogMode camera,1
xCameraFogColor camera,100,200,255
xCameraZoom camera,.25
; cube fx camera
FXCamera=xCreateCamera()
xCameraClsMode FXCamera,False,True
xCameraProjMode FXCamera,0
xCameraViewport FXCamera,0,0,WaterMapSize,WaterMapSize
xCameraZoom FXCamera,.0125
; ambient light
xAmbientLight 32,32,32
; light
mainlight=xCreateLight()
xRotateEntity mainlight,45,60,30
xLightColor mainlight,192,192,192
; create level
level = xLoadAnimMesh("level\test.b3d")
water= xLoadMesh("level\water.3ds")
xMoveEntity water,0,-2,0
WaterMapTexture=xCreateTexture(WaterMapSize,WaterMapSize,128+48)
xEntityTexture water,WaterMapTexture
xEntityColor water,100,200,255
xEntityColor water,512,512,512
xEntityAlpha water,0.7
xEntityFX water,1
; For mouse look
xMoveMouse(xGraphicsWidth() / 2, xGraphicsHeight() / 2)
mousespeed# = 0.5
camerasmoothness# = 4.5
camxa#=180
Const C_level=1,C_player=2,C_floorpivot=3
xCollisions c_player,c_level,2,2
xEntityType camera,c_player
xEntityType level,c_level,1
xEntityRadius camera,4.5,6
; main program loop
While xKeyDown(KEY_ESCAPE)=0
; camera control
If xKeyDown(KEY_W) Then : xMoveEntity(camera, 0, 0, 1): EndIf
If xKeyDown(KEY_S) Then : xMoveEntity(camera, 0, 0, -1): EndIf
If xKeyDown(KEY_A) Then : xMoveEntity(camera, -1, 0, 0): EndIf
If xKeyDown(KEY_D) Then : xMoveEntity(camera, 1, 0, 0): EndIf
mxs# = CurveValue(xMouseXSpeed() * mousespeed, mxs, camerasmoothness)
mys# = CurveValue(xMouseYSpeed() * mousespeed, mys, camerasmoothness)
camxa# = camxa - mxs
camya# = camya + mys
If camya < -89 Then : camya = -89 : EndIf
If camya > 89 Then : camya = 89 : EndIf
xMoveMouse(xGraphicsWidth()/2, xGraphicsHeight()/2)
xRotateEntity(camera, camya, camxa, 0.0)
If xEntityY(camera,1)<-3 Then : underwater=1 : Else : underwater=0 : EndIf
wdb=1-wdb
xCameraProjMode camera,0
xCameraProjMode FXCamera,1
xHideEntity(water)
If underwater=0 Then
xPositionEntity FXCamera,xEntityX(camera),xEntityY(water)-2,xEntityZ(camera)
If wdb Then
;do Left view
xSetCubeFace WaterMapTexture,0
xRotateEntity FXCamera,0,90,0
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
;do forward view
xSetCubeFace WaterMapTexture,1
xRotateEntity FXCamera,0,0,0
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
Else
;do Right view
xSetCubeFace WaterMapTexture,2
xRotateEntity FXCamera,0,-90,0
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
;do backward view
xSetCubeFace WaterMapTexture,3
xRotateEntity FXCamera,0,180,0
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
EndIf
;do up view
xSetCubeFace WaterMapTexture,4
xRotateEntity FXCamera,-90,0,0
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
Else
xPositionEntity FXCamera,-xEntityX(camera),xEntityY(camera)-2,xEntityZ(camera)
If wdb Then
;do Left view
xSetCubeFace WaterMapTexture,0
xRotateEntity FXCamera,0,-90,180
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
;do forward view
xSetCubeFace WaterMapTexture,1
xRotateEntity FXCamera,0,0,180
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
Else
;do Right view
xSetCubeFace WaterMapTexture,2
xRotateEntity FXCamera,0,90,180
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
;do backward view
xSetCubeFace WaterMapTexture,3
xRotateEntity FXCamera,0,180,180
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
EndIf
;do down view
xSetCubeFace WaterMapTexture,5
xRotateEntity FXCamera,-90,0,180
xRenderWorld
xCopyRect 0,0,WaterMapSize,WaterMapSize,0,0,xBackBuffer(),xTextureBuffer(WaterMapTexture)
EndIf
xShowEntity(water)
xCameraProjMode FXCamera,0
xCameraProjMode camera,1
xSetBuffer(xBackBuffer())
xUpdateNormals water
If underwater Then
If waterdirection=1 Then
xFlipMesh water
xEntityAlpha water,1
xEntityColor water,155,200,255
EndIf
waterdirection=-1
xCameraFogColor camera,50,100,155
t#=xMillisecs()/6
xScaleEntity camera,1+Cos(t)*0.04,1+Sin(t)*0.04,1+Cos(t)*0.02
xCameraFogRange camera,0,200+Sin(xMillisecs()*0.05)*60
xTurnEntity camera,0,0,Sin(t)*2
Else
If waterdirection=-1 Then
xFlipMesh water
xEntityAlpha water,.7
xEntityColor water,255,255,255
EndIf
waterdirection=1
xCameraFogColor camera,100,200,255
xScaleEntity camera,1,1,1
xCameraFogRange camera,100,1000
EndIf
s=xGetSurface(water,0)
For i =0 To xCountVertices(s)-1
Freq#=xMillisecs()/4
vx# = xVertexX(s,i)
vy# = xVertexY(s,i)
vz# = xVertexZ(s,i)
vy#=Sin(freq+vx*500+vz*300)*1.2
xVertexCoords s,i,vx,-vy,vz
Next
xUpdateWorld()
; render scene
xRenderWorld()
; switch back buffer
xFlip()
Wend
; For camera mouse look
Function CurveValue#(newvalue#, oldvalue#, increments%)
If increments > 1 Then : oldvalue = oldvalue - (oldvalue - newvalue) / increments : EndIf
If increments <= 1 Then : oldvalue = newvalue : EndIf
Return oldvalue
End Function