mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-14 11:46:34 +02:00
Merge pull request #11493 from hyperlogic/bug-fix/oculus-controller-rendering
Bug fix for offset of animated parts of oculus touch controller display
This commit is contained in:
commit
0d010d0cf4
1 changed files with 74 additions and 79 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue