Skip to content

Commit

Permalink
fixed object selection bug
Browse files Browse the repository at this point in the history
  • Loading branch information
Elixonus committed Jul 22, 2024
1 parent 96bf3ce commit b941fea
Showing 1 changed file with 34 additions and 40 deletions.
74 changes: 34 additions & 40 deletions optics/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -514,23 +514,32 @@ class Scene {
return mirrors;
}

/** get an array of objects that are within a distance of parameter point from a parameter array of objects */
static getCloseObjectsToPoint(p = pointOrigin, radius, objects = [], ) {
let closeObjects = [];

for (let n = 0; n < objects.length; n++) {
let object = objects[n];
let distanceToObject = distance(p, object.position);

if (distanceToObject < radius) {
closeObjects.push(object);
}
}

return closeObjects;
}

/** get the closest object from a parameter array of objects to a parameter point */
static getClosestObjectToPoint(p = pointOrigin, objects = [], distanceModifier = undefined) {
static getClosestObjectToPoint(p = pointOrigin, objects = []) {
let closestObject = undefined;
let distanceToClosestObject = undefined;

for (let n = 0; n < objects.length; n++) {
let object = objects[n];
let distanceToObject = distance(p, object.position);
let comparedDistance;

if (distanceModifier !== undefined) {
comparedDistance = distanceModifier(distanceToObject);
} else {
comparedDistance = distanceToObject;
}

if (closestObject === undefined || comparedDistance < distanceToClosestObject) {
if (closestObject === undefined || distanceToObject < distanceToClosestObject) {
closestObject = object;
distanceToClosestObject = distanceToObject;
}
Expand All @@ -547,8 +556,8 @@ class Scene {
}

/** get the closest mirror to a parameter point in the scene */
getClosestMirrorToPoint(p = pointOrigin, distanceModifier = undefined) {
let closest = Scene.getClosestObjectToPoint(p, this.mirrors, distanceModifier);
getClosestMirrorToPoint(p = pointOrigin) {
let closest = Scene.getClosestObjectToPoint(p, this.mirrors);
return closest;
}

Expand Down Expand Up @@ -1445,18 +1454,18 @@ function render() {

// if the user is dragging a protractor, snap the position of the protractor to the position of the closest laser collision with mirror
if (scene.draggedGuide !== false && mouseAction === MouseAction.drag && scene.draggedObject instanceof Guide && Math.round(scene.draggedObject.guidance) === 1) {
let objects = [];
let positionObjects = [];
for (let n = 0; n < lasersCollisions.length; n++) {
objects.push({position: scene.lasers[n].position});
positionObjects.push({position: scene.lasers[n].position});
let laserCollisions = lasersCollisions[n];

for (let m = 0; m < laserCollisions.length; m++) {
let laserCollision = laserCollisions[m];
objects.push({position: laserCollision.position});
positionObjects.push({position: laserCollision.position});
}
}

let closest = Scene.getClosestObjectToPoint(scene.draggedObject.position, objects);
let closest = Scene.getClosestObjectToPoint(scene.draggedObject.position, positionObjects);

// do the position snap if the distance to the object is less than 50 pixels
if (closest !== false && closest.distanceToObject <= 50) {
Expand Down Expand Up @@ -2314,36 +2323,21 @@ function mousedown(event) {
};

let point = mousePosition.clone().addTo(cameraPosition);
let closestLaser = Scene.getClosestObjectToPoint(point, scene.lasers.filter(function (z) {
let lasers = Scene.getCloseObjectsToPoint(point, 200, scene.lasers.filter(function (z) {
return z.interactive;
}), distanceRandomizer);
let laser = undefined;

if (closestLaser !== false && closestLaser.distanceToObject <= 200) {
laser = [closestLaser.object];
} else {
laser = [];
}

let closestGuide = Scene.getClosestObjectToPoint(point, scene.guides.filter(function (z) {
}));
let mirrors = scene.getMirrorsWithPointInside(point).filter(function (z) {
return z.interactive;
}), distanceRandomizer);
let guide = undefined;

if (closestGuide !== false && closestGuide.distanceToObject <= 300) {
guide = [closestGuide.object];
} else {
guide = [];
}

let closest = Scene.getClosestObjectToPoint(point, scene.getMirrorsWithPointInside(point).filter(function (z) {
});
let guides = Scene.getCloseObjectsToPoint(point, 300, scene.guides.filter(function (z) {
return z.interactive;
}).concat(laser, guide), distanceRandomizer);
}));
let objects = lasers.concat(mirrors, guides);
let object = objects[randomInteger(0, objects.length - 1)];

if (closest !== false) {
let object = closest.object;
if (object !== false) {
scene.setDraggedObjectTo(object);
object.dragOffset = point.subtractTo(object.position);
object.dragOffset = point.clone().subtractTo(object.position);
object.mousePositionOnDrag = mousePosition.clone();
object.dragPosition = object.position.clone();
object.dragRotation = object.rotation;
Expand Down

0 comments on commit b941fea

Please sign in to comment.