Files

117 lines
3.0 KiB
BlitzBasic

;Mirror in the wall
;Only works on one plane at the moment
;David Bird
;dave@birdie72.freeserve.co.uk
Graphics3D 640,480
SetBuffer BackBuffer()
lit=CreateLight()
cam=CreateCamera()
tex0=LoadTexture("tex0.bmp")
;Create a camera
CameraRange cam,1,200
;Create a sphere to visualise the camera
cam_cube=CreateCube()
EntityTexture cam_cube,tex0
ScaleEntity cam_cube,.5,.5,.5
;Create an flipped cube to place everything in
test=CreateCube()
ScaleMesh test,10,10,10
FlipMesh test
EntityTexture test,tex0
;Add a mirror.
Create_Mirror(0,0,9,5,0)
While Not KeyDown(1)
If KeyDown(203) MoveEntity cam,-.1,0,0
If KeyDown(205) MoveEntity cam,.1,0,0
If KeyDown(44) MoveEntity cam,0,0,-.1
If KeyDown(30) MoveEntity cam,0,0,.1
PositionEntity cam_cube,EntityX(cam),EntityY(cam),EntityZ(cam)
TurnEntity cam_cube,2,1,4
;Do updates of mirrors
Update_Mirrors(cam)
RenderWorld
Flip
Wend
;Free up all mirrors
free_Mirrors()
FreeEntity cam
EndGraphics
End
Type Mirror
Field plane
Field camera
Field texture
End Type
;Add a mirror to the scene
Function Create_Mirror(x#,y#,z#,size#,yrot#)
a.mirror=New mirror
a\plane=CreateMesh()
surf=CreateSurface(a\plane)
;Add all vertices to the surface. (Simple plane)
AddVertex(surf,1*size,1*size,0,0,0)
AddVertex(surf,-1*size,1*size,0,1,0)
AddVertex(surf,-1*size,-1*size,0,1,1)
AddVertex(surf,1*size,-1*size,0,0,1)
AddTriangle(surf,0,2,1)
AddTriangle(surf,0,3,2)
;the idea of a mirror is a camera behind the mirror
a\camera=CreateCamera(a\plane)
;which is rendered to a texture
CameraViewport a\camera,0,0,256,256
a\texture=CreateTexture(256,256)
EntityTexture a\plane,a\texture
;postion mirror where you want it
PositionEntity a\plane,x,y,z
;rotate it on y to the given
TurnEntity a\plane,0,yrot,0
End Function
;Update all mirrors
Function Update_Mirrors(camera)
ox#=EntityX(camera,True);Get the position of the main camera in x
oz#=EntityZ(camera,True);and in z
HideEntity camera ;hide the main camera
For a.mirror=Each mirror ;do updates First
dx#=EntityX(a\camera,True)-ox ;Get the angle between the mirror
dz#=EntityZ(a\camera,True)-oz ;and the main camera.
ang#=ATan2(dx,dz)+EntityYaw(a\plane);taking into account yaw of mirror
mag#=1/(Sqr(dx^2+dz^2)) ;Magnify according to distance.
RotateEntity a\camera,0,180+ang,0 ;rotate the mirrors camera to the correct orientation
CameraZoom a\camera,0.5+mag ;set the magnification of the mirror
Next
UpdateWorld ;Update everything.
For a.mirror=Each mirror ;rendering loop here. (all mirrors)
ShowEntity a\camera ;show the camera
RenderWorld ;render
CopyRect 0,0,256,256,0,0,0,TextureBuffer(a\texture);Copy the render to texture
HideEntity a\camera ;Hide the camera again
Next
ShowEntity camera ;Show Main camera again.
End Function
;Free up all mirrors here.
Function Free_Mirrors()
For a.mirror=Each mirror
If a\camera FreeEntity a\camera
If a\plane FreeEntity a\plane
If a\texture FreeTexture a\texture
Delete a
Next
End Function