Ok, couldn't find the really new one, or extract it from my edit cause it's heavy built into other stuff like selection which you will end up doing. But I found an example of my old one, maybe you can get some examples from this, also includes two selection types:
Tip: It's long, so for quick highlighting, click and hold the un-open code box from underneath and drag up over it and it will highlight all the code in the box.
`Initialize Routine
`------------------------------------------------------------------------------------------
#constant c_Mouse_LeftClick 1
#constant c_Mouse_RightClick 2
#constant c_Mouse_WheelClick 3
type UDT.ConstantVector
x as float
y as float
z as float
endtype
type UDT.Mouse
Click as integer
OldClick as integer
X as integer
Y as integer
LastX as integer
LastY as integer
MoveX as integer
MoveY as integer
endtype
global g_Mouse as UDT.Mouse
global g_TempVector as UDT.ConstantVector
global g_DistVector as dword : g_DistVector = 1
null = make vector3(g_DistVector)
InitializeObjectSelection()
`Setup Routine
`------------------------------------------------------------------------------------------
`load dll "user32.dll",1
`Sw=call dll(1,"GetSystemMetrics",0)
`Sh=call dll(1,"GetSystemMetrics",1)
`delete dll 1
`set display mode Sw,Sh,32,0
sync on : sync rate 60
set text font "Tahoma"
set text size 16
`Set Up Camera
autocam off
position camera 0,0,-128.0
color backdrop 0
SetupObjectSelection()
FromMeshNum = FreeObject()
`Create some objects to play with
for n = 1 to 25
MeshNum = FreeObject()
flag = rnd(2)
select flag
case 0 : make object cube MeshNum,12+rnd(20) : endcase
case 1 : make object sphere MeshNum,12+rnd(20) : endcase
case 2 : make object cone MeshNum,12+rnd(20) : endcase
endselect
position object MeshNum,rnd(256)-128,rnd(256)-128,rnd(256)-128
next n
do
`Update mouse
g_Mouse.OldClick = g_Mouse.Click
g_Mouse.Click = mouseclick()
g_Mouse.X = mousex()
g_Mouse.Y = mousey()
g_Mouse.MoveX = mousemovex()
g_Mouse.MoveY = mousemovey()
`Update Camera
if g_Mouse.Click = c_Mouse_RightClick and g_Mouse.OldClick <> c_Mouse_RightClick
g_Mouse.OldClick = c_Mouse_RightClick
g_Mouse.LastX = g_Mouse.X : g_Mouse.LastY = g_Mouse.Y
g_Mouse.MoveX = 0 : g_Mouse.MoveY = 0
endif
if g_Mouse.Click = c_Mouse_RightClick and g_Mouse.OldClick = c_Mouse_RightClick
cr# = 0.0 : cf# = 0.0
if rightkey()=1 or KEYSTATE(32)=1 then cr# = -1.5
if leftkey()=1 or KEYSTATE(30)=1 then cr# = 1.5
if upkey()=1 or KEYSTATE(17)=1 then cf# = 1.5
if downkey()=1 or KEYSTATE(31)=1 then cf# = -1.5
ncr#=curvevalue(cr#,ncr#,2.5)
ncf#=curvevalue(cf#,ncf#,2.5)
cx#=cx#+g_Mouse.MoveY*0.2
cy#=cy#+g_Mouse.MoveX*0.2
if cx#>80 then cx#=80
if cx#<-80 then cx#=-80
ncx#=curveangle(cx#,ncx#,2.5)
ncy#=curveangle(cy#,ncy#,2.5)
move camera ncf#
rotate camera 0,wrapvalue(ncy#-90),0
move camera ncr#
rotate camera 0,wrapvalue(ncy#+90),0
rotate camera ncx#,ncy#,0
position mouse g_Mouse.LastX, g_Mouse.LastY
endif
UpdateObjectSelection( FromMeshNum, MeshNum )
sync
loop
function GetDistVector( Pos1 as UDT.ConstantVector, Pos2 as UDT.ConstantVector )
local Dist as float
set vector3 g_DistVector,Pos2.x-Pos1.x,Pos2.y-Pos1.y,Pos2.z-Pos1.z
Dist = length vector3( g_DistVector )
endfunction Dist
function FreeObject()
local n as dword
repeat
inc n
until not object exist(n)
endfunction n
Rem ***** Included Source File *****
#constant c_MaxSelectedObjects 127
#constant c_ObjectSelectionType_Select 0
#constant c_ObjectSelectionType_Move 1
#constant c_ObjectSelectionType_Rotate 2
#constant c_ObjectSelectionType_Scale 3
#constant c_ObjectRegionSelectionType_Rectangular 0
#constant c_ObjectRegionSelectionType_Paint 1
#constant c_GizmoPointerOffset 16.0
#constant c_GizmoComponentSelectionColor rgb(255,255,0)
#constant c_GizmoComponentXColor rgb(255,0,0)
#constant c_GizmoComponentYColor rgb(0,255,0)
#constant c_GizmoComponentZColor rgb(0,0,255)
#constant c_GizmoTypeMove 0
#constant c_GizmoTypeRotate 1
#constant c_GizmoTypeScale 2
#constant c_MoveGizmoPointerScaleX 35.0
#constant c_MoveGizmoPointerScaleY 100.0
#constant c_MoveGizmoPointerScaleZ 35.0
type UDT.ObjectSelectionList
ObjectNum as dword
Position as UDT.ConstantVector
Rotation as UDT.ConstantVector
endtype
type UDT.GizmoAxisComponent
PointerMeshNum as dword
WireMeshNum as dword
Color as dword
bSelected as boolean
bOver as boolean
Position as UDT.ConstantVector
Rotation as UDT.ConstantVector
endtype
type UDT.Gizmo
PointMeshNum as dword
bHidden as boolean
CamDist as float
CamAngle as UDT.ConstantVector
ComponentX as UDT.GizmoAxisComponent
ComponentY as UDT.GizmoAxisComponent
ComponentZ as UDT.GizmoAxisComponent
Position as UDT.ConstantVector
LastPosition as UDT.ConstantVector
OffsetPosition as UDT.ConstantVector
Rotation as UDT.ConstantVector
endtype
function InitializeObjectSelection()
global dim _ObjectSelectionList(c_MaxSelectedObjects) as UDT.ObjectSelectionList
global g_ObjectSelectionCount as integer : g_ObjectSelectionCount = -1
global g_ObjectSelectionType as dword : g_ObjectSelectionType = c_ObjectSelectionType_Single
global g_ObjectRegionSelectionType as dword : g_ObjectRegionSelectionType = c_ObjectRegionSelectionType_Rectangular
global g_ObjectSelectionVector as UDT.ConstantVector
global g_bObjectSelectionDrag as boolean
global g_bObjectSelectionUpdated as boolean
global g_bRectangularelectionRegion as boolean
global dim _Gizmo(2) as UDT.Gizmo
global g_Gizmo as UDT.Gizmo
global g_GizmoObjectPick as dword
global g_GizmoLastObjectPick as dword
global g_bGizmoDrag as boolean
global g_bGizmoComponentOver as boolean
endfunction
function SetupObjectSelection()
SetupObjectMoveGizmo()
endfunction
function AddObjectToSelectionList( Object as integer )
local n as integer
if g_ObjectSelectionCount = c_MaxSelectedObjects then exitfunction
if g_ObjectSelectionCount > -1
for n = 0 to g_ObjectSelectionCount
if _ObjectSelectionList(n).ObjectNum = Object
exitfunction
endif
next n
inc g_ObjectSelectionCount
_ObjectSelectionList(g_ObjectSelectionCount).ObjectNum = Object
_ObjectSelectionList(g_ObjectSelectionCount).Position.x = object position x(Object)
_ObjectSelectionList(g_ObjectSelectionCount).Position.y = object position y(Object)
_ObjectSelectionList(g_ObjectSelectionCount).Position.z = object position z(Object)
show object bounds Object,1
else
inc g_ObjectSelectionCount
_ObjectSelectionList(0).ObjectNum = Object
_ObjectSelectionList(0).Position.x = object position x(Object)
_ObjectSelectionList(0).Position.y = object position y(Object)
_ObjectSelectionList(0).Position.z = object position z(Object)
show object bounds Object,1
endif
endfunction
function UpdateObjectOnSelectionList()
if g_ObjectSelectionCount > -1
for n = 0 to g_ObjectSelectionCount
Object = _ObjectSelectionList(n).ObjectNum
_ObjectSelectionList(n).Position.x = object position x(Object)
_ObjectSelectionList(n).Position.y = object position y(Object)
_ObjectSelectionList(n).Position.z = object position z(Object)
next n
endif
endfunction
function ResetObjectToSelectionList()
g_ObjectSelectionCount = -1
endfunction
function SetObjectSelectionType( sType as dword )
g_ObjectSelectionType = sType
endfunction
`Alot will need to be changed because not every object in the editor will be a physical,
`for example, set object types might be represented by sprites, but for physical objects
`this will do.
function UpdateObjectSelection( StartObject as integer, EndObject as integer )
local ObjectPick as dword
`Replace these with buttons
if keystate(2)
g_ObjectSelectionType = c_ObjectSelectionType_Select
HideObjectMoveGizmo( 1 )
endif
if keystate(3)
g_ObjectSelectionType = c_ObjectSelectionType_Move
UpdateObjectMoveGizmoPosition( g_ObjectSelectionVector )
endif
`if keystate(4) : g_ObjectSelectionType = c_ObjectSelectionType_Rotate : endif
`if keystate(5) : g_ObjectSelectionType = c_ObjectSelectionType_Scale : endif
if keystate(6) : g_ObjectRegionSelectionType = c_ObjectRegionSelectionType_Rectangular : endif
if keystate(7) : g_ObjectRegionSelectionType = c_ObjectRegionSelectionType_Paint : endif
select g_ObjectSelectionType
case c_ObjectSelectionType_Select
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick <> c_Mouse_LeftClick
g_Mouse.OldClick = c_Mouse_LeftClick
g_Mouse.LastX = mousex() : g_Mouse.LastY = mousey()
if not shiftkey()
ResetObjectToSelectionList()
for n = StartObject to EndObject
hide object bounds n
next n
endif
endif
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick = c_Mouse_LeftClick
if g_Mouse.X <> g_Mouse.LastX or g_Mouse.Y <> g_Mouse.LastY
g_bObjectSelectionDrag = 1 : else : g_bObjectSelectionDrag = 0
endif
if g_bObjectSelectionDrag > 0
select g_ObjectRegionSelectionType
case c_ObjectRegionSelectionType_Rectangular
ink rgb(255,255,255),0
x1 = g_Mouse.LastX : y1 = g_Mouse.LastY
x2 = g_Mouse.X : y2 = g_Mouse.Y
line x1,y1,x2,y1 `top
line x1,y2,x2,y2 `bot
line x1,y1,x1,y2 `lft
line x2,y1,x2,y2 `rgt
g_bRectangularelectionRegion = 1
endcase
case c_ObjectRegionSelectionType_Paint `Needs work
ink rgb(255,255,255),0
circle g_Mouse.X,g_Mouse.Y,8
ObjectPick = pick object( mousex(), mousey(), StartObject, EndObject )
if ObjectPick > 0
if object exist( ObjectPick )
AddObjectToSelectionList( ObjectPick )
g_bObjectSelectionUpdated = 1
endif
endif
endcase
endselect
else
ObjectPick = pick object( mousex(), mousey(), StartObject, EndObject )
if ObjectPick > 0
if object exist( ObjectPick )
AddObjectToSelectionList( ObjectPick )
g_bObjectSelectionUpdated = 1
endif
endif
endif
endif
if g_Mouse.Click = 0 and g_bRectangularelectionRegion = 1
for n = StartObject to EndObject
if object exist(n)
x1 = g_Mouse.LastX : y1 = g_Mouse.LastY
x2 = g_Mouse.X : y2 = g_Mouse.Y
if g_Mouse.X < g_Mouse.LastX
x1 = g_Mouse.X : x2 = g_Mouse.LastX
endif
if g_Mouse.Y < g_Mouse.LastY
y1 = g_Mouse.Y : y2 = g_Mouse.LastY
endif
x = object screen x(n) : y = object screen y(n)
if x > x1 and x < x2 and y > y1 and y < y2
AddObjectToSelectionList( n )
endif
endif
next n
g_bObjectSelectionUpdated = 1
g_bRectangularelectionRegion = 0
endif
if g_Mouse.Click = 0
if g_ObjectSelectionCount > 0 and g_bObjectSelectionUpdated = 1
for n = 0 to g_ObjectSelectionCount
obj = _ObjectSelectionList(n).ObjectNum
if n > 0
if object position x(obj) < x1# then x1# = object position x(obj)
if object position x(obj) > x2# then x2# = object position x(obj)
if object position y(obj) < y1# then y1# = object position y(obj)
if object position y(obj) > y2# then y2# = object position y(obj)
if object position z(obj) < z1# then z1# = object position z(obj)
if object position z(obj) > z2# then z2# = object position z(obj)
else
x1# = object position x(obj) : x2# = object position x(obj)
y1# = object position y(obj) : y2# = object position y(obj)
z1# = object position z(obj) : z2# = object position z(obj)
endif
next n
g_ObjectSelectionVector.x = x1# + ((x2#-x1#)*0.5)
g_ObjectSelectionVector.y = y1# + ((y2#-y1#)*0.5)
g_ObjectSelectionVector.z = z1# + ((z2#-z1#)*0.5)
g_bObjectSelectionUpdated = 0
else
if g_ObjectSelectionCount = 0
g_ObjectSelectionVector.x = object position x(_ObjectSelectionList(0).ObjectNum)
g_ObjectSelectionVector.y = object position y(_ObjectSelectionList(0).ObjectNum)
g_ObjectSelectionVector.z = object position z(_ObjectSelectionList(0).ObjectNum)
g_bObjectSelectionUpdated = 0
endif
endif
endif
endcase
case c_ObjectSelectionType_Move
UpdateObjectMoveGizmo()
endcase
case c_ObjectSelectionType_Rotate
endcase
case c_ObjectSelectionType_Scale
endcase
endselect
`Debug
ts = text size()+2 : sw = screen width()/2 : sh = screen height()
text 2,(ts*0),"Left Click on Objects to Select Them"
text 2,(ts*1),"Hold Left Mouse Button to Drag a Selection Region"
text 2,(ts*2),"Hold Shift Key Between Selections to add to Selection List"
text 2,(ts*3),"Hold Right Mouse Button to Move Camera, WASD to move"
text 2,(ts*4),"Once Selection Has Been Made, Press 2 to Move Selection"
select g_ObjectSelectionType
case c_ObjectSelectionType_Select : SelectionName$="Select" : endcase
case c_ObjectSelectionType_Move : SelectionName$="Move" : endcase
case c_ObjectSelectionType_Rotate : SelectionName$="Select and Rotate" : endcase
case c_ObjectSelectionType_Scale : SelectionName$="Select and Scale" : endcase
endselect
text 2,(ts*6),"Press 1-2 to Change Object Selection Type: "+SelectionName$
select g_ObjectRegionSelectionType
case c_ObjectRegionSelectionType_Rectangular : SelectionName$="Rectangular" : endcase
case c_ObjectRegionSelectionType_Paint : SelectionName$="Paint" : endcase
endselect
text 2,(ts*7),"Press 5-6 to Change Object Drag Selection Type: "+SelectionName$
text 2,(ts*8),"FPS: "+str$(screen fps())
endfunction
function SetupObjectMoveGizmo()
g_Gizmo.PointMeshNum = FreeObject()
make object cube g_Gizmo.PointMeshNum,1
set object light g_Gizmo.PointMeshNum,0
set object wireframe g_Gizmo.PointMeshNum,1
disable object zdepth g_Gizmo.PointMeshNum
g_Gizmo.ComponentX.Color = c_GizmoComponentXColor
g_Gizmo.ComponentY.Color = c_GizmoComponentYColor
g_Gizmo.ComponentZ.Color = c_GizmoComponentZColor
`Using cubes for now, will change them to cones
g_Gizmo.ComponentX.PointerMeshNum = FreeObject()
make object cone g_Gizmo.ComponentX.PointerMeshNum,0.04
rotate object g_Gizmo.ComponentX.PointerMeshNum,90,90,0
set object cull g_Gizmo.ComponentX.PointerMeshNum,0
set object diffuse g_Gizmo.ComponentX.PointerMeshNum, g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.PointerMeshNum, g_Gizmo.ComponentX.Color
disable object zdepth g_Gizmo.ComponentX.PointerMeshNum
g_Gizmo.ComponentY.PointerMeshNum = FreeObject()
make object cone g_Gizmo.ComponentY.PointerMeshNum,0.04
set object cull g_Gizmo.ComponentY.PointerMeshNum,0
set object diffuse g_Gizmo.ComponentY.PointerMeshNum, g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.PointerMeshNum, g_Gizmo.ComponentY.Color
disable object zdepth g_Gizmo.ComponentY.PointerMeshNum
g_Gizmo.ComponentZ.PointerMeshNum = FreeObject()
make object cone g_Gizmo.ComponentZ.PointerMeshNum,0.04
rotate object g_Gizmo.ComponentZ.PointerMeshNum,90,0,0
set object cull g_Gizmo.ComponentZ.PointerMeshNum,0
set object diffuse g_Gizmo.ComponentZ.PointerMeshNum, g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.PointerMeshNum, g_Gizmo.ComponentZ.Color
disable object zdepth g_Gizmo.ComponentZ.PointerMeshNum
g_Gizmo.ComponentX.WireMeshNum = FreeObject()
make object triangle g_Gizmo.ComponentX.WireMeshNum, 0,0,0, 0,0,0, c_GizmoPointerOffset,0,0
set object diffuse g_Gizmo.ComponentX.WireMeshNum, g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.WireMeshNum, g_Gizmo.ComponentX.Color
set object wireframe g_Gizmo.ComponentX.WireMeshNum, 1
disable object zdepth g_Gizmo.ComponentX.WireMeshNum
g_Gizmo.ComponentY.WireMeshNum = FreeObject()
make object triangle g_Gizmo.ComponentY.WireMeshNum, 0,0,0, 0,0,0, 0,c_GizmoPointerOffset,0
set object diffuse g_Gizmo.ComponentY.WireMeshNum, g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.WireMeshNum, g_Gizmo.ComponentY.Color
set object wireframe g_Gizmo.ComponentY.WireMeshNum, 1
disable object zdepth g_Gizmo.ComponentY.WireMeshNum
g_Gizmo.ComponentZ.WireMeshNum = FreeObject()
make object triangle g_Gizmo.ComponentZ.WireMeshNum, 0,0,0, 0,0,0, 0,0,c_GizmoPointerOffset
set object diffuse g_Gizmo.ComponentZ.WireMeshNum, g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.WireMeshNum, g_Gizmo.ComponentZ.Color
set object wireframe g_Gizmo.ComponentZ.WireMeshNum, 1
disable object zdepth g_Gizmo.ComponentZ.WireMeshNum
_Gizmo(c_GizmoTypeMove) = g_Gizmo
HideObjectMoveGizmo( 1 )
endfunction
function UpdateObjectMoveGizmoPosition( Position as UDT.ConstantVector )
g_Gizmo = _Gizmo(c_GizmoTypeMove)
g_Gizmo.Position = Position
g_TempVector.x = camera position x()
g_TempVector.y = camera position y()
g_TempVector.z = camera position z()
g_Gizmo.CamDist = GetDistVector( g_TempVector, g_Gizmo.Position )
g_Gizmo.ComponentX.Position.x = g_Gizmo.Position.x + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
g_Gizmo.ComponentX.Position.y = g_Gizmo.Position.y
g_Gizmo.ComponentX.Position.z = g_Gizmo.Position.z
g_Gizmo.ComponentY.Position.x = g_Gizmo.Position.x
g_Gizmo.ComponentY.Position.y = g_Gizmo.Position.y + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
g_Gizmo.ComponentY.Position.z = g_Gizmo.Position.z
g_Gizmo.ComponentZ.Position.x = g_Gizmo.Position.x
g_Gizmo.ComponentZ.Position.y = g_Gizmo.Position.y
g_Gizmo.ComponentZ.Position.z = g_Gizmo.Position.z + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
scale object g_Gizmo.PointMeshNum, g_Gizmo.CamDist, g_Gizmo.CamDist, g_Gizmo.CamDist
scale object g_Gizmo.ComponentX.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentX.WireMeshNum, g_Gizmo.CamDist,0,0
scale object g_Gizmo.ComponentY.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentY.WireMeshNum,0,g_Gizmo.CamDist,0
scale object g_Gizmo.ComponentZ.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentZ.WireMeshNum,0,0,g_Gizmo.CamDist
position object g_Gizmo.PointMeshNum,g_Gizmo.Position.x,g_Gizmo.Position.y,g_Gizmo.Position.z
position object g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Position.x,g_Gizmo.ComponentX.Position.y,g_Gizmo.ComponentX.Position.z
position object g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.Position.x,g_Gizmo.ComponentX.Position.y,g_Gizmo.ComponentX.Position.z
position object g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Position.x,g_Gizmo.ComponentY.Position.y,g_Gizmo.ComponentY.Position.z
position object g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Position.x,g_Gizmo.Position.y,g_Gizmo.ComponentY.Position.z
position object g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Position.x,g_Gizmo.ComponentZ.Position.y,g_Gizmo.ComponentZ.Position.z
position object g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Position.x,g_Gizmo.ComponentZ.Position.y,g_Gizmo.Position.z
`Don't really need to update this every pass, but for now
set object diffuse g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Color
set object diffuse g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.ComponentX.Color
set object diffuse g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Color
set object diffuse g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Color
set object diffuse g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Color
set object diffuse g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Color
_Gizmo(c_GizmoTypeMove) = g_Gizmo
endfunction
function HideObjectMoveGizmo( bFlag as boolean )
g_Gizmo = _Gizmo(c_GizmoTypeMove)
select bFlag
case 0
g_Gizmo.bHidden = 0
exclude object off g_Gizmo.PointMeshNum
exclude object off g_Gizmo.ComponentX.WireMeshNum
exclude object off g_Gizmo.ComponentX.PointerMeshNum
exclude object off g_Gizmo.ComponentY.WireMeshNum
exclude object off g_Gizmo.ComponentY.PointerMeshNum
exclude object off g_Gizmo.ComponentZ.WireMeshNum
exclude object off g_Gizmo.ComponentZ.PointerMeshNum
endcase
case 1
g_Gizmo.bHidden = 1
exclude object on g_Gizmo.PointMeshNum
exclude object on g_Gizmo.ComponentX.WireMeshNum
exclude object on g_Gizmo.ComponentX.PointerMeshNum
exclude object on g_Gizmo.ComponentY.WireMeshNum
exclude object on g_Gizmo.ComponentY.PointerMeshNum
exclude object on g_Gizmo.ComponentZ.WireMeshNum
exclude object on g_Gizmo.ComponentZ.PointerMeshNum
endcase
endselect
_Gizmo(c_GizmoTypeMove) = g_Gizmo
endfunction
function UpdateObjectMoveGizmo()
local TempVector as UDT.ConstantVector
local ResetVector as UDT.ConstantVector
g_Gizmo = _Gizmo(c_GizmoTypeMove)
if g_ObjectSelectionCount > -1
if not g_Gizmo.bHidden
g_TempVector.x = camera position x()
g_TempVector.y = camera position y()
g_TempVector.z = camera position z()
g_Gizmo.CamAngle.y = wrapvalue(atanfull(g_TempVector.x-g_Gizmo.Position.x,g_TempVector.z-g_Gizmo.Position.z))
`Pick Axis X
if not g_Gizmo.ComponentX.bSelected
if pick object(mousex(),mousey(),g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.PointerMeshNum)
g_Gizmo.ComponentX.Color = c_GizmoComponentSelectionColor
g_Gizmo.ComponentX.bOver = 1
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick <> c_Mouse_LeftClick
g_Mouse.OldClick = c_Mouse_LeftClick
g_Gizmo.ComponentX.bSelected = 1
g_Gizmo.LastPosition.x = g_Gizmo.Position.x
UpdateObjectOnSelectionList()
hide mouse
endif
else
g_Gizmo.ComponentX.Color = c_GizmoComponentXColor
g_Gizmo.ComponentX.bOver = 0
endif
endif
`Pick Axis Y
if not g_Gizmo.ComponentY.bSelected
if pick object(mousex(),mousey(),g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.PointerMeshNum)
g_Gizmo.ComponentY.Color = c_GizmoComponentSelectionColor
g_Gizmo.ComponentY.bOver = 1
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick <> c_Mouse_LeftClick
g_Mouse.OldClick = c_Mouse_LeftClick
g_Gizmo.ComponentY.bSelected = 1
g_Gizmo.LastPosition.y = g_Gizmo.Position.y
UpdateObjectOnSelectionList()
hide mouse
endif
else
g_Gizmo.ComponentY.Color = c_GizmoComponentYColor
g_Gizmo.ComponentY.bOver = 0
endif
endif
`Pick Axis Z
if not g_Gizmo.ComponentZ.bSelected
if pick object(mousex(),mousey(),g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.PointerMeshNum)
g_Gizmo.ComponentZ.Color = c_GizmoComponentSelectionColor
g_Gizmo.ComponentZ.bOver = 1
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick <> c_Mouse_LeftClick
g_Mouse.OldClick = c_Mouse_LeftClick
g_Gizmo.ComponentZ.bSelected = 1
g_Gizmo.LastPosition.z = g_Gizmo.Position.z
UpdateObjectOnSelectionList()
hide mouse
endif
else
g_Gizmo.ComponentZ.Color = c_GizmoComponentZColor
g_Gizmo.ComponentZ.bOver = 0
endif
endif
if g_Gizmo.ComponentX.bOver = 1 or g_Gizmo.ComponentY.bOver = 1 or g_Gizmo.ComponentZ.bOver = 1
g_bGizmoComponentOver = 1 : else : g_bGizmoComponentOver = 0
endif
g_bGizmoDrag = 0
if g_Gizmo.ComponentX.bSelected
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick = c_Mouse_LeftClick
g_bGizmoDrag = 1
if wrapvalue(g_Gizmo.CamAngle.y - 90.0) >= 180.0
g_Gizmo.Position.x = g_Gizmo.Position.x + -(g_Mouse.MoveX*(0.002*g_Gizmo.CamDist)) `Scale the drag speed based on distance
else
g_Gizmo.Position.x = g_Gizmo.Position.x + (g_Mouse.MoveX*(0.002*g_Gizmo.CamDist))
endif
g_Gizmo.OffsetPosition.x = g_Gizmo.Position.x - g_Gizmo.LastPosition.x
else
show mouse
g_Gizmo.ComponentX.bSelected = 0
endif
endif
if g_Gizmo.ComponentY.bSelected
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick = c_Mouse_LeftClick
g_bGizmoDrag = 1
g_Gizmo.Position.y = g_Gizmo.Position.y + -(g_Mouse.MoveY*(0.002*g_Gizmo.CamDist))
g_Gizmo.OffsetPosition.y = g_Gizmo.Position.y - g_Gizmo.LastPosition.y
else
show mouse
g_Gizmo.ComponentY.bSelected = 0
endif
endif
if g_Gizmo.ComponentZ.bSelected
if g_Mouse.Click = c_Mouse_LeftClick and g_Mouse.OldClick = c_Mouse_LeftClick
g_bGizmoDrag = 1
if g_Gizmo.CamAngle.y >= 180.0
g_Gizmo.Position.z = g_Gizmo.Position.z + -(g_Mouse.MoveX*(0.002*g_Gizmo.CamDist))
else
g_Gizmo.Position.z = g_Gizmo.Position.z + (g_Mouse.MoveX*(0.002*g_Gizmo.CamDist))
endif
g_Gizmo.OffsetPosition.z = g_Gizmo.Position.z - g_Gizmo.LastPosition.z
else
show mouse
g_Gizmo.ComponentZ.bSelected = 0
endif
endif
`Update Gizmo scale and positions
g_TempVector.x = camera position x()
g_TempVector.y = camera position y()
g_TempVector.z = camera position z()
g_Gizmo.CamDist = GetDistVector( g_TempVector, g_Gizmo.Position )
g_Gizmo.ComponentX.Position.x = g_Gizmo.Position.x + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
g_Gizmo.ComponentX.Position.y = g_Gizmo.Position.y
g_Gizmo.ComponentX.Position.z = g_Gizmo.Position.z
g_Gizmo.ComponentY.Position.x = g_Gizmo.Position.x
g_Gizmo.ComponentY.Position.y = g_Gizmo.Position.y + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
g_Gizmo.ComponentY.Position.z = g_Gizmo.Position.z
g_Gizmo.ComponentZ.Position.x = g_Gizmo.Position.x
g_Gizmo.ComponentZ.Position.y = g_Gizmo.Position.y
g_Gizmo.ComponentZ.Position.z = g_Gizmo.Position.z + ((c_GizmoPointerOffset)*0.01)* g_Gizmo.CamDist
scale object g_Gizmo.PointMeshNum, g_Gizmo.CamDist, g_Gizmo.CamDist, g_Gizmo.CamDist
scale object g_Gizmo.ComponentX.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentX.WireMeshNum, g_Gizmo.CamDist,0,0
scale object g_Gizmo.ComponentY.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentY.WireMeshNum,0,g_Gizmo.CamDist,0
scale object g_Gizmo.ComponentZ.PointerMeshNum, c_MoveGizmoPointerScaleX*g_Gizmo.CamDist, c_MoveGizmoPointerScaleY*g_Gizmo.CamDist, c_MoveGizmoPointerScaleZ*g_Gizmo.CamDist
scale object g_Gizmo.ComponentZ.WireMeshNum,0,0,g_Gizmo.CamDist
position object g_Gizmo.PointMeshNum,g_Gizmo.Position.x,g_Gizmo.Position.y,g_Gizmo.Position.z
position object g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Position.x,g_Gizmo.ComponentX.Position.y,g_Gizmo.ComponentX.Position.z
position object g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.Position.x,g_Gizmo.ComponentX.Position.y,g_Gizmo.ComponentX.Position.z
position object g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Position.x,g_Gizmo.ComponentY.Position.y,g_Gizmo.ComponentY.Position.z
position object g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Position.x,g_Gizmo.Position.y,g_Gizmo.ComponentY.Position.z
position object g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Position.x,g_Gizmo.ComponentZ.Position.y,g_Gizmo.ComponentZ.Position.z
position object g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Position.x,g_Gizmo.ComponentZ.Position.y,g_Gizmo.Position.z
`Don't really need to update this every pass, but for now
set object diffuse g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.PointerMeshNum,g_Gizmo.ComponentX.Color
set object diffuse g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.ComponentX.Color
set object emissive g_Gizmo.ComponentX.WireMeshNum,g_Gizmo.ComponentX.Color
set object diffuse g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.PointerMeshNum,g_Gizmo.ComponentY.Color
set object diffuse g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Color
set object emissive g_Gizmo.ComponentY.WireMeshNum,g_Gizmo.ComponentY.Color
set object diffuse g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.PointerMeshNum,g_Gizmo.ComponentZ.Color
set object diffuse g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Color
set object emissive g_Gizmo.ComponentZ.WireMeshNum,g_Gizmo.ComponentZ.Color
`finally update the position of the selected object(s)
if g_bGizmoDrag
g_ObjectSelectionVector = g_Gizmo.Position
for n = 0 to g_ObjectSelectionCount
obj = _ObjectSelectionList(n).ObjectNum
g_TempVector.x = _ObjectSelectionList(n).Position.x+g_Gizmo.OffsetPosition.x
g_TempVector.y = _ObjectSelectionList(n).Position.y+g_Gizmo.OffsetPosition.y
g_TempVector.z = _ObjectSelectionList(n).Position.z+g_Gizmo.OffsetPosition.z
position object obj,g_TempVector.x,g_TempVector.y,g_TempVector.z
next n
else
g_Gizmo.LastPosition = ResetVector
g_Gizmo.OffsetPosition = ResetVector
endif
else
HideObjectMoveGizmo( 0 )
endif
endif
_Gizmo(c_GizmoTypeMove) = g_Gizmo
endfunction
I changed a ton of stuff here, the new one is about only 10 percent of this one, but this was a good first attempt I think.
A dream is a fantasy, if you achieve that fantasy it was never a dream to begin with.