Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them has been replaced with a symlink. Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still be present.
270 lines
13 KiB
JavaScript
270 lines
13 KiB
JavaScript
//
|
|
// engine-dev-bot.js
|
|
//
|
|
// Created by Sam Gateau building on many others (November 2018).
|
|
// 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
|
|
//
|
|
|
|
var RECORDINGS_ARRAY = [
|
|
"eventer1.hfr",
|
|
// "cop1.hfr", // Bad Model
|
|
// "cop2.hfr", // Bad Model
|
|
"waiting1.hfr",
|
|
"waiting2.hfr",
|
|
// "waiting3.hfr", // Bad Model
|
|
"waiting4.hfr",
|
|
// "waiting5.hfr", // Moves downward
|
|
"waiting6.hfr",
|
|
// "waiting7.hfr", // Bad Model
|
|
"waiting8.hfr",
|
|
"waiting9.hfr",
|
|
"waiting10.hfr",
|
|
"bot1.hfr",
|
|
"bot2.hfr",
|
|
"bot3.hfr",
|
|
"bot4.hfr",
|
|
"check_12.hfr",
|
|
"peanuts.hfr",
|
|
"claude.hfr",
|
|
"usher1.hfr",
|
|
"usher2.hfr",
|
|
"usher3.hfr",
|
|
"jim.hfr"
|
|
];
|
|
|
|
var RECORDING_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Event%20/NPC%27s/" + RECORDINGS_ARRAY[Math.floor(Math.random() * RECORDINGS_ARRAY.length)];
|
|
print("RANDOM RECORDING SELECTED:" + RECORDING_URL);
|
|
|
|
var LOCATION_ORIGIN = { x: 11.0, y: -13.0, z: 28.0 };
|
|
var LOCATION_POLAR = { min_yaw: 60, max_yaw: 200, min_radius: 6.0, max_radius: 13.0 }
|
|
|
|
|
|
randFloat = function(low, high) {
|
|
return low + Math.random() * (high - low);
|
|
}
|
|
|
|
clamp = function(x, lower, upper) {
|
|
return Math.max(lower, Math.min(upper, x));
|
|
}
|
|
|
|
smoothstep = function(edge0, edge1, x) {
|
|
var t = clamp( (x - edge0) / (edge1 - edge0), 0, 1);
|
|
return t * t * (3.0 - 2.0 * t);
|
|
}
|
|
|
|
function genLocation(seed) {
|
|
var sign = (seed >= 0.5 ? 1.0 : -1.0);
|
|
var absSeed = 2.0 * Math.abs((seed - 0.5));
|
|
//var param = smoothstep(1.0, 0.0, absSeed);
|
|
var param = (1.0 - absSeed) * (1.0 - absSeed);
|
|
var yawCoord = 0.5 + sign * 0.5 * param
|
|
var yaw = LOCATION_POLAR.min_yaw + yawCoord * (LOCATION_POLAR.max_yaw - LOCATION_POLAR.min_yaw);
|
|
|
|
var radiusCoord = (1.0 - Math.abs(2 * yawCoord - 1.0) * Math.abs(2 * yawCoord - 1.0))
|
|
// var radiusCoord = Math.cos(Math.abs(2 * yawCoord - 1.0))
|
|
var radiusNoise = Math.random()
|
|
//var radiusNoise = 1.0
|
|
radiusCoord = radiusCoord * radiusNoise;
|
|
|
|
var radius = LOCATION_POLAR.min_radius + (LOCATION_POLAR.max_radius - LOCATION_POLAR.min_radius) * radiusCoord;
|
|
|
|
var polar = { x: 0, y: yaw * Math.PI / 180, z: radius };
|
|
var p = Vec3.fromPolar(polar);
|
|
|
|
var pos = Vec3.sum(LOCATION_ORIGIN, p);
|
|
print(JSON.stringify(pos))
|
|
return pos;
|
|
}
|
|
var LOCATION = genLocation(Math.random());
|
|
|
|
Vec3.print("RANDOM LOCATION SELECTED:", LOCATION);
|
|
|
|
// Disable the privacy bubble
|
|
Users.disableIgnoreRadius();
|
|
|
|
// Set position here if playFromCurrentLocation is true
|
|
Avatar.position = LOCATION;
|
|
Avatar.orientation = Quat.fromPitchYawRollDegrees(0, randFloat(0, 360), 0);
|
|
Avatar.scale = 1.0;
|
|
Agent.isAvatar = true;
|
|
|
|
// make the agent "listen" to the audio stream to cause additional audio-mixer load, technically this isn't needed when you're playing a recording
|
|
// but if you switch to a non-recording bot, you will need this, so we can leave this.
|
|
Agent.isListeningToAudioStream = true;
|
|
|
|
Recording.loadRecording(RECORDING_URL, function(success) {
|
|
if (success) {
|
|
Script.update.connect(update);
|
|
} else {
|
|
print("Failed to load recording from " + RECORDING_URL);
|
|
}
|
|
});
|
|
|
|
var CHANCE_OF_SOUND = 0.0;
|
|
|
|
var sounds = [];
|
|
loadSounds();
|
|
|
|
function loadSounds() {
|
|
var sound_filenames = ["AB1.wav", "Anchorman2.wav", "B1.wav", "B1.wav", "Bale1.wav", "Bandcamp.wav",
|
|
"Big1.wav", "Big2.wav", "Brian1.wav", "Buster1.wav", "CES1.wav", "CES2.wav", "CES3.wav", "CES4.wav",
|
|
"Carrie1.wav", "Carrie3.wav", "Charlotte1.wav", "EN1.wav", "EN2.wav", "EN3.wav", "Eugene1.wav", "Francesco1.wav",
|
|
"Italian1.wav", "Japanese1.wav", "Leigh1.wav", "Lucille1.wav", "Lucille2.wav", "MeanGirls.wav", "Murray2.wav",
|
|
"Nigel1.wav", "PennyLane.wav", "Pitt1.wav", "Ricardo.wav", "SN.wav", "Sake1.wav", "Samantha1.wav", "Samantha2.wav",
|
|
"Spicoli1.wav", "Supernatural.wav", "Swearengen1.wav", "TheDude.wav", "Tony.wav", "Triumph1.wav", "Uma1.wav",
|
|
"Walken1.wav", "Walken2.wav", "Z1.wav", "Z2.wav"
|
|
];
|
|
|
|
var SOUND_BASE_URL = "https://s3.amazonaws.com/hifi-public/sounds/cocktail-party/";
|
|
|
|
for (var i = 0; i < sound_filenames.length; i++) {
|
|
sounds.push(SoundCache.getSound(SOUND_BASE_URL + sound_filenames[i]));
|
|
}
|
|
}
|
|
|
|
// Play a random sound from a list of conversational audio clips
|
|
function playRandomSound() {
|
|
if (!Agent.isPlayingAvatarSound) {
|
|
var whichSound = Math.floor((Math.random() * sounds.length) % sounds.length);
|
|
Agent.playAvatarSound(sounds[whichSound]);
|
|
}
|
|
}
|
|
|
|
var entityJSON = {
|
|
"properties": {
|
|
"acceleration": { "x": 0, "y": 0, "z": 0 },
|
|
"actionData": "",
|
|
"age": 8,
|
|
"ageAsText": "0 hours 0 minutes 8 seconds",
|
|
"angularDamping": 0.39,
|
|
"angularVelocity": { "x": 0, "y": 0, "z": 0 },
|
|
"animation": {
|
|
"allowTranslation": true,
|
|
"currentFrame": 0,
|
|
"firstFrame": 0,
|
|
"fps": 30,
|
|
"hold": false,
|
|
"lastFrame": 100000,
|
|
"loop": true,
|
|
"running": false,
|
|
"url": ""
|
|
},
|
|
"boundingBox": {
|
|
"brn": { "x": -0.1, "y": 0.9, "z": -1.1},
|
|
"center": { "x": 0, "y": 1, "z": -1 },
|
|
"dimensions": { "x": 0.2, "y": 0.2, "z": 0.2},
|
|
"tfl": { "x": 0.1, "y": 1.1, "z": -0.9}
|
|
},
|
|
"canCastShadow": true,
|
|
"certificateID": "",
|
|
"clientOnly": true,
|
|
"cloneAvatarEntity": false,
|
|
"cloneDynamic": false,
|
|
"cloneLifetime": 300,
|
|
"cloneLimit": 0,
|
|
"cloneOriginID": "{00000000-0000-0000-0000-000000000000}",
|
|
"cloneable": false,
|
|
"collidesWith": "static,dynamic,kinematic,myAvatar,otherAvatar,",
|
|
"collisionMask": 31,
|
|
"collisionSoundURL": "",
|
|
"collisionless": false,
|
|
"collisionsWillMove": false,
|
|
"compoundShapeURL": "",
|
|
"created": "2018-07-26T21:58:48Z",
|
|
"damping": 0.39,
|
|
"density": 1000,
|
|
"description": "",
|
|
"dimensions": { "x": 0.2, "y": 0.2, "z": 0.2 },
|
|
"dynamic": false,
|
|
"editionNumber": 0,
|
|
"entityInstanceNumber": 0,
|
|
"friction": 0.5,
|
|
"gravity": { "x": 0, "y": 0, "z": 0 },
|
|
"href": "",
|
|
"id": "{05162d5d-5e65-4837-ad50-57041c8be427}",
|
|
"ignoreForCollisions": false,
|
|
"itemArtist": "",
|
|
"itemCategories": "",
|
|
"itemDescription": "",
|
|
"itemLicense": "",
|
|
"itemName": "",
|
|
"lifetime": 3600,
|
|
"limitedRun": 4294967295,
|
|
"localPosition": { "x": 0, "y": 1, "z": -1 },
|
|
"localRotation": { "w": 1, "x": 0, "y": 0, "z": 0 },
|
|
"locked": false,
|
|
"marketplaceID": "",
|
|
"modelURL": "http://www.capondesign.com/EXternal/models/ironman/TonyV2.fst",
|
|
"name": "FloofEntity",
|
|
"naturalDimensions": { "x": 1.94, "y": 1.812, "z": 0.375 },
|
|
"naturalPosition": { "x": 0, "y": 0.9, "z": 0.02 },
|
|
"originalTextures": "{\n \"Tony_Stark_Beard_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Beard_Diffuse.png\",\n \"Tony_Stark_Beard_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Beard_Gloss.png\",\n \"Tony_Stark_Beard_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Beard_Normal.png\",\n \"Tony_Stark_Beard_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Beard_Specular.png\",\n \"Tony_Stark_Body_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Body_Diffuse.png\",\n \"Tony_Stark_Body_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Body_Gloss.png\",\n \"Tony_Stark_Body_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Body_Normal.png\",\n \"Tony_Stark_Body_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Body_Specular.png\",\n \"Tony_Stark_Bottom_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Bottom_Diffuse.png\",\n \"Tony_Stark_Bottom_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Bottom_Gloss.png\",\n \"Tony_Stark_Bottom_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Bottom_Normal.png\",\n \"Tony_Stark_Bottom_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Bottom_Specular.png\",\n \"Tony_Stark_Eyewear_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Eyewear_Diffuse.png\",\n \"Tony_Stark_Eyewear_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Eyewear_Gloss.png\",\n \"Tony_Stark_Eyewear_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Eyewear_Normal.png\",\n \"Tony_Stark_Eyewear_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Eyewear_Specular.png\",\n \"Tony_Stark_Hair_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Hair_Diffuse.png\",\n \"Tony_Stark_Hair_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Hair_Gloss.png\",\n \"Tony_Stark_Hair_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Hair_Normal.png\",\n \"Tony_Stark_Hair_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Hair_Specular.png\",\n \"Tony_Stark_Moustache_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Moustache_Diffuse.png\",\n \"Tony_Stark_Moustache_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Moustache_Gloss.png\",\n \"Tony_Stark_Moustache_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Moustache_Normal.png\",\n \"Tony_Stark_Moustache_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Moustache_Specular.png\",\n \"Tony_Stark_Shoes_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Shoes_Diffuse.png\",\n \"Tony_Stark_Shoes_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Shoes_Gloss.png\",\n \"Tony_Stark_Shoes_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Shoes_Normal.png\",\n \"Tony_Stark_Shoes_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Shoes_Specular.png\",\n \"Tony_Stark_Top_Diffuse\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Top_Diffuse.png\",\n \"Tony_Stark_Top_Gloss\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Top_Gloss.png\",\n \"Tony_Stark_Top_Normal\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Top_Normal.png\",\n \"Tony_Stark_Top_Specular\": \"http://www.capondesign.com/EXternal/models/ironman/TonyV2/textures/Tony_Stark_Top_Specular.png\"\n}\n",
|
|
"owningAvatarID": "{b5229825-2c0b-4ef5-bcfc-913858ebe7b3}",
|
|
"parentID": "{b5229825-2c0b-4ef5-bcfc-913858ebe7b3}",
|
|
"parentJointIndex": 65535,
|
|
"position": { "x": 0, "y": 1, "z": -1 },
|
|
"queryAACube": { "scale": 1.04, "x": 8.59, "y": 0.94, "z": -29.11 },
|
|
"registrationPoint": { "x": 0.5, "y": 0.5, "z": 0.5 },
|
|
"relayParentJoints": true,
|
|
"renderInfo": {
|
|
"drawCalls": 9,
|
|
"hasTransparent": false,
|
|
"texturesCount": 27,
|
|
"texturesSize": 27525120,
|
|
"verticesCount": 25745
|
|
},
|
|
"restitution": 0.5,
|
|
"rotation": { "w": 1, "x": 0, "y": 0, "z": 0 },
|
|
"script": "",
|
|
"scriptTimestamp": 0,
|
|
"serverScripts": "",
|
|
"shapeType": "none",
|
|
"staticCertificateVersion": 0,
|
|
"textures": "",
|
|
"type": "Model",
|
|
"userData": "",
|
|
"velocity": { "x": 0, "y": 0, "z": 0 },
|
|
"visible": true
|
|
}
|
|
};
|
|
|
|
var count = 0;
|
|
var playCount = 300;
|
|
function update(event) {
|
|
count++;
|
|
if (count < playCount) {
|
|
return;
|
|
}
|
|
if (count == playCount) {
|
|
Recording.setPlayFromCurrentLocation(true);
|
|
Recording.setPlayerLoop(true);
|
|
Recording.startPlaying();
|
|
Vec3.print("Playing from ", Avatar.position);
|
|
}
|
|
|
|
/* uncomment to thrash AvatarEntityData
|
|
if (0 == (count % 45)) {
|
|
// send a bogus change to an imaginary AvatarEntity
|
|
entityJSON["name"] = "entity" + count;
|
|
Avatar.setAvatarEntityData({ "ff898dea-cb9a-4952-9639-3cb7dfe884df" : entityJSON });
|
|
}
|
|
*/
|
|
|
|
EntityViewer.setPosition(Avatar.position);
|
|
EntityViewer.setOrientation(Avatar.orientation);
|
|
EntityViewer.queryOctree();
|
|
|
|
if (Math.random() < CHANCE_OF_SOUND) {
|
|
playRandomSound();
|
|
}
|
|
|
|
if (!Recording.isPlaying()) {
|
|
Script.update.disconnect(update);
|
|
}
|
|
|
|
// uncomment to thrash Avatar's name
|
|
//Avatar.displayName = "Bot_RAND" + count;
|
|
}
|