// raypickTester.js // // display intersection details (including material) when hovering over entities/avatars/overlays // /* eslint-disable comma-dangle, no-empty, no-magic-numbers */ var PICK_FILTERS = Picks.PICK_ENTITIES | Picks.PICK_OVERLAYS | Picks.PICK_AVATARS | Picks.PICK_INCLUDE_NONCOLLIDABLE; var HAND_JOINT = '_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND'.replace('RIGHT', MyAvatar.getDominantHand().toUpperCase()); var JOINT_NAME = HMD.active ? HAND_JOINT : 'Mouse'; var UPDATE_MS = 1000/30; // create tect3d overlay to display hover results var overlayID = Overlays.addOverlay('text3d', { text: 'hover', visible: false, backgroundAlpha: 0, isFacingAvatar: true, lineHeight: 0.05, dimensions: Vec3.HALF, }); Script.scriptEnding.connect(function() { Overlays.deleteOverlay(overlayID); }); // create raycast picker var pickID = Picks.createPick(PickType.Ray, { joint: JOINT_NAME, filter: PICK_FILTERS, enabled: true, }); var blacklist = [ overlayID ]; // exclude hover text from ray pick results Picks.setIgnoreItems(pickID, blacklist); Script.scriptEnding.connect(function() { Picks.removePick(pickID); }); // query object materials (using the Graphics.* API) function getSubmeshMaterial(objectID, shapeID) { try { var materialLayers = Graphics.getModel(objectID).materialLayers; var shapeMaterialLayers = materialLayers[shapeID]; return shapeMaterialLayers[0].material; } catch (e) { return { name: '' }; } } // refresh hover overlay text based on intersection results function updateOverlay(overlayID, result) { var material = this.getSubmeshMaterial(result.objectID, result.extraInfo.shapeID); var position = Vec3.mix(result.searchRay.origin, result.intersection, 0.5); var extraInfo = result.extraInfo; var text = [ 'mesh: ' + extraInfo.subMeshName, 'materialName: ' + material.name, 'type: ' + Entities.getNestableType(result.objectID), 'distance: ' + result.distance.toFixed(2)+'m', ['submesh: ' + extraInfo.subMeshIndex, 'part: '+extraInfo.partIndex, 'shape: '+extraInfo.shapeID].join(' | '), ].filter(Boolean).join('\n'); Overlays.editOverlay(overlayID, { text: text, position: position, visible: result.intersects, }); } // monitor for enw results at 30fps Script.setInterval(function() { var result = Picks.getPrevPickResult(pickID); updateOverlay(overlayID, result); }, UPDATE_MS);