Page 2 of 2

Re: Fullscreen drawing in real-time ?

Posted: Wed Nov 01, 2023 8:17 pm
by DigitalDreams
mk-soft wrote: Wed Nov 01, 2023 6:51 pm It has to be a little more code.
An event loop is ALWAYS needed to process the events. Otherwise your programme will no longer react.

Code: Select all

If ExamineDesktops()
  Define ScreenX.i = DesktopWidth(0)
  Define ScreenY.i = DesktopHeight(0)
  Define ScreenD.i = DesktopDepth(0)
  Define ScreenF.i = DesktopFrequency(0)
Else
  MessageRequester("Error", "Examine Desktop Faild!", #PB_MessageRequester_Error)
  End
EndIf

Procedure Draw(ScreenX, ScreenY)
  StartDrawing(WindowOutput(0))
  LineXY(Random(ScreenX), Random(ScreenY),Random(ScreenX), Random(ScreenY), RGB(Random(255), Random(255), Random(255)))
  StopDrawing()
EndProcedure

If OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)
  
  ; Add ESC as Menu 1000
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1000)
  
  AddWindowTimer(0, 1, 10)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1000
            Break
            
        EndSelect
        
      Case #PB_Event_Timer
        Select EventTimer()
          Case 1
            Draw(ScreenX, ScreenY)
            
        EndSelect
    EndSelect
    
  ForEver
  
EndIf
Thanks but that is MUCH slower....

Re: Fullscreen drawing in real-time ?

Posted: Wed Nov 01, 2023 8:25 pm
by pjay
I think mk-soft has given you a good foundation example to demonstrate handling events as is necessary.

To speed it up, adjust the Draw() function to render multiple lines at once:

Code: Select all

Procedure Draw(ScreenX, ScreenY)
  StartDrawing(WindowOutput(0))
  For x = 1 To 100
    LineXY(Random(ScreenX), Random(ScreenY),Random(ScreenX), Random(ScreenY), RGB(Random(255), Random(255), Random(255)))
  Next
  StopDrawing()
EndProcedure
Out of interest, how many lines do you need to render per frame?

Re: Fullscreen drawing in real-time ?

Posted: Wed Nov 01, 2023 8:35 pm
by mk-soft
Ca. 30 frames per second and 100 lines per frame

For game programming, of course, you take the screen libraries.
But this is also sufficient for small graphics applications.

Code: Select all

If ExamineDesktops()
  Define ScreenX.i = DesktopWidth(0)
  Define ScreenY.i = DesktopHeight(0)
  Define ScreenD.i = DesktopDepth(0)
  Define ScreenF.i = DesktopFrequency(0)
Else
  MessageRequester("Error", "Examine Desktop Faild!", #PB_MessageRequester_Error)
  End
EndIf

Procedure Draw(ScreenX, ScreenY)
  Protected i
  
  StartDrawing(WindowOutput(0))
  For i = 1 To 100
    LineXY(Random(ScreenX), Random(ScreenY),Random(ScreenX), Random(ScreenY), RGB(Random(255), Random(255), Random(255)))
  Next
  StopDrawing()
EndProcedure

If OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)
  
  ; Add ESC as Menu 1000
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1000)
  
  AddWindowTimer(0, 1, 33) ; <- 30 Frames per second
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1000
            Break
            
        EndSelect
        
      Case #PB_Event_Timer
        Select EventTimer()
          Case 1
            Draw(ScreenX, ScreenY)
            
        EndSelect
    EndSelect
    
  ForEver
  
EndIf

Re: Fullscreen drawing in real-time ?

Posted: Wed Nov 01, 2023 9:37 pm
by mk-soft
@DigitalDreams
To try something out quickly, you always need a base as a window program. This can be stored as a template and selected and inserted as required.
See PureBasicIDE Menu -> Tools -> Templates

Here are a few templates that I always use.
Link: Base codes for template box

Re: Fullscreen drawing in real-time ?

Posted: Thu Nov 02, 2023 7:07 am
by juergenkulow

Code: Select all

; CreateLine3D with Engine3D
ExamineDesktops()
#Screen=0
ScreenX = DesktopWidth(#Screen)
ScreenY = DesktopHeight(#Screen)
xy=ScreenX*80/ScreenY
OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)
AddKeyboardShortcut(0, #PB_Shortcut_Escape, #ESC) 
InitEngine3D()  
InitSprite()
InitKeyboard()
InitMouse()
OpenWindowedScreen(WindowID(0), 0, 0, ScreenX, ScreenY)
CreateCamera(0, 0, 0, 100, 100) ;"Fullscreen"-Camera
CameraBackColor(0, RGB(0, $20 , 0))
MoveCamera(0, 0, 0, 100)
CameraLookAt(0, 0, 0, 0)
Repeat
  ;Start=ElapsedMilliseconds()
  For i=0 To 200
    CreateLine3D(i, Random(xy)-xy/2, Random(80)-40, 0, RGB(255, 0, 0), Random(xy)-xy/2, Random(80)-40, 1, RGB(0, 0, 255))
    CreateEntity(i, MeshID(i), #PB_Material_None)
  Next     
  ;Debug ElapsedMilliseconds()-Start
  RenderWorld()
  FlipBuffers() 
  Event = WaitWindowEvent(1)
Until Event=#PB_Event_CloseWindow Or (Event=#PB_Event_Menu And EventMenu()=#ESC); ALT-F4 or ESC   

Re: Fullscreen drawing in real-time ?

Posted: Thu Nov 02, 2023 10:32 am
by mk-soft
Sorry ;)

Dispatch always all window events ...

Code: Select all

; CreateLine3D with Engine3D

; Constants
#Screen=0
#MenuESC = 1000

; Variables
Global ExitApplication
Global ScreenX
Global ScreenY
Global xy, i

ExamineDesktops()

ScreenX = DesktopWidth(#Screen)
ScreenY = DesktopHeight(#Screen)
xy=ScreenX*80/ScreenY
If OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, #MenuESC) 
  InitEngine3D()  
  InitSprite()
  InitKeyboard()
  InitMouse()
  If OpenWindowedScreen(WindowID(0), 0, 0, ScreenX, ScreenY)
    CreateCamera(0, 0, 0, 100, 100) ;"Fullscreen"-Camera
    CameraBackColor(0, RGB(0, $20 , 0))
    MoveCamera(0, 0, 0, 100)
    CameraLookAt(0, 0, 0, 0)
    Repeat
      ; Dispatch all window events
      While WindowEvent()
        Select Event()
          Case #PB_Event_CloseWindow
            ExitApplication = #True
          Case #PB_Event_Menu
            Select EventMenu()
              Case #MenuESC
                ExitApplication = #True
            EndSelect
        EndSelect
      Wend
      
      For i=0 To 200
        CreateLine3D(i, Random(xy)-xy/2, Random(80)-40, 0, RGB(255, 0, 0), Random(xy)-xy/2, Random(80)-40, 1, RGB(0, 0, 255))
        CreateEntity(i, MeshID(i), #PB_Material_None)
      Next     
      RenderWorld()
      FlipBuffers() 
    Until ExitApplication
  EndIf
EndIf

Re: Fullscreen drawing in real-time ?

Posted: Thu Nov 02, 2023 12:00 pm
by DigitalDreams
Thanks all

The 3D option might be the only answer if I can't escape from my fastest example without slowing or crashing the program !

Code: Select all

ExamineDesktops()
Define ScreenX.i = DesktopWidth(0)
Define ScreenY.i = DesktopHeight(0)
Define ScreenD.i = DesktopDepth(0)
Define ScreenF.i = DesktopFrequency(0)


OpenWindow(0,0,0,ScreenX,ScreenY,"",#PB_Window_BorderLess)

StartDrawing(WindowOutput(0))
Repeat
  LineXY(Random(ScreenX), Random(ScreenY),Random(ScreenX), Random(ScreenY), RGB(Random(255), Random(255), Random(255)))
ForEver
StopDrawing()

End

Re: Fullscreen drawing in real-time ?

Posted: Thu Nov 02, 2023 12:44 pm
by pjay
Handling event shouldn't have a noticeable effect on speed.

Code: Select all

OpenWindow(0,0,0,320,240,"",#PB_Window_BorderLess|#PB_Window_Maximize)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,#PB_Event_CloseWindow) ; exit app if escape pressed.
ScreenX = WindowWidth(0) * DesktopResolutionX() : ScreenY = WindowHeight(0) * DesktopResolutionY()

StartDrawing(WindowOutput(0))
Repeat
  Repeat
    ev = WindowEvent()
    If EventMenu() = #PB_Event_CloseWindow : End : EndIf 
  Until ev = 0
  LineXY(Random(ScreenX), Random(ScreenY),Random(ScreenX), Random(ScreenY), RGB(Random(255), Random(255), Random(255)))
ForEver

Re: Fullscreen drawing in real-time ?

Posted: Thu Nov 02, 2023 1:47 pm
by mk-soft
This will require an event loop, we had already written several times.
WITHOUT AN EVENT LOOP IT DOES NOT WORK !!!