Essais logiciel pour création Terrain 3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Essais logiciel pour création Terrain 3D

Message par Noos88 »

Bonjour à tous,

J'essai de créer un logiciel pour créer un terrain en 3d mais j'ai déjà un souci pour le redimensionnement de la fenêtre car "OpenWindowSreen" ne peut être redimensionné avez vous une solution ???

Je me suis beaucoup aider des exemples de PureBasic

Déja essayer : ContanerGadget et les option de redimensionnement auto sur openwindowsreen mais ne marche pas

https://drive.google.com/file/d/0BxTkO6 ... sp=sharing

Code : Tout sélectionner

; Creation de terrain 
; F1 Aplication texture
; F2 Enlever texture
; F3 Montée Terrain
; F4 Descente Terrain
; Esc sortie du mode Sreen

#CameraSpeed = 10
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0

#Bureau = 0
#NbSommet = 36
#SizeCircle = 70
Rayon = 100
Image = 1
Element = 0

Enumeration
  #Fenetre
  #Text01 
  #ListTexture
  #FichierTexture
  #FichierRacine
  #Fichier
  #Button_Sreen  
  #Camera
  #Panel
  #Terrain
  #TreeObjet
  #ListObjet 
EndEnumeration


Define.f KeyX, KeyY, MouseX, MouseY, TimeSinceLastFrame 
Define Selected 

Procedure Clamp(*var.float, min.f, max.f)
  If *var\f < min
    *var\f = min
  ElseIf *var\f > max
    *var\f = max
  EndIf
EndProcedure 

Procedure.f Min(a.f, b.f)
  If a < b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure.f Max(a.f, b.f)
  If a > b
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf
EndProcedure

Procedure DoModifCouleur(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f,Image)
  
  imgSize.f = TerrainTileLayerMapSize(#Terrain, tx, ty)
  Pointx.f = TerrainTilePointX(#Terrain, tx, ty, wx, wy, wz) 
  Pointy.f = TerrainTilePointY(#Terrain, tx, ty, wx, wy, wz) 
  
  startx = (Pointx - mBrushSizeTerrainSpace) * imgSize
  starty = (Pointy - mBrushSizeTerrainSpace) * imgSize
  endx   = (Pointx + mBrushSizeTerrainSpace) * imgSize
  endy   = (Pointy + mBrushSizeTerrainSpace) * imgSize
  
  startx = Max(startx, 0)
  starty = Max(starty, 0)
  endx   = Min(endx, imgSize) 
  endy   = Min(endy, imgSize) 
  
  For y = starty To endy
    For x = startx To endx  
      
      tsXdist.f = (x / imgSize) - Pointx
      tsYdist.f = (y / imgSize) - Pointy
      
      weight.f = Min(1.0,	Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
      weight = 1.0 - (weight * weight)
      paint.f = weight * TimeElapsed
      imgY = imgSize - y
      val.f = GetTerrainTileLayerBlend(#Terrain, tx, ty, Image, x, imgY) + paint
      Clamp(@val, 0, 1)
      SetTerrainTileLayerBlend(#Terrain, tx, ty, Image, x, imgY, val)      
    Next x
  Next y
  UpdateTerrainTileLayerBlend(#Terrain, tx, ty, Image)
EndProcedure

Procedure DoModifTerrain(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f)
  terrainSize.f = TerrainTileSize(#Terrain, tx, ty) - 1
  Pointx.f = TerrainTilePointX(#Terrain, tx, ty, wx, wy, wz) 
  Pointy.f = TerrainTilePointY(#Terrain, tx, ty, wx, wy, wz) 
  
  startx = (Pointx - mBrushSizeTerrainSpace) * terrainSize
  starty = (Pointy - mBrushSizeTerrainSpace) * terrainSize
  endx   = (Pointx + mBrushSizeTerrainSpace) * terrainSize
  endy   = (Pointy + mBrushSizeTerrainSpace) * terrainSize
  startx = Max(startx, 0)
  starty = Max(starty, 0)
  endx   = Min(endx, terrainSize) 
  endy   = Min(endy, terrainSize) 
  
  For y = starty To endy
    For x = startx To endx  
      
      tsXdist.f = (x / terrainSize) - Pointx
      tsYdist.f = (y / terrainSize) - Pointy
      
      weight.f = Min(1.0,	Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
      weight = 1.0 - (weight * weight)
      addedHeight.f = weight * 250.0 * TimeElapsed
      
      newheight.f = GetTerrainTileHeightAtPoint(#Terrain, tx, ty, x, y) + addedHeight
      SetTerrainTileHeightAtPoint(#Terrain, tx, ty, x, y, newheight)
      
    Next x
  Next y
EndProcedure

Procedure AffichePolygone(Px.f, Py.f, Pz.f, Rayon.f)
  Define.l i, Color = RGB(255, 255, 0)
  Define.f Angle, Sx, Sy, Sz, Sx1, Sy1, Sz1, Py1, Delta = 2
  For i = 0 To #NbSommet-2
    Sx = Cos(Angle) * Rayon
    Sz = Sin(Angle) * Rayon
    Angle + 2.0 * #PI / #NbSommet 
    Sx1 = Cos(Angle) * Rayon
    Sz1 = Sin(Angle) * Rayon  
    Py = TerrainHeight(#Terrain, Px + Sx, Pz + Sz) + Delta 
    Py1 = TerrainHeight(#Terrain, Px + Sx1, Pz + Sz1) + Delta
    CreateLine3D(i, Px + Sx, Py, Pz + Sz, Color, Px + Sx1, Py1, Pz + Sz1, Color)
  Next i
  Py = TerrainHeight(#Terrain, Px + Cos(0) * Rayon, Pz + Sin(0) * Rayon) + Delta
  CreateLine3D(i, Px + Sx1, Py1, Pz + Sz1, Color, Px + Cos(0) * Rayon, Py, Pz + Sin(0) * Rayon, Color)
EndProcedure  

CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
  Flags = #PB_Engine3D_EnableCG
CompilerEndIf

If InitEngine3D(Flags)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  UseJPEGImageDecoder()

  
  Parse3DScripts()
  If OpenWindow(#Fenetre,0,0, 200 ,200 , "CreateTerrain",  #PB_Window_Maximize |#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)   
    Hauteur = WindowHeight(#Bureau)
    Largeur = WindowWidth(#Bureau)
    LargeurOutil = Largeur/4
    PanelGadget(#Panel,Largeur-LargeurOutil,0,LargeurOutil,Hauteur)
    AddGadgetItem(#Panel,-1,"Terrain")
    TextGadget(#PB_Any,0,0,LargeurOutil,20,"Texture")
    ListIconGadget(#ListTexture,0,20,LargeurOutil,Hauteur/2, "Texture", LargeurOutil,#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection )     
    SetGadgetAttribute(#ListTexture, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)   
    ButtonGadget(#Button_Sreen,0,Hauteur/2+25,LargeurOutil/2,25,"Vers Sreen")
    AddGadgetItem(#Panel,-1,"Objet")
    TextGadget(#PB_Any,0,0,LargeurOutil,20,"Objet disponible")
    TreeGadget(#TreeObjet,0,20,LargeurOutil,Hauteur/2-20)
    
    If ExamineDirectory(#FichierRacine, "Objet\", "*.*")  
      While NextDirectoryEntry(#FichierRacine)
        If DirectoryEntryType(#FichierRacine) = #PB_DirectoryEntry_Directory
          Dossier$ = DirectoryEntryName(#FichierRacine)
          If Dossier$ <> "." 
            If Dossier$ <> ".."
              AddGadgetItem ( #TreeObjet,-1,Dossier$,0,0)  
              Add3DArchive(Dossier$, #PB_3DArchive_FileSystem)
              If ExamineDirectory(#Fichier, "Objet\"+Dossier$, "*.mesh")  
                While NextDirectoryEntry(#Fichier)
                  If DirectoryEntryType(#Fichier) = #PB_DirectoryEntry_File
                    AddGadgetItem ( #TreeObjet,-1,DirectoryEntryName(#Fichier),0,1)
                  EndIf
                Wend
                FinishDirectory(#Fichier)
              EndIf
            EndIf 
          EndIf 
        EndIf
      Wend
      FinishDirectory(#FichierRacine)
    EndIf
    
    TextGadget(#PB_Any,0,Hauteur/2,LargeurOutil,20,"Position Objet")
    ListIconGadget(#ListObjet,0,Hauteur/2+20,LargeurOutil,Hauteur/2-20,"Nom",LargeurOutil/2)
    AddGadgetColumn(#ListObjet,1,"X",LargeurOutil/2/3)
    AddGadgetColumn(#ListObjet,2,"Y",LargeurOutil/2/3)
     AddGadgetColumn(#ListObjet,3,"Z",LargeurOutil/2/3)
    OpenWindowedScreen(WindowID(#Fenetre),0,0,Largeur-LargeurOutil,Hauteur,#True,LargeurOutil,0)
    
  Add3DArchive("Data\", #PB_3DArchive_FileSystem)
  Add3DArchive("Textures\", #PB_3DArchive_FileSystem)
  Add3DArchive("Textures\Hauteur Normal\", #PB_3DArchive_FileSystem)
  Add3DArchive("Data\desert.zip", #PB_3DArchive_Zip)
  
  Parse3DScripts()
    AntialiasingMode(#PB_AntialiasingMode_None)
    MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)
    
    ;- Light
    light = CreateLight(#PB_Any ,RGB(185, 185, 185),4000,1200, 1000,#PB_Light_Directional)
    SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4)) 
    LightDirection(light, 0.55, -0.3, -0.75)   
    AmbientColor(RGB(5, 5,5))
    
    ;- Camera 
    CreateCamera(#Camera, 0, 0, 100, 100)
    MoveCamera(#Camera,  2000, 100, 1700, #PB_Absolute)
    CameraRange(#Camera, 1, 0)
    
    ;----------------------------------
    ; terrain definition
    SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping) 
    
    If ExamineDirectory(#FichierTexture, "Textures\", "*.*")   
      While NextDirectoryEntry(#FichierTexture)
        If DirectoryEntryType(#FichierTexture) = #PB_DirectoryEntry_File
          Couche = Couche + 1
        EndIf 
      Wend
      FinishDirectory(#FichierTexture)
    EndIf 
    
    CreateTerrain(#Terrain, 513, 12000, 600, Couche, "Terrain", "dat")
    
    If ExamineDirectory(#FichierTexture, "Textures\", "*.*")   
      While NextDirectoryEntry(#FichierTexture)   
        If DirectoryEntryType(#FichierTexture) = #PB_DirectoryEntry_File
          Fichier$ = DirectoryEntryName(#FichierTexture)
          ImageTexture = LoadImage(#PB_Any,"Textures\"+ Fichier$) 
          If  ImageTexture And Fichier$    
            AddGadgetItem    (#ListTexture,Element,Fichier$, ImageID(ImageTexture))
            AddTerrainTexture(#Terrain,  Element, 100, Fichier$, "HN_"+Fichier$)
            Element = Element +1
          Else 
            MessageRequester("Defaut d'inialisation", "Erreur de lecture :"+ Fichier$)
          EndIf
        EndIf
      Wend
      FinishDirectory(#FichierTexture)
    EndIf
    
    ;- define terrains
    For ty = #TerrainMiniY To #TerrainMaxiY
      For tx = #TerrainMiniX To #TerrainMaxiX
        Imported = DefineTerrainTile(#Terrain, tx, ty, "terrain513.png", ty % 2, tx % 2)  
      Next
    Next  
    BuildTerrain(#Terrain)  
    
    SkyBox("desert07.jpg") 
    
    ReleaseMouse(1)
    Repeat
      
      Event = WindowEvent()    
      Select Event       
        Case #PB_Event_Gadget 
          Select EventGadget()
            Case #ListTexture
              Element = GetGadgetState(#ListTexture)
              If Element <> -1     
                Image =  Element
              EndIf
            Case #Button_Sreen
              ReleaseMouse(0)
          EndSelect
        Case #PB_Event_Menu
          
        Case #PB_Event_SizeWindow
          
          
        Case #PB_Event_CloseWindow
          End  
      EndSelect
      
      
      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)
        MouseY = -(MouseDeltaY()/10)
        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
        
        TerrainMousePick(#Terrain, CameraID(#Camera), MouseX(),  MouseY())
        
        If MouseButton(#PB_MouseButton_Left)      
          AffichePolygone(PickX(), PickY(), PickZ(), Rayon)
          Selected = #True
        Else      
          MoveCamera  (#Camera, KeyX, 0, KeyY)
          AffichePolygone(PickX(), PickY(), PickZ(), 0)
          Selected = #False
          If CameraY(#Camera) < TerrainHeight(#Terrain, CameraX(#Camera), CameraZ(#Camera)) + 10
            MoveCamera(#Camera, CameraX(#Camera), TerrainHeight(0, CameraX(#Camera), CameraZ(#Camera)) + 10, CameraZ(#Camera), #PB_Absolute)
          EndIf  
          RotateCamera(#Camera,  MouseY, MouseX, 0, #PB_Relative)   
          
        EndIf 
        If MouseWheel() = -1
          If Rayon > 20
            Rayon=Rayon-10
          EndIf 
        EndIf        
        If MouseWheel() = 1
          If Rayon<290
            Rayon=Rayon+10           
          EndIf 
        EndIf
      EndIf
      
      If ExamineKeyboard()               
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
        ModifCouleur = 0
        If KeyboardPushed(#PB_Key_F1)
          ModifCouleur = 1 
        ElseIf  KeyboardPushed(#PB_Key_F2)
          ModifCouleur = -1 
        EndIf
        
        ModifTerrain = 0
        If KeyboardPushed(#PB_Key_F3)
          ModifTerrain = 1 
        ElseIf  KeyboardPushed(#PB_Key_F4)
          ModifTerrain = -1 
        EndIf
        
        If KeyboardReleased(#PB_Key_Escape)
          ReleaseMouse(1)
        EndIf 
        
      EndIf
      
      If ModifCouleur And Selected
        For ty = #TerrainMiniY To #TerrainMaxiY
          For tx = #TerrainMiniX To #TerrainMaxiX 
            DoModifCouleur(tx, ty, PickX(), PickY(), PickZ(), 0.02*Rayon/100, TimeSinceLastFrame * ModifCouleur,Image)
          Next
        Next 
      EndIf
      
      If ModifTerrain And Selected       
        For ty = #TerrainMiniY To #TerrainMaxiY
          For tx = #TerrainMiniX To #TerrainMaxiX 
            DoModifTerrain(tx, ty, PickX(), PickY(), PickZ(), 0.02*Rayon/100, TimeSinceLastFrame *0.2 * ModifTerrain)
          Next
        Next 
        UpdateTerrain(#Terrain)
      EndIf
      
      TimeSinceLastFrame = RenderWorld() / 1000
      FlipBuffers()
      
    ForEver
    
  EndIf 
Else
  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
    ;
    ; Terrain on Linux/OSX and Windows with OpenGL needs CG toolkit from nvidia
    ; It can be freely downloaded and installed from this site: https://developer.nvidia.com/cg-toolkit-download
    ;
    MessageRequester("Error","Can't initialize engine3D (Please ensures than CG Toolkit from nvidia is correcly installed)")
  CompilerElse
    MessageRequester("Error","Can't initialize engine3D")
  CompilerEndIf
EndIf