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.
144 lines
No EOL
3.7 KiB
JavaScript
144 lines
No EOL
3.7 KiB
JavaScript
(function() {
|
|
var NUM_BURSTS = 3;
|
|
var NUM_EMITTERS_PER_BURST = 11;
|
|
|
|
var RANGE = 5.0;
|
|
var AUDIO_RANGE = 0.5 * RANGE;
|
|
var DIST_BETWEEN_BURSTS = 1.0;
|
|
|
|
var PI = 3.141593;
|
|
var DEG_TO_RAD = PI / 180.0;
|
|
|
|
var LOUDNESS_RADIUS_RATIO = 10;
|
|
|
|
var TEXTURE_PATH = 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png';
|
|
var cameraAxis = Quat.getFront(Camera.getOrientation());
|
|
var center = Vec3.sum(Camera.getPosition(), Vec3.multiply(RANGE, cameraAxis));
|
|
var audioPosition = Vec3.sum(Camera.getPosition(), Vec3.multiply(AUDIO_RANGE, cameraAxis));
|
|
|
|
var song = SoundCache.getSound("https://hifi-public.s3.amazonaws.com/eric/sounds/songs/Made%20In%20Heights%20-%20Forgiveness.wav");
|
|
var audioOptions = {
|
|
volume: 0.9, position: audioPosition
|
|
};
|
|
|
|
var DISTANCE_FROM_CAMERA = 7.0;
|
|
|
|
var colorPalette = [{
|
|
red: 0,
|
|
green: 206,
|
|
blue: 209
|
|
}, {
|
|
red: 173,
|
|
green: 216,
|
|
blue: 230
|
|
}, {
|
|
red: 0,
|
|
green: 191,
|
|
blue: 255
|
|
}];
|
|
|
|
var bursts = [];
|
|
var audioStats;
|
|
|
|
Burst = function(point) {
|
|
if (!audioStats) {
|
|
audioStats = Audio.playSound(song, audioOptions);
|
|
}
|
|
|
|
this.point = point;
|
|
this.emitters = [];
|
|
|
|
this.emitRate = randInt(80, 120);
|
|
this.emitStrength = randInt(4.0, 6.0);
|
|
|
|
this.direction = {
|
|
x: randFloat(-0.3, 0.3),
|
|
y: 1.0,
|
|
z: 0.0
|
|
}
|
|
|
|
this.base = Entities.addEntity({
|
|
type: "Sphere",
|
|
position: this.point,
|
|
dimensions: {
|
|
x: 0.05,
|
|
y: 0.05,
|
|
z: 0.05
|
|
},
|
|
color: {
|
|
red: 240,
|
|
green: 240,
|
|
blue: 240
|
|
}
|
|
});
|
|
for (var i = 0; i < NUM_EMITTERS_PER_BURST; ++i) {
|
|
var colorIndex = randInt(0, colorPalette.length - 1);
|
|
var color = colorPalette[colorIndex];
|
|
this.emitters.push(Entities.addEntity({
|
|
type: "ParticleEffect",
|
|
isEmitting: true,
|
|
position: this.point,
|
|
textures: TEXTURE_PATH,
|
|
emitRate: this.emitRate,
|
|
polarFinish: 25 * DEG_TO_RAD,
|
|
color: color,
|
|
lifespan: 1.0,
|
|
visible: true,
|
|
locked: false
|
|
}));
|
|
}
|
|
|
|
};
|
|
|
|
var nextPosition = center;
|
|
var posOrNeg = -1;
|
|
|
|
for (var i = 0; i < NUM_BURSTS; ++i) {
|
|
posOrNeg *= -1;
|
|
bursts.push(new Burst(nextPosition));
|
|
var offset = {
|
|
x: RANGE/(i+2) * posOrNeg,
|
|
y: 0,
|
|
z: 0
|
|
};
|
|
var nextPosition = Vec3.sum(nextPosition, offset);
|
|
}
|
|
|
|
function update(deltaTime) {
|
|
for (var i = 0; i < NUM_BURSTS; i++) {
|
|
if (audioStats && audioStats.loudness > 0.0) {
|
|
for (var j = 0; j < NUM_EMITTERS_PER_BURST; ++j) {
|
|
Entities.editEntity(bursts[i].emitters[j], {
|
|
particleRadius: audioStats.loudness / LOUDNESS_RADIUS_RATIO
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function randFloat(min, max) {
|
|
return Math.random() * (max - min) + min;
|
|
}
|
|
|
|
function randInt(min, max) {
|
|
return Math.floor(Math.random() * (max - min)) + min;
|
|
}
|
|
|
|
this.cleanup = function() {
|
|
for (var i = 0; i < NUM_BURSTS; ++i) {
|
|
Entities.deleteEntity(bursts[i].base);
|
|
for (var j = 0; j < NUM_EMITTERS_PER_BURST; ++j) {
|
|
var emitter = bursts[i].emitters[j];
|
|
Entities.deleteEntity(emitter);
|
|
}
|
|
|
|
}
|
|
Audio.stop();
|
|
}
|
|
|
|
Script.update.connect(update);
|
|
|
|
})();
|
|
|
|
Script.scriptEnding.connect(cleanup);
|
|
|