Skip to content

Commit

Permalink
Merge pull request #282 from Tour-360/video
Browse files Browse the repository at this point in the history
Добавил возможность отображать видео в ВТ
  • Loading branch information
Borodin authored Dec 3, 2018
2 parents 94cec47 + dd54291 commit 0176902
Show file tree
Hide file tree
Showing 15 changed files with 363 additions and 7 deletions.
34 changes: 34 additions & 0 deletions example/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@
"start": 1,
"backgroundImage": "data:image/gif;base64,R0lGODdhCAAGAPIAAOjt86O4sp2np0tbTJKNi46gqLyyvcHK0iwAAAAACAAGAAADGhgGdxwiyFDEGaIckQ0mhtENhEBsFqFajJEAADs=",
"backgroundColor": "#a3aaac",
"videos": [
{
"id": "cola",
"src": "videos/cola.mp4",
"loop": true,
"autoplay": true,
"width": 270,
"height": 480
}
],
"panorams": [
{
"id": 0,
Expand Down Expand Up @@ -37,6 +47,14 @@
"href": "https://ru.wikipedia.org/wiki/Linkin_Park"
}
}
],
"videos": [
{
"position": { "x":-2.32, "y":0.177, "z":-1.84 },
"rotation": { "x":0, "y":1.5708, "z":0 },
"scale": { "x":1.3034, "y":1, "z":1 },
"videoId": "cola"
}
]
},{
"id": 1,
Expand Down Expand Up @@ -80,6 +98,14 @@
"id": "lana-del-rey-ultraviolence"
}
}
],
"videos": [
{
"videoId":"cola",
"position": {"x": -4.762, "y": 0.193, "z": -1.79},
"rotation": {"x": 0, "y": 1.5708, "z": 0},
"scale": {"x": 1.3034, "y": 1.0533, "z": 1}
}
]
},{
"id": 2,
Expand All @@ -105,6 +131,14 @@
"id": 1
}
}
],
"videos": [
{
"videoId": "cola",
"position": {"x": -6.632, "y":0.187, "z": -1.66},
"rotation": {"x": 0, "y": 1.5708, "z": 0},
"scale": {"x": 1.3034, "y": 1.0533, "z": 1}
}
]
}
]
Expand Down
Binary file added example/videos/cola.mp4
Binary file not shown.
4 changes: 2 additions & 2 deletions src/js/Tools/copyMarker.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ Tools.copyMarker = function(id) {
prompt('Enter popup id', '')
);
} else {
this.copyDirectionMarker(parseInt(prompt('Enter pano id', Tour.view.id)));
this.copyDirectionMarker(prompt('Enter pano id', Tour.view.id));
}
};
};
24 changes: 21 additions & 3 deletions src/js/Tools/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,26 @@
Tools.init = function() {
this.setPoint();
window.addEventListener('keydown', function(event) {
if(event.keyCode == 13){
Tools.copyMarker();
}
if(event.keyCode == 13){ //Enter
Tools.copyMarker();
}

switch (event.keyCode) {
case 13: Tools.copyMarker(); break; // Enter
case 49: Tools.copyLon(); break; // 1
case 50: Tools.meshEditor(); break; // 2
}
});

new UI.mouseMenu.Hr();
new UI.mouseMenu.Item(Tools.copyLon, 'Copy lon', '1')
new UI.mouseMenu.Item(Tools.meshEditor, 'Mesh editor', '2')

this.meshEditor()
Tour.view.fov.min = 5; Tour.view.fov.max = 130;
};


Tools.copyLon = function(){
Tour.controls.copyText(parseFloat(Tour.view.get().lon.toFixed(2)));
}
148 changes: 148 additions & 0 deletions src/js/Tools/meshEditor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/* globals Tools */

Tools.meshEditor = function(id, lat) {
this.selectedMesh = false;
this.durationCrop = 0;

function onMouseMove( event ) {
var mouse = new THREE.Vector2();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera( mouse, Tour.camera );
var intersects = raycaster.intersectObjects( Tour.meshs );

Tour.meshs.forEach(function (n) {
n.material.color && n.material.color.set( 0xffffff );
n.material.opacity = 1;
})

Tools.selectedMesh = false;

for ( var i = 0; i < intersects.length; i++ ) {
if(intersects[ i ].object.material.color){
intersects[ i ].object.material.color.set( 0xff0000 );
intersects[ i ].object.material.opacity = 0.6;
Tools.selectedMesh = intersects[ i ].object;
}
}
}

window.addEventListener('keydown', function(event) {
var alpha = 0.1
console.log(event)
if(event.altKey) alpha/=10;
if(event.ctrlKey) alpha/=10;
if(event.shiftKey) alpha*=10;

var sm = Tools.selectedMesh;

if(sm){
console.log(event.keyCode);
if(event.keyCode == 74){ //J
sm.position.z -= 1*alpha;
}else if(event.keyCode == 76){ //L
sm.position.z += 1*alpha;
}else if(event.keyCode == 73){ //K
sm.position.x += 1*alpha;
}else if(event.keyCode == 75){ //K
sm.position.x -= 1*alpha;
}else if(event.keyCode == 85){ //K
sm.position.y += 1*alpha;
}else if(event.keyCode == 79){ //K
sm.position.y -= 1*alpha;
}else if(event.keyCode == 219){ //{
sm.rotation.y += Math.PI/2*alpha;
}else if(event.keyCode == 221){ // }
sm.rotation.y -= Math.PI/2*alpha;
}else if(event.keyCode == 57){ // (
sm.rotation.z += Math.PI/2*alpha;
}else if(event.keyCode == 48){ // )
sm.rotation.z -= Math.PI/2*alpha;
}else if(event.keyCode == 188){ // (
sm.rotation.x += Math.PI/2*alpha;
}else if(event.keyCode == 190){ // )
sm.rotation.x -= Math.PI/2*alpha;
}else if(event.keyCode == 84){ // (
sm.scale.x += 1*alpha;
}else if(event.keyCode == 89){ // )
sm.scale.x -= 1*alpha
}else if(event.keyCode == 71){ // (
sm.scale.y += 1*alpha;
}else if(event.keyCode == 72){ // )
sm.scale.y -= 1*alpha
}else if(event.keyCode == 86){ // v
Tools.durationCrop = ++Tools.durationCrop%4;
UI.notification.show('Set duration crop '+['top', 'right', 'bottom', 'left'][Tools.durationCrop])
}else if(event.keyCode == 66){ // b
if(Tools.durationCrop == 0){
sm.material.map.repeat.y /= 1.1;
sm.material.map.offset.y /= 1.1;
Tools.selectedVideo.scale.y /= 1.1;
}else if(Tools.durationCrop == 1){
sm.material.map.repeat.x /= 1.1;
sm.material.map.offset.x /= 1.1;
sm.scale.x /= 1.1;
}else if(Tools.durationCrop == 2){
sm.material.map.repeat.y -= 0.1;
sm.scale.y = sm.material.map.repeat.y;
}else if(Tools.durationCrop == 3){
sm.material.map.repeat.x -= 0.1;
sm.scale.x = sm.material.map.repeat.x;
}

}else if(event.keyCode == 78){ // n
if(Tools.durationCrop == 0){
sm.material.map.repeat.y *= 1.1;
sm.material.map.offset.y *= 1.1;
sm.scale.y *= 1.1;
}else if(Tools.durationCrop == 1){
sm.material.map.repeat.x *= 1.1;
sm.material.map.offset.x *= 1.1;
sm.scale.x *= 1.1;
}else if(Tools.durationCrop == 2){
sm.material.map.repeat.y += 0.1;
sm.scale.y = sm.material.map.repeat.y;
}else if(Tools.durationCrop == 3){
sm.material.map.repeat.x += 0.1;
sm.scale.x = sm.material.map.repeat.x;
}
}



var fix = function(n){
return parseFloat(parseFloat(n).toFixed(4));
}

if(event.code == 'Digit8' && Tools.selectedMesh){
var mesh = {}
var sm = Tools.selectedMesh;
mesh.position = {x: fix(sm.position.x), y: fix(sm.position.y), z: fix(sm.position.z)}
mesh.rotation = {x: fix(sm.rotation.x), y: fix(sm.rotation.y), z: fix(sm.rotation.z)}
if(sm._videoId){
var alpha = Tour.videos[sm._videoId].canvas.height / Tour.videos[sm._videoId].canvas.width;
mesh.scale = {
x: fix(sm.scale.x / Tour.videos[sm._videoId].texture.repeat.x),
y: fix(sm.scale.y / Tour.videos[sm._videoId].texture.repeat.y) / alpha,
z: fix(sm.scale.z)
}
mesh.videoId = sm._videoId;
}else{
var alpha = Tour.images[sm._imageId].height / Tour.images[sm._imageId].width;
mesh.scale = {
x: fix(sm.scale.x),
y: fix(sm.scale.y / alpha),
z: fix(sm.scale.z)
}
mesh.imageId = sm._imageId;
}

Tour.controls.copyText(JSON.stringify(mesh))
}
}
});


document.body.addEventListener('click', onMouseMove, false );
};
17 changes: 17 additions & 0 deletions src/js/Tour/Image.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/* globals Tour, THREE*/

Tour.Image = function(options) {
this.loader = new THREE.TextureLoader();
this.material = new THREE.MeshBasicMaterial({
map: this.loader.load(options.src),
transparent: true,
// overdraw: 0.5,
// needsUpdate: true,
depthWrite: false
});

this.width = options.width;
this.height = options.height;

};
//https://stackoverflow.com/questions/15994944/transparent-objects-in-threejs
55 changes: 55 additions & 0 deletions src/js/Tour/Video.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* globals Tour, THREE*/

Tour.Video = function (options) {
this.videoElement = document.createElement('video');
this.videoElement.src = options.src;
// this.videoElement.autoplay = options.autoplay || true;
this.videoElement.loop = options.loop || true;
this.videoElement.muted = options.muted || true;

var that = this
var sync = function(){
if(that.videoElement.duration && that.needsUpdate){
that.videoElement.currentTime = (Date.now()/1000)%that.videoElement.duration;
}
}

if(options.sync){
clearTimeout(this.syncTimeout)
Tour.on('changeView', function(){
that.syncTimeout = setTimeout(sync, 2000);
})
this.syncInterval = setInterval(sync, 10000);
}

// if(options.autoplay){
// this.videoElement.play();
// }
this.videoElement.pause();

this.canvas = document.createElement('canvas');
this.canvas.width = Math.pow(2 ,Math.ceil(Math.log(options.width) / Math.log(2)));
this.canvas.height = Math.pow(2 ,Math.ceil(Math.log(options.height) / Math.log(2)));

this.ctx = this.canvas.getContext( '2d' );

this.texture = new THREE.Texture( this.canvas );
this.texture.repeat.x = options.width/this.canvas.width;
this.texture.repeat.y = options.height/this.canvas.height;
this.texture.offset.y = 1 - this.texture.repeat.y;
this.texture.needsUpdate = true;
this.needsUpdate = false;

this.material = new THREE.MeshBasicMaterial( { map: this.texture, overdraw: 0,transparent: true} );
};

Tour.Video.prototype.draw = function(){
if(this.needsUpdate){
this.videoElement.play();
this.ctx.drawImage(this.videoElement, 0, 0);
this.texture.needsUpdate = true;
Tour.needsUpdate = true;
}else{
this.videoElement.pause();
}
}
2 changes: 1 addition & 1 deletion src/js/Tour/controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ Tour.controls = {
},

reload: function() {
location.reload();
location.reload(true);
},

hideMenu: function() {
Expand Down
2 changes: 2 additions & 0 deletions src/js/Tour/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ Tour.init = function(data, options) {
this.setMouseMenu();
this.orientationControls.init();
this.load(data, function(data) {
this.setVideos(data.videos);
this.setImages(data.images);
document.title = Lang.translate(data.title) || Lang.get('virtual-tour');
var query = Tour.query.get();
query.id = query.id || data.start || 0;
Expand Down
3 changes: 3 additions & 0 deletions src/js/Tour/load.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ Tour.load = function(data, callback) {
}
}
UI.notification.show(e.name + ' \n' + e.message + (line ? ' line ' + line : ''), false);
} finally {
callback(Tour.data);
Tour.emmit('load', Tour.data);
}
}
};
Expand Down
7 changes: 6 additions & 1 deletion src/js/Tour/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@ Tour.render = function() {
marker.draw();
});
}
Tour.emmit('render');
this.needsUpdate = false;
if (this.videos) {
for(k in this.videos){
this.videos[k].draw();
}
}
Tour.emmit('render');
}

this.previousCamera = (new THREE.Vector4()).copy(this.camera.rotation);
Expand Down
Loading

0 comments on commit 0176902

Please sign in to comment.