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
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
*/