mirror of
https://github.com/overte-org/overte.git
synced 2025-04-10 07:02:26 +02:00
98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
//
|
|
// lib.js
|
|
// scripts/developer/tests/scriptableResource
|
|
//
|
|
// Created by Zach Pomerantz on 4/20/16.
|
|
// Copyright 2016 High Fidelity, Inc.
|
|
//
|
|
// Preloads textures to play a simple movie, plays it, and frees those textures.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
var NUM_FRAMES = 158; // 158 available
|
|
var FRAME_RATE = 30; // 30 default
|
|
|
|
function getFrame(callback) {
|
|
// A model exported from blender with a texture named 'Picture' on one face.
|
|
var FRAME_URL = "https://content.overte.org/Developer/Tutorials/pictureFrame/finalFrame.fbx";
|
|
|
|
var model = ModelCache.prefetch(FRAME_URL);
|
|
if (model.state === Resource.State.FINISHED) {
|
|
makeFrame(Resource.State.FINISHED);
|
|
} else {
|
|
model.stateChanged.connect(makeFrame);
|
|
}
|
|
|
|
function makeFrame(state) {
|
|
if (state === Resource.State.FAILED) { throw "Failed to load frame"; }
|
|
if (state !== Resource.State.FINISHED) { return; }
|
|
|
|
var pictureFrameProperties = {
|
|
name: 'scriptableResourceTest Picture Frame',
|
|
type: 'Model',
|
|
position: getPosition(),
|
|
modelURL: FRAME_URL,
|
|
dynamic: true,
|
|
};
|
|
|
|
callback(Entities.addEntity(pictureFrameProperties));
|
|
}
|
|
|
|
function getPosition() {
|
|
// Always put it 5 meters in front of you
|
|
var position = MyAvatar.position;
|
|
var yaw = MyAvatar.bodyYaw + MyAvatar.getHeadFinalYaw();
|
|
var rads = (yaw / 180) * Math.PI;
|
|
|
|
position.y += 0.5;
|
|
position.x += - 5 * Math.sin(rads);
|
|
position.z += - 5 * Math.cos(rads);
|
|
|
|
return position;
|
|
}
|
|
}
|
|
|
|
function prefetch(callback) {
|
|
// A folder full of individual frames.
|
|
var MOVIE_URL = Script.getExternalPath(Script.ExternalPaths.HF_Content, "/james/vidtest/");
|
|
|
|
var frames = [];
|
|
|
|
var numLoading = 0;
|
|
for (var i = 1; i <= NUM_FRAMES; ++i) {
|
|
var padded = pad(i, 3);
|
|
var filepath = MOVIE_URL + padded + '.jpg';
|
|
var texture = TextureCache.prefetch(filepath);
|
|
frames.push(texture);
|
|
if (texture.state !== Resource.State.FINISHED) {
|
|
numLoading++;
|
|
texture.stateChanged.connect(function(state) {
|
|
if (state === Resource.State.FAILED || state === Resource.State.FINISHED) {
|
|
--numLoading;
|
|
if (!numLoading) { callback(frames); }
|
|
}
|
|
});
|
|
}
|
|
}
|
|
if (!numLoading) { callback(frames); }
|
|
|
|
function pad(num, size) { // left-pad num with zeros until it is size digits
|
|
var s = num.toString();
|
|
while (s.length < size) { s = "0" + s; }
|
|
return s;
|
|
}
|
|
}
|
|
|
|
function play(model, frames, callback) {
|
|
var frame = 0;
|
|
var movieInterval = Script.setInterval(function() {
|
|
Entities.editEntity(model, { textures: JSON.stringify({ Picture: frames[frame].url }) });
|
|
if (++frame >= frames.length) {
|
|
Script.clearInterval(movieInterval);
|
|
callback();
|
|
}
|
|
}, 1000 / FRAME_RATE);
|
|
}
|
|
|