mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
99 lines
No EOL
2.3 KiB
JavaScript
99 lines
No EOL
2.3 KiB
JavaScript
var lineEntityID = null;
|
|
var lineIsRezzed = false;
|
|
var altHeld = false;
|
|
var lineCreated = false;
|
|
|
|
function nearLinePoint(targetPosition) {
|
|
var handPosition = MyAvatar.getRightPalmPosition();
|
|
var along = Vec3.subtract(targetPosition, handPosition);
|
|
along = Vec3.normalize(along);
|
|
along = Vec3.multiply(along, 0.4);
|
|
return Vec3.sum(handPosition, along);
|
|
}
|
|
|
|
|
|
function removeLine() {
|
|
if (lineIsRezzed) {
|
|
Entities.deleteEntity(lineEntityID);
|
|
lineEntityID = null;
|
|
lineIsRezzed = false;
|
|
}
|
|
}
|
|
|
|
|
|
function createOrUpdateLine(event) {
|
|
var pickRay = Camera.computePickRay(event.x, event.y);
|
|
var intersection = Entities.findRayIntersection(pickRay, true); // accurate picking
|
|
var props = Entities.getEntityProperties(intersection.entityID);
|
|
|
|
if (intersection.intersects) {
|
|
var dim = Vec3.subtract(intersection.intersection, nearLinePoint(intersection.intersection));
|
|
if (lineIsRezzed) {
|
|
Entities.editEntity(lineEntityID, {
|
|
position: nearLinePoint(intersection.intersection),
|
|
dimensions: dim,
|
|
lifetime: 15 + props.lifespan // renew lifetime
|
|
});
|
|
} else {
|
|
lineIsRezzed = true;
|
|
lineEntityID = Entities.addEntity({
|
|
type: "Line",
|
|
position: nearLinePoint(intersection.intersection),
|
|
dimensions: dim,
|
|
color: {
|
|
red: 255,
|
|
green: 255,
|
|
blue: 255
|
|
},
|
|
lifetime: 15 // if someone crashes while pointing, don't leave the line there forever.
|
|
});
|
|
}
|
|
} else {
|
|
removeLine();
|
|
}
|
|
}
|
|
|
|
|
|
function mousePressEvent(event) {
|
|
if (!event.isLeftButton || altHeld) {
|
|
return;
|
|
}
|
|
Controller.mouseMoveEvent.connect(mouseMoveEvent);
|
|
createOrUpdateLine(event);
|
|
lineCreated = true;
|
|
}
|
|
|
|
|
|
function mouseMoveEvent(event) {
|
|
createOrUpdateLine(event);
|
|
}
|
|
|
|
|
|
function mouseReleaseEvent(event) {
|
|
if (!lineCreated) {
|
|
return;
|
|
}
|
|
Controller.mouseMoveEvent.disconnect(mouseMoveEvent);
|
|
removeLine();
|
|
lineCreated = false;
|
|
}
|
|
|
|
function keyPressEvent(event) {
|
|
if (event.text == "ALT") {
|
|
altHeld = true;
|
|
}
|
|
}
|
|
|
|
function keyReleaseEvent(event) {
|
|
if (event.text == "ALT") {
|
|
altHeld = false;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
Controller.mousePressEvent.connect(mousePressEvent);
|
|
Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
|
|
|
|
Controller.keyPressEvent.connect(keyPressEvent);
|
|
Controller.keyReleaseEvent.connect(keyReleaseEvent); |