GG,
thanks a ton for your help, you definitely got me pointed in the right direction...
here's what I have discovered: exactly as you had demonstrated above, the pick screen command used the distance to be a straight line from the camera. I had assumed it was creating a plane perpendicular to the camera. so in other words, I had been under the impression that as the pick screen command used coordinates closer to the edge of the screen, the depth was measured using the center of the screen.
however since the depth uses a straight line distance, it creates a "radius" around the camera the closer to the screen edge the coordinates become.
after several, several, SEVERAL hours of my weekend (and i rather annoyed wife

) I devised a function to make up for the difference using geometry.
In other words, my problem is ALMOST completely solved. the planes are scaled, positioned, and rotated properly, however they appear to jitter a bit in their positions. I am thinking it has something to do with float rounding or casting. But after hours of going over this code, I cant seem to pin it down. Have a look:
(No media)
Rem ***** Included Source File *****
autocam off
set display mode 1280,720,32
set window off
set camera range 0.001,2000
global screenwidth : screenwidth = screen width()/2
global screenheight : screenheight = screen height()/2
sync on :sync rate 60 `: set window off
make matrix 1,100,100,100,100
position camera 50,1,50
cap = 5
type ltrb
l as integer
t as integer
r as integer
b as integer
color as float
endtype
dim cap(1000) as ltrb
num =1
do
if mouseclick()=1
inc num
cap(num).l = mousex()
cap(num).t = mousey()
cap(num).r = mousex()+100
cap(num).b = mousey()+100
cap(num).color= rgb(rnd(255),rnd(255),rnd(255))
endif
yrotate camera camera angle y()+0.5
text 5,5,"FPS: "+str$(screen fps())
text 5,25,"GUI OBJECTS: "+str$(num)
for o = 1 to num
update_gui(cap(o).l, cap(o).t, cap(o).r, cap(o).b, o, cap(o).color)
next o
sync
loop
function update_gui(l,t,r,b,guiobjnum,color#)
if object exist(guiobjnum) = 0
make object plane guiobjnum,100,100,0
`color object guiobjnum,color#
set object emissive guiobjnum,color#
disable object zread guiobjnum
endif
pick screen screenwidth, screenheight,1000.0000
centervectorx# = get pick vector x()
centervectory# = get pick vector y()
centervectorz# = get pick vector z()
pick screen r,t,1000.0000
oldvecrtx# = get pick vector x()
oldvecrty# = get pick vector y()
oldvecrtz# = get pick vector z()
pick screen l,t,1000.0000
oldvecltx# = get pick vector x()
oldveclty# = get pick vector y()
oldvecltz# = get pick vector z()
pick screen r,b,1000.0000
oldvecrbx# = get pick vector x()
oldvecrby# = get pick vector y()
oldvecrbz# = get pick vector z()
pick screen l,b,1000.0000
oldveclbx# = get pick vector x()
oldveclby# = get pick vector y()
oldveclbz# = get pick vector z()
`calculate magnitudes
center# = 1000.0000 `sqrt(centervectorx#^2 + centervectory#^2 + centervectorz#^2)
rb# = 1000.0000 `sqrt(oldvecrbx#^2 + oldvecrby#^2 + oldvecrbz#^2)
rt# = 1000.0000 `sqrt(oldvecrtx#^2 + oldvecrty#^2 + oldvecrtz#^2)
lb# = 1000.0000 `sqrt(oldveclbx#^2 + oldveclby#^2 + oldveclbz#^2)
lt# = 1000.0000 `sqrt(oldvecltx#^2 + oldveclty#^2 + oldvecltz#^2)
`calculate scalar/dot products
rbdot# = (oldvecrbx#*centervectorx#)+(oldvecrby#*centervectory#)+(oldvecrbz#*centervectorz#)
rtdot# = (oldvecrtx#*centervectorx#)+(oldvecrty#*centervectory#)+(oldvecrtz#*centervectorz#)
lbdot# = (oldveclbx#*centervectorx#)+(oldveclby#*centervectory#)+(oldveclbz#*centervectorz#)
ltdot# = (oldvecltx#*centervectorx#)+(oldveclty#*centervectory#)+(oldvecltz#*centervectorz#)
`calculate the angles from the center of screen using the inverse cosigns of the dot products and magnitudes
rtangle#=acos(rtdot#/(center#*rt#))
lbangle#=acos(lbdot#/(center#*lb#))
rbangle#=acos(rbdot#/(center#*rb#))
ltangle#=acos(ltdot#/(center#*lt#))
`calculate the 4 corners using the calculated hypotenuses of the 4 corner vectors
pick screen l,b,1.0000/sin(90.0000-lbangle#) *.1
nlbx# = get pick vector x()
nlby# = get pick vector y()
nlbz# = get pick vector z()
pick screen r,t,1.0000/sin(90.0000-rtangle#) *.1
nrtx# = get pick vector x()
nrty# = get pick vector y()
nrtz# = get pick vector z()
pick screen r,b,1.0000/sin(90.0000-rbangle#) *.1
nrbx# = get pick vector x()
nrby# = get pick vector y()
nrbz# = get pick vector z()
pick screen l,t,1.0000/sin(90.0000-ltangle#) *.1
nltx# = get pick vector x()
nlty# = get pick vector y()
nltz# = get pick vector z()
`calculate width and height based on differences of calculated corners
width# = sqrt(((nrbx#-nlbx#)^2)+((nrby#-nlby#)^2)+((nrbz#-nlbz#)^2))
height# = sqrt(((nrtx#-nrbx#)^2)+((nrty#-nrby#)^2)+((nrtz#-nrbz#)^2))
`text 5,400,str$(width#)
`text 5,420,str$(height#)
`width# = 105*.01
`height#=058*.01
`scale based on height# and width#
scale object guiobjnum,width#,height#,100
`set to proper rotation
set object to camera orientation guiobjnum
`position object on bottom right corner
position object guiobjnum,nltx#+camera position x(), nlty#+ camera position y(), nltz#+camera position z()
`move to appropriate location
`move object guiobjnum,1
move object down guiobjnum, height#*.5 `object size y(guiobjnum,1)*0.5
move object right guiobjnum, width#*.5 `object size x(guiobjnum,1)*0.5
`set object light guiobjnum,0
endfunction
Please excuse my terrible coding and commenting, im always on short time over the weekends.
Anyone that can eliminate the jitter will be my best friend forever.
P.S. After hitting 1000 gui objects I am still pulling a solid 46-48 FPS on my laptop. It seems that this function is fast enough for complete GUI handling despite the extensive use of SQRT and pick screen. Also, it is easily modified to texture the objects and add other effects like alpha masking. Once i can work out the bugs I will post some final code for everyone
Sadly, programming is only a hobby for me right now. As it turns out, driving a 70 ton, 7 million dollar Abrams tank requires less qualification than pecking away at a keyboard. Who'da thunk it?