123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705 |
- //管理js文件 获取modeldata.js 判断是否有特殊的字段,如果有就先加载SpecialScene.js 里面有对特殊场景处理的代码 否则就直接加载main
- var Manage = function(){
- this.weixinURL = "https://res.wx.qq.com/open/js/jweixin-1.2.0.js",
- this.time = "?"+new Date().getTime();
- this.loadAudio();
- // this.loadWeixin();
- }
- // window.isLocal = true
- //动态加载js文件
- Manage.prototype.LoadJs = function(_files, succes){
- /* 已加载文件缓存列表,用于判断文件是否已加载过,若已加载则不再次加载*/
- var classcodes = [];
- var FileArray = [];
- if (typeof _files === "object") {
- FileArray = _files;
- } else {
- /*如果文件列表是字符串,则用,切分成数组*/
- if (typeof _files === "string") {
- FileArray = _files.split(",");
- }
- }
- if (FileArray != null && FileArray.length > 0) {
- var LoadedCount = 0;
- for (var i = 0; i < FileArray.length; i++) {
- loadFile(FileArray[i], function() {
- LoadedCount++;
- if (LoadedCount == FileArray.length) {
- try {
- succes();
- }
- catch(err) {
- console.log("err: 您未定义回调");
- }
- }
- })
- }
- }
- /*加载JS文件,url:文件路径,success:加载成功回调函数*/
- function loadFile(url, success) {
- if (!FileIsExt(classcodes, url)) {
- var _ThisType = GetFileType(url);
- var ThisType = _ThisType.indexOf("?") == -1 ? _ThisType : _ThisType.substring(0,_ThisType.indexOf("?"));
- var fileObj = null;
- if (ThisType == ".js") {
- fileObj = document.createElement('script');
- fileObj.src = url;
- } else if (ThisType == ".css") {
- fileObj = document.createElement('link');
- fileObj.href = url;
- fileObj.type = "text/css";
- fileObj.rel = "stylesheet";
- } else if (ThisType == ".less") {
- fileObj = document.createElement('link');
- fileObj.href = url;
- fileObj.type = "text/css";
- fileObj.rel = "stylesheet/less";
- }
- success = success || function() {};
- fileObj.onload = fileObj.onreadystatechange = function() {
- if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
- success();
- classcodes.push(url)
- }
- }
- document.getElementsByTagName('head')[0].appendChild(fileObj);
- } else {
- success();
- }
- }
- /*获取文件类型,后缀名,小写*/
- function GetFileType(url) {
- if (url != null && url.length > 0) {
- return url.substr(url.lastIndexOf(".")).toLowerCase();
- }
- return "";
- }
- /*文件是否已加载*/
- function FileIsExt(FileArray, _url) {
- if (FileArray != null && FileArray.length > 0) {
- var len = FileArray.length;
- for (var i = 0; i < len; i++) {
- if (FileArray[i] == _url) {
- return true;
- }
- }
- }
- return false;
- }
-
- };
- //获取页面url后面的参数
- Manage.prototype.number = function(variable) {
- var query = window.location.search.substring(1);
- var vars = query.split("&");
- for (var i=0;i<vars.length;i++) {
- var pair = vars[i].split("=");
- if(pair[0] == variable){return pair[1];}
- }
- return(false);
- };
- Manage.prototype.loadWeixin = function() {
- var that = this;
- this.LoadJs(that.weixinURL+that.time,function(){ });
- }
- Manage.prototype.loadAudio = function() { //相关:g_tourAudio \ g_playAudio
- g_bgAudio = new Audio;
- g_bgAudio.loop = true;
- g_bgAudio.autoplay = true;
- g_bgAudio.id = "bgaudio";
-
- //https://www.cnblogs.com/interdrp/p/4211883.html 部分资料
- g_bgAudio.load(); // iOS 9 还需要额外的 load 一下, 否则直接 play 无效
- var play = function(){
- //if(window.tourAudioSta) return;
-
- if(this.bgmShouldPlay){
- this.switchBgmState(true)
- }
-
- document.removeEventListener("touchstart",play);
- document.removeEventListener("click",play);
- $('#player')[0] && $('#player')[0].removeEventListener("touchstart", play);
- }.bind(this);
-
- g_bgAudio.oncanplay = ()=>{
- this.switchBgmState(true)
- }
- document.addEventListener("WeixinJSBridgeReady", ()=> {
- this.switchBgmState(true)
- }, false);
-
- document.addEventListener("touchstart", play);//ios需要加个事件才能播放 不能自动播放;如果还有浏览器不行,换成别的交互事件
- document.addEventListener("click", play);
- $('#player')[0] && $('#player')[0].addEventListener("touchstart", play);
- g_bgAudio.addEventListener('ended', ()=>{
- this.switchBgmState(true)
- });
-
-
-
- $("#volume").find("a").on("click", ()=> {
-
- if($("#volume img")[0].src.indexOf("btn_on.png")>-1)
- {
- this.switchBgmState(true);
- }
- else if($("#volume img")[0].src.indexOf("btn_off.png")>-1)
- {
- this.switchBgmState(false);
- }
- })
-
-
- }
- Manage.prototype.switchBgmState = function(state){
- if(!g_bgAudio || !g_bgAudio.src) return;
- this.bgmShouldPlay = state
-
- var played = function(){
- console.log('begin play bgm');
- g_play = 1;
- g_playAudio = g_bgAudio;
- $("#volume a img").attr("src", "./images/Volume btn_off.png")
- $("#volume").attr("title", "关闭声音");
- g_tourAudio && g_tourAudio.pause()
- }
- var paused = function(){
- g_play = 0;
- g_playAudio == g_bgAudio && (g_playAudio = null)
- $("#volume a img").attr("src", "./images/Volume btn_on.png")
- $("#volume").attr("title", "打开声音");
- }
-
- if(state ){
- g_bgAudio.play();
- if(g_bgAudio.paused){
- paused()
- }else{
- played()
- return true
- }
- }else{
- g_bgAudio.pause();
- paused()
- }
-
-
- g_bgAudio.pauseByHot = false
- g_bgAudio.pauseByTour = false
- }
-
-
-
-
- Manage.prototype.weixinShare = function() {
- console.log("weixinShare")
- $.ajax({
- url:'https://www.4dage.com/wechat/jssdk/',
- type: "post",
- data : {
- 'url' : location.href.split('#')[0]
- },
- dataType:"jsonp",
- jsonpCallback:"success_jsonp",
- success:function(data,textStatus){
- console.log("weixinShare success")
- console.log(data.appId)
-
- wx.config({
- // debug : true,
- appId : data.appId,
- timestamp : data.timestamp,
- nonceStr : data.nonceStr,
- signature : data.signature,
- jsApiList : [ 'checkJsApi', 'onMenuShareTimeline',
- 'onMenuShareAppMessage', 'onMenuShareQQ',
- 'onMenuShareWeibo', 'hideMenuItems',
- 'showMenuItems', 'hideAllNonBaseMenuItem',
- 'showAllNonBaseMenuItem', 'translateVoice',
- 'startRecord', 'stopRecord', 'onRecordEnd',
- 'playVoice', 'pauseVoice', 'stopVoice',
- 'uploadVoice', 'downloadVoice', 'chooseImage',
- 'previewImage', 'uploadImage', 'downloadImage',
- 'getNetworkType', 'openLocation', 'getLocation',
- 'hideOptionMenu', 'showOptionMenu', 'closeWindow',
- 'scanQRCode', 'chooseWXPay',
- 'openProductSpecificView', 'addCard', 'chooseCard',
- 'openCard' ]
- });
- },
- error:function(XMLHttpRequest,textStatus,errorThrown){
- console.log("jsonp.error:"+textStatus);
- }
- });
-
- var success_jsonp = function(json){
- console.log(json);
- };
- wx.ready(function(){
- // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行〿
- //对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中〿
- //分享到朋友圈
- console.log(g_weixinObj)
- wx.onMenuShareTimeline({
- title: g_weixinObj.title, // 分享标题
- link: g_weixinObj.lineLink, // 分享链接
- imgUrl: g_weixinObj.imgUrl, // 分享图标
- desc: g_weixinObj.desc
- });
- //获取“分享给朋友”按钮点击状态及自定义分享内容接叿
- wx.onMenuShareAppMessage({
- title: g_weixinObj.title, // 分享标题
- desc: g_weixinObj.desc, // 分享描述
- link: g_weixinObj.lineLink, // 分享链接
- imgUrl: g_weixinObj.imgUrl, // 分享图标
- type: '', // 分享类型,music、video或link,不填默认为link
- dataUrl: '' // 如果type是music或video,则要提供数据链接,默认为空
- });
-
- wx.onMenuShareWeibo({
- title: g_weixinObj.title, // 分享标题
- desc: g_weixinObj.desc, // 分享描述
- link: g_weixinObj.lineLink, // 分享链接
- imgUrl: g_weixinObj.imgUrl, // 分享图标
- success: function () {
- // 用户确认分享后执行的回调函数
- },
- cancel: function () {
- // 用户取消分享后执行的回调函数
- }
- });
- wx.onMenuShareQZone({
- title: g_weixinObj.title, // 分享标题
- desc: g_weixinObj.desc, // 分享描述
- link: g_weixinObj.lineLink, // 分享链接
- imgUrl: g_weixinObj.imgUrl, // 分享图标
- success: function () {
- // 用户确认分享后执行的回调函数
- },
- cancel: function () {
- // 用户取消分享后执行的回调函数
- }
- });
- wx.onMenuShareQQ({
- title: g_weixinObj.title, // 分享标题
- desc: g_weixinObj.desc, // 分享描述
- link: g_weixinObj.lineLink, // 分享链接
- imgUrl: g_weixinObj.imgUrl, // 分享图标
- success: function () {
- // 用户确认分享后执行的回调函数
- },
- cancel: function () {
- // 用户取消分享后执行的回调函数
- }
- });
- wx.error(function(res){
- // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名〿
- });
- });
-
- }
- Manage.prototype.dealURL = function(src, type){
- //music: "///super.4dage.com/data/LYW/edit/20200928_151633415.mp3"
- //"https://super.4dage.com/data/LYW/edit/20200928_165319399.jpg"]
-
-
- if(window.isLocal && settings.localPrefix!=void 0){//本地将线上的前缀替换
- var oldPrefix = 'super.4dage.com/'; //最简单的地址写一个,如果有其他完全不一样的地址就用数组逐个判断
- var index = src.indexOf(oldPrefix);
- if(index>-1){
- var wholeOldPrefix = src.slice(0, index+oldPrefix.length);
- return src.replace(wholeOldPrefix, settings.localPrefix)
- }
-
- // console.error("没有找到合适的本地链接")
- return src
- }else{
- //add https://
- var prefix = g_Prefix.replace('https://','').replace('http://','')
- if(!src.includes('http:/') && !src.includes('https:/') && src.includes(prefix)){
- src = 'https://'+src
- }
- return src
- }
-
-
- }
- Manage.prototype.removeSrcPostMark = function(url){//去除texture.load时自动加上的'?'
- var index = url.indexOf('?')
- if(index>-1){
- return url.slice(0, index)
- }else return url
- }
- Manage.prototype.showInfo = function (o) { // ({result:true, title:"发布成功"});
-
- var box = $(".resultBox");
-
- var title = o.title || o || i18n.get('保存成功');
- box.children().eq(0).html(title)
-
-
- //var time = o.time || THREE.Math.clamp((Config.lang=='en') ? title.length*50 : title.length*130 ,1300,5000);
- var time = o.time || THREE.Math.clamp(title.length*130 ,1300, 5000);
- o.time || console.log("showtime " + time)
-
- //实际有一半的时间在渐变透明度
- this.showInfoTimer && clearTimeout(this.showInfoTimer)
- box.removeClass("animate");//如果之后不久又要showinfo一个的话,先停止前面的animate
- setTimeout(function () {
- box.css(
- {
- '-webkit-animation-duration': time + 'ms',
- 'animation-duration': time + 'ms'
- }
- )
- if(o.top){
- box.children().css('top', o.top + "%");
- }else{
- box.children().css('top', '' )
- }
- box.removeClass("hide");
- box.addClass("animate");
- if (o.dontInteract) {//遮挡对屏幕的操作
- box.css('pointer-events', 'auto')
- } else {
- box.css('pointer-events', 'none')
- }
-
- this.showInfoTimer = setTimeout(function () {
- box.removeClass("animate");
- box.addClass("hide");
- this.showInfoTimer = null;
- }.bind(this), time + 20)
- }.bind(this), 50)//这个数字太小的话后面触发的没有重新animate的效果 应该要比帧率大吧
- }//like: manage.showInfo({title:'a', top:20})
- var manage = new Manage();
- //公用的函数
- function getQueryVariable(variable)
- {
- var query = window.location.search.substring(1);
- var vars = query.split("&");
- for (var i=0;i<vars.length;i++) {
- var pair = vars[i].split("=");
- if(pair[0] == variable){return pair[1];}
- }
- return(false);
- }
- //隐藏公司Logo
- function showLogo(){
- $("#myCompany").hide();
- $("#loaderCoBrandName").hide();
- $("#title-logo").hide();
- $(".title-container").css("justify-content","center")
- }
- //czj 添加随机的时间
- function randomTime(){
- return new Date()
- }
- function matcher(data){
- if(!data || !g_version ) return data;
- delete data.model.vision_version;
- var _data = {
- files: {
- "templates": ["images/images{{number}}/{{filename}}"]
- },
- model :{
- sid :window.number,
- camera_start:
- data.model.images && data.model.images.length != 0 ?
- {
- camera: {
- zoom: "-1",
- quaternion: [
- JSON.parse(data.model.images[0].metadata).camera_quaternion.z,
- JSON.parse(data.model.images[0].metadata).camera_quaternion.w,
- JSON.parse(data.model.images[0].metadata).camera_quaternion.x,
- JSON.parse(data.model.images[0].metadata).camera_quaternion.y
- ]
- },
- pano: { uuid: JSON.parse(data.model.images[0].metadata).scan_id },
- mode: "0"
- }
- : ''
- },
- sid: window.number,
- hoticon: {
- default: "./static/images/4dagePoint2.png",
- higt: "./static/images/4dagePoint.png"
- },
- special: "false",
- weixinDesc: ""
- };
- $.extend(true,data,_data)
- return data;
- }
- function hotMatcher(data={}){
- //if(!data || !g_version) return data;
- if(g_version) {
- data.tourAudio = data.audio || {};
- }else{
- data.tourAudio = {}
- }
- return data;
- }
- var GifTexDeal = {
-
- animateObjects : [],
- animateTexs : [] ,
- addAnimation : function(texture, owner, info, id){
- /* if(this.animateObjects.find(e=>
- e.texture == texture && !ifSame(info, e.info)
- )) */
-
- var animation
- var tex = this.animateTexs.find(e=>e.texture == texture)
- if(tex){
- animation = tex
- }else{
- animation = {texture,info }
- this.animateTexs.push(animation)
- this.setRepeart(animation)
- }
-
- var object = {
- animation, //默认相同的texture对应的info是一样的, 对应一个animation
- owner,
- }
-
- this.animateObjects.push(object)
- return object
- },
-
-
- remove : function(object){
- var index = this.animateObjects.indexOf(object)
- if(index>-1){
- this.animateObjects.splice(index, 1)
-
- if(!this.animateObjects.find(e=>e.animation == object.animation)){
- let i = this.animateTexs.indexOf(object.animation)
- this.animateTexs.splice(i, 1)
- object.animation.texture.repeat.set(1,1)
- }
-
- this.stop(object)
-
- }
- },
- setRepeart : function(animation){
- animation.texture.repeat.set(1/animation.info.cellXcount, 1/animation.info.cellYcount)
- },
- start: function(object){
-
- if(!object || object.started )return;
- object.started = true
- if(object.animation.started)return;
- object.animation.started = true
-
- var info = object.animation.info
- var count = info.cellXcount * info.cellYcount - (info.voidCount || 0)
-
- if(count <= 1)return;
-
- transitions.start( (progress)=>{
- var index = Math.floor(count * progress);
- var indexX = index % info.cellXcount
- var indexY = info.cellYcount - Math.floor(index /info.cellXcount ) - 1; //uv.offset.y是从下到上的
- object.animation.texture.offset.x = indexX / info.cellXcount;
- object.animation.texture.offset.y = indexY / info.cellYcount;
-
- //console.log(object.id + " : "+ object.texture.offset.toArray())
- } , info.duration * (-1), null,/* ()=>{//done (-1):循环
- object.started = false
- object.texture.offset.x = 0;
- object.texture.offset.y = 0;
- this.start(object)
- }, */ 0 ,null, object.id, "gif_"+object.animation.texture.id);
-
- },
-
-
- stop: function(object){
- if(!object || !object.started)return;
- object.started = false
- //只有该object对应的texture对应的所有object都停止了,才能真的停止动画:
- if(this.animateObjects.find(e=>e.animation == object.animation && e.started)) return;
-
-
- transitions.cancelById("gif_"+object.animation.texture.id);
- object.animation.texture.offset.set(0,0)
- object.animation.started = false
-
- }
- }
- var CloneObject = function(copyObj, result, isSimpleCopy, extraReplace) {
- //isSimpleCopy只复制最外层
- //复制json result的可能:普通数字或字符串、普通数组、复杂对象
- if(!copyObj)return copyObj //0 null undefined ''
- result = result || {};
- if (copyObj instanceof Array) {
- /* if (copyObj[0]instanceof Object) {
- //不支持含有 [[Object]] 这样二级数组里面还是复杂数据的,普通和复杂的数据混合可能也不支持
- console.error("不支持含有 [[Object]] 这样二级数组里面还是复杂数据的...")
- }
-
- return copyObj.slice(0);*/ //如果是数组,直接复制返回(排除数组内是object
- return copyObj.map(e=>{
- if(e instanceof Object){
- return CloneObject(e)
- }else return e
- })
-
- }else{
- if(copyObj.clone instanceof Function ){ //解决一部分
- return copyObj.clone()
- }
- }
- for (var key in copyObj) {
- if (copyObj[key] instanceof Object && !isSimpleCopy)
- result[key] = CloneObject(copyObj[key]);
- else
- result[key] = copyObj[key];
- //如果是函数类同基本数据,即复制引用
- }
- return result;
- }
- ;
- var ifSame = function(object1, object2){
- if(object1 == object2 )return true // 0 != undefined , 0 == ''
- else if(!object1 || !object2) return false
- else if(object1.constructor != object2.constructor){
- return false
- }else if(object1 instanceof Array ) {
- if(object1.length != object2.length)return false;
- var _object2 = object2.slice(0);
-
- for(let i=0;i<object1.length;i++){
- var u = _object2.find(e=>ifSame(object1[i], e));
- if(u == void 0 && !_object2.includes(u) && !object1.includes(u))return false;
- else{
- let index = _object2.indexOf(u);
- _object2.splice(index,1);
- }
- }
-
- return true
- }else if(object1.equals instanceof Function ){//复杂数据仅支持这种,其他的可能卡住?
-
- return object1.equals(object2)
-
- }else if(typeof object1 == 'number' || typeof object1 == 'string'){
- if(isNaN(object1) && isNaN(object2))return true
- else return object1 == object2
-
- }else if(typeof object1 == "object"){
- var keys1 = Object.keys(object1)
- var keys2 = Object.keys(object2)
- if(!ifSame(keys1,keys2))return false;
-
- for(let i in object1){
- var same = ifSame(object1[i], object2[i]);
- if(!same)return false
- }
- return true
- }else{
- console.log('isSame出现例外')
- }
-
-
-
-
-
- }
- var SoundPriority = {//暂不支持同时播放
- currentPlay:null,//当前正在播放list中的哪一个
- list:[
- {
- name:"bg",
- level : 0,//越大优先级越高
- canBeInterrupted : true ,
-
- },
- {
- name:"boxVideo",
- level : 1,
- canBeInterrupted : true,
- checkIfNeedPlay:function(){
-
-
- }
- },
- {
- name:"hot",
- level : 2,
- canBeInterrupted : true
- },
- {
- name:"tour",
- level : 3,
- canBeInterrupted : true
- },
-
-
- ],
- register:function(){
-
-
-
- }
-
-
- }
- //兼容一代的場景
- //請求地址統一管理
- var g_onePregix = "https://bigscene.4dage.com/" //对应一代 http://www.4dmodel.com/SuperPanoramic/index.html?m=55
- var g_version = manage.number("version");
- g_version === "one" ? g_Prefix = g_onePregix : '';
|