diff --git a/scripts/system/controllers/controllerDisplay.js b/scripts/system/controllers/controllerDisplay.js index af8cfa74f4..3c2794cf96 100644 --- a/scripts/system/controllers/controllerDisplay.js +++ b/scripts/system/controllers/controllerDisplay.js @@ -49,6 +49,7 @@ createControllerDisplay = function(config) { partOverlays: {}, parts: {}, mappingName: "mapping-display-" + Math.random(), + partValues: {}, setVisible: function(visible) { for (var i = 0; i < this.overlays.length; ++i) { @@ -109,12 +110,53 @@ createControllerDisplay = function(config) { for (var partName in controller.parts) { overlayID = this.overlays[i++]; var part = controller.parts[partName]; - var partPosition = Vec3.multiply(sensorScaleFactor, Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition))); - var partDimensions = Vec3.multiply(sensorScaleFactor, part.naturalDimensions); - Overlays.editOverlay(overlayID, { - dimensions: partDimensions, - localPosition: partPosition - }); + localPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); + var localRotation; + var value = this.partValues[partName]; + var offset, rotation; + if (value !== undefined) { + if (part.type === "linear") { + var axis = Vec3.multiplyQbyV(controller.rotation, part.axis); + offset = Vec3.multiply(part.maxTranslation * value, axis); + localPosition = Vec3.sum(localPosition, offset); + localRotation = undefined; + } else if (part.type === "joystick") { + rotation = Quat.fromPitchYawRollDegrees(value.y * part.xHalfAngle, 0, value.x * part.yHalfAngle); + if (part.originOffset) { + offset = Vec3.multiplyQbyV(rotation, part.originOffset); + offset = Vec3.subtract(part.originOffset, offset); + } else { + offset = { x: 0, y: 0, z: 0 }; + } + localPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); + localRotation = Quat.multiply(controller.rotation, rotation); + } else if (part.type === "rotational") { + value = clamp(value, part.minValue, part.maxValue); + var pct = (value - part.minValue) / part.maxValue; + var angle = pct * part.maxAngle; + rotation = Quat.angleAxis(angle, part.axis); + if (part.origin) { + offset = Vec3.multiplyQbyV(rotation, part.origin); + offset = Vec3.subtract(offset, part.origin); + } else { + offset = { x: 0, y: 0, z: 0 }; + } + localPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); + localRotation = Quat.multiply(controller.rotation, rotation); + } + } + if (localRotation !== undefined) { + Overlays.editOverlay(overlayID, { + dimensions: Vec3.multiply(sensorScaleFactor, part.naturalDimensions), + localPosition: Vec3.multiply(sensorScaleFactor, localPosition), + localRotation: localRotation + }); + } else { + Overlays.editOverlay(overlayID, { + dimensions: Vec3.multiply(sensorScaleFactor, part.naturalDimensions), + localPosition: Vec3.multiply(sensorScaleFactor, localPosition) + }); + } } } } @@ -172,29 +214,13 @@ createControllerDisplay = function(config) { if (part.type === "rotational") { var input = resolveHardware(part.input); print("Mapping to: ", part.input, input); - mapping.from([input]).peek().to(function(controller, overlayID, part) { + mapping.from([input]).peek().to(function(partName) { return function(value) { - value = clamp(value, part.minValue, part.maxValue); - - var pct = (value - part.minValue) / part.maxValue; - var angle = pct * part.maxAngle; - var rotation = Quat.angleAxis(angle, part.axis); - - var offset = { x: 0, y: 0, z: 0 }; - if (part.origin) { - offset = Vec3.multiplyQbyV(rotation, part.origin); - offset = Vec3.subtract(offset, part.origin); - } - - var partPosition = Vec3.sum(controller.position, - Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); - - Overlays.editOverlay(overlayID, { - localPosition: partPosition, - localRotation: Quat.multiply(controller.rotation, rotation) - }); + // insert the most recent controller value into controllerDisplay.partValues. + controllerDisplay.partValues[partName] = value; + controllerDisplay.resize(MyAvatar.sensorToWorldScale); }; - }(controller, overlayID, part)); + }(partName)); } else if (part.type === "touchpad") { var visibleInput = resolveHardware(part.visibleInput); var xInput = resolveHardware(part.xInput); @@ -210,69 +236,38 @@ createControllerDisplay = function(config) { mapping.from([yInput]).peek().invert().to(function(value) { }); } else if (part.type === "joystick") { - (function(controller, overlayID, part) { + (function(part, partName) { var xInput = resolveHardware(part.xInput); var yInput = resolveHardware(part.yInput); - - var xvalue = 0; - var yvalue = 0; - - function calculatePositionAndRotation(xValue, yValue) { - var rotation = Quat.fromPitchYawRollDegrees(yValue * part.xHalfAngle, 0, xValue * part.yHalfAngle); - - var offset = { x: 0, y: 0, z: 0 }; - if (part.originOffset) { - offset = Vec3.multiplyQbyV(rotation, part.originOffset); - offset = Vec3.subtract(part.originOffset, offset); - } - - var partPosition = Vec3.sum(controller.position, - Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); - - var partRotation = Quat.multiply(controller.rotation, rotation); - - return { - position: partPosition, - rotation: partRotation - }; - } - mapping.from([xInput]).peek().to(function(value) { - xvalue = value; - var posRot = calculatePositionAndRotation(xvalue, yvalue); - Overlays.editOverlay(overlayID, { - localPosition: posRot.position, - localRotation: posRot.rotation - }); + // insert the most recent controller value into controllerDisplay.partValues. + if (controllerDisplay.partValues[partName]) { + controllerDisplay.partValues[partName].x = value; + } else { + controllerDisplay.partValues[partName] = {x: value, y: 0}; + } + controllerDisplay.resize(MyAvatar.sensorToWorldScale); }); - mapping.from([yInput]).peek().to(function(value) { - yvalue = value; - var posRot = calculatePositionAndRotation(xvalue, yvalue); - Overlays.editOverlay(overlayID, { - localPosition: posRot.position, - localRotation: posRot.rotation - }); + // insert the most recent controller value into controllerDisplay.partValues. + if (controllerDisplay.partValues[partName]) { + controllerDisplay.partValues[partName].y = value; + } else { + controllerDisplay.partValues[partName] = {x: 0, y: value}; + } + controllerDisplay.resize(MyAvatar.sensorToWorldScale); }); - })(controller, overlayID, part); + })(part, partName); } else if (part.type === "linear") { - (function(controller, overlayID, part) { + (function(part, partName) { var input = resolveHardware(part.input); - mapping.from([input]).peek().to(function(value) { - var axis = Vec3.multiplyQbyV(controller.rotation, part.axis); - var offset = Vec3.multiply(part.maxTranslation * value, axis); - - var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); - var position = Vec3.sum(partPosition, offset); - - Overlays.editOverlay(overlayID, { - localPosition: position - }); + // insert the most recent controller value into controllerDisplay.partValues. + controllerDisplay.partValues[partName] = value; + controllerDisplay.resize(MyAvatar.sensorToWorldScale); }); - - })(controller, overlayID, part); + })(part, partName); } else if (part.type === "static") { // do nothing