Page 1 sur 1

[RESOLU] fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 13:21
par ymerdy
Bonjour,
comment gérer correctement les evenements d'une fenetre3D et ceux d'une fenetre dans la meme boucle?
Dans l'exemple suivant, j'ouvre une 1ere fenetre qui contient un trackbar, et un string qui affiche la valeur du trackbar.
(NB: les evenements de cette fenetre ne sont pas gérés pour simplifier l'exemple)

J'ouvre ensuite une 2eme fenetre avec un trackbar qui agit sur la meme valeur.
En cas d'evenement dans cette 2eme fenetre, les 2 gadgets de la 1ere fenetre sont mis a jour.

J'ouvre ensuite une 3eme fenetre, avec un windowedscreen et une fenetre3D.
Déjà, on voit que les gadgets des 2 1eres fenetres ne s'affichent pas tant qu'il n'y a pas une action dans la 3eme fenetre.
Dans cette fenetre3D, le clic souris agit egalement sur la meme valeur, et les evenements doivent mettre a jour les autres gadgets pour que l'état soit cohérent entre les 3 fenetres.

Problème: les trackbar sont bien mis a jour, mais le string ne se rafraichit pas.
???

Si la fenetre3D lache le focus (touche TAB), le string se rafraichit.

Code : Tout sélectionner

Global Window_0, Window_1

Global TrackBar_0, String_0
Global TrackBar_1
Global TrackBar_2

If InitEngine3D()=0
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
  End
EndIf

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
  
InitSprite()
InitKeyboard()
InitMouse()

Procedure OpenWindow_0(x = 0, y = 0, width = 350, height = 220)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_0 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
  String_0 = StringGadget(#PB_Any, 70, 110, 180, 30, "")
EndProcedure

Procedure OpenWindow_1(x = 400, y = 0, width = 350, height = 220)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_1 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
EndProcedure

Procedure OpenWindow_2(x = 800, y = 0, width = 350, height = 220)
  Window_2 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(Window_2), 0, 0, width, height, 0, 0, 0)
  CreateCamera(0, 0, 0, 100, 100)  ; Front camera
  MoveCamera(0,0,100,100, #PB_Absolute)
  WindowGUI=OpenWindow3D(#PB_Any, 10, 10, 340, 200, "trackbar")
  
  ShowGUI(0, 1) ;Hide the GUI, display the mouse cursor
EndProcedure

Procedure Window_1_Events(event)
      tbval.i = GetGadgetState(TrackBar_1)
      SetGadgetState(TrackBar_0,tbval)
      SetGadgetText(String_0,StrU(tbval))
EndProcedure

OpenWindow_0()
OpenWindow_1()
OpenWindow_2()

Repeat
  ; capture events
  
  Event = WindowEvent()  
  EventWindow = EventWindow()
  
  ; manage events
  
  If EventWindow = Window_1
    Window_1_Events(Event)
  EndIf
  
  
  If ExamineMouse()
    InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
  EndIf
  
  
  If MouseButton(#PB_MouseButton_Left) 
    shininess=(GetGadgetState(TrackBar_1)+1)%80
    SetGadgetText(String_0,StrU(shininess))
    SetGadgetState(TrackBar_0,shininess)
    SetGadgetState(TrackBar_1,shininess)
  EndIf
  
  If ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Tab)
      SetActiveWindow(Window_1)
    EndIf
  EndIf
  
  RenderWorld() 
  FlipBuffers()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

Testé en PB5.71 X64

Re: screen3Devents() et windowEvents()

Publié : lun. 30/sept./2019 13:31
par falsam
Traiter la file d'attente des événements Windows en priorité ;)

Code : Tout sélectionner

Repeat
  ; capture events
  
  ;Traiter la file d'attente des événements windows
  Repeat 
   Event = WindowEvent()  
   EventWindow = EventWindow()
  Until Event = 0
    
  ; manage events

Re: fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 13:44
par ymerdy
Merci Falsam,

mais avec cette solution, Event vaut toujours 0 en sortie de boucle.

Donc je ne peux plus traiter les evenements qui se produisent dans mes fenetres 1 et 2 ?

Par exemple, il n'est plus possible de quitter l'appli avec les boutons de fermeture de fenetre des fenetres 1 et 2.

C'est le problème que j'ai en utilisant screen3DEvents() de la plupart des exemples 3D, qui comporte cette boucle que tu indiques...

Re: fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 13:47
par ymerdy
Oups, je pense que j'ai mal compris...

Je suppose qu'il faut separer les 2 avec:
;capture events
...
;manage events
...

puis
;capture 3Devents
...
;manage3Devents
...

OK, je teste

MERCI!

Re: fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 14:00
par falsam
ymerdy a écrit :mais avec cette solution, Event vaut toujours 0 en sortie de boucle.
Normal car tu as fini de traiter les évènements liés aux fenêtres.

Il faut traiter les évènements fenêtres gadgets, etc …. à l'intérieur de cette boucle.

Re: fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 16:19
par ymerdy
OK,

J'ai splitté la gestion des evenements en 2 parties, je n'ai plus de problème d'affichage des gadgets, mais quand j'appuie sur TAB pour redonner le focus à ma 1ere fenetre, je ne recupère pas le pointeur souris!???

Est-ce qu'on est obligé de passer par les windows3D pour capturer le pointeur souris dans la fenetre où on fait des affichages 3D?

D'ailleurs y a-t-il un moyen plus simple pour que la fenetre d'affichage 3D cesse de capturer le pointeur?
J'ai pensé à gérer une touche qui donne le focus a une autre fenetre, mais ça me semble vraiment moche, et je ne sais pas comment je ferais si j'avais uniquement la fenetre d'affichage 3D.

Code : Tout sélectionner

Global Window_0, Window_1

Global TrackBar_0, String_0
Global TrackBar_1
Global TrackBar_2

If InitEngine3D()=0
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
  End
EndIf

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
  
InitSprite()
InitKeyboard()
InitMouse()

Procedure OpenWindow_0(x = 0, y = 0, width = 350, height = 220)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_0 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
  String_0 = StringGadget(#PB_Any, 70, 110, 180, 30, "")
EndProcedure

Procedure OpenWindow_1(x = 400, y = 0, width = 350, height = 220)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_1 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
EndProcedure

Procedure OpenWindow_2(x = 800, y = 0, width = 350, height = 220)
  Window_2 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(Window_2), 0, 0, width, height, 0, 0, 0)
  CreateCamera(0, 0, 0, 100, 100)  ; Front camera
  MoveCamera(0,0,100,100, #PB_Absolute)
  WindowGUI=OpenWindow3D(#PB_Any, 10, 10, 340, 200, "trackbar")
  
  ShowGUI(0, 1) ;Hide the GUI, display the mouse cursor
EndProcedure

Procedure Window_1_Events(event)
      tbval.i = GetGadgetState(TrackBar_1)
      SetGadgetState(TrackBar_0,tbval)
      SetGadgetText(String_0,StrU(tbval))
EndProcedure

OpenWindow_0()
OpenWindow_1()
OpenWindow_2()

Repeat
  ;Traiter la file d'attente des événements windows
  Repeat
    ; capture events
    Event = WindowEvent()  
    EventWindow = EventWindow()
    
    ; manage events
    
    If EventWindow = Window_1
      Window_1_Events(Event)
    EndIf
    
  Until Event = 0
  
  
  ;Traiter la file d'attente des événements windows3D
  Repeat
    Event = WindowEvent3D()
    
    If ExamineMouse()
      InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
    EndIf
    
    If MouseButton(#PB_MouseButton_Left) 
      shininess=(GetGadgetState(TrackBar_1)+1)%80
      SetGadgetText(String_0,StrU(shininess))
      SetGadgetState(TrackBar_0,shininess)
      SetGadgetState(TrackBar_1,shininess)
    EndIf
    
    If ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Tab)
        SetActiveWindow(Window_1)
      EndIf
    EndIf
  Until Event = 0
  
  RenderWorld() 
  FlipBuffers()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

Re: fenetre3D et windowEvents()

Publié : lun. 30/sept./2019 20:45
par ymerdy
Hello,

bon, finalement c'est pas mal de lire la doc.
ReleaseMouse() et l'exemple fourni répondent à mes questions.

En tout cas merci pour l'éclaircissement.

Re: fenetre3D et windowEvents()

Publié : mar. 01/oct./2019 10:30
par Mindphazer
ymerdy a écrit :bon, finalement c'est pas mal de lire la doc.
Et oui.... RTFM comme ils disent... :mrgreen:

Re: fenetre3D et windowEvents()

Publié : mar. 01/oct./2019 12:14
par microdevweb
Ho yes ,read this fucking manual :mrgreen: