Performance d'un jeu en 2D
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
J'aimerais essayer la version smartsynchro si tu pouvais la compiler. Ca me met une erreur (#PB_Screen_SmartSynchronization constant not found) j'ai une vielle version de PureBasic.djes a écrit :Pas fluide du tout chez moi. Le code le plus fluide est avec la smartsynchro : le haut est parfaitement fluide, en dessous, sur une centaine de pixels c'est hachuré (sur un écran CRT). On voit que la synchro est au timer, et que le double-buffer est swappé là!Dobro a écrit :le code ou j'obtiens la meilleur fluidité
c'est celui ci parceque je commence par un setframerate(50)
avant la boucle!!
Pour le refresh rate, il suffit qu'il soit égal à celui de mon écran pour que ça soit bien fluide. Avec le flipbuffers(1) ou d'autres fréquences, ce n'est jamais aussi fluide. Faudrait que j'essaye sur un écran plat.
Je parle de démos codées avec uniquement des entiers avec utilisation des tables de sinus entiers (etc...) pour un rendu hard XDdjes a écrit :Non, mais on peut encore faire des démos, même techniques! Rien n'empêche de dépasser les limites de Windows, en faisant une démo en ring 0Dr. Dri a écrit :Tout ça pour dire qu'on est plus à l'époque des démos techniques d'affichage d'effet plasma qu'on fait tourner sur un bon vieux DOS avec en sortie un VGA de 320x200...(-hum- j'en serais bien incapable)
Je ne remet certainement pas en question les démos techniques actuelles...
Tu tombes justement dans un autre piège. Si tu sais quelle zone [x,y,w,h] tu dois redessiner, pourquoi l'écraser avant de la re-redessiner ?Dobro a écrit :@Dri :
oui, meme qu'un Clearscreen(X,Y,Larg,Haut) serai un vrais plus dans le purebasic !!
Pour le fonctionnement de windows, il me semble que l'API win32 propose quelque chose comme InvalidateRect (vieux souvenirs) pour marquer une zone comme étant "à redessiner". Ceux qui ont déjà utilisé la structure Rect et qui ont quelques notions d'anglais doivent comprendre le rôle de cette fonction.
Je crois que la plupart des moteurs 3D font pareil, ils invalident tous les éléments qui ont changé d'état et les redessinent le cas échéant. Mais mon exploration de cette voie a été brève et je n'ai jamais réellement creusé. Mais de mémoire j'ai pu constater que des scènes remplies de milliers de polygones enregistraient une baisse de FPS uniquement quand la caméra était en mouvement... A l'arrêt on pouvait avoir autant de polygones qu'on voulait, le FPS remontait à 60.
De la même manière, les moteurs 3D ne font pas de ClearScreen, on s'en rend compte quand on se retrouve dans une zone "ouverte" sans image ou décor de fond. L'affichage scintille et est pollué par ce qui sont visiblement les restes du back buffer. Je me rappelle l'avoir constaté avec DarkBasic, lorsqu'on ne défini pas de background color (de mémoire) et avec Counter Strike quand en mode fantôme on se balade hors des limites de la map.
Mon opinion c'est que ClearScreen est pratique d'un point de vue débutant mais qu'au niveau des perfs c'est vraiment trop gourmand. Et un ClearScreen partiel serait selon moi une perte de ressources identique. Surtout que ça consomme d'autant plus que la résolution est élevée. Donc plus les machines sont puissantes, plus le boulet qu'on traîne est lourd!
Dri
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
Ollivier:
v4.02, structure not found ligne 91
Pour ce qui est du fullscreen, je n'ai pas de problème. C'est relativement fluide, peu importe le type d'animation et son algo, du moment que la machine le permet.
Avec un Delay(1) qui libère bien sans que ca se remarque dans cette relative fluidité. (pas stable à 100%) Avant je le placais mal, merci Dobro :p J'avais écrit le code en 2minute à 3 H du matin, et je n'utilisais pas Delay() jusqu'à là.
J'ai beau avoir vu des centaines de starfield 2D, ils souffrent tous de frame drop sous Windows. Je ne cherche pas obtenir meilleur en fullscreen. C'est injouable.
Par contre j'aimerais faire des animations en fenêtre, c'est déjà moins fluide (ou plutot "stable") qu'en fullscreen, et là le moindre Delay() gache tout sur mon systeme. C'est pourtant dans ce mode qu'il faudrait avoir un Delay()
v4.02, structure not found ligne 91
Pour ce qui est du fullscreen, je n'ai pas de problème. C'est relativement fluide, peu importe le type d'animation et son algo, du moment que la machine le permet.
Avec un Delay(1) qui libère bien sans que ca se remarque dans cette relative fluidité. (pas stable à 100%) Avant je le placais mal, merci Dobro :p J'avais écrit le code en 2minute à 3 H du matin, et je n'utilisais pas Delay() jusqu'à là.
J'ai beau avoir vu des centaines de starfield 2D, ils souffrent tous de frame drop sous Windows. Je ne cherche pas obtenir meilleur en fullscreen. C'est injouable.
Par contre j'aimerais faire des animations en fenêtre, c'est déjà moins fluide (ou plutot "stable") qu'en fullscreen, et là le moindre Delay() gache tout sur mon systeme. C'est pourtant dans ce mode qu'il faudrait avoir un Delay()
@Buckethead
Peux-tu m'écrire la ligne 91, parce que je tombe sur "Clic & 3". Je vois très mal un problème de structure en cette ligne.
Aussi j'ai copié le code sur un autre sujet (Débutant >> Parallaxe - Test de code), parce que ce sujet-ci engloutit les codes sous les discours!
Enfin, si tu pouvais disposer de la dernière version EN PLUS de ta version, ben n'hésite pas...
@Dr Dri
Ne t'inquiète pas pour le ClearScreen(), Dobro a eu l'honneur de voir son code modifié sans le ClearScreen() qui pour moi, n'est utile qu'en départ de projet.
Ollivier
Peux-tu m'écrire la ligne 91, parce que je tombe sur "Clic & 3". Je vois très mal un problème de structure en cette ligne.
Aussi j'ai copié le code sur un autre sujet (Débutant >> Parallaxe - Test de code), parce que ce sujet-ci engloutit les codes sous les discours!
Enfin, si tu pouvais disposer de la dernière version EN PLUS de ta version, ben n'hésite pas...
@Dr Dri
Ne t'inquiète pas pour le ClearScreen(), Dobro a eu l'honneur de voir son code modifié sans le ClearScreen() qui pour moi, n'est utile qu'en départ de projet.
Ollivier
-
- Messages : 122
- Inscription : jeu. 27/sept./2007 20:25
ligne 90, j'avais laissé un blanc , "Structure not found: I"
Clic.I + 1
au passage http://www.purebasic.fr/english/viewtop ... 96af66e8c0 ...
Edit: les gens trouvent que ton exemple est parfaitement fluide, hors ca ne peut être parfait sous Windows. Ensuite il y a ceux qui pensent que c'est une question d'optimisation de l'affichage & calcul des étoiles. Ce n'est qu'une question de synchronisation sur un proc à 3 GHz pour un simple starfield, même fait de box() et de clearscreen().
Clic.I + 1
au passage http://www.purebasic.fr/english/viewtop ... 96af66e8c0 ...
Edit: les gens trouvent que ton exemple est parfaitement fluide, hors ca ne peut être parfait sous Windows. Ensuite il y a ceux qui pensent que c'est une question d'optimisation de l'affichage & calcul des étoiles. Ce n'est qu'une question de synchronisation sur un proc à 3 GHz pour un simple starfield, même fait de box() et de clearscreen().
Dernière modification par Buckethead le dim. 22/mars/2009 18:41, modifié 3 fois.
@Ollivier
Effectivement je ne l'ai pas vu, faut dire que je ne vais pas recoder en pure tout de suite donc je ne teste pas les codes. Je ne les lit pas non plus s'ils sont trop longs.
D'ailleurs je vois encore des choses horribles
On est jamais à l'abri d'un échec d'une fonction Start de PB (je met au défi quiconque de me prouver le contraire). J'ai tendance à vérifier ces éventuels échecs...
Dri
Effectivement je ne l'ai pas vu, faut dire que je ne vais pas recoder en pure tout de suite donc je ne teste pas les codes. Je ne les lit pas non plus s'ils sont trop longs.
D'ailleurs je vois encore des choses horribles

Code : Tout sélectionner
StartXXX
yyy
StopXXX
Code : Tout sélectionner
If StartXXX
yyy
StopXXX
EndIF
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
Dobro, tu as laissé un code, pensant que SetFrameRate(50) était la solution, mais non. A force de tester en mode plein écran et mode fenêtre, on s'enmele les pinceaux 
plein écran: FlipBuffers(#PB_Screen_WaitSynchronization )
avec pb4.40beta3, ce code de Dobro est fluide, que l'on choisisse FlipBuffers(#PB_Screen_WaitSynchronization ) ou FlipBuffers ( #PB_Screen_SmartSynchronization ), cela ne fait plus de différence.
c'est rigolo
Alors, s'agit-il d'un bug, ou pas ?
ps: ne comptez par sur moi pour tenter d'expliquer ce nouveau phénomène dans Bug reports avec mon anglais approximatif.

plein écran: FlipBuffers(#PB_Screen_WaitSynchronization )
Code : Tout sélectionner
;-code Dobro plein ecran
Structure sprite
x.l
y.l
vitesse.l
EndStructure
nbr_sprite=1000
Dim sprite.sprite(nbr_sprite)
; Test
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
InitSprite(): InitKeyboard()
;hwnd=OpenWindow(1,0,0,EcranX,EcranY,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget )
OpenScreen (EcranX,EcranY,32,"Test")
; *********** prepare les parametres de chaque sprite *****************
For t=0 To nbr_sprite
sprite(t)\x = Random(EcranX)+1
sprite(t)\y= Random(EcranY)+1
sprite(t)\vitesse=Random(4)+1
CreateSprite(t, sprite(t)\vitesse, sprite(t)\vitesse)
; dessine le sprite
StartDrawing(SpriteOutput(t))
Box(0,0, sprite(t)\vitesse, sprite(t)\vitesse,RGB(Random(100)+100,Random(100)+100,Random(100)+100))
StopDrawing()
Next t
; ***************************************************************
;SetFrameRate(50) ; inutile en mode plein écran
Repeat
go= ElapsedMilliseconds()
For t= 0 To nbr_sprite
DisplaySprite(t,sprite(t)\x,sprite(t)\y)
sprite(t)\x=sprite(t)\x+sprite(t)\vitesse
If sprite(t)\x>EcranX
sprite(t)\x=0
EndIf
Next t
temps=ElapsedMilliseconds()-go
StartDrawing(ScreenOutput())
DrawText(10,10,"Temps: "+Str(temps))
StopDrawing()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
FlipBuffers(#PB_Screen_WaitSynchronization ) ;- plein écran
;FlipBuffers ( #PB_Screen_SmartSynchronization ) ; <- avec lui en plein écran, çà va saccader
ClearScreen(0)
Delay(2)
ForEver
c'est rigolo

Alors, s'agit-il d'un bug, ou pas ?
ps: ne comptez par sur moi pour tenter d'expliquer ce nouveau phénomène dans Bug reports avec mon anglais approximatif.
Dernière modification par beauregard le dim. 04/oct./2009 9:18, modifié 1 fois.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
Tout çà n'est pas inutile, puisque l'avis du docteur sur ClearScreen est pertinente:
Dr. Dri a écrit :Mon opinion c'est que ClearScreen est pratique d'un point de vue débutant mais qu'au niveau des perfs c'est vraiment trop gourmand. Et un ClearScreen partiel serait selon moi une perte de ressources identique. Surtout que ça consomme d'autant plus que la résolution est élevée. Donc plus les machines sont puissantes, plus le boulet qu'on traîne est lourd!Dri
Oui, enfin Doc Dri se la sent un peu!
@Dr Dri
Mon pote, ma tasse de thé adorée... (attention à ne pas confondre, j'aime les femmes, même si ça fait deux que j'ai du mal... Jusqu'à mon dernier souffle, j'aimerai les femmes!). Mon ami de ce forum, et d'autre encore...
Revient ici! Sous PB!
Viens faire un bisou à Comtois qui nous offre des petits allumettes pour démarrer des petites fusées.
En n'oubliant pas de rajouter le mot directx9 dans le champ sous-système des options de ton compilateur, dans le menu compilateur...
@Dr Dri
Mon pote, ma tasse de thé adorée... (attention à ne pas confondre, j'aime les femmes, même si ça fait deux que j'ai du mal... Jusqu'à mon dernier souffle, j'aimerai les femmes!). Mon ami de ce forum, et d'autre encore...
Revient ici! Sous PB!
Viens faire un bisou à Comtois qui nous offre des petits allumettes pour démarrer des petites fusées.
En n'oubliant pas de rajouter le mot directx9 dans le champ sous-système des options de ton compilateur, dans le menu compilateur...
Code : Tout sélectionner
;PB 4.30 le 10/01/09 (Comtois)
; Génétiquement modifié pour faire du parallaxe
; par Ollivier pour les intimes
; Cherchez la fonction ScrollMaterial() sur les forum
; D'accord !?!?!
; \\_
; >:D
; //¯
Global Full.I = 1 ; 1 = FullScreen, c'est comme la boîte
; auto : ça marche tout seul...
InitEngine3D()
InitSprite()
InitKeyboard()
;Pour enregistrer au format PNG
UsePNGImageEncoder()
ExamineDesktops()
EcrL = DesktopWidth(0)
EcrH = DesktopHeight(0)
EcrP = DesktopDepth(0)
If Full
OpenScreen(EcrL, EcrH, EcrP, "Tutoriel 3D")
Else
OpenWindow(0, 0, 0, EcrL, EcrH, "DX9ParalX", $80000000)
OpenWindowedScreen(WindowID(0), 0, 0, EcrL, EcrH, 0, 0, 0)
EndIf
;Pour charger une texture, mesh, entity , etc, indiquer le chemin où se trouvent ces médias
Add3DArchive("/", #PB_3DArchive_FileSystem)
Global ScrollX.F
Global ScrollY.F
Global AngleTeta.F
Global Coef.F
Enumeration
#VueDessus
#VueArriere
#VueCote
#VueAvant
EndEnumeration
Global Angle.f, Vitesse.f
Define.l Options, ModeCamera, i
ModeCamera = #VueDessus
Macro NEW_X(x, Angle, Distance)
((x) + Cos((Angle) * 0.0174533) * (Distance))
EndMacro
Macro NEW_Z(z, Angle, Distance)
((z) - Sin((Angle) * 0.0174533) * (Distance))
EndMacro
;- Declaration des procédures
Declare.f CurveValue(actuelle.f, Cible.f, P.f)
Declare GestionCamera(Mode.l)
;-Mesh
#Mesh = 0
CreateMesh(#Mesh, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate
SetMeshData(#Mesh, Options , ?Sommets, 24)
SetMeshData(#Mesh, #PB_Mesh_Face, ?Triangles, 12)
;-Textures
#Texture = 0
CreateImage(#Texture, 64, 64)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#Texture))
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), $FFFFFF)
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), 0)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP1.PNG"
SaveImage(#Texture, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#Texture, Fichier$)
#TextureSol = 1
CreateImage(#TextureSol, 256, 256)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#TextureSol))
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $0)
For I = 0 To 1000
Plot(Random(255), Random(255), RGB(Random(255), Random(255), Random(255) ) )
Next I
;For i = 0 To 127 Step 10
; Line(i, 0, 0, ImageHeight(#TextureSol), $0000FF)
; Line(0, i, ImageWidth(#TextureSol), 0, $0000FF)
;Next i
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $000088)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP2.PNG"
SaveImage(#TextureSol, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#TextureSol, Fichier$)
;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))
#MatiereSol = 1
CreateMaterial(#MatiereSol, TextureID(#TextureSol))
For I = 1 To 3
AddMaterialLayer(#MatiereSol, TextureID(#TextureSol), #PB_Material_Replace)
Next I
;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
ScaleEntity(#Entity, 10, 10, 10) ; Agrandi l'entity
EntityLocate(#Entity, 500, 5, 500)
#EntitySol = 1
CreateEntity(#EntitySol, MeshID(#Mesh), MaterialID(#MatiereSol))
ScaleEntity(#EntitySol, 1000, 2, 1000) ; Agrandi l'entity
EntityLocate(#EntitySol, 500, -50, 500)
;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0, 100, 100)
;-Light
AmbientColor(RGB(55,55,55)) ; Réduit la lumière ambiante pour mieux voir les lumières
#LightRouge = 0 : CreateLight(#LightRouge,RGB(255, 0, 0), 0, 500, 0)
#LightBleue = 1 : CreateLight(#LightBleue,RGB(0, 0, 255), 0, 500, 1000)
#LightVerte = 2 : CreateLight(#LightVerte,RGB(0, 255, 0), 1000, 500, 1000)
;- Sprite pour afficher l'aide
Procedure SpriteText(Text.S)
CreateSprite(64000, 256, 24)
StartDrawing(SpriteOutput(64000) )
DrawText(0, 0, Text, #White, #Black)
StopDrawing()
EndProcedure
;- Petit échauffement pour éviter un claquage...
SpriteText("Voici l'environnement de travail...")
For i = 0 To 1 << 8
ExamineKeyboard()
FrameRate = Engine3DFrameRate(#PB_Engine3D_Current)
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
RenderWorld()
DisplayTransparentSprite(64000, 0, 0)
FlipBuffers()
Next
;FreeSprite(64000)
;- Démarrage
CameraLocate(#Camera, 500, 500, 500)
RotateCamera(#Camera, 270, 270, 0)
Repeat
Delay(1) ; On prévient Windows qu'on est cool
If Full = 0
WindowEvent()
EndIf
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
ScrollX - 0.002
ElseIf KeyboardPushed(#PB_Key_Right)
ScrollX + 0.002
EndIf
If KeyboardPushed(#PB_Key_Up)
ScrollY + 0.002
ElseIf KeyboardPushed(#PB_Key_Down)
ScrollY - 0.002
EndIf
EndIf
For I = 0 To 3
Coef = 1.0 / (1 + I)
ScrollMaterial(#MatiereSol, ScrollX / Coef, ScrollY / Coef, #PB_Material_Fixed, I)
Next I
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
FreeSprite(64000)
Procedure.f CurveValue(actuelle.f, Cible.f, P.f)
;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
Define.f Delta
Delta = Cible - actuelle
If P > 1000.0 : P = 1000.0 : EndIf
ProcedureReturn (actuelle + ( Delta * P / 1000.0))
EndProcedure
Procedure GestionCamera(Mode.l)
Define.f Px, Py, Pz, Pv
Static AngleCamera.f
Pv = 25 * (60 / Engine3DFrameRate(#PB_Engine3D_Current) )
Select Mode
Case #VueDessus
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 40), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 140, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 40), Pv)
Case #VueArriere
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueCote
AngleCamera = CurveValue(AngleCamera, Angle + 120, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueAvant
AngleCamera = CurveValue(AngleCamera, Angle, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
EndSelect
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
EndProcedure
;{ Définition du cube
DataSection
Sommets:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.L 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.L 0
Data.f 0,1
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.L 0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.L 0
Data.f 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0
Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.L 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.L 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.L 0
Data.f 1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0
Triangles:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22
EndDataSection
;}