Work with selections
Goal: select objects in 3d space and highlight them.
Objects in FinalMesh WebGL may be selected in the same way as in regular 3d application. Selection may be used for marking objects for any operation or to highlight them*.
Node is selected when 3rd bit in node.state is set, or node.state&4 != 0. You may set/clear this bit directly and invalidate 3d window. Or you use iv.space.select mdethod. This method allows to select/deselect single node and optionlally deselect rest nodes.
Appearance of selected nodes is determined by iv.window.clrSelection variable. This varaible defines:
- color of highlighting
- mixing between this highlight color and original color
- opacity of selected objects
- opacity of non selected objects.
Select single node
space.select(node,true,true); // select node and keep previously selected objects
Select single node by name
function testSelection()
{
var space=view3d.space;
var node=space.root.search("Sphere");
if(node)space.select(node,true,false);// select node and reset old selection
}
Select all
function _selectAll(node)
{
node=node.firstChild;
while(node)
{
node.state|=4;
_selectAll(node);
node=node.next;
}
}
function testSelection()
{
var space=view3d.space;
var old=space.getSelection(null); // get list of previously selected nodes - for notification
_selectAll(space.root); // mark all nodes as selected
space.postSelection(null,old); // send notification and update color of highlight
space.invalidate(); // update screen
}
Select none
space.select(null,false,false);
Invert selection
function _invertAll(node)
{
node=node.firstChild;
while(node)
{
node.state^=4;
_invertAll(node);
node=node.next;
}
}
function testSelection()
{
var space=view3d.space;
var old=space.getSelection(null); // get list of previously selected nodes - for notification
_invertAll(space.root); // invert selection
space.postSelection(null,old); // send notification and update color of highlight
space.invalidate(); // update screen
}
Listen to selection event
function testSelection()
{
view3d.addRefTarget(
function(event)
{
switch(event.code)
{
case "selection":{
var oldSelection=event.old;//array. may be null
var currentSelection=event.current;//array. may be null
var node=event.node; // node selected now
//
}break;
}
}
)
}
Initial node selection
This example loads 3d file and selects two nodes.
view3d=iv.initViewer3d("tree.iv3d",0x777777,null,1.0);view3d.menuOpen=false;view3d.cfgSelZOffset=false;view3d.clrSelection[5]=false?0.5:1;
view3d.addRefTarget(
function(event)
{
switch(event.code)
{
case 'dataReady':
{
var space=view3d.space;
//select first node
var node=space.root.search("A");
if(node)space.select(node,true,false);
// select second node
node=space.root.search("D");
if(node)space.select(node,true,true);
}break;
}
}
);
where:
- iv.initView3d function related to specific template used in this example.
- space is view3d.space.
- view3d is variable or 3d window object.
*Highlighting itself may be implemented with creating special material and assigning it node without using selection.
Show selected objects
function showSelection(view) {
function hideAll(node) {
node=node.firstChild;
while(node) {
node.state&=~3;
hideAll(node);
node=node.next;
}
}
function showSel(node) {
if(node.state&4||(node.object&&(node.object instanceof iv.light))) {
if(node.state&8) node.showAll();
else {
if(node.object) node.state|=1;
if(node.firstChild) {
var n=node.firstChild;
while(n) {
if(n.state&0x80) { n.state|=3; node.state|=2; }
n=n.next;
}
} else node.state|=3;
}
var n=node.parent;
while(n) {
if(n.object) n.state|=2; else n.state|=3;
n=n.parent;
}
}
node=node.firstChild;
while(node) {
showSel(node);
node=node.next;
}
};
var root=view.space.root;
hideAll(root);
showSel(root);
view.invalidate(iv.INV_STRUCTURE);
}
