; ; ------------------------------------------------------------ ; ; SpiderBasic - Shader example file ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; CloseDebugOutput() #NbSprites = 20 #MaxSpeed = 4 ;- Structures ; Structure GadgetStatus NoiseEnabled.i PixelateEnabled.i BlurEnabled.i AdjustmentEnabled.i Alpha.i Red.i Saturation.i EndStructure Structure Sprite Sprite.i X.i Y.i SpeedX.i SpeedY.i EndStructure ;- Constants ; Runtime Enumeration Gadget #GadgetScreen #GadgetSprite #GadgetEnableReflection #GadgetEnableBulgePinch #GadgetEnableNoise #GadgetEnablePixelate #GadgetEnableBlur #GadgetEnableAdjustment #GadgetAdjustmentAlpha #GadgetAdjustmentRed #GadgetAdjustmentSaturation EndEnumeration Enumeration Sprite #SpriteBackground #SpriteGeebee EndEnumeration #Xml = 0 #Dialog = 0 Global NewList Sprites.Sprite() ;- Screen rendering ; Procedure RenderFrame() Static Time.d ; Adjust our background to the real screen size ZoomSprite(#SpriteBackground, ScreenWidth(), ScreenHeight()) DisplaySprite(#SpriteBackground, 0, 0) ; If reflection is enabled, adjust the bottom so the sprite bounce properly ; If GetGadgetState(#GadgetEnableReflection) ScreenBottom = ScreenHeight()*0.66 Else ScreenBottom = ScreenHeight() EndIf ; Display the sprites ; ForEach Sprites() With Sprites() ; Move the sprite ; \X + \SpeedX \Y + \SpeedY ; Inverse the speed ; If \X < 0 Or \X > ScreenWidth()-SpriteWidth(\Sprite) \SpeedX = -\SpeedX EndIf If \Y < 0 Or \Y > ScreenBottom-SpriteHeight(\Sprite) \SpeedY = -\SpeedY EndIf ; Ensures the sprite is properly moved into the screen area if we enable the reflection or resize the screen ; If \X > ScreenWidth()-SpriteWidth(\Sprite) \X = ScreenWidth()-SpriteWidth(\Sprite) EndIf If \X < 0 \X = 0 EndIf If \Y > ScreenBottom-SpriteHeight(\Sprite) \Y = ScreenBottom-SpriteHeight(\Sprite) EndIf If \Y < 0 \Y = 0 EndIf ; Display it DisplayTransparentSprite(\Sprite, \X, \Y) ; half transparency EndWith Next ; Animate the wave Time + 0.05 ScreenShaderAttribute(#PB_ReflectionShader_Time, Time) ; Animate the noise for screen ScreenShaderAttribute(#PB_NoiseShader_Seed, Random(1000)) ; Animate the noise for sprite SpriteShaderAttribute(#SpriteGeebee, #PB_NoiseShader_Seed, Random(1000)) FlipBuffers() ; continue the rendering EndProcedure ;- Loading and starting app ; Procedure Loading(Type, Filename$) Static NbLoadedElements NbLoadedElements+1 If NbLoadedElements = 2 ; Finished the loading of all images and sounds, we can start the applications ; Add a few sprites with random position and speed ; For k = 0 To #NbSprites-1 AddElement(Sprites()) Sprites()\Sprite = #SpriteGeebee Sprites()\X = Random(ScreenWidth()-SpriteWidth(#SpriteGeebee)-1) Sprites()\Y = Random(ScreenHeight()-SpriteHeight(#SpriteGeebee)-1) Sprites()\SpeedX = Random(#MaxSpeed, 1) ; Ensures we don't have a zero speed Sprites()\SpeedY = Random(#MaxSpeed, 1) ; Ensures we don't have a zero speed Next FlipBuffers() ; start the rendering EndIf EndProcedure Procedure LoadingError(Type, Filename$) Debug Filename$ + ": loading error" EndProcedure ; Resize the screen when the browser is resized, or when the phone orientation is changed ; Procedure OnSizeDesktop() ExamineDesktops() ScreenWidth = DesktopWidth(0) ScreenHeight = DesktopHeight(0) ResizeScreen(ScreenWidth, ScreenHeight) EndProcedure #PB_Event_SizeDesktop = 21 BindEvent(#PB_Event_SizeDesktop, @OnSizeDesktop()) OpenScreen(10, 10, 32, "400 sprites") OnSizeDesktop() ; Register the loading event before calling any resource load command BindEvent(#PB_Event_Loading, @Loading()) BindEvent(#PB_Event_LoadingError, @LoadingError()) BindEvent(#PB_Event_RenderFrame, @RenderFrame()) LoadSprite(#SpriteBackground, "Data/Mountain.jpg") LoadSprite(#SpriteGeebee, "Data/Geebee.png") Procedure UpdateAdjustmentGadgets() If GetGadgetState(#GadgetEnableAdjustment) DisableGadget(#GadgetAdjustmentAlpha, #False) DisableGadget(#GadgetAdjustmentRed, #False) DisableGadget(#GadgetAdjustmentSaturation, #False) Else DisableGadget(#GadgetAdjustmentAlpha, #True) SetGadgetState(#GadgetAdjustmentAlpha, 100) DisableGadget(#GadgetAdjustmentRed, #True) SetGadgetState(#GadgetAdjustmentRed, 100) DisableGadget(#GadgetAdjustmentSaturation, #True) SetGadgetState(#GadgetAdjustmentSaturation, 100) EndIf EndProcedure ;- UI ; ; Define our dialog window here, using regular XML ; XML$ = "<window id='#PB_Any' name='dialog1' text='Shader controls' minwidth='250' minheight='auto' maxheight='auto' flags='#PB_Window_System | #PB_Window_NoMove'>" + " <vbox>" + " <checkbox id='#GadgetEnableReflection' text='Enable screen reflection'/>" + " <checkbox id='#GadgetEnableBulgePinch' text='Enable screen bulge pinch'/>" + " <hbox>" + " <option id='#GadgetScreen' text='Screen mode'/>" + " <option id='#GadgetSprite' text='Sprite mode'/>" + " </hbox>" + " <checkbox id='#GadgetEnableNoise' text='Enable noise'/>" + " <checkbox id='#GadgetEnablePixelate' text='Enable pixelate'/>" + " <checkbox id='#GadgetEnableBlur' text='Enable blur'/>" + " <checkbox id='#GadgetEnableAdjustment' text='Enable adjustment'/>" + " <gridbox columns='2'>" + " <text id='#PB_Any' text='Alpha' />" + " <trackbar id='#GadgetAdjustmentAlpha' min='0' max='100'/>" + " <text id='#PB_Any' text='Red channel' />" + " <trackbar id='#GadgetAdjustmentRed' min='0' max='100'/>" + " <text id='#PB_Any' text='Saturation' />" + " <trackbar id='#GadgetAdjustmentSaturation' min='0' max='100'/>" + " </gridbox>" + " </vbox>" + " </window>" If ParseXML(#Xml, XML$) And XMLStatus(#Xml) = #PB_XML_Success If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "dialog1") ResizeWindow(DialogWindow(#Dialog), 2, 2, #PB_Ignore, #PB_Ignore) SetGadgetState(#GadgetScreen, #True) WindowOpacity(DialogWindow(#Dialog), 95) UpdateAdjustmentGadgets() Else Debug "Dialog error: " + DialogError(#Dialog) EndIf Else Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")" EndIf Procedure SwitchScreenShader(Gadget, Shader) If GetGadgetState(Gadget) If GetGadgetState(#GadgetScreen) AddScreenShader(Shader) Else AddSpriteShader(#SpriteGeebee, Shader) EndIf Else If GetGadgetState(#GadgetScreen) RemoveScreenShader(Shader) Else RemoveSpriteShader(#SpriteGeebee, Shader) EndIf EndIf EndProcedure Procedure ChangeShaderAttribute(Attribute, Value.d) If GetGadgetState(#GadgetScreen) ScreenShaderAttribute(Attribute, Value) Else SpriteShaderAttribute(#SpriteGeebee, Attribute, Value) EndIf EndProcedure ; When we switch between Screen and Sprite for shader, we need to preserve the current gadget status ; Procedure SwitchMode() Static SpriteStatus.GadgetStatus, ScreenStatus.GadgetStatus ; Static as we want this to be persistent between the procedure calls Define *Status.GadgetStatus, *PreviousStatus.GadgetStatus If GetGadgetState(#GadgetScreen) ; we switch to screen mode *Status = @SpriteStatus ; save the current status to the sprite structure *PreviousStatus = @ScreenStatus ; restore the previous screen status Else *Status = @ScreenStatus *PreviousStatus = @SpriteStatus EndIf ; Save the status ; *Status\NoiseEnabled = GetGadgetState(#GadgetEnableNoise) *Status\PixelateEnabled = GetGadgetState(#GadgetEnablePixelate) *Status\BlurEnabled = GetGadgetState(#GadgetEnableBlur) *Status\AdjustmentEnabled = GetGadgetState(#GadgetEnableAdjustment) *Status\Alpha = GetGadgetState(#GadgetAdjustmentAlpha) *Status\Red = GetGadgetState(#GadgetAdjustmentRed) *Status\Saturation = GetGadgetState(#GadgetAdjustmentSaturation) ; Restore the previous status ; SetGadgetState(#GadgetEnableNoise, *PreviousStatus\NoiseEnabled) SetGadgetState(#GadgetEnablePixelate, *PreviousStatus\PixelateEnabled) SetGadgetState(#GadgetEnableBlur, *PreviousStatus\BlurEnabled) SetGadgetState(#GadgetEnableAdjustment, *PreviousStatus\AdjustmentEnabled) SetGadgetState(#GadgetAdjustmentAlpha, *PreviousStatus\Alpha) SetGadgetState(#GadgetAdjustmentRed, *PreviousStatus\Red) SetGadgetState(#GadgetAdjustmentSaturation, *PreviousStatus\Saturation) UpdateAdjustmentGadgets() EndProcedure ;- UI Events ; Procedure GadgetEvents() Select EventGadget() Case #GadgetScreen, #GadgetSprite SwitchMode() Case #GadgetEnableReflection If GetGadgetState(#GadgetEnableReflection) AddScreenShader(#PB_Shader_Reflection) ScreenShaderAttribute(#PB_ReflectionShader_Boundary, 0.66) Else RemoveScreenShader(#PB_Shader_Reflection) EndIf Case #GadgetEnableBulgePinch If GetGadgetState(#GadgetEnableBulgePinch) AddScreenShader(#PB_Shader_BulgePinch) ScreenShaderAttribute(#PB_BulgePinchShader_Radius, ScreenHeight()/3) ScreenShaderAttribute(#PB_BulgePinchShader_Strength, 0.5) Else RemoveScreenShader(#PB_Shader_BulgePinch) EndIf Case #GadgetEnableNoise SwitchScreenShader(#GadgetEnableNoise, #PB_Shader_Noise) ChangeShaderAttribute(#PB_NoiseShader_Intensity, 0.3) Case #GadgetEnablePixelate SwitchScreenShader(#GadgetEnablePixelate, #PB_Shader_Pixelate) ChangeShaderAttribute(#PB_PixelateShader_SizeX, 3) ChangeShaderAttribute(#PB_PixelateShader_SizeY, 3) Case #GadgetEnableBlur SwitchScreenShader(#GadgetEnableBlur, #PB_Shader_Blur) Case #GadgetEnableAdjustment SwitchScreenShader(#GadgetEnableAdjustment, #PB_Shader_Adjustment) UpdateAdjustmentGadgets() Case #GadgetAdjustmentAlpha ChangeShaderAttribute(#PB_AdjustmentShader_Alpha, GetGadgetState(#GadgetAdjustmentAlpha) / 100) Case #GadgetAdjustmentRed ChangeShaderAttribute(#PB_AdjustmentShader_Red, GetGadgetState(#GadgetAdjustmentRed) / 100) Case #GadgetAdjustmentSaturation ChangeShaderAttribute(#PB_AdjustmentShader_Saturation, GetGadgetState(#GadgetAdjustmentSaturation) / 100) EndSelect EndProcedure BindEvent(#PB_Event_Gadget, @GadgetEvents())