mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 12:57:59 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into gpuStreamizing
This commit is contained in:
commit
eb4b8291d7
12 changed files with 371 additions and 278 deletions
|
@ -494,8 +494,10 @@ var mouseHasMovedSincePress = false;
|
||||||
|
|
||||||
function mousePressEvent(event) {
|
function mousePressEvent(event) {
|
||||||
mouseHasMovedSincePress = false;
|
mouseHasMovedSincePress = false;
|
||||||
|
mouseCapturedByTool = false;
|
||||||
|
|
||||||
if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event)) {
|
if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event) || gridTool.mousePressEvent(event)) {
|
||||||
|
mouseCapturedByTool = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
|
@ -519,6 +521,7 @@ function mousePressEvent(event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var highlightedEntityID = { isKnownID: false };
|
var highlightedEntityID = { isKnownID: false };
|
||||||
|
var mouseCapturedByTool = false;
|
||||||
|
|
||||||
function mouseMoveEvent(event) {
|
function mouseMoveEvent(event) {
|
||||||
mouseHasMovedSincePress = true;
|
mouseHasMovedSincePress = true;
|
||||||
|
@ -563,6 +566,9 @@ function mouseReleaseEvent(event) {
|
||||||
if (isActive && selectionManager.hasSelection()) {
|
if (isActive && selectionManager.hasSelection()) {
|
||||||
tooltip.show(false);
|
tooltip.show(false);
|
||||||
}
|
}
|
||||||
|
if (mouseCapturedByTool) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cameraManager.mouseReleaseEvent(event);
|
cameraManager.mouseReleaseEvent(event);
|
||||||
|
|
||||||
|
|
|
@ -1,167 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" type="text/css" href="style.css">
|
|
||||||
<script>
|
|
||||||
function loaded() {
|
|
||||||
var gridColor = { red: 0, green: 0, blue: 0 };
|
|
||||||
var gridColors = [
|
|
||||||
{ red: 0, green: 0, blue: 0 },
|
|
||||||
{ red: 255, green: 255, blue: 255 },
|
|
||||||
{ red: 255, green: 0, blue: 0 },
|
|
||||||
{ red: 0, green: 255, blue: 0},
|
|
||||||
{ red: 0, green: 0, blue: 255 },
|
|
||||||
];
|
|
||||||
|
|
||||||
elPosY = document.getElementById("horiz-y");
|
|
||||||
elMinorSpacing = document.getElementById("minor-spacing");
|
|
||||||
elMajorSpacing = document.getElementById("major-spacing");
|
|
||||||
elSnapToGrid = document.getElementById("snap-to-grid");
|
|
||||||
elHorizontalGridVisible = document.getElementById("horiz-grid-visible");
|
|
||||||
elMoveToSelection = document.getElementById("move-to-selection");
|
|
||||||
elMoveToAvatar = document.getElementById("move-to-avatar");
|
|
||||||
|
|
||||||
if (window.EventBridge !== undefined) {
|
|
||||||
EventBridge.scriptEventReceived.connect(function(data) {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
|
|
||||||
if (data.origin) {
|
|
||||||
var origin = data.origin;
|
|
||||||
elPosY.value = origin.y.toFixed(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.minorGridSpacing !== undefined) {
|
|
||||||
elMinorSpacing.value = data.minorGridSpacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.majorGridEvery !== undefined) {
|
|
||||||
elMajorSpacing.value = data.majorGridEvery;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.gridColor) {
|
|
||||||
gridColor = data.gridColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.snapToGrid !== undefined) {
|
|
||||||
elSnapToGrid.checked = data.snapToGrid == true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.visible !== undefined) {
|
|
||||||
elHorizontalGridVisible.checked = data.visible == true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function emitUpdate() {
|
|
||||||
EventBridge.emitWebEvent(JSON.stringify({
|
|
||||||
type: "update",
|
|
||||||
origin: {
|
|
||||||
y: elPosY.value,
|
|
||||||
},
|
|
||||||
minorGridSpacing: elMinorSpacing.value,
|
|
||||||
majorGridEvery: elMajorSpacing.value,
|
|
||||||
gridColor: gridColor,
|
|
||||||
snapToGrid: elSnapToGrid.checked,
|
|
||||||
visible: elHorizontalGridVisible.checked,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
elPosY.addEventListener("change", emitUpdate);
|
|
||||||
elMinorSpacing.addEventListener("change", emitUpdate);
|
|
||||||
elMajorSpacing.addEventListener("change", emitUpdate);
|
|
||||||
elSnapToGrid.addEventListener("change", emitUpdate);
|
|
||||||
elHorizontalGridVisible.addEventListener("change", emitUpdate);
|
|
||||||
|
|
||||||
elMoveToAvatar.addEventListener("click", function() {
|
|
||||||
EventBridge.emitWebEvent(JSON.stringify({
|
|
||||||
type: "action",
|
|
||||||
action: "moveToAvatar",
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
elMoveToSelection.addEventListener("click", function() {
|
|
||||||
EventBridge.emitWebEvent(JSON.stringify({
|
|
||||||
type: "action",
|
|
||||||
action: "moveToSelection",
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
var gridColorBox = document.getElementById('grid-color');
|
|
||||||
|
|
||||||
for (var i = 0; i < gridColors.length; i++) {
|
|
||||||
var colors = gridColors[i];
|
|
||||||
var box = document.createElement('div');
|
|
||||||
box.setAttribute('class', 'color-box');
|
|
||||||
box.style.background = 'rgb(' + colors.red + ', ' + colors.green + ', ' + colors.blue + ')';
|
|
||||||
document.getElementById("grid-colors").appendChild(box);
|
|
||||||
box.addEventListener("click", function(color) {
|
|
||||||
return function() {
|
|
||||||
gridColor = color;
|
|
||||||
emitUpdate();
|
|
||||||
}
|
|
||||||
}({ red: colors.red, green: colors.green, blue: colors.blue }));
|
|
||||||
}
|
|
||||||
|
|
||||||
EventBridge.emitWebEvent(JSON.stringify({ type: 'init' }));
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body onload='loaded();'>
|
|
||||||
<div class="section-header">
|
|
||||||
<label>Horizontal Grid</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="grid-section">
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<label>Visible</label>
|
|
||||||
<span>
|
|
||||||
<input type='checkbox' id="horiz-grid-visible">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<label>Snap to grid</label>
|
|
||||||
<span>
|
|
||||||
<input type='checkbox' id="snap-to-grid">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="horizontal-position" class="property-section">
|
|
||||||
<label>Position (Y Axis)</label>
|
|
||||||
<span>
|
|
||||||
<input type='number' id="horiz-y" class="number" value="0.0" step="0.1"></input>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<label>Minor Grid Size</label>
|
|
||||||
<span>
|
|
||||||
<input type='number' id="minor-spacing" min="0" step="0.01", ></input>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<label>Major Grid Every</label>
|
|
||||||
<span>
|
|
||||||
<input type='number' id="major-spacing" min="2" step="1", ></input>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<label>Grid Color</label>
|
|
||||||
<span id="grid-colors"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="property-section">
|
|
||||||
<span>
|
|
||||||
<input type="button" id="move-to-selection" value="Move to Selection">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="property-section">
|
|
||||||
<span>
|
|
||||||
<input type="button" id="move-to-avatar" value="Move to Avatar">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,35 +1,35 @@
|
||||||
Grid = function(opts) {
|
Grid = function(opts) {
|
||||||
var that = {};
|
var that = {};
|
||||||
|
|
||||||
var color = { red: 100, green: 152, blue: 203 };
|
var colors = [
|
||||||
var gridColor = { red: 100, green: 152, blue: 203 };
|
{ red: 0, green: 255, blue: 0 },
|
||||||
|
{ red: 255, green: 255, blue: 255 },
|
||||||
|
{ red: 0, green: 0, blue: 0 },
|
||||||
|
{ red: 0, green: 0, blue: 255 },
|
||||||
|
{ red: 255, green: 0, blue: 0 },
|
||||||
|
];
|
||||||
|
var colorIndex = 0;
|
||||||
var gridAlpha = 1.0;
|
var gridAlpha = 1.0;
|
||||||
var origin = { x: 0, y: 0, z: 0 };
|
var origin = { x: 0, y: 0, z: 0 };
|
||||||
var majorGridEvery = 5;
|
var majorGridEvery = 5;
|
||||||
var minorGridSpacing = 0.2;
|
var minorGridWidth = 0.2;
|
||||||
var halfSize = 40;
|
var halfSize = 40;
|
||||||
var yOffset = 0.001;
|
var yOffset = 0.001;
|
||||||
|
|
||||||
var worldSize = 16384;
|
var worldSize = 16384;
|
||||||
|
|
||||||
var minorGridWidth = 0.5;
|
|
||||||
var majorGridWidth = 1.5;
|
|
||||||
|
|
||||||
var snapToGrid = false;
|
var snapToGrid = false;
|
||||||
|
|
||||||
var gridOverlay = Overlays.addOverlay("grid", {
|
var gridOverlay = Overlays.addOverlay("grid", {
|
||||||
position: { x: 0 , y: 0, z: 0 },
|
position: { x: 0 , y: 0, z: 0 },
|
||||||
visible: true,
|
visible: true,
|
||||||
color: { red: 0, green: 0, blue: 128 },
|
color: colors[0],
|
||||||
alpha: 1.0,
|
alpha: 1.0,
|
||||||
rotation: Quat.fromPitchYawRollDegrees(90, 0, 0),
|
rotation: Quat.fromPitchYawRollDegrees(90, 0, 0),
|
||||||
minorGridWidth: 0.1,
|
minorGridWidth: 0.1,
|
||||||
majorGridEvery: 2,
|
majorGridEvery: 2,
|
||||||
});
|
});
|
||||||
|
|
||||||
that.getMinorIncrement = function() { return minorGridSpacing; };
|
|
||||||
that.getMajorIncrement = function() { return minorGridSpacing * majorGridEvery; };
|
|
||||||
|
|
||||||
that.visible = false;
|
that.visible = false;
|
||||||
that.enabled = false;
|
that.enabled = false;
|
||||||
|
|
||||||
|
@ -37,13 +37,39 @@ Grid = function(opts) {
|
||||||
return origin;
|
return origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
that.getMinorIncrement = function() { return minorGridWidth; };
|
||||||
|
that.getMajorIncrement = function() { return minorGridWidth * majorGridEvery; };
|
||||||
|
|
||||||
|
that.getMinorGridWidth = function() { return minorGridWidth; };
|
||||||
|
that.setMinorGridWidth = function(value) {
|
||||||
|
minorGridWidth = value;
|
||||||
|
updateGrid();
|
||||||
|
};
|
||||||
|
|
||||||
|
that.getMajorGridEvery = function() { return majorGridEvery; };
|
||||||
|
that.setMajorGridEvery = function(value) {
|
||||||
|
majorGridEvery = value;
|
||||||
|
updateGrid();
|
||||||
|
};
|
||||||
|
|
||||||
|
that.getColorIndex = function() { return colorIndex; };
|
||||||
|
that.setColorIndex = function(value) {
|
||||||
|
colorIndex = value;
|
||||||
|
updateGrid();
|
||||||
|
};
|
||||||
|
|
||||||
that.getSnapToGrid = function() { return snapToGrid; };
|
that.getSnapToGrid = function() { return snapToGrid; };
|
||||||
|
that.setSnapToGrid = function(value) {
|
||||||
|
snapToGrid = value;
|
||||||
|
that.emitUpdate();
|
||||||
|
};
|
||||||
|
|
||||||
that.setEnabled = function(enabled) {
|
that.setEnabled = function(enabled) {
|
||||||
that.enabled = enabled;
|
that.enabled = enabled;
|
||||||
updateGrid();
|
updateGrid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
that.getVisible = function() { return that.visible; };
|
||||||
that.setVisible = function(visible, noUpdate) {
|
that.setVisible = function(visible, noUpdate) {
|
||||||
that.visible = visible;
|
that.visible = visible;
|
||||||
updateGrid();
|
updateGrid();
|
||||||
|
@ -78,7 +104,7 @@ Grid = function(opts) {
|
||||||
dimensions = { x: 0, y: 0, z: 0 };
|
dimensions = { x: 0, y: 0, z: 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
var spacing = majorOnly ? (minorGridSpacing * majorGridEvery) : minorGridSpacing;
|
var spacing = majorOnly ? (minorGridWidth * majorGridEvery) : minorGridWidth;
|
||||||
|
|
||||||
position = Vec3.subtract(position, origin);
|
position = Vec3.subtract(position, origin);
|
||||||
|
|
||||||
|
@ -94,7 +120,7 @@ Grid = function(opts) {
|
||||||
return delta;
|
return delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
var spacing = majorOnly ? (minorGridSpacing * majorGridEvery) : minorGridSpacing;
|
var spacing = majorOnly ? (minorGridWidth * majorGridEvery) : minorGridWidth;
|
||||||
|
|
||||||
var snappedDelta = {
|
var snappedDelta = {
|
||||||
x: Math.round(delta.x / spacing) * spacing,
|
x: Math.round(delta.x / spacing) * spacing,
|
||||||
|
@ -121,12 +147,11 @@ Grid = function(opts) {
|
||||||
if (that.onUpdate) {
|
if (that.onUpdate) {
|
||||||
that.onUpdate({
|
that.onUpdate({
|
||||||
origin: origin,
|
origin: origin,
|
||||||
minorGridSpacing: minorGridSpacing,
|
minorGridWidth: minorGridWidth,
|
||||||
majorGridEvery: majorGridEvery,
|
majorGridEvery: majorGridEvery,
|
||||||
gridSize: halfSize,
|
gridSize: halfSize,
|
||||||
visible: that.visible,
|
visible: that.visible,
|
||||||
snapToGrid: snapToGrid,
|
snapToGrid: snapToGrid,
|
||||||
gridColor: gridColor,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -144,16 +169,16 @@ Grid = function(opts) {
|
||||||
that.setPosition(pos, true);
|
that.setPosition(pos, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.minorGridSpacing) {
|
if (data.minorGridWidth) {
|
||||||
minorGridSpacing = data.minorGridSpacing;
|
minorGridWidth = data.minorGridWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.majorGridEvery) {
|
if (data.majorGridEvery) {
|
||||||
majorGridEvery = data.majorGridEvery;
|
majorGridEvery = data.majorGridEvery;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.gridColor) {
|
if (data.colorIndex !== undefined) {
|
||||||
gridColor = data.gridColor;
|
colorIndex = data.colorIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.gridSize) {
|
if (data.gridSize) {
|
||||||
|
@ -171,9 +196,9 @@ Grid = function(opts) {
|
||||||
Overlays.editOverlay(gridOverlay, {
|
Overlays.editOverlay(gridOverlay, {
|
||||||
position: { x: origin.y, y: origin.y, z: -origin.y },
|
position: { x: origin.y, y: origin.y, z: -origin.y },
|
||||||
visible: that.visible && that.enabled,
|
visible: that.visible && that.enabled,
|
||||||
minorGridWidth: minorGridSpacing,
|
minorGridWidth: minorGridWidth,
|
||||||
majorGridEvery: majorGridEvery,
|
majorGridEvery: majorGridEvery,
|
||||||
color: gridColor,
|
color: colors[colorIndex],
|
||||||
alpha: gridAlpha,
|
alpha: gridAlpha,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -199,46 +224,269 @@ Grid = function(opts) {
|
||||||
GridTool = function(opts) {
|
GridTool = function(opts) {
|
||||||
var that = {};
|
var that = {};
|
||||||
|
|
||||||
|
var UI_URL = HIFI_PUBLIC_BUCKET + "images/tools/grid-toolbar.svg";
|
||||||
|
var UI_WIDTH = 854;
|
||||||
|
var UI_HEIGHT = 37;
|
||||||
|
|
||||||
var horizontalGrid = opts.horizontalGrid;
|
var horizontalGrid = opts.horizontalGrid;
|
||||||
var verticalGrid = opts.verticalGrid;
|
|
||||||
var listeners = [];
|
|
||||||
|
|
||||||
var url = Script.resolvePath('html/gridControls.html');
|
var uiOverlays = {};
|
||||||
var webView = new WebWindow('Grid', url, 200, 280);
|
var allOverlays = [];
|
||||||
|
|
||||||
horizontalGrid.addListener(function(data) {
|
function addUIOverlay(key, overlay, x, y, width, height) {
|
||||||
webView.eventBridge.emitScriptEvent(JSON.stringify(data));
|
uiOverlays[key] = {
|
||||||
selectionDisplay.updateHandles();
|
overlay: overlay,
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
};
|
||||||
|
allOverlays.push(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastKnownWindowWidth = null;
|
||||||
|
function repositionUI() {
|
||||||
|
if (lastKnownWindowWidth == Window.innerWidth) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastKnownWindowWidth = Window.innerWidth;
|
||||||
|
var x = Window.innerWidth / 2 - UI_WIDTH / 2;
|
||||||
|
var y = 10;
|
||||||
|
|
||||||
|
for (var key in uiOverlays) {
|
||||||
|
info = uiOverlays[key];
|
||||||
|
Overlays.editOverlay(info.overlay, {
|
||||||
|
x: x + info.x,
|
||||||
|
y: y + info.y,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
webView.eventBridge.webEventReceived.connect(function(data) {
|
// "Spritesheet" is laid out horizontally in this order
|
||||||
data = JSON.parse(data);
|
var UI_SPRITE_LIST = [
|
||||||
if (data.type == "init") {
|
{ name: "gridText", width: 54 },
|
||||||
horizontalGrid.emitUpdate();
|
{ name: "visibleCheckbox", width: 60 },
|
||||||
} else if (data.type == "update") {
|
{ name: "snapToGridCheckbox", width: 105 },
|
||||||
horizontalGrid.update(data);
|
|
||||||
for (var i = 0; i < listeners.length; i++) {
|
{ name: "color0", width: 27 },
|
||||||
listeners[i](data);
|
{ name: "color1", width: 27 },
|
||||||
|
{ name: "color2", width: 27 },
|
||||||
|
{ name: "color3", width: 27 },
|
||||||
|
{ name: "color4", width: 27 },
|
||||||
|
|
||||||
|
{ name: "minorGridIcon", width: 34 },
|
||||||
|
{ name: "minorGridDecrease", width: 25 },
|
||||||
|
{ name: "minorGridInput", width: 26 },
|
||||||
|
{ name: "minorGridIncrease", width: 25 },
|
||||||
|
|
||||||
|
{ name: "majorGridIcon", width: 40 },
|
||||||
|
{ name: "majorGridDecrease", width: 25 },
|
||||||
|
{ name: "majorGridInput", width: 26 },
|
||||||
|
{ name: "majorGridIncrease", width: 25 },
|
||||||
|
|
||||||
|
{ name: "yPositionLabel", width: 160 },
|
||||||
|
{ name: "moveToLabel", width: 54 },
|
||||||
|
{ name: "moveToAvatar", width: 26 },
|
||||||
|
{ name: "moveToSelection", width: 34 },
|
||||||
|
];
|
||||||
|
|
||||||
|
// Add all overlays from spritesheet
|
||||||
|
var baseOverlay = null;
|
||||||
|
var x = 0;
|
||||||
|
for (var i = 0; i < UI_SPRITE_LIST.length; i++) {
|
||||||
|
var info = UI_SPRITE_LIST[i];
|
||||||
|
|
||||||
|
var props = {
|
||||||
|
imageURL: UI_URL,
|
||||||
|
subImage: { x: x, y: 0, width: info.width, height: UI_HEIGHT },
|
||||||
|
width: info.width,
|
||||||
|
height: UI_HEIGHT,
|
||||||
|
alpha: 1.0,
|
||||||
|
visible: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
var overlay;
|
||||||
|
if (baseOverlay == null) {
|
||||||
|
overlay = Overlays.addOverlay("image", {
|
||||||
|
imageURL: UI_URL,
|
||||||
|
});
|
||||||
|
baseOverlay = overlay;
|
||||||
|
} else {
|
||||||
|
overlay = Overlays.cloneOverlay(baseOverlay);
|
||||||
}
|
}
|
||||||
} else if (data.type == "action") {
|
|
||||||
var action = data.action;
|
Overlays.editOverlay(overlay, props);
|
||||||
if (action == "moveToAvatar") {
|
|
||||||
grid.setPosition(MyAvatar.position);
|
addUIOverlay(info.name, overlay, x, 0, info.width, UI_HEIGHT);
|
||||||
} else if (action == "moveToSelection") {
|
|
||||||
var newPosition = selectionManager.worldPosition;
|
x += info.width;
|
||||||
newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 });
|
|
||||||
grid.setPosition(newPosition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add Text overlays
|
||||||
|
var textProperties = {
|
||||||
|
color: { red: 255, green: 255, blue: 255 },
|
||||||
|
topMargin: 6,
|
||||||
|
leftMargin: 4,
|
||||||
|
alpha: 1,
|
||||||
|
backgroundAlpha: 0,
|
||||||
|
text: "",
|
||||||
|
font: { size: 12 },
|
||||||
|
visible: false,
|
||||||
|
};
|
||||||
|
var minorGridWidthText = Overlays.addOverlay("text", textProperties);
|
||||||
|
var majorGridEveryText = Overlays.addOverlay("text", textProperties);
|
||||||
|
var yPositionText = Overlays.addOverlay("text", textProperties);
|
||||||
|
|
||||||
|
addUIOverlay('minorGridWidthText', minorGridWidthText, 414, 8, 24, 24);
|
||||||
|
addUIOverlay('majorGridEveryText', majorGridEveryText, 530, 8, 24, 24);
|
||||||
|
addUIOverlay('yPositionText', yPositionText, 660, 8, 24, 24);
|
||||||
|
|
||||||
|
var NUM_COLORS = 5;
|
||||||
|
function updateColorIndex(index) {
|
||||||
|
if (index < 0 || index >= NUM_COLORS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0 ; i < NUM_COLORS; i++) {
|
||||||
|
var info = uiOverlays['color' + i];
|
||||||
|
Overlays.editOverlay(info.overlay, {
|
||||||
|
subImage: {
|
||||||
|
x: info.x,
|
||||||
|
y: i == index ? UI_HEIGHT : 0,
|
||||||
|
width: info.width,
|
||||||
|
height: info.height,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
that.addListener = function(callback) {
|
function updateGridVisible(value) {
|
||||||
listeners.push(callback);
|
var info = uiOverlays.visibleCheckbox;
|
||||||
|
Overlays.editOverlay(info.overlay, {
|
||||||
|
subImage: {
|
||||||
|
x: info.x,
|
||||||
|
y: value ? UI_HEIGHT : 0,
|
||||||
|
width: info.width,
|
||||||
|
height: info.height,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSnapToGrid(value) {
|
||||||
|
var info = uiOverlays.snapToGridCheckbox;
|
||||||
|
Overlays.editOverlay(info.overlay, {
|
||||||
|
subImage: {
|
||||||
|
x: info.x,
|
||||||
|
y: value ? UI_HEIGHT : 0,
|
||||||
|
width: info.width,
|
||||||
|
height: info.height,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateMinorGridWidth(value) {
|
||||||
|
Overlays.editOverlay(minorGridWidthText, {
|
||||||
|
text: value.toFixed(1),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateMajorGridEvery(value) {
|
||||||
|
Overlays.editOverlay(majorGridEveryText, {
|
||||||
|
text: value,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateYPosition(value) {
|
||||||
|
Overlays.editOverlay(yPositionText, {
|
||||||
|
text: value.toFixed(2),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateOverlays() {
|
||||||
|
updateGridVisible(horizontalGrid.getVisible());
|
||||||
|
updateSnapToGrid(horizontalGrid.getSnapToGrid());
|
||||||
|
updateColorIndex(horizontalGrid.getColorIndex());
|
||||||
|
|
||||||
|
updateMinorGridWidth(horizontalGrid.getMinorGridWidth());
|
||||||
|
updateMajorGridEvery(horizontalGrid.getMajorGridEvery());
|
||||||
|
|
||||||
|
updateYPosition(horizontalGrid.getOrigin().y);
|
||||||
}
|
}
|
||||||
|
|
||||||
that.setVisible = function(visible) {
|
that.setVisible = function(visible) {
|
||||||
webView.setVisible(visible);
|
for (var i = 0; i < allOverlays.length; i++) {
|
||||||
|
Overlays.editOverlay(allOverlays[i], { visible: visible });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
that.mousePressEvent = function(event) {
|
||||||
|
var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y });
|
||||||
|
|
||||||
|
if (allOverlays.indexOf(overlay) >= 0) {
|
||||||
|
if (overlay == uiOverlays.color0.overlay) {
|
||||||
|
horizontalGrid.setColorIndex(0);
|
||||||
|
} else if (overlay == uiOverlays.color1.overlay) {
|
||||||
|
horizontalGrid.setColorIndex(1);
|
||||||
|
} else if (overlay == uiOverlays.color2.overlay) {
|
||||||
|
horizontalGrid.setColorIndex(2);
|
||||||
|
} else if (overlay == uiOverlays.color3.overlay) {
|
||||||
|
horizontalGrid.setColorIndex(3);
|
||||||
|
} else if (overlay == uiOverlays.color4.overlay) {
|
||||||
|
horizontalGrid.setColorIndex(4);
|
||||||
|
} else if (overlay == uiOverlays.visibleCheckbox.overlay) {
|
||||||
|
horizontalGrid.setVisible(!horizontalGrid.getVisible());
|
||||||
|
} else if (overlay == uiOverlays.snapToGridCheckbox.overlay) {
|
||||||
|
horizontalGrid.setSnapToGrid(!horizontalGrid.getSnapToGrid());
|
||||||
|
} else if (overlay == uiOverlays.moveToAvatar.overlay) {
|
||||||
|
horizontalGrid.setPosition(MyAvatar.position);
|
||||||
|
} else if (overlay == uiOverlays.moveToSelection.overlay) {
|
||||||
|
var newPosition = selectionManager.worldPosition;
|
||||||
|
newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 });
|
||||||
|
horizontalGrid.setPosition(newPosition);
|
||||||
|
} else if (overlay == uiOverlays.minorGridDecrease.overlay) {
|
||||||
|
var newValue = Math.max(0.1, horizontalGrid.getMinorGridWidth() - 0.1);
|
||||||
|
horizontalGrid.setMinorGridWidth(newValue);
|
||||||
|
} else if (overlay == uiOverlays.minorGridIncrease.overlay) {
|
||||||
|
horizontalGrid.setMinorGridWidth(horizontalGrid.getMinorGridWidth() + 0.1);
|
||||||
|
} else if (overlay == uiOverlays.majorGridDecrease.overlay) {
|
||||||
|
var newValue = Math.max(2, horizontalGrid.getMajorGridEvery() - 1);
|
||||||
|
horizontalGrid.setMajorGridEvery(newValue);
|
||||||
|
} else if (overlay == uiOverlays.majorGridIncrease.overlay) {
|
||||||
|
horizontalGrid.setMajorGridEvery(horizontalGrid.getMajorGridEvery() + 1);
|
||||||
|
} else if (overlay == uiOverlays.yPositionLabel.overlay) {
|
||||||
|
var newValue = Window.prompt("Y Position:", horizontalGrid.getOrigin().y.toFixed(4));
|
||||||
|
if (newValue !== null) {
|
||||||
|
var y = parseFloat(newValue)
|
||||||
|
if (isNaN(y)) {
|
||||||
|
Window.alert("Invalid position");
|
||||||
|
} else {
|
||||||
|
horizontalGrid.setPosition({ x: 0, y: y, z: 0 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clicking anywhere within the toolbar will "consume" this press event
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
Script.scriptEnding.connect(function() {
|
||||||
|
for (var i = 0; i < allOverlays.length; i++) {
|
||||||
|
Overlays.deleteOverlay(allOverlays[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Script.update.connect(repositionUI);
|
||||||
|
|
||||||
|
horizontalGrid.addListener(function() {
|
||||||
|
selectionDisplay.updateHandles();
|
||||||
|
updateOverlays();
|
||||||
|
});
|
||||||
|
|
||||||
|
updateOverlays();
|
||||||
|
repositionUI();
|
||||||
|
|
||||||
return that;
|
return that;
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,8 +55,8 @@ static const QString MODEL_URL = "/api/v1/models";
|
||||||
|
|
||||||
static const QString SETTING_NAME = "LastModelUploadLocation";
|
static const QString SETTING_NAME = "LastModelUploadLocation";
|
||||||
|
|
||||||
static const int BYTES_PER_MEGABYTES = 1024 * 1024;
|
static const long long BYTES_PER_MEGABYTES = 1024 * 1024;
|
||||||
static const unsigned long MAX_SIZE = 50 * 1024 * BYTES_PER_MEGABYTES; // 50 GB (Virtually remove limit)
|
static const unsigned long long MAX_SIZE = 50 * 1024 * BYTES_PER_MEGABYTES; // 50 GB (Virtually remove limit)
|
||||||
static const int MAX_TEXTURE_SIZE = 1024;
|
static const int MAX_TEXTURE_SIZE = 1024;
|
||||||
static const int TIMEOUT = 1000;
|
static const int TIMEOUT = 1000;
|
||||||
static const int MAX_CHECK = 30;
|
static const int MAX_CHECK = 30;
|
||||||
|
|
|
@ -84,10 +84,8 @@ void SixenseManager::initialize() {
|
||||||
#ifdef HAVE_SIXENSE
|
#ifdef HAVE_SIXENSE
|
||||||
|
|
||||||
if (!_isInitialized) {
|
if (!_isInitialized) {
|
||||||
_lastMovement = 0;
|
|
||||||
_amountMoved = glm::vec3(0.0f);
|
|
||||||
_lowVelocityFilter = false;
|
_lowVelocityFilter = false;
|
||||||
|
_controllersAtBase = true;
|
||||||
_calibrationState = CALIBRATION_STATE_IDLE;
|
_calibrationState = CALIBRATION_STATE_IDLE;
|
||||||
// By default we assume the _neckBase (in orb frame) is as high above the orb
|
// By default we assume the _neckBase (in orb frame) is as high above the orb
|
||||||
// as the "torso" is below it.
|
// as the "torso" is below it.
|
||||||
|
@ -146,15 +144,11 @@ void SixenseManager::setFilter(bool filter) {
|
||||||
|
|
||||||
void SixenseManager::update(float deltaTime) {
|
void SixenseManager::update(float deltaTime) {
|
||||||
#ifdef HAVE_SIXENSE
|
#ifdef HAVE_SIXENSE
|
||||||
if (_isInitialized && _isEnabled) {
|
|
||||||
// if the controllers haven't been moved in a while, disable
|
|
||||||
const unsigned int MOVEMENT_DISABLE_SECONDS = 3;
|
|
||||||
if (usecTimestampNow() - _lastMovement > (MOVEMENT_DISABLE_SECONDS * USECS_PER_SECOND)) {
|
|
||||||
Hand* hand = Application::getInstance()->getAvatar()->getHand();
|
Hand* hand = Application::getInstance()->getAvatar()->getHand();
|
||||||
|
if (_isInitialized && _isEnabled) {
|
||||||
|
// Disable the hands (and return to default pose) if both controllers are at base station
|
||||||
for (std::vector<PalmData>::iterator it = hand->getPalms().begin(); it != hand->getPalms().end(); it++) {
|
for (std::vector<PalmData>::iterator it = hand->getPalms().begin(); it != hand->getPalms().end(); it++) {
|
||||||
it->setActive(false);
|
it->setActive(!_controllersAtBase);
|
||||||
}
|
|
||||||
_lastMovement = usecTimestampNow();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -172,8 +166,6 @@ void SixenseManager::update(float deltaTime) {
|
||||||
_hydrasConnected = true;
|
_hydrasConnected = true;
|
||||||
UserActivityLogger::getInstance().connectedDevice("spatial_controller", "hydra");
|
UserActivityLogger::getInstance().connectedDevice("spatial_controller", "hydra");
|
||||||
}
|
}
|
||||||
MyAvatar* avatar = Application::getInstance()->getAvatar();
|
|
||||||
Hand* hand = avatar->getHand();
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
SixenseBaseFunction sixenseGetMaxControllers =
|
SixenseBaseFunction sixenseGetMaxControllers =
|
||||||
|
@ -192,7 +184,7 @@ void SixenseManager::update(float deltaTime) {
|
||||||
SixenseTakeIntAndSixenseControllerData sixenseGetNewestData =
|
SixenseTakeIntAndSixenseControllerData sixenseGetNewestData =
|
||||||
(SixenseTakeIntAndSixenseControllerData) _sixenseLibrary->resolve("sixenseGetNewestData");
|
(SixenseTakeIntAndSixenseControllerData) _sixenseLibrary->resolve("sixenseGetNewestData");
|
||||||
#endif
|
#endif
|
||||||
|
int numControllersAtBase = 0;
|
||||||
int numActiveControllers = 0;
|
int numActiveControllers = 0;
|
||||||
for (int i = 0; i < maxControllers && numActiveControllers < 2; i++) {
|
for (int i = 0; i < maxControllers && numActiveControllers < 2; i++) {
|
||||||
if (!sixenseIsControllerEnabled(i)) {
|
if (!sixenseIsControllerEnabled(i)) {
|
||||||
|
@ -221,14 +213,11 @@ void SixenseManager::update(float deltaTime) {
|
||||||
qDebug("Found new Sixense controller, ID %i", data->controller_index);
|
qDebug("Found new Sixense controller, ID %i", data->controller_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
palm->setActive(true);
|
|
||||||
|
|
||||||
// Read controller buttons and joystick into the hand
|
// Read controller buttons and joystick into the hand
|
||||||
palm->setControllerButtons(data->buttons);
|
palm->setControllerButtons(data->buttons);
|
||||||
palm->setTrigger(data->trigger);
|
palm->setTrigger(data->trigger);
|
||||||
palm->setJoystick(data->joystick_x, data->joystick_y);
|
palm->setJoystick(data->joystick_x, data->joystick_y);
|
||||||
|
|
||||||
|
|
||||||
// Emulate the mouse so we can use scripts
|
// Emulate the mouse so we can use scripts
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseMouseInput)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseMouseInput)) {
|
||||||
emulateMouse(palm, numActiveControllers - 1);
|
emulateMouse(palm, numActiveControllers - 1);
|
||||||
|
@ -238,6 +227,12 @@ void SixenseManager::update(float deltaTime) {
|
||||||
glm::vec3 position(data->pos[0], data->pos[1], data->pos[2]);
|
glm::vec3 position(data->pos[0], data->pos[1], data->pos[2]);
|
||||||
position *= METERS_PER_MILLIMETER;
|
position *= METERS_PER_MILLIMETER;
|
||||||
|
|
||||||
|
// Check to see if this hand/controller is on the base
|
||||||
|
const float CONTROLLER_AT_BASE_DISTANCE = 0.075f;
|
||||||
|
if (glm::length(position) < CONTROLLER_AT_BASE_DISTANCE) {
|
||||||
|
numControllersAtBase++;
|
||||||
|
}
|
||||||
|
|
||||||
// Transform the measured position into body frame.
|
// Transform the measured position into body frame.
|
||||||
glm::vec3 neck = _neckBase;
|
glm::vec3 neck = _neckBase;
|
||||||
// Zeroing y component of the "neck" effectively raises the measured position a little bit.
|
// Zeroing y component of the "neck" effectively raises the measured position a little bit.
|
||||||
|
@ -274,14 +269,6 @@ void SixenseManager::update(float deltaTime) {
|
||||||
palm->setRawRotation(rotation);
|
palm->setRawRotation(rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
// use the velocity to determine whether there's any movement (if the hand isn't new)
|
|
||||||
const float MOVEMENT_DISTANCE_THRESHOLD = 0.003f;
|
|
||||||
_amountMoved += rawVelocity * deltaTime;
|
|
||||||
if (glm::length(_amountMoved) > MOVEMENT_DISTANCE_THRESHOLD && foundHand) {
|
|
||||||
_lastMovement = usecTimestampNow();
|
|
||||||
_amountMoved = glm::vec3(0.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the one fingertip in the palm structure so we can track velocity
|
// Store the one fingertip in the palm structure so we can track velocity
|
||||||
const float FINGER_LENGTH = 0.3f; // meters
|
const float FINGER_LENGTH = 0.3f; // meters
|
||||||
const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH);
|
const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH);
|
||||||
|
@ -298,7 +285,7 @@ void SixenseManager::update(float deltaTime) {
|
||||||
if (numActiveControllers == 2) {
|
if (numActiveControllers == 2) {
|
||||||
updateCalibration(controllers);
|
updateCalibration(controllers);
|
||||||
}
|
}
|
||||||
|
_controllersAtBase = (numControllersAtBase == 2);
|
||||||
}
|
}
|
||||||
#endif // HAVE_SIXENSE
|
#endif // HAVE_SIXENSE
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,8 +91,6 @@ private:
|
||||||
bool _isInitialized;
|
bool _isInitialized;
|
||||||
bool _isEnabled;
|
bool _isEnabled;
|
||||||
bool _hydrasConnected;
|
bool _hydrasConnected;
|
||||||
quint64 _lastMovement;
|
|
||||||
glm::vec3 _amountMoved;
|
|
||||||
|
|
||||||
// for mouse emulation with the two controllers
|
// for mouse emulation with the two controllers
|
||||||
bool _triggerPressed[2];
|
bool _triggerPressed[2];
|
||||||
|
@ -101,6 +99,7 @@ private:
|
||||||
int _oldY[2];
|
int _oldY[2];
|
||||||
|
|
||||||
bool _lowVelocityFilter;
|
bool _lowVelocityFilter;
|
||||||
|
bool _controllersAtBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_SixenseManager_h
|
#endif // hifi_SixenseManager_h
|
||||||
|
|
|
@ -12,16 +12,18 @@
|
||||||
#include "AnimationCache.h"
|
#include "AnimationCache.h"
|
||||||
#include "AnimationLoop.h"
|
#include "AnimationLoop.h"
|
||||||
|
|
||||||
|
const float AnimationLoop::MAXIMUM_POSSIBLE_FRAME = 100000.0f;
|
||||||
|
|
||||||
AnimationLoop::AnimationLoop() :
|
AnimationLoop::AnimationLoop() :
|
||||||
_fps(30.0f),
|
_fps(30.0f),
|
||||||
_loop(false),
|
_loop(false),
|
||||||
_hold(false),
|
_hold(false),
|
||||||
_startAutomatically(false),
|
_startAutomatically(false),
|
||||||
_firstFrame(0.0f),
|
_firstFrame(0.0f),
|
||||||
_lastFrame(FLT_MAX),
|
_lastFrame(MAXIMUM_POSSIBLE_FRAME),
|
||||||
_running(false),
|
_running(false),
|
||||||
_frameIndex(0.0f),
|
_frameIndex(0.0f),
|
||||||
_maxFrameIndexHint(FLT_MAX)
|
_maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +55,6 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati
|
||||||
void AnimationLoop::simulate(float deltaTime) {
|
void AnimationLoop::simulate(float deltaTime) {
|
||||||
_frameIndex += deltaTime * _fps;
|
_frameIndex += deltaTime * _fps;
|
||||||
|
|
||||||
|
|
||||||
// If we knew the number of frames from the animation, we'd consider using it here
|
// If we knew the number of frames from the animation, we'd consider using it here
|
||||||
// animationGeometry.animationFrames.size()
|
// animationGeometry.animationFrames.size()
|
||||||
float maxFrame = _maxFrameIndexHint;
|
float maxFrame = _maxFrameIndexHint;
|
||||||
|
|
|
@ -16,6 +16,8 @@ class AnimationDetails;
|
||||||
|
|
||||||
class AnimationLoop {
|
class AnimationLoop {
|
||||||
public:
|
public:
|
||||||
|
static const float MAXIMUM_POSSIBLE_FRAME;
|
||||||
|
|
||||||
AnimationLoop();
|
AnimationLoop();
|
||||||
AnimationLoop(const AnimationDetails& animationDetails);
|
AnimationLoop(const AnimationDetails& animationDetails);
|
||||||
AnimationLoop(float fps, bool loop, bool hold, bool startAutomatically, float firstFrame,
|
AnimationLoop(float fps, bool loop, bool hold, bool startAutomatically, float firstFrame,
|
||||||
|
@ -33,10 +35,10 @@ public:
|
||||||
void setStartAutomatically(bool startAutomatically);
|
void setStartAutomatically(bool startAutomatically);
|
||||||
bool getStartAutomatically() const { return _startAutomatically; }
|
bool getStartAutomatically() const { return _startAutomatically; }
|
||||||
|
|
||||||
void setFirstFrame(float firstFrame) { _firstFrame = firstFrame; }
|
void setFirstFrame(float firstFrame) { _firstFrame = glm::clamp(firstFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); }
|
||||||
float getFirstFrame() const { return _firstFrame; }
|
float getFirstFrame() const { return _firstFrame; }
|
||||||
|
|
||||||
void setLastFrame(float lastFrame) { _lastFrame = lastFrame; }
|
void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); }
|
||||||
float getLastFrame() const { return _lastFrame; }
|
float getLastFrame() const { return _lastFrame; }
|
||||||
|
|
||||||
void setRunning(bool running);
|
void setRunning(bool running);
|
||||||
|
@ -45,7 +47,7 @@ public:
|
||||||
void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); }
|
void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); }
|
||||||
float getFrameIndex() const { return _frameIndex; }
|
float getFrameIndex() const { return _frameIndex; }
|
||||||
|
|
||||||
void setMaxFrameIndexHint(float value) { _maxFrameIndexHint = value; }
|
void setMaxFrameIndexHint(float value) { _maxFrameIndexHint = glm::clamp(value, 0.0f, MAXIMUM_POSSIBLE_FRAME); }
|
||||||
float getMaxFrameIndexHint() const { return _maxFrameIndexHint; }
|
float getMaxFrameIndexHint() const { return _maxFrameIndexHint; }
|
||||||
|
|
||||||
void start() { setRunning(true); }
|
void start() { setRunning(true); }
|
||||||
|
|
|
@ -401,6 +401,19 @@ void ModelEntityItem::setAnimationURL(const QString& url) {
|
||||||
_animationURL = url;
|
_animationURL = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelEntityItem::setAnimationFrameIndex(float value) {
|
||||||
|
#ifdef WANT_DEBUG
|
||||||
|
if (isAnimatingSomething()) {
|
||||||
|
qDebug() << "ModelEntityItem::setAnimationFrameIndex()";
|
||||||
|
qDebug() << " value:" << value;
|
||||||
|
qDebug() << " was:" << _animationLoop.getFrameIndex();
|
||||||
|
qDebug() << " model URL:" << getModelURL();
|
||||||
|
qDebug() << " animation URL:" << getAnimationURL();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
_animationLoop.setFrameIndex(value);
|
||||||
|
}
|
||||||
|
|
||||||
void ModelEntityItem::setAnimationSettings(const QString& value) {
|
void ModelEntityItem::setAnimationSettings(const QString& value) {
|
||||||
// the animations setting is a JSON string that may contain various animation settings.
|
// the animations setting is a JSON string that may contain various animation settings.
|
||||||
// if it includes fps, frameIndex, or running, those values will be parsed out and
|
// if it includes fps, frameIndex, or running, those values will be parsed out and
|
||||||
|
@ -416,6 +429,17 @@ void ModelEntityItem::setAnimationSettings(const QString& value) {
|
||||||
|
|
||||||
if (settingsMap.contains("frameIndex")) {
|
if (settingsMap.contains("frameIndex")) {
|
||||||
float frameIndex = settingsMap["frameIndex"].toFloat();
|
float frameIndex = settingsMap["frameIndex"].toFloat();
|
||||||
|
#ifdef WANT_DEBUG
|
||||||
|
if (isAnimatingSomething()) {
|
||||||
|
qDebug() << "ModelEntityItem::setAnimationSettings() calling setAnimationFrameIndex()...";
|
||||||
|
qDebug() << " model URL:" << getModelURL();
|
||||||
|
qDebug() << " animation URL:" << getAnimationURL();
|
||||||
|
qDebug() << " settings:" << value;
|
||||||
|
qDebug() << " settingsMap[frameIndex]:" << settingsMap["frameIndex"];
|
||||||
|
qDebug(" frameIndex: %20.5f", frameIndex);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
setAnimationFrameIndex(frameIndex);
|
setAnimationFrameIndex(frameIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ public:
|
||||||
void setModelURL(const QString& url) { _modelURL = url; }
|
void setModelURL(const QString& url) { _modelURL = url; }
|
||||||
void setAnimationURL(const QString& url);
|
void setAnimationURL(const QString& url);
|
||||||
static const float DEFAULT_ANIMATION_FRAME_INDEX;
|
static const float DEFAULT_ANIMATION_FRAME_INDEX;
|
||||||
void setAnimationFrameIndex(float value) { _animationLoop.setFrameIndex(value); }
|
void setAnimationFrameIndex(float value);
|
||||||
void setAnimationSettings(const QString& value);
|
void setAnimationSettings(const QString& value);
|
||||||
|
|
||||||
static const bool DEFAULT_ANIMATION_IS_PLAYING;
|
static const bool DEFAULT_ANIMATION_IS_PLAYING;
|
||||||
|
|
|
@ -353,7 +353,7 @@ void DatagramSequencer::sendRecordLost(const SendRecord& record) {
|
||||||
if (_packetDropCount == 0 || record.packetNumber == _lastPacketDropped + 1) {
|
if (_packetDropCount == 0 || record.packetNumber == _lastPacketDropped + 1) {
|
||||||
_packetDropCount++;
|
_packetDropCount++;
|
||||||
_lastPacketDropped = record.packetNumber;
|
_lastPacketDropped = record.packetNumber;
|
||||||
const int CONSECUTIVE_DROPS_BEFORE_REDUCTION = 3;
|
const int CONSECUTIVE_DROPS_BEFORE_REDUCTION = 1;
|
||||||
if (_packetDropCount >= CONSECUTIVE_DROPS_BEFORE_REDUCTION && record.packetNumber >= _packetRateDecreasePacketNumber) {
|
if (_packetDropCount >= CONSECUTIVE_DROPS_BEFORE_REDUCTION && record.packetNumber >= _packetRateDecreasePacketNumber) {
|
||||||
_packetsPerGroup = qMax(_packetsPerGroup * 0.5f, 1.0f);
|
_packetsPerGroup = qMax(_packetsPerGroup * 0.5f, 1.0f);
|
||||||
_slowStartThreshold = _packetsPerGroup;
|
_slowStartThreshold = _packetsPerGroup;
|
||||||
|
|
|
@ -147,28 +147,21 @@ QUdpSocket& LimitedNodeList::getDTLSSocket() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void LimitedNodeList::changeSocketBufferSizes(int numBytes) {
|
void LimitedNodeList::changeSocketBufferSizes(int numBytes) {
|
||||||
// change the socket send buffer size to be 1MB
|
|
||||||
int oldBufferSize = 0;
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
int sizeOfInt = sizeof(oldBufferSize);
|
|
||||||
#else
|
|
||||||
unsigned int sizeOfInt = sizeof(oldBufferSize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
int bufferOpt = (i == 0) ? SO_SNDBUF : SO_RCVBUF;
|
QAbstractSocket::SocketOption bufferOpt;
|
||||||
|
QString bufferTypeString;
|
||||||
getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, bufferOpt, reinterpret_cast<char*>(&oldBufferSize), &sizeOfInt);
|
if (i == 0) {
|
||||||
|
bufferOpt = QAbstractSocket::SendBufferSizeSocketOption;
|
||||||
setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, bufferOpt, reinterpret_cast<const char*>(&numBytes),
|
bufferTypeString = "send";
|
||||||
sizeof(numBytes));
|
|
||||||
|
|
||||||
QString bufferTypeString = (i == 0) ? "send" : "receive";
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
bufferOpt = QAbstractSocket::ReceiveBufferSizeSocketOption;
|
||||||
|
bufferTypeString = "receive";
|
||||||
|
}
|
||||||
|
int oldBufferSize = _nodeSocket.socketOption(bufferOpt).toInt();
|
||||||
if (oldBufferSize < numBytes) {
|
if (oldBufferSize < numBytes) {
|
||||||
int newBufferSize = 0;
|
_nodeSocket.setSocketOption(bufferOpt, numBytes);
|
||||||
getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, bufferOpt, reinterpret_cast<char*>(&newBufferSize), &sizeOfInt);
|
int newBufferSize = _nodeSocket.socketOption(bufferOpt).toInt();
|
||||||
|
|
||||||
qDebug() << "Changed socket" << bufferTypeString << "buffer size from" << oldBufferSize << "to"
|
qDebug() << "Changed socket" << bufferTypeString << "buffer size from" << oldBufferSize << "to"
|
||||||
<< newBufferSize << "bytes";
|
<< newBufferSize << "bytes";
|
||||||
|
|
Loading…
Reference in a new issue