mirror of
https://github.com/overte-org/overte.git
synced 2025-04-27 01:16:29 +02:00
73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
// 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: '<unknown>' };
|
|
}
|
|
}
|
|
|
|
// 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);
|