OGRE et représentation géographique

Partagez votre expérience de PureBasic avec les autres utilisateurs.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

OGRE et représentation géographique

Message par fweil »

Voila ... vu l'heure je vais pas tarder à faire dodo. Pas commenté, c'est pour + tard.

Chargez http://perso.wanadoo.fr/francois.weil/France.JPG dans un répertoire data\ où vous voulez et placez le source ci-joint juste au-dessus de ce data\ pour le lancer avec PureBasic.

Ce code est le résultat d'une série de modifs sur le code original de Comtois (Vagues.pb).

Avec Cederavic on a repris là-dessus et fait en sorte de pouvoir interpréter une représentation d'un bitmap contenant une représentation couleur d'une carte géographique.

C'est assez optimisé pour donner un résultat correct en termes de performances.

Sans doute des points à améliorer à partir de ce squelette.

A vos commentaires ...

Code : Tout sélectionner

;
; D'après le source de Comtois
;
; France.pb
;
; Cederavic et FWeil 20040520
;
Global PointIDMemory.l, TriangleIDMemory.l, TextureIDMemory.l

Dim Altitudes.f(1000, 1000)

Enumeration
  #PointID
  #TriangleID
  #TextureID
  #NbX = 80
  #NbZ = 80
EndEnumeration

Global xrot.f, yrot.f, zrot.f
Global CamLocateX.l, CamLocateY.l, CamLocateZ.l, CamLookAtX.l, CamLookAtY.l, CamLookAtZ.l
Global Mode.b

#ScreenWidth = 1024
#ScreenHeight = 768
#ScreenDepth = 32

Procedure Label(x.l, y.l, text.s)
  Locate(x, y)
  DrawText(text)
EndProcedure

Procedure Matrice(FX.l, FZ.l)
  address = PointIDMemory
  For b = 0 To FZ
    For a = 0 To FX
      PokeF(address, a - FX / 2)
      PokeF(address + 4, 0)
      PokeF(address + 8, b - FZ / 2)
      address + 12
    Next
  Next
  address = TriangleIDMemory
  Nb = FX + 1
  For b = 0 To FZ - 1
    For a = 0 To FX - 1
      P1 = a + (b * Nb)
      P2 = P1 + 1
      P3 = a + (b + 1) * Nb
      P4 = P3 + 1
      PokeW(address, P3)
      PokeW(address + 2, P2)
      PokeW(address + 4, P1)
      PokeW(address + 6, P2)
      PokeW(address + 8, P3)
      PokeW(address + 10, P4)
      PokeW(address + 12, P1)
      PokeW(address + 14, P2)
      PokeW(address + 16, P3)
      PokeW(address + 18, P4)
      PokeW(address + 20, P3)
      PokeW(address + 22, P2)
      address + 24
    Next
  Next
  address = TextureIDMemory
  For b = 0 To FZ
    For a = 0 To FX
      PokeF(address, a / FX)
      PokeF(address + 4, b / FZ)
      address + 8
    Next
  Next
EndProcedure

Procedure TerragenExport()
  address = PointIDMemory + 4
  For z = 0 To #NbZ
    For x = 0 To #NbX
      Sommet.f = 100 * Altitudes(x, z)
      PokeF(address, Sommet)
      address + 12
    Next
  Next
  SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1))
EndProcedure

Procedure ShowTextAndKeyTest()
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    FrontColor(20, 180, 115)
    Label(0, 0, "[F1] => Toggle Mode affichage")
    Label(0, 20, "[PageUp] / [PageDown] => Wave Amplitude : " + StrF(WaveAmplitude))
    Label(0, 40, "[Up Arrow] / [Down Arrow] => Wave Period on Z axis : " + Str(WavePeriodZ))
    Label(0, 60, "[Right Arrow] / [Left Arrow] => Wave Period on X axis : " + Str(WavePeriodX))
    Label(0, 80, "[Home key] / [End key] => Wave speed : " + Str(WaveFrequency))
    Label(0, 100, "[F2] / [Shift+F2] => X rotation speed : " + StrF(xrot))
    Label(0, 120, "[F3] / [Shift+F3] => Y rotation speed : " + StrF(yrot))
    Label(0, 140, "[F4] / [Shift+F4] => Z rotation speed : " + StrF(zrot))
    Label(0, 160, "[F5] / [Shift+F5] => X Camera location : " + Str(CamLocateX))
    Label(0, 180, "[F6] / [Shift+F6] => Y Camera location : " + Str(CamLocateY))
    Label(0, 200, "[F7] / [Shift+F7] => Z Camera location : " + Str(CamLocateZ))
    Label(0, 220, "[F8] / [Shift+F8] => X Camera look at : " + Str(CamLookAtX))
    Label(0, 240, "[F9] / [Shift+F9] => Y Camera look at : " + Str(CamLookAtY))
    Label(0, 260, "[F10] / [Shift+F10] => Z Camera look at : " + Str(CamLookAtZ))
  StopDrawing()
  If KeyboardReleased(#PB_Key_F1)
      Mode = #PB_Camera_Wireframe - Mode
      CameraRenderMode(0, Mode)
  EndIf
  If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
      Coeff = -1
    Else
      Coeff = 1
  EndIf
  xrot + 0.1 * Coeff * KeyboardPushed(#PB_Key_F2) / 128
  yrot + 0.1 * Coeff * KeyboardPushed(#PB_Key_F3) / 128
  zrot + 0.1 * Coeff * KeyboardPushed(#PB_Key_F4) / 128
  CamLocateX + 1 * Coeff * KeyboardPushed(#PB_Key_F5) / 128
  CamLocateY + 1 * Coeff * KeyboardPushed(#PB_Key_F6) / 128
  CamLocateZ + 1 * Coeff * KeyboardPushed(#PB_Key_F7) / 128
  CamLookAtX + 1 * Coeff * KeyboardPushed(#PB_Key_F8) / 128
  CamLookAtY + 1 * Coeff * KeyboardPushed(#PB_Key_F9) / 128
  CamLookAtZ + 1 * Coeff * KeyboardPushed(#PB_Key_F10) / 128
EndProcedure

;
; Main starts here
;
  If InitEngine3D() And InitSprite() And InitKeyboard() And OpenScreen(#ScreenWidth, #ScreenHeight, #ScreenDepth, "FRW Matrix")
      circle.l = 360
      xrot = -0.6
      yrot = -0.8
      zrot = 0.2
      CamLocateX.l = 0
      CamLocateY.l = 0
      CamLocateZ.l = 250
      CamLookAtX.l = 0
      CamLookAtY.l = 0
      CamLookAtZ.l = 0
      PointIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1)) ; Mémoires Mesh
      TriangleIDMemory = AllocateMemory(12 * #NbX * #NbZ * 4)
      TextureIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1))
      Matrice(#NbX, #NbZ)
      CreateMesh(0) ; Mesh
      SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1))
      SetMeshData(0, 1, TriangleIDMemory, (#NbX) * (#NbZ) * 4)
      SetMeshData(0, 2, TextureIDMemory, (#NbX + 1) * (#NbZ + 1))
      UseEC_OLEImageDecoder()
      TextureXSize = 512
      TextureYSize = 512
      ImageID1 = LoadImage(0, "data\France 1024x1024.jpg")
      ImageID1 = ResizeImage(0, TextureXSize, TextureYSize)
      ImageID2 = CreateImage(1, TextureXSize, TextureYSize)
      StartDrawing(ImageOutput())
        DrawImage(ImageID1, 0, 0)
        For x = 0 To ImageWidth() - 1
          For y = 0 To ImageHeight() - 1
            Color = Point(x, y)
            Red = Red(Color)
            Green = Green(Color)
            Blue = Blue(Color)
            Altitudes(x, y) = (Red * $1000 + Green * $100 + Blue) / $1000000
          Next
        Next
        DrawingMode(1)
        FontSize = 32
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality))
        FrontColor(0, 0, 0)
        Text.s = "La France"
        Label((TextureXSize - TextLength(Text) + 2) / 2, TextureYSize - 30, Text)
        FontSize = 28
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality))
        FrontColor(255, 255, 255)
        Label((TextureYSize - TextLength(Text)) / 2, TextureYSize - 30, Text)
      StopDrawing()
      CreateTexture(0, TextureXSize, TextureYSize)
      StartDrawing(TextureOutput(0))
        DrawImage(ImageID2, 0, 0)
        DrawingMode(4)
        Box(0, 0, TextureXSize - 1, TextureYSize - 1, #White)
        Box(1, 1, TextureXSize - 3, TextureYSize - 3, #White)
      StopDrawing()
      CreateMaterial(0, TextureID(0)) ; Material
      MaterialBlendingMode(0, #PB_Material_Color) 
      MaterialFilteringMode(0, #PB_Material_Trilinear)
      CreateEntity(0, MeshID(0), MaterialID(0)) ; Entity
      CreateCamera(0, 0, 0, 100, 100) ; Camera
      AmbientColor(#White)
      TerragenExport()
      Repeat
        ClearScreen(0, 0, 0)
        ExamineKeyboard()
        ShowTextAndKeyTest()
        CameraLocate(0, CamLocateX, CamLocateY, CamLocateZ)
        CameraLookAt(0, CamLookAtX, CamLookAtY, CamLookAtZ)
        RotateEntity(0, xrot, yrot, zrot)
        RenderWorld()
        FlipBuffers()
        If GetTickCount_() - tz >= 1000
            Debug ipt
            ipt = 0
            tz = GetTickCount_()
        EndIf
        ipt + 1
      Until KeyboardPushed(#PB_Key_Escape)
    Else
      MessageRequester("Error", "Something fails to initialize 3D engine", 0)
  EndIf
End
Dernière modification par fweil le jeu. 20/mai/2004 4:26, modifié 1 fois.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Je m'aperçois juste que j'ai nommé le fichier : data\France 1024x1024.jpg dans le code source. N'oubliez de mettre le nom du fichier et son appel en accord.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Je viens d'ajoute un fichier de resource supplémentaire à l'adresse :

http://perso.wanadoo.fr/francois.weil/N-America.JPG
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

J'ai ajouter un dernier modèle à :

http://perso.wanadoo.fr/francois.weil/s ... isco-e.JPG

Cela représente la baie de San-Francisco.

Ce fichier précisément, comme les autres d'ailleurs, mais je n'avais pas tout expliqué plus haut, ce fichier dis-je donc, est issu des données USGS (faites un Google avec USGS pour voir + si vous voulez).

Ces données sont des informations topométriques qui permettent de redessiner une géodésique en identifiant pour chaque coordonnées de terrain, l'altitude correspondante. Il existe d'autres sources d'informations pour obtenir des données de type texture (ou nature) du terrain à un point donné, mais pour ce qui est de la seule topographie, la meilleure source publique est l'USGS.

De là, il y a plusieurs traitements possbiles. Pour ce qui me concerne, j'ai récupéré des zips USGS, que j'ai importé dans Terragen, sauvegardé en .ter puis appelé dans Wilbur pour récupérer un .bmp. Le .bmp est ransformé pour finir en .jpg avec l'outil que vous avez sous la main.

J'ai, pour cette dernière étape, utilisé Photoshop pour retailler les images dans des formats acceptables, soit en général 1024x1024.

Il faut savoir qu'une fois dans PureBasic, la manipulation de fichiers textures de plus de 512x512 commence à poser des pb. C'est la raison pour laquelle je redimensionne les images, qui doivent être carrées à la source, en 512x512 dans le programme.

Ka texture OGRE est ensuite recalculée à partir des constantes de taille #NbX et #NbZ, dans le programme.

Ces valeurs ne peuvent pas être très importantes, sinon on tombe vite sur des problèmes de perf.

Le programme donné plus haut permet donc de reconstruire les tableaux OGRE en prélevant la valeur y issue de fichiers USGS filtrés dans plusieurs sas.

L'avantage de cette approche est de montrer la faisabilité d'outils de terraforming sous Purebasic, en prenant des données sources qui sont des données réelles et publiques.

On pourra ensuite s'amuser à écrire des générateurs de terrains, maintenant qu'on sait lire les terrains, ça va devenir vraiment + facile d'aller plus loin.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je ne connaissais pas USGS , c'est cool :)
Par contre je n'ai pas encore réussi à télécharger les images sur ton site pour tester , je referai un essai plus tard .

J'avais essayé un truc de ce genre mais avec un visage , j'avais transformé la photo en niveaux de gris , mais bon le résultat n'était pas terrible ,forcément , ça ne respectait pas les reliefs ,ma copine n'était pas contente de voir le nez que ça lui faisait , et je ne te parle même pas de la bouche :lol:


Maintenant que SetMeshData permet de gérer les normales , tu vas pouvoir ajouter ça pour donner encore plus d'effet en ajoutant une lumière .
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Pour voir le texte apparaitre , il faut modifier le code ainsi :

Code : Tout sélectionner

    RenderWorld() 
    ShowTextAndKeyTest()  
    FlipBuffers()  
Et j'ai enfin réussi à télécharger les images , c'est chouette .
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Merci pour le tip des textes ...
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Pour les fichiers, j'espère que le serveur Wanadoo va sortir de sa panouille matinale, il répond plus depuis 4h du matin.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui , ça fonctionne depuis 1/4 d'heure :)


J'ai fait un essai en commentant cette ligne , personnellement je préfère comme ça , mais c'est chacun selon son goût :)

Code : Tout sélectionner

MaterialBlendingMode(0, #PB_Material_Color) 
en fait , ça dépend de l'image , pour la France je préfère commenter
et pour san_francisco-e.jpg , c'est mieux de tout laisser :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

il em dit que la command UseEC_OLEImageDecoder() n'existe pas :roll:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

c'est bon, ça marche avec UseJPEGImageDecoder() :)
j'ai apporter quelque modification pour une navigation plus facil :
deplacement : fleches
rotation : sourie
zoom : molette

on peut changer la taille du terrain en changeant les valeur de #XF, #YF et #ZF mais ne pa oublier de changer la valeur de CamMoveY aussi

Code : Tout sélectionner

; 
; D'après le source de Comtois 
; 
; France.pb 
; 
; Cederavic et FWeil 20040520 
; 
Global PointIDMemory.l, TriangleIDMemory.l, TextureIDMemory.l, NormalIDMEmory

Dim Altitudes.f(1000, 1000) 

Enumeration 
  #PointID 
  #TriangleID 
  #TextureID 
  #NbX = 100 
  #NbZ = 100 
EndEnumeration 

Global xrot.f, yrot.f, zrot.f 
Global CamLocateX.l, CamLocateY.l, CamLocateZ.l, CamLookAtX.l, CamLookAtY.l, CamLookAtZ.l 
Global CamMoveX.f, CamMoveY.f, CamMoveZ.f, CamRotX.f, CamRotY.f, CamRotZ.f, CamFov.f
Global Mode.b 

#ScreenWidth = 1024 
#ScreenHeight = 768 
#ScreenDepth = 32 
#XF = 4 ; facteur d'agrandissement du terrain
#YF = 2.2
#ZF = 4
#CamSpeed = 5 ; vitesse de deplacement de la cam
CamFov = 60

;Dim Height.f(#Nbx, #Nbz) ; tableau des hauteurs du terrain (plus facil d'acce que les pointeurs)

Procedure Label(x.l, y.l, text.s) 
  Locate(x, y) 
  DrawText(text) 
EndProcedure 

Procedure Matrice(FX.l, FZ.l) 
  address = PointIDMemory 
  For b = 0 To FZ 
    For a = 0 To FX 
      PokeF(address, a - FX / 2) 
      PokeF(address + 4, 0) 
      PokeF(address + 8, b - FZ / 2) 
      address + 12 
    Next 
  Next 
  address = TriangleIDMemory 
  Nb = FX + 1 
  For b = 0 To FZ - 1 
    For a = 0 To FX - 1 
      P1 = a + (b * Nb) 
      P2 = P1 + 1 
      P3 = a + (b + 1) * Nb 
      P4 = P3 + 1 
      PokeW(address, P3) 
      PokeW(address + 2, P2) 
      PokeW(address + 4, P1) 
      PokeW(address + 6, P2) 
      PokeW(address + 8, P3) 
      PokeW(address + 10, P4) 
      PokeW(address + 12, P1) 
      PokeW(address + 14, P2) 
      PokeW(address + 16, P3) 
      PokeW(address + 18, P4) 
      PokeW(address + 20, P3) 
      PokeW(address + 22, P2) 
      address + 24 
    Next 
  Next 
  address = TextureIDMemory 
  For b = 0 To FZ 
    For a = 0 To FX 
      PokeF(address, a / FX) 
      PokeF(address + 4, b / FZ) 
      address + 8 
    Next 
  Next 
  
  address = NormalIDMemory
EndProcedure 

Procedure TerragenExport() 
  address = PointIDMemory + 4 
  For z = 0 To #NbZ 
    For x = 0 To #NbX 
      Sommet.f = 100 * Altitudes(x, z) 
      PokeF(address, Sommet) 
      address + 12 
    Next 
  Next 
  SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1)) 
EndProcedure 

Procedure ShowTextAndKeyTest() 
  StartDrawing(ScreenOutput()) 
    DrawingMode(1) 
    FrontColor(20, 180, 115) 
    Label(0, 0, "[F1] => Toggle Mode affichage") 
    Label(0, 20, "[PageUp] / [PageDown] => Wave Amplitude : " + StrF(WaveAmplitude)) 
    Label(0, 40, "[Up Arrow] / [Down Arrow] => Wave Period on Z axis : " + Str(WavePeriodZ)) 
    Label(0, 60, "[Right Arrow] / [Left Arrow] => Wave Period on X axis : " + Str(WavePeriodX)) 
    Label(0, 80, "[Home key] / [End key] => Wave speed : " + Str(WaveFrequency)) 
    Label(0, 100, "[F2] / [Shift+F2] => X rotation speed : " + StrF(xrot)) 
    Label(0, 120, "[F3] / [Shift+F3] => Y rotation speed : " + StrF(yrot)) 
    Label(0, 140, "[F4] / [Shift+F4] => Z rotation speed : " + StrF(zrot)) 
    Label(0, 160, "[F5] / [Shift+F5] => X Camera location : " + Str(CamLocateX)) 
    Label(0, 180, "[F6] / [Shift+F6] => Y Camera location : " + Str(CamLocateY)) 
    Label(0, 200, "[F7] / [Shift+F7] => Z Camera location : " + Str(CamLocateZ)) 
    Label(0, 220, "[F8] / [Shift+F8] => X Camera look at : " + Str(CamLookAtX)) 
    Label(0, 240, "[F9] / [Shift+F9] => Y Camera look at : " + Str(CamLookAtY)) 
    Label(0, 260, "[F10] / [Shift+F10] => Z Camera look at : " + Str(CamLookAtZ)) 
  StopDrawing() 
  If KeyboardReleased(#PB_Key_F1) 
      Mode = #PB_Camera_Wireframe - Mode 
      CameraRenderMode(0, Mode) 
  EndIf 
  If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift) 
      Coeff = -1 
    Else 
      Coeff = 1 
  EndIf 

  If KeyboardPushed(#PB_Key_Left)
    CamMoveX = -#CamSpeed
  ElseIf  KeyboardPushed(#PB_Key_Right)
    CamMoveX = #CamSpeed
  Else
    CamMoveX = 0
  EndIf
                  
  If KeyboardPushed(#PB_Key_Up)
    CamMoveZ = -#CamSpeed
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamMoveZ = #CamSpeed
  Else
    CamMoveZ = 0
  EndIf
  
  CamMoveY = 50
  
  CamRotX = -(MouseDeltaX() / #CamSpeed) * #CamSpeed / 2
  CamRotY = -(MouseDeltaY() / #CamSpeed) * #CamSpeed / 2
  CamFov  = CamFov + MouseWheel() * #CamSpeed
  If CamFov < 5 : CamFov = 5 : EndIf
  If CamFov > 160: CamFov = 160 : EndIf
EndProcedure 

; 
; Main starts here 
; 
  If InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse() And OpenScreen(#ScreenWidth, #ScreenHeight, #ScreenDepth, "FRW Matrix") 
      circle.l = 360 
      xrot = -0.6 
      yrot = -0.8 
      zrot = 0.2 
      CamLocateX.l = 0 
      CamLocateY.l = 0 
      CamLocateZ.l = 250 
      CamLookAtX.l = 0 
      CamLookAtY.l = 0 
      CamLookAtZ.l = 0 
      PointIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1)) ; Mémoires Mesh 
      TriangleIDMemory = AllocateMemory(12 * #NbX * #NbZ * 4) 
      TextureIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1)) 
      NormalIDMemory = AllocateMemory(12 * #NbX * #NbZ * 4) 
      Matrice(#NbX, #NbZ) 
      CreateMesh(0) ; Mesh 
      SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1)) 
      SetMeshData(0, 1, TriangleIDMemory, (#NbX) * (#NbZ) * 4) 
      SetMeshData(0, 2, TextureIDMemory, (#NbX + 1) * (#NbZ + 1)) 
      ;UseEC_OLEImageDecoder() 
      UseJPEGImageDecoder()
      TextureXSize = 512 
      TextureYSize = 512 
      ImageID1 = LoadImage(0, "data\France.jpg") 
      ImageID1 = ResizeImage(0, TextureXSize, TextureYSize) 
      ImageID2 = CreateImage(1, TextureXSize, TextureYSize) 
      StartDrawing(ImageOutput()) 
        DrawImage(ImageID1, 0, 0) 
        For x = 0 To ImageWidth() - 1 
          For y = 0 To ImageHeight() - 1 
            Color = Point(x, y) 
            Red = Red(Color) 
            Green = Green(Color) 
            Blue = Blue(Color) 
            Altitudes(x, y) = (Red * $1000 + Green * $100 + Blue) / $1000000 
          Next 
        Next 
        DrawingMode(1) 
        FontSize = 32 
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality)) 
        FrontColor(0, 0, 0) 
        Text.s = "La France" 
        Label((TextureXSize - TextLength(Text) + 2) / 2, TextureYSize - 30, Text) 
        FontSize = 28 
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality)) 
        FrontColor(255, 255, 255) 
        Label((TextureYSize - TextLength(Text)) / 2, TextureYSize - 30, Text) 
      StopDrawing() 
      CreateTexture(0, TextureXSize, TextureYSize) 
      StartDrawing(TextureOutput(0)) 
        DrawImage(ImageID2, 0, 0) 
        DrawingMode(4) 
        Box(0, 0, TextureXSize - 1, TextureYSize - 1, #White) 
        Box(1, 1, TextureXSize - 3, TextureYSize - 3, #White) 
      StopDrawing() 
      CreateMaterial(0, TextureID(0)) ; Material 
      ;MaterialBlendingMode(0, #PB_Material_Color) 
      MaterialFilteringMode(0, #PB_Material_Trilinear) 
      CreateEntity(0, MeshID(0), MaterialID(0)) ; Entity 
      ScaleEntity(0, #XF, #YF, #ZF)
      CreateCamera(0, 0, 0, 100, 100) ; Camera 
      AmbientColor(#White) 
      CameraFOV(0, CamFov)
      TerragenExport() 
      Repeat 
        ClearScreen(0, 0, 0) 
        ExamineKeyboard() 
        ExamineMouse()
        ShowTextAndKeyTest() 
        CameraFOV(0, CamFov)
        RotateCamera(0, CamRotX, CamRotY, CamRotZ)
        MoveCamera  (0, CamMoveX, -CameraY(0) + CamMoveY, CamMoveZ) 
        ;RotateEntity(0, xrot, yrot, zrot) 
        RenderWorld() 
        FlipBuffers() 
        If GetTickCount_() - tz >= 1000 
            Debug ipt 
            ipt = 0 
            tz = GetTickCount_() 
        EndIf 
        ipt + 1 
      Until KeyboardPushed(#PB_Key_Escape) 
    Else 
      MessageRequester("Error", "Something fails to initialize 3D engine", 0) 
  EndIf 
End 
:)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

moi j'attends que tu ajoutes les normales et une petite lumière rasante :)
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Quelques petits bugs :
- Les Alpes sont vachement plates (inexistantes)
- Il y a des relief dans la mer
Sinon, c'est vachement beau ! :D
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

bon, j'ai modifier quelque truc, et j'obtient un resultat assez statisfaisant :
Image
une deuxieme :
Image
le code :

Code : Tout sélectionner

; 
; D'après le source de Comtois 
; 
; France.pb 
; 
; Cederavic et FWeil 20040520 
; 
Global PointIDMemory.l, TriangleIDMemory.l, TextureIDMemory.l, NormalIDMEmory

Dim Altitudes.f(1000, 1000) 

Enumeration 
  #PointID 
  #TriangleID 
  #TextureID 
  #NbX = 100 
  #NbZ = 100 
EndEnumeration 

Global xrot.f, yrot.f, zrot.f 
Global CamLocateX.l, CamLocateY.l, CamLocateZ.l, CamLookAtX.l, CamLookAtY.l, CamLookAtZ.l 
Global CamMoveX.f, CamMoveY.f, CamMoveZ.f, CamRotX.f, CamRotY.f, CamRotZ.f, CamFov.f
Global Mode.b 

#ScreenWidth = 1024 
#ScreenHeight = 768 
#ScreenDepth = 32 
#XF = 4 ; facteur d'agrandissement du terrain
#YF = 8
#ZF = 4
#CamSpeed = 5 ; vitesse de deplacement de la cam
CamFov = 60
CamMoveY = 200

Procedure Label(x.l, y.l, text.s) 
  Locate(x, y) 
  DrawText(text) 
EndProcedure 

Procedure Matrice(FX.l, FZ.l) 
  address = PointIDMemory 
  For b = 0 To FZ 
    For a = 0 To FX 
      PokeF(address, a - FX / 2) 
      PokeF(address + 4, 0) 
      PokeF(address + 8, b - FZ / 2) 
      address + 12 
    Next 
  Next 
  address = TriangleIDMemory 
  Nb = FX + 1 
  For b = 0 To FZ - 1 
    For a = 0 To FX - 1 
      P1 = a + (b * Nb) 
      P2 = P1 + 1 
      P3 = a + (b + 1) * Nb 
      P4 = P3 + 1 
      PokeW(address, P3) 
      PokeW(address + 2, P2) 
      PokeW(address + 4, P1) 
      PokeW(address + 6, P2) 
      PokeW(address + 8, P3) 
      PokeW(address + 10, P4) 
      PokeW(address + 12, P1) 
      PokeW(address + 14, P2) 
      PokeW(address + 16, P3) 
      PokeW(address + 18, P4) 
      PokeW(address + 20, P3) 
      PokeW(address + 22, P2) 
      address + 24 
    Next 
  Next 
  address = TextureIDMemory 
  For b = 0 To FZ 
    For a = 0 To FX 
      PokeF(address, a / FX) 
      PokeF(address + 4, b / FZ) 
      address + 8 
    Next 
  Next 
  
  address = NormalIDMemory
EndProcedure 

Procedure TerragenExport() 
  address = PointIDMemory + 4 
  For z = 0 To #NbZ 
    For x = 0 To #NbX 
      Sommet.f = 100 * Altitudes(x * 512 / 100, z * 512 / 100) 
      PokeF(address, Sommet) 
      address + 12 
    Next 
  Next 
  SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1)) 
EndProcedure 

Procedure ShowTextAndKeyTest() 
  StartDrawing(ScreenOutput()) 
    DrawingMode(1) 
    FrontColor(20, 180, 115) 
    Label(0, 0, "[F1] => Toggle Mode affichage") 
    Label(0, 20, "[PageUp] / [PageDown] => Wave Amplitude : " + StrF(WaveAmplitude)) 
    Label(0, 40, "[Up Arrow] / [Down Arrow] => Wave Period on Z axis : " + Str(WavePeriodZ)) 
    Label(0, 60, "[Right Arrow] / [Left Arrow] => Wave Period on X axis : " + Str(WavePeriodX)) 
    Label(0, 80, "[Home key] / [End key] => Wave speed : " + Str(WaveFrequency)) 
    Label(0, 100, "[F2] / [Shift+F2] => X rotation speed : " + StrF(xrot)) 
    Label(0, 120, "[F3] / [Shift+F3] => Y rotation speed : " + StrF(yrot)) 
    Label(0, 140, "[F4] / [Shift+F4] => Z rotation speed : " + StrF(zrot)) 
    Label(0, 160, "[F5] / [Shift+F5] => X Camera location : " + Str(CamLocateX)) 
    Label(0, 180, "[F6] / [Shift+F6] => Y Camera location : " + Str(CamLocateY)) 
    Label(0, 200, "[F7] / [Shift+F7] => Z Camera location : " + Str(CamLocateZ)) 
    Label(0, 220, "[F8] / [Shift+F8] => X Camera look at : " + Str(CamLookAtX)) 
    Label(0, 240, "[F9] / [Shift+F9] => Y Camera look at : " + Str(CamLookAtY)) 
    Label(0, 260, "[F10] / [Shift+F10] => Z Camera look at : " + Str(CamLookAtZ)) 
  StopDrawing() 
  If KeyboardReleased(#PB_Key_F1) 
      Mode = #PB_Camera_Wireframe - Mode 
      CameraRenderMode(0, Mode) 
  EndIf 
  If KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift) 
      Coeff = -1 
    Else 
      Coeff = 1 
  EndIf 

  If KeyboardPushed(#PB_Key_Left)
    CamMoveX = -#CamSpeed
  ElseIf  KeyboardPushed(#PB_Key_Right)
    CamMoveX = #CamSpeed
  Else
    CamMoveX = 0
  EndIf
                  
  If KeyboardPushed(#PB_Key_Up)
    CamMoveZ = -#CamSpeed
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamMoveZ = #CamSpeed
  Else
    CamMoveZ = 0
  EndIf
  
  CamRotX = -(MouseDeltaX() / #CamSpeed) * #CamSpeed / 2
  CamRotY = -(MouseDeltaY() / #CamSpeed) * #CamSpeed / 2
  CamFov  = CamFov + MouseWheel() * #CamSpeed
  If CamFov < 5 : CamFov = 5 : EndIf
  If CamFov > 160: CamFov = 160 : EndIf
EndProcedure 

; 
; Main starts here 
; 
  If InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse() And OpenScreen(#ScreenWidth, #ScreenHeight, #ScreenDepth, "FRW Matrix") 
      circle.l = 360 
      xrot = -0.6 
      yrot = -0.8 
      zrot = 0.2 
      CamLocateX.l = 0 
      CamLocateY.l = 0 
      CamLocateZ.l = 250 
      CamLookAtX.l = 0 
      CamLookAtY.l = 0 
      CamLookAtZ.l = 0 
      PointIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1)) ; Mémoires Mesh 
      TriangleIDMemory = AllocateMemory(12 * #NbX * #NbZ * 4) 
      TextureIDMemory = AllocateMemory(12 * (#NbX + 1) * (#NbZ + 1)) 
      NormalIDMemory = AllocateMemory(12 * #NbX * #NbZ * 4) 
      Matrice(#NbX, #NbZ) 
      CreateMesh(0) ; Mesh 
      SetMeshData(0, 0, PointIDMemory, (#NbX + 1) * (#NbZ + 1)) 
      SetMeshData(0, 1, TriangleIDMemory, (#NbX) * (#NbZ) * 4) 
      SetMeshData(0, 2, TextureIDMemory, (#NbX + 1) * (#NbZ + 1)) 
      UseJPEGImageDecoder()
      TextureXSize = 512 
      TextureYSize = 512 
      ImageID1 = LoadImage(0, "data\France_h.jpg") 
      ImageID2 = LoadImage(1, "data\France_t.jpg") 
      ImageID1 = ResizeImage(0, TextureXSize, TextureYSize) 
      ImageID2 = ResizeImage(1, TextureXSize, TextureYSize) 
      UseImage(0)
      
      StartDrawing(ImageOutput()) 
        For x = 0 To ImageWidth() - 1 
          For y = 0 To ImageHeight() - 1 
            Color = Point(x, y) 
            Red = Red(Color) 
            Green = Green(Color) 
            Blue = Blue(Color) 
            Altitudes(x, y) = Red / 5000
          Next 
        Next 
         
          UseImage(1)
          DrawImage(ImageID(), 0, 0)
      StopDrawing() 
      UseImage(0)
      CreateTexture(0, TextureXSize, TextureYSize) 
      StartDrawing(TextureOutput(0)) 
        DrawImage(ImageID(), 0, 0) 
        DrawingMode(4) 
        Box(0, 0, TextureXSize - 1, TextureYSize - 1, #White) 
        Box(1, 1, TextureXSize - 3, TextureYSize - 3, #White) 
        DrawingMode(1) 
        FontSize = 32 
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality)) 
        FrontColor(0, 0, 0) 
        Text.s = "La France" 
        Label((TextureXSize - TextLength(Text) + 2) / 2, TextureYSize - 30, Text) 
        FontSize = 28 
        DrawingFont(LoadFont(#PB_Any, "Verdana", FontSize, #PB_Font_Bold | #PB_Font_HighQuality)) 
        FrontColor(255, 255, 255) 
        Label((TextureYSize - TextLength(Text)) / 2, TextureYSize - 30, Text)
      StopDrawing() 
      CreateMaterial(0, TextureID(0)) ; Material 
      MaterialBlendingMode(0, #PB_Material_Color) 
      MaterialFilteringMode(0, #PB_Material_Trilinear) 
      CreateEntity(0, MeshID(0), MaterialID(0)) ; Entity 
      ScaleEntity(0, #XF, #YF, #ZF)
      CreateCamera(0, 0, 0, 100, 100) ; Camera 
      AmbientColor(#White) 
      CameraFOV(0, CamFov)
      TerragenExport() 
      Repeat 
        ClearScreen(0, 0, 0) 
        ExamineKeyboard() 
        ExamineMouse()
        ShowTextAndKeyTest() 
        CameraFOV(0, CamFov)
        RotateCamera(0, CamRotX, CamRotY, CamRotZ)
        MoveCamera  (0, CamMoveX, -CameraY(0) + CamMoveY, CamMoveZ) 
        RenderWorld() 
        FlipBuffers() 
        If KeyboardReleased(#PB_Key_S)
          GrabSprite(0, 0, 0, #ScreenWidth, #ScreenHeight)
          SaveSprite(0, "snap.bmp")
        EndIf
        If GetTickCount_() - tz >= 1000 
            ipt = 0 
            tz = GetTickCount_() 
        EndIf 
        ipt + 1 
      Until KeyboardPushed(#PB_Key_Escape) 
    Else 
      MessageRequester("Error", "Something fails to initialize 3D engine", 0) 
  EndIf 
End 
l'image France_h.jpg et France_t.jpg :
www.serveurperso.com/~cederavic/terra/data.rar

et vala :) bon je vais essayer de voir pour les normales maintenant et les ombres...
Répondre