To build a more or less serious GUI is very necessary Image Button Gadget. In CEGUI does not. So as CEGUI does not track clicks on a lot of gadgets, such as ImageGadget.
There are some ways to fix it?
			
			
									
									
						3D Image Button gadget
Re: 3D Image Button gadget
Hi Didaktik
if you can't find a 3D Image Button gadget, then i suggest to use the 3D objects as buttons (spheres, cubes, ...). we only picked the body of the object, then we will know its name, then we add code .
we must use sleep_(200) or what is suitable for the system.
but i prefer if there is MouseUp function , since MouseButton can have many moments while pressing the Button.
suitable for static scenes, but for a movable scenes we must reposition these Buttons, haven't tried it.
needs PB 5.50 (for the BodyPick() function
press the Sphere Button to toggle ON/OFF rotation of the graphics shape,
			
			
									
									
						if you can't find a 3D Image Button gadget, then i suggest to use the 3D objects as buttons (spheres, cubes, ...). we only picked the body of the object, then we will know its name, then we add code .
Code: Select all
If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
        InputEvent3D(MouseX(), MouseY(),0)
        
        ent = BodyPick(CameraID(0), MouseButton(#PB_MouseButton_Left), MouseX(), MouseY(), 1)
        If ent = 3
          Sleep_(200)
          x.f+1:y.f=0: ScrollMaterial(3,x,y,#PB_Material_Animated)
          x=0
          rotate ! 1
          
         ElseIf ent = 2: Debug "ok"
                
        EndIf
        
 EndIf
but i prefer if there is MouseUp function , since MouseButton can have many moments while pressing the Button.
suitable for static scenes, but for a movable scenes we must reposition these Buttons, haven't tried it.
needs PB 5.50 (for the BodyPick() function
press the Sphere Button to toggle ON/OFF rotation of the graphics shape,
Code: Select all
;
; ------------------------------------------------------------
;
;   PureBasic - CompoundBody
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
Declare DrawCurve()
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
#CameraSpeed = 1
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/"              , #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures"  , #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Models"    , #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts"    , #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI"        , #PB_3DArchive_FileSystem)
    Parse3DScripts()
    
    ;WorldDebug(#PB_World_DebugBody)
    
     ;-------------------------------
    ; create  material
    CreateMaterial(1, LoadTexture(1, "White.jpg"))
    SetMaterialColor(1, #PB_Material_AmbientColor, #PB_Material_AmbientColors)
    ; 
    CreateMaterial(2, LoadTexture(2, "dirt.jpg"))
    SetMaterialColor(2, #PB_Material_AmbientColor, #PB_Material_AmbientColors)
    
    CreateMaterial(3, LoadTexture(3, "ground_diffuse.png"))
    SetMaterialColor(3, #PB_Material_AmbientColor, #PB_Material_AmbientColors)
    
    CreateMaterial(4, LoadTexture(4, "snow_1024.jpg"))
    CreateMaterial(5, LoadTexture(5, "Geebee2.bmp"))
    
    ;-------------------------------
    CreateCube(1, 1.0)
    CreateSphere(3, 2)
           
    DrawCurve()
    ;Buttons Ground
    ;
    Ground = CreateEntity(#PB_Any, MeshID(1), MaterialID(4), -11,11 , 0)
    ScaleEntity(Ground, 12, 0.4, 6)
    RotateEntity(Ground, 90,0,0)
    CreateEntityBody(Ground, #PB_Entity_StaticBody)
    
    ;buttons:
    CreateCube(2, 3)
    CreateEntity(2, MeshID(2), MaterialID(5),  -8,  11, 0)
    CreateEntityBody(2, #PB_Entity_BoxBody, 0, 0.5, 0.5)
    CreateEntity(3, MeshID(3), MaterialID(3),  -14,  11, 0)
    CreateEntityBody(3, #PB_Entity_SphereBody, 0, 0.5, 0.5)
    
   
    ; camera
    ;
    CreateCamera(0, 0, 0, 100, 100, #True)
    MoveCamera(0,0,2,30, #PB_Absolute)
    CameraBackColor(0, RGB(200,200,100))
    
    ; GUI
    OpenWindow3D(0, 0, 0, 50 , 10 , "")
    HideWindow3D(0,1)
    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor
        
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
        InputEvent3D(MouseX(), MouseY(),0)
        
        ent = BodyPick(CameraID(0), MouseButton(#PB_MouseButton_Left), MouseX(), MouseY(), 1)
        If ent = 3
          Sleep_(200)
          x.f+1:y.f=0: ScrollMaterial(3,x,y,#PB_Material_Animated)
          x=0
          rotate ! 1
          
         ElseIf ent = 2: Debug "ok"
          
                    
        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
        
      EndIf
      
  
      
      MoveCamera  (0, KeyX, 0, KeyY)
      ;RotateCamera(0,  MouseY, MouseX, 0, #PB_Relative)
      If rotate = 0 
        ScrollMaterial(3,0,0,#PB_Material_Animated)
      EndIf
      
      RotateEntity(0, 0,rotate, 0, #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
Procedure DrawCurve()
  Protected.f a, b, x, y, z, t
  Protected n.l
a.f = 0.2 :b.f=0.8 : n=20: t.f
CreateMesh(0, #PB_Mesh_LineStrip, #PB_Mesh_Static) ; #PB_Mesh_LineStrip to joint the points with lines
While t <= 2*#PI
          x = Cos(t) - Cos(6* t)/2 + Sin(14* t)/3
          y = Cos(14* t)/3 + Sin(t)- Sin(6* t)/2 
          z = 0
                          
        MeshVertexPosition(x, y, z)
        MeshVertexColor(RGB(0,0,255))
      
    t + 0.01
  Wend
  ;************************************************************
 FinishMesh(#True)
  SetMeshMaterial(0, MaterialID(1))
  CreateEntity(0, MeshID(0), #PB_Material_None ,0,0,0)
  
  ScaleEntity(0,4,4,4) 
EndProcedure  
Re: 3D Image Button gadget
Code: Select all
;I very seldom use the CEGUI and normally stick to sprites only.
;Anyway, here's a very simple approach, which uses the ImageGadget3D()
;as an ImageButton.
;You need to use LoadTexture() for each image. You can't do a CreateImage()
;and then a CreateTexture() -  and then assign it to the gadget.
;If you create your images with code, you must save them and then reload using LoadTexture().
;Remember to use Add3DArchive(Path,Type) to point to the location of the images you wish to use.
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Structure _iButton
  id.i
  tx.i[2]
  x.i
  y.i
EndStructure
Structure _Base
  ca.i
  sc.i
  wi.i
  wD3.i
  w.i
  h.i
  ev.i
  ibut._iButton
  pressed.i
EndStructure
#ButtonSizeWidth  = 200
#ButtonSizeHeight = 100
Declare.i GetImages(Text.s = "Button", Fnt.i = -1) 
Declare.i Window(Width.i = 1024, Height.i = 768)
Declare.i Main()
Declare.i CheckArea()
Global b._Base
Procedure.i Window(Width.i = 1024, Height.i = 768)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
  Add3DArchive(".", #PB_3DArchive_FileSystem)
  ExamineDesktops()
  If Width = #PB_Any : b\w = DesktopWidth(0) : Else : b\w = Width : EndIf
  If Height = #PB_Any : b\h = DesktopHeight(0) : Else : b\h = Height : EndIf
  
  b\wi = OpenWindow(#PB_Any, 0, 0, b\w, b\h, "Test", #PB_Window_ScreenCentered)
  b\sc = OpenWindowedScreen(WindowID(b\wi), 0, 0, b\w, b\h)
  b\ca = CreateCamera(#PB_Any, 0, 0, 100, 100)
  
  b\pressed = #False
EndProcedure
Procedure.i Main()
  Protected ret.i = getimages()
  
  b\wD3 = OpenWindow3D(#PB_Any, 0, 0, b\w/2 , b\h/2 , "Image button test")
  b\ibut\id = ImageGadget3D(#PB_Any, 10, 10, #ButtonSizeWidth, #ButtonSizeHeight, TextureID(b\ibut\tx[0]))
  b\ibut\x = 10 : b\ibut\y = 10
  
  Repeat
    
    Repeat
      b\ev = WindowEvent()
    Until b\ev = 0
    
    ExamineMouse()
  
    If MouseButton(#PB_MouseButton_Left) = 1 And b\pressed = #False
      If CheckArea() = #True
        InputEvent3D(MouseX(), MouseY(), 1)
        SetGadgetState3D(b\ibut\id, TextureID(b\ibut\tx[1]))
        b\pressed = #True
      Else
        InputEvent3D(MouseX(), MouseY(), 0)
      EndIf
    ElseIf MouseButton(#PB_MouseButton_Left) = 0 And b\pressed = #True
      InputEvent3D(MouseX(), MouseY(), 0)
      SetGadgetState3D(b\ibut\id, TextureID(b\ibut\tx[0]))
      b\pressed = #False
    Else
      InputEvent3D(MouseX(), MouseY(), 0)
    EndIf      
    RenderWorld()
    
    FlipBuffers()
    
    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure
Procedure.i CheckArea() 
  Protected Value.i = #False
  If MouseX() > b\ibut\x And MouseX() < b\ibut\x + #ButtonSizeWidth
    If MouseY()> b\ibut\y And MouseY() < b\ibut\y + #ButtonSizeHeight
      Value = #True
    EndIf
  EndIf
  ProcedureReturn Value
EndProcedure
Procedure.i GetImages(Text.s = "Button", Fnt.i = -1) ;Make a simple button
  Protected file.s = ""
  Protected im.i, tx.i
    im = CreateImage(#PB_Any, #ButtonSizeWidth, #ButtonSizeHeight, 32)
    StartDrawing(ImageOutput(im))
    DrawingMode(#PB_2DDrawing_Default)
    RoundBox(0, 0, #ButtonSizeWidth, #ButtonSizeHeight, 4, 4, $DCD8D4)
    DrawingMode(#PB_2DDrawing_Outlined)
    RoundBox(0, 0, #ButtonSizeWidth, #ButtonSizeHeight, 4, 4, $969999)
    DrawingMode(#PB_2DDrawing_Transparent)
    If Fnt > -1  : DrawingFont(FontID(Fnt)) : EndIf ;Default font or...
    DrawText((#ButtonSizeWidth / 2) - (TextWidth(Text)/2) , (#ButtonSizeHeight / 2) - (TextHeight(Text)/2), Text, $2A2A2A)
    StopDrawing()
    SaveImage(im, "Down.bmp", #PB_ImagePlugin_BMP)
    FreeImage(im)
    
    im = CreateImage(#PB_Any, #ButtonSizeWidth, #ButtonSizeHeight, 32)
    StartDrawing(ImageOutput(im))
    DrawingMode(#PB_2DDrawing_Default)
    RoundBox(0, 0, #ButtonSizeWidth, #ButtonSizeHeight, 4, 4, $D5D5D5)
    DrawingMode(#PB_2DDrawing_Outlined)
    RoundBox(0, 0, #ButtonSizeWidth, #ButtonSizeHeight, 4, 4, $5B2C46)
    DrawingMode(#PB_2DDrawing_Transparent)
    If Fnt > -1  : DrawingFont(FontID(Fnt)) : EndIf ;Default font or...
    DrawText((#ButtonSizeWidth / 2) - (TextWidth(Text)/2)+2 , (#ButtonSizeHeight / 2) - (TextHeight(Text)/2)+2, Text, $8A8D8A)
    StopDrawing()
    SaveImage(im, "Up.bmp", #PB_ImagePlugin_BMP)
    FreeImage(im)
   
    b\ibut\tx[0] = LoadTexture(#PB_Any, "Down.bmp")
    b\ibut\tx[1] = LoadTexture(#PB_Any, "Up.bmp")
    ProcedureReturn #True
  EndProcedure
  
  Window()
  Main()
Current configurations: 
Ubuntu 20.04/64 bit - Window 10 64 bit
Intel 6800K, GeForce Gtx 1060, 32 gb ram.
Amd Ryzen 9 5950X, GeForce 3070, 128 gb ram.
						Ubuntu 20.04/64 bit - Window 10 64 bit
Intel 6800K, GeForce Gtx 1060, 32 gb ram.
Amd Ryzen 9 5950X, GeForce 3070, 128 gb ram.
Re: 3D Image Button gadget
DK_PETER, thx!
But this code not work in ScrollAread3D. And it will be very difficult to alter it for ScrollArea.
			
			
									
									
						But this code not work in ScrollAread3D. And it will be very difficult to alter it for ScrollArea.
Re: 3D Image Button gadget
Faced the same problem. Requires either "ImageButtonGadget3d"  or event tracking (click) on ImageGadget3d
			
			
									
									site created by purebasic work-flow-Initiative
						

