mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +02:00
Merge branch 'master' into ajt/new-anim-system
This commit is contained in:
commit
54aa0677f6
42 changed files with 1121 additions and 252 deletions
582
examples/controllers/breakdanceToy.js
Normal file
582
examples/controllers/breakdanceToy.js
Normal file
|
@ -0,0 +1,582 @@
|
||||||
|
//
|
||||||
|
// breakdanceToy.js
|
||||||
|
// examples
|
||||||
|
//
|
||||||
|
// Created by Brad Hefta-Gaub on August 24, 2015
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/";
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
// Computes the penetration between a point and a sphere (centered at the origin)
|
||||||
|
// if point is inside sphere: returns true and stores the result in 'penetration'
|
||||||
|
// (the vector that would move the point outside the sphere)
|
||||||
|
// otherwise returns false
|
||||||
|
function findSphereHit(point, sphereRadius) {
|
||||||
|
var EPSILON = 0.000001; //smallish positive number - used as margin of error for some computations
|
||||||
|
var vectorLength = Vec3.length(point);
|
||||||
|
if (vectorLength < EPSILON) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var distance = vectorLength - sphereRadius;
|
||||||
|
if (distance < 0.0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSpherePointHit(sphereCenter, sphereRadius, point) {
|
||||||
|
return findSphereHit(Vec3.subtract(point,sphereCenter), sphereRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSphereSphereHit(firstCenter, firstRadius, secondCenter, secondRadius) {
|
||||||
|
return findSpherePointHit(firstCenter, firstRadius + secondRadius, secondCenter);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getPositionPuppet() {
|
||||||
|
var DISTANCE_IN_FRONT = 2;
|
||||||
|
var DISTANCE_UP = 0.4;
|
||||||
|
var DISTANCE_TO_SIDE = 0.0;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function getPositionLeftFront() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.6;
|
||||||
|
var DISTANCE_UP = 0.4;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionLeftSide() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.0;
|
||||||
|
var DISTANCE_UP = 0.5;
|
||||||
|
var DISTANCE_TO_SIDE = 0.9;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionLeftOverhead() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_UP = 1;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionLeftLowered() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_DOWN = 0.1;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var downOffset = Vec3.multiply(up, DISTANCE_DOWN);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), downOffset );
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionLeftOnBase() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_DOWN = -0.4;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
var left = Vec3.multiply(right, -1);
|
||||||
|
|
||||||
|
var downOffset = Vec3.multiply(up, DISTANCE_DOWN);
|
||||||
|
var leftOffset = Vec3.multiply(left, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(leftOffset, frontOffset), downOffset );
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionRightFront() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.6;
|
||||||
|
var DISTANCE_UP = 0.4;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var rightOffset = Vec3.multiply(right, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(rightOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionRightSide() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.0;
|
||||||
|
var DISTANCE_UP = 0.5;
|
||||||
|
var DISTANCE_TO_SIDE = 0.9;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var rightOffset = Vec3.multiply(right, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(rightOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionRightOverhead() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_UP = 1;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
|
||||||
|
var upOffset = Vec3.multiply(up, DISTANCE_UP);
|
||||||
|
var rightOffset = Vec3.multiply(right, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(rightOffset, frontOffset), upOffset);
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionRightLowered() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_DOWN = 0.1;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
|
||||||
|
var downOffset = Vec3.multiply(up, DISTANCE_DOWN);
|
||||||
|
var rightOffset = Vec3.multiply(right, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(rightOffset, frontOffset), downOffset );
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPositionRightOnBase() {
|
||||||
|
var DISTANCE_IN_FRONT = 0.2;
|
||||||
|
var DISTANCE_DOWN = -0.4;
|
||||||
|
var DISTANCE_TO_SIDE = 0.3;
|
||||||
|
|
||||||
|
var up = Quat.getUp(MyAvatar.orientation);
|
||||||
|
var front = Quat.getFront(MyAvatar.orientation);
|
||||||
|
var right = Quat.getRight(MyAvatar.orientation);
|
||||||
|
|
||||||
|
var downOffset = Vec3.multiply(up, DISTANCE_DOWN);
|
||||||
|
var rightOffset = Vec3.multiply(right, DISTANCE_TO_SIDE);
|
||||||
|
var frontOffset = Vec3.multiply(front, DISTANCE_IN_FRONT);
|
||||||
|
|
||||||
|
var offset = Vec3.sum(Vec3.sum(rightOffset, frontOffset), downOffset );
|
||||||
|
var position = Vec3.sum(MyAvatar.position, offset);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// We will also demonstrate some 3D overlays. We will create a couple of cubes, spheres, and lines
|
||||||
|
// our 3D cube that moves around...
|
||||||
|
var handSize = 0.25;
|
||||||
|
var leftCubePosition = MyAvatar.getLeftPalmPosition();
|
||||||
|
var rightCubePosition = MyAvatar.getRightPalmPosition();
|
||||||
|
|
||||||
|
var text = Overlays.addOverlay("text", {
|
||||||
|
x: 100,
|
||||||
|
y: 300,
|
||||||
|
width: 900,
|
||||||
|
height: 50,
|
||||||
|
backgroundColor: { red: 0, green: 0, blue: 0},
|
||||||
|
color: { red: 255, green: 255, blue: 255},
|
||||||
|
topMargin: 4,
|
||||||
|
leftMargin: 4,
|
||||||
|
text: "POSE...",
|
||||||
|
alpha: 1,
|
||||||
|
backgroundAlpha: 0.5
|
||||||
|
});
|
||||||
|
|
||||||
|
var leftHand= Overlays.addOverlay("cube", {
|
||||||
|
position: leftCubePosition,
|
||||||
|
size: handSize,
|
||||||
|
color: { red: 0, green: 0, blue: 255},
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var rightHand= Overlays.addOverlay("cube", {
|
||||||
|
position: rightCubePosition,
|
||||||
|
size: handSize,
|
||||||
|
color: { red: 255, green: 0, blue: 0},
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var targetSize = 0.3;
|
||||||
|
var targetColor = { red: 128, green: 128, blue: 128};
|
||||||
|
var targetColorHit = { red: 0, green: 255, blue: 0};
|
||||||
|
var moveCycleColor = { red: 255, green: 255, blue: 0};
|
||||||
|
|
||||||
|
var TEMPORARY_LIFETIME = 60;
|
||||||
|
|
||||||
|
var animationSettings = JSON.stringify({
|
||||||
|
fps: 30,
|
||||||
|
running: true,
|
||||||
|
loop: true,
|
||||||
|
firstFrame: 1,
|
||||||
|
lastFrame: 10000
|
||||||
|
});
|
||||||
|
|
||||||
|
var naturalDimensions = { x: 1.63, y: 1.67, z: 0.31 };
|
||||||
|
var dimensions = Vec3.multiply(naturalDimensions, 0.3);
|
||||||
|
|
||||||
|
var puppetEntityID = Entities.addEntity({
|
||||||
|
type: "Model",
|
||||||
|
modelURL: "https://hifi-public.s3.amazonaws.com/models/Bboys/bboy1/bboy1.fbx",
|
||||||
|
animationURL: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx",
|
||||||
|
animationSettings: animationSettings,
|
||||||
|
position: getPositionPuppet(),
|
||||||
|
ignoreForCollisions: true,
|
||||||
|
dimensions: dimensions,
|
||||||
|
lifetime: TEMPORARY_LIFETIME
|
||||||
|
});
|
||||||
|
|
||||||
|
var leftOnBase = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionLeftOnBase(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var leftLowered = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionLeftLowered(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var leftOverhead = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionLeftOverhead(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var leftSide= Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionLeftSide(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var leftFront= Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionLeftFront(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var rightOnBase = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionRightOnBase(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var rightLowered = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionRightLowered(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var rightOverhead = Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionRightOverhead(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var rightSide= Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionRightSide(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var rightFront= Overlays.addOverlay("cube", {
|
||||||
|
position: getPositionRightFront(),
|
||||||
|
size: targetSize,
|
||||||
|
color: targetColor,
|
||||||
|
alpha: 1,
|
||||||
|
solid: false
|
||||||
|
});
|
||||||
|
|
||||||
|
var startDate = new Date();
|
||||||
|
var lastTime = startDate.getTime();
|
||||||
|
|
||||||
|
var NO_POSE = 0;
|
||||||
|
var LEFT_ON_BASE = 1;
|
||||||
|
var LEFT_OVERHEAD = 2;
|
||||||
|
var LEFT_LOWERED = 4;
|
||||||
|
var LEFT_SIDE = 8;
|
||||||
|
var LEFT_FRONT = 16;
|
||||||
|
var RIGHT_ON_BASE = 32;
|
||||||
|
var RIGHT_OVERHEAD = 64;
|
||||||
|
var RIGHT_LOWERED = 128;
|
||||||
|
var RIGHT_SIDE = 256;
|
||||||
|
var RIGHT_FRONT = 512;
|
||||||
|
|
||||||
|
var lastPoseValue = NO_POSE;
|
||||||
|
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/bboy_pose_to_idle.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/bboy_uprock.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/bboy_uprock_start.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_1.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_2.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_3.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_to_freeze.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_to_idle.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_1.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_2.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_3.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_4.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freezes.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_swipes.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_1.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_1_end.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_1_start.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_2.fbx
|
||||||
|
//http://s3.amazonaws.com/hifi-public/animations/Breakdancing/flair.fbx
|
||||||
|
|
||||||
|
|
||||||
|
var poses = Array();
|
||||||
|
/*
|
||||||
|
poses[0 ] = { name: "no pose", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_OVERHEAD ] = { name: "Left Overhead" , animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_LOWERED ] = { name: "Left Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_SIDE ] = { name: "Left Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_FRONT ] = { name: "Left Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[RIGHT_OVERHEAD ] = { name: "Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[RIGHT_LOWERED ] = { name: "Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[RIGHT_SIDE ] = { name: "Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[RIGHT_FRONT ] = { name: "Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
*/
|
||||||
|
|
||||||
|
poses[LEFT_ON_BASE + RIGHT_ON_BASE ] = { name: "Left On Base + Right On Base", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
|
||||||
|
poses[LEFT_OVERHEAD + RIGHT_ON_BASE ] = { name: "Left Overhead + Right On Base", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_LOWERED + RIGHT_ON_BASE ] = { name: "Left Lowered + Right On Base", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_SIDE + RIGHT_ON_BASE ] = { name: "Left Side + Right On Base", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_FRONT + RIGHT_ON_BASE ] = { name: "Left Front + Right On Base", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
|
||||||
|
poses[LEFT_ON_BASE + RIGHT_OVERHEAD ] = { name: "Left On Base + Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_ON_BASE + RIGHT_LOWERED ] = { name: "Left On Base + Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_ON_BASE + RIGHT_SIDE ] = { name: "Left On Base + Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
poses[LEFT_ON_BASE + RIGHT_FRONT ] = { name: "Left On Base + Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx" };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
poses[LEFT_OVERHEAD + RIGHT_OVERHEAD ] = { name: "Left Overhead + Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/bboy_uprock.fbx" };
|
||||||
|
poses[LEFT_LOWERED + RIGHT_OVERHEAD ] = { name: "Left Lowered + Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_1.fbx" };
|
||||||
|
poses[LEFT_SIDE + RIGHT_OVERHEAD ] = { name: "Left Side + Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_2.fbx" };
|
||||||
|
poses[LEFT_FRONT + RIGHT_OVERHEAD ] = { name: "Left Front + Right Overhead", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_3.fbx" };
|
||||||
|
|
||||||
|
poses[LEFT_OVERHEAD + RIGHT_LOWERED ] = { name: "Left Overhead + Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_to_freeze.fbx" };
|
||||||
|
poses[LEFT_LOWERED + RIGHT_LOWERED ] = { name: "Left Lowered + Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_footwork_to_idle.fbx" };
|
||||||
|
poses[LEFT_SIDE + RIGHT_LOWERED ] = { name: "Left Side + Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_1.fbx" };
|
||||||
|
poses[LEFT_FRONT + RIGHT_LOWERED ] = { name: "Left Front + Right Lowered", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_2.fbx" };
|
||||||
|
|
||||||
|
poses[LEFT_OVERHEAD + RIGHT_SIDE ] = { name: "Left Overhead + Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_3.fbx" };
|
||||||
|
poses[LEFT_LOWERED + RIGHT_SIDE ] = { name: "Left Lowered + Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freeze_var_4.fbx" };
|
||||||
|
poses[LEFT_SIDE + RIGHT_SIDE ] = { name: "Left Side + Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_freezes.fbx" };
|
||||||
|
poses[LEFT_FRONT + RIGHT_SIDE ] = { name: "Left Front + Right Side", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_swipes.fbx" };
|
||||||
|
|
||||||
|
poses[LEFT_OVERHEAD + RIGHT_FRONT ] = { name: "Left Overhead + Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock.fbx" };
|
||||||
|
poses[LEFT_LOWERED + RIGHT_FRONT ] = { name: "Left Lowered + Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_1.fbx" };
|
||||||
|
poses[LEFT_SIDE + RIGHT_FRONT ] = { name: "Left Side + Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_2.fbx" };
|
||||||
|
poses[LEFT_FRONT + RIGHT_FRONT ] = { name: "Left Front + Right Front", animation: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_uprock_var_1_end.fbx" };
|
||||||
|
|
||||||
|
|
||||||
|
Script.update.connect(function(deltaTime) {
|
||||||
|
var date= new Date();
|
||||||
|
var now= date.getTime();
|
||||||
|
var elapsed = now - lastTime;
|
||||||
|
var inMoveCycle = false;
|
||||||
|
|
||||||
|
var leftHandPos = MyAvatar.getLeftPalmPosition();
|
||||||
|
var rightHandPos = MyAvatar.getRightPalmPosition();
|
||||||
|
|
||||||
|
Overlays.editOverlay(leftHand, { position: leftHandPos } );
|
||||||
|
Overlays.editOverlay(rightHand, { position: rightHandPos } );
|
||||||
|
|
||||||
|
var hitTargetLeftOnBase = findSphereSphereHit(leftHandPos, handSize/2, getPositionLeftOnBase(), targetSize/2);
|
||||||
|
var hitTargetLeftOverhead = findSphereSphereHit(leftHandPos, handSize/2, getPositionLeftOverhead(), targetSize/2);
|
||||||
|
var hitTargetLeftLowered = findSphereSphereHit(leftHandPos, handSize/2, getPositionLeftLowered(), targetSize/2);
|
||||||
|
var hitTargetLeftSide = findSphereSphereHit(leftHandPos, handSize/2, getPositionLeftSide(), targetSize/2);
|
||||||
|
var hitTargetLeftFront = findSphereSphereHit(leftHandPos, handSize/2, getPositionLeftFront(), targetSize/2);
|
||||||
|
|
||||||
|
var hitTargetRightOnBase = findSphereSphereHit(rightHandPos, handSize/2, getPositionRightOnBase(), targetSize/2);
|
||||||
|
var hitTargetRightOverhead = findSphereSphereHit(rightHandPos, handSize/2, getPositionRightOverhead(), targetSize/2);
|
||||||
|
var hitTargetRightLowered = findSphereSphereHit(rightHandPos, handSize/2, getPositionRightLowered(), targetSize/2);
|
||||||
|
var hitTargetRightSide = findSphereSphereHit(rightHandPos, handSize/2, getPositionRightSide(), targetSize/2);
|
||||||
|
var hitTargetRightFront = findSphereSphereHit(rightHandPos, handSize/2, getPositionRightFront(), targetSize/2);
|
||||||
|
|
||||||
|
|
||||||
|
// determine target colors
|
||||||
|
var targetColorLeftOnBase = hitTargetLeftOnBase ? targetColorHit : targetColor;
|
||||||
|
var targetColorLeftOverhead = hitTargetLeftOverhead ? targetColorHit : targetColor;
|
||||||
|
var targetColorLeftLowered = hitTargetLeftLowered ? targetColorHit : targetColor;
|
||||||
|
var targetColorLeftSide = hitTargetLeftSide ? targetColorHit : targetColor;
|
||||||
|
var targetColorLeftFront = hitTargetLeftFront ? targetColorHit : targetColor;
|
||||||
|
|
||||||
|
var targetColorRightOnBase = hitTargetRightOnBase ? targetColorHit : targetColor;
|
||||||
|
var targetColorRightOverhead = hitTargetRightOverhead ? targetColorHit : targetColor;
|
||||||
|
var targetColorRightLowered = hitTargetRightLowered ? targetColorHit : targetColor;
|
||||||
|
var targetColorRightSide = hitTargetRightSide ? targetColorHit : targetColor;
|
||||||
|
var targetColorRightFront = hitTargetRightFront ? targetColorHit : targetColor;
|
||||||
|
|
||||||
|
// calculate a combined arm pose based on left and right hits
|
||||||
|
var poseValue = NO_POSE;
|
||||||
|
poseValue += hitTargetLeftOnBase ? LEFT_ON_BASE : 0;
|
||||||
|
poseValue += hitTargetLeftOverhead ? LEFT_OVERHEAD : 0;
|
||||||
|
poseValue += hitTargetLeftLowered ? LEFT_LOWERED : 0;
|
||||||
|
poseValue += hitTargetLeftSide ? LEFT_SIDE : 0;
|
||||||
|
poseValue += hitTargetLeftFront ? LEFT_FRONT : 0;
|
||||||
|
poseValue += hitTargetRightOnBase ? RIGHT_ON_BASE : 0;
|
||||||
|
poseValue += hitTargetRightOverhead ? RIGHT_OVERHEAD : 0;
|
||||||
|
poseValue += hitTargetRightLowered ? RIGHT_LOWERED : 0;
|
||||||
|
poseValue += hitTargetRightSide ? RIGHT_SIDE : 0;
|
||||||
|
poseValue += hitTargetRightFront ? RIGHT_FRONT : 0;
|
||||||
|
|
||||||
|
if (poses[poseValue] == undefined) {
|
||||||
|
Overlays.editOverlay(text, { text: "no pose -- value:" + poseValue });
|
||||||
|
} else {
|
||||||
|
Overlays.editOverlay(text, { text: "pose:" + poses[poseValue].name + "\n" + "animation:" + poses[poseValue].animation });
|
||||||
|
var props = Entities.getEntityProperties(puppetEntityID);
|
||||||
|
Entities.editEntity(puppetEntityID, {
|
||||||
|
animationURL: poses[poseValue].animation,
|
||||||
|
lifetime: TEMPORARY_LIFETIME + props.age // renew lifetime
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
lastPoseValue = poseValue;
|
||||||
|
|
||||||
|
Overlays.editOverlay(leftOnBase, { position: getPositionLeftOnBase(), color: targetColorLeftOnBase } );
|
||||||
|
Overlays.editOverlay(leftOverhead, { position: getPositionLeftOverhead(), color: targetColorLeftOverhead } );
|
||||||
|
Overlays.editOverlay(leftLowered, { position: getPositionLeftLowered(), color: targetColorLeftLowered } );
|
||||||
|
Overlays.editOverlay(leftSide, { position: getPositionLeftSide() , color: targetColorLeftSide } );
|
||||||
|
Overlays.editOverlay(leftFront, { position: getPositionLeftFront() , color: targetColorLeftFront } );
|
||||||
|
|
||||||
|
Overlays.editOverlay(rightOnBase, { position: getPositionRightOnBase(), color: targetColorRightOnBase } );
|
||||||
|
Overlays.editOverlay(rightOverhead, { position: getPositionRightOverhead(), color: targetColorRightOverhead } );
|
||||||
|
Overlays.editOverlay(rightLowered, { position: getPositionRightLowered(), color: targetColorRightLowered } );
|
||||||
|
Overlays.editOverlay(rightSide, { position: getPositionRightSide() , color: targetColorRightSide } );
|
||||||
|
Overlays.editOverlay(rightFront, { position: getPositionRightFront() , color: targetColorRightFront } );
|
||||||
|
});
|
||||||
|
|
||||||
|
Script.scriptEnding.connect(function() {
|
||||||
|
Overlays.deleteOverlay(leftHand);
|
||||||
|
Overlays.deleteOverlay(rightHand);
|
||||||
|
|
||||||
|
Overlays.deleteOverlay(text);
|
||||||
|
Overlays.deleteOverlay(leftOnBase);
|
||||||
|
Overlays.deleteOverlay(leftOverhead);
|
||||||
|
Overlays.deleteOverlay(leftLowered);
|
||||||
|
Overlays.deleteOverlay(leftSide);
|
||||||
|
Overlays.deleteOverlay(leftFront);
|
||||||
|
Overlays.deleteOverlay(rightOnBase);
|
||||||
|
Overlays.deleteOverlay(rightOverhead);
|
||||||
|
Overlays.deleteOverlay(rightLowered);
|
||||||
|
Overlays.deleteOverlay(rightSide);
|
||||||
|
Overlays.deleteOverlay(rightFront);
|
||||||
|
|
||||||
|
print("puppetEntityID:"+puppetEntityID);
|
||||||
|
Entities.deleteEntity(puppetEntityID);
|
||||||
|
});
|
|
@ -83,5 +83,11 @@ EntityListTool = function(opts) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
webView.visibilityChanged.connect(function (visible) {
|
||||||
|
if (visible) {
|
||||||
|
that.sendUpdate();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return that;
|
return that;
|
||||||
};
|
};
|
||||||
|
|
|
@ -39,10 +39,11 @@
|
||||||
this.entity = Entities.addEntity({ type: "ParticleEffect",
|
this.entity = Entities.addEntity({ type: "ParticleEffect",
|
||||||
animationSettings: animationSettings,
|
animationSettings: animationSettings,
|
||||||
position: spawnPoint,
|
position: spawnPoint,
|
||||||
textures: "http://www.hyperlogic.org/images/particle.png",
|
dimensions: {x: 2, y: 2, z: 2},
|
||||||
emitRate: emitRate,
|
emitVelocity: {x: 0, y: 5, z: 0},
|
||||||
emitStrength: emitStrength,
|
velocitySpread: {x: 2, y: 0, z: 2},
|
||||||
emitDirection: emitDirection,
|
emitAcceleration: {x: 0, y: -9.8, z: 0},
|
||||||
|
textures: "https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png",
|
||||||
color: color,
|
color: color,
|
||||||
lifespan: 1.0,
|
lifespan: 1.0,
|
||||||
visible: true,
|
visible: true,
|
||||||
|
|
|
@ -55,46 +55,50 @@ void IceServer::processDatagrams() {
|
||||||
_serverSocket.readDatagram(buffer.get(), packetSizeWithHeader,
|
_serverSocket.readDatagram(buffer.get(), packetSizeWithHeader,
|
||||||
sendingSockAddr.getAddressPointer(), sendingSockAddr.getPortPointer());
|
sendingSockAddr.getAddressPointer(), sendingSockAddr.getPortPointer());
|
||||||
|
|
||||||
auto packet = Packet::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, sendingSockAddr);
|
// make sure that this packet at least looks like something we can read
|
||||||
|
if (packetSizeWithHeader >= Packet::localHeaderSize(PacketType::ICEServerHeartbeat)) {
|
||||||
PacketType::Value packetType = packet->getType();
|
|
||||||
|
|
||||||
if (packetType == PacketType::ICEServerHeartbeat) {
|
|
||||||
SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(*packet);
|
|
||||||
|
|
||||||
// so that we can send packets to the heartbeating peer when we need, we need to activate a socket now
|
|
||||||
peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr);
|
|
||||||
} else if (packetType == PacketType::ICEServerQuery) {
|
|
||||||
QDataStream heartbeatStream(packet.get());
|
|
||||||
|
|
||||||
// this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer?
|
|
||||||
QUuid senderUUID;
|
|
||||||
heartbeatStream >> senderUUID;
|
|
||||||
|
|
||||||
// pull the public and private sock addrs for this peer
|
|
||||||
HifiSockAddr publicSocket, localSocket;
|
|
||||||
heartbeatStream >> publicSocket >> localSocket;
|
|
||||||
|
|
||||||
// check if this node also included a UUID that they would like to connect to
|
|
||||||
QUuid connectRequestID;
|
|
||||||
heartbeatStream >> connectRequestID;
|
|
||||||
|
|
||||||
SharedNetworkPeer matchingPeer = _activePeers.value(connectRequestID);
|
auto packet = Packet::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, sendingSockAddr);
|
||||||
|
|
||||||
if (matchingPeer) {
|
PacketType::Value packetType = packet->getType();
|
||||||
|
|
||||||
|
if (packetType == PacketType::ICEServerHeartbeat) {
|
||||||
|
SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(*packet);
|
||||||
|
|
||||||
qDebug() << "Sending information for peer" << connectRequestID << "to peer" << senderUUID;
|
// so that we can send packets to the heartbeating peer when we need, we need to activate a socket now
|
||||||
|
peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr);
|
||||||
|
} else if (packetType == PacketType::ICEServerQuery) {
|
||||||
|
QDataStream heartbeatStream(packet.get());
|
||||||
|
|
||||||
// we have the peer they want to connect to - send them pack the information for that peer
|
// this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer?
|
||||||
sendPeerInformationPacket(*(matchingPeer.data()), &sendingSockAddr);
|
QUuid senderUUID;
|
||||||
|
heartbeatStream >> senderUUID;
|
||||||
// we also need to send them to the active peer they are hoping to connect to
|
|
||||||
// create a dummy peer object we can pass to sendPeerInformationPacket
|
// pull the public and private sock addrs for this peer
|
||||||
|
HifiSockAddr publicSocket, localSocket;
|
||||||
NetworkPeer dummyPeer(senderUUID, publicSocket, localSocket);
|
heartbeatStream >> publicSocket >> localSocket;
|
||||||
sendPeerInformationPacket(dummyPeer, matchingPeer->getActiveSocket());
|
|
||||||
} else {
|
// check if this node also included a UUID that they would like to connect to
|
||||||
qDebug() << "Peer" << senderUUID << "asked for" << connectRequestID << "but no matching peer found";
|
QUuid connectRequestID;
|
||||||
|
heartbeatStream >> connectRequestID;
|
||||||
|
|
||||||
|
SharedNetworkPeer matchingPeer = _activePeers.value(connectRequestID);
|
||||||
|
|
||||||
|
if (matchingPeer) {
|
||||||
|
|
||||||
|
qDebug() << "Sending information for peer" << connectRequestID << "to peer" << senderUUID;
|
||||||
|
|
||||||
|
// we have the peer they want to connect to - send them pack the information for that peer
|
||||||
|
sendPeerInformationPacket(*(matchingPeer.data()), &sendingSockAddr);
|
||||||
|
|
||||||
|
// we also need to send them to the active peer they are hoping to connect to
|
||||||
|
// create a dummy peer object we can pass to sendPeerInformationPacket
|
||||||
|
|
||||||
|
NetworkPeer dummyPeer(senderUUID, publicSocket, localSocket);
|
||||||
|
sendPeerInformationPacket(dummyPeer, matchingPeer->getActiveSocket());
|
||||||
|
} else {
|
||||||
|
qDebug() << "Peer" << senderUUID << "asked for" << connectRequestID << "but no matching peer found";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
|
@ -104,6 +104,7 @@
|
||||||
#include <RenderableWebEntityItem.h>
|
#include <RenderableWebEntityItem.h>
|
||||||
|
|
||||||
#include "AudioClient.h"
|
#include "AudioClient.h"
|
||||||
|
#include "CrashHandler.h"
|
||||||
#include "DiscoverabilityManager.h"
|
#include "DiscoverabilityManager.h"
|
||||||
#include "GLCanvas.h"
|
#include "GLCanvas.h"
|
||||||
#include "LODManager.h"
|
#include "LODManager.h"
|
||||||
|
@ -262,6 +263,12 @@ bool setupEssentials(int& argc, char** argv) {
|
||||||
// Set build version
|
// Set build version
|
||||||
QCoreApplication::setApplicationVersion(BUILD_VERSION);
|
QCoreApplication::setApplicationVersion(BUILD_VERSION);
|
||||||
|
|
||||||
|
Setting::preInit();
|
||||||
|
|
||||||
|
CrashHandler::checkForAndHandleCrash();
|
||||||
|
CrashHandler::writeRunningMarkerFiler();
|
||||||
|
qAddPostRoutine(CrashHandler::deleteRunningMarkerFile);
|
||||||
|
|
||||||
DependencyManager::registerInheritance<LimitedNodeList, NodeList>();
|
DependencyManager::registerInheritance<LimitedNodeList, NodeList>();
|
||||||
DependencyManager::registerInheritance<AvatarHashMap, AvatarManager>();
|
DependencyManager::registerInheritance<AvatarHashMap, AvatarManager>();
|
||||||
DependencyManager::registerInheritance<EntityActionFactoryInterface, InterfaceActionFactory>();
|
DependencyManager::registerInheritance<EntityActionFactoryInterface, InterfaceActionFactory>();
|
||||||
|
@ -5041,3 +5048,11 @@ void Application::emulateMouse(Hand* hand, float click, float shift, int index)
|
||||||
_oldHandLeftClick[index] = false;
|
_oldHandLeftClick[index] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::crashApplication() {
|
||||||
|
QObject* object = nullptr;
|
||||||
|
bool value = object->isWindowType();
|
||||||
|
Q_UNUSED(value);
|
||||||
|
|
||||||
|
qCDebug(interfaceapp) << "Intentionally crashed Interface";
|
||||||
|
}
|
||||||
|
|
|
@ -433,6 +433,8 @@ public slots:
|
||||||
|
|
||||||
void reloadResourceCaches();
|
void reloadResourceCaches();
|
||||||
|
|
||||||
|
void crashApplication();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void clearDomainOctreeDetails();
|
void clearDomainOctreeDetails();
|
||||||
void checkFPS();
|
void checkFPS();
|
||||||
|
|
183
interface/src/CrashHandler.cpp
Normal file
183
interface/src/CrashHandler.cpp
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
//
|
||||||
|
// CrashHandler.cpp
|
||||||
|
// interface/src
|
||||||
|
//
|
||||||
|
// Created by David Rowe on 24 Aug 2015.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "CrashHandler.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <PathUtils.h>
|
||||||
|
#include <QRadioButton>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
#include "DataServerAccountInfo.h"
|
||||||
|
#include "Menu.h"
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(DataServerAccountInfo)
|
||||||
|
|
||||||
|
static const QString RUNNING_MARKER_FILENAME = "Interface.running";
|
||||||
|
|
||||||
|
void CrashHandler::checkForAndHandleCrash() {
|
||||||
|
QFile runningMarkerFile(runningMarkerFilePath());
|
||||||
|
if (runningMarkerFile.exists()) {
|
||||||
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
|
QSettings settings;
|
||||||
|
settings.beginGroup("Developer");
|
||||||
|
QVariant displayCrashOptions = settings.value(MenuOption::DisplayCrashOptions);
|
||||||
|
settings.endGroup();
|
||||||
|
if (!displayCrashOptions.isValid() // Option does not exist in Interface.ini so assume default behavior.
|
||||||
|
|| displayCrashOptions.toBool()) {
|
||||||
|
Action action = promptUserForAction();
|
||||||
|
if (action != DO_NOTHING) {
|
||||||
|
handleCrash(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CrashHandler::Action CrashHandler::promptUserForAction() {
|
||||||
|
QDialog crashDialog;
|
||||||
|
crashDialog.setWindowTitle("Interface Crashed Last Run");
|
||||||
|
|
||||||
|
QVBoxLayout* layout = new QVBoxLayout;
|
||||||
|
|
||||||
|
QLabel* label = new QLabel("If you are having trouble starting would you like to reset your settings?");
|
||||||
|
layout->addWidget(label);
|
||||||
|
|
||||||
|
QRadioButton* option1 = new QRadioButton("Reset all my settings");
|
||||||
|
QRadioButton* option2 = new QRadioButton("Reset my settings but retain login and avatar info.");
|
||||||
|
QRadioButton* option3 = new QRadioButton("Continue with my current settings");
|
||||||
|
option3->setChecked(true);
|
||||||
|
layout->addWidget(option1);
|
||||||
|
layout->addWidget(option2);
|
||||||
|
layout->addWidget(option3);
|
||||||
|
layout->addSpacing(12);
|
||||||
|
layout->addStretch();
|
||||||
|
|
||||||
|
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok);
|
||||||
|
layout->addWidget(buttons);
|
||||||
|
crashDialog.connect(buttons, SIGNAL(accepted()), SLOT(accept()));
|
||||||
|
|
||||||
|
crashDialog.setLayout(layout);
|
||||||
|
|
||||||
|
int result = crashDialog.exec();
|
||||||
|
|
||||||
|
if (result == QDialog::Accepted) {
|
||||||
|
if (option1->isChecked()) {
|
||||||
|
return CrashHandler::DELETE_INTERFACE_INI;
|
||||||
|
}
|
||||||
|
if (option2->isChecked()) {
|
||||||
|
return CrashHandler::RETAIN_LOGIN_AND_AVATAR_INFO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dialog cancelled or "do nothing" option chosen
|
||||||
|
return CrashHandler::DO_NOTHING;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrashHandler::handleCrash(CrashHandler::Action action) {
|
||||||
|
if (action != CrashHandler::DELETE_INTERFACE_INI && action != CrashHandler::RETAIN_LOGIN_AND_AVATAR_INFO) {
|
||||||
|
// CrashHandler::DO_NOTHING or unexpected value
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
|
QSettings settings;
|
||||||
|
const QString ADDRESS_MANAGER_GROUP = "AddressManager";
|
||||||
|
const QString ADDRESS_KEY = "address";
|
||||||
|
const QString AVATAR_GROUP = "Avatar";
|
||||||
|
const QString DISPLAY_NAME_KEY = "displayName";
|
||||||
|
const QString FULL_AVATAR_URL_KEY = "fullAvatarURL";
|
||||||
|
const QString FULL_AVATAR_MODEL_NAME_KEY = "fullAvatarModelName";
|
||||||
|
const QString ACCOUNTS_GROUP = "accounts";
|
||||||
|
QString displayName;
|
||||||
|
QUrl fullAvatarURL;
|
||||||
|
QString fullAvatarModelName;
|
||||||
|
QUrl address;
|
||||||
|
QMap<QString, DataServerAccountInfo> accounts;
|
||||||
|
|
||||||
|
if (action == CrashHandler::RETAIN_LOGIN_AND_AVATAR_INFO) {
|
||||||
|
// Read login and avatar info
|
||||||
|
|
||||||
|
qRegisterMetaType<DataServerAccountInfo>("DataServerAccountInfo");
|
||||||
|
qRegisterMetaTypeStreamOperators<DataServerAccountInfo>("DataServerAccountInfo");
|
||||||
|
|
||||||
|
// Location and orientation
|
||||||
|
settings.beginGroup(ADDRESS_MANAGER_GROUP);
|
||||||
|
address = settings.value(ADDRESS_KEY).toUrl();
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
// Display name and avatar
|
||||||
|
settings.beginGroup(AVATAR_GROUP);
|
||||||
|
displayName = settings.value(DISPLAY_NAME_KEY).toString();
|
||||||
|
fullAvatarURL = settings.value(FULL_AVATAR_URL_KEY).toUrl();
|
||||||
|
fullAvatarModelName = settings.value(FULL_AVATAR_MODEL_NAME_KEY).toString();
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
// Accounts
|
||||||
|
settings.beginGroup(ACCOUNTS_GROUP);
|
||||||
|
foreach(const QString& key, settings.allKeys()) {
|
||||||
|
accounts.insert(key, settings.value(key).value<DataServerAccountInfo>());
|
||||||
|
}
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete Interface.ini
|
||||||
|
QFile settingsFile(settings.fileName());
|
||||||
|
if (settingsFile.exists()) {
|
||||||
|
settingsFile.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (action == CrashHandler::RETAIN_LOGIN_AND_AVATAR_INFO) {
|
||||||
|
// Write login and avatar info
|
||||||
|
|
||||||
|
// Location and orientation
|
||||||
|
settings.beginGroup(ADDRESS_MANAGER_GROUP);
|
||||||
|
settings.setValue(ADDRESS_KEY, address);
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
// Display name and avatar
|
||||||
|
settings.beginGroup(AVATAR_GROUP);
|
||||||
|
settings.setValue(DISPLAY_NAME_KEY, displayName);
|
||||||
|
settings.setValue(FULL_AVATAR_URL_KEY, fullAvatarURL);
|
||||||
|
settings.setValue(FULL_AVATAR_MODEL_NAME_KEY, fullAvatarModelName);
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
// Accounts
|
||||||
|
settings.beginGroup(ACCOUNTS_GROUP);
|
||||||
|
foreach(const QString& key, accounts.keys()) {
|
||||||
|
settings.setValue(key, QVariant::fromValue(accounts.value(key)));
|
||||||
|
}
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CrashHandler::writeRunningMarkerFiler() {
|
||||||
|
QFile runningMarkerFile(runningMarkerFilePath());
|
||||||
|
if (!runningMarkerFile.exists()) {
|
||||||
|
runningMarkerFile.open(QIODevice::WriteOnly);
|
||||||
|
runningMarkerFile.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CrashHandler::deleteRunningMarkerFile() {
|
||||||
|
QFile runningMarkerFile(runningMarkerFilePath());
|
||||||
|
if (runningMarkerFile.exists()) {
|
||||||
|
runningMarkerFile.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString CrashHandler::runningMarkerFilePath() {
|
||||||
|
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + RUNNING_MARKER_FILENAME;
|
||||||
|
}
|
38
interface/src/CrashHandler.h
Normal file
38
interface/src/CrashHandler.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
//
|
||||||
|
// CrashHandler.h
|
||||||
|
// interface/src
|
||||||
|
//
|
||||||
|
// Created by David Rowe on 24 Aug 2015.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_CrashHandler_h
|
||||||
|
#define hifi_CrashHandler_h
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class CrashHandler {
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void checkForAndHandleCrash();
|
||||||
|
|
||||||
|
static void writeRunningMarkerFiler();
|
||||||
|
static void deleteRunningMarkerFile();
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum Action {
|
||||||
|
DELETE_INTERFACE_INI,
|
||||||
|
RETAIN_LOGIN_AND_AVATAR_INFO,
|
||||||
|
DO_NOTHING
|
||||||
|
};
|
||||||
|
|
||||||
|
static Action promptUserForAction();
|
||||||
|
static void handleCrash(Action action);
|
||||||
|
|
||||||
|
static const QString runningMarkerFilePath();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_CrashHandler_h
|
|
@ -222,7 +222,7 @@ Menu::Menu() {
|
||||||
addActionToQMenuAndActionHash(toolsMenu, MenuOption::PackageModel, 0,
|
addActionToQMenuAndActionHash(toolsMenu, MenuOption::PackageModel, 0,
|
||||||
qApp, SLOT(packageModel()));
|
qApp, SLOT(packageModel()));
|
||||||
|
|
||||||
MenuWrapper* displayMenu = addMenu(DisplayPlugin::MENU_PATH());
|
addMenu(DisplayPlugin::MENU_PATH());
|
||||||
{
|
{
|
||||||
MenuWrapper* displayModeMenu = addMenu(MenuOption::OutputMenu);
|
MenuWrapper* displayModeMenu = addMenu(MenuOption::OutputMenu);
|
||||||
QActionGroup* displayModeGroup = new QActionGroup(displayModeMenu);
|
QActionGroup* displayModeGroup = new QActionGroup(displayModeMenu);
|
||||||
|
@ -431,6 +431,8 @@ Menu::Menu() {
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderFocusIndicator, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderFocusIndicator, 0, false);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowWhosLookingAtMe, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ShowWhosLookingAtMe, 0, false);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false);
|
||||||
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableRigAnimations, 0, false,
|
||||||
|
avatar, SLOT(setEnableRigAnimations(bool)));
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu,
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu,
|
||||||
MenuOption::Connexion,
|
MenuOption::Connexion,
|
||||||
|
@ -560,6 +562,9 @@ Menu::Menu() {
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned);
|
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowOwned);
|
||||||
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowHulls);
|
addCheckableActionToQMenuAndActionHash(physicsOptionsMenu, MenuOption::PhysicsShowHulls);
|
||||||
|
|
||||||
|
addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DisplayCrashOptions, 0, true);
|
||||||
|
addActionToQMenuAndActionHash(developerMenu, MenuOption::CrashInterface, 0, qApp, SLOT(crashApplication()));
|
||||||
|
|
||||||
MenuWrapper* helpMenu = addMenu("Help");
|
MenuWrapper* helpMenu = addMenu("Help");
|
||||||
addActionToQMenuAndActionHash(helpMenu, MenuOption::EditEntitiesHelp, 0, qApp, SLOT(showEditEntitiesHelp()));
|
addActionToQMenuAndActionHash(helpMenu, MenuOption::EditEntitiesHelp, 0, qApp, SLOT(showEditEntitiesHelp()));
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,7 @@ namespace MenuOption {
|
||||||
const QString CopyAddress = "Copy Address to Clipboard";
|
const QString CopyAddress = "Copy Address to Clipboard";
|
||||||
const QString CopyPath = "Copy Path to Clipboard";
|
const QString CopyPath = "Copy Path to Clipboard";
|
||||||
const QString CoupleEyelids = "Couple Eyelids";
|
const QString CoupleEyelids = "Couple Eyelids";
|
||||||
|
const QString CrashInterface = "Crash Interface";
|
||||||
const QString DebugAmbientOcclusion = "Debug Ambient Occlusion";
|
const QString DebugAmbientOcclusion = "Debug Ambient Occlusion";
|
||||||
const QString DecreaseAvatarSize = "Decrease Avatar Size";
|
const QString DecreaseAvatarSize = "Decrease Avatar Size";
|
||||||
const QString DeleteBookmark = "Delete Bookmark...";
|
const QString DeleteBookmark = "Delete Bookmark...";
|
||||||
|
@ -172,6 +173,7 @@ namespace MenuOption {
|
||||||
const QString DisableLightEntities = "Disable Light Entities";
|
const QString DisableLightEntities = "Disable Light Entities";
|
||||||
const QString DisableNackPackets = "Disable Entity NACK Packets";
|
const QString DisableNackPackets = "Disable Entity NACK Packets";
|
||||||
const QString DiskCacheEditor = "Disk Cache Editor";
|
const QString DiskCacheEditor = "Disk Cache Editor";
|
||||||
|
const QString DisplayCrashOptions = "Display Crash Options";
|
||||||
const QString DisplayHands = "Show Hand Info";
|
const QString DisplayHands = "Show Hand Info";
|
||||||
const QString DisplayHandTargets = "Show Hand Targets";
|
const QString DisplayHandTargets = "Show Hand Targets";
|
||||||
const QString DisplayModelBounds = "Display Model Bounds";
|
const QString DisplayModelBounds = "Display Model Bounds";
|
||||||
|
@ -186,6 +188,7 @@ namespace MenuOption {
|
||||||
const QString EditEntitiesHelp = "Edit Entities Help...";
|
const QString EditEntitiesHelp = "Edit Entities Help...";
|
||||||
const QString Enable3DTVMode = "Enable 3DTV Mode";
|
const QString Enable3DTVMode = "Enable 3DTV Mode";
|
||||||
const QString EnableCharacterController = "Enable avatar collisions";
|
const QString EnableCharacterController = "Enable avatar collisions";
|
||||||
|
const QString EnableRigAnimations = "Enable Rig Animations";
|
||||||
const QString ExpandMyAvatarSimulateTiming = "Expand /myAvatar/simulation";
|
const QString ExpandMyAvatarSimulateTiming = "Expand /myAvatar/simulation";
|
||||||
const QString ExpandMyAvatarTiming = "Expand /myAvatar";
|
const QString ExpandMyAvatarTiming = "Expand /myAvatar";
|
||||||
const QString ExpandOtherAvatarTiming = "Expand /otherAvatar";
|
const QString ExpandOtherAvatarTiming = "Expand /otherAvatar";
|
||||||
|
|
|
@ -726,9 +726,10 @@ float loadSetting(QSettings& settings, const char* name, float defaultValue) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::setEnableRigAnimations(bool isEnabled) {
|
void MyAvatar::setEnableRigAnimations(bool isEnabled) {
|
||||||
Settings settings;
|
|
||||||
settings.setValue("enableRig", isEnabled);
|
|
||||||
_rig->setEnableRig(isEnabled);
|
_rig->setEnableRig(isEnabled);
|
||||||
|
if (!isEnabled) {
|
||||||
|
_rig->deleteAnimations();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::loadData() {
|
void MyAvatar::loadData() {
|
||||||
|
@ -790,7 +791,7 @@ void MyAvatar::loadData() {
|
||||||
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
||||||
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
_rig->setEnableRig(settings.value("enableRig").toBool());
|
_rig->setEnableRig(Menu::getInstance()->isOptionChecked(MenuOption::EnableRigAnimations));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::saveAttachmentData(const AttachmentData& attachment) const {
|
void MyAvatar::saveAttachmentData(const AttachmentData& attachment) const {
|
||||||
|
@ -864,7 +865,6 @@ void MyAvatar::sendKillAvatar() {
|
||||||
DependencyManager::get<NodeList>()->broadcastToNodes(std::move(killPacket), NodeSet() << NodeType::AvatarMixer);
|
DependencyManager::get<NodeList>()->broadcastToNodes(std::move(killPacket), NodeSet() << NodeType::AvatarMixer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int counter = 0;
|
|
||||||
void MyAvatar::updateLookAtTargetAvatar() {
|
void MyAvatar::updateLookAtTargetAvatar() {
|
||||||
//
|
//
|
||||||
// Look at the avatar whose eyes are closest to the ray in direction of my avatar's head
|
// Look at the avatar whose eyes are closest to the ray in direction of my avatar's head
|
||||||
|
|
|
@ -91,7 +91,6 @@ public:
|
||||||
Q_INVOKABLE AnimationDetails getAnimationDetailsByRole(const QString& role);
|
Q_INVOKABLE AnimationDetails getAnimationDetailsByRole(const QString& role);
|
||||||
Q_INVOKABLE AnimationDetails getAnimationDetails(const QString& url);
|
Q_INVOKABLE AnimationDetails getAnimationDetails(const QString& url);
|
||||||
void clearJointAnimationPriorities();
|
void clearJointAnimationPriorities();
|
||||||
Q_INVOKABLE void setEnableRigAnimations(bool isEnabled);
|
|
||||||
|
|
||||||
// get/set avatar data
|
// get/set avatar data
|
||||||
void saveData();
|
void saveData();
|
||||||
|
@ -194,6 +193,7 @@ public slots:
|
||||||
void loadLastRecording();
|
void loadLastRecording();
|
||||||
|
|
||||||
virtual void rebuildSkeletonBody();
|
virtual void rebuildSkeletonBody();
|
||||||
|
void setEnableRigAnimations(bool isEnabled);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void transformChanged();
|
void transformChanged();
|
||||||
|
|
|
@ -103,7 +103,7 @@ int main(int argc, const char* argv[]) {
|
||||||
Application app(argc, const_cast<char**>(argv), startupTime);
|
Application app(argc, const_cast<char**>(argv), startupTime);
|
||||||
|
|
||||||
QTranslator translator;
|
QTranslator translator;
|
||||||
translator.load("interface_en");
|
translator.load("i18n/interface_en");
|
||||||
app.installTranslator(&translator);
|
app.installTranslator(&translator);
|
||||||
|
|
||||||
qCDebug(interfaceapp, "Created QT Application.");
|
qCDebug(interfaceapp, "Created QT Application.");
|
||||||
|
|
|
@ -45,6 +45,7 @@ WebWindowClass::WebWindowClass(const QString& title, const QString& url, int wid
|
||||||
|
|
||||||
auto dockWidget = new QDockWidget(title, toolWindow);
|
auto dockWidget = new QDockWidget(title, toolWindow);
|
||||||
dockWidget->setFeatures(QDockWidget::DockWidgetMovable);
|
dockWidget->setFeatures(QDockWidget::DockWidgetMovable);
|
||||||
|
connect(dockWidget, &QDockWidget::visibilityChanged, this, &WebWindowClass::visibilityChanged);
|
||||||
|
|
||||||
_webView = new QWebView(dockWidget);
|
_webView = new QWebView(dockWidget);
|
||||||
addEventBridgeToWindowObject();
|
addEventBridgeToWindowObject();
|
||||||
|
|
|
@ -60,6 +60,7 @@ public slots:
|
||||||
void setTitle(const QString& title);
|
void setTitle(const QString& title);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void visibilityChanged(bool visible); // Tool window
|
||||||
void moved(glm::vec2 position);
|
void moved(glm::vec2 position);
|
||||||
void resized(QSizeF size);
|
void resized(QSizeF size);
|
||||||
void closed();
|
void closed();
|
||||||
|
|
|
@ -206,8 +206,6 @@ void ApplicationCompositor::displayOverlayTexture(RenderArgs* renderArgs) {
|
||||||
|
|
||||||
updateTooltips();
|
updateTooltips();
|
||||||
|
|
||||||
auto deviceSize = qApp->getDeviceSize();
|
|
||||||
|
|
||||||
//Handle fading and deactivation/activation of UI
|
//Handle fading and deactivation/activation of UI
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
|
|
||||||
|
|
|
@ -100,24 +100,21 @@ AnimationHandlePointer Rig::addAnimationByRole(const QString& role, const QStrin
|
||||||
AnimationHandlePointer handle = createAnimationHandle();
|
AnimationHandlePointer handle = createAnimationHandle();
|
||||||
QString standard = "";
|
QString standard = "";
|
||||||
if (url.isEmpty()) { // Default animations for fight club
|
if (url.isEmpty()) { // Default animations for fight club
|
||||||
const QString& base = "https://hifi-public.s3.amazonaws.com/ozan/";
|
const QString& base = "https://hifi-public.s3.amazonaws.com/ozan/anim/standard_anims/";
|
||||||
if (role == "walk") {
|
if (role == "walk") {
|
||||||
standard = base + "support/FightClubBotTest1/Animations/standard_walk.fbx";
|
standard = base + "walk_fwd.fbx";
|
||||||
lastFrame = 60;
|
} else if (role == "backup") {
|
||||||
|
standard = base + "walk_bwd.fbx";
|
||||||
} else if (role == "leftTurn") {
|
} else if (role == "leftTurn") {
|
||||||
standard = base + "support/FightClubBotTest1/Animations/left_turn_noHipRotation.fbx";
|
standard = base + "turn_left.fbx";
|
||||||
lastFrame = 29;
|
|
||||||
} else if (role == "rightTurn") {
|
} else if (role == "rightTurn") {
|
||||||
standard = base + "support/FightClubBotTest1/Animations/right_turn_noHipRotation.fbx";
|
standard = base + "turn_right.fbx";
|
||||||
lastFrame = 31;
|
|
||||||
} else if (role == "leftStrafe") {
|
} else if (role == "leftStrafe") {
|
||||||
standard = base + "animations/fightclub_bot_anims/side_step_left_inPlace.fbx";
|
standard = base + "strafe_left.fbx";
|
||||||
lastFrame = 31;
|
|
||||||
} else if (role == "rightStrafe") {
|
} else if (role == "rightStrafe") {
|
||||||
standard = base + "animations/fightclub_bot_anims/side_step_right_inPlace.fbx";
|
standard = base + "strafe_right.fbx";
|
||||||
lastFrame = 31;
|
|
||||||
} else if (role == "idle") {
|
} else if (role == "idle") {
|
||||||
standard = base + "support/FightClubBotTest1/Animations/standard_idle.fbx";
|
standard = base + "idle.fbx";
|
||||||
fps = 25.0f;
|
fps = 25.0f;
|
||||||
}
|
}
|
||||||
if (!standard.isEmpty()) {
|
if (!standard.isEmpty()) {
|
||||||
|
@ -438,11 +435,12 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
updateRole("walk", std::abs(forwardSpeed) > 0.01f);
|
updateRole("walk", forwardSpeed > 0.01f);
|
||||||
|
updateRole("backup", forwardSpeed < -0.01f);
|
||||||
bool isTurning = std::abs(rightTurningSpeed) > 0.5f;
|
bool isTurning = std::abs(rightTurningSpeed) > 0.5f;
|
||||||
updateRole("rightTurn", isTurning && (rightTurningSpeed > 0));
|
updateRole("rightTurn", isTurning && (rightTurningSpeed > 0));
|
||||||
updateRole("leftTurn", isTurning && (rightTurningSpeed < 0));
|
updateRole("leftTurn", isTurning && (rightTurningSpeed < 0));
|
||||||
bool isStrafing = std::abs(rightLateralSpeed) > 0.01f;
|
bool isStrafing = !isTurning && (std::abs(rightLateralSpeed) > 0.01f);
|
||||||
updateRole("rightStrafe", isStrafing && (rightLateralSpeed > 0.0f));
|
updateRole("rightStrafe", isStrafing && (rightLateralSpeed > 0.0f));
|
||||||
updateRole("leftStrafe", isStrafing && (rightLateralSpeed < 0.0f));
|
updateRole("leftStrafe", isStrafing && (rightLateralSpeed < 0.0f));
|
||||||
updateRole("idle", !isMoving); // Must be last, as it makes isMoving bogus.
|
updateRole("idle", !isMoving); // Must be last, as it makes isMoving bogus.
|
||||||
|
|
|
@ -80,32 +80,34 @@ void OpenGLDisplayPlugin::deactivate() {
|
||||||
// Pass input events on to the application
|
// Pass input events on to the application
|
||||||
bool OpenGLDisplayPlugin::eventFilter(QObject* receiver, QEvent* event) {
|
bool OpenGLDisplayPlugin::eventFilter(QObject* receiver, QEvent* event) {
|
||||||
switch (event->type()) {
|
switch (event->type()) {
|
||||||
case QEvent::MouseButtonPress:
|
case QEvent::MouseButtonPress:
|
||||||
case QEvent::MouseButtonRelease:
|
case QEvent::MouseButtonRelease:
|
||||||
case QEvent::MouseButtonDblClick:
|
case QEvent::MouseButtonDblClick:
|
||||||
case QEvent::MouseMove:
|
case QEvent::MouseMove:
|
||||||
case QEvent::Wheel:
|
case QEvent::Wheel:
|
||||||
|
|
||||||
case QEvent::TouchBegin:
|
case QEvent::TouchBegin:
|
||||||
case QEvent::TouchEnd:
|
case QEvent::TouchEnd:
|
||||||
case QEvent::TouchUpdate:
|
case QEvent::TouchUpdate:
|
||||||
|
|
||||||
case QEvent::FocusIn:
|
case QEvent::FocusIn:
|
||||||
case QEvent::FocusOut:
|
case QEvent::FocusOut:
|
||||||
|
|
||||||
case QEvent::KeyPress:
|
case QEvent::KeyPress:
|
||||||
case QEvent::KeyRelease:
|
case QEvent::KeyRelease:
|
||||||
case QEvent::ShortcutOverride:
|
case QEvent::ShortcutOverride:
|
||||||
|
|
||||||
case QEvent::DragEnter:
|
case QEvent::DragEnter:
|
||||||
case QEvent::Drop:
|
case QEvent::Drop:
|
||||||
|
|
||||||
case QEvent::Resize:
|
case QEvent::Resize:
|
||||||
if (QCoreApplication::sendEvent(QCoreApplication::instance(), event)) {
|
if (QCoreApplication::sendEvent(QCoreApplication::instance(), event)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,4 +143,4 @@ bool OpenGLDisplayPlugin::isVsyncEnabled() {
|
||||||
#else
|
#else
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,20 +51,22 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
||||||
ovrHmd _hmd;
|
|
||||||
float _ipd{ OVR_DEFAULT_IPD };
|
|
||||||
unsigned int _frameIndex;
|
|
||||||
ovrEyeRenderDesc _eyeRenderDescs[2];
|
|
||||||
ovrPosef _eyePoses[2];
|
ovrPosef _eyePoses[2];
|
||||||
ovrVector3f _eyeOffsets[2];
|
|
||||||
ovrFovPort _eyeFovs[2];
|
|
||||||
mat4 _eyeProjections[3];
|
mat4 _eyeProjections[3];
|
||||||
mat4 _compositeEyeProjections[2];
|
mat4 _compositeEyeProjections[2];
|
||||||
uvec2 _desiredFramebufferSize;
|
uvec2 _desiredFramebufferSize;
|
||||||
ovrTrackingState _trackingState;
|
ovrTrackingState _trackingState;
|
||||||
|
|
||||||
#if (OVR_MAJOR_VERSION >= 6)
|
#if (OVR_MAJOR_VERSION >= 6)
|
||||||
|
ovrHmd _hmd;
|
||||||
|
float _ipd{ OVR_DEFAULT_IPD };
|
||||||
|
unsigned int _frameIndex;
|
||||||
|
ovrEyeRenderDesc _eyeRenderDescs[2];
|
||||||
|
ovrVector3f _eyeOffsets[2];
|
||||||
|
ovrFovPort _eyeFovs[2];
|
||||||
|
|
||||||
ovrLayerEyeFov& getSceneLayer();
|
ovrLayerEyeFov& getSceneLayer();
|
||||||
ovrHmdDesc _hmdDesc;
|
ovrHmdDesc _hmdDesc;
|
||||||
SwapFboPtr _sceneFbo;
|
SwapFboPtr _sceneFbo;
|
||||||
|
|
|
@ -34,7 +34,7 @@ const QString & OculusLegacyDisplayPlugin::getName() const {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
OculusLegacyDisplayPlugin::OculusLegacyDisplayPlugin() : _ipd(OVR_DEFAULT_IPD) {
|
OculusLegacyDisplayPlugin::OculusLegacyDisplayPlugin() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uvec2 OculusLegacyDisplayPlugin::getRecommendedRenderSize() const {
|
uvec2 OculusLegacyDisplayPlugin::getRecommendedRenderSize() const {
|
||||||
|
|
|
@ -44,7 +44,6 @@ protected:
|
||||||
private:
|
private:
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
||||||
float _ipd{ OVR_DEFAULT_IPD };
|
|
||||||
ovrHmd _hmd;
|
ovrHmd _hmd;
|
||||||
unsigned int _frameIndex;
|
unsigned int _frameIndex;
|
||||||
ovrTrackingState _trackingState;
|
ovrTrackingState _trackingState;
|
||||||
|
|
|
@ -78,7 +78,7 @@ void StereoDisplayPlugin::activate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StereoDisplayPlugin::updateScreen() {
|
void StereoDisplayPlugin::updateScreen() {
|
||||||
for (int i = 0; i < _screenActions.size(); ++i) {
|
for (int i = 0; i < (int) _screenActions.size(); ++i) {
|
||||||
if (_screenActions[i]->isChecked()) {
|
if (_screenActions[i]->isChecked()) {
|
||||||
CONTAINER->setFullscreen(qApp->screens().at(i));
|
CONTAINER->setFullscreen(qApp->screens().at(i));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -30,6 +30,7 @@ void HTTPSManager::incomingConnection(qintptr socketDescriptor) {
|
||||||
|
|
||||||
sslSocket->setLocalCertificate(_certificate);
|
sslSocket->setLocalCertificate(_certificate);
|
||||||
sslSocket->setPrivateKey(_privateKey);
|
sslSocket->setPrivateKey(_privateKey);
|
||||||
|
sslSocket->setPeerVerifyMode(QSslSocket::VerifyNone);
|
||||||
|
|
||||||
if (sslSocket->setSocketDescriptor(socketDescriptor)) {
|
if (sslSocket->setSocketDescriptor(socketDescriptor)) {
|
||||||
new HTTPSConnection(sslSocket, this);
|
new HTTPSConnection(sslSocket, this);
|
||||||
|
@ -48,4 +49,4 @@ bool HTTPSManager::handleHTTPSRequest(HTTPSConnection* connection, const QUrl& u
|
||||||
|
|
||||||
bool HTTPSManager::requestHandledByRequestHandler(HTTPConnection* connection, const QUrl& url) {
|
bool HTTPSManager::requestHandledByRequestHandler(HTTPConnection* connection, const QUrl& url) {
|
||||||
return _sslRequestHandler && _sslRequestHandler->handleHTTPSRequest(reinterpret_cast<HTTPSConnection*>(connection), url);
|
return _sslRequestHandler && _sslRequestHandler->handleHTTPSRequest(reinterpret_cast<HTTPSConnection*>(connection), url);
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,7 +247,6 @@ void RenderableParticleEffectEntityItem::updateRenderItem() {
|
||||||
glm::vec3 pos = _transform.getTranslation();
|
glm::vec3 pos = _transform.getTranslation();
|
||||||
Transform t;
|
Transform t;
|
||||||
t.setRotation(rot);
|
t.setRotation(rot);
|
||||||
t.setTranslation(pos);
|
|
||||||
payload.setModelTransform(t);
|
payload.setModelTransform(t);
|
||||||
|
|
||||||
// transform _particleMinBound and _particleMaxBound corners into world coords
|
// transform _particleMinBound and _particleMaxBound corners into world coords
|
||||||
|
@ -285,7 +284,7 @@ void RenderableParticleEffectEntityItem::updateRenderItem() {
|
||||||
payload.setPipeline(_untexturedPipeline);
|
payload.setPipeline(_untexturedPipeline);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
_scene->enqueuePendingChanges(pendingChanges);
|
_scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,7 +294,7 @@ void RenderableParticleEffectEntityItem::createPipelines() {
|
||||||
state->setCullMode(gpu::State::CULL_BACK);
|
state->setCullMode(gpu::State::CULL_BACK);
|
||||||
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
state->setDepthTest(true, true, gpu::LESS_EQUAL);
|
||||||
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD,
|
state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD,
|
||||||
gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA,
|
gpu::State::ONE, gpu::State::FACTOR_ALPHA,
|
||||||
gpu::State::BLEND_OP_ADD, gpu::State::ONE);
|
gpu::State::BLEND_OP_ADD, gpu::State::ONE);
|
||||||
auto vertShader = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(untextured_particle_vert)));
|
auto vertShader = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(untextured_particle_vert)));
|
||||||
auto fragShader = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(untextured_particle_frag)));
|
auto fragShader = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(untextured_particle_frag)));
|
||||||
|
|
|
@ -610,6 +610,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
const QUuid& myNodeID = nodeList->getSessionUUID();
|
const QUuid& myNodeID = nodeList->getSessionUUID();
|
||||||
bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID);
|
bool weOwnSimulation = _simulationOwner.matchesValidID(myNodeID);
|
||||||
|
|
||||||
|
|
||||||
if (args.bitstreamVersion >= VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE) {
|
if (args.bitstreamVersion >= VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE) {
|
||||||
// pack SimulationOwner and terse update properties near each other
|
// pack SimulationOwner and terse update properties near each other
|
||||||
|
|
|
@ -84,9 +84,10 @@ CONSTRUCT_PROPERTY(shapeType, SHAPE_TYPE_NONE),
|
||||||
CONSTRUCT_PROPERTY(maxParticles, ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES),
|
CONSTRUCT_PROPERTY(maxParticles, ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES),
|
||||||
CONSTRUCT_PROPERTY(lifespan, ParticleEffectEntityItem::DEFAULT_LIFESPAN),
|
CONSTRUCT_PROPERTY(lifespan, ParticleEffectEntityItem::DEFAULT_LIFESPAN),
|
||||||
CONSTRUCT_PROPERTY(emitRate, ParticleEffectEntityItem::DEFAULT_EMIT_RATE),
|
CONSTRUCT_PROPERTY(emitRate, ParticleEffectEntityItem::DEFAULT_EMIT_RATE),
|
||||||
CONSTRUCT_PROPERTY(emitDirection, ParticleEffectEntityItem::DEFAULT_EMIT_DIRECTION),
|
CONSTRUCT_PROPERTY(emitVelocity, ParticleEffectEntityItem::DEFAULT_EMIT_VELOCITY),
|
||||||
CONSTRUCT_PROPERTY(emitStrength, ParticleEffectEntityItem::DEFAULT_EMIT_STRENGTH),
|
CONSTRUCT_PROPERTY(velocitySpread, ParticleEffectEntityItem::DEFAULT_VELOCITY_SPREAD),
|
||||||
CONSTRUCT_PROPERTY(localGravity, ParticleEffectEntityItem::DEFAULT_LOCAL_GRAVITY),
|
CONSTRUCT_PROPERTY(emitAcceleration, ParticleEffectEntityItem::DEFAULT_EMIT_ACCELERATION),
|
||||||
|
CONSTRUCT_PROPERTY(accelerationSpread, ParticleEffectEntityItem::DEFAULT_ACCELERATION_SPREAD),
|
||||||
CONSTRUCT_PROPERTY(particleRadius, ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS),
|
CONSTRUCT_PROPERTY(particleRadius, ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS),
|
||||||
CONSTRUCT_PROPERTY(marketplaceID, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID),
|
CONSTRUCT_PROPERTY(marketplaceID, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID),
|
||||||
CONSTRUCT_PROPERTY(keyLightColor, ZoneEntityItem::DEFAULT_KEYLIGHT_COLOR),
|
CONSTRUCT_PROPERTY(keyLightColor, ZoneEntityItem::DEFAULT_KEYLIGHT_COLOR),
|
||||||
|
@ -349,9 +350,10 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
|
||||||
CHECK_PROPERTY_CHANGE(PROP_MAX_PARTICLES, maxParticles);
|
CHECK_PROPERTY_CHANGE(PROP_MAX_PARTICLES, maxParticles);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_LIFESPAN, lifespan);
|
CHECK_PROPERTY_CHANGE(PROP_LIFESPAN, lifespan);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_EMIT_RATE, emitRate);
|
CHECK_PROPERTY_CHANGE(PROP_EMIT_RATE, emitRate);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_EMIT_DIRECTION, emitDirection);
|
CHECK_PROPERTY_CHANGE(PROP_EMIT_VELOCITY, emitVelocity);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_EMIT_STRENGTH, emitStrength);
|
CHECK_PROPERTY_CHANGE(PROP_VELOCITY_SPREAD, velocitySpread);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_LOCAL_GRAVITY, localGravity);
|
CHECK_PROPERTY_CHANGE(PROP_EMIT_ACCELERATION, emitAcceleration);
|
||||||
|
CHECK_PROPERTY_CHANGE(PROP_ACCELERATION_SPREAD, accelerationSpread);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_PARTICLE_RADIUS, particleRadius);
|
CHECK_PROPERTY_CHANGE(PROP_PARTICLE_RADIUS, particleRadius);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID);
|
CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_NAME, name);
|
CHECK_PROPERTY_CHANGE(PROP_NAME, name);
|
||||||
|
@ -451,9 +453,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(maxParticles);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(maxParticles);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(lifespan);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(lifespan);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(emitRate);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(emitRate);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(emitDirection);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(emitVelocity);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(emitStrength);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(velocitySpread);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(localGravity);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(emitAcceleration);
|
||||||
|
COPY_PROPERTY_TO_QSCRIPTVALUE(accelerationSpread);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(particleRadius);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(particleRadius);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(marketplaceID);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(marketplaceID);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(name);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(name);
|
||||||
|
@ -571,9 +574,10 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, float, setMaxParticles);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, float, setMaxParticles);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRate, float, setEmitRate);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRate, float, setEmitRate);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDirection, glmVec3, setEmitDirection);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitVelocity, glmVec3, setEmitVelocity);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitStrength, float, setEmitStrength);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(velocitySpread, glmVec3, setVelocitySpread);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(localGravity, float, setLocalGravity);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, glmVec3, setEmitAcceleration);
|
||||||
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, glmVec3, setAccelerationSpread);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName);
|
||||||
|
@ -812,10 +816,12 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent
|
||||||
APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles());
|
APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan());
|
APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, properties.getEmitRate());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, properties.getEmitRate());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_DIRECTION, properties.getEmitDirection());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_VELOCITY, properties.getEmitVelocity());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_STRENGTH, properties.getEmitStrength());
|
APPEND_ENTITY_PROPERTY(PROP_VELOCITY_SPREAD, properties.getVelocitySpread());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_LOCAL_GRAVITY, properties.getLocalGravity());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, properties.getEmitAcceleration());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, properties.getAccelerationSpread());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, properties.getParticleRadius());
|
APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, properties.getParticleRadius());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (properties.getType() == EntityTypes::Zone) {
|
if (properties.getType() == EntityTypes::Zone) {
|
||||||
|
@ -1080,9 +1086,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_DIRECTION, glm::vec3, setEmitDirection);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_VELOCITY, glm::vec3, setEmitVelocity);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_STRENGTH, float, setEmitStrength);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY_SPREAD, glm::vec3, setVelocitySpread);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LOCAL_GRAVITY, float, setLocalGravity);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_ACCELERATION, glm::vec3, setEmitAcceleration);
|
||||||
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION_SPREAD, glm::vec3, setAccelerationSpread);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1211,9 +1218,10 @@ void EntityItemProperties::markAllChanged() {
|
||||||
_maxParticlesChanged = true;
|
_maxParticlesChanged = true;
|
||||||
_lifespanChanged = true;
|
_lifespanChanged = true;
|
||||||
_emitRateChanged = true;
|
_emitRateChanged = true;
|
||||||
_emitDirectionChanged = true;
|
_emitVelocityChanged = true;
|
||||||
_emitStrengthChanged = true;
|
_velocitySpreadChanged = true;
|
||||||
_localGravityChanged = true;
|
_emitAccelerationChanged = true;
|
||||||
|
_accelerationSpreadChanged = true;
|
||||||
_particleRadiusChanged = true;
|
_particleRadiusChanged = true;
|
||||||
|
|
||||||
_marketplaceIDChanged = true;
|
_marketplaceIDChanged = true;
|
||||||
|
|
|
@ -131,9 +131,10 @@ public:
|
||||||
DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32);
|
DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32);
|
||||||
DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float);
|
DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float);
|
||||||
DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float);
|
DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float);
|
||||||
DEFINE_PROPERTY_REF(PROP_EMIT_DIRECTION, EmitDirection, emitDirection, glm::vec3);
|
DEFINE_PROPERTY_REF(PROP_EMIT_VELOCITY, EmitVelocity, emitVelocity, glm::vec3);
|
||||||
DEFINE_PROPERTY(PROP_EMIT_STRENGTH, EmitStrength, emitStrength, float);
|
DEFINE_PROPERTY_REF(PROP_VELOCITY_SPREAD, VelocitySpread, velocitySpread, glm::vec3);
|
||||||
DEFINE_PROPERTY(PROP_LOCAL_GRAVITY, LocalGravity, localGravity, float);
|
DEFINE_PROPERTY(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3);
|
||||||
|
DEFINE_PROPERTY(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3);
|
||||||
DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float);
|
DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float);
|
||||||
DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString);
|
DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString);
|
||||||
DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor);
|
DEFINE_PROPERTY_REF(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor);
|
||||||
|
@ -311,9 +312,9 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) {
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, MaxParticles, maxParticles, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, MaxParticles, maxParticles, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifespan, lifespan, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifespan, lifespan, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitRate, emitRate, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitRate, emitRate, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitDirection, emitDirection, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitVelocity, emitVelocity, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitStrength, emitStrength, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitAcceleration, emitAcceleration, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalGravity, localGravity, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, AccelerationSpread, accelerationSpread, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, "");
|
||||||
DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, "");
|
DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, "");
|
||||||
|
|
|
@ -96,9 +96,9 @@ enum EntityPropertyList {
|
||||||
PROP_MAX_PARTICLES,
|
PROP_MAX_PARTICLES,
|
||||||
PROP_LIFESPAN,
|
PROP_LIFESPAN,
|
||||||
PROP_EMIT_RATE,
|
PROP_EMIT_RATE,
|
||||||
PROP_EMIT_DIRECTION,
|
PROP_EMIT_VELOCITY,
|
||||||
PROP_EMIT_STRENGTH,
|
PROP_EMIT_STRENGTH,
|
||||||
PROP_LOCAL_GRAVITY,
|
PROP_EMIT_ACCELERATION,
|
||||||
PROP_PARTICLE_RADIUS,
|
PROP_PARTICLE_RADIUS,
|
||||||
|
|
||||||
PROP_COMPOUND_SHAPE_URL, // used by Model + zones entities
|
PROP_COMPOUND_SHAPE_URL, // used by Model + zones entities
|
||||||
|
@ -134,7 +134,10 @@ enum EntityPropertyList {
|
||||||
// Used by PolyLine entity
|
// Used by PolyLine entity
|
||||||
PROP_NORMALS,
|
PROP_NORMALS,
|
||||||
PROP_STROKE_WIDTHS,
|
PROP_STROKE_WIDTHS,
|
||||||
|
|
||||||
|
// used by particles
|
||||||
|
PROP_VELOCITY_SPREAD,
|
||||||
|
PROP_ACCELERATION_SPREAD,
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// ATTENTION: add new properties to end of list just ABOVE this line
|
// ATTENTION: add new properties to end of list just ABOVE this line
|
||||||
|
@ -168,9 +171,9 @@ enum EntityPropertyList {
|
||||||
PROP_ATMOSPHERE_CENTER = PROP_MAX_PARTICLES,
|
PROP_ATMOSPHERE_CENTER = PROP_MAX_PARTICLES,
|
||||||
PROP_ATMOSPHERE_INNER_RADIUS = PROP_LIFESPAN,
|
PROP_ATMOSPHERE_INNER_RADIUS = PROP_LIFESPAN,
|
||||||
PROP_ATMOSPHERE_OUTER_RADIUS = PROP_EMIT_RATE,
|
PROP_ATMOSPHERE_OUTER_RADIUS = PROP_EMIT_RATE,
|
||||||
PROP_ATMOSPHERE_MIE_SCATTERING = PROP_EMIT_DIRECTION,
|
PROP_ATMOSPHERE_MIE_SCATTERING = PROP_EMIT_VELOCITY,
|
||||||
PROP_ATMOSPHERE_RAYLEIGH_SCATTERING = PROP_EMIT_STRENGTH,
|
PROP_ATMOSPHERE_RAYLEIGH_SCATTERING = PROP_EMIT_STRENGTH,
|
||||||
PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS = PROP_LOCAL_GRAVITY,
|
PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS = PROP_EMIT_ACCELERATION,
|
||||||
PROP_ATMOSPHERE_HAS_STARS = PROP_PARTICLE_RADIUS,
|
PROP_ATMOSPHERE_HAS_STARS = PROP_PARTICLE_RADIUS,
|
||||||
PROP_BACKGROUND_MODE = PROP_MODEL_URL,
|
PROP_BACKGROUND_MODE = PROP_MODEL_URL,
|
||||||
PROP_SKYBOX_COLOR = PROP_ANIMATION_URL,
|
PROP_SKYBOX_COLOR = PROP_ANIMATION_URL,
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
// - Just to get this out the door, I just did forward Euler integration. There are better ways.
|
// - Just to get this out the door, I just did forward Euler integration. There are better ways.
|
||||||
// - Gravity always points along the Y axis. Support an actual gravity vector.
|
// - Gravity always points along the Y axis. Support an actual gravity vector.
|
||||||
// - Add the ability to add arbitrary forces to the simulation.
|
// - Add the ability to add arbitrary forces to the simulation.
|
||||||
// - Add controls for spread (which is currently hard-coded) and varying emission strength (not currently implemented).
|
|
||||||
// - Add drag.
|
// - Add drag.
|
||||||
// - Add some kind of support for collisions.
|
// - Add some kind of support for collisions.
|
||||||
// - There's no synchronization of the simulation across clients at all. In fact, it's using rand() under the hood, so
|
// - There's no synchronization of the simulation across clients at all. In fact, it's using rand() under the hood, so
|
||||||
|
@ -50,9 +49,10 @@ const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FPS = 30.0f;
|
||||||
const quint32 ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES = 1000;
|
const quint32 ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES = 1000;
|
||||||
const float ParticleEffectEntityItem::DEFAULT_LIFESPAN = 3.0f;
|
const float ParticleEffectEntityItem::DEFAULT_LIFESPAN = 3.0f;
|
||||||
const float ParticleEffectEntityItem::DEFAULT_EMIT_RATE = 15.0f;
|
const float ParticleEffectEntityItem::DEFAULT_EMIT_RATE = 15.0f;
|
||||||
const glm::vec3 ParticleEffectEntityItem::DEFAULT_EMIT_DIRECTION(0.0f, 1.0f, 0.0f);
|
const glm::vec3 ParticleEffectEntityItem::DEFAULT_EMIT_VELOCITY(0.0f, 5.0f, 0.0f);
|
||||||
const float ParticleEffectEntityItem::DEFAULT_EMIT_STRENGTH = 25.0f;
|
const glm::vec3 ParticleEffectEntityItem::DEFAULT_VELOCITY_SPREAD(3.0f, 0.0f, 3.0f);
|
||||||
const float ParticleEffectEntityItem::DEFAULT_LOCAL_GRAVITY = -9.8f;
|
const glm::vec3 ParticleEffectEntityItem::DEFAULT_EMIT_ACCELERATION(0.0f, -9.8f, 0.0f);
|
||||||
|
const glm::vec3 ParticleEffectEntityItem::DEFAULT_ACCELERATION_SPREAD(0.0f, 0.0f, 0.0f);
|
||||||
const float ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS = 0.025f;
|
const float ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS = 0.025f;
|
||||||
const QString ParticleEffectEntityItem::DEFAULT_TEXTURES = "";
|
const QString ParticleEffectEntityItem::DEFAULT_TEXTURES = "";
|
||||||
|
|
||||||
|
@ -67,9 +67,10 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte
|
||||||
_maxParticles(DEFAULT_MAX_PARTICLES),
|
_maxParticles(DEFAULT_MAX_PARTICLES),
|
||||||
_lifespan(DEFAULT_LIFESPAN),
|
_lifespan(DEFAULT_LIFESPAN),
|
||||||
_emitRate(DEFAULT_EMIT_RATE),
|
_emitRate(DEFAULT_EMIT_RATE),
|
||||||
_emitDirection(DEFAULT_EMIT_DIRECTION),
|
_emitVelocity(DEFAULT_EMIT_VELOCITY),
|
||||||
_emitStrength(DEFAULT_EMIT_STRENGTH),
|
_velocitySpread(DEFAULT_VELOCITY_SPREAD),
|
||||||
_localGravity(DEFAULT_LOCAL_GRAVITY),
|
_emitAcceleration(DEFAULT_EMIT_ACCELERATION),
|
||||||
|
_accelerationSpread(DEFAULT_ACCELERATION_SPREAD),
|
||||||
_particleRadius(DEFAULT_PARTICLE_RADIUS),
|
_particleRadius(DEFAULT_PARTICLE_RADIUS),
|
||||||
_lastAnimated(usecTimestampNow()),
|
_lastAnimated(usecTimestampNow()),
|
||||||
_animationLoop(),
|
_animationLoop(),
|
||||||
|
@ -80,6 +81,7 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte
|
||||||
_particleLifetimes(DEFAULT_MAX_PARTICLES, 0.0f),
|
_particleLifetimes(DEFAULT_MAX_PARTICLES, 0.0f),
|
||||||
_particlePositions(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)),
|
_particlePositions(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)),
|
||||||
_particleVelocities(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)),
|
_particleVelocities(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)),
|
||||||
|
_particleAccelerations(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)),
|
||||||
_timeUntilNextEmit(0.0f),
|
_timeUntilNextEmit(0.0f),
|
||||||
_particleHeadIndex(0),
|
_particleHeadIndex(0),
|
||||||
_particleTailIndex(0),
|
_particleTailIndex(0),
|
||||||
|
@ -94,75 +96,59 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte
|
||||||
ParticleEffectEntityItem::~ParticleEffectEntityItem() {
|
ParticleEffectEntityItem::~ParticleEffectEntityItem() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setDimensions(const glm::vec3& value) {
|
|
||||||
computeAndUpdateDimensions();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setLifespan(float lifespan) {
|
void ParticleEffectEntityItem::setLifespan(float lifespan) {
|
||||||
_lifespan = lifespan;
|
_lifespan = lifespan;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParticleEffectEntityItem::setEmitVelocity(const glm::vec3& emitVelocity) {
|
||||||
|
_emitVelocity = emitVelocity;
|
||||||
computeAndUpdateDimensions();
|
computeAndUpdateDimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setEmitDirection(glm::vec3 emitDirection) {
|
void ParticleEffectEntityItem::setVelocitySpread(const glm::vec3& velocitySpread) {
|
||||||
_emitDirection = glm::normalize(emitDirection);
|
_velocitySpread = velocitySpread;
|
||||||
computeAndUpdateDimensions();
|
computeAndUpdateDimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setEmitStrength(float emitStrength) {
|
|
||||||
_emitStrength = emitStrength;
|
void ParticleEffectEntityItem::setEmitAcceleration(const glm::vec3& emitAcceleration) {
|
||||||
|
_emitAcceleration = emitAcceleration;
|
||||||
computeAndUpdateDimensions();
|
computeAndUpdateDimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setLocalGravity(float localGravity) {
|
void ParticleEffectEntityItem::setAccelerationSpread(const glm::vec3& accelerationSpread){
|
||||||
_localGravity = localGravity;
|
_accelerationSpread = accelerationSpread;
|
||||||
computeAndUpdateDimensions();
|
computeAndUpdateDimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::setParticleRadius(float particleRadius) {
|
void ParticleEffectEntityItem::setParticleRadius(float particleRadius) {
|
||||||
_particleRadius = particleRadius;
|
_particleRadius = particleRadius;
|
||||||
computeAndUpdateDimensions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::computeAndUpdateDimensions() {
|
void ParticleEffectEntityItem::computeAndUpdateDimensions() {
|
||||||
|
const float time = _lifespan * 1.1f; // add 10% extra time to account for incremental timer accumulation error
|
||||||
const float t = _lifespan * 1.1f; // add 10% extra time, to account for incremental timer accumulation error.
|
|
||||||
const float MAX_RANDOM_FACTOR = (0.5f * 0.25f);
|
float maxVelocityX = fabsf(_velocity.x) + _velocitySpread.x;
|
||||||
const float maxOffset = (MAX_RANDOM_FACTOR * _emitStrength) + _particleRadius;
|
float maxAccelerationX = fabsf(_acceleration.x) + _accelerationSpread.x;
|
||||||
|
float maxXDistance = (maxVelocityX * time) + (0.5 * maxAccelerationX * time * time);
|
||||||
// bounds for x and z is easy to compute because there is no at^2 term.
|
|
||||||
float xMax = (_emitDirection.x * _emitStrength + maxOffset) * t;
|
float maxVelocityY = fabs(_velocity.y) + _velocitySpread.y;
|
||||||
float xMin = (_emitDirection.x * _emitStrength - maxOffset) * t;
|
float maxAccelerationY = fabsf(_acceleration.y) + _accelerationSpread.y;
|
||||||
|
float maxYDistance = (maxVelocityY * time) + (0.5 * maxAccelerationY * time * time);
|
||||||
float zMax = (_emitDirection.z * _emitStrength + maxOffset) * t;
|
|
||||||
float zMin = (_emitDirection.z * _emitStrength - maxOffset) * t;
|
float maxVelocityZ = fabsf(_velocity.z) + _velocitySpread.z;
|
||||||
|
float maxAccelerationZ = fabsf(_acceleration.z) + _accelerationSpread.z;
|
||||||
// yEnd is where the particle will end.
|
float maxZDistance = (maxVelocityZ * time) + (0.5 * maxAccelerationZ * time * time);
|
||||||
float a = _localGravity;
|
|
||||||
float atSquared = a * t * t;
|
float maxDistance = std::max(maxXDistance, std::max(maxYDistance, maxZDistance));
|
||||||
float v = _emitDirection.y * _emitStrength + maxOffset;
|
|
||||||
float vt = v * t;
|
//times 2 because dimensions are diameters not radii
|
||||||
float yEnd = 0.5f * atSquared + vt;
|
glm::vec3 dims(2.0 * maxDistance);
|
||||||
|
|
||||||
// yApex is where the particle is at it's apex.
|
|
||||||
float yApexT = (-v / a);
|
|
||||||
float yApex = 0.0f;
|
|
||||||
|
|
||||||
// only set apex if it's within the lifespan of the particle.
|
|
||||||
if (yApexT >= 0.0f && yApexT <= t) {
|
|
||||||
yApex = -(v * v) / (2.0f * a);
|
|
||||||
}
|
|
||||||
|
|
||||||
float yMax = std::max(yApex, yEnd);
|
|
||||||
float yMin = std::min(yApex, yEnd);
|
|
||||||
|
|
||||||
// times 2 because dimensions are diameters not radii.
|
|
||||||
glm::vec3 dims(2.0f * std::max(fabsf(xMin), fabsf(xMax)),
|
|
||||||
2.0f * std::max(fabsf(yMin), fabsf(yMax)),
|
|
||||||
2.0f * std::max(fabsf(zMin), fabsf(zMax)));
|
|
||||||
|
|
||||||
EntityItem::setDimensions(dims);
|
EntityItem::setDimensions(dims);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EntityItemProperties ParticleEffectEntityItem::getProperties() const {
|
EntityItemProperties ParticleEffectEntityItem::getProperties() const {
|
||||||
EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class
|
EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class
|
||||||
|
|
||||||
|
@ -176,9 +162,9 @@ EntityItemProperties ParticleEffectEntityItem::getProperties() const {
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitRate, getEmitRate);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitRate, getEmitRate);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitDirection, getEmitDirection);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitVelocity, getEmitVelocity);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitStrength, getEmitStrength);
|
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(localGravity, getLocalGravity);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitAcceleration, getEmitAcceleration);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(particleRadius, getParticleRadius);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(particleRadius, getParticleRadius);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures);
|
||||||
|
|
||||||
|
@ -198,11 +184,12 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitRate, setEmitRate);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitRate, setEmitRate);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitDirection, setEmitDirection);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitVelocity, setEmitVelocity);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitStrength, setEmitStrength);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitAcceleration, setEmitAcceleration);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(localGravity, setLocalGravity);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(accelerationSpread, setAccelerationSpread);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(particleRadius, setParticleRadius);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(particleRadius, setParticleRadius);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures);
|
||||||
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocitySpread, setVelocitySpread);
|
||||||
|
|
||||||
if (somethingChanged) {
|
if (somethingChanged) {
|
||||||
bool wantDebug = false;
|
bool wantDebug = false;
|
||||||
|
@ -247,17 +234,28 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch
|
||||||
if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) {
|
if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) {
|
||||||
setAnimationFrameIndex(animationFrameIndex);
|
setAnimationFrameIndex(animationFrameIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings);
|
READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings);
|
||||||
READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType);
|
READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType);
|
||||||
READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles);
|
READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles);
|
||||||
READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan);
|
READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan);
|
||||||
READ_ENTITY_PROPERTY(PROP_EMIT_RATE, float, setEmitRate);
|
READ_ENTITY_PROPERTY(PROP_EMIT_RATE, float, setEmitRate);
|
||||||
READ_ENTITY_PROPERTY(PROP_EMIT_DIRECTION, glm::vec3, setEmitDirection);
|
READ_ENTITY_PROPERTY(PROP_EMIT_VELOCITY, glm::vec3, setEmitVelocity);
|
||||||
READ_ENTITY_PROPERTY(PROP_EMIT_STRENGTH, float, setEmitStrength);
|
|
||||||
READ_ENTITY_PROPERTY(PROP_LOCAL_GRAVITY, float, setLocalGravity);
|
if (args.bitstreamVersion >= VERSION_ENTITIES_PARTICLE_MODIFICATIONS) {
|
||||||
READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
READ_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, glm::vec3, setEmitAcceleration);
|
||||||
READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
|
READ_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, glm::vec3, setAccelerationSpread);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_VELOCITY_SPREAD, glm::vec3, setVelocitySpread);
|
||||||
|
} else {
|
||||||
|
// EMIT_STRENGTH FAKEOUT
|
||||||
|
READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
||||||
|
// LOCAL_GRAVITY FAKEOUT
|
||||||
|
READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
||||||
|
// ACTUALLY PARTICLE RADIUS
|
||||||
|
READ_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, float, setParticleRadius);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
|
||||||
|
}
|
||||||
|
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
@ -276,11 +274,12 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea
|
||||||
requestedProperties += PROP_MAX_PARTICLES;
|
requestedProperties += PROP_MAX_PARTICLES;
|
||||||
requestedProperties += PROP_LIFESPAN;
|
requestedProperties += PROP_LIFESPAN;
|
||||||
requestedProperties += PROP_EMIT_RATE;
|
requestedProperties += PROP_EMIT_RATE;
|
||||||
requestedProperties += PROP_EMIT_DIRECTION;
|
requestedProperties += PROP_EMIT_VELOCITY;
|
||||||
requestedProperties += PROP_EMIT_STRENGTH;
|
requestedProperties += PROP_EMIT_ACCELERATION;
|
||||||
requestedProperties += PROP_LOCAL_GRAVITY;
|
requestedProperties += PROP_ACCELERATION_SPREAD;
|
||||||
requestedProperties += PROP_PARTICLE_RADIUS;
|
requestedProperties += PROP_PARTICLE_RADIUS;
|
||||||
requestedProperties += PROP_TEXTURES;
|
requestedProperties += PROP_TEXTURES;
|
||||||
|
requestedProperties += PROP_VELOCITY_SPREAD;
|
||||||
|
|
||||||
return requestedProperties;
|
return requestedProperties;
|
||||||
}
|
}
|
||||||
|
@ -303,11 +302,12 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData,
|
||||||
APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles());
|
APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan());
|
APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_DIRECTION, getEmitDirection());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_VELOCITY, getEmitVelocity());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_EMIT_STRENGTH, getEmitStrength());
|
APPEND_ENTITY_PROPERTY(PROP_EMIT_ACCELERATION, getEmitAcceleration());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_LOCAL_GRAVITY, getLocalGravity());
|
APPEND_ENTITY_PROPERTY(PROP_ACCELERATION_SPREAD, getAccelerationSpread());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, getParticleRadius());
|
APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, getParticleRadius());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
|
APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_VELOCITY_SPREAD, getVelocitySpread());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParticleEffectEntityItem::isAnimatingSomething() const {
|
bool ParticleEffectEntityItem::isAnimatingSomething() const {
|
||||||
|
@ -487,8 +487,9 @@ void ParticleEffectEntityItem::extendBounds(const glm::vec3& point) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleEffectEntityItem::integrateParticle(quint32 index, float deltaTime) {
|
void ParticleEffectEntityItem::integrateParticle(quint32 index, float deltaTime) {
|
||||||
glm::vec3 atSquared(0.0f, 0.5f * _localGravity * deltaTime * deltaTime, 0.0f);
|
glm::vec3 accel = _particleAccelerations[index];
|
||||||
glm::vec3 at(0.0f, _localGravity * deltaTime, 0.0f);
|
glm::vec3 atSquared = (0.5f * deltaTime * deltaTime) * accel;
|
||||||
|
glm::vec3 at = accel * deltaTime;
|
||||||
_particlePositions[index] += _particleVelocities[index] * deltaTime + atSquared;
|
_particlePositions[index] += _particleVelocities[index] * deltaTime + atSquared;
|
||||||
_particleVelocities[index] += at;
|
_particleVelocities[index] += at;
|
||||||
}
|
}
|
||||||
|
@ -526,15 +527,22 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) {
|
||||||
quint32 i = _particleTailIndex;
|
quint32 i = _particleTailIndex;
|
||||||
_particleLifetimes[i] = _lifespan;
|
_particleLifetimes[i] = _lifespan;
|
||||||
|
|
||||||
// jitter the _emitDirection by a random offset
|
|
||||||
glm::vec3 randOffset;
|
glm::vec3 spreadOffset;
|
||||||
randOffset.x = (randFloat() - 0.5f) * 0.25f * _emitStrength;
|
spreadOffset.x = -_velocitySpread.x + randFloat() * (_velocitySpread.x * 2.0f);
|
||||||
randOffset.y = (randFloat() - 0.5f) * 0.25f * _emitStrength;
|
spreadOffset.y = -_velocitySpread.y + randFloat() * (_velocitySpread.y * 2.0f);
|
||||||
randOffset.z = (randFloat() - 0.5f) * 0.25f * _emitStrength;
|
spreadOffset.z = -_velocitySpread.z + randFloat() * (_velocitySpread.z * 2.0f);
|
||||||
|
|
||||||
|
|
||||||
// set initial conditions
|
// set initial conditions
|
||||||
_particlePositions[i] = glm::vec3(0.0f, 0.0f, 0.0f);
|
_particlePositions[i] = getPosition();
|
||||||
_particleVelocities[i] = _emitDirection * _emitStrength + randOffset;
|
_particleVelocities[i] = _emitVelocity + spreadOffset;
|
||||||
|
|
||||||
|
spreadOffset.x = -_accelerationSpread.x + randFloat() * (_accelerationSpread.x * 2.0f);
|
||||||
|
spreadOffset.y = -_accelerationSpread.y + randFloat() * (_accelerationSpread.y * 2.0f);
|
||||||
|
spreadOffset.z = -_accelerationSpread.z + randFloat() * (_accelerationSpread.z * 2.0f);
|
||||||
|
|
||||||
|
_particleAccelerations[i] = _emitAcceleration + spreadOffset;
|
||||||
|
|
||||||
integrateParticle(i, timeLeftInFrame);
|
integrateParticle(i, timeLeftInFrame);
|
||||||
extendBounds(_particlePositions[i]);
|
extendBounds(_particlePositions[i]);
|
||||||
|
|
|
@ -86,8 +86,6 @@ public:
|
||||||
void setAnimationLastFrame(float lastFrame) { _animationLoop.setLastFrame(lastFrame); }
|
void setAnimationLastFrame(float lastFrame) { _animationLoop.setLastFrame(lastFrame); }
|
||||||
float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); }
|
float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); }
|
||||||
|
|
||||||
virtual void setDimensions(const glm::vec3& value) override;
|
|
||||||
|
|
||||||
static const quint32 DEFAULT_MAX_PARTICLES;
|
static const quint32 DEFAULT_MAX_PARTICLES;
|
||||||
void setMaxParticles(quint32 maxParticles);
|
void setMaxParticles(quint32 maxParticles);
|
||||||
quint32 getMaxParticles() const { return _maxParticles; }
|
quint32 getMaxParticles() const { return _maxParticles; }
|
||||||
|
@ -100,24 +98,31 @@ public:
|
||||||
void setEmitRate(float emitRate) { _emitRate = emitRate; }
|
void setEmitRate(float emitRate) { _emitRate = emitRate; }
|
||||||
float getEmitRate() const { return _emitRate; }
|
float getEmitRate() const { return _emitRate; }
|
||||||
|
|
||||||
static const glm::vec3 DEFAULT_EMIT_DIRECTION;
|
static const glm::vec3 DEFAULT_EMIT_VELOCITY;
|
||||||
void setEmitDirection(glm::vec3 emitDirection);
|
void setEmitVelocity(const glm::vec3& emitVelocity);
|
||||||
const glm::vec3& getEmitDirection() const { return _emitDirection; }
|
const glm::vec3& getEmitVelocity() const { return _emitVelocity; }
|
||||||
|
|
||||||
|
|
||||||
|
static const glm::vec3 DEFAULT_VELOCITY_SPREAD;
|
||||||
|
void setVelocitySpread(const glm::vec3& velocitySpread);
|
||||||
|
const glm::vec3& getVelocitySpread() const { return _velocitySpread; }
|
||||||
|
|
||||||
static const float DEFAULT_EMIT_STRENGTH;
|
|
||||||
void setEmitStrength(float emitStrength);
|
|
||||||
float getEmitStrength() const { return _emitStrength; }
|
|
||||||
|
|
||||||
static const float DEFAULT_LOCAL_GRAVITY;
|
static const glm::vec3 DEFAULT_EMIT_ACCELERATION;
|
||||||
void setLocalGravity(float localGravity);
|
void setEmitAcceleration(const glm::vec3& emitAcceleration);
|
||||||
float getLocalGravity() const { return _localGravity; }
|
const glm::vec3& getEmitAcceleration() const { return _emitAcceleration; }
|
||||||
|
|
||||||
|
static const glm::vec3 DEFAULT_ACCELERATION_SPREAD;
|
||||||
|
void setAccelerationSpread(const glm::vec3& accelerationSpread);
|
||||||
|
const glm::vec3& getAccelerationSpread() const { return _accelerationSpread; }
|
||||||
|
|
||||||
static const float DEFAULT_PARTICLE_RADIUS;
|
static const float DEFAULT_PARTICLE_RADIUS;
|
||||||
void setParticleRadius(float particleRadius);
|
void setParticleRadius(float particleRadius);
|
||||||
float getParticleRadius() const { return _particleRadius; }
|
float getParticleRadius() const { return _particleRadius; }
|
||||||
|
|
||||||
void computeAndUpdateDimensions();
|
void computeAndUpdateDimensions();
|
||||||
|
|
||||||
|
|
||||||
bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); }
|
bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); }
|
||||||
float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); }
|
float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); }
|
||||||
float getAnimationFPS() const { return _animationLoop.getFPS(); }
|
float getAnimationFPS() const { return _animationLoop.getFPS(); }
|
||||||
|
@ -145,9 +150,10 @@ protected:
|
||||||
quint32 _maxParticles;
|
quint32 _maxParticles;
|
||||||
float _lifespan;
|
float _lifespan;
|
||||||
float _emitRate;
|
float _emitRate;
|
||||||
glm::vec3 _emitDirection;
|
glm::vec3 _emitVelocity;
|
||||||
float _emitStrength;
|
glm::vec3 _velocitySpread;
|
||||||
float _localGravity;
|
glm::vec3 _emitAcceleration;
|
||||||
|
glm::vec3 _accelerationSpread;
|
||||||
float _particleRadius;
|
float _particleRadius;
|
||||||
quint64 _lastAnimated;
|
quint64 _lastAnimated;
|
||||||
AnimationLoop _animationLoop;
|
AnimationLoop _animationLoop;
|
||||||
|
@ -160,6 +166,7 @@ protected:
|
||||||
QVector<float> _particleLifetimes;
|
QVector<float> _particleLifetimes;
|
||||||
QVector<glm::vec3> _particlePositions;
|
QVector<glm::vec3> _particlePositions;
|
||||||
QVector<glm::vec3> _particleVelocities;
|
QVector<glm::vec3> _particleVelocities;
|
||||||
|
QVector<glm::vec3> _particleAccelerations;
|
||||||
float _timeUntilNextEmit;
|
float _timeUntilNextEmit;
|
||||||
|
|
||||||
// particle arrays are a ring buffer, use these indicies
|
// particle arrays are a ring buffer, use these indicies
|
||||||
|
|
|
@ -41,7 +41,6 @@ void GLBackend::do_setViewportTransform(Batch& batch, uint32 paramOffset) {
|
||||||
if (_stereo._pass) {
|
if (_stereo._pass) {
|
||||||
vp.x += vp.z;
|
vp.x += vp.z;
|
||||||
}
|
}
|
||||||
int i = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glViewport(vp.x, vp.y, vp.z, vp.w);
|
glViewport(vp.x, vp.y, vp.z, vp.w);
|
||||||
|
|
|
@ -67,7 +67,7 @@ PacketVersion versionForPacketType(PacketType::Value packetType) {
|
||||||
case EntityAdd:
|
case EntityAdd:
|
||||||
case EntityEdit:
|
case EntityEdit:
|
||||||
case EntityData:
|
case EntityData:
|
||||||
return VERSION_OCTREE_CENTERED_ORIGIN;
|
return VERSION_ENTITIES_PARTICLE_MODIFICATIONS;
|
||||||
case AvatarData:
|
case AvatarData:
|
||||||
return 12;
|
return 12;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -143,5 +143,6 @@ const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35;
|
||||||
const PacketVersion VERSION_POLYVOX_TEXTURES = 36;
|
const PacketVersion VERSION_POLYVOX_TEXTURES = 36;
|
||||||
const PacketVersion VERSION_ENTITIES_POLYLINE = 37;
|
const PacketVersion VERSION_ENTITIES_POLYLINE = 37;
|
||||||
const PacketVersion VERSION_OCTREE_CENTERED_ORIGIN = 38;
|
const PacketVersion VERSION_OCTREE_CENTERED_ORIGIN = 38;
|
||||||
|
const PacketVersion VERSION_ENTITIES_PARTICLE_MODIFICATIONS = 39;
|
||||||
|
|
||||||
#endif // hifi_PacketHeaders_h
|
#endif // hifi_PacketHeaders_h
|
|
@ -65,11 +65,11 @@ void compileProgram(ProgramPtr & result, const std::string& vs, const std::strin
|
||||||
.Compile()
|
.Compile()
|
||||||
);
|
);
|
||||||
result->Link();
|
result->Link();
|
||||||
} catch (ProgramBuildError & err) {
|
} catch (ProgramBuildError& err) {
|
||||||
Q_UNUSED(err);
|
Q_UNUSED(err);
|
||||||
qWarning() << err.Log().c_str();
|
qWarning() << err.Log().c_str();
|
||||||
Q_ASSERT_X(false, "compileProgram", "Failed to build shader program");
|
Q_ASSERT_X(false, "compileProgram", "Failed to build shader program");
|
||||||
qFatal((const char*)err.Message);
|
qFatal("%s", (const char*) err.Message);
|
||||||
result.reset();
|
result.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,16 +16,16 @@
|
||||||
#include "WebSocketClass.h"
|
#include "WebSocketClass.h"
|
||||||
|
|
||||||
WebSocketClass::WebSocketClass(QScriptEngine* engine, QString url) :
|
WebSocketClass::WebSocketClass(QScriptEngine* engine, QString url) :
|
||||||
_engine(engine),
|
_webSocket(new QWebSocket()),
|
||||||
_webSocket(new QWebSocket())
|
_engine(engine)
|
||||||
{
|
{
|
||||||
initialize();
|
initialize();
|
||||||
_webSocket->open(url);
|
_webSocket->open(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
WebSocketClass::WebSocketClass(QScriptEngine* engine, QWebSocket* qWebSocket) :
|
WebSocketClass::WebSocketClass(QScriptEngine* engine, QWebSocket* qWebSocket) :
|
||||||
_engine(engine),
|
_webSocket(qWebSocket),
|
||||||
_webSocket(qWebSocket)
|
_engine(engine)
|
||||||
{
|
{
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#include "WebSocketServerClass.h"
|
#include "WebSocketServerClass.h"
|
||||||
|
|
||||||
WebSocketServerClass::WebSocketServerClass(QScriptEngine* engine, const QString& serverName, const quint16 port) :
|
WebSocketServerClass::WebSocketServerClass(QScriptEngine* engine, const QString& serverName, const quint16 port) :
|
||||||
_engine(engine),
|
_webSocketServer(serverName, QWebSocketServer::SslMode::NonSecureMode),
|
||||||
_webSocketServer(serverName, QWebSocketServer::SslMode::NonSecureMode)
|
_engine(engine)
|
||||||
{
|
{
|
||||||
if (_webSocketServer.listen(QHostAddress::Any, port)) {
|
if (_webSocketServer.listen(QHostAddress::Any, port)) {
|
||||||
connect(&_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServerClass::onNewConnection);
|
connect(&_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServerClass::onNewConnection);
|
||||||
|
|
|
@ -378,8 +378,6 @@ glm::mat4 createMatFromQuatAndPos(const glm::quat& q, const glm::vec3& p) {
|
||||||
|
|
||||||
// cancel out roll and pitch
|
// cancel out roll and pitch
|
||||||
glm::quat cancelOutRollAndPitch(const glm::quat& q) {
|
glm::quat cancelOutRollAndPitch(const glm::quat& q) {
|
||||||
glm::vec3 xAxis = q * glm::vec3(1, 0, 0);
|
|
||||||
glm::vec3 yAxis = q * glm::vec3(0, 1, 0);
|
|
||||||
glm::vec3 zAxis = q * glm::vec3(0, 0, 1);
|
glm::vec3 zAxis = q * glm::vec3(0, 0, 1);
|
||||||
|
|
||||||
// cancel out the roll and pitch
|
// cancel out the roll and pitch
|
||||||
|
@ -393,8 +391,6 @@ glm::quat cancelOutRollAndPitch(const glm::quat& q) {
|
||||||
|
|
||||||
// cancel out roll and pitch
|
// cancel out roll and pitch
|
||||||
glm::mat4 cancelOutRollAndPitch(const glm::mat4& m) {
|
glm::mat4 cancelOutRollAndPitch(const glm::mat4& m) {
|
||||||
glm::vec3 xAxis = glm::vec3(m[0]);
|
|
||||||
glm::vec3 yAxis = glm::vec3(m[1]);
|
|
||||||
glm::vec3 zAxis = glm::vec3(m[2]);
|
glm::vec3 zAxis = glm::vec3(m[2]);
|
||||||
|
|
||||||
// cancel out the roll and pitch
|
// cancel out the roll and pitch
|
||||||
|
|
|
@ -35,9 +35,9 @@ namespace Setting {
|
||||||
settingsManagerThread->quit();
|
settingsManagerThread->quit();
|
||||||
settingsManagerThread->wait();
|
settingsManagerThread->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets up the settings private instance. Should only be run once at startup
|
// Set up application settings. Should only be run once at startup.
|
||||||
void init() {
|
void preInit() {
|
||||||
// read the ApplicationInfo.ini file for Name/Version/Domain information
|
// read the ApplicationInfo.ini file for Name/Version/Domain information
|
||||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
QSettings applicationInfo(PathUtils::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat);
|
QSettings applicationInfo(PathUtils::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat);
|
||||||
|
@ -46,7 +46,19 @@ namespace Setting {
|
||||||
QCoreApplication::setApplicationName(applicationInfo.value("name").toString());
|
QCoreApplication::setApplicationName(applicationInfo.value("name").toString());
|
||||||
QCoreApplication::setOrganizationName(applicationInfo.value("organizationName").toString());
|
QCoreApplication::setOrganizationName(applicationInfo.value("organizationName").toString());
|
||||||
QCoreApplication::setOrganizationDomain(applicationInfo.value("organizationDomain").toString());
|
QCoreApplication::setOrganizationDomain(applicationInfo.value("organizationDomain").toString());
|
||||||
|
|
||||||
|
// Delete Interface.ini.lock file if it exists, otherwise Interface freezes.
|
||||||
|
QSettings settings;
|
||||||
|
QString settingsLockFilename = settings.fileName() + ".lock";
|
||||||
|
QFile settingsLockFile(settingsLockFilename);
|
||||||
|
if (settingsLockFile.exists()) {
|
||||||
|
bool deleted = settingsLockFile.remove();
|
||||||
|
qCDebug(shared) << (deleted ? "Deleted" : "Failed to delete") << "settings lock file" << settingsLockFilename;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets up the settings private instance. Should only be run once at startup. preInit() must be run beforehand,
|
||||||
|
void init() {
|
||||||
// Let's set up the settings Private instance on its own thread
|
// Let's set up the settings Private instance on its own thread
|
||||||
QThread* thread = new QThread();
|
QThread* thread = new QThread();
|
||||||
Q_CHECK_PTR(thread);
|
Q_CHECK_PTR(thread);
|
||||||
|
@ -55,14 +67,6 @@ namespace Setting {
|
||||||
privateInstance = new Manager();
|
privateInstance = new Manager();
|
||||||
Q_CHECK_PTR(privateInstance);
|
Q_CHECK_PTR(privateInstance);
|
||||||
|
|
||||||
// Delete Interface.ini.lock file if it exists, otherwise Interface freezes.
|
|
||||||
QString settingsLockFilename = privateInstance->fileName() + ".lock";
|
|
||||||
QFile settingsLockFile(settingsLockFilename);
|
|
||||||
if (settingsLockFile.exists()) {
|
|
||||||
bool deleted = settingsLockFile.remove();
|
|
||||||
qCDebug(shared) << (deleted ? "Deleted" : "Failed to delete") << "settings lock file" << settingsLockFilename;
|
|
||||||
}
|
|
||||||
|
|
||||||
QObject::connect(privateInstance, SIGNAL(destroyed()), thread, SLOT(quit()));
|
QObject::connect(privateInstance, SIGNAL(destroyed()), thread, SLOT(quit()));
|
||||||
QObject::connect(thread, SIGNAL(started()), privateInstance, SLOT(startTimer()));
|
QObject::connect(thread, SIGNAL(started()), privateInstance, SLOT(startTimer()));
|
||||||
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
|
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
|
||||||
namespace Setting {
|
namespace Setting {
|
||||||
|
void preInit();
|
||||||
void init();
|
void init();
|
||||||
void cleanupSettings();
|
void cleanupSettings();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue