Picasso SPH

Programmation d'applications complexes
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Picasso SPH

Message par SPH »

Salut,

Voici un générateur de tableaux abstraits. Il est entièrement fait en OpenGL. Je me suis bien amusé à le faire.
Sachez qu'il fonctionne avec de nombreux Cos et Sin; donc, peut être ne comprendrez vous rien au code.
Le code est moche car il n'avait pas ce but. Les tableaux se forment au bout de 1 minute environ. Ensuite, ça deviens n'importe quoi. :D

Merci a Falsam sans qui je n'aurais jamais réussi a coder en OpenGL (la base du code est de lui (il y a peut être 2 ans)) :idea:

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;           p i c a s s o _ S P H          ;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code : SPH  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PB6.0 (2022) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;EnableExplicit

;-CONSTANTS
Enumeration
  #MainWindow
  #OpenGLGadget
EndEnumeration


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  Réglage  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;nb=30 entre 0 (1 ligne) et x milliards (+++) ;D
nb=30
;alpha.f entre 0.005 (tres transparent) et 1 (pas transparent)
alpha.f=0.01
;rayon.f entre 1 (plein ecran) et 6 (cadrage serré)
rayon.f=2.5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;These two GL constants are used for texture creation. Don't change their values.
#GL_BGR = $80E0
#GL_BGRA = $80E1

If ExamineDesktops()
  ddw=DesktopWidth(0)
  ddh=DesktopHeight(0)
Else
  ddw=1024
  ddh=768
EndIf


;********************* DPI *********************
dpix.f=DesktopResolutionX()
dpiy.f=DesktopResolutionY()

If dpix > 1
xf.f=(1920/ddw)*dpix
Else
   xf = 1
EndIf

If dpiy > 1
yf.f=(1024/ddh)*dpiy
Else
   yf = 1
 EndIf
 
;**********************************************

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-DEFINES
Define.i Event
Define.i WindowFlags = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget


;-DECLARES
Declare Render()
Declare Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
Declare SetupOpenGL()
Declare SetupGLTexture(ImageHandle.i)


;-MAIN WINDOW
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Picasso_SPH",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf


SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter


glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
timer=ElapsedMilliseconds()

glClearColor_(0,0,0, 1.0)
ShowCursor_(0)
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Dim sph_x1.f(nb)
Dim sph_y1.f(nb)
Dim sph_x2.f(nb)
Dim sph_y2.f(nb)
Dim sph_x3.f(nb)
Dim sph_y3.f(nb)
Dim sph_x4.f(nb)
Dim sph_y4.f(nb)
Dim sph_x11.f(nb);=(50+Random(50))/20000
Dim sph_y11.f(nb);=(50+Random(50))/20000
Dim sph_x21.f(nb);=(50+Random(50))/20000
Dim sph_y21.f(nb);=(50+Random(50))/20000
Dim sph_x31.f(nb);=(50+Random(50))/20000
Dim sph_y31.f(nb);=(50+Random(50))/20000
Dim sph_x41.f(nb);=(50+Random(50))/20000
Dim sph_y41.f(nb);=(50+Random(50))/20000
Dim sph_xx(nb)
Dim sph_yy(nb)
Dim sph_xx2(nb);=Cos(sph_x3(i))*ddw31
Dim sph_yy2(nb);=Sin(sph_y3(i))*ddh31
Dim sph_xx2(nb);+Cos(sph_x4(i))*ddw32
Dim sph_yy2(nb);+Sin(sph_y4(i))*ddh32
Dim r(4)
Dim v(4)
Dim b(4)

; reglage des couleurs ici (mais c'est délicat)
r(0)=255
v(0)=0
b(0)=0

r(1)=255
v(1)=255
b(1)=0

r(2)=0
v(2)=255
b(2)=0

r(3)=0
v(3)=0
b(3)=255

r(4)=255
v(4)=0
b(4)=255
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


For i=0 To nb
sph_x1.f(i)=(0+Random(200000))/100000;+0.13
sph_y1.f(i)=(0+Random(200000))/100000;0.152
sph_x2.f(i)=(0+Random(200000))/100000;0.1233
sph_y2.f(i)=(0+Random(200000))/100000;0.1402
sph_x3.f(i)=(0+Random(200000))/100000;+0.13
sph_y3.f(i)=(0+Random(200000))/100000;0.152
sph_x4.f(i)=(0+Random(200000))/100000;0.1233
sph_y4.f(i)=(0+Random(200000))/100000;0.1402

sph_x11.f(i)=(50+Random(100))/30000
sph_y11.f(i)=(50+Random(100))/30000
sph_x21.f(i)=(50+Random(100))/30000
sph_y21.f(i)=(50+Random(100))/30000
sph_x31.f(i)=(50+Random(100))/30000
sph_y31.f(i)=(50+Random(100))/30000
sph_x41.f(i)=(50+Random(100))/30000
sph_y41.f(i)=(50+Random(100))/30000

Next


;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Repeat
  
  For i=0 To nb
    
  ddw21=Sin(sph_x1(i))*ddw/rayon.f
  ddh21=Cos(sph_y1(i))*ddh/rayon.f
  ddw22=Sin(sph_x2(i))*ddw/rayon.f
  ddh22=Cos(sph_x2(i))*ddh/rayon.f
  
sph_xx(i)=Cos(sph_x1(i))*ddw21
sph_yy(i)=Sin(sph_y1(i))*ddh21
sph_xx(i)+Cos(sph_x2(i))*ddw22
sph_yy(i)+Sin(sph_y2(i))*ddh22

  ddw31=Sin(sph_x3(i))*ddw/rayon.f
  ddh31=Cos(sph_y3(i))*ddh/rayon.f
  ddw32=Cos(sph_x4(i))*ddw/rayon.f
  ddh32=Sin(sph_y4(i))*ddh/rayon.f
  
sph_xx2(i)=Cos(sph_x3(i))*ddw31
sph_yy2(i)=Sin(sph_y3(i))*ddh31
sph_xx2(i)+Sin(sph_x4(i))*ddw32
sph_yy2(i)+Cos(sph_y4(i))*ddh32

Next

;glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)


;*****
  Repeat
    Event = WindowEvent()

    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
          timer=ElapsedMilliseconds()-timer
          ;MessageRequester("Timer", Str(timer)+" ms - "+Str(scene)+" frames",2)
;           Debug scene
;           Debug timer
          ShowCursor_(1)
          End
        EndSelect
    EndSelect
   
  Until Event = 0
 
 
  ;##############################################
  ;##############################################
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; L I N E S ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  For i=0 To nb
    
    glBegin_(#GL_LINES);

    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    
    glColor4f_(r(i%5),v(i%5),b(i%5),alpha)
    
    glVertex2f_(ddw/2+sph_xx(i),ddh/2+sph_yy(i));
    glVertex2f_(ddw/2-sph_xx2(i),ddh/2-sph_yy2(i));
glEnd_(); 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 
  sph_x1(i)+sph_x11(i);0.00951
  sph_y1(i)+sph_y11(i);(50+Random(50))/10000;0.00732
  
  sph_x2(i)+sph_x21(i);(50+Random(50))/10000;0.00621
  sph_y2(i)+sph_y21(i);(50+Random(50))/10000;0.01
  
  sph_x3(i)+sph_x31(i);0.00951
  sph_y3(i)+sph_y31(i);(50+Random(50))/10000;0.00732
  
  sph_x4(i)+sph_x41(i);(50+Random(50))/10000;0.00621
  sph_y4(i)+sph_y41(i);(50+Random(50))/10000;0.01
Next

  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  
ForEver




Procedure Render()
 
  ;Clearing buffers and resetting clear color to remove old graphics from the last frame.
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  ;  glClearColor_(0.2, 0.2, 0.2, 1.0)
  glClearColor_(0,0,0,1)
 
  ;## DRAWING TEXTURES/IMAGES
  ;First enable the Texture system.
  glEnable_(#GL_TEXTURE_2D)
 
  ;This procedure will create a quad and apply a texture to it.
  ;The Texture variable contains the texture created earlier using SetupGLTexture().
  Render2DQuad(Texture1, 0, 0, ImageWidth(Image1), ImageHeight(Image1), -2)
  ; Render2DQuad(Texture2, 0, 0, ImageWidth(Image2), ImageHeight(Image2), -1)
 
  ;After all the textures have been displayed disable the texture system.
  ;Otherwise it will conflict with the non texture graphics.
  glDisable_(#GL_TEXTURE_2D)
 
EndProcedure

Procedure Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
 
  ;The texture is first bound which tells OpenGL to use this texture for any future rendering.
  glBindTexture_(#GL_TEXTURE_2D, OGLTexture)
  glBegin_(#GL_QUADS)
  glColor4f_   (1,1,1,1)
  glNormal3f_  (0,0,1.0)
  glTexCoord2f_(1.0,1.0)
  glVertex3f_  (StartX+Width,StartY,Z)
  glTexCoord2f_(0.0,1.0)
  glVertex3f_  (StartX,StartY,Z)
  glTexCoord2f_(0.0,0.0)
  glVertex3f_  (StartX,StartY+Height,Z)
  glTexCoord2f_(1.0,0.0)
  glVertex3f_  (StartX+Width,StartY+Height,Z)
  glEnd_()
 
EndProcedure

Procedure SetupOpenGL()
 
  glMatrixMode_(#GL_PROJECTION)
 
  glOrtho_(0.0, WindowDim\X, WindowDim\Y, 0.0, -1000.0, 1000.0)
 
  glMatrixMode_(#GL_MODELVIEW)
 
  ; glEnable_(#GL_DEPTH_TEST)
 
  glEnable_(#GL_BLEND)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
 
EndProcedure



!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Picasso SPH

Message par threedslider »

Chouette comme image générée par OpenGL, merci pour ton code et décidément Purebasic peut tout faire, super cool :mrgreen: !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Picasso SPH

Message par Kwai chang caine »

Joli...on reconnait bien ton touché de pinceau :mrgreen:
Merci pour le partage 8)
threedslider a écrit :décidément Purebasic peut tout faire
T'as pas idée .... :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Picasso SPH

Message par threedslider »

Kwai chang caine a écrit : jeu. 14/juil./2022 19:40 T'as pas idée .... :wink:
Ben plus je découvre la programmation Purebasic et plus je trouve qu'il est équivalent aux C/C++ mais en plus rapide ! Et de plus les API intégrés sont prêt à créer toutes sortes des applications, c'est qui ne sont pas les cas avec C/C++ faut développer séparément avec libs 8O
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Picasso SPH

Message par SPH »

En PB, on peux PRESQUE tout faire mais de la à dire qu'il est plus rapide que le C, je ne m'avancerais pas. :P

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Picasso SPH

Message par SPH »

Ha !

Peut être que tu parlais du temps qu'il faut pour écrire un code en PB par rapport au C/C++ !
Dans ce cas, oui, tout est relatif mais je pense que c'est plus rapide et moins dur.

En tout cas, bienvenue dans la famille PB :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Picasso SPH

Message par SPH »

Version avec des triangles :

(PS : Code hyper crado)

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;           p i c a s s o _ S P H          ;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code : SPH  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; triangles  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PB6.0 (2022) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;EnableExplicit

;-CONSTANTS
Enumeration
  #MainWindow
  #OpenGLGadget
EndEnumeration


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  Réglage  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;nb=30 entre 0 (1 ligne) et x milliards (+++) ;D
nb=7
;alpha.f entre 0.005 (tres transparent) et 1 (pas transparent)
alpha.f=0.03
;rayon.f entre 1 (plein ecran) et 6 (cadrage serré)
rayon.f=2.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;These two GL constants are used for texture creation. Don't change their values.
#GL_BGR = $80E0
#GL_BGRA = $80E1

If ExamineDesktops()
  ddw=DesktopWidth(0)
  ddh=DesktopHeight(0)
Else
  ddw=1024
  ddh=768
EndIf


;********************* DPI *********************
dpix.f=DesktopResolutionX()
dpiy.f=DesktopResolutionY()

If dpix > 1
  xf.f=(1920/ddw)*dpix
Else
  xf = 1
EndIf

If dpiy > 1
  yf.f=(1024/ddh)*dpiy
Else
  yf = 1
EndIf

;**********************************************

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-DEFINES
Define.i Event
Define.i WindowFlags = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget


;-DECLARES
Declare Render()
Declare Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
Declare SetupOpenGL()
Declare SetupGLTexture(ImageHandle.i)


;-MAIN WINDOW
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Picasso_SPH",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf


SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter


glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
timer=ElapsedMilliseconds()

glClearColor_(0,0,0, 1.0)
ShowCursor_(0)
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Dim sph_x1.f(nb)
Dim sph_y1.f(nb)
Dim sph_x2.f(nb)
Dim sph_y2.f(nb)
Dim sph_x3.f(nb)
Dim sph_y3.f(nb)
Dim sph_x4.f(nb)
Dim sph_y4.f(nb)
Dim sph_x11.f(nb);=(50+Random(50))/20000
Dim sph_y11.f(nb);=(50+Random(50))/20000
Dim sph_x21.f(nb);=(50+Random(50))/20000
Dim sph_y21.f(nb);=(50+Random(50))/20000
Dim sph_x31.f(nb);=(50+Random(50))/20000
Dim sph_y31.f(nb);=(50+Random(50))/20000
Dim sph_x41.f(nb);=(50+Random(50))/20000
Dim sph_y41.f(nb);=(50+Random(50))/20000
Dim sph_xx.f(nb)
Dim sph_yy.f(nb)
Dim sph_xx2.f(nb)
Dim sph_yy2.f(nb)

Dim rayon(nb)
Dim sph_r.f(nb)
Dim sph_r2.f(nb)
Dim sph_xr.f(nb)
Dim sph_xr2.f(nb)
Dim sph_rr.f(nb)
Dim sph_rr2.f(nb)
Dim sph_xrr.f(nb)
Dim sph_xrr2.f(nb)
Dim sph_yrr.f(nb)
Dim sph_yrr2.f(nb)

Dim r(4)
Dim v(4)
Dim b(4)

; reglage des couleurs ici (mais c'est délicat)
r(0)=255
v(0)=0
b(0)=0

r(1)=255
v(1)=255
b(1)=0

r(2)=0
v(2)=255
b(2)=0

r(3)=0
v(3)=0
b(3)=255

r(4)=255
v(4)=0
b(4)=255
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
angle.f=(3.141592*2)/3

For i=0 To nb
  sph_x1.f(i)=(0+Random(200000))/100000;+0.13
  sph_y1.f(i)=(0+Random(200000))/100000;0.152
  sph_x2.f(i)=(0+Random(200000))/100000;0.1233
  sph_y2.f(i)=(0+Random(200000))/100000;0.1402
  sph_x3.f(i)=(0+Random(200000))/100000;+0.13
  sph_y3.f(i)=(0+Random(200000))/100000;0.152
  sph_x4.f(i)=(0+Random(200000))/100000;0.1233
  sph_y4.f(i)=(0+Random(200000))/100000;0.1402
  sph_r.f(i)=(0+Random(200000))/100000 ;0.1233
  sph_r2.f(i)=(0+Random(200000))/100000;0.1233
  sph_xr.f(i)=(0+Random(200000))/100000;0.1233
  sph_xr2.f(i)=(0+Random(200000))/100000;0.1233
  
  sph_x11.f(i)=(50+Random(100))/30000
  sph_y11.f(i)=(50+Random(100))/30000
  sph_x21.f(i)=(50+Random(100))/30000
  sph_y21.f(i)=(50+Random(100))/30000
  sph_x31.f(i)=(50+Random(100))/30000
  sph_y31.f(i)=(50+Random(100))/30000
  sph_x41.f(i)=(50+Random(100))/30000
  sph_y41.f(i)=(50+Random(100))/30000
  sph_rr.f(i)=(50+Random(100))/20000
  sph_rr2.f(i)=(50+Random(100))/20000
  sph_yrr.f(i)=(50+Random(100))/20000
  sph_yrr2.f(i)=(50+Random(100))/20000
  
  rayon(i)=10+Random(70)
  
Next


;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Repeat
  
  For i=0 To nb
    
    ddw21=Sin(sph_x1(i))*ddw/rayon.f
    ddh21=Cos(sph_y1(i))*ddh/rayon.f
    ddw22=Sin(sph_x2(i))*ddw/rayon.f
    ddh22=Cos(sph_x2(i))*ddh/rayon.f
    
    sph_xx.f(i)=Cos(sph_x1(i))*ddw21
    sph_yy.f(i)=Sin(sph_y1(i))*ddh21
    sph_xx.f(i)+Cos(sph_x2(i))*ddw22
    sph_yy.f(i)+Sin(sph_y2(i))*ddh22
    
    ddw31=Sin(sph_x3(i))*ddw/rayon.f
    ddh31=Cos(sph_y3(i))*ddh/rayon.f
    ddw32=Cos(sph_x4(i))*ddw/rayon.f
    ddh32=Sin(sph_y4(i))*ddh/rayon.f
    
    sph_xx2.f(i)=Cos(sph_x3(i))*ddw31
    sph_yy2.f(i)=Sin(sph_y3(i))*ddh31
    sph_xx2.f(i)+Sin(sph_x4(i))*ddw32
    sph_yy2.f(i)+Cos(sph_y4(i))*ddh32
    
    ;====
    sph_r(i)=Cos(sph_rr(i))
    rayon(i)=Cos(sph_r(i))*200+Sin(sph_r2(i))*200
    sph_rr(i)+sph_yrr2(i)
    ;====
    
    
  Next
  
  
  ;*****
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
            timer=ElapsedMilliseconds()-timer
            ShowCursor_(1)
            End
        EndSelect
    EndSelect
    
  Until Event = 0
  
  
  ;##############################################
  ;##############################################
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; L I N E S ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  For i=0 To nb
    
    ;     glBegin_(#GL_LINES);
    ; 
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    
    glColor4f_(r(i%5),v(i%5),b(i%5),alpha)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    glBegin_(#GL_LINES);glBegin_(#GL_POLYGON)
    
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    
    glColor4f_(r(i%5),v(i%5),b(i%5),alpha)
    
    
    glVertex2f_(ddw/2+sph_xx(i)+Cos(0+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(0+sph_r(i))*rayon(i));
    glVertex2f_(ddw/2+sph_xx(i)+Cos(angle.f+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(angle.f+sph_r(i))*rayon(i));
    glEnd_()
    ; ; ; ; ; ; ; 
    glBegin_(#GL_LINES);glBegin_(#GL_POLYGON)
    
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    
    glColor4f_(r(i%5),v(i%5),b(i%5),alpha)
    
    
    glVertex2f_(ddw/2+sph_xx(i)+Cos(angle.f+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(angle.f+sph_r(i))*rayon(i));
    glVertex2f_(ddw/2+sph_xx(i)+Cos(angle.f*2+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(angle.f*2+sph_r(i))*rayon(i));
    glEnd_()
    ; ; ; ; ; ; ; 
    glBegin_(#GL_LINES);glBegin_(#GL_POLYGON)
    
    glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
    
    glColor4f_(r(i%5),v(i%5),b(i%5),alpha)
    
    
    glVertex2f_(ddw/2+sph_xx(i)+Cos(angle.f*2+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(angle.f*2+sph_r(i))*rayon(i));
    glVertex2f_(ddw/2+sph_xx(i)+Cos(0+sph_r(i))*rayon(i),ddh/2+sph_yy(i)+Sin(0+sph_r(i))*rayon(i))                ;
    glEnd_()
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    sph_x1(i)+sph_x11(i);0.00951
    sph_y1(i)+sph_y11(i);(50+Random(50))/10000;0.00732
    
    sph_x2(i)+sph_x21(i);(50+Random(50))/10000;0.00621
    sph_y2(i)+sph_y21(i);(50+Random(50))/10000;0.01
    
    sph_x3(i)+sph_x31(i);0.00951
    sph_y3(i)+sph_y31(i);(50+Random(50))/10000;0.00732
    
    sph_x4(i)+sph_x41(i);(50+Random(50))/10000;0.00621
    sph_y4(i)+sph_y41(i);(50+Random(50))/10000;0.01
    
    sph_xx(i)+sph_xx2(i);(50+Random(50))/10000;0.00621
    sph_yy(i)+sph_yy2(i);(50+Random(50))/10000;0.01
  Next
  
  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  
ForEver




Procedure Render()
  
  ;Clearing buffers and resetting clear color to remove old graphics from the last frame.
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  ;  glClearColor_(0.2, 0.2, 0.2, 1.0)
  glClearColor_(0,0,0,1)
  
  ;## DRAWING TEXTURES/IMAGES
  ;First enable the Texture system.
  glEnable_(#GL_TEXTURE_2D)
  
  ;This procedure will create a quad and apply a texture to it.
  ;The Texture variable contains the texture created earlier using SetupGLTexture().
  Render2DQuad(Texture1, 0, 0, ImageWidth(Image1), ImageHeight(Image1), -2)
  ; Render2DQuad(Texture2, 0, 0, ImageWidth(Image2), ImageHeight(Image2), -1)
  
  ;After all the textures have been displayed disable the texture system.
  ;Otherwise it will conflict with the non texture graphics.
  glDisable_(#GL_TEXTURE_2D)
  
EndProcedure

Procedure Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
  
  ;The texture is first bound which tells OpenGL to use this texture for any future rendering.
  glBindTexture_(#GL_TEXTURE_2D, OGLTexture)
  glBegin_(#GL_QUADS)
  glColor4f_   (1,1,1,1)
  glNormal3f_  (0,0,1.0)
  glTexCoord2f_(1.0,1.0)
  glVertex3f_  (StartX+Width,StartY,Z)
  glTexCoord2f_(0.0,1.0)
  glVertex3f_  (StartX,StartY,Z)
  glTexCoord2f_(0.0,0.0)
  glVertex3f_  (StartX,StartY+Height,Z)
  glTexCoord2f_(1.0,0.0)
  glVertex3f_  (StartX+Width,StartY+Height,Z)
  glEnd_()
  
EndProcedure

Procedure SetupOpenGL()
  
  glMatrixMode_(#GL_PROJECTION)
  
  glOrtho_(0.0, WindowDim\X, WindowDim\Y, 0.0, -1000.0, 1000.0)
  
  glMatrixMode_(#GL_MODELVIEW)
  
  ; glEnable_(#GL_DEPTH_TEST)
  
  glEnable_(#GL_BLEND)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
  
EndProcedure



Dernière modification par SPH le ven. 19/août/2022 22:26, modifié 1 fois.

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Picasso SPH

Message par threedslider »

SPH a écrit : ven. 15/juil./2022 11:23 En PB, on peux PRESQUE tout faire mais de la à dire qu'il est plus rapide que le C, je ne m'avancerais pas. :P
et
SPH a écrit : ven. 15/juil./2022 11:23 Ha !

Peut être que tu parlais du temps qu'il faut pour écrire un code en PB par rapport au C/C++ !
Dans ce cas, oui, tout est relatif mais je pense que c'est plus rapide et moins dur.
Ben je dirais les deux ! Très court en programmation Purebasic ça c'est vrai et la vitesse crois moi c'est incroyablement rapide que C/C++ qui est déjà rapide mais comme par exemple l'arbre fractale que j'ai fait Purebasic dessine de manière "instantanée" que C++ pareil mais plus lent avec l'API win32 il se met 8 à 10 seconde à dessiner l'arbre !! Et encore quand on déplace la fenêtre il se redessine en quelques secondes encore!! Dans Purebasic non c'est temps réel... 8O
SPH a écrit : ven. 15/juil./2022 11:23 En tout cas, bienvenue dans la famille PB :wink:
Merci je me considère encore nouveau avec le monde de Purebasic depuis quelque temps, une fois maitrisé après on peut faire ce qu'on veut :)
J'ai hâte de vous partager mes créations aussi bien :wink:
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Picasso SPH

Message par threedslider »

@SPH ton dernier code est pas mal aussi ! Thx !!
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Picasso SPH

Message par SPH »

Dites moi tous : je cherche le fichier de l'OpenGL (dll ou autre) qui décide d'augmenter l'intensité de la couleur d'un pixel et le bloquer une fois qu'il a atteint sa couleur max.
Je voudrais reprogrammer cette partie pour faire redevenir d'un point blanc (RGBA(255,255,255,255) la couleur noire !
Le tout, en opengl. J'ai un effet special a faire en PB.

Merci

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre