mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
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);
|
|
|