GLScene - Select an object

Top  Previous  Next

GLScene - Select an object

disclaimer

Sometimes an object has to be selected for subsequent processing. There are several ways :

selecting with the mouse

provided the object is visible and the contours are simple, picking with the mouse is a fast way.

 

attach a mousedown event to the SceneViewer

 

have a global

 

SelPtr:TGLSceneObject;  // holds a selected object

SelPtr:=nil;                 // init

 

procedure GLSceneViewer1Mousedown(..x,y:integer)

var pick:TGLSceneObject;

begin

pick:=(GLSceneViewer1.GetPickedObject(x,y) as TGLSceneObject);

if (pick<>SelPtr) then begin

 if assigned(SelPtr) then   { ..unselect(SelPtr).. }

 if assigned(pick) then     { .. select(pick).. }

  SelPtr:=pick;

end;

end;

 

{ ..unselect(APtr).. } may be APtr.material.frontproperties.emission.color:=clrBlack;

{  ..select(APtr)..  } may be APtr.material.frontproperties.emission.color:=clrYellow;

 

selecting with a combobox

Another way is a combobox. It lets object being selected that are not necessarily visible at the moment.

 

The combobox must somehow be populated. I'll use a buttom here for now.

 

Combobox.name:='SelObjects';

 

SelObjects.Clear;

for i:=0 to GLScene1.Objects.Count-1 do begin

SelObjects.Items.Add(GLScene1.Object[i].name);     // get the name

SelObjects.Items.Objects[i]:=GLScene1.Objects[i]; // get the pointer

end;

 

selecting with the OnChangeEvent :

 

procedure TForm1.SelObjectsChange(..)

begin

if assigned(SelPtr) then { ..unselect(SelPtr).. }

if (SelObjects.Itemindex>=0) then begin

 SelPtr:=TGLSceneObject(SelObjects.items.objects[SelObjects.Itemindex]);

 { ..select(SelPtr).. }

end;

end;

 

selecting with a combobox and a mouse

when the two are combined, the mousedown has to be enhanced to reflect a selection in the combobox.

 

procedure GLSceneViewer1Mousedown(..x,y:integer)

var pick:TGLSceneObject;

j:integer;

begin

pick:=(GLSceneViewer1.GetPickedObject(x, y) as TGLSceneObject);

if (pick<>SelPtr) then begin

 if assigned(SelPtr) then   { ..unselect(SelPtr).. }

 if assigned(pick) then begin

   { .. select(pick)..}

   j:=SelObjects.Items.IndexOfObject(pick);

   SelObjects.itemindex:=j;

  end

 else SelObjects.Itemindex:=-1;

 SelPtr:=pick;

end;

end;