mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 14:08:51 +02:00
ac script to provide an on-demand crowd, and an interface script to summon
it
This commit is contained in:
parent
4c247aecb3
commit
43c29500bf
2 changed files with 189 additions and 0 deletions
95
scripts/developer/tests/performance/crowd-agent.js
Normal file
95
scripts/developer/tests/performance/crowd-agent.js
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
"use strict";
|
||||||
|
/*jslint vars: true, plusplus: true*/
|
||||||
|
/*global Agent, Avatar, Script, Entities, Vec3, Quat, print*/
|
||||||
|
//
|
||||||
|
// crowd-agent.js
|
||||||
|
// scripts/developer/tests/performance/
|
||||||
|
//
|
||||||
|
// Created by Howard Stearns on 9/29/16.
|
||||||
|
// Copyright 2016 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
|
||||||
|
//
|
||||||
|
// Add this to domain-settings scripts url with n instances. It will lie dormant until
|
||||||
|
// a script like summon.js calls up to n avatars to be around you.
|
||||||
|
|
||||||
|
var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd";
|
||||||
|
|
||||||
|
print('crowd-agent version 1');
|
||||||
|
|
||||||
|
/* Observations:
|
||||||
|
- File urls for AC scripts silently fail. Use a local server (e.g., python SimpleHTTPServer) for development.
|
||||||
|
- URLs are cached regardless of server headers. Must use cache-defeating query parameters.
|
||||||
|
- JSON.stringify(Avatar) silently fails (even when Agent.isAvatar)
|
||||||
|
*/
|
||||||
|
|
||||||
|
function startAgent(parameters) { // Can also be used to update.
|
||||||
|
print('crowd-agent starting params', JSON.stringify(parameters), JSON.stringify(Agent));
|
||||||
|
Agent.isAvatar = true;
|
||||||
|
if (parameters.position) {
|
||||||
|
Avatar.position = parameters.position;
|
||||||
|
}
|
||||||
|
if (parameters.orientation) {
|
||||||
|
Avatar.orientation = parameters.orientation;
|
||||||
|
}
|
||||||
|
if (parameters.skeletonModelURL) {
|
||||||
|
Avatar.skeletonModelURL = parameters.skeletonModelURL;
|
||||||
|
}
|
||||||
|
if (parameters.animationData) {
|
||||||
|
data = parameters.animationData;
|
||||||
|
Avatar.startAnimation(data.url, data.fps || 30, 1.0, (data.loopFlag === undefined) ? true : data.loopFlag, false, data.startFrame || 0, data.endFrame);
|
||||||
|
}
|
||||||
|
print('crowd-agent avatars started');
|
||||||
|
}
|
||||||
|
function stopAgent(parameters) {
|
||||||
|
Agent.isAvatar = false;
|
||||||
|
print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent));
|
||||||
|
}
|
||||||
|
|
||||||
|
function messageSend(message) {
|
||||||
|
Messages.sendMessage(MESSAGE_CHANNEL, JSON.stringify(message));
|
||||||
|
}
|
||||||
|
function messageHandler(channel, messageString, senderID) {
|
||||||
|
if (channel !== MESSAGE_CHANNEL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
print('crowd-agent message', channel, messageString, senderID);
|
||||||
|
if (Agent.sessionUUID === senderID) { // ignore my own
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var message = {};
|
||||||
|
try {
|
||||||
|
message = JSON.parse(messageString);
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
switch (message.key) {
|
||||||
|
case "HELO":
|
||||||
|
messageSend({key: 'hello'}); // Allow the coordinator to count responses and make assignments.
|
||||||
|
break;
|
||||||
|
case 'hello': // ignore responses (e.g., from other agents)
|
||||||
|
break;
|
||||||
|
case "SUMMON":
|
||||||
|
if (message.rcpt === Agent.sessionUUID) {
|
||||||
|
startAgent(message);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "STOP":
|
||||||
|
if (message.rcpt === Agent.sessionUUID) {
|
||||||
|
stopAgent(message);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print("crowd-agent received unrecognized message:", channel, messageString, senderID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Messages.subscribe(MESSAGE_CHANNEL);
|
||||||
|
Messages.messageReceived.connect(messageHandler);
|
||||||
|
|
||||||
|
Script.scriptEnding.connect(function () {
|
||||||
|
print('crowd-agent shutting down');
|
||||||
|
Messages.messageReceived.disconnect(messageHandler);
|
||||||
|
Messages.unsubscribe(MESSAGE_CHANNEL);
|
||||||
|
print('crowd-agent unsubscribed');
|
||||||
|
});
|
94
scripts/developer/tests/performance/summon.js
Normal file
94
scripts/developer/tests/performance/summon.js
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
"use strict";
|
||||||
|
/*jslint vars: true, plusplus: true*/
|
||||||
|
/*global Agent, Avatar, Script, Entities, Vec3, Quat, print*/
|
||||||
|
//
|
||||||
|
// crowd-agent.js
|
||||||
|
// scripts/developer/tests/performance/
|
||||||
|
//
|
||||||
|
// Created by Howard Stearns on 9/29/16.
|
||||||
|
// Copyright 2016 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
|
||||||
|
//
|
||||||
|
// See crowd-agent.js
|
||||||
|
|
||||||
|
var version = 1;
|
||||||
|
var label = "summon";
|
||||||
|
function debug() {
|
||||||
|
print.apply(null, [].concat.apply([label, version], [].map.call(arguments, JSON.stringify)));
|
||||||
|
}
|
||||||
|
var MINIMUM_AVATARS = 25;
|
||||||
|
var DENSITY = 0.3; // square meters per person. Some say 10 sq ft is arm's length (0.9m^2), 4.5 is crowd (0.4m^2), 2.5 is mosh pit (0.2m^2).
|
||||||
|
var spread = Math.sqrt(MINIMUM_AVATARS * DENSITY); // meters
|
||||||
|
var turnSpread = 90; // How many degrees should turn from front range over.
|
||||||
|
|
||||||
|
function coord() { return (Math.random() * spread) - (spread / 2); } // randomly distribute a coordinate zero += spread/2.
|
||||||
|
|
||||||
|
|
||||||
|
var summonedAgents = [];
|
||||||
|
var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd";
|
||||||
|
function messageSend(message) {
|
||||||
|
Messages.sendMessage(MESSAGE_CHANNEL, JSON.stringify(message));
|
||||||
|
}
|
||||||
|
function messageHandler(channel, messageString, senderID) {
|
||||||
|
if (channel !== MESSAGE_CHANNEL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
debug('message', channel, messageString, senderID);
|
||||||
|
if (MyAvatar.sessionUUID === senderID) { // ignore my own
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var message = {}, avatarIdentifiers;
|
||||||
|
try {
|
||||||
|
message = JSON.parse(messageString);
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
switch (message.key) {
|
||||||
|
case "hello":
|
||||||
|
// There can be avatars we've summoned that do not yet appear in the AvatarList.
|
||||||
|
avatarIdentifiers = AvatarList.getAvatarIdentifiers().filter(function (id) { return summonedAgents.indexOf(id) === -1; });
|
||||||
|
debug('present', avatarIdentifiers, summonedAgents);
|
||||||
|
if ((summonedAgents.length + avatarIdentifiers.length) < MINIMUM_AVATARS ) {
|
||||||
|
summonedAgents.push(senderID);
|
||||||
|
messageSend({
|
||||||
|
key: 'SUMMON',
|
||||||
|
rcpt: senderID,
|
||||||
|
position: Vec3.sum(MyAvatar.position, {x: coord(), y: 0, z: coord()}),
|
||||||
|
orientation: Quat.fromPitchYawRollDegrees(0, Quat.safeEulerAngles(MyAvatar.orientation).y + (turnSpread * (Math.random() - 0.5)), 0)/*,
|
||||||
|
// No need to specify skeletonModelURL
|
||||||
|
//skeletonModelURL: "file:///c:/Program Files/High Fidelity Release/resources/meshes/being_of_light/being_of_light.fbx",
|
||||||
|
//skeletonModelURL: "file:///c:/Program Files/High Fidelity Release/resources/meshes/defaultAvatar_full.fst"/,
|
||||||
|
animationData: { // T-pose until we get animations working again.
|
||||||
|
"url": "file:///C:/Program Files/High Fidelity Release/resources/avatar/animations/idle.fbx",
|
||||||
|
//"url": "file:///c:/Program Files/High Fidelity Release/resources/avatar/animations/walk_fwd.fbx",
|
||||||
|
"startFrame": 0.0,
|
||||||
|
"endFrame": 300.0,
|
||||||
|
"timeScale": 1.0,
|
||||||
|
"loopFlag": true
|
||||||
|
}*/
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "HELO":
|
||||||
|
Window.alert("Someone else is summoning avatars.");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print("crowd-agent received unrecognized message:", messageString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Messages.subscribe(MESSAGE_CHANNEL);
|
||||||
|
Messages.messageReceived.connect(messageHandler);
|
||||||
|
Script.scriptEnding.connect(function () {
|
||||||
|
debug('stopping agents', summonedAgents);
|
||||||
|
summonedAgents.forEach(function (id) { messageSend({key: 'STOP', rcpt: id}); });
|
||||||
|
debug('agents stopped');
|
||||||
|
Script.setTimeout(function () {
|
||||||
|
Messages.messageReceived.disconnect(messageHandler);
|
||||||
|
Messages.unsubscribe(MESSAGE_CHANNEL);
|
||||||
|
debug('unsubscribed');
|
||||||
|
}, 500);
|
||||||
|
});
|
||||||
|
|
||||||
|
messageSend({key: 'HELO'}); // Ask agents to report in now, before we start the tribbles.
|
Loading…
Reference in a new issue