content/hifi-content/brosche/DomainContent/Rust/DJ-Tools/DJ-Tools_Personal.js
2022-02-13 21:50:01 +01:00

767 lines
27 KiB
JavaScript

// DJ_Tools_Spawner.js
//
// Created by Milad Nazeri on 2018-06-19
//
// Copyright 2018 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
//
// Creates a personal one around you, not relying on rust
(function () {
// Polyfill
Script.require("https://hifi-content.s3.amazonaws.com/milad/ROLC/Organize/O_Projects/Hifi/Scripts/hifi-content/Utilities/Polyfills.js")();
// "../../../Utilities/Polyfills.js"
// Helper Functions
var Util = Script.require("https://hifi-content.s3.amazonaws.com/milad/ROLC/Organize/O_Projects/Hifi/Scripts/hifi-content/Utilities/Helper.js");
// "../../../Utilities/Helper.js"
var getNameProps = Util.Entity.getNameProps,
getUserData = Util.Entity.getUserData,
inFrontOf = Util.Avatar.inFrontOf,
updateUserData = Util.Entity.updateUserData,
makeColor = Util.Color.makeColor,
vec = Util.Maths.vec;
// Log Setup
var LOG_CONFIG = {},
LOG_ENTER = Util.Debug.LOG_ENTER,
LOG_UPDATE = Util.Debug.LOG_UPDATE,
LOG_ERROR = Util.Debug.LOG_ERROR,
LOG_VALUE = Util.Debug.LOG_VALUE,
LOG_ARCHIVE = Util.Debug.LOG_ARCHIVE;
LOG_CONFIG[LOG_ENTER] = true;
LOG_CONFIG[LOG_UPDATE] = true;
LOG_CONFIG[LOG_ERROR] = true;
LOG_CONFIG[LOG_VALUE] = true;
LOG_CONFIG[LOG_ARCHIVE] = false;
var log = Util.Debug.log(LOG_CONFIG);
// Init
var DJ_NAME = AccountServices.username,
DJ_TABLE_NAME = "Set_" + DJ_NAME + "_Tables",
baseURL = "https://hifi-content.s3.amazonaws.com/milad/ROLC/Organize/O_Projects/Hifi/Scripts/hifi-content/DomainContent/Rust/DJ-Tools/",
particlePadLeftModel = "https://hifi-content.s3.amazonaws.com/alan/dev/particle-pad-1.fbx",
particlePadRightModel = "https://hifi-content.s3.amazonaws.com/alan/dev/particle-pad-2.fbx",
shortSoundURL = baseURL + 'FlameThrowerBurst.wav',
longSoundURL = baseURL + 'FlameThrowerRun.wav',
endPointParticleServerScript = baseURL + 'DJ_EndPoint_Particle_Server.js',
endPointLightServerScript = baseURL + 'DJ_EndPoint_Light_Server.js',
endPointSoundServerScript = baseURL + 'DJ_EndPoint_Sound_Server.js',
dispatchZoneClientScript = baseURL + 'DJ_Dispatch_Zone_Client.js',
dispatchZoneServerScript = baseURL + 'DJ_Dispatch_Zone_Server.js',
sensorBoxClientScript = baseURL + 'DJ_Sensor_Box_Client.js',
generatorDebugCubeScript = baseURL + 'DJ_Generator_Debug_Cube_Client.js',
dispatchZoneID = null,
DEBUG = false,
CREATE_TIMEOUT = 250,
LEFT = "Left",
RIGHT = "Right",
LEFT_HAND = "LeftHand",
RIGHT_HAND = "RightHand",
DEBUG_CUBE = "debugCube",
GROUP_LEFT = "Group_Left",
GROUP_RIGHT = "Group_Right",
GENERATOR = "generator",
SENSOR = "sensor",
ENDPOINT = "endPoint";
// Colections
var djTableProps = getNameProps(DJ_TABLE_NAME),
avatarPosition = MyAvatar.position,
avatarOrientation = MyAvatar.orientation,
inFrontOfAvatar = inFrontOf(0.5),
particleBaseProps = {
type: "ParticleEffect",
isEmitting: true,
lifespan: 2.0299999713897705,
maxParticles: 6717,
textures: "http://hifi-content.s3.amazonaws.com/alan/dev/Particles/Bokeh-Particle.png",
emitRate: 0,
emitSpeed: 1.47,
emitDimensions: {
x: 0.5,
y: 0.5,
z: 0.5
},
emitOrientation: {
x: -90.01,
y: 0,
z: 0
},
emitterShouldTrail: true,
particleRadius: 0,
radiusSpread: 0,
radiusStart: 0.5799999833106995,
radiusFinish: 0,
color: {
red: 255,
blue: 255,
green: 255
},
colorSpread: {
red: 0,
blue: 0,
green: 0
},
colorStart: {
red: 255,
blue: 33,
green: 33
},
colorFinish: {
red: 239,
blue: 255,
green: 13
},
emitAcceleration: {
x: 0.01,
y: 0.01,
z: 0.01
},
accelerationSpread: {
x: 1,
y: 1,
z: 1
},
alpha: 0.6000000238418579,
alphaSpread: 0,
alphaStart: 0.09000000357627869,
alphaFinish: 0,
polarStart: 0,
polarFinish: 1.02974,
azimuthStart: -180.00000500895632,
azimuthFinish: 180.00000500895632
},
lightBaseProps = {
type: "Light",
angularDamping: 0,
color: {
red: 255,
blue: 255,
green: 255
},
intensity: 0,
falloffRadius: 0,
isSpotlight: 0,
exponent: 0,
cutoff: 10,
collisionless: true
},
barrelStageLeftPosition = {
x: -26.4579,
y: -9.517,
z: -23.3428
},
barrelStageRightPosition = {
x: -38.6957,
y: -9.6874,
z: -23.3843
},
barrelBackRightPosition = {
x: -37.1513,
y: -6.5585,
z: -9.9410
},
barrelBackLeftPosition = {
x: -22.6895,
y: -6.7763,
z: -14.6075
},
allEntities = [],
entityNames = [];
// Procedural Functions
function deleteIfExists() {
var deleteNames = Settings.getValue(DJ_NAME + "_EFFECTS");
var SEARCH_RADIUS = 100;
if (deleteNames) {
deleteNames.forEach(function (name) {
var found = Entities.findEntitiesByName(name, avatarPosition, SEARCH_RADIUS);
try {
if (found[0]) {
Entities.deleteEntity(found[0]);
}
} catch (e) {
log(LOG_ERROR, "DELETING ENTITY", e);
}
});
}
}
function createGeneratorDebugCubeEntity(name, position, dimensions, color, userData, parentID) {
name = name || 1;
dimensions = dimensions || vec(1, 1, 1);
color = color || makeColor(1, 1, 1);
userData = userData || {};
var properties = {
name: name,
type: "Box",
position: position,
locked: false,
script: generatorDebugCubeScript + "?v=" + Date.now(),
dimensions: dimensions,
color: color,
visible: true,
collisionless: true,
parentID: parentID,
userData: userData
};
var id = Entities.addEntity(properties);
return id;
}
function createSensorBoxEntity(name, position, dimensions, rotation, color, userData, parentID) {
name = name || 1;
dimensions = dimensions || vec(1, 1, 1);
color = color || makeColor(1, 1, 1);
userData = userData || {};
var properties = {
name: name,
type: "Box",
position: position,
locked: false,
script: sensorBoxClientScript + "?v=" + Date.now(),
dimensions: dimensions,
rotation: rotation,
color: color,
visible: false,
collisionless: true,
parentID: parentID,
userData: userData
};
var id = Entities.addEntity(properties);
return id;
}
function createDispatchZoneEntity(name, position, dimensions, userData, parentID) {
name = name || 1;
dimensions = dimensions || vec(1, 1, 1);
userData = userData || {};
var properties = {
name: name,
type: "Zone",
position: position,
locked: false,
script: dispatchZoneClientScript + "?v=" + Date.now(),
serverScripts: dispatchZoneServerScript + "?v=" + Date.now(),
dimensions: dimensions,
collisionless: true,
parentID: parentID,
userData: userData
};
var id = Entities.addEntity(properties);
return id;
}
function createSensorModelEntity(name, position, dimensions, rotation, url, userData, parentID) {
name = name || "";
dimensions = dimensions || vec(1, 1, 1);
userData = userData || {};
var properties = {
name: name,
type: "Model",
modelURL: url,
position: position,
rotation: rotation,
locked: false,
dimensions: dimensions,
collisionless: true,
parentID: parentID,
userData: userData
};
var id = Entities.addEntity(properties);
return id;
}
function createParticleEntity(name, position, userData, parentID) {
name = name || "";
userData = userData || {};
var properties = {
name: name,
locked: false,
position: position,
serverScripts: endPointParticleServerScript + "?v=" + Date.now(),
parentID: parentID,
userData: userData
};
var finalParticleProps = Object.assign({}, particleBaseProps, properties);
var id = Entities.addEntity(finalParticleProps);
return id;
}
function createSoundEntity(name, position, dimensions, userData, parentID) {
name = name || "";
userData = userData || {};
var properties = {
name: name,
type: "Zone",
locked: false,
position: position,
dimensions: dimensions,
serverScripts: endPointSoundServerScript + "?v=" + Date.now(),
collisionless: true,
parentID: parentID,
userData: userData
};
var id = Entities.addEntity(properties);
return id;
}
function createLightEntity(name, position, dimensions, rotation, color, isSpot, userData, parentID) {
name = name || "";
userData = userData || {};
var properties = {
name: name,
position: position,
dimensions: dimensions,
rotation: rotation,
color: color,
locked: false,
isSpotlight: isSpot,
serverScripts: endPointLightServerScript + "?v=" + Date.now(),
parentID: parentID,
userData: userData
};
var finalLightProps = Object.assign({}, lightBaseProps, properties);
var id = Entities.addEntity(finalLightProps);
return id;
}
function createGeneratorDebugCubes() {
var name,
entityID,
debugPosition,
stringified,
userData = {},
HEIGHT = 0.0,
DISTANCE_BACK = -0.9,
DEBUG_WIDTH = 0.05,
DEBUG_HEIGHT = 0.05,
DEBUG_DEPTH = 0.05;
debugPosition = Vec3.sum(
djTableProps[1].position,
vec(0, HEIGHT, DISTANCE_BACK)
);
name = "Set_" + DJ_NAME + "_Debug-Cube";
userData.grabbableKey = { grabbable: true };
userData.performance = { type: GENERATOR };
stringified = JSON.stringify(userData);
entityID = createGeneratorDebugCubeEntity(
name,
debugPosition,
vec(DEBUG_WIDTH, DEBUG_HEIGHT, DEBUG_DEPTH),
makeColor(255,70,0),
stringified,
dispatchZoneID
);
allEntities.push(entityID);
entityNames.push(name);
}
function createEndPointParticles() {
[LEFT, RIGHT].forEach(function (side) {
var name,
name2,
entityID,
entityID2,
localOffset,
worldOffset,
particlePosition,
particlePosition2,
stringified,
userData = {},
DISTANCE_LEFT = -1,
DISTANCE_DEPTH = -1,
HEIGHT = 1;
userData.performance = {
type: ENDPOINT
};
if (side === LEFT) {
localOffset = vec(DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
particlePosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
particlePosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_LEFT;
} else {
localOffset = vec(-DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
particlePosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(-DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
particlePosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_RIGHT;
}
name = "Set_" + DJ_NAME + "_Particles_" + side;
name2 = "Set_" + DJ_NAME + "_Particles_Back_" + side;
userData.grabbableKey = { grabbable: false };
userData.performance.DEBUG = DEBUG;
stringified = JSON.stringify(userData);
entityID = createParticleEntity(name, particlePosition, stringified, dispatchZoneID);
entityID2 = createParticleEntity(name2, particlePosition2, stringified, dispatchZoneID);
allEntities.push(entityID, entityID2);
entityNames.push(name, name2);
});
}
function createEndPointSounds() {
[LEFT, RIGHT].forEach(function (side) {
var name,
name2,
entityID,
entityID2,
localOffset,
worldOffset,
DISTANCE_LEFT = -1,
DISTANCE_DEPTH = -1,
soundPosition,
soundPosition2,
stringified,
userData = {},
ZONE_SIZE = 1,
HEIGHT = 1;
userData.performance = {
type: ENDPOINT,
shortSoundURL: shortSoundURL,
longSoundURL: longSoundURL
};
if (side === LEFT) {
localOffset = vec(DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
soundPosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
soundPosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_LEFT;
} else {
localOffset = vec(-DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
soundPosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(-DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
soundPosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_RIGHT;
}
name = "Set_" + DJ_NAME + "_Sounds_" + side;
name2 = "Set_" + DJ_NAME + "_Sounds_Back_" + side;
userData.grabbableKey = { grabbable: false };
userData.performance.DEBUG = DEBUG;
stringified = JSON.stringify(userData);
entityID = createSoundEntity(name, soundPosition, vec(ZONE_SIZE, ZONE_SIZE, ZONE_SIZE), stringified, dispatchZoneID);
entityID2 = createSoundEntity(name2, soundPosition2, vec(ZONE_SIZE, ZONE_SIZE, ZONE_SIZE), stringified, dispatchZoneID);
allEntities.push(entityID, entityID2);
entityNames.push(name, name2);
});
}
function createEndPointLights() {
[LEFT, RIGHT].forEach(function (side) {
var name,
name2,
entityID,
entityID2,
lightPosition,
lightPosition2,
DIMENSION_SIZE = 30,
localOffset,
worldOffset,
DISTANCE_LEFT = -1,
DISTANCE_DEPTH = -1,
lightDimensions = vec(DIMENSION_SIZE, DIMENSION_SIZE, DIMENSION_SIZE),
lightRotation = Quat.fromPitchYawRollDegrees(0,0,0),
color = makeColor(70, 90, 100),
isSpot = false,
stringified,
userData = {},
HEIGHT = 1;
userData.performance = {
type: ENDPOINT
};
if (side === LEFT) {
localOffset = vec(DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
lightPosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
lightPosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_LEFT;
} else {
localOffset = vec(-DISTANCE_LEFT, 0, DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
lightPosition = Vec3.sum(
avatarPosition,
worldOffset
);
localOffset = vec(-DISTANCE_LEFT, 0, -DISTANCE_DEPTH);
worldOffset = Vec3.multiplyQbyV(avatarOrientation, localOffset);
lightPosition2 = Vec3.sum(
avatarPosition,
worldOffset
);
userData.performance.endPointGroupID = GROUP_RIGHT;
}
name = "Set_" + DJ_NAME + "_Lights_Stage_" + side;
name2 = "Set_" + DJ_NAME + "_Lights_Back_" + side;
userData.grabbableKey = { grabbable: false };
userData.performance.DEBUG = DEBUG;
stringified = JSON.stringify(userData);
entityID = createLightEntity(
name,
lightPosition,
lightDimensions,
lightRotation,
color,
isSpot,
stringified,
dispatchZoneID
);
entityID2 = createLightEntity(
name2,
lightPosition2,
lightDimensions,
lightRotation,
color,
isSpot,
stringified,
dispatchZoneID
);
allEntities.push(entityID, entityID2);
entityNames.push(name, name2);
});
}
function createSensorBoxes() {
[LEFT, RIGHT].forEach(function (side) {
var name,
entityID,
boxPosition,
color,
stringified,
userData = {},
BOX_WIDTH = 0.4,
BOX_HEIGHT = 0.4,
BOX_DEPTH = 0.4,
HEIGHT = 0,
DISTANCE_LEFT = 0.52,
DISTANCE_HEIGHT = BOX_HEIGHT / 2,
DISTANCE_BACK = -0.5,
NORMAL = 0,
REVERSE = 1;
userData.performance = {
type: SENSOR
};
if (side === LEFT) {
boxPosition = Vec3.sum(
inFrontOfAvatar,
Vec3.multiplyQbyV(MyAvatar.orientation, vec(-DISTANCE_LEFT, DISTANCE_HEIGHT, DISTANCE_BACK))
);
color = makeColor(20, 200, 0);
userData.performance.directionArray = [NORMAL, NORMAL, NORMAL];
userData.performance.endPointGroups = [GROUP_LEFT];
} else {
boxPosition = Vec3.sum(
inFrontOfAvatar,
Vec3.multiplyQbyV(MyAvatar.orientation, vec(DISTANCE_LEFT, DISTANCE_HEIGHT, DISTANCE_BACK))
// vec(-DISTANCE_LEFT, DISTANCE_HEIGHT, DISTANCE_BACK)
);
color = makeColor(200, 20, 0);
userData.performance.directionArray = [REVERSE, NORMAL, NORMAL];
userData.performance.endPointGroups = [GROUP_RIGHT];
}
userData.performance.DEBUG = DEBUG;
// userData.performance.generatorAccepts = [];
userData.performance.generatorAccepts = [LEFT_HAND, RIGHT_HAND];
if (DEBUG) {
userData.performance.generatorAccepts.push(DEBUG_CUBE);
}
userData.grabbableKey = { grabbable: false };
stringified = JSON.stringify(userData);
name = "Set_" + DJ_NAME + "_Pad_" + side;
entityID = createSensorBoxEntity(
name,
boxPosition,
vec(BOX_WIDTH, BOX_HEIGHT, BOX_DEPTH),
MyAvatar.orientation,
color,
stringified,
dispatchZoneID
);
allEntities.push(entityID);
entityNames.push(name);
});
}
function createSensorBoxModels() {
[LEFT, RIGHT].forEach(function (side) {
var name,
entityID,
modelPosition,
rotation,
url,
stringified,
userData = {},
DISTANCE_LEFT = 0.52,
HEIGHT = 0,
DISTANCE_BACK = -0.5,
MODEL_WIDTH = 0.4,
MODEL_HEIGHT = 0.05,
MODEL_DEPTH = 0.4;
if (side === LEFT) {
modelPosition = Vec3.sum(
inFrontOfAvatar,
Vec3.multiplyQbyV(MyAvatar.orientation, vec(-DISTANCE_LEFT, HEIGHT, DISTANCE_BACK))
);
url = particlePadLeftModel;
} else {
modelPosition = Vec3.sum(
inFrontOfAvatar,
Vec3.multiplyQbyV(MyAvatar.orientation, vec(DISTANCE_LEFT, HEIGHT, DISTANCE_BACK))
);
url = particlePadRightModel;
}
name = "Set_" + DJ_NAME + "_Pad_Models_" + side;
// rotation = Quat.fromPitchYawRollDegrees(0, 180, 0);
userData.grabbableKey = { grabbable: false };
userData.performance = { DEBUG: DEBUG };
stringified = JSON.stringify(userData);
entityID = createSensorModelEntity(
name,
modelPosition,
vec(MODEL_WIDTH, MODEL_HEIGHT, MODEL_DEPTH),
MyAvatar.orientation,
url,
stringified,
dispatchZoneID
);
allEntities.push(entityID);
entityNames.push(name);
});
}
function createDispatchZones() {
var name,
entityID,
zonePosition,
stringified,
userData = {},
HEIGHT = 0.0,
DISTANCE_BACK = -0.9,
ZONE_WIDTH = 2,
ZONE_HEIGHT = 2,
ZONE_DEPTH = 1.3;
zonePosition = Vec3.sum(
inFrontOfAvatar,
vec(0, HEIGHT, DISTANCE_BACK)
);
name = "Set_" + DJ_NAME + "_Dispatch_Zone";
userData.grabbableKey = { grabbable: false };
userData.performance = {
DEBUG: DEBUG,
childNamesUpdated: false
};
stringified = JSON.stringify(userData);
entityID = createDispatchZoneEntity(
name,
zonePosition,
vec(ZONE_WIDTH, ZONE_HEIGHT, ZONE_DEPTH),
stringified
);
allEntities.push(entityID);
entityNames.push(name);
dispatchZoneID = entityID;
}
function updateDispatchZoneChildNames() {
var namesToUpdate = entityNames.filter(function(name) {
return name.indexOf("_Dispatch_Zone") === -1;
});
var dispatchZoneUserData = getUserData(dispatchZoneID);
dispatchZoneUserData.performance.childNames = namesToUpdate;
dispatchZoneUserData.performance.childNamesUpdated = true;
updateUserData(dispatchZoneID, dispatchZoneUserData);
}
// Main
deleteIfExists();
createDispatchZones();
Script.setTimeout(function() {
if (DEBUG) {
createGeneratorDebugCubes();
}
createSensorBoxes();
createSensorBoxModels();
createEndPointParticles();
createEndPointLights();
createEndPointSounds();
updateDispatchZoneChildNames();
}, CREATE_TIMEOUT);
Settings.setValue(DJ_NAME + "_EFFECTS", entityNames);
// Cleanup
function scriptEnding() {
allEntities.forEach(function (entities) {
Entities.deleteEntity(entities);
});
}
Script.scriptEnding.connect(scriptEnding);
}());