Les polygones
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Les polygones
@SPH : Tu comptes en faire quoi de tes polygones ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Les polygones
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 expressionQu'il est beau le polygone
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
Code : Tout sélectionner
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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Les polygones
Interessant
Falsam : reste que je choisirais l'affichage des polygones le plus rapide... (je testerais demain)
Falsam : reste que je choisirais l'affichage des polygones le plus rapide... (je testerais demain)
http://HexaScrabble.com/
!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.00 - 64 bits
!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.00 - 64 bits
Re: Les polygones
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
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 : Tout sélectionner
;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
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: Les polygones
Merci zorro,
je le mettrais aussi a l'epreuve de la vitesse
je le mettrais aussi a l'epreuve de la vitesse
http://HexaScrabble.com/
!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.00 - 64 bits
!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.00 - 64 bits
Re: Les polygones
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
version avec une seule 'intity'
apparemment, ça a l'air de marcher aussi avec purebasic
version ou chaque polygone est une "entity"
version plus simple mais plus lente
Code : Tout sélectionner
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 : Tout sélectionner
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
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Les polygones
@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.Sur un Intel i3 j'affiche 160 ms.
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.
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 : Tout sélectionner
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
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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Les polygones
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.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.
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 ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!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.00 - 64 bits