PureBasic

Forums PureBasic
Nous sommes le Mar 26/Jan/2021 23:37

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 23 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message: Re: Les polygones
MessagePosté: Lun 23/Nov/2020 18:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6926
Localisation: IDF (Yvelines)
@SPH : Tu comptes en faire quoi de tes polygones ?

_________________

➽ Config PureBasic : Windows 10 Version 64 Bits - DirectX 11 - PB 5.72

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Lun 23/Nov/2020 20:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6926
Localisation: IDF (Yvelines)
Une alternative à OpenGL avec les API Windows.

Le code qui va suivre peut fonctionner dans une fenêtre classique ou dans une fenêtre 2D ou dans un sprite transparent.

Principe :
- Déclarer les points de ton polygone dans une table,
- Récupérer le contexte graphique du dessin,
- Déclarer une brosse de couleur,
- Sélectionner le contexte graphique et la brosse,
- Dessiner le polygone.

Le code dans sa plus simple expression :wink:
Code:
EnableExplicit

; Contexte graphique et brosse
Global HDC, Brush

; Points x, y du polygone
Global Dim Points.l(8)
; Premier point
Points(0)=100 ;X
Points(1)=100 ;y

; Second point
Points(2)=280 ;X
Points(3)=150 ;y

; Troisiéme point
Points(4)=400 ;X
Points(5)=400 ;y

; Quatriéme point
Points(6)=100 ;X
Points(7)=300 ;y

; Fenetre et ecran graphique 2D
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "Dessin d'un polygone",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
ClearScreen(RGB(255, 255, 255))

; Récupération du contexte graphique
HDC = StartDrawing(ScreenOutput())

; Création du brosse de couleur
Brush = CreateSolidBrush_(RGB(154, 205, 50))

; Sélection du contexte graphique et de la brosse que nous allons utiliser
SelectObject_(HDC, Brush)

; Dessin du polygone de quatre points
Polygon_(HDC, @Points(), 4)

StopDrawing()

; Loop : N'importe quelle touche pour quitter
Repeat : Until WaitWindowEvent() = #WM_CHAR
Qu'il est beau le polygone :mrgreen:

_________________

➽ Config PureBasic : Windows 10 Version 64 Bits - DirectX 11 - PB 5.72

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Lun 23/Nov/2020 21:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4287
Interessant :!:

:lol:

Falsam : reste que je choisirais l'affichage des polygones le plus rapide... (je testerais demain) :idea:

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.73LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Mar 24/Nov/2020 13:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2174
ou bien ma version "Old School"

ici j'augmente le nombre de coté du polygone en meme temps qu'il tourne :)

le polygone est mis en Procedure , ainsi qu'une procedure pour le remplissage couleur :)

l'avantage de ma procedure, c'est que tu peux donner un angle a ton polygone :)

Code:

;code Dobro
; mis en Purebasic 4.20
#dobro=1
#Police=1
#Sprite=1
; #PI=3.1415926
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l)
Declare  remplis(*hdc,x,y,couleur_remplissage)
; ***********************************
resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
      WindowID = OpenWindow(1, 0, 0, EcranX, EcranY,  "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
     
      WindowID = WindowID(1)
      ecran= OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0)
      resultat = InitMouse()
     
      Repeat
            ExamineMouse()
            Event=WindowEvent()
            If MouseButton(2)
                  End
            EndIf
           
           
            x.l=400 ;location x
            y.l=300 ; location y
            taille.l=300
            angle.l=3 ; pour un triangle  4 pour un carre , 8 pour un octogone ect ...
            rotation.f=180
           
           
            For tp=0 To 360
                  ; Delay (200)
                  r=1 ; remplis ou pas !!
                  rotation.f=tp
                  color.l=RGB($FF,$FF,$FF) ; couleur du tour$
                  coul_remp.l=RGB($F9,$FE,$8B) ; couleur du remplissage !
                 
                  c=c+1
                  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r,coul_remp.l)
                  If c=50
                        angle.l=angle+1
                        If angle>10: angle=3:EndIf
                        c=0
                  EndIf
                  FlipBuffers():; affiche l'ecran
                  ClearScreen(RGB(0,0,0))
                  ExamineMouse()
                  Event=WindowEvent()
                  If MouseButton(2)
                        End
                  EndIf
            Next tp
      Until Event=#PB_Event_CloseWindow
     
     
     
     
      Procedure  polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l) 
      ;by Dobro
            rotation.f= rotation.f*0.01745329
            Alpha.f=2*(#PI/angle)
            For t.l=1 To angle
                  d1.f=(t-1)*Alpha+rotation.f
                  d3.f=t*Alpha+rotation.f
                  *dc=StartDrawing(ScreenOutput() )
                        DrawingMode(4)
                        LineXY(x+taille*Sin(d1),y+taille*Cos(d1),x+taille*Sin(d3),y+taille*Cos(d3),color.l); polygone vide 
                  StopDrawing()
            Next t
            If r=1
                  *dc=StartDrawing(ScreenOutput() )
                        DrawingMode(4) 
                        remplis(*dc,x,y,coul_remp.l )
                  StopDrawing()
            EndIf
      EndProcedure
     
     
      Procedure remplis(*hdc,x,y,couleur_remplissage)
             ;by Dobro
            pinceau=CreateSolidBrush_(couleur_remplissage)
            SelectObject_(*hdc,pinceau)
            ExtFloodFill_(*hdc,x,y,GetPixel_(*hdc,x,y),#FLOODFILLSURFACE)
            DeleteObject_(pinceau)
            ReleaseDC_(WindowID(1),*hdc)
      EndProcedure
     
     

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Mar 24/Nov/2020 18:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4287
Merci zorro,

je le mettrais aussi a l'epreuve de la vitesse :wink:

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.73LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Mer 25/Nov/2020 16:40 
Hors ligne

Inscription: Jeu 14/Mai/2020 7:40
Messages: 54
voici une méthode que j'utilisais sous blitz3d
apparemment, ça a l'air de marcher aussi avec purebasic

version ou chaque polygone est une "entity"
version plus simple mais plus lente

Code:
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
 
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
 
  InitSprite()
  InitKeyboard()
  InitMouse()
 
 
  OpenWindow(1, 0, 0, 200, 100, "",  #PB_Window_SystemMenu)
 
 
  If Screen3DRequester()
   
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    SetMaterialColor(0, #PB_Material_AmbientColor, -1)
   
    tt=0
    For y=-10000 To 10000 Step 250
      For x=-15000 To 15000 Step 250
        Couleur=Random($ffffff,$7f7f7f)
          CreateMesh(tt)
          MeshVertexPosition(-100, 100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100, 100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100, -100, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(-100, -100, z)
          MeshVertexColor(Couleur)
          MeshFace(2, 3, 0)
          MeshFace(0, 1, 2)
          FinishMesh(#True)
   
        CreateEntity(tt, MeshID(tt), MaterialID(0))
        EntityLookAt(tt,0,0,1)
        MoveEntity(tt,x,y,0)
        tt=tt+1
        ;If tt>=100000 : Break :EndIf
      Next 
    Next

 
   
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 30000, #PB_Absolute)
   
   
    Repeat
      t=ElapsedMilliseconds()
      Screen3DEvents()
      ;For i=0 To tt-1
        ;RotateEntity(i, 0, 0, 1, #PB_Relative)
      ;Next
     
      RenderWorld()
      Screen3DStats()     
      FlipBuffers()
      t=ElapsedMilliseconds()-t
      StartDrawing(WindowOutput(1))
      DrawText(5,5,Str(tt)+" entity")
      DrawText(5,25,Str(t)+"      ")
      StopDrawing()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
 
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End






version avec une seule 'intity'

Code:
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
 
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
 
  InitSprite()
  InitKeyboard()
  InitMouse()
  OpenWindow(1, 0, 0, 200, 100, "",  #PB_Window_SystemMenu)
 
  If Screen3DRequester()
   
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    SetMaterialColor(0, #PB_Material_AmbientColor, -1)
   
    z=0
    tt=0
    CreateMesh(tt)
    For y=-12000 To 12000 Step 250
      For x=-16000 To 16000 Step 250
        Couleur=Random($ffffff,$7f7f7f)   
          MeshVertexPosition(-100+x, 100+y, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100+x, 100+y , z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(100+x, -100+y, z)
          MeshVertexColor(Couleur)
          MeshVertexPosition(-100+x, -100+y, z)
          MeshVertexColor(Couleur)
          MeshFace(2+tt, 3+tt, 0+tt)
          MeshFace(0+tt, 1+tt, 2+tt)
          tt=tt+4
        Next
      Next

      FinishMesh(#True)
        CreateEntity(0, MeshID(0), MaterialID(0))
        EntityLookAt(0,0,0,1)
        ;MoveEntity(tt,x,y,0)
        tt=tt+1
        ;If tt>=100 : Break :EndIf
      ;Next 
    ;Next
  Debug Str(tt)+" entity"

   
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 30000, #PB_Absolute)
   
    Repeat
      t=ElapsedMilliseconds()
      Screen3DEvents()
      ;For i=0 To tt-1
       ;RotateEntity(0, 0, 0, 1, #PB_Relative)
      ;Next
     
      RenderWorld()
      Screen3DStats()     
      FlipBuffers()
      t=ElapsedMilliseconds()-t
      StartDrawing(WindowOutput(1))
      DrawText(5,5,Str(tt/4)+" entity")
      DrawText(5,25,Str(t)+"      ")
      StopDrawing()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
 
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Ven 27/Nov/2020 15:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6926
Localisation: IDF (Yvelines)
@SPH : Je me suis encore pencher sur tes polygones.

Tu voulais faire un test sur 100.000 polygones.

Avec ma méthode c'est bien trop long. La méthode la plus rapide me semble être effectivement OpenGL.

Avec ce code j'affiche 100.000 polygones.
- Couleur aléatoire.
- Transparence aléatoire.
- Position aléatoire.
Code:
Procedure.f RandomFloat(Maximum.f = 1.0, Minimum.f=0.0)
  ProcedureReturn (Maximum-Minimum) * 4.6566128752457969241e-10 * Random(2147483647) + Minimum 
EndProcedure

If OpenWindow(0,0,0,1280,800,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
  If OpenGLGadget(1,0,0,1280,800)
   
    ; Volume de visualisation
    glMatrixMode_(#GL_PROJECTION)
    glOrtho_(0, 1280, 800, 0, -1, 1)
   
    ; Activation de la transparence
    glEnable_(#GL_BLEND)
    glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
   
    timer=ElapsedMilliseconds()
   
    For n = 1 To 100000
      x = Random(1280)
      y = Random(800)
     
      glColor4f_(RandomFloat(), RandomFloat(), RandomFloat(), RandomFloat(1, 0.1))
     
      glBegin_(#GL_POLYGON)
      glVertex2f_(x, y)
      glVertex2f_(x+100, y+100)
      glVertex2f_(x + 50, y + 150)
      glEnd_()     
    Next   
   
    ; Flip
    SetGadgetAttribute(1, #PB_OpenGL_FlipBuffers, #True)
    timer=ElapsedMilliseconds()-timer
    Debug timer
   
  EndIf
  Repeat : Until WaitWindowEvent() = #WM_CHAR
EndIf
Sur un Intel i3 j'affiche 160 ms.

:arrow: N'importe quelle touche pour quitter l'exécution.

:!: La remarque désagréable : Je pense que le jeu que tu souhaites créer (La suite de Another World) n'utilisera pas 100.000 polygones simultanément. Te lancer dans ce type de jeu avec une connaissance faible en OpenGL me parait compliquer et vouer à l'échec.

Pense à la gestion des sprites de PureBasic.

_________________

➽ Config PureBasic : Windows 10 Version 64 Bits - DirectX 11 - PB 5.72

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Les polygones
MessagePosté: Ven 27/Nov/2020 16:52 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4287
Citation:
La remarque désagréable : Je pense que le jeu que tu souhaites créer (La suite de Another World) n'utilisera pas 100.000 polygones simultanément. Te lancer dans ce type de jeu avec une connaissance faible en OpenGL me parait compliquer et vouer à l'échec.

Je n'ai jamais dis que je ferais un jeu avec 100000 polygones. J'ai testé la rapidité de l'affichage de polygones en en appliquant 100000. C'est pas pareil.
Le test de rapidité utilise 100000 polygones et une fois que ce test a reussi pour l'opengl, j'utiliserais cette methode (l'opengl) pour en faire un jeu (enfin, dans un second temps car en premier, je vais faire une ou deux anims)

_________________
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.73LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 23 messages ]  Aller à la page Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 10 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye