December 03, 2020, 08:51:53 PM

Author Topic: [bb] Retro lighting effects by Yasha [ 1+ years ago ]  (Read 711 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Retro lighting effects by Yasha [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : Retro lighting effects
Author : Yasha
Posted : 1+ years ago

Description : Very simple, very slow scene postprocessor. REQUIRES Draw3D 3.2 (z): <a href="../Community/posts8a94.html?topic=78304#880250" target="_blank">http://www.blitzbasic.com/Community/posts.php?topic=78304#880250[/url]

Adjust hue, saturation, luminosity, blur, and motion blur; apply entity-like rects, circles and ellipses with different tints and effects; and draw a pattern of dots on the screen, because 32-bit colour mode doesn't look enough like 16-bit colours.... yeah it made sense at the time.

In theory clever use of the ShObjes should allow lens flares, halos, localised illumination and other cool effects. In practice the resolution needs to be unbelivably low to run at a decent speed. I was going to use about one of these effects, and the rest are pretty useless, but hopefully someone can learn something from it or do something useful with it.

EDIT: Oh yeah, don't get excited about my misuse of the word "shader".


Code :
Code: BlitzBasic
  1. ;===========================================================================================================
  2. ;MiniShader.bb
  3. ;
  4. ;A very simple (and slow) scene postprocessor based on Hectic's Draw3D (z)
  5. ;===========================================================================================================
  6.  
  7. AppTitle "MiniShader example"
  8.  
  9. Global appheight=768
  10. Global appwidth=1024
  11. Global appdepth=32
  12.  
  13. ;MiniShader Global Variables
  14. ;===========================================================================================================
  15. Global MSActive=False
  16. Global MS_xres
  17. Global MS_yres
  18. Global shfac#
  19. Global shf2
  20. Global shf4
  21. Global shxr
  22. Global shyr
  23. Global shres
  24. Global shcentre#
  25. Global FStex,SDtex
  26. Global FSbuffer,SDbuffer
  27. Global FSaleph,FSHueVal,FSSatVal,FSLumVal                                                       ;Absolute fullscreen shader values
  28. Global FSblend,FSHueStr#,FSSatStr#,FSLumStr#                                            ;Aleph blending (-1,0,1), HSL strengths (range 0-1)
  29. Global FSRedVal=255,FSGreenVal=255,FSBlueVal=255,FSMasterAleph#=1       ;Master colour values for whole shader buffer
  30. Global SDRedVal=255,SDGreenVal=255,SDBlueVal=255,SDAlpha#=0                     ;Colour values for SD buffer
  31. Global ScreenBlur#,MotionBlur#                                                                          ;Fake-gauss, motion blur
  32. Global SkipShader
  33.  
  34. Dim shaderbuffer(0,0,0)
  35. Dim shaderstr#(0,0,0)
  36. ;===========================================================================================================
  37.  
  38. ;framelimit=CreateTimer(60)
  39. SeedRnd(MilliSecs())
  40.  
  41. Graphics3D appwidth,appheight,appdepth,2
  42. SetBuffer BackBuffer()
  43. HidePointer
  44.  
  45. Include "IncludesDraw3Dz.bb"
  46. ;Include "MiniShader.bb"
  47.  
  48. ;Camera
  49. camera=CreateCamera()
  50. PositionEntity camera,0,35,-70
  51.  
  52. ;Setup Draw3D
  53. DrawInit3D(camera)
  54. Origin3D(appwidth,appheight)
  55.  
  56. ;Shader setup
  57. InitMiniShader(appwidth,appheight,12)           ;Does not have to cover whole screen. 4 is the highest useful resolution, 8 looks better.
  58.                                                                         ;12 And 16 look OK and run at reasonable speeds, above 20 is pointless unless you really like
  59.                                                                         ;blurry (and set high fullscreen blur). Resolution ideally a multiple of 4 (not strictly necessary)
  60. Local fx$[9],skipmode$[1]
  61.  
  62. sfocus=CreateShader(MS_xres/2,MS_yres/2,0,0,350,0.35,0,0,0,0,1,0,0,0,False)
  63. fx[1]="1. Focus on the centre"
  64. dreamy=CreateShader(MS_xres/2,MS_yres/2,0,0,380,0.1,0,0,0,240,1,0,0,0.4,False)
  65. fx[2]="2. Dreamy/Acid haziness"
  66. glow=CreateShader(MS_xres/2-26,MS_yres/2,50,10,220,0.1,200,42,100,200,1,  0,0.1,0.3,False)
  67. bulb=CreateShader( MS_xres/2-5,MS_yres/2,10,10, 40,0.5,200,36,210,140,1,0.9,  1,  1,False)
  68. fx[3]="3. Lamp post at night"
  69. fx[4]="4. Fog"
  70. fx[5]="5. Bleach bypass?"
  71. nvis=CreateShader(MS_xres/2-200,MS_yres/2-75,400,150,100,0.7,255,107,127,255,1,1,0.8,0.03,False)
  72. fx[6]="6. Night vision"
  73. fx[7]="7. Sepia tint"
  74. fx[8]="8. Grey tint"
  75. torch=CreateShader(MS_xres/2,MS_yres/2,0,0,170,0.7,0,0,0,0,1,0,0,0,True)
  76. fx[9]="9. Local illumination only"
  77. fx[0]="None"
  78.  
  79. skipmode[0]="Skipmode 0 - no skipping"
  80. skipmode[1]="Skipmode 1 - skip rendering ShObj every second frame"
  81.  
  82. frameskipping=False
  83. currenteffect=1
  84.  
  85. ;Setup basic scene
  86. Gosub createscene
  87.  
  88. While Not KeyDown(1)
  89.  
  90. ;Simple movement
  91. MoveEntity camera,0,0,KeyDown(200)-KeyDown(208)
  92. RotateEntity camera,EntityPitch(camera)+MouseYSpeed(),EntityYaw(camera)-MouseXSpeed(),0
  93. MoveMouse 100,100
  94.  
  95. If KeyHit(57) Then frameskipping=Not frameskipping
  96. nmode=GetKey()
  97. If nmode<58 And nmode>48
  98.         currenteffect=nmode-48
  99. EndIf
  100. If KeyHit(11) Then currenteffect=0      ;Hit 0 to clear
  101.  
  102. RenderWorld                     ;Once for 3D scene itself
  103.  
  104. Select currenteffect
  105.         Case 1          ;Spore focus
  106.                 ShowShader(sfocus,True):ShowShader(dreamy,False)
  107.                 ShowShader(glow,False):ShowShader(bulb,False)
  108.                 ShowShader(nvis,False):ShowShader(torch,False)
  109.                 SetFSShader(0,0,0,250,0,0.99,0,0):SetBlur(10,0):SetDotTint(0,0,0,0)
  110.         Case 2          ;Dreamy haze
  111.                 ShowShader(sfocus,False):ShowShader(dreamy,True)
  112.                 ShowShader(glow,False):ShowShader(bulb,False)
  113.                 ShowShader(nvis,False):ShowShader(torch,False)
  114.                 SetFSShader(0,0,100,230,0,0.6,0.4,0):SetBlur(10,0.99):SetDotTint(0,0,0,0)
  115.         Case 3          ;Lamp post
  116.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  117.                 ShowShader(nvis,False):ShowShader(torch,False)
  118.                 lampbright=(EntityInView(lamporb,camera) And EntityVisible(camera,lamporb))
  119.                 lamprange=100-EntityDistance(lamporb,camera)
  120.                 ShowShader(glow,lampbright)
  121.                 ShowShader(bulb,lampbright)
  122.                 CameraProject(camera,EntityX(lamporb),EntityY(lamporb),EntityZ(lamporb))
  123.                 w1=lamprange:w2=lamprange*0.2
  124.                 PutShader(glow,ProjectedX()-w1/2,ProjectedY(),w1,1,lamprange*6)
  125.                 PutShader(bulb,ProjectedX()-w2/2,ProjectedY(),w2,w2,lamprange/2)
  126.                 SetFSShader(0,0,0,250,0,0.5,0.9,0):SetBlur(0,0):SetDotTint(200,200,0,5)
  127.         Case 4          ;Fog
  128.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  129.                 ShowShader(glow,False):ShowShader(bulb,False)
  130.                 ShowShader(nvis,False):ShowShader(torch,False)
  131.                 SetFSShader(0,0,0,255,0,1,0,1):SetBlur(8,0):SetDotTint(0,0,0,0)
  132.         Case 5          ;Bleach bypass
  133.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  134.                 ShowShader(glow,False):ShowShader(bulb,False)
  135.                 ShowShader(nvis,False):ShowShader(torch,False)
  136.                 SetFSShader(0,0,0,150,0,0.6,0.4,-1):SetBlur(8,0):SetDotTint(0,0,0,0)
  137.         Case 6          ;Nightvision
  138.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  139.                 ShowShader(glow,False):ShowShader(bulb,False)
  140.                 ShowShader(nvis,True):ShowShader(torch,False)
  141.                 SetFSShader(0,0,0,120,0,0.4,0.6,0):SetBlur(0,0):SetDotTint(70,150,70,15)
  142.         Case 7          ;Sepia
  143.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  144.                 ShowShader(glow,False):ShowShader(bulb,False)
  145.                 ShowShader(nvis,False):ShowShader(torch,False)
  146.                 SetFSShader(27,30,0,120,1,1,0,0):SetBlur(6,0):SetDotTint(164,109,12,20)
  147.         Case 8          ;Grey
  148.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  149.                 ShowShader(glow,False):ShowShader(bulb,False)
  150.                 ShowShader(nvis,False):ShowShader(torch,False)
  151.                 SetFSShader(0,0,0,120,0,1,0,0):SetBlur(6,0):SetDotTint(127,127,127,10)
  152.         Case 9          ;Local illumination
  153.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  154.                 ShowShader(glow,False):ShowShader(bulb,False)
  155.                 ShowShader(nvis,False):ShowShader(torch,True)
  156.                 CameraProject(camera,EntityX(someguy1),EntityY(someguy1)+5,EntityZ(someguy1))
  157.                 PutShader(torch,ProjectedX(),ProjectedY())
  158.                 SetFSShader(0,0,0,255,0,0,1,0):SetBlur(6,0):SetDotTint(0,0,0,0)
  159.         Default         ;Nothing
  160.                 ShowShader(sfocus,False):ShowShader(dreamy,False)
  161.                 ShowShader(glow,False):ShowShader(bulb,False)
  162.                 ShowShader(nvis,False):ShowShader(torch,False)
  163.                 SetFSShader(0,0,0,0,0,0,0,0):SetBlur(0,0):SetDotTint(0,0,0,0)
  164. End Select
  165.  
  166. UpdateWorld
  167. RenderMiniShader(frameskipping,True)
  168.  
  169.  
  170. frames=frames+1
  171. If MilliSecs()-render_time=>1000 Then fps=frames : frames=0 : render_time=MilliSecs()  
  172. Text(0,0,"FPS: "+fps)
  173. Text(0,30,skipmode[frameskipping])
  174. Text(0,60,"Current effect: "+fx[currenteffect])
  175. Text(800,30,"Move with arrow keys+mouse")
  176. Text(800,60,"Keys 1-0 to change effect")
  177.  
  178. Flip False
  179. ;VWait:Flip False
  180.  
  181. Wend
  182.  
  183. FreeMiniShader()        ;Deinit MiniShader
  184. DrawFree3D()            ;Deinit Draw3D
  185. ShowPointer
  186. End
  187.  
  188.  
  189.  
  190. ;===========================================================================================================
  191. ;
  192. ;The includey-bit
  193. ;===========================================================================================================
  194.  
  195. ;Shader Object Type
  196. ;===========================================================================================================
  197.  
  198. Type shobj
  199.         Field x,y,tx,ty                 ;Rect's start position, width and height - in shader pixels?
  200.         Field alpha#                    ;Alpha value of the shader
  201.         Field hue,sat,lum                               ;Colour value of the shader
  202.         Field astr#,hstr#,sstr#,lstr#   ;Strength of shader
  203.         Field alphablend                                ;How the alpha merges with other shaders - 1=Min, 2=Max, 3=Avg, 4=Fixed or 0=autodetect
  204.         Field range;#                   ;Range to fade out around the shader rect
  205.         Field falloff#                  ;Range 0-1: rate at which shader fades into background. 0=no radius, 1=no fade
  206.         Field visible                   ;Whether shader is drawn
  207. End Type
  208.  
  209.  
  210.  
  211. ;Functions
  212. ;===========================================================================================================
  213.  
  214. Function InitMiniShader(xr%,yr%,shf#)           ;Setup - Width of screen (or area to display on), height (ditto.), shader pixel scale
  215.  
  216.         If MSActive Then FreeMiniShader()
  217.        
  218.         MS_xres=xr                      ;For best results use screen size
  219.         MS_yres=yr
  220.         shfac#=shf              ;Ideally multiple of 4
  221.         MSCam=cam
  222.         shf2=shfac/2
  223.         shf4=shfac/4
  224.         shxr=Ceil(MS_xres/shfac)
  225.         shyr=Ceil(MS_yres/shfac)
  226.         shres=2^(Floor(Log(shxr)/Log(2))+1)             ;Floor()+1 rather than Ceil() ensures texture will be bigger than needed even if shfac is a factor of MS_xres
  227.         shcentre#=(shres/2)*shfac
  228.        
  229.         FStex=CreateImage3D(Floor(Log(shxr)/Log(2))+1,2,2,shfac,shfac)
  230.         SDtex=CreateImage3D(Ceil(Log(MS_xres)/Log(2)),2,2)                                      ;Add small blocks last...
  231.        
  232.         FSbuffer=TextureBuffer(PeekInt(GDrawBank,FStex+DRAWBANKTEXTURE))
  233.         SDbuffer=TextureBuffer(PeekInt(GDrawBank,SDtex+DRAWBANKTEXTURE))
  234.        
  235.         LockBuffer(FSbuffer)    ;Clear the texture
  236.         For x=0 To shres-1
  237.         For y=0 To shres-1
  238.                 WritePixelFast x,y,$00000000,FSbuffer
  239.         Next
  240.         Next
  241.         UnlockBuffer(FSbuffer)
  242.  
  243.         LockBuffer SDbuffer             ;Draw the dot texture
  244.         For x=0 To MS_xres-1
  245.         For y=0 To MS_yres-1
  246.                 If (x Mod shfac)>shf4 And (x Mod shfac)<shf2+shf4 And (y Mod shfac)>shf4 And (y Mod shfac)<shf2+shf4
  247.                         WritePixelFast x,y,$ffffffff,SDbuffer
  248.                 Else
  249.                         WritePixelFast x,y,$00000000,SDbuffer
  250.                 EndIf
  251.         Next
  252.         Next
  253.         UnlockBuffer SDbuffer
  254.        
  255.         Dim shaderbuffer(shxr,shyr,5)   ;0=blendno, 1=Alpha, 2=Hue, 3=Sat, 4=Lum. Ints 0-255. 5=Final ARGB. Int 0-$ffffffff
  256.         Dim shaderstr#(shxr,shyr,5)             ;pixr, strengths of above. 5=falloff
  257.        
  258.         MSActive=True
  259.        
  260. End Function
  261.  
  262. Function FreeMiniShader()                       ;Delete MiniShader once finished
  263.        
  264.         Delete Each shobj
  265.         FreeImage3D(FStex)
  266.         FreeImage3D(SDtex)
  267.         FreeImage ScreenGrab
  268.         Dim shaderbuffer(0,0,0)
  269.         Dim shaderstr#(0,0,0)
  270.         MSActive=False
  271.        
  272. End Function
  273.  
  274. Function SetFSShader(h,s,l,a=127,hs#=1,ss#=0.8,ls#=0,blend=0)   ;Fullscreen colour effect
  275.         FSHueVal=h :FSSatVal=s :FSLumVal=l                                                      ;Hue, saturation, lightness, alpha, strength of hue/sat/lum shift
  276.         FSHueStr=hs:FSSatStr=ss:FSLumStr=ls                             ;Blend=1: alpha is proportional to lightness. Blend=-1: alpha is proportional to darkness
  277.         FSaleph=a                                                                               ;Note that blendmodes other than 0 do not work well with motion blur
  278.         FSblend=blend
  279. End Function
  280.  
  281. Function SetBlur(gblur#=0,mblur#=0)                             ;Set fullscreen blur and motion blur
  282.         ScreenBlur#=gblur
  283.         MotionBlur#=mblur               ;Does not work well if fullscreen blend is not 0
  284. End Function
  285.  
  286. Function SetFSTint(red,green,blue,alpha=1)              ;Set overall RGB tint of shader buffer
  287.         FSRedVal=red
  288.         FSGreenVal=green
  289.         FSBlueVal=blue
  290.         FSMasterAleph#=alpha/255.0
  291. End Function
  292.  
  293. Function SetDotTint(red,green,blue,alpha)               ;Set RGB tint of dots-layer
  294.         SDRedVal=red
  295.         SDGreenVal=green
  296.         SDBlueVal=blue
  297.         SDAlpha#=alpha/255.0
  298. End Function
  299.  
  300. Function CreateShader(px,py,dx=1,dy=1,r#=50,f#=0.5,a=0,h=0,s=0,l=0,as#=0,hs#=0,ss#=0,ls#=0,v=True)      ;New shader object
  301.                                                         ;Screen coordinates, size, range, falloff, AHSL value, relative strengths, visibility
  302.         If dx<1 Then dx=1
  303.         If dy<1 Then dy=1
  304.  
  305.         shader.shobj=New shobj
  306.         shaderx=px/shfac:shadery=py/shfac
  307.         shader  x=dx/shfac:shader       y=dy/shfac
  308.         shader
  309. ange=r/shfac:shaderfalloff=f
  310.  
  311.         shaderalpha=a:shaderhue=h:shadersat=s:shaderlum=l
  312.         shaderastr=as:shaderhstr=hs:shadersstr=ss:shaderlstr=ls
  313.         shadervisible=v
  314.  
  315.         Return Handle(shader)
  316.  
  317. End Function
  318.  
  319. Function CopyShader(prevshader,newx,newy,v=False)               ;Create a copy of an existing shader object at screen coordinates newx,newy
  320.                                                                                                                 ;Hidden by default
  321.         oldshader.shobj=Object.shobj(prevshader)
  322.         newshader.shobj=New shobj
  323.  
  324.         newshaderx=newx/shfac                   :newshadery=newy/shfac
  325.         newshader       x=oldshader     x               :newshader      y=oldshader     y
  326.         newshader
  327. ange=oldshader
  328. ange    :newshaderfalloff=oldshaderfalloff
  329.  
  330.         newshaderalpha=oldshaderalpha   :newshaderastr=oldshaderastr
  331.         newshaderhue=oldshaderhue               :newshaderhstr=oldshaderhstr
  332.         newshadersat=oldshadersat               :newshadersstr=oldshadersstr
  333.         newshaderlum=oldshaderlum               :newshaderlstr=oldshaderlstr
  334.  
  335.         newshadervisible=v
  336.  
  337.         Return Handle(newshader)
  338.  
  339. End Function
  340.  
  341. Function FreeShader(shader)                     ;Delete a shader object
  342.        
  343.         Delete Object.shobj(shader)
  344.        
  345. End Function
  346.  
  347. Function PutShader(shader,px,py,dx=-1,dy=-1,r#=-1,f#=-1)                ;Reposition a shader object at screen coordinates px,py
  348.                                                                                                                                 ;Optionally adjust its scale, range and intensity
  349.         pshader.shobj=Object.shobj(shader)
  350.         pshaderx=px/shfac:pshadery=py/shfac
  351.        
  352.         If dx>-1 Then pshader   x=dx/shfac
  353.         If dy>-1 Then pshader   y=dy/shfac
  354.         If r>-1 Then pshader
  355. ange=r/shfac
  356.         If f>-1 Then pshaderfalloff=f
  357.  
  358. End Function
  359.  
  360. Function ColourShader(shader,a,h,s,l,as#=-1,hs#=-1,ss#=-1,ls#=-1)               ;Change the alpha, hue, sat, lum, and relative strengths
  361. ;Function ColorShader(shader,a,h,s,l,as#=-1,hs#=-1,ss#=-1,ls#=-1)               ;of a specified shader object
  362.  
  363.         cshader.shobj=Object.shobj(shader)
  364.         cshaderalpha=a
  365.         cshaderhue=h
  366.         cshadersat=s
  367.         cshaderlum=l
  368.        
  369.         If as>-1 Then cshaderastr=as
  370.         If hs>-1 Then cshaderhstr=hs
  371.         If ss>-1 Then cshadersstr=ss
  372.         If ls>-1 Then cshaderlstr=ls
  373.  
  374. End Function
  375.  
  376. Function ShowShader(shader,show=True)                   ;True to show a specified shader object, False to hide it
  377.  
  378.         sshader.shobj=Object.shobj(shader)
  379.         sshadervisible=show
  380.        
  381. End Function
  382.  
  383. Function UpdateShaders()                                                ;Apply shader objects
  384.  
  385. For shader.shobj=Each shobj
  386. If shadervisible=True
  387.         For pixx=-shader
  388. ange To shader  x+shader
  389. ange
  390.         For pixy=-shader
  391. ange To shader  y+shader
  392. ange
  393.                 xpos=shaderx+pixx:ypos=shadery+pixy
  394.                 If xpos<=shxr And ypos<=shyr And xpos>-1 And ypos>-1
  395.                
  396.                         If pixx>=0 And pixx<=shader     x
  397.                                 If pixy>=0 And pixy<=shader     y
  398.                                         pixr#=0
  399.                                         shaderbuffer(xpos,ypos,0)=shaderbuffer(xpos,ypos,0)+1
  400.                         ;               pixd=shaderalpha
  401.                                         pixs#=1
  402.                                 Else
  403.                                         If pixy<0 Then pixr#=Abs(pixy):Else pixr#=pixy-shader   y
  404.                                         shaderbuffer(xpos,ypos,0)=shaderbuffer(xpos,ypos,0)+1
  405.                         ;               pixd=linpol3(shaderalpha,FSaleph,pixr/shader
  406. ange,shaderfalloff)
  407.                                         pixs#=linpol3(1,0,pixr/shader
  408. ange,shaderfalloff)
  409.                                 EndIf
  410.                         Else
  411.                                 If pixy>=0 And pixy<=shader     y
  412.                                         If pixx<0 Then pixr#=Abs(pixx):Else pixr#=pixx-shader   x
  413.                                         shaderbuffer(xpos,ypos,0)=shaderbuffer(xpos,ypos,0)+1
  414.                         ;               pixd=linpol3(shaderalpha,FSaleph,pixr/shader
  415. ange,shaderfalloff)
  416.                                         pixs#=linpol3(1,0,pixr/shader
  417. ange,shaderfalloff)
  418.                                 Else
  419.                                         If pixx<0 Then pixrx#=pixx:Else pixrx#=pixx-shader      x
  420.                                         If pixy<0 Then pixry#=pixy:Else pixry#=pixy-shader      y
  421.                                         pixr#=Sqr(pixrx*pixrx+pixry*pixry)
  422.                                         If pixr<=shader
  423. ange
  424.                                                 shaderbuffer(xpos,ypos,0)=shaderbuffer(xpos,ypos,0)+1
  425.                         ;                       pixd=linpol3(shaderalpha,FSaleph,pixr/shader
  426. ange,shaderfalloff)
  427.                                                 pixs#=linpol3(1,0,pixr/shader
  428. ange,shaderfalloff)
  429.                                         EndIf
  430.                                 EndIf
  431.                         EndIf
  432.                        
  433.                         If pixr<=shader
  434. ange                                                                            ;Apply blend and write to "buffer"
  435.                                 blendno#=shaderbuffer(xpos,ypos,0)
  436.                                 pixhue=shaderhue:pixsat=shadersat:pixlum=shaderlum
  437.                                 pixrs#=pixr/shader
  438. ange
  439.                                 pixd=shaderalpha
  440.                                 pixastr#=shaderastr*pixs;linpol3(shaderastr,0,pixrs,shaderfalloff)
  441.                                 pixhstr#=shaderhstr;*pixs
  442.                                 pixsstr#=shadersstr*pixs
  443.                                 pixlstr#=shaderlstr*pixs
  444.                                
  445.                                 If blendno>1
  446.                                         pixaleph=shaderbuffer(xpos,ypos,1)
  447.                                         pixh=shaderbuffer(xpos,ypos,2)
  448.                                         pixs=shaderbuffer(xpos,ypos,3)
  449.                                         pixl=shaderbuffer(xpos,ypos,4)
  450.                                        
  451.                                         If pixhue-pixh>127 Then pixhue=pixhue-256
  452.                                         If pixh-pixhue>127 Then pixhue=pixhue+256
  453.                                
  454.                                         ff#=(1-shaderfalloff)/(1-shaderfalloff+1-shaderstr(xpos,ypos,5))
  455.                                         xr#=(1-pixrs)/(1-pixrs+1-shaderstr(xpos,ypos,0))
  456.                                        
  457.                                         pixd=linpol2(pixaleph,pixd,xr,ff)
  458.                                         pixhue=linpol2(shaderbuffer(xpos,ypos,2),pixhue,xr,ff)
  459.                                         pixsat=linpol2(shaderbuffer(xpos,ypos,3),pixsat,xr,ff)
  460.                                         pixlum=linpol2(shaderbuffer(xpos,ypos,4),pixlum,xr,ff)
  461.                                        
  462.                                         If pixhue < 0 Then pixhue=pixhue+256
  463.                                         If pixhue>255 Then pixhue=pixhue-256
  464.                                                                        
  465.                                 ;       pixastr=linpol2(shaderstr(xpos,ypos,1),pixastr,xr,ff)
  466.                                 ;       pixhstr=linpol2(shaderstr(xpos,ypos,2),pixhstr,xr,ff)
  467.                                 ;       pixsstr=linpol2(shaderstr(xpos,ypos,3),pixsstr,xr,ff)
  468.                                 ;       pixlstr=linpol2(shaderstr(xpos,ypos,4),pixlstr,xr,ff)
  469.                                         If pixastr<shaderstr(xpos,ypos,1) Then pixastr=shaderstr(xpos,ypos,1)
  470.                                         If pixhstr<shaderstr(xpos,ypos,2) Then pixhstr=shaderstr(xpos,ypos,2)
  471.                                         If pixsstr<shaderstr(xpos,ypos,3) Then pixsstr=shaderstr(xpos,ypos,3)
  472.                                         If pixlstr<shaderstr(xpos,ypos,4) Then pixlstr=shaderstr(xpos,ypos,4)
  473.                                 EndIf
  474.                                                                                                  shaderstr(xpos,ypos,0)=pixrs
  475.                                 shaderbuffer(xpos,ypos,1)=pixd  :shaderstr(xpos,ypos,1)=pixastr
  476.                                 shaderbuffer(xpos,ypos,2)=pixhue:shaderstr(xpos,ypos,2)=pixhstr
  477.                                 shaderbuffer(xpos,ypos,3)=pixsat:shaderstr(xpos,ypos,3)=pixsstr
  478.                                 shaderbuffer(xpos,ypos,4)=pixlum:shaderstr(xpos,ypos,4)=pixlstr
  479.                                                                                                  shaderstr(xpos,ypos,5)=shaderfalloff
  480.                         EndIf
  481.                        
  482.                 EndIf
  483.         Next
  484.         Next
  485. EndIf
  486. Next
  487. End Function
  488.  
  489. Function RenderShaders(luminance=True)          ;luminance=True - Use luminance instead of lightness
  490. LockBuffer BackBuffer()
  491. LockBuffer(FSbuffer)
  492. For x=0 To shxr                         ;First read from BackBuffer()
  493. For y=0 To shyr
  494.         pixx=x*shfac+shf4:pixy=y*shfac+shf4
  495.         If pixx>=MS_xres Then pixx=MS_xres-1
  496.         If pixy>=MS_yres Then pixy=MS_yres-1
  497.         shbg=ReadPixelFast(pixx,pixy,BackBuffer())
  498.  
  499.         shred=(shbg And $ff0000) Shr 16
  500.         shgrn=(shbg And $00ff00) Shr 8
  501.         shblu=shbg And $0000ff
  502.         shgry=shred*.3+shgrn*.59+shblu*.11
  503.         BGtint=RGBHSL(shred,shgrn,shblu)                ;Grab H and S
  504.        
  505.         aleph=FSaleph
  506.         If FSblend>0 Then aleph=FSaleph*(shgry/255.0)
  507.         If FSblend<0 Then aleph=FSaleph*((255-shgry)/255.0)
  508.  
  509.         BGhue=((BGtint And $FF0000) Shr 16)*(1-FSHueStr)+FSHueVal*FSHueStr
  510.         BGsat=((BGtint And $FF00) Shr 8)*(1-FSSatStr)+FSSatVal*FSSatStr
  511.         If luminance Then BGlum=shgry*(1-FSLumStr)+FSLumVal*FSLumStr:Else BGlum=(BGtint And $FF)*(1-FSLumStr)+FSLumVal*FSLumStr
  512.  
  513.         If shaderbuffer(x,y,0)>0
  514.                 shaderbuffer(x,y,0)=0   ;Clear shader buffer
  515.                 aleph=shaderbuffer(x,y,1)*shaderstr(x,y,1)+aleph*(1-shaderstr(x,y,1))
  516.                 BGhue=shaderbuffer(x,y,2)*shaderstr(x,y,2)+BGhue*(1-shaderstr(x,y,2))
  517.                 BGsat=shaderbuffer(x,y,3)*shaderstr(x,y,3)+BGsat*(1-shaderstr(x,y,3))
  518.                 BGlum=shaderbuffer(x,y,4)*shaderstr(x,y,4)+BGlum*(1-shaderstr(x,y,4))
  519.         EndIf
  520.        
  521.         FStint=HSLRGB(BGhue,BGsat,BGlum)
  522.        
  523.         If MotionBlur#>0 Then FStint=(((FStint And $ff0000)Shr 16)*(1-MotionBlur)+((shaderbuffer(x,y,5) And $ff0000)Shr 16)*MotionBlur)Shl 16 Or (((FStint And $ff00)Shr 8)*(1-MotionBlur)+((shaderbuffer(x,y,5) And $ff00)Shr 8)*MotionBlur)Shl 8 Or ((FStint And $ff)*(1-MotionBlur)+(shaderbuffer(x,y,5) And $ff)*MotionBlur); Or (aleph*(1-MotionBlur)+((shaderbuffer(x,y,5) And $ff000000)Shr 24)*MotionBlur)Shl 24
  524.  
  525.         WritePixelFast x,y,FStint Or (aleph Shl 24),FSbuffer
  526.         shaderbuffer(x,y,5)=FStint Or (aleph Shl 24)
  527. Next
  528. Next
  529.  
  530. UnlockBuffer BackBuffer()
  531. UnlockBuffer (FSbuffer)
  532.  
  533. MSRender()      ;The actual drawing to screen
  534.  
  535. End Function
  536.  
  537. Function RenderMiniShader(FSkip=0,ClearDraw3D=0)        ;FSkip=0: Render every frame, =1: Render every ingame frame and redraw shader every other
  538.                                                                                                         ;frame, =2: Render every other ingame and shader frame
  539. If ScreenBlur<0 Then ScreenBlur=ScreenBlur                      ;ClearDraw3D: True to RenderWorld and call Clear3D. False if there is more Draw3D to draw
  540. If MotionBlur<0 Then MotionBlur=MotionBlur
  541.  
  542. If FSkip>0
  543.         If SkipShader=1
  544.                 UpdateShaders()
  545.                 MSRender()
  546.                 If ClearDraw3D Then RenderWorld:Clear3D()
  547.         Else
  548.                 RenderShaders()
  549.                 If ClearDraw3D Then RenderWorld:Clear3D()
  550.         EndIf
  551.        
  552.         SkipShader=Not SkipShader
  553. Else
  554.         UpdateShaders()
  555.         RenderShaders()
  556.         If ClearDraw3D Then RenderWorld:Clear3D()
  557. EndIf
  558.  
  559. End Function
  560.  
  561. Function MSRender()             ;The actual drawing of the shaders
  562.  
  563. ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph):DrawImage3D(FStex,shcentre+MSXpos,shcentre+MSYpos)
  564.  
  565. ;Fake-Gaussian blur
  566. If ScreenBlur#>0
  567.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.5)       :DrawImage3D(FStex,shcentre+ScreenBlur,shcentre+ScreenBlur)
  568.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.3)       :DrawImage3D(FStex,shcentre+ScreenBlur,shcentre-ScreenBlur)
  569.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.25)      :DrawImage3D(FStex,shcentre-ScreenBlur,shcentre-ScreenBlur)
  570.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.2)       :DrawImage3D(FStex,shcentre-ScreenBlur,shcentre+ScreenBlur)
  571.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.166)     :DrawImage3D(FStex,shcentre,shcentre+ScreenBlur)
  572.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.143)     :DrawImage3D(FStex,shcentre+ScreenBlur,shcentre)
  573.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.125)     :DrawImage3D(FStex,shcentre,shcentre-ScreenBlur)
  574.         ColorG3D(FSRedVal,FSGreenVal,FSBlueVal,FSMasterAleph*0.111)     :DrawImage3D(FStex,shcentre-ScreenBlur,shcentre)
  575. EndIf
  576.  
  577. If SDalpha>0 Then ColorG3D(SDRedVal,SDGreenVal,SDBlueVal,SDalpha):DrawImage3D(SDtex,MS_xres/2,MS_xres/2)                ;Fake dither squares
  578.  
  579. End Function
  580.  
  581. Function HSLRGB(H,S,L)          ;Converts HSL values to RGB
  582.  
  583.         hk#=H/255.0
  584.         sk#=S/255.0
  585.         lk#=L/255.0
  586.  
  587.         If lk<0.5 Then q#=lk*(1+sk):Else q#=lk+sk-(lk*sk)
  588.         p#=2*lk-q
  589.  
  590.         tR#=hk+0.3333:If tR>1 Then tR=tR-1
  591.         tG#=hk
  592.         tB#=hk-0.3333:If tB<0 Then tB=tB+1
  593.  
  594.         cR#=p:cG#=p:cB#=p
  595.  
  596.         If tR<0.1666 Then cR=p+((q-p)*6*tR)
  597.         If tG<0.1666 Then cG=p+((q-p)*6*tG)
  598.         If tB<0.1666 Then cB=p+((q-p)*6*tB)
  599.  
  600.         If tR<0.5 And tR>=0.1666 Then cR=q
  601.         If tG<0.5 And tG>=0.1666 Then cG=q
  602.         If tB<0.5 And tB>=0.1666 Then cB=q
  603.  
  604.         If tR<0.6666 And tR>=0.5 Then cR=p+((q-p)*6*(0.6666-tR))
  605.         If tG<0.6666 And tG>=0.5 Then cG=p+((q-p)*6*(0.6666-tG))
  606.         If tB<0.6666 And tB>=0.5 Then cB=p+((q-p)*6*(0.6666-tB))
  607.  
  608.         R=255*cR
  609.         G=255*cG
  610.         B=255*cB
  611.  
  612.         Return (R Shl 16) Or (G Shl 8) Or B
  613.  
  614. End Function
  615.  
  616. Function RGBHSL(R,G,B)          ;Converts RGB values to HSL
  617.  
  618. rk#=R/255.0:gk#=G/255.0:bk#=B/255.0
  619.  
  620. max#=rk:min#=gk
  621. If gk>max Then max=gk
  622. If bk>max Then max=bk
  623. If rk<min Then min=rk
  624. If bk<min Then min=bk
  625.  
  626. If max=min
  627.         h#=0:s#=0:l#=max
  628. Else
  629.         If max=rk Then h#=(60*(gk-bk)/(max-min)) Mod 360
  630.         If max=gk Then h#=(60*(bk-rk)/(max-min)) + 120
  631.         If max=bk Then h#=(60*(rk-gk)/(max-min)) + 240
  632.         l#=(max+min)/2
  633.         If l#<=0.5 Then s#=(max-min)/(2*l)
  634.         If l#>0.5 Then s#=(max-min)/(2-2*l)
  635. EndIf
  636.  
  637. hv=(h/360.0)*255:sv=s*255:lv=l*255
  638.  
  639. HSL=(hv Shl 16) Or (sv Shl 8) Or lv
  640.  
  641. Return HSL
  642.  
  643. End Function
  644.  
  645. Function linpol2#(a#,b#,x#,i#)          ;Linear interpolation between a and b as x, but with a second weighting to produce a bent line
  646.  
  647.         Local c#=a+(1-i)*(b-a)
  648.         Local x1#=x/i
  649.         Local x2#=(x-i)/(1-i)  
  650.         If x<i Then Return a *(1- x1 ) + c * x1: Else Return c *(1- x2 ) + b * x2
  651.  
  652. End Function
  653.  
  654. Function linpol3#(a#,b#,x#,i#)          ;Linear interpolation between a and b as x, but with a second weighting to produce a bent line
  655.  
  656.         Local c#=a+(1-i)*(b-a)
  657.         Local x2#=(x-i)/(1-i)  
  658.         If x<i Then Return a:Else Return a*(1-x2)+b*x2
  659.  
  660. End Function
  661. ;===========================================================================================================
  662.  
  663.  
  664. .createscene
  665.  
  666. ;Scenery
  667. ground=CreateCube():ScaleEntity ground,30,1,30:EntityColor ground,64,64,64:PositionEntity ground,0,-1,0
  668. monolith=CreateCube():ScaleEntity monolith,4,9,1:EntityColor monolith,32,32,32:PositionEntity monolith,-20,9,20:RotateEntity monolith,0,45,0
  669. lampbase=CreateCube():EntityColor lampbase,64,64,64:ScaleEntity lampbase,2.5,1,2.5:PositionEntity lampbase,0,1,0
  670. lamppole=CreateCylinder(8):EntityColor lamppole,64,64,64:ScaleEntity lamppole,1,5,1:PositionEntity lamppole,0,5,0
  671. lamptop=CreateCube():EntityColor lamptop,64,64,64:ScaleEntity lamptop,1.5,0.25,1.5:PositionEntity lamptop,0,10,0
  672. lamporb=CreateCylinder(8):EntityColor lamporb,127,127,127:PositionEntity lamporb,0,11.25,0
  673. firepit=CreateCube():EntityColor firepit,96,96,96:ScaleEntity firepit,3,0.5,3:PositionEntity firepit,0,1,-17
  674. PointEntity camera,lampbase
  675.  
  676. ;Sky and lights
  677. skyorb=CreateSphere(32)
  678. EntityColor skyorb,128,192,255
  679. ScaleEntity skyorb,200,200,200
  680. camorb=CreateSphere(32)
  681. EntityAlpha camorb,0
  682. ScaleEntity camorb,90,90,90
  683. FlipMesh skyorb
  684. FlipMesh camorb
  685.  
  686. light1=CreateLight()
  687. PositionEntity light1,-150,100,0
  688. PointEntity light1,ground
  689.  
  690. ;Characters
  691. someguy1=CreatePivot():PositionEntity someguy1,-15,0,-5:RotateEntity someguy1,0,45,0
  692. someguytorso=CreateCube(someguy1):ScaleEntity someguytorso,1,1.5,0.5:PositionEntity someguytorso,0,4.5,0
  693. someguylleg=CreateCube(someguy1):ScaleEntity someguylleg,0.4,1.5,0.5:PositionEntity someguylleg,-0.6,1.5,0
  694. someguyrleg=CreateCube(someguy1):ScaleEntity someguyrleg,0.4,1.5,0.5:PositionEntity someguyrleg,0.6,1.5,0
  695. someguyhead=CreateSphere(8,someguy1):ScaleEntity someguyhead,0.6,0.6,0.6
  696. PositionEntity someguyhead,0,6.7,0
  697. someguy2=CopyEntity(someguy1):PositionEntity someguy2,10,0,0:RotateEntity someguy2,0,-30,0
  698. For n=1 To CountChildren(someguy1)
  699.         EntityColor GetChild(someguy1,n),0,0,255
  700.         EntityColor GetChild(someguy2,n),255,0,0
  701. Next
  702.  
  703. ;Pickery
  704. EntityPickMode ground,2,True:EntityPickMode monolith,2,True
  705.  
  706. EntityType camera,1
  707. EntityType camorb,2
  708. Collisions 1,2,2,2
  709.  
  710. Return


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal