Textures Animées

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Textures Animées

Message par falsam »

PureBasic 6.0 apporte une nouvelle fonctionnalité : L'animation de textures.

CreateAnimatedMaterial(#Matiere, Texture(), Duree.f)

Aide https://www.purebasic.com/french/docume ... erial.html

■ Comment faire ?
-Indiquez à votre code ou se trouve les textures. Nous allons nous servir des textures d'eau figurant dans le dossier d'installation de PureBasic

Code : Tout sélectionner

Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Water" , #PB_3DArchive_FileSystem)
-Dans une boucle, charger les textures dans un tableaux.
Exemple : 32 textures numérotés de Caustics_0.bmp à Caustics_31.bmp

Code : Tout sélectionner

For n = 0 To 31
  Textures(n) = TextureID(LoadTexture(#PB_Any, "Caustics_" + Str(n) + ".bmp"))
Next
-Crée une nouvelle matière animée à l'aide des textures spécifiées.

Code : Tout sélectionner

CreateAnimatedMaterial(0, Textures(), 3)

Le dernier paramètre correspond à la durée de l'animation en secondes.

-Et enfin appliquer la matière à une entité.

Code : Tout sélectionner

CreatePlane(0, 1000, 1000, 100, 100, 80, 80)
CreateEntity(0, MeshID(0), MaterialID(0))
Un exemple de code fonctionnel utilisant les assets se trouvant dans le dossier d'installation de PureBasic.

Code : Tout sélectionner


; PureBasic 6.0

EnableExplicit

; Caméras
Global Camera, Rot.f

; Texture
Global Dim Textures(31),  n 

; DeltaTime
Global dt.f

; Initialisatio environnement 3D
ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "Textures animées")

; Localisation des assets
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Water" , #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Un peu de lumiere
CreateLight(#PB_Any, RGB(255, 255, 255), 10, 1000, 10)

; Le ciel
SkyBox("desert07.jpg")

; Un sol (ID 0)
CreateMaterial(0, TextureID(LoadTexture(#PB_Any, "soil_wall.jpg"))) 
CreatePlane(0, 1000, 1000, 100, 100, 20, 20)
CreateEntity(0, MeshID(0), MaterialID(0))

; L'eau (ID 1)
; Chargement des textures
; 32 textures numérotés de Caustics_0.bmp à Caustics_31.bmp 
For n = 0 To 31
  Textures(n) = TextureID(LoadTexture(#PB_Any, "Caustics_" + Str(n) + ".bmp"))
Next

; Crée une nouvelle matière animée à l'aide des textures spécifiées. 
CreateAnimatedMaterial(1, Textures(), 3)

; Un peu de couleur
MaterialBlendingMode(1, #PB_Material_AlphaBlend)
SetMaterialColor(1, #PB_Material_DiffuseColor, RGBA(0, 0, 255, 200))

; Appliquer la matiere sur une entité.
CreatePlane(1, 1000, 1000, 100, 100, 40, 40)
CreateEntity(1, MeshID(1), MaterialID(1), 0, 0.5, 0)

; Camera 
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
      
  ; Rotation de la camera principale
  Rot + 0.1*dt
  MoveCamera(Camera, Cos(Rot)*50, 15, Sin(Rot)*50, #PB_Absolute)
  CameraLookAt(Camera, 0, 0, 0)
    
  ; Rendering
  dt = RenderWorld()/1000
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
Touche Escape ou Souris bouton du milieu pour quitter.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Textures Animées

Message par falsam »

Suite à une question de Venom sur le Discord de PureBasic.
Est il possible d'appliquer une texture animée sur n'importe quoi ?
Et bien Venom. Oui c'est possible comme le montre ce code.

ATTENTION : Ce code est à compiler avec l'option DPI activé pour voir l'aide en bas de l'écran.

■ Aide.
Touches fléchées ou touches Q D Z S - Mouvement de Sinbad.
F2 : Vue avant - F3 : Vue arrière.
Touche Esc pour quitter.

■ Code

Code : Tout sélectionner

;
; PureBasic 6.0 
; Activé les DPI dans les options de compilation
;

EnableExplicit

; Texture 
Global Dim Textures(31), n 

; Caméras
Global Camera.i, Angle.f

; Lumiere
Global Light.i

; Entités 
Global Mesh.i, Material.i
Global Ground.i, Water.i, Player.i 
Global Rotation.f, Speed.f, CurrentAnimation.s

; Particule
Global Particle.f

; Sprite Help
Global Bottom, FontInfo = LoadFont(-1, "Arial", 12)

; DeltaTime
Global dt.f

; Initialisatio environnement 3D
ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "Textures animées")
KeyboardMode(#PB_Keyboard_International | #PB_Keyboard_AllowSystemKeys)
EnableWorldPhysics(#True)

; Localisation des assets
Add3DArchive(#PB_Compiler_Home + "Examples\3D/Data\Packs\desert.zip", #PB_3DArchive_Zip)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Water" , #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home +"Examples\3D\Data\Packs\Sinbad.zip", #PB_3DArchive_Zip)

; Création du sprite Help
Bottom = CreateSprite(#PB_Any, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(Bottom))
  DrawingFont(FontID(FontInfo))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0, 0, ScreenWidth(), SpriteWidth(Bottom), RGBA(0, 0, 0, 110))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(10, 10, ". : : Help : : .")
  DrawText(10, 40, "Touches fléchées ou touches Q D Z S - Mouvement de Sinbad.")
  DrawText(10, 70, "F2 : Vue avant - F3 : Vue arrière.")
  DrawText(10, 100, "Touche Esc pour quitter.")
  StopDrawing()
EndIf 

; Chargement des textures caustics
; 32 textures numérotés de Caustics_0.bmp à Caustics_31.bmp 
For n = 0 To 31
  Textures(n) = TextureID(LoadTexture(#PB_Any, "Caustics_" + Str(n) + ".bmp"))
Next

; Camera 
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)

; Lumiere
Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 1000, 0)

; Ciel
SkyBox("desert07.jpg")

;- Sol
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "soil_wall.jpg"))) 
Mesh = CreatePlane(#PB_Any, 1000, 1000, 100, 100, 20, 20)
Ground = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
CreateEntityBody(Ground, #PB_Entity_StaticBody, 0, 0, 1)

;- Eau
Material = CreateAnimatedMaterial(#PB_Any, Textures(), 3)
MaterialBlendingMode(Material, #PB_Material_AlphaBlend)
SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(0, 0, 255, 200))

Mesh = CreatePlane(#PB_Any, 1000, 1000, 100, 100, 40, 40) 
Water = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0.5, 1)

;- Sinbad
Material = CreateAnimatedMaterial(#PB_Any, Textures(), 3)
ScaleMaterial(Material, 0.1, 0.1)
Mesh = LoadMesh(#PB_Any, "sinbad.mesh")
Player = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 14, 0)
ScaleEntity(Player, 3, 3, 3)
CreateEntityBody(Player, #PB_Entity_BoxBody, 0.1, 0, 3)
EntityAngularFactor(Player, 0, 1, 0)

;- Eclaboussure
Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "water.png")))
MaterialBlendingMode(Material, #PB_Material_AlphaBlend)
SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(0, 0, 255, 180))

Particle = CreateParticleEmitter(#PB_Any, 20, 20, 0, #PB_Particle_Box)
ParticleMaterial(Particle, MaterialID(Material))
ParticleSize(Particle, 10, 10)
ParticleEmissionRate(Particle, 10)
ParticleEmitterDirection(Particle, 0, 0.5, 0)
ParticleVelocity(Particle, #PB_Particle_Velocity, 5)
ParticleTimeToLive(Particle, 0.5, 0.5)

; Boucle 3D
Repeat
  ExamineMouse()
  Rotation = -MouseDeltaX() * 200 
  ;RotateEntity(Player, 0, Rotation, 0, #PB_Relative) 
  
  ExamineKeyboard()
  ; Evenement clavier : Distance et mouvement du joueur
  If KeyboardPushed(#PB_Key_Up) Or KeyboardPushed(#PB_Key_Z) 
    Speed = 3000
    CurrentAnimation = "RunBase"
  ElseIf KeyboardPushed(#PB_Key_Down)  Or KeyboardPushed(#PB_Key_S)
    Speed = -3000
    CurrentAnimation = "RunBase"
  Else
    CurrentAnimation = "IdleTop"
    Speed = 0
  EndIf
  
  ; Evenement clavier : Rotation du joueur
  If KeyboardPushed (#PB_Key_Left) Or KeyboardPushed(#PB_Key_Q)
    Rotation = 200
  ElseIf KeyboardPushed (#PB_Key_Right) Or KeyboardPushed(#PB_Key_D) 
    Rotation = -200
  EndIf  
  
  ; Evenement clavier : Vue avant ou arriere 
  If KeyboardPushed(#PB_Key_F2) 
    Angle = 180  
  EndIf
  
  If KeyboardPushed(#PB_Key_F3) 
    Angle = 0  
  EndIf
  
  ; Déplacement du joueur
  If Speed 
    DisableEntityBody(Player, #False) ; (BugWare)
    MoveEntity(Player, 0, 0, Speed * dt, #PB_Absolute|#PB_Local)
  EndIf   
    
  ; Rotation du joueur
  RotateEntity(Player, 0, Rotation * dt, 0, #PB_Relative) 

  ; Animation joueur
  If EntityAnimationStatus(Player, CurrentAnimation) = #PB_EntityAnimation_Stopped
    StartEntityAnimation(Player, CurrentAnimation)
  EndIf
  
  ; Effet eclaboussure
  MoveParticleEmitter(Particle, EntityX(Player), 0 ,EntityZ(Player), #PB_Absolute)
  DisableParticleEmitter(Particle, Bool(Speed=0 And Rotation=0)) 
  
  ; Camera suiveuse
  CameraFollow(Camera, EntityID(Player), Angle, EntityY(Player) + 10, -50, 0.05, 1, #True)
  
  ; Rendering et calcul du delta time
  dt = RenderWorld()/1000
  
  ; Affichage de l'aide
  DisplayTransparentSprite(Bottom, 0, ScreenHeight()-SpriteHeight(Bottom))
  
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
J'espére qu'il n'y aura pas de souci de deltatime :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Textures Animées

Message par venom »

Super.
Merci falsam, je test ça dès que possible :wink:
Merci du partage






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Textures Animées

Message par falsam »

J'espère que d'autres utilisateurs testeront ce code. Je suis intéressé par les commentaire sur la fluidité liée au deltatime.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Textures Animées

Message par SPH »

Je testerais demain 👍

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Textures Animées

Message par venom »

Bonjour.

Voici enfin mon retour. Sympa en effet l'eau s’applique bien a la surface plate 8)
Merci du partage falsam. Donc en théorie si je créer un sol "montagneux" l'eau va suivre le sol ?






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Textures Animées

Message par falsam »

venom a écrit : dim. 12/mars/2023 21:42 Sympa en effet l'eau s’applique bien a la surface plate
Et la c'est la déception. Mais peut être qu'il s'agit que d'une taquinerie de ta part hein ? :mrgreen:
venom a écrit : dim. 12/mars/2023 21:42 Donc en théorie si je créer un sol "montagneux" l'eau va suivre le sol ?
Mais c'est qu'il insiste le manant. On en parlera sur Discord :wink:

■ Pour la compréhension de tous et surtout du symbiote, je met le lien avec la demande de Venom
viewtopic.php?p=214751#p214751
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre