hows it done? i'd never heard of cube mapping until blitz had the update with it in and saw robs demo. i noticed he was making water refelection using a cube map and i tryed to work out what he was doing and came up with this code....
Function GenerateReflections(water, camera, WaterMapTexture)
CameraProjMode camera,0
CameraProjMode FXCamera,1
PositionEntity FXCamera,EntityX(camera),EntityY(water)-2,EntityZ(camera)
HideEntity water
;do left view
SetCubeFace WaterMapTexture,0
RotateEntity FXCamera,0,90,0
RenderWorld
CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture)
;do forward view
SetCubeFace WaterMapTexture,1
RotateEntity FXCamera,0,0,0
RenderWorld
CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture)
;do right view
SetCubeFace WaterMapTexture,2
RotateEntity FXCamera,0,-90,0
RenderWorld
CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture)
;do backward view
SetCubeFace WaterMapTexture,3
RotateEntity FXCamera,0,180,0
RenderWorld
CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture)
;do up view
SetCubeFace WaterMapTexture,4
RotateEntity FXCamera,-90,0,0
RenderWorld
CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture)
CameraProjMode camera,1
CameraProjMode FXCamera,0
ShowEntity water
Return WaterMapTexture
End Function
but it really desnt work. I jsut get strange blotches of colour that arent even in the code :\
I prefer to just create a cubemap at startup, and leave it alone, rather than killing my framerate with a lot of CopyRects().
Function CreateCubeMap(size,x#,y#,z#,flags=128+256)
If Not (128 And flags) flags=flags+128
Local cam=CreateCamera()
Local tex=CreateTexture(size,size,flags)
If skybox
RotateEntity skybox,0,0,0,1
PositionEntity skybox,x,y,z,1
EndIf
CameraRange cam,1,100000
CameraViewport cam,0,0,size,size
PositionEntity cam,x,y,z
TurnEntity cam,0,90,0
RenderWorld
SetCubeFace tex,0
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,1
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,2
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,3
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
TurnEntity cam,90,0,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,4
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,180,0,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,5
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
FreeEntity cam
If skybox PositionEntity skybox,0,0,0
Return tex
End Function
Function UpdateCubeMap(tex,x#,y#,z#)
Local cam=CreateCamera()
CameraRange cam,1,100000
CameraViewport cam,0,0,TextureWidth(tex),TextureHeight(tex)
PositionEntity cam,x,y,z
TurnEntity cam,0,90,0
RenderWorld
SetCubeFace tex,0
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,1
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,2
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,3
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
TurnEntity cam,90,0,0
RenderWorld
SetCubeFace tex,4
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,180,0,0
RenderWorld
SetCubeFace tex,5
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
FreeEntity cam
Return tex
End Function
Hi Halo,
I'm trying to make a simple demo of your code:
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
water=CreatePlane()
cam=CreateCamera()
PositionEntity cam,0,10,-20
RotateEntity cam,40,0,0
cube=CreateCube()
PositionEntity cube,1,5,1
tex = CreateCubeMap(128,EntityX(cam),cubeMapCameraY( EntityY(cam),EntityY(water) ),EntityZ(cam))
EntityTexture water,tex
While Not KeyHit(1)
UpdateWorld
TurnEntity cube,1,1,1
tex = UpdateCubeMap(tex,EntityX(cam),cubeMapCameraY( EntityY(cam),EntityY(water) ),EntityZ(cam))
EntityTexture water,tex
RenderWorld
Flip
Wend
End
Function cubeMapCameraY(screenCameraY#,waterY#)
; tip from jfk
; returns Y coordinate for cubemap camera
y# = waterY# - (screenCameraY# - waterY#)
RuntimeError y#
End Function
Function CreateCubeMap(size,x#,y#,z#,flags=128+256)
If Not (128 And flags) flags=flags+128
Local cam=CreateCamera()
Local tex=CreateTexture(size,size,flags)
If skybox
RotateEntity skybox,0,0,0,1
PositionEntity skybox,x,y,z,1
EndIf
CameraRange cam,1,100000
CameraViewport cam,0,0,size,size
PositionEntity cam,x,y,z
TurnEntity cam,0,90,0
RenderWorld
SetCubeFace tex,0
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,1
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,2
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,3
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
TurnEntity cam,90,0,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,4
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,180,0,0
If skybox RotateEntity skybox,0,0,0,1
RenderWorld
SetCubeFace tex,5
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
FreeEntity cam
If skybox PositionEntity skybox,0,0,0
Return tex
End Function
Function UpdateCubeMap(tex,x#,y#,z#)
Local cam=CreateCamera()
CameraRange cam,1,100000
CameraViewport cam,0,0,TextureWidth(tex),TextureHeight(tex)
PositionEntity cam,x,y,z
TurnEntity cam,0,90,0
RenderWorld
SetCubeFace tex,0
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,1
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,2
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
RenderWorld
SetCubeFace tex,3
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,0,-90,0
TurnEntity cam,90,0,0
RenderWorld
SetCubeFace tex,4
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
TurnEntity cam,180,0,0
RenderWorld
SetCubeFace tex,5
CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
FreeEntity cam
Return tex
End Function
...But I think I'm not understanding this at all :)