Complex spiral in OpenGL

Share your advanced PureBasic knowledge/code with the community.
threedslider
Enthusiast
Enthusiast
Posts: 397
Joined: Sat Feb 12, 2022 7:15 pm

Complex spiral in OpenGL

Post by threedslider »

Hello

Here is a complex spiral as I share you ^^

But warnings for dizzying mind ! Your eyes move ! :mrgreen:

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Coded with Purebasic v.6.04 by threedslider 01/27/2024
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

move.f = 0

Procedure spiral()
  
  Shared move
  
   multiplier.f = 500.0 * #PI
  
  
    radius.f = 20.0
    
 
  
  glBegin_(#GL_LINE_STRIP)
    
  For mult = 0 To 360
     
  spiral_x.f =   radius * Cos(((radius*move)/7000)+multiplier)/2
  spiral_y.f =   radius * Sin(((radius*move)/7000)+multiplier)/2
  
  
  glColor3f_(mult/10.0, mult/100.0, mult/100.0)
  
  glVertex3f_(spiral_x*0.3,  spiral_y*0.3 , 0.0) 
 
  radius = radius + 1.0
  
  
  Next
  glEnd_()
  
EndProcedure


InitSprite()
InitKeyboard()

OpenWindow(1, 0,0,800,600,"Spiral with complex color in OpenGL ", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(1),0,0,800,600,0,0,0)


glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_() 
gluPerspective_(45.0, 800/600, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, -50)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, 800, 600)



glClearColor_(0.1, 0.1, 0.1, 0) ; background color

Repeat
  ExamineKeyboard()
  event = WindowEvent()
  ClearScreen(RGB(0,0,0))
  
   glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
 
  For x = 0 To 500
    
    move  +  1/1000
    
    spiral()  
         
  Next
    
 
  
 FlipBuffers()
  
Until event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
End


infratec
Always Here
Always Here
Posts: 7618
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Complex spiral in OpenGL

Post by infratec »

A bit modified to use the OpenGlGadget()

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Coded with Purebasic v.6.04 by threedslider 01/27/2024
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EnableExplicit


Procedure spiral(move.f)
  
  Protected.i mult
  Protected.f multiplier, radius, spiral_x, spiral_y
  
  multiplier = 500.0 * #PI
  radius = 20.0
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  glBegin_(#GL_LINE_STRIP)
  
  For mult = 0 To 360
    
    spiral_x = radius * Cos(((radius * move) / 7000) + multiplier) / 2
    spiral_y = radius * Sin(((radius * move) / 7000) + multiplier) / 2
    
    glColor3f_(mult / 10.0, mult / 100.0, mult / 100.0)
    glVertex3f_(spiral_x * 0.3,  spiral_y * 0.3 , 0.0) 
    
    radius = radius + 1.0
    
  Next
  
  glEnd_()
  
  SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
  
EndProcedure



Define move.f, event.i


OpenWindow(1, 0, 0, 800, 600, "Spiral with complex color in OpenGL", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenGLGadget(0, 0, 0, 800, 600)
SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)

glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(45.0, 800 / 600, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, -50)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, 800, 600)

Repeat
  If move < 1000
    event = WindowEvent()
    
    move + 5
    spiral(move)
  Else
    event = WaitWindowEvent()
  EndIf
  
Until event = #PB_Event_CloseWindow
Fred
Administrator
Administrator
Posts: 18224
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: Complex spiral in OpenGL

Post by Fred »

A bit modified again to be DPI aware :):

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Coded with Purebasic v.6.04 by threedslider 01/27/2024
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EnableExplicit


Procedure spiral(move.f)
  
  Protected.i mult
  Protected.f multiplier, radius, spiral_x, spiral_y
  
  multiplier = 500.0 * #PI
  radius = 20.0
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  glBegin_(#GL_LINE_STRIP)
  
  For mult = 0 To 360
    
    spiral_x = radius * Cos(((radius * move) / 7000) + multiplier) / 2
    spiral_y = radius * Sin(((radius * move) / 7000) + multiplier) / 2
    
    glColor3f_(mult / 10.0, mult / 100.0, mult / 100.0)
    glVertex3f_(spiral_x * 0.3,  spiral_y * 0.3 , 0.0) 
    
    radius = radius + 1.0
    
  Next
  
  glEnd_()
  
  SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
  
EndProcedure



Define move.f, event.i


OpenWindow(1, 0, 0, 800, 600, "Spiral with complex color in OpenGL", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenGLGadget(0, 0, 0, 800, 600)
SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)

Define ScreenPixelWidth = DesktopScaledX(800)
Define ScreenPixelHeight = DesktopScaledY(600)

glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(45.0, ScreenPixelWidth / ScreenPixelHeight, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, -50)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, ScreenPixelWidth, ScreenPixelHeight)

Repeat
  If move < 1000
    event = WindowEvent()
    
    move + 5
    spiral(move)
  Else
    event = WaitWindowEvent()
  EndIf
  
Until event = #PB_Event_CloseWindow
threedslider
Enthusiast
Enthusiast
Posts: 397
Joined: Sat Feb 12, 2022 7:15 pm

Re: Complex spiral in OpenGL

Post by threedslider »

Nice ! And thank you all :)

After running this modification, it works but in some time it stopped it and it doesn"t go futher :/

Is it on purpose or not ?

Happy coding !
threedslider
Enthusiast
Enthusiast
Posts: 397
Joined: Sat Feb 12, 2022 7:15 pm

Re: Complex spiral in OpenGL

Post by threedslider »

Ok an updated of my little modification from Infratec and Fred, it works now :)

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Coded with Purebasic v.6.04 by threedslider 01/27/2024
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; A little of modification from Infratec and Fred, thank you all :)

; Updated for my smooth running, it works now !

EnableExplicit


Procedure spiral(move.f)
  
  Protected.i mult
  Protected.f multiplier, radius, spiral_x, spiral_y
  
  multiplier = 500.0 * #PI
  radius = 20.0
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  glBegin_(#GL_LINE_STRIP)
  
  For mult = 0 To 360
    
    spiral_x = radius * Cos(((radius * move) / 7000) + multiplier) / 2
    spiral_y = radius * Sin(((radius * move) / 7000) + multiplier) / 2
    
    glColor3f_(mult / 10.0, mult / 100.0, mult / 100.0)
    glVertex3f_(spiral_x * 0.3,  spiral_y * 0.3 , 0.0) 
    
    radius = radius + 1.0
    
  Next
  
  glEnd_()
  
  SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
  
EndProcedure



Define move.f, event.i


OpenWindow(1, 0, 0, 800, 600, "Spiral with complex color in OpenGL", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenGLGadget(0, 0, 0, 800, 600)
SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)

Define ScreenPixelWidth = DesktopScaledX(800)
Define ScreenPixelHeight = DesktopScaledY(600)

glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(45.0, ScreenPixelWidth / ScreenPixelHeight, 1.0, 60.0)
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, -50)
glShadeModel_(#GL_SMOOTH)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_COLOR_MATERIAL)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_CULL_FACE)   
glViewport_(0, 0, ScreenPixelWidth, ScreenPixelHeight)

Repeat
  
  If move < 10000
    event = WindowEvent()
    
    move + 0.5
    spiral(move)
  Else
    event = WaitWindowEvent()
  EndIf
  
Until event = #PB_Event_CloseWindow

dige
Addict
Addict
Posts: 1405
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: Complex spiral in OpenGL

Post by dige »

Great 👍 there are a lot of nice effects, if you let it run any longer...

Code: Select all

 If move < 1000000
    event = WindowEvent()
    
    move + 10
"Daddy, I'll run faster, then it is not so far..."
threedslider
Enthusiast
Enthusiast
Posts: 397
Joined: Sat Feb 12, 2022 7:15 pm

Re: Complex spiral in OpenGL

Post by threedslider »

dige wrote: Mon Jan 29, 2024 10:26 am Great 👍 there are a lot of nice effects, if you let it run any longer...

Code: Select all

 If move < 1000000
    event = WindowEvent()
    
    move + 10
Hello dige and thank you :mrgreen:
Post Reply