Ok, I'm having trouble making the bloomfilter work at multiple resolutions. Ive combined and modded the code from the following: Cubewater demo, The frametweening example, and the bloomfilter.
A few side notes, WASD allows control with the mouse. Space jumps. I also modded the 'physics' code to better allow walking up stairs, but if you look down while trying to climb, it still will not work. I know what the problem is with that, but this is going to be a walkthrough engine, more than a First-person-shooter, so it seems acceptable.
All of the following files need to be inserted into the 'cubewater' demo directory
you can change the resolution in the lines
Global rezx = 1024
Global rezy = 600
in the frameskipping demo.bb
frameskipping demo.bb
BloomFilter.bb
A few side notes, WASD allows control with the mouse. Space jumps. I also modded the 'physics' code to better allow walking up stairs, but if you look down while trying to climb, it still will not work. I know what the problem is with that, but this is going to be a walkthrough engine, more than a First-person-shooter, so it seems acceptable.
All of the following files need to be inserted into the 'cubewater' demo directory
you can change the resolution in the lines
Global rezx = 1024
Global rezy = 600
in the frameskipping demo.bb
frameskipping demo.bb
Global FXCamera,CubeLightMapSize,CubeLightMapTexture,WaterMapSize,WaterMapTexture,waterdirection Global camera,ball,level,campitch#,camyaw#,mvx#,mvy#,mvz#,DummyTexure,water,r# Global turn,sprite,underwater,tab,player,firesprite,detail,floorpivot Global fpsindex#,fpstime#,fpsfold_millisecs#,fpsfps#,wdb,wasunderwater,oldpicked Global lcount=0 Global falling#, jump# Dim firelight(8) CubeLightMapSize = 256 ; the resolution of the dynamic lightmap *not used in this demo* WaterMapSize = 256 ; the resolution of the water Const C_level=1,C_player=2,C_floorpivot=3 Type layer Field mesh Field count Field spritebank ; pointer to a type just for holding a list of sprites Field emptybank ; points to bank positions that are empty for filling End Type Type sprite Field x#,y#,z#,s#,a# Field vx#,vy#,vz#,vs#,va# Field r,g,b,vr#,vg#,vb# Field gravity# Field verti[3] Field surf,mesh,spawntype Field life End Type Type spawn Field time,spawntime,spawntype Field x#,y#,z# End Type Type deletelist Field ent,x#,y#,z# End Type Type bumptexture Field filename$ End Type ; ------------------------------------------------------------------ ; GameCore -- support@... ; ------------------------------------------------------------------ ; The basics of a frame-limited Blitz 3D game, ready to rock ; ------------------------------------------------------------------ ; Adapted from Mark Sibly's code ; ------------------------------------------------------------------ Global info1$="Cube mapped water effect" Global info2$="Mouse to look around, W/A/S/Z to move" Include "../start.bb" ; ------------------------------------------------------------------ ; Game's frames-per-second setting ; ------------------------------------------------------------------ Global gameFPS = 30 ;set up fps counter fps_milli=MilliSecs(): fps_counter=0: update_frequency=10 ; ------------------------------------------------------------------ ; Open 3D display mode ; ------------------------------------------------------------------ Global rezx = 1024 Global rezy = 600 Graphics3D rezx, rezy, 32, 2 ; ------------------------------------------------------------------ ; General setup ; ------------------------------------------------------------------ HidePointer AmbientLight 12,12,12 player=CreatePivot() floorpivot=CreatePivot() camera=CreateCamera(player) CameraClsMode camera,False,True MoveEntity camera,0,1.2,0 PositionEntity player,-52,11,353 CameraFogMode camera,1 CameraFogColor camera,100,200,255 ;InitGlow(camera) FXCamera=CreateCamera() CameraClsMode FXCamera,False,True CameraProjMode FXCamera,0 CameraViewport FXCamera,0,0,WaterMapSize,WaterMapSize ;SET UP FIRE Global fire=LoadTexture("level/fire.png",2+48) Global firemesh=CreateLayer() EntityTexture firemesh,fire firesprite=LoadSprite("level/glow.png",2) ScaleSprite firesprite,4.5,10 HideEntity firesprite ;SET UP LEVEL level = LoadAnimMesh("./leveltest/testmap1.b3d") ;PositionEntity level ,0,10,0 ;ScaleEntity level, .125,.125,.125 ;RotateEntity level, 0, 180, 0 ;MoveEntity player,-52,150,353 level = LoadAnimMesh("level/test.b3d") RecurseSeek(level) ;GRAB lights from scene and create some blitz lights, torches etc... For d.deletelist=Each deletelist If lcount<8 s.spawn=New spawn s\spawntime=2 s\spawntype=0 s\time=s\spawntime s\x=EntityX(d\ent,1) s\y=EntityY(d\ent,1) s\z=EntityZ(d\ent,1) firelight(lcount) = CreateLight(2) PositionEntity firelight(lcount),EntityX(d\ent),EntityY(d\ent),EntityZ(d\ent) newsprite=CopyEntity(firesprite) PositionEntity newsprite,EntityX(d\ent),EntityY(d\ent)+1.5,EntityZ(d\ent) EndIf lcount=lcount+1 FreeEntity d\ent Delete d Next ; SET UP WATER - load a reference mesh water=LoadMesh("level/water.3ds") MoveEntity water,0,-2,0 WaterMapTexture=CreateTexture(WaterMapSize,WaterMapSize,128+256+48) EntityTexture water,WaterMapTexture EntityColor water,100,200,255 EntityColor water,512,512,512 EntityAlpha water,0.7 EntityFX water,1 AddEntity(water) Type Vertices Field x# Field y# Field z# End Type surf=GetSurface(water,1) Dim Vertex.Vertices(CountVertices(surf)) For i=0 To CountVertices(surf)-1 Vertex(i) = New Vertices Vertex(i)\x#=VertexX#(surf,i) Vertex(i)\y#=VertexY#(surf,i) Vertex(i)\z#=VertexZ#(surf,i) Next ;FIRE wnospawn=1 If wnospawn=0 s.spawn=New spawn s\spawntime=2 s\spawntype=1 s\time=s\spawntime s\x=-9 s\y=79 s\z=-305 s.spawn=New spawn s\spawntime=2 s\spawntype=1 s\time=s\spawntime s\x=9 s\y=79 s\z=-305 EndIf ;---------------------------------------------------------------------------------- Collisions c_player,c_level,2,2 EntityType player,c_player EntityType floorpivot,c_player EntityType level,c_level,1 EntityRadius player,4.5,6 EntityRadius floorpivot,4 ;---------------------------------------------------------------------------------- mainlight=CreateLight() RotateEntity mainlight,45,45,45 LightColor mainlight,128,128,128 RotateEntity player,0,180,0 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 VWait : Flip underwater = 0 ;setup glow Include "Bloomfilter.bb" InitGlow(camera,rezx,rezy) Glowint# = 0.10 GlowBleed# = 35 ; ------------------------------------------------------------------ ; Frame limiting code setup ; ------------------------------------------------------------------ framePeriod = 1000 / gameFPS frameTime = MilliSecs () - framePeriod Repeat ; -------------------------------------------------------------- ; Frame limiting ; -------------------------------------------------------------- Repeat frameElapsed = MilliSecs () - frameTime Until frameElapsed frameTicks = frameElapsed / framePeriod frameTween# = Float (frameElapsed Mod framePeriod) / Float (framePeriod) ; -------------------------------------------------------------- ; Update game and world state ; -------------------------------------------------------------- For frameLimit = 1 To frameTicks If frameLimit = frameTicks Then CaptureWorld frameTime = frameTime + framePeriod db=1-db FreeLook() playergravity() RenderWater() UpdateNormals water Spawn() RenderSprites() glow#=Cos(MilliSecs()) lum#=(Abs(glow*Sin(glow))*255)*0.8 For i=0 To 6 LightColor firelight(i),220+lum,160+lum/2,100+lum/3 LightRange firelight(i),((lum*1.8)+32) Next UpdateWorld Next ; -------------------------------------------------------------- ; **** Wireframe for DEBUG only -- remove before release! **** ; -------------------------------------------------------------- ;If KeyHit (17): w = 1 - w: WireFrame w: EndIf ; Press 'W' ; -------------------------------------------------------------- ; Draw glow ; -------------------------------------------------------------- SetGlowIntensity(Glowint) RenderGlow(Glowbleed) ; -------------------------------------------------------------- ; Draw 3D world ; -------------------------------------------------------------- RenderWorld frameTween ; fps counter fps_counter=fps_counter+1 If fps_counter=update_frequency fps=1000/Float(((MilliSecs()-fps_milli))/update_frequency) fps_milli=MilliSecs() fps_counter=0 EndIf ; print fps Text 00,00,"FPS:"+fps ; -------------------------------------------------------------- ; Show result ; -------------------------------------------------------------- Flip Until KeyHit (1) End ;---------------------------------------------------------------------------------- ; FPS functions ;---------------------------------------------------------------------------------- Function Spawn() For s.spawn=Each spawn s\time=s\time-1 If s\time<0 s\time=s\spawntime If s\spawntype=0 AddFire(s\x,s\y,s\z) ;If s\spawntype=1 AddWater(s\x,s\y,s\z) EndIf Next End Function ;---------------------------------------------------------------------------------- Function AddFire(fx#=0,fy#=0,fz#=0) ;re-use if we can temp=0 For s.sprite=Each sprite If s\mesh=firemesh If s\life=0 temp = Handle(s) ;counter=counter+1 Exit EndIf EndIf Next If temp=0 temp = AddSprite(firemesh) vec#=Rnd(360) xpos#=-Cos(vec)*0.9 ypos#=0 zpos#=-Sin(vec)*0.9 scale#=2.3 alpha#=0.9 velx#=-xpos*0.02 vely#=Rnd(0.2)+0.1 velz#=-zpos*0.02 scalespd#=-0.08 alphaspd#=-0.015 gravity#=-0.002 r=255 g=255 b=255 vr#=-8 vg#=-8 vb#=-8 life=80 UpdateSprite temp,life,xpos+fx,ypos+fy,zpos+fz,velx,vely,velz,scale,scalespd,alpha,alphaspd,r,g,b,vr#,vg#,vb#,gravity# End Function ;-------------------------------------------------------------------------------------------- Function RenderSprites() For s.sprite=Each sprite If s\life>0 s\life=s\life-1 s\x=s\x+s\vx s\y=s\y+s\vy s\z=s\z+s\vz s\s=s\s+s\vs s\a=s\a+s\va s\r=s\r+s\vr s\g=s\g+s\vg s\b=s\b+s\vb s\vy=s\vy+s\gravity# TFormPoint s\x,s\y,s\z,0,camera If TFormedZ#()>0 TFormVector -s\s,-s\s,0,camera,0 VertexCoords s\surf,s\verti[0],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#() TFormVector s\s,-s\s,0,camera,0 VertexCoords s\surf,s\verti[1],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#() TFormVector -s\s,s\s,0,camera,0 VertexCoords s\surf,s\verti[2],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#() TFormVector s\s,s\s,0,camera,0 VertexCoords s\surf,s\verti[3],s\x+TFormedX#(),s\y+TFormedY#(),s\z+TFormedZ#() VertexColor s\surf,s\verti[0],s\r,s\g,s\b,s\a VertexColor s\surf,s\verti[1],s\r,s\g,s\b,s\a VertexColor s\surf,s\verti[2],s\r,s\g,s\b,s\a VertexColor s\surf,s\verti[3],s\r,s\g,s\b,s\a EndIf EndIf Next End Function ;-------------------------------------------------------------------------------------------- Function CreateLayer() l.layer=New layer l\mesh=CreateMesh() : surf=CreateSurface(l\mesh) l\spritebank=CreateBank() NameEntity l\mesh,Handle(l) EntityColor l\mesh,255,255,255 EntityFX l\mesh,1+2 EntityBlend l\mesh,3 Return l\mesh End Function ;-------------------------------------------------------------------------------------------- Function AddSprite(mesh) l.layer=Object.layer(EntityName(mesh)) surf=GetSurface(l\mesh,1) l\count=l\count+1 ResizeBank l\spritebank,l\count*4 ;create a new sprite s.sprite=New sprite s\verti[0]=AddVertex(surf,0,0,0,0,1) ;topleft s\verti[1]=AddVertex(surf,0,0,0,1,1) ;topright s\verti[2]=AddVertex(surf,0,0,0,0,0) ;bottomleft s\verti[3]=AddVertex(surf,0,0,0,1,0) ;bottomright AddTriangle(surf,s\verti[1],s\verti[2],s\verti[3]) AddTriangle(surf,s\verti[2],s\verti[1],s\verti[0]) s\s=10 : s\a=1 s\r=255 : s\g=255 : s\b=255 s\x=0 : s\y=0 : s\z=0 s\surf=surf s\mesh=l\mesh ;put the new sprite into the bank PokeInt l\spritebank,(l\count*4)-4,Handle(s) Return Handle(s) End Function ;-------------------------------------------------------------------------------------------- Function UpdateSprite(sprite,life,x#,y#,z#,vx#,vy#,vz#,scale#,scalevel#,alpha#,alphavel#,r,g,b,vr#,vg#,vb#,gravity#) s.sprite = Object.sprite( sprite ) s\x=x s\y=y s\z=z s\vx=vx s\vy=vy s\vz=vz s\gravity#=gravity# s\s=scale s\vs=scalevel s\a=alpha s\va=alphavel s\r=r : s\g=g : s\b=b s\vr=vr : s\vg=vg : s\vb=vb s\life=life End Function ;-------------------------------------------------------------------------------------------- Function fps() fpsindex=fpsindex+1 fpstime=fpstime+MilliSecs()-fpsfold_millisecs If fpstime=>1000 fpsfps=fpsindex fpstime=0 fpsindex=0 EndIf fpsfold_millisecs=MilliSecs() Return fpsfps End Function ;-------------------------------------------------------------------------------------------- Function TransTex(texture,angle#,scale#=1) ScaleTexture texture,scale,scale RotateTexture texture,angle# x#=Cos(angle)/scale/2 y#=Sin(angle)/scale/2 PositionTexture texture,(x-.5)-y,(y-.5)+x End Function ;---------------------------------------------------------------------------------- Function RenderWater() HideEntities() CameraProjMode camera,0 CameraProjMode FXCamera,1 wdb=1-wdb ;flip water if under it If underwater=0 If waterdirection=-1 FlipMesh water EntityAlpha water,.7 EntityColor water,255,255,255 EndIf waterdirection=1 PositionEntity FXCamera,EntityX(player),EntityY(water)-2,EntityZ(player) If wdb ;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) Else ;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) EndIf ;do up view SetCubeFace WaterMapTexture,4 RotateEntity FXCamera,-90,0,0 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) Else If waterdirection=1 FlipMesh water EntityAlpha water,1 EntityColor water,155,200,255 EndIf waterdirection=-1 PositionEntity FXCamera,-EntityX(player),EntityY(player)-2,EntityZ(player) If wdb ;do left view SetCubeFace WaterMapTexture,0 RotateEntity FXCamera,0,-90,180 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) ;do forward view SetCubeFace WaterMapTexture,1 RotateEntity FXCamera,0,0,180 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) Else ;do right view SetCubeFace WaterMapTexture,2 RotateEntity FXCamera,0,90,180 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) ;do backward view SetCubeFace WaterMapTexture,3 RotateEntity FXCamera,0,180,180 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) EndIf ;do down view SetCubeFace WaterMapTexture,5 RotateEntity FXCamera,-90,0,180 RenderWorld CopyRect 0,0,WaterMapSize,WaterMapSize,0,0,BackBuffer(),TextureBuffer(WaterMapTexture) EndIf CameraProjMode FXCamera,0 CameraProjMode camera,1 ShowEntities() s=GetSurface(water,1) For i=0 To CountVertices(s)-1 Freq#=MilliSecs()/4 Vertex(i)\y#=Sin(freq+Vertex(i)\x#*500+Vertex(i)\z#*300)*1.2 VertexCoords s,i,Vertex(i)\x#,-Vertex(i)\y#,Vertex(i)\z# Next If EntityY(camera,1)<-2 underwater=1 Else underwater=0 If underwater CameraFogColor camera,50,100,155 t#=MilliSecs()/6 ScaleEntity camera,1+Cos(t)*0.04,1+Sin(t)*0.04,1+Cos(t)*0.02 CameraFogRange camera,0,200+Sin(MilliSecs()*0.05)*60 TurnEntity player,0,0,Sin(t)*2 Else CameraFogColor camera,100,200,255 ScaleEntity camera,1,1,1 CameraFogRange camera,100,1000 EndIf End Function ;---------------------------------------------------------------------------------- Type entity Field ent End Type Type level Field ent End Type Type cubelight Field ent,r,g,b,radius End Type ;---------------------------------------------------------------------------------- Function AddEntity(ent) e.entity=New entity e\ent=ent End Function ;---------------------------------------------------------------------------------- Function HideEntities() For e.entity=Each entity HideEntity e\ent Next End Function ;---------------------------------------------------------------------------------- Function ShowEntities() For e.entity=Each entity ShowEntity e\ent Next End Function ;---------------------------------------------------------------------------------- Function AddLevel(ent) e.level=New level e\ent=ent End Function ;---------------------------------------------------------------------------------- Function HideLevel() For e.level=Each level HideEntity e\ent Next End Function ;---------------------------------------------------------------------------------- Function ShowLevel() For e.level=Each level ShowEntity e\ent Next End Function ;---------------------------------------------------------------------------------- Function freelook() mxspd#=MouseXSpeed()*0.25 myspd#=MouseYSpeed()*0.25 If underwater mxspd=mxspd*0.6 myspd=myspd*0.6 EndIf MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 campitch=campitch+myspd If campitch<-85 Then campitch=-85 If campitch>85 Then campitch=85 RotateEntity player,campitch,EntityYaw(player)-mxspd,0 If KeyDown(203) Then mvx=mvx-.3 If KeyDown(205) Then mvx=mvx+.3 If KeyDown(200) Then mvz=mvz+.3 If KeyDown(208) Then mvz=mvz-.3 If KeyDown(30) Then mvx=mvx-.3 If KeyDown(32) Then mvx=mvx+.3 If KeyDown(17) Then mvz=mvz+.3 If KeyDown(31) Then mvz=mvz-.3 If KeyDown(57) And jump = 0.0 And falling <= 0.25 Then jump = 3.5 PositionEntity floorpivot,EntityX(player),EntityY(player)-4,EntityZ(player) ;If underwater ; ; mvx=mvx/1.2 ; mvy=mvy-0.005 ; mvz=mvz/1.2 ; wasunderwater=1 ; ;Else ; ; falling = falling + 0.1 ; mvy=mvy-falling ; If EntityCollided(floorpivot,c_level) ; mvy=mvy+falling ; falling = 0.0 ; EndIf ; ; If wasunderwater ; wasunderwater=0 ; mvy=4 ; EndIf ; ;EndIf ;mvx=mvx/1.2 ;mvy=mvy/1.2 ;mvz=mvz/1.2 ;MoveEntity player,mvx,0,mvz ;TranslateEntity player,0,mvy,0 ;If EntityY(player)>60 Then PositionEntity player,EntityX(player),60,EntityZ(player) End Function Function RecurseSeek(ent) tab=tab+4 For i=1 To CountChildren(ent) child=GetChild(ent,i) name$=Lower(EntityName(child)) If Instr(name$,"fire") d.deletelist=New deletelist d\ent=child EndIf Next tab=tab-4 End Function Function playergravity() If underwater falling = 0.0 mvx=mvx/1.2 mvy=mvy-0.005 mvz=mvz/1.2 wasunderwater=1 Else mvy=mvy-0.3 falling = falling + 0.1 If jump >= 2.0 mvy=(mvy-falling)+(jump-2) Else mvy=(mvy-falling) EndIf If jump > 0.0 jump = jump - 0.15 Else jump = 0 EndIf If EntityCollided(floorpivot,c_level) mvy=mvy+falling falling = 0.0 EndIf If EntityCollided(player,c_level) falling = 0.25 mvy=mvy+falling EndIf If wasunderwater falling = 0.0 wasunderwater=0 mvy=4 EndIf EndIf mvx=mvx/1.2 mvy=mvy/1.2 mvz=mvz/1.2 MoveEntity player,mvx,0,mvz TranslateEntity player,0,mvy,0 End Function
BloomFilter.bb
;GLOW EFFECT ;SSwifts blur routine --------------------- ; This is the location in the world where the camera will reside. ; This location should be far from any other geometry you have in your world. Const BLUR_CAM_X# = 65536.0 Const BLUR_CAM_Y# = 65536.0 Const BLUR_CAM_Z# = 0.0 Global BLUR_CAM% = 0 Global GLsprite% ;NOTE! ;IF YOU ADJUST THE TEX SIZE YOU HAVE TO MESS WITH POSITION ;VALUES INSIDE BLUR TEXTURE FUNCTION TO GET THE BLUR POSITIONED RIGHT. Global GLtexsize% = 256 Global GLcam% Global GLtex% Global GLdummytex% Dim BLURMESH%(4*4) ;Modified to additive blend in the same time as blur. ;Also modified the copyrecting... so that multiple passes don't cause texture drifting. ;this is just a quick fix... don't actually get why tex texture drifts... Function BlurTexture(texture, Blur_Quality, Blur_Radius#, blurpasses%) ; ------------------------------------------------------------------------------------------------------------------- ; This function blurs a texture using a technique that takes advantage of 3D acceleration. ; ; * You MUST hide all other cameras before calling this function! ; * You MUST reset your texture's blending mode, scale, and position after calling this function! ; ; Texture is the texture you want blurred. ; ; Blur_Quality defines the quality of the blur. 1 = 4 passes, 2 = 8 passes, 3 = 12 passes, etc. ; ; (The reason that the passes are in multiples of four is because interference artifacts are created when ; the number of passes is not a multiple of four... meaning that ten passes will actually look far worse ; than eight.) ; ; Blur_Radius# defines the radius of the blur, in pixels, assuming a map size of 256x256. ; ;(Ie, a radius of 16 will be the same width regardless of whether the texture is 16x16 or 512x512. It will ; only be exactly 16 pixels wide if the map is 256x256.) ; ------------------------------------------------------------------------------------------------------------------- ; This is used for temporary storage of the meshes used for soft shadow blurring. ;Local BlurMesh[16*4] ; If blurring is enabled... If Blur_Quality > 0 If BLUR_CAM=0 Blur_Cam = CreateCamera() ; Set the camera's range to be very small so as to reduce the possiblity of extra objects making it into the scene. CameraRange Blur_Cam, 0.1, 100 ; Set the camera to zoom in on the object to reduce perspective error from the object being too close to the camera. CameraZoom Blur_Cam, 16.0 ; Aim camera straight down. RotateEntity Blur_Cam, 90, 0, 0, True ; Set the camera viewport to the same size as the texture. CameraViewport Blur_Cam, 0, 0, GLtexsize, GLtexsize ; Set the camera so it clears the color buffer before rendering the texture. CameraClsColor Blur_Cam, 0,0,0 CameraClsMode Blur_Cam,True, True ; Position the blur camera far from other entities in the world. PositionEntity Blur_Cam, BLUR_CAM_X#, BLUR_CAM_Y#, BLUR_CAM_Z# Else ShowEntity BLUR_CAM End If ; Create the sprites to use for blurring the shadow maps. For Loop = 0 To (Blur_Quality*4)-1 If BLURMESH(loop) = 0 BlurMesh(Loop) = CreateSprite() EntityBlend BlurMesh(Loop),3;3 EntityTexture Blurmesh(loop),GLdummytex,0,0 EntityTexture BlurMesh(Loop),Texture,0,1 EntityTexture BlurMesh(loop),Texture,0,2 EntityFX BlurMesh(Loop), 1+8 ScaleSprite BlurMesh(Loop), 2, 2 ;EntityAlpha Blurmesh(loop),0.5 End If ShowEntity blurmesh(loop) Next ; Scale the texture down because we scale the sprites up so they fill a larger area of the ; screen. (Otherwise the edges of the texture are darker than the middle because they don't ; get covered. ScaleTexture Texture, 0.5, 0.5 PositionTexture Texture, 0.5, 0.5 ; Blur texture by blitting semi-transparent copies of it on top of it. BlurRadius# = Blur_Radius# * (1.0 / 256.0) BlurAngleStep# = 360.0 / Float(Blur_Quality*4) ; Normally we would just divide 255 by the number of passes so that adding all the passes ; together would not exceed 256. However, if we did that, then we could not have a number of ; passes which does not divide 256 evenly, or else the error would result in the white part of ; the image being slightly less than white. So we round partial values up to ensure that ; white will always be white, even if it ends up being a little whiter than white as a result ; when all the colors are added, since going higher than white just clamps to white. ;BlurShade = Ceil(255.0 / Float(Blur_Quality*4)) ; Place each of the blur objects around a circle of radius blur_radius. For Loop = 0 To (Blur_Quality*4)-1 BlurAngle# = BlurAngleStep# * Float(Loop) + 180.0*(Loop Mod 2) Xoff# = BlurRadius# * Cos(BlurAngle#) Yoff# = BlurRadius# * Sin(BlurAngle#) ;MESS WITH THESE VALUES IF YOU ADJUST THE TEXTURE SIZE PositionEntity BlurMesh(Loop), BLUR_CAM_X# + Xoff#-0.006, BLUR_CAM_Y# - 16.0, BLUR_CAM_Z# + Yoff#+0.008 , True Next ; Render the new texture. For i=1 To blurpasses RenderWorld CopyRect 0, 0, TextureWidth(Texture), TextureHeight(Texture), 0, 0, BackBuffer(), TextureBuffer(Texture) Next ; Free the blur entities. For Loop = 0 To (Blur_Quality*4)-1 HideEntity Blurmesh(loop) Next ; Free the blur camera. HideEntity BLUR_CAM EndIf End Function Function SetGlowZoom(zoom#) If GLsprite <> 0 Then ScaleSprite GLsprite, 100.0/zoom#, 100.0/zoom# End Function ;Params ;CAM - Your main scene camera Function InitGlow(cam,rezx#,rezy#) GLcam = cam ;xdivisor# = 4.0 xdivisor# = (rezx/rezy)*2.34 ydivisor# = xdivisor * (rezy/rezx) If GLtex = 0 ClearTextureFilters() GLtex = CreateTexture(GLtexsize,GLtexsize,1+16+32+256) TextureFilter("",1+8) End If ;CREATE SPRITE GLsprite = CreateSprite() EntityTexture GLsprite,GLtex PositionEntity GLsprite,-52,10,100 EntityOrder GLsprite,-9999 EntityBlend GLsprite,3 ScaleSprite GLsprite,rezx / xdivisor, rezy / ydivisor EntityParent GLsprite,cam EntityFX GLsprite,1 If gldummytex=0 ClearTextureFilters() gldummytex = CreateTexture(32,32,1) TextureFilter("",1+8) TextureBlend gldummytex,2 SetGlowIntensity() End If ;Test code ;Use this test code to check how the blur is aligned ;sprite = CreateSprite() ;PositionEntity sprite,0,0,20 ;ScaleSprite sprite,4,4 ;EntityParent sprite,cam ;EntityOrder sprite,-9000 End Function ;Intensity Between 0-1 (between no glow to ---> my eyes hurt glow) Function SetGlowIntensity(d#=0.2) SetBuffer TextureBuffer(GLdummytex) ClsColor 255*d,255*d,255*d Cls SetBuffer BackBuffer() End Function ;Play with bleed to get desired result.... it's a bit difficult to explain... the higher value .. the more the glow colours bleed ;Use tween as a tween value if you use render tweening in your app ;More blurpasses really slow things down so beware and makes the blur act differently Function RenderGlow(bleed%=30,tween%=0,blurpasses%=1) TextureBlend GLtex,5 EntityColor GLsprite,bleed,bleed,bleed CameraViewport GLcam,0,0,GLtexsize,GLtexsize RenderWorld tween CopyRect 0,0,GLtexsize,GLtexsize,0,0,BackBuffer(),TextureBuffer(GLtex) CameraViewport GLcam,0,0,GraphicsWidth(),GraphicsHeight() EntityColor GLsprite,255,255,255 ;TextureBlend GLtex,5 blurtexture(GLtex,1,4,blurpasses) ScaleTexture GLtex, 1, 1 PositionTexture GLtex,0,0 ;TextureBlend GLtex,2 End Function Function FreeGlow() If GLsprite<>0 FreeEntity GLsprite : GLsprite=0 FreeTexture GLtex : GLtex=0 FreeTexture GLdummytex : GLdummytex=0 FreeEntity BLUR_CAM : BLUR_CAM=0 For i=1 To 4*4 If blurmesh(i)<>0 Then FreeEntity blurmesh(i) : blurmesh(i)=0 Next End If End Function