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