Interactive PowerBasic Forum

IT-Consultant: Charles Pegge => OxygenBasic Examples => Topic started by: Frank BrĂ¼bach on December 27, 2023, 10:39:03 AM

Title: Toolbar Toolbox + Scenes opengl
Post by: Frank BrĂ¼bach on December 27, 2023, 10:39:03 AM
Good morning

Made a combined example with toolbar and vector Data Panel example

My new question:
It's possible to Clean (clear) an OpenGL Scene complete by a Mouse click of a toolbar Button and reload this Scene again?

Btw all objects in Scene you can move  here

OpenGL / consoleG example

-------- experiment to combine triangle data with slider overlapped
  '-------- oxygenbasic, by frank bruebach, 27-11-2023
  '
  '17:29 03/12/2023 CP
  '27-12-2023, FB, toolbar/toolbox included :-)
  '
  #compact
 '%filename "t.exe"
 'uses RTL64
  '% Title "Triangle Data:  Move points with mouse and arrow keys etc"
  % Title "Triangle Data + moving Toolbar:  Move points with mouse and arrow keys etc"

 '% WindowStyle WS_OVERLAPPEDWINDOW
 '% Animated
 '% ScaleUp
  % PlaceCentral
  % AnchorCentral
  '% shaders

  uses consoleG
 'uses glo2/geoplanar
  'uses ControlPanels

  uses controls
  ===================
  class ControlPanelA
  ===================
  float  x,y,z
  int    id
  float  xx,yy,zz
  float  dx,dy,dz
  float  sc
  int    lock
  int    t1,t2
  int    f1,f2
  string lbl
  ===================
  sliders      c[4]
  lightbuttons l[4]
  ===================

  method act(optional int n)
  indexbase 1
  if id=0
    f1=0 'cube
    f2=0 'pent
    ==========================================================================
    'ctrl   x    y   z     sc    shm shb tex id  lk  lbl
    --------------------------------------------------------------------------
    c[1]=>-.40,-.00, .00,  0.10, f1, 00, t1, 10, 1, "slider"
    c[2]=>-.30,-.00, .00 , 0.10, f2, 00, t1, 20, 1, "slider"
    c[3]=>-.20,-.00, .00 , 0.10, f2, 00, t1, 30, 1, "slider"
    c[4]=>-.10,-.00, .00 , 0.10, f2, 00, t1, 40, 1, "slider"
    -------------------------------------------------------------------------
    l[1]=>-.40, .15, .00,  0.02, f1, 00, t1, 50, 1, "light button"
    l[2]=>-.30, .15, .00 , 0.02, f2, 00, t1, 60, 1, "light button"
    l[3]=>-.20, .15, .00 , 0.02, f2, 00, t1, 70, 1, "light button"
    l[4]=>-.10, .15, .00 , 0.02, f2, 00, t1, 80, 1, "light button"
    ==========================================================================
    id=1+n
    int i
    for i=1 to 4
      c[i].id+=n
      l[i].id+=n
    next
  end if
  '
  glpushmatrix
  gltranslatef  x,y,z
  '
  gltranslatef -.25,.0,-.0005
  if sc then glscalef sc,sc,1.0
  if pick
    PickLabel id
  else
    QuadShadow .20,.20,.005,.5
    glcolor3f     .60,.50,.60 'fix alpha bug
    glcolor4f     .60,.50,.60,0.50 'box
  endif
  QuadTex       .20,.20,.0.01
  gltranslatef  .25,.0,-.0
  '
  'DISPLAY LABELS
  if lbl
    glpushmatrix
    gltranslatef -.43,-.13,.0005
    glcolor4f .9,.9,.4,.9
    float j=0.015
    'DISPLAY EACH SLIDER VALUE
    for i=1 to 4
      glpushmatrix
      gltranslatef j,0,0
      glscalef  .035,.035,.035
      if pick
        gltranslatef -.1,-.18,.0
        picklabel id+i
        PutBoxArea 2,1
        gltranslatef .1,.18,.0
      else
        if picked=id+i 'edit
          ------------
          'DATA EDITING
          color 0.9,0.9,0.9
          'box-around
          gltranslatef -.1,-.18,.0
          glBegin GL_LINE_STRIP
          glVertex2f 0,0
          glVertex2f 2,0
          glVertex2f 2,1
          glVertex2f 0,1
          glVertex2f 0,0
          glEnd
          gltranslatef .1,.18,.0
          '
          static string ss
          ss= str(50+c[i].vy*50,0) '0..100
          input ss
          c[i].vy=(val(ss)-50) *0.02
          '
          static int cpick,cy,cx
          if cpick<>picked
            cp=le+1 'place cursor at end of string
            cy=y
            cx=x
            cpick=picked
          endif
          '
          select lastkey
          case VK_UP
            c[i].vy+=0.01
          case VK_DOWN
            c[i].vy-=0.01
          case VK_PRIOR 'PGUP
            c[i].vy+=0.01
          case VK_NEXT 'PGDN
            c[i].vy-=0.01
          case 9 'tab
            if GetAsyncKeyState(VK_SHIFT)=0
              picked++
              if picked>id+4
                picked=id+4
              end if
            else 'left
              picked--
              if picked<id+1
                picked=id+1
              endif
            endif
          end select
          lastkey=0
          lastchar=0
        else 'display
          gprint str(50+c[i].vy*50,0) '0..100
          'gprint str((c[i].vy)*100 , 0) -100..100
        endif
      endif
      glpopmatrix
      j+=0.1
    next
    'DISPLAY MAIN PANEL LABEL
    gltranslatef 0,-.05,0
    glscalef  .04,.04,.04
    glcolor4f .9,.9,.0,.9
    gprint lbl
    glpopmatrix
  endif
  '
  '
  if bleft
    if picked=id
      if not lock
        drag(dx,dy,1.0/sc)
        x=xx+dx : y=yy+dy
      end if
    end if
  else
    xx=x : yy=y : zz=z 'ANCHOR
  end if
  '
  'render
  '
  int i,oi1,oi2
  for i=1 to 4
    c[i].act(1,i,oi1)
    l[i].act(1,i,oi2)
  next
  glpopmatrix
  '
  'show data
  '
  'glDisable GL_TEXTURE_2D
  glDisable GL_LIGHTING
  '
  glPushMatrix
  glLoadIdentity
  if pick
    PickLabel 0
  endif
  gltranslatef -.5,.35,-1.0
  float w,h
  glscalef     .05,.05,.01
  GetWordArea  "Control:",w,h
  if pick
    PutBoxArea   w,h
  else
    /*
    glColor3f    .99,.99,.00
    gprint       "Control: "
    glColor3f    .99,.99,.99
    gprint    str(picked)
    if oi1+oi2
      gprint "   "
      if oi1 then gprint str((1.0+c[oi1].vy)*50 , 0)
      if oi2 then gprint str (l[oi2].lit)
    end if
    */
  end if
  glPopMatrix
  end method
  '
  method destructor()
  ===================
  'del this.label
  'sliders      c[4]
  'lightbuttons l[4]
  int i
  for i=1 to 4
    c[i].destructor
  next
  for i=1 to 4
    l[i].destructor
  next
  end method
  '
  end class

  '#recordof ControlPanelA


'-------------------------------------------------------- //
  procedure QuadTex(float xp=0.15,yp=0.0,xq=1.0,yq=1.0)
  ====================================================
  'Configured As Front Face
  glBegin GL_TRIANGLE_STRIP
  glNormal3f   0.0 , 0.0  , 1.0
  float u=1.25 '1.0
  float n=0.0
  glTexCoord2f xp , yp
  glVertex3f -u , -u , n
  glTexCoord2f xq , yp
  glVertex3f  u , -u , n
  glTexCoord2f xp , yq
  glVertex3f -u ,  u , n
  glTexCoord2f xq , yq
  glVertex3f  u ,  u , n
  glEnd
  end procedure


  procedure QuadTex2(float xp=0.15,yp=0.0,xq=1.0,yq=1.0)
  ====================================================
  'Configured As Front Face
  glBegin GL_TRIANGLE_STRIP
  glNormal3f   0.0 , 0.0  , 1.0
  float u=1.25 '1.0
  float n=0.0
  glTexCoord2f xp , yp
  glVertex3f -u , -u , n
  glTexCoord2f xq , yp
  glVertex3f  u , -u , n
  glTexCoord2f xp , yq
  glVertex3f -u ,  u , n
  glTexCoord2f xq , yq
  glVertex3f  u ,  u , n
  glEnd
  end procedure

  'Keys: Esc, arrow-keys, n,m, F4

  indexbase 1
  sys       texn[16]
  sys       GdiplusToken
  float     ang1
  sys       cube,pent

  BeginScript '------------------------------------------------- //

  procedure main() 'triangle-data example
  ================

  static single ra,ri,angi1=.5
  static sys    initscene
  static float rr=.5,gg=.5,bb=.5,aa=.8 'object color
  '
  '
if opening
    'CreateTexture imgn, "Tassecafe.png" ''"AppTools.png"
    'if opening
    'sub LoadTexture(optional string fi, int n,res,*wi,*ht,*pflip)
    texe=6
    static int imgn[]={1,2,3,4,5,6}
    static int wi[6],ht[6]
    LoadTexture  ("..\..\images\sonne1a.jpg",imgn[1],0,Wi[1],Ht[1])
    LoadTexture  ("..\..\images\ironman1.jpg",imgn[2],0,Wi[2],Ht[2])
    LoadTexture  ("..\..\images\captainmarvel2.jpg",imgn[3],0,Wi[3],Ht[3])
    LoadTexture  ("..\..\images\promethan1.jpg",imgn[4],0,Wi[4],Ht[4])
    LoadTexture  ("..\..\images\bladerunner1.jpg",imgn[5],0,Wi[5],Ht[5])
    LoadTexture  ("..\..\images\captainmarvel.jpg",imgn[6],0,Wi[6],Ht[6])
  end if
 
  cls ' .3,.3,.5
  'move 20,-15
  'move 5,-5
  move 2,-2
  pushstate
  UserMovement m5,500 'for moveable box

'
  'display toolbar 1 ------------------- //
  '
  flat
  color 1,1,1,.4 'translucent panel
  texture 0
  pushstate
  'move 6,0
   move 8,0
  scale 10,1.25,1
 
  quadtex()
  popstate
  move 0,0,.0001
  color 1,1,1,.9
  int btnclick
  texture imgn
  'scale 1.0, 1.0*imgnHt/imgnWi, 1.0 'dimensions of box strip
  '
  'separate button icons
  int i
  static int k
  float x=0.015
  for i=1 to 6 'each button
    if picked=200+i
      k=200+i
       pushstate
       move -1.5,-2.5
       color 0.5,0.8,0,.9
       scale 1.25,1.25
       gprint "btn: "+ k
       '------------------------------ // how to clear of all objects the whole opengl scene?
       if not btnclick = 1 then
       'gprint "clear scene to zero"
       ''procedure main() : cls : end procedure
   
       glClearColor 0.0,0.0,0.0,1.0
       glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
       'GL_DEPTH_BUFFER_BIT ''cleanscreen and depth buffer
       glEnable GL_DEPTH_TEST
       glLoadIdentity() 'Reset the projection matrix

       end if
       popstate
       '------------------------------ // how to clear of all objects the  whole opengl scene?
    endif
    if k=200+i
      color 1,.5,1,.9
    else
      color 1,1,1,.9
    endif
    texture imgn[i]
    picklabel 200+i
    quadtex(0.0,.0.0,1.0,1.0) 'whole images
    'quadtex(x,.68,x+.1,.78) 'portion of image
    'quadtex(x,.68,x+.1,.78) 'portion of image
    'x+= .15 '.2
    move 3.25,0 ' place between buttons with icons
   next 'button
  texture 0
'  popstate

  popstate
'-------------------------------------------------------- //
  'WaitForEvent '0 off 1 on (default on)
  static quad t1,t2

  if opening 'FIRST CALL ONLY
    timemark t1
    'picked=100
    'mbox "helo"
  end if
  '
  if closing 'FINAL CALL BEFORE SHUTDOWN
    'mbox "Bye!"
    exit sub
  end if
  '
  cls

  'BACKGROUND GRID
  ================
  if not pick
    pushstate
    color .2,.4,.6,1.0
    thickness 1
    move -50,-30, -2.002
    grid 1,100,60
    popstate
  endif

  '---------------------
  subroutine ShowPolygon
  ======================
  '
  pushstate 'polygon
  pushstate 'mpol
  static moveableobject mpol
  mpol.id=900
  mpol.mode=1
  mpol.act
  float zp=-0.001
  '
  'move 0,0,-1
  shading
  UserMovement mu,2100,3 'symbol identity, count
  if opening
    mu[1].x= 0
    mu[1].y= 5
    mu[2].x=-5
    mu[2].y=-5
    mu[3].x= 5
    mu[3].y=-5
  endif
  scale 1
  picklabel 0
  int i
  for i=1 to 3
    pushstate
    mu[i].act
    color 1,.9,0,1
    scale 0.4
    go sphere
    popstate
  next
  '
  picklabel 0
  '
  float xa,xb,xc,ya,yb,yc
  xa=mu[1].x : ya=mu[1].y
  xb=mu[2].x : yb=mu[2].y
  xc=mu[3].x : yc=mu[3].y
  '
  'MOUSE DRAG ADJUSTMENT
  select picked
    'mu.id ...
    case 2100 : xa+=mu[1].d.x : ya+=mu[1].d.y
    case 2200 : xb+=mu[2].d.x : yb+=mu[2].d.y
    case 2300 : xc+=mu[3].d.x : yc+=mu[3].d.y
  end select
  flat
  thickness 2
  '
  color 1,1,0,1
  '
  pushstate
  move xa-.5,ya-1
  gprint "A"
  popstate
  '
  pushstate
  move xb+1,yb+1
  gprint "B"
  popstate
  '
  pushstate
  move xc-1,yc+1
  gprint "C"
  popstate
  '
  color rr,gg,bb,aa 'linked to slider panel 1
  picklabel mpol.id
  float zp=-0.001
  glBegin GL_TRIANGLES
  glVertex3f xa,ya,zp
  glVertex3f xb,yb,zp
  glVertex3f xc,yc,zp
  glEnd
  picklabel 0
  '
  color 0,.9,.9
  glBegin GL_LINES
  glVertex2f xa,ya
  glVertex2f xb,yb
  glVertex2f xb,yb
  glVertex2f xc,yc
  glVertex2f xc,yc
  glVertex2f xa,ya
  glEnd

  popstate 'mpol
  move 5

    move -20,12
    static sys tally
    timemark t2
    scale 1.0
    '
    int dp=3
    '    '
    pushstate 'md
    move 0,0,0.99
    color .5,.5,.7,.7
    static moveableobject md
    md.id=400
    md.mode=1
    md.act
    float zp=-0.001
    glBegin GL_QUADS
      glVertex3f -.1,-17,zp
      glVertex3f 11,-17,zp
      glVertex3f 11,2,zp
      glVertex3f -.10,2,zp
    glEnd
    if pick
      goto nDataPanel
    endif
    '
    macro pr1(a) 'PRINTING LIST
    -----------------------------
      pushstate : color .5,1,1 : print a : popstate
      printl ""
    end macro
    '
    macro pr2(a,b) 'PRINTING LIST
    -----------------------------
      pushstate : color .5,1,1 : print a : popstate
      pushstate : color 1,1,.5 : move 4 : print str(b,dp) : popstate
      printl ""
    end macro
    '
    macro pr3(a,b,c) 'PRINTING LIST
    ------------------------------
      pushstate : color .5,1,1 : print a : popstate
      pushstate : color 1,1,.5 : move 4 : print str(b,dp) : popstate
      pushstate : color 1,1,.5 : move 8 : print str(c,dp) : popstate
      printl ""
    end macro
    '
    '
    'DISPLAY INFO
    -------------
    picklabel 0

    pushstate
    scale 2
    color 1,1,1
    print "Triangle Data"
    popstate
    pr1 ""
    pr1 ""
   'pr2 "Action Code:   ", act
   'pr2 "indexbase      ", indexbase
   'pr2 "Keyboard Code: ", keyd
    pr2 "Picked ID:     ", picked
    '
    pr3 "Point A: ", str(xa,3), ya
    pr3 "Point B: ", str(xb,3), yb
    pr3 "Point C: ", str(xc,3), yc
    '
    float ab,ac,bc,ar,ht,hb
    '
    ab=hypot(xa-xb, ya-yb)
    ac=hypot(xa-xc, ya-yc)
    bc=hypot(xb-xc, yb-yc)
    '
    hb=0.5* ( ab*ab - ac*ac + bc*bc ) / bc
    ht=sqr(ab*ab-hb*hb)
    ar=0.5*bc*ht

    'ANGLES
    float na,nb,nc
    nb=deg(asin(ht/ab))
    nc=deg(asin(ht/ac))
    na=180-nb-nc

    pr1 ""
    pr2 "Angle A:",na
    pr2 "Angle B:",nb
    pr2 "Angle C:",nc
   
    pr1 ""
    pr2 "Line AB:",ab
    pr2 "Line AC:",ac
    pr2 "Line BC:",bc
    pr2 "Left base:",hb
    pr2 "Height:",ht
    pr2 "Area:", ar
    pr1 ""
    '
    nDataPanel:
    ===========
    popstate 'md
    picklabel 0
    '
    'end polygon display
    '--------------------
    '
    popstate 'polygon
  end subroutine

  'PANEL DISPLAY
  ==============

  static single ra,ri,angi1=.5
  static sys    initscene
 
  '------------------------------
 'glClearColor 0.5, 0.5, 0.7, 0
 'glClearColor 0.1, 0.2, 0.1, 0
  '
  glColor4f .99,.99,.99,.99
  'glEnable GL_TEXTURE_2D
  '
  'RENDERED LOWEST FIRST (FOR TRANSPARENCY BLENDING)
  '
  %                    ordn=1
  static ControlPanelA cb[ordn]
  static int           ord[16]
  static int           idb[16]
  '
  if closing
    int i
    for i=1 to ordn
      cb[i].destructor
    next
    exit sub
  endif
 
  '
  'INITIAL PLACEMENT ETC
  '
  if initscene=0
    ord={1,2,3}
    idb={100,200,300} 'panel identities
    cb[1].x=.8 : cb[1].y=.6 : cb[1].lbl="Color"
    int i
    'set scale
    for i=1 to ordn : cb[i].sc=2.5 : next
    initscene=1
  end if
  '
  'ORDER OF BUILD (SUPPORTING TRANSPARENCY)
  '
  if picked and bleft
    int a=1+trunc(picked/100)
    PlaceTop(a,ord,ordn)
  end if
  '
  'RENDER SCENE
  '
  move 0,0,-2
  gosub ShowPolygon
  move 0,0,2
  '
  glpushmatrix
  static float layr=.001
  static float f = -1 - layr*ordn
  glscalef 15,15,1
  gltranslatef .0, .0, f
  int i,j
  for i=1 to ordn
    j=ord[i]
    cb[j].act idb[j] 'set identity
    gltranslatef .0, .0, layr 'next micro-layer in front
  next
  '
  'LINK TO SLIDERS
  'COLOR
  rr=0.5+cb[1].c[1].vy*.5
  gg=0.5+cb[1].c[2].vy*.5
  bb=0.5+cb[1].c[3].vy*.5
  aa=0.5+cb[1].c[4].vy*.5
  glpopmatrix
  '
'  ang1+=angi1
'  if ang1>=360 then ang1-=360
  end procedure 'main
  EndScript

  '

How to clear OpenGL Scene with all objects? And reload IT after deleting with another Button click?

Gl_color_buffer_bit or gl_depth_buffer_bit
and deleteObject(initscene) etcpp seems good but Not enough Missing 5 percent
See my Code snippet below

...

glClearColor 0.0,0.0,0.0,1.0
       glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
       'GL_DEPTH_BUFFER_BIT ''cleanscreen and depth buffer
       glEnable GL_DEPTH_TEST
       DeleteObject(initscene)
       glEnable GL_DEPTH_TEST
       glDepthFunc GL_LEQUAL
       glPolygonMode GL_FRONT_AND_BACK, GL_LINE
       KillTimer initscene,1
       'CLOSE
       'DeleteObject(mpol)
       glDeleteLists 1000, 255
       glLoadIdentity() 'Reset the projection matrix
       ...

Regards Frank
Title: Re: Toolbar Toolbox + Scenes opengl
Post by: Charles Pegge on December 27, 2023, 10:06:24 PM
Hi Frank,

The scene is naturally cleared at the beginning of each frame, up to 60 times per second, so all you have to do is remove the items you don't want to appear.

With regard to creating / editing / deleting separate items. I think the easiest path is to develop the keyboard interface first before devising GUI toolboxes.

I'm developing the Key control side gradually. Many functions can be implemented by holding a key down then using the mouse to point and click.

Some I have been working on:
/*
  'hold down key, point and click
  -------------------------------
  M    move
  N    node / point
  L    line (point to point)
  P    polygon (point series)
  C    set color
  G    show grid (toggle)
  Q    show OBJ format
  Z    consolidate / pack / remove deleted items
  Del  delete
*/