Page 1 of 1

Ogre - Adaptation from µSoft to Linux

Posted: Wed Mar 25, 2009 11:50 pm
by Ollivier
Hello,

This code below is okay on XP. If anybody could try to modify the slash character (directory symbol on XP) line 74 and test it, it would be nice!

Thank you!

PS: There is a specific bug report if the code fails. Please post it!

Code: Select all

MessageRequester("Message", "Arrow keys to accelerate and turn left or right...")
;PB 4.30
;10/01/09 Substitution de l'instruction TextureOutput (Comtois)
;20/03/09 Test défilement 2D (Ollivier)
;23/03/09 Sécurité de dessin (Dr Dri)
;23/03/09 Chronométrie pour Linux (Cpl.Bator)
;25/03/09 Architecture propre pour débutants (djes)
;___________________________________________________________
;{ Informations initiales
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;___________________________________________________________
;{ Constantes
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#R2D = 180.0 / #PI ; R2D = Conversion Radians/Degrés
Enumeration
#Texture
#TextureSol
EndEnumeration
Enumeration
#Matiere
#MatiereSol
EndEnumeration
Enumeration
#Entity
#EntitySol
EndEnumeration
;}
;___________________________________________________________
;{ Déclaration des procédures
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Declare.S TempPng(n.I)
Declare.S InitSmoothScrolling()
;}
;___________________________________________________________
;{ Structures
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Structure V3D ; Vecteur 3D
   X.F
   Y.F
   Z.F
EndStructure

Structure V2D ; Vecteur 2D
   U.F
   V.F
EndStructure

Structure Sommet
   P.V3D ; Position
   N.V3D ; Normale
   C.L   ; Couleur
   T.V2D ; Texture
EndStructure

Structure Triangle
   A.W
   B.W
   C.W
EndStructure
;}
;___________________________________________________________
;{ Variables globales
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Global PleinEcran.I = 1 ; 1 = FullScreen, 0 = Fenêtré
Global EcranLargeur.I
Global EcranHauteur.I
Global EcranBitsParPixel.I
Global Dim Sommet.Sommet(0)
Global ZI.I
Global XI.I
Global Dim Triangle.Triangle(0)
Global FigCarre.I ; N° de la structure fil de fer carré
Global Camera.I ; N° de la caméra (par défaut : 0)
Global RepertoireCaractere.S = "\"
Global Rapport.S = InitSmoothScrolling()

Global ScrollX.F
Global ScrollY.F
Global AngleTeta.F
Global Coef.F
Global AngleV.F
Global Angle.f, Vitesse.f

If Rapport <> "!Init"
   MessageRequester("Erreur", "Impossible d'initialiser le programme !")
   End
EndIf
;}
;}
;___________________________________________________________
;{ Crée les 2 éléments (Images,textures,matières et entités)
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

; Semblant de vaisseau
If CreateImage(#Texture, 64, 64)
   If 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()
      If SaveImage(#Texture, TempPng(1), #PB_ImagePlugin_PNG)
         FreeImage(#Texture)
         If LoadTexture(#Texture, TempPng(1) )
            If CreateMaterial(#Matiere, TextureID(#Texture))
               ; Crée le semblant de vaisseau
               If CreateEntity(#Entity, MeshID(FigCarre), MaterialID(#Matiere))
                  ; Agrandit et positionne le semblant de vaisseau
                  ScaleEntity(#Entity, 10, 10, 10) ; Agrandit l'entité
                  EntityLocate(#Entity, 500, 100, 500)
                  Rapport + "!E1" ; /!\
               EndIf
            EndIf
         EndIf
      EndIf
   EndIf
EndIf

; Texture du fond étoilé de l'écran
If CreateImage(#TextureSol, 512, 512)
   If StartDrawing(ImageOutput(#TextureSol)) ; On sécurise
      Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $0)
      For I = 0 To 500
         R = Random(127) + 128
         X = Random(511)
         Y = Random(511)
         Plot(X, Y, RGB(R, R, R) )
         For D = 1 To 5
            C = RGB(R / 1 << D, R / 1 << D, R / 1 << D)
            Line((X - D << 1) & 511, (Y) & 511, -2, 1, C)
            Line((X + D << 1) & 511, (Y) & 511, 2, 1, C)
            Line((X) & 511, (Y - D << 1) & 511, 1, -2, C)
            Line((X) & 511, (Y + D << 1) & 511, 1, 2, C)
            For DX = -1 To 1 Step 2
               For DY = -1 To 1 Step 2
                  Plot((X + DX * D) & 511, (Y + DY * D) & 511, C)
               Next DY
            Next DX
         Next D
      Next I
      StopDrawing()
      If SaveImage(#TextureSol, TempPng(2), #PB_ImagePlugin_PNG)
         If LoadTexture(#TextureSol, TempPng(2) )
            If CreateMaterial(#MatiereSol, TextureID(#TextureSol) )
               ; On rajoute 3 autres couches pour le parallaxe
               For I = 1 To 3
                  AddMaterialLayer(#MatiereSol, TextureID(#TextureSol), #PB_Material_Replace)
               Next I
               ; Crée le fond étoilé
               If CreateEntity(#EntitySol, MeshID(FigCarre), MaterialID(#MatiereSol) )
                  ; Agrandit et positionne le fond étoilé
                  ScaleEntity(#EntitySol, 1000, 2, 1000)
                  EntityLocate(#EntitySol, 500, -50, 500)
                  Rapport + "!E2" ; /!\
               EndIf
            EndIf
         EndIf
      EndIf
   EndIf
EndIf

If Rapport <> "!Init!E1!E2"
   CloseScreen()
   Delay(1)
   MessageRequester("Erreur à la création", "Rapport : " + Rapport)
   End
EndIf
;}
;___________________________________________________________
;{ Boucle principale
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Angle = #PI / 2.0
StartTime = ElapsedMilliseconds() + 16
Repeat
   Delay(1) ; On prévient XP qu'on est cool (XP)
   RealTime.I = ElapsedMilliseconds()
   If RealTime => StartTime ; On bride (Linux)
      StartTime + 16
      If PleinEcran
         Delay(1) ; Sous µsoft,
         Delay(1) ; XP annule ou non ces instructions
         Delay(1) ; Cela dépend notamment de ce qui se passe
         Delay(1) ; en temps réel en arrière-plan
         Delay(1) ; Comme c'est à titre préventif,
         Delay(1) ; il n'y a pas d'impact sur la fluidité.
         Delay(1) ; Sous Linux, ceci est une blague...
      Else
         WindowEvent()
      EndIf
      If ExamineKeyboard()
         If KeyboardPushed(#PB_Key_Up)
            Vitesse + 0.0001
         EndIf
         Vitesse * 0.99
         If KeyboardPushed(#PB_Key_Left)
            AngleV + 0.005
         ElseIf KeyboardPushed(#PB_Key_Right)
            AngleV - 0.005
         EndIf
         If KeyboardPushed(#PB_Key_Escape)
            Break
         EndIf         
      EndIf
      Angle + AngleV
      AngleV * 0.9
      ScrollX + Cos(Angle) * Vitesse
      ScrollY + Sin(Angle) * Vitesse
      RotateEntity(#Entity, 0.0, Angle * #R2D, 0.0, PB_Absolute)
      CameraLocate(Camera, 500 - Cos(-Angle - #PI / 2) * Vitesse * 16000, 500, 500 - Sin(-Angle - #PI / 2) * Vitesse * 16000)
      For I = 0 To 3
         Coef = 1.0 / (1 + I)
         ScrollMaterial(#MatiereSol, ScrollX / Coef, ScrollY / Coef, #PB_Material_Fixed, I)
      Next I
      RenderWorld()
      FlipBuffers()
   EndIf
ForEver
CloseScreen()
Delay(1)
End
;}
;___________________________________________________________
;___________________________________________________________
;{ Procédures
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Procedure.S TempPng(n.I)
   ;________________________________________________________
   ; Retourne un nom de fichier PNG temporaire numéroté
   ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
   Protected Result.S
   Result = "Temp" + Str(n) + ".PNG"
   ProcedureReturn Result
EndProcedure

Procedure.S InitSmoothScrolling()
   ;________________________________________________________
   ; Intègre toute la partie initialisation 3D
   ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
   Protected Result.S
;___________________________________________________________
;{ Initialisations générales
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
CompilerIf Subsystem("DirectX9") = 0
   MessageRequester("Mauvais options de compilation", "Ajoutez la librairie sous-système : DirectX9 !")
   End
CompilerEndIf
If InitEngine3D()       ; Initialise Ogre
   If InitSprite()         ; Initialise DirectX
      If InitKeyboard()       ; Initialise le clavier
         UsePNGImageEncoder() ; Prise en charge du format image PNG
         Add3DArchive(RepertoireCaractere, #PB_3DArchive_FileSystem)
;}
;___________________________________________________________
;{ Préparation de la zone de travail graphique
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
         If ExamineDesktops()
            EcranLargeur      = DesktopWidth(0)
            EcranHauteur      = DesktopHeight(0)
            EcranBitsParPixel = DesktopDepth(0)

            If PleinEcran
               OpenScreen(EcranLargeur, EcranHauteur, EcranBitsParPixel, "Smooth scrolling")
            Else
               OpenWindow(0, 0, 0, EcranLargeur, EcranHauteur, "Smooth scrolling", $80000000)
               OpenWindowedScreen(WindowID(0), 0, 0, EcranLargeur, EcranHauteur, 0, 0, 0)
            EndIf
;}
;___________________________________________________________
;{ Création d'une structure fil de fer de base (plan carré)
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
            Global Dim Sommet.Sommet(3) ; 4 sommets
            For ZI = 0 To 1
               For XI = 0 To 1
                  Index = 2 * ZI + XI
                  With Sommet(Index)
                     \P\X = XI - 0.5
                     \P\Y = 0.0
                     \P\Z = ZI - 0.5
                     \N\X = 0.0
                     \N\Y = 1.0
                     \N\Z = 0.0
                     \C   = RGB(0, 0, 0)
                     \T\U = ZI
                     \T\V = XI
                  EndWith     
               Next XI
            Next ZI

            Global Dim Triangle.Triangle(1) ; 2 triangles
            With Triangle(0)
               \A = 0
               \B = 2
               \C = 3
            EndWith
            With Triangle(1)
               \A = 3
               \B = 1
               \C = 0
            EndWith
            FigCarre = CreateMesh(#PB_Any, 2)
            If FigCarre
               Index = #PB_Mesh_Vertex
               Index | #PB_Mesh_Normal
               Index | #PB_Mesh_Color
               Index | #PB_Mesh_UVCoordinate
               SetMeshData(FigCarre, Index,         @Sommet(0),   4)
               SetMeshData(FigCarre, #PB_Mesh_Face, @Triangle(0), 2)
;}
;___________________________________________________________
;{ Initialisation de la caméra
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
               ; Création de la caméra
               If CreateCamera(Camera, 0, 0, 100, 100)
                  ; Préparation de la caméra
                  CameraLocate(Camera, 500, 500, 500)
                  RotateCamera(Camera, 270, 270, 0)
                  Result = "!Init"
               EndIf
;}
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
            EndIf
         EndIf
      EndIf
   EndIf
EndIf
ProcedureReturn Result
EndProcedure
;}
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯