Performance d'un jeu en 2D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ai Modif mon post...
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

djes a écrit :
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 :) !!
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à!
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.
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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Buckethead

Mh... Teste mon dernier code, stp, et donne tes impressions. Aussi, poste un code sans te prendre la tête ou ça marche le mieux chez toi pour que l'on comprenne le binz!!!

[Edit]Et quelle version tu as?

Ollivier
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

djes a écrit :
Dr. 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...
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 0 ;) (-hum- j'en serais bien incapable)
Je parle de démos codées avec uniquement des entiers avec utilisation des tables de sinus entiers (etc...) pour un rendu hard XD

Je ne remet certainement pas en question les démos techniques actuelles...
Dobro a écrit :@Dri :
oui, meme qu'un Clearscreen(X,Y,Larg,Haut) serai un vrais plus dans le purebasic !!
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 ?

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
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

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()
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@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
Buckethead
Messages : 122
Inscription : jeu. 27/sept./2007 20:25

Message par Buckethead »

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().
Dernière modification par Buckethead le dim. 22/mars/2009 18:41, modifié 3 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@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 :lol:

Code : Tout sélectionner

StartXXX
  yyy
StopXXX
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...

Code : Tout sélectionner

If StartXXX
  yyy
  StopXXX
EndIF
Dri
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

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 )

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
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 :lol:
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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui tu as raison :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Dr Dri @Buckethead

Bon, j'ai fait une zone de réparation (sujet Parallaxe), mais savez-vous pourquoi dans CE sujet, ça fait trois pages que j'ai dit que le débat était clos?!?

Ollivier
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ollivier a écrit :, mais savez-vous pourquoi dans CE sujet, ça fait trois pages que j'ai dit que le débat était clos?!?

Ollivier
que veux tu dire ??

que parceque tu le decrete, on dois tous se plier a ta volonté ? 8O

je ne trouve pas que le debat est clos !!
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

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...

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
;}
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Dobro

Des questions techeniques à ce sujet ?

(Woilà pourquoi, pour moi ce débat est clos depuis 3 pages :D :D :D )

Ollivier
Répondre