Page 1 sur 1

5000 Cubes

Publié : lun. 05/mars/2018 23:56
par falsam
5000 Cubes texturés. Sur un pauvre i3 entrée de gamme, j'ai un affichage immédiat.

Code : Tout sélectionner

EnableExplicit

;Scene
Global Camera, Light

; Returns a random sign {-1, 1}
Macro RandomSign()
  ( Random(1)*2-1 ) 
EndMacro

;Summary
Declare GameLoad()
Declare RenderGame3D()
Declare RenderGame2D() 
Declare Exit()

GameLoad()

Procedure GameLoad()
  Protected Window, n 
    
  If InitEngine3D() And  InitKeyboard() And InitSprite() And InitMouse() And InitSound()
    Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
    SetWindowColor(Window, 0)
    
    ;-[Screen]
    OpenWindowedScreen(WindowID(Window),0, 0, WindowWidth(Window) , WindowHeight(Window))    
    KeyboardMode(#PB_Keyboard_International)  

    ;-[2D]
    
    ;-[3D]
    Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
        
    ;-Camera
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    CameraBackColor(Camera, RGB(0, 0, 0))
    MoveCamera(Camera, 0, 0, -100)
    CameraLookAt(Camera, 0, 0, 0)
    
    ;-Light
    Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 1000, 0, #PB_Light_Point)
    SetLightColor(Light, #PB_Light_SpecularColor, RGB(255, 255, 255))
    SetLightColor(Light, #PB_Light_DiffuseColor, RGB(255, 255, 255))
        
    ;Création de 5000 cubes
    CreateMaterial(0, TextureID(LoadTexture(-1, "glass_Dirt.png")))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)
    SetMaterialColor(0, #PB_Material_SpecularColor, RGB(255,255,255))
    
    CreateEntity(0, MeshID(CreateCube(-1, 8)), MaterialID(0))
    For n = 1 To 5000
       MoveEntity(CopyEntity(0, -1), Random(1000) * RandomSign(), Random(1000) * RandomSign(), Random(1000) * RandomSign()) 
    Next
    
    ;-Loop
    While #True
      Repeat : Until WindowEvent() = 0
      FlipBuffers()  
      RenderGame3D()
      RenderWorld()
      RenderGame2D()
    Wend
  Else
    
  EndIf 
EndProcedure

Procedure RenderGame3D()
  RotateCamera(Camera, 0.1, 0.1, 0.1, #PB_Relative)
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      Exit()
    EndIf  
  EndIf
  
  If ExamineMouse()
    
  EndIf 
EndProcedure

Procedure RenderGame2D()
EndProcedure

Procedure Exit()
  End
EndProcedure

Re: Image to scene 3d - v2

Publié : mar. 06/mars/2018 0:18
par Zorro
Merci ,je testerai ton code demain
Là je suis avec ma tablette (au pieu lol)

Re: Image to scene 3d - v2

Publié : mar. 06/mars/2018 0:25
par falsam
Zorro a écrit :Là je suis avec ma tablette (au pieu lol)
On ne veut pas connaitre les détails :mrgreen:

Re: Image to scene 3d - v2

Publié : mar. 06/mars/2018 8:27
par Micoute
Excellent falsam, j'ai été bluffé. Merci pour le partage.

Re: Image to scene 3d - v2

Publié : mar. 06/mars/2018 10:47
par Zorro
oui effectivement meme avec 50.000 cubes ça passe chez moi ....

je ne comprends pas d'ou viens le ralentissement dans l'autre code du coup ....

de toutes façons, je n'aime pas la 3D avec Purebasic
que ce soit le nom des commandes, la façon dont ça s'emboite....
bref, un je ne sais quoi qui ne me plait pas
trop compliqué tout ça , je dois etre trop vieux pour ses trucs :lol:

Re: Image to scene 3d - v2

Publié : mar. 06/mars/2018 10:53
par falsam
Zorro a écrit :oui effectivement meme avec 50.000 cubes ça passe chez moi ....

je ne comprends pas d'ou viens le ralentissement dans l'autre code du coup ....

de toutes façons, je n'aime pas la 3D avec Purebasic
que ce soit le nom des commandes, la façon dont ça s'emboite....
bref, un je ne sais quoi qui ne me plait pas
trop compliqué tout ça , je dois etre trop vieux pour ses trucs :lol:
Houuuuuuuu fais un effort et tu verras qu'on peut s'amuser avec Ogre3D

Re: 5000 Cubes

Publié : mar. 06/mars/2018 11:30
par Guillot
et dans une staticgeometry tu fais *20

remplacer la boucle ligne 50 par:

Code : Tout sélectionner

    CreateStaticGeometry(0,1000,1000,1000,0)
    For n = 1 To 100000
       AddStaticGeometryEntity(0,EntityID(0), Random(1000) * RandomSign(), Random(1000) * RandomSign(), Random(1000) * RandomSign()) 
    Next
    BuildStaticGeometry(0)

Re: 5000 Cubes

Publié : mar. 06/mars/2018 20:48
par Cool Dji
Vive la StaticGeometry(), chouette exemple Falsam !

Je suis sur un code où j'ai 40.000 spheres (36.000 pour les communes françaises et environ 4.000 pour les communes suisses) et ça passe bien. Par contre, quand je rajoute les 260.000 CreateLine3D() correspondant aux déplacements domicile-travail entre les communes, ça commence à ralentir un peu car je ne peux pas les passer en staticgeometry()...
Je pensais que le code dessous passait les Entity en Static mais si ensuite j'essaie de libérer les Entity, le compilateur m'indique que les Entity crées avec le mesch issu de Createline n'existent pas !

Code : Tout sélectionner

 ;CreateStaticGeometry(2,10000,10000,10000,#False)
  
For j=1 To 1000
   CreateLine3D(1000+j, 0, 0, 0, RGB(255, 255, 255), Random(10000)-5000, Random(10000)-5000, Random(10000)-5000, RGB(255, 255, 255))
   CreateEntity(1000+j, MeshID(1000+j), #PB_Material_None)
   AddStaticGeometryEntity(2,EntityID(1000+j),0,0,0)
Next

;BuildStaticGeometry(2)

 For j=1 To 1000
   FreeEntity(1000+j)  
 Next

Je vais repasser en 2D mais la gestion du déplacement et du zoom sur la carte était pratique avec la 3D...

Re: 5000 Cubes

Publié : mer. 07/mars/2018 12:26
par comtois
Cool Dji a écrit :quand je rajoute les 260.000 CreateLine3D() correspondant aux déplacements domicile-travail entre les communes, ça commence à ralentir un peu
Tu peux faire tes lignes dans un seul mesh (ou une poignée, je ne sais plus la capacité maxi) en utilisant :
CreateMesh(#PB_Any, #PB_Mesh_LineList, #PB_Mesh_Static)

Code : Tout sélectionner

#CameraSpeed = 1
#scale = 3

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ;- Material
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    DisableMaterialLighting(0, #True)
    
    ;- Mesh Grid
    CreateMesh(3, #PB_Mesh_LineList, #PB_Mesh_Static)
    For i=0 To 1000
      MeshVertexPosition(Random(2000)-1000, 0, Random(2000)-1000) 
      MeshVertexColor(RGB(Random(255),Random(255),Random(255)))
      MeshVertexPosition(Random(2000)-1000, 0,Random(2000)-1000) 
      MeshVertexColor(RGB(Random(255),Random(255),Random(255)))
    Next
 
    FinishMesh(#False)
    
    SetMeshMaterial(3, MaterialID(0))
    Grid = CreateNode(#PB_Any, 0, 0, 0)
    AttachNodeObject(Grid, MeshID(3))
    
    
    
    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 10, #PB_Absolute)
    CameraFOV(0, 40)
    CameraLookAt(0, NodeX(Grid),  NodeY(Grid),  NodeZ(Grid))
    CameraBackColor(0, RGB(0, 0, 40))
    
    ;-Light
    CreateLight(0, RGB(255,255,255), -10, 60, 10)
    AmbientColor(RGB(90, 90, 90))
    
    Repeat
      Screen3DEvents()
      
      ExamineKeyboard()
      
      RotateNode(Grid, 0.3, 0.3, 0.3, #PB_Relative) 

      RenderWorld()
      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End

Re: 5000 Cubes

Publié : mer. 07/mars/2018 16:34
par Cool Dji
Ok, merci Comtois, je teste ce soir :D

Je n'ai pas été limité en nombre de mesch mais effectivement mettre plusieurs lignes (ou toutes) dans le même ça peut simplifier.

Falsam, c'est la dernière fois que je parasite ton topic :mrgreen:

Re: 5000 Cubes

Publié : mer. 07/mars/2018 16:51
par falsam
Cool Dji a écrit :Falsam, c'est la dernière fois que je parasite ton topic
Un parasite ? ou ça ? ^-^

Au contraire c'est instructif.

Re: 5000 Cubes

Publié : mer. 07/mars/2018 19:15
par Cool Dji
Oui, la prop de Comtois est instructive.
Merci, c'est impec...ça va me permettre de garder le mode 3D :D

Re: 5000 Cubes

Publié : mar. 03/juil./2018 22:30
par threedslider
trop impressionnant merci pour ton partage :)

Re: 5000 Cubes

Publié : mer. 04/juil./2018 8:47
par Kwai chang caine
"J'avions" zappé :oops:
Merci pour le partage 8)