; ID: 1030; Author: fredborg; Date: 2004-05-14 18:19:02; Title: Depth of Field; Description: Simple depth of field effect!; Attempt to handle CameraZoom added by jfk.;; Depth of field;; Created by Mikkel Fredborg; Use as you please!;Graphics3D 800,600,0,2SetBuffer BackBuffer()HidePointer;; Create a camera...camera = CreateCamera()CameraRange camera,0.1,1000.0CameraFogMode camera,TrueCameraFogRange camera,100,1000Global camzoom#=0.5CameraZoom camera,camzoom#;; create some cubesFor i = 0 To 100 cube = CreateCube() PositionEntity cube,Rnd(-100,100),Rnd(-100,20),Rnd(-100,100) RotateEntity cube,Rnd(-180,180),Rnd(-180,180),Rnd(-180,180) ScaleEntity cube,Rnd(1,10),Rnd(1,10),Rnd(1,10)Next ;; Lightlight = CreateLight()RotateEntity light,90,0,0; Depth of Field setupType DepthOfField Field layers Field layer[99] Field texture Field tsize Field tbuffer Field near#,far# Field cameraEnd Typedof.DepthOfField = DOF_Create(camera,3,4); 3,5 3,2.0Repeat RotateEntity camera,MouseY(),-MouseX(),0 MoveEntity camera,KeyDown(205)-KeyDown(203),0,KeyDown(200)-KeyDown(208) DOF_Update(dof) RenderWorld Flip FalseUntil KeyHit(1)EndFunction DOF_Update(dof.depthoffield) HideEntity doflayer[0] CameraRange dofcamera,dofear*0.95*camzoom,1000 CameraViewport dofcamera,0,0,dof size,dof size RenderWorld CopyRect 0,0,dof size,dof size,0,0,BackBuffer(),dof buffer ShowEntity doflayer[0] CameraRange dofcamera,0.1*camzoom,1000 CameraViewport dofcamera,0,0,GraphicsWidth(),GraphicsHeight() End FunctionFunction DOF_Create.DepthOfField(camera,layers,spread#=0.0)spread=spread*(1.0/camzoom#) dof.depthoffield = New depthoffield dofcamera = camera doflayers = layers dof size = 512 dofear = 100.0 doffar = 300.0 ClearTextureFilters dof exture = CreateTexture(dof size,dof size,1+256+16+32) dof buffer = TextureBuffer(dof exture) ang# = 360.0/Float(doflayers) For i = 0 To doflayers-1 doflayer[i] = CreateFace(1) EntityAlpha doflayer[i],1.0/Float(doflayers) EntityFX doflayer[i],1+8 ps# = dofear+(i*((doffar-dofear)/Float(doflayers))) px# = Sin(i*ang)*(i/Float(doflayers))*spread py# = Cos(i*ang)*(i/Float(doflayers))*spread PositionEntity doflayer[i],px*camzoom#,py*camzoom#,ps*camzoom#; PositionEntity doflayer[i],px,py,ps ScaleEntity doflayer[i],ps,ps,1.0 EntityTexture doflayer[i],dof exture If i = 0 EntityParent doflayer[i],dofcamera,True Else EntityParent doflayer[i],doflayer[i-1],True End If Next Return dofEnd FunctionFunction CreateFace(segs=1,parent=0) mesh=CreateMesh( parent ) surf=CreateSurface( mesh ) stx#=-1.0 sty#=stx stp#=Float(2)/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,u,v) ; swap these for a different start orientation 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 ) Next Next FlipMesh mesh UpdateNormals mesh Return mesh End Function