/* v 3.7.9 author http://codecanyon.net/user/creativeinteractivemedia/portfolio?ref=creativeinteractivemedia */ var FLIPBOOK = FLIPBOOK || {}; { /* FLIPBOOK.PageWebGL */ FLIPBOOK.PageWebGL = function(book, i, hard, options, preloaderMatF, preloaderMatB) { THREE.Object3D.call(this); this.book = book; this.index = i; this.pW = options.pageWidth; this.pH = options.pageHeight; this.nfacesw = options.pageSegmentsW; this.nfacesh = options.pageSegmentsH; this.mats = []; this.pageHardness = hard; this.pageThickness = hard; this.duration = options.pageFlipDuration; this.angle = .25 * Math.PI * this.pW / this.pH; this.force = 10; this.offset = 0; this.to = null; this.mod = null; this.bend = null; this.pivot = null; this.isFlippedLeft = false; this.isFlippedRight = true; this.flippingLeft = false; this.flippingRight = false; this.options = options this.showing = false this.preloaderMatF = preloaderMatF this.preloaderMatB = preloaderMatB //preloaderMat.side = THREE.DoubleSide var self = this if (i == 0 && this.options.cornerCurl) { this.nfacesw = 20 this.nfacesh = 20 this.cornerCurlTween = new FLIPBOOK.TWEEN.Tween(0).to(1, 1000) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.Out) .onUpdate(function(f) { if(self.cornerCurl){ self.b2.force = f * -1.8 self.modF.apply() } }) .repeat(11000) .start() } // this.gF = new THREE.PlaneGeometry(this.pW, this.pH, this.nfacesw, this.nfacesh) this.gF = new THREE.BoxGeometry(this.pW, this.pH, 0.01, this.nfacesw, this.nfacesh, 0) var basicMat = new THREE.MeshBasicMaterial({ color: 0xededed }) var mats = [ basicMat, basicMat, basicMat, basicMat, preloaderMatF, preloaderMatB ] var mats2 = [ basicMat, basicMat, basicMat, basicMat, basicMat, basicMat ] if (this.options.pagePreloader) var mats2 = [ basicMat, basicMat, basicMat, basicMat, preloaderMatF, preloaderMatB ] // var basicMat2 = new THREE.MeshBasicMaterial({ // color: 0xFF0000 // }) // var mats3 = [ // basicMat2, // basicMat2, // basicMat2, // basicMat2, // basicMat2, // basicMat2 // ] this.cube = new THREE.Mesh(this.gF, mats) this.cube.position.x = this.pW * 0.5; if (this.options.shadows) { this.cube.castShadow = true this.cube.receiveShadow = true } // this.castShadow = true // this.receiveShadow = true // if(this.index == 1) // this.cube.castShadow = true // else // this.cube.receiveShadow = true this.gF.faceVertexUvs[1] = this.gF.faceVertexUvs[0]; this.showMat() this.cubeEmpty = new THREE.Mesh( new THREE.BoxGeometry(this.pW, this.pH, 0.01, 1, 1, 0), mats2 ) this.cubeEmpty.position.x = this.pW * 0.5; this.pageFlippedAngle = Math.PI * this.options.pageFlippedAngle / 180 this.bendF = new MOD3.Bend(0, 0, 0); this.bendF.constraint = MOD3.ModConstant.LEFT; if (this.pH > this.pW) this.bendF.switchAxes = true; this.b2 = new MOD3.Bend(0, 0, 0); this.b2.constraint = MOD3.ModConstant.LEFT; if (this.pH > this.pW) this.b2.switchAxes = true; this.b2.offset = .98 this.b2.setAngle(1) this.modF = new MOD3.ModifierStack(new MOD3.LibraryThree(), this.cube); this.modF.addModifier(this.bendF); if (i == 0 && this.options.cornerCurl) { this.modF.addModifier(this.b2); } // this.modF.addModifier(this.b2); this.modF.apply() }; FLIPBOOK.PageWebGL.prototype = new THREE.Object3D(); FLIPBOOK.PageWebGL.prototype.constructor = FLIPBOOK.PageWebGL; FLIPBOOK.PageWebGL.prototype.startCornerCurl = function() { this.cornerCurl = true } FLIPBOOK.PageWebGL.prototype.stopCornerCurl = function() { this.cornerCurl = false this.b2.force = 0 this.modF.apply() } FLIPBOOK.PageWebGL.prototype.onPageCanvasLoaded = function(page, side, callback) { // console.log("loaded page ",page.pdfPageIndex," ",side) if (side == 'front' && this.sizeFront != page.size) { // console.log("onPageCanvasLoaded ", page, side) // this.loadedFront = true this.sizeFront = page.size var c = page.canvas var t1 = new THREE.CanvasTexture(c) // t1.anisotropy = this.book.renderer.capabilities.getMaxAnisotropy(); t1.minFilter = THREE.LinearFilter //t1.generateMipmaps = false t1.needsUpdate = true t1.repeat.x = c.scaleX t1.repeat.y = c.scaleY t1.offset.y = 1 - c.scaleY // if (c.double && c.pageIndex % 2 != 0) t1.offset.x = .5 if (c.double) t1.offset.x = .5 this.frontMaterial = this.createMaterial(t1, 'front') this.frontMaterial.needsUpdate = true this.setFrontMat(this.frontMaterial) } else if (side == 'back' && this.sizeBack != page.size) { // console.log("onPageCanvasLoaded ", page, side) // this.loadedBack = true this.sizeBack = page.size var c = page.canvas var t2 = new THREE.CanvasTexture(c) //t2.generateMipmaps = false // t2.anisotropy = this.book.renderer.capabilities.getMaxAnisotropy(); t2.minFilter = THREE.LinearFilter t2.needsUpdate = true t2.repeat.x = c.scaleX t2.repeat.y = c.scaleY t2.offset.y = 1 - c.scaleY // if (c.double && c.pageIndex % 2 != 0) t2.offset.x = .5 this.backMaterial = this.createMaterial(t2, 'back') this.backMaterial.needsUpdate = true // FLIPBOOK.Buffer.addMaterial(self.backMaterial) this.setBackMat(this.backMaterial) } callback.call(this) //this.book.updateHtmlLayer() } FLIPBOOK.PageWebGL.prototype.load = function(side, callback) { // console.log("load page "+this.index,side,size) var model = this.book.model if(!model.wrapperH) return; if(!model.zoom) return; var pages = this.book.pages var texture, self = this; var options = this.book.options for (var i = 0; i < pages.length; i++) { var p = pages[i] if (p.flippingLeft || p.flippingRight) return } this.disposed = false var index = self.options.rightToLeft ? this.book.pages.length - this.index - 1 : this.index; var p1 = self.options.rightToLeft ? 2 * index + 1 : 2 * index var p2 = self.options.rightToLeft ? 2 * index : 2 * index + 1 var o = options var pageSize = model.wrapperH * model.zoom var size = pageSize < o.pageTextureSizeTreshold ? o.pageTextureSizeSmall : o.pageTextureSize if (side == 'front') { if (this.sizeFront == size) { if (callback) callback.call(this) } else { // console.log("loading page "+this.index+" front") // this.sizeFront = size this.options.main.loadPage(p1, size, function(page) { if (!page) { if (callback) callback.call(self) return } if (page.canvas) { self.onPageCanvasLoaded(page, "front", callback) } else if (page.image) { if (self.loadedFront) { callback.call(self) return } self.loadedFront = true var t1 = new THREE.Texture() t1.image = page.image t1.minFilter = THREE.LinearFilter // if (textureNeedsPowerOfTwo(t1) && !isPowerOfTwo(t1.image)) // t1.image = makePowerOfTwo(t1.image); // // t1.generateMipmaps = false; // t1.anisotropy = self.book.renderer.capabilities.getMaxAnisotropy(); t1.needsUpdate = true if (self.options.pages[2 * self.index].side == 'left') { t1.repeat.x = .5 } else if (self.options.pages[2 * self.index].side == 'right') { t1.repeat.x = .5 t1.offset.x = .5 } //front loaded self.frontMaterial = self.createMaterial(t1); self.setFrontMat(self.frontMaterial) callback.call(self) } }) } } else if (side == "back") { if (this.sizeBack == size) { if (callback) callback.call(this) } else { // console.log("loading page "+this.index+" back") this.options.main.loadPage(p2, size, function(page) { if (!page) { if (callback) callback.call(self) return } if (page.canvas) { self.onPageCanvasLoaded(page, "back", callback) } else if (page.image) { if (self.loadedBack) { callback.call(self) return } self.loadedBack = true var t2 = new THREE.Texture() t2.image = page.image t2.minFilter = THREE.LinearFilter t2.needsUpdate = true if (self.options.pages[2 * self.index + 1].side == 'left') { t2.repeat.x = .5 } else if (self.options.pages[2 * self.index + 1].side == 'right') { t2.repeat.x = .5 t2.offset.x = .5 } //back loaded self.backMaterial = self.createMaterial(t2, 'back'); self.setBackMat(self.backMaterial) callback.call(self) } }) } } }; FLIPBOOK.PageWebGL.prototype.unload = function(side) { if (side == 'front' && this.sizeFront) { var mat = this.cube.material[4] var t = mat.map mat.dispose() if (t) t.dispose() this.loadedFront = false this.sizeFront = 0 this.setFrontMat(this.preloaderMatF) } else if (side == 'back' && this.sizeBack) { var mat = this.cube.material[5] var t = mat.map mat.dispose() if (t) t.dispose() this.loadedBack = false this.sizeBack = 0 this.setBackMat(this.preloaderMatB) } } // FLIPBOOK.PageWebGL.prototype.reload = function() { // if (this.loadedFront) { // this.loadedFront = false // this.load("front", this.options.pageTextureSize, function(){}) // } // } FLIPBOOK.PageWebGL.prototype.disposeMat = function() { /*if(this.disposed) return;*/ if (!this.loaded) return var matF = this.cube.material[4] var matB = this.cube.material[5] var tF = matF.map var tB = matB.map matF.dispose() matB.dispose() if (tF) tF.dispose() if (tB) tB.dispose() this.disposed = true this.loaded = false } FLIPBOOK.PageWebGL.prototype.createMaterial = function(map, side) { var mat if (this.options.lights) { var sTexture = side == 'back' ? this.book.specularB : this.book.specularF var o = this.options mat = new THREE.MeshStandardMaterial({ map: map, roughness: o.pageRoughness, metalness: o.pageMetalness, emissive: 0x000000, color: 0xffffff, lightMap: sTexture }); // console.log("new THREE.MeshStandardMaterial") } else { mat = new THREE.MeshBasicMaterial({ map: map }); } // console.log("new THREE.MeshBasicMaterial") return mat }; FLIPBOOK.PageWebGL.prototype._setAngle = function(angle, direction) { //console.log(angle,this.index) // console.log(angle) if (angle <= 180 && angle >= -180) { angle = (angle / 180) * Math.PI if (this.singlePage) { if (angle >= 90) angle = 90 if (angle < 0 /*&& angle > -90*/ ) angle -= 90 if (angle < -180) angle = -180 if (this.index == (this.book.pages.length - 1)) return; } else { // this._flipped(angle >= 90 || (angle < 0 && angle >= -90)) } //console.log(angle,this.index) if (angle < 0 /*|| (angle == 0 && this.flippingRight)*/ ) { angle = angle + Math.PI } this.angle = angle this.positionZ(200) this.dragging = true //test /*if((angle+0.0000001) > Math.PI){ console.log("*********************") this.visible = false } else this.visible = true this.rotation.y = -angle/2*/ // this.rotation.y = -angle //console.log(angle) // this.bend.force = Math.sin(-angle*2)/2 if (this.isFlippedLeft) this.bendF.force = /*this.bendB.force =*/ 1.35 * Math.pow(-Math.abs(Math.cos(-angle / 2)), 1) / Math.pow(this.pageHardness, 1.5); else this.bendF.force = /*this.bendB.force =*/ 1.35 * Math.pow(Math.abs(Math.sin(-angle / 2)), 1) / Math.pow(this.pageHardness, 1.5); this.updateBend() if (this.book.htmlLayerVisible) { this.book.$pageL.hide() this.book.$pageR.hide() this.book.$pageC.hide() this.book.htmlLayerVisible = false } this.book.needsUpdate = true } } FLIPBOOK.PageWebGL.prototype.updateBend = function() { this.stopCornerCurl() // this.b2.force = this.rotation.y + Math.PI / 2 // console.log(this.rotation.y) this.modF.apply(); /*this.modB.apply();*/ // this.gF.mergeVertices(); this.gF.computeFaceNormals(); this.gF.computeVertexNormals(true); this.book.needsUpdate = true // this.gB.mergeVertices(); /* this.gB.computeFaceNormals(); this.gB.computeVertexNormals(true);*/ } FLIPBOOK.PageWebGL.prototype.flipLeft = function(onComplete) { this.onComplete = onComplete; this.dragging = false; if (!this.isFlippedLeft && !this.flippingLeft && !this.flippingRight && this.index == this.book.flippedleft) { if (this.duration > 0) { this.flippingLeft = true; this.flipping = true; this.force = 0; var newForce = (1 + Math.random() * .5) / this.pageHardness; var newOffset = .1 + Math.random() * .2; this.to = { angle: this.rotation.y, t: -1, xx: 0, thiss: this, force: this.force, offset: this.offset }; // this.bendIn(this.pageFlippedAngle, newForce, newOffset); this.bendIn(-Math.PI, newForce, newOffset); } else { // this.rotation.y = this.pageFlippedAngle; this.rotation.y = -Math.PI; this.flippingLeft = false; this.isFlippedLeft = true; this.flippingRight = false; this.isFlippedRight = false; } this.correctZOrder(); } }; FLIPBOOK.PageWebGL.prototype.correctZOrder = function() { var th = 4, i; // th = 50 //correct z order this.position.z = th / 2 + 1; //console.log(this.position.z) /*this.showMat()*/ //left side for (i = this.index - 1; i >= 0; i--) { this.book.pages[i].position.z = this.book.pages[i + 1].position.z - th / 2 - th / 2 - 1; //console.log(this.book.pages[i].position.z) } //right side for (i = this.index + 1; i < this.book.pages.length; i++) { this.book.pages[i].position.z = this.book.pages[i - 1].position.z - th / 2 - th / 2 - 1; //console.log(this.book.pages[i].position.z) } } FLIPBOOK.PageWebGL.prototype.flipLeftInstant = function(onComplete) { this.onComplete = onComplete; this.dragging = false; if (!this.isFlippedLeft && !this.flippingLeft && !this.flippingRight && this.index == this.book.flippedleft) { this.thiss = this; this.xx = 0; this.angle = -Math.PI; this.flippingLeft = true; this.isFlippedLeft = false; this.renderFlip(); this.flippingLeft = false; this.isFlippedLeft = true; this.flippingRight = false; this.isFlippedRight = false; var th = 4 //correct z order this.position.z = th / 2 + 1; //right side for (var i = this.index + 1; i < this.book.pages.length; i++) { this.book.pages[i].position.z = this.book.pages[i - 1].position.z - th / 2 - th / 2 - 1; } //left side if (this.index < this.book.pages.length - 1) { this.position.z = this.book.pages[this.index + 1].position.z; for (var i = this.index - 1; i >= 0; i--) { this.book.pages[i].position.z = this.book.pages[i + 1].position.z - th / 2 - th / 2 - 1; } } else { if (this.index > 0) this.book.pages[this.index].position.z = this.book.pages[this.index - 1].position.z + th / 2 + th / 2 - 1; } this.flipFinished() } }; FLIPBOOK.PageWebGL.prototype.hideMat = function() { if (this.showing) { this.remove(this.cube) this.add(this.cubeEmpty) this.showing = false //console.log('hiding ' + this.index) } } FLIPBOOK.PageWebGL.prototype.showMat = function() { if (!this.showing) { this.add(this.cube) this.remove(this.cubeEmpty) this.showing = true this.book.needsUpdate = true //console.log('---showing ' + this.index) } } FLIPBOOK.PageWebGL.prototype.setFrontMat = function(m) { if (this.cube.material[4] === m) return this.cube.material[4] = m; this.book.needsUpdate = true //this.frontMaterial = m } FLIPBOOK.PageWebGL.prototype.setBackMat = function(m) { if (this.cube.material[5] === m) return this.cube.material[5] = m; this.book.needsUpdate = true //this.backMaterial = m } FLIPBOOK.PageWebGL.prototype.flipRightInstant = function(onComplete) { this.onComplete = onComplete; this.dragging = false; if (!this.isFlippedRight && !this.flippingRight && !this.flippingLeft && this.index == this.book.getNumPages() - this.book.flippedright - 1) { this.thiss = this; this.xx = 0; this.angle = 0; this.flippingRight = true; this.isFlippedRight = false; this.renderFlip(); this.flippingLeft = false; this.isFlippedLeft = false; this.flippingRight = false; this.isFlippedRight = true; var th = 4 //correct z order this.position.z = th / 2 + 1; //left side for (var i = this.index - 1; i >= 0; i--) { this.book.pages[i].position.z = this.book.pages[i + 1].position.z - th / 2 - th / 2 - 1; } //right side if (this.index > 0) { this.position.z = this.book.pages[this.index - 1].position.z; for (var i = this.index + 1; i < this.book.pages.length; i++) { this.book.pages[i].position.z = this.book.pages[i - 1].position.z - th / 2 - th / 2 - 1; } } else { if (this.book.pages.length > 1) this.position.z = this.book.pages[this.index + 1].position.z + th / 2 + th / 2 - 1; } this.flipFinished() } }; FLIPBOOK.PageWebGL.prototype.flipRight = function(onComplete) { this.onComplete = onComplete; this.dragging = false; if (!this.isFlippedRight && !this.flippingRight && !this.flippingLeft && this.index == this.book.getNumPages() - this.book.flippedright - 1) { if (this.duration > 0) { this.flippingRight = true; this.flipping = true; this.force = 0; this.to = { angle: this.rotation.y, t: -1, xx: 0, thiss: this, force: this.force, offset: this.offset }; var newForce = (-1 - Math.random() * .5) / this.pageHardness; var newOffset = .1 + Math.random() * .2; this.bendIn(0, newForce, newOffset); } else { this.rotation.y = 0; this.flippingLeft = false; this.isFlippedLeft = false; this.flippingRight = false; this.isFlippedRight = true; } this.correctZOrder() } }; FLIPBOOK.PageWebGL.prototype.bendIn = function(angle, newForce, newOffset) { // var rand = Math.random() * (Math.PI / 24) - (Math.PI / 48) // this.bendF.setAngle(rand); // this.bendB.setAngle(rand); this.bendF.force = 0.0; this.bendF.offset = 0.0; this.updateBend() var time1 = 2 * this.duration * 240 * Math.pow((Math.abs(this.rotation.y - angle) / Math.PI), .5) * Math.pow(this.pageHardness, .25); //tween page rotation Y new FLIPBOOK.TWEEN.Tween(this.to).to({ angle: angle, xx: 1, t: 1 }, time1) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.In) .onUpdate(this.renderFlip) .onComplete(this.bendOut) .start(); // jQuery(this.book).trigger('playFlipSound') this.options.main.playFlipSound() }; FLIPBOOK.PageWebGL.prototype.bendOut = function() { //tween bend.force to 0 var self = this.thiss; var time = self.duration * Math.pow(Math.abs(self.bendF.force), .5) * 1000; new FLIPBOOK.TWEEN.Tween(self.bendF).to({ force: 0, offset: 1 }, time) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.Out) .onUpdate(function() { self.updateBend() }) .onComplete(function() { self.flipFinished(self) }) .start(); var th = 4 if (self.flippingLeft) { if (self.index < self.book.pages.length - 1) { self.position.z = self.book.pages[self.index + 1].position.z; for (var i = self.index - 1; i >= 0; i--) { self.book.pages[i].position.z = self.book.pages[i + 1].position.z - th / 2 - th / 2 - 1; } } else { if (self.book.pages.length > 1) self.book.pages[self.index].position.z = self.book.pages[self.index - 1].position.z + th / 2 + th / 2 - 1; } } if (self.flippingRight) { if (self.index > 0) { self.position.z = self.book.pages[self.index - 1].position.z; for (var i = self.index + 1; i < self.book.pages.length; i++) { self.book.pages[i].position.z = self.book.pages[i - 1].position.z - th / 2 - th / 2 - 1; } } else { if (self.book.pages.length > 1) self.position.z = self.book.pages[self.index + 1].position.z + th / 2 + th / 2 - 1; } } }; FLIPBOOK.PageWebGL.prototype.modApply = function() { this.thiss.bendF.force = this.thiss.bendB.force = this.force; this.thiss.bendF.offset = this.thiss.bendB.offset = this.offset; this.thiss.updateBend() }; FLIPBOOK.PageWebGL.prototype.renderFlip = function() { this.thiss._setAngle(-this.angle * 180 / Math.PI) }; FLIPBOOK.PageWebGL.prototype.flipFinished = function() { var self = this; if (self.flippingLeft) { self.flippingLeft = false; self.isFlippedLeft = true; self.flippingRight = false; self.isFlippedRight = false; } else if (self.flippingRight) { self.flippingLeft = false; self.isFlippedRight = true; self.flippingRight = false; self.isFlippedLeft = false; } self.bendF.force = 0.0; self.bendF.offset = 0.0; self.updateBend() self.flipping = false; self.dragging = false; if (typeof(self.onComplete) != 'undefined') self.onComplete(self); self.book.flipFinnished(); //self.book.options.main.turnPageComplete() }; FLIPBOOK.PageWebGL.prototype.isFlippedLeft = function() { return this.thiss.isFlippedLeft; }; FLIPBOOK.PageWebGL.prototype.isFlippedRight = function() { return this.thiss.isFlippedRight; }; FLIPBOOK.PageWebGL.prototype.positionZ = function() { } } { /* FLIPBOOK.BookWebGL */ FLIPBOOK.BookWebGL = function(el, model, options) { this.wrapper = el this.options = options; this.model = model; this.options.cameraDistance = 2800 this.pageW = options.pageWidth; this.pageH = options.pageHeight; this.pageW = 1000 * options.pageWidth / options.pageHeight; this.pageH = 1000; options.pageWidth = this.pageW options.pageHeight = this.pageH this.scroll = options.scroll; this.pagesArr = options.pages; this.pages = []; this.animating = false; this.sc = 1; var s = this.wrapper.style; s.width = '100%'; s.height = '100%'; s.position = 'absolute'; s.overflow = 'hidden'; this.options.cameraDistance = this.options.cameraDistance / 1.5 //this.goToPage(options.startPage, true) // this.stats = new Stats(); // this.stats.domElement.style.position = 'absolute'; // this.stats.domElement.style.top = '0px'; // this.wrapper.appendChild( this.stats.domElement ); /*window.rendererStats = new THREEx.RendererStats() window.rendererStats.domElement.style.position = 'absolute'; window.rendererStats.domElement.style.top = '0px'; this.wrapper.appendChild( window.rendererStats.domElement );*/ }; FLIPBOOK.BookWebGL.prototype = Object.create(FLIPBOOK.Book.prototype) FLIPBOOK.BookWebGL.prototype.constructor = FLIPBOOK.BookWebGL FLIPBOOK.BookWebGL.prototype.init3d = function() { // WebGL starts here var self = this, VIEW_ANGLE = 30, w = jQuery(self.wrapper).width(), h = jQuery(self.wrapper).height(), ASPECT = w / h, NEAR = 1, FAR = 10000, o = this.options; //scene this.Scene = new THREE.Scene(); this.centerContainer = new THREE.Object3D(); this.Scene.add(this.centerContainer); this.Camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR); //this.Camera.position.set(0,0,500) this.Scene.add(this.Camera); this.zoom = o.zoom; this.pan = o.pan; this.tilt = o.tilt; this.updateCameraPosition(); var container = this.wrapper var c = document.createElement('canvas') var ctx = c.getContext('webgl') var renderer = new THREE.WebGLRenderer({ antialias: this.options.antialias, alpha: true }); window.renderer = renderer renderer.gammaInput = true; renderer.gammaOutput = true; if (this.options.shadows) { renderer.shadowMap.enabled = true; // renderer.shadowMap.type = THREE.PCFSoftShadowMap; renderer.shadowMap.type = THREE.PCFShadowMap; // renderer.shadowMap.type = THREE.BasicShadowMap; } window.webglrenderer = this.renderer = renderer this.renderer.setSize(container.clientWidth, container.clientHeight); var pr = window.devicePixelRatio < o.minPixelRatio ? o.minPixelRatio : window.devicePixelRatio // pr = 1 this.renderer.setPixelRatio(pr) container.appendChild(this.renderer.domElement); var htmlLayer = false var pages = this.options.pages for (var i = 0; i < pages.length; i++) { if (pages[i].htmlContent) htmlLayer = true }; this.options.hasHtmlContent = htmlLayer || o.pdfMode if (this.options.hasHtmlContent) this.initHtmlContent() this.canvas = this.renderer.domElement this._bind('mousedown', this.canvas.parentNode.parentNode); this._bind('mousemove', this.canvas.parentNode.parentNode); this._bind('mouseout', this.canvas.parentNode.parentNode); this._bind('mouseup', this.canvas.parentNode.parentNode); this._bind('touchstart', this.canvas.parentNode.parentNode); this._bind('touchmove', this.canvas.parentNode.parentNode); this._bind('touchend', this.canvas.parentNode.parentNode); this._bind('touchcancel', this.canvas.parentNode.parentNode); if (this.options.lights) { var sCol = o.lightColor var sIntensity = 1 //sIntensity = 1 var sl = new THREE.SpotLight(sCol); sl.intensity = o.lightIntensity; sl.position.set(o.lightPositionX, o.lightPositionY, o.lightPositionZ); // sl.position.set(0, 400, 2500); sl.distance = 4000 // sl.penumbra = .1; // sl.decay = 0; if (this.options.shadows) { sl.castShadow = true sl.shadow.bias = -0.0000015 // sl.shadow.camera.far = 4000; // this.Scene.add( new THREE.CameraHelper( sl.shadow.camera ) ); // sl.shadow.camera.fov = 90; sl.shadow.mapSize.x = this.options.shadowMapSize sl.shadow.mapSize.y = this.options.shadowMapSize var mat = new THREE.ShadowMaterial() mat.opacity = this.options.shadowOpacity var bg = new THREE.Mesh(new THREE.BoxGeometry(10000, 10000, 1, 1, 1, 1), mat) /*new THREE.MeshBasicMaterial({ color: 0xcccccc, roughness: 1, metalness: 0, emissive: 0x222222 }))*/ bg.position.set(0, 0, -o.shadowDistance) this.Scene.add(bg) bg.receiveShadow = true } // sl.position.z = 2 * o.pageWidth > o.pageHeight ? 1.2 * 2 * o.pageWidth : 1.2 * o.pageHeight this.Scene.add(sl); /*var lh = new THREE.SpotLightHelper( sl ); this.Scene.add(lh) this.lh = lh var sCol = o.spotlightColor || 0xFFFFFF sCol = 0x555555 var sIntensity = o.spotlightIntensity || .14 sIntensity = 1 var dl = new THREE.DirectionalLight(sCol); dl.intensity = sIntensity; dl.position.set(1000, 0, 2000); //dl.position.z = 2 * o.pageWidth > o.pageHeight ? 1.2 * 2 * o.pageWidth : 1.2 * o.pageHeight //this.Scene.add(dl); dl.castShadow = true; var d = 1000; //dl.shadow = new THREE.SpotLightShadow( new THREE.PerspectiveCamera(30,1,1,1000)) dl.shadow.camera.left = -d; dl.shadow.camera.right = d; dl.shadow.camera.top = d; dl.shadow.camera.bottom = -d; dl.shadow.camera.near = 1; dl.shadow.camera.far = 5000; dl.shadow.mapSize.width = 1024; dl.shadow.mapSize.height = 1024; dl.shadow.bias = -0.001 var spotLight = new THREE.SpotLight( 0xffffff ); spotLight.name = 'Spot Light'; spotLight.angle = 1; //spotLight.penumbra = 0.3; spotLight.position.set( 0, 0, 2000 ); //spotLight.castShadow = true; //spotLight.shadow.camera.near = 1; //spotLight.shadow.camera.far = 3000; //spotLight.shadow.camera.fov = 30; //spotLight.shadow.mapSize.width = 1024; //spotLight.shadow.mapSize.height = 1024; spotLight.distance = 10000 spotLight.penumbra = .1; spotLight.decay = 0; //this.Scene.add( spotLight ); //this.Scene.add( new THREE.CameraHelper( spotLight.shadow.camera ) ); //var lightHelper1 = new THREE.SpotLightHelper( spotLight ); //this.Scene.add(lightHelper1) //this.lightHelper1 = lightHelper1 //sl.shadowBias = -0.001; */ var ambCol = o.ambientLightColor || 0x333333 var al = new THREE.AmbientLight(ambCol) // this.Scene.add(al); } this.centerContainer.position.set(0, 0, 0); this.onResize() // align flipBook center container this.centerContainer.position.x = -this.pageW * .5 * this.centerContainer.scale.x; this.updateHtmlLayerPosition() this.flippedleft = 0; this.flippedright = 0; this.cameraZMin = 300; this.cameraZMax = 5000; // var stats = new Stats(); // stats.showPanel( 1 ); // 0: fps, 1: ms, 2: mb, 3+: custom // document.body.appendChild( stats.dom ); (function a() { if (self.rendering) { if (!self.enabled) { return; } FLIPBOOK.TWEEN.update(); if(self.needsUpdate){ // if(1){ // self.frame = self.frame || 1 // self.frame++ // console.log("render frame ",self.frame) //self.renderer.clear() self.renderer.render(self.Scene, self.Camera); self.needsUpdate = false //self.lh.update() if (self.htmlLayer) self.cssRenderer.render(self.Scene, self.Camera); } // stats.update() //console.log(self.renderer.info.memory) // if(self.stats) // self.stats.update(); // console.log("rendering..."+self.elementId) // if(window.rendererStats) window.rendererStats.update(renderer) } requestAnimationFrame(a); })() //this.initialized = true; }; FLIPBOOK.BookWebGL.prototype.onPageLoaded = function(index, size) { var side var sheetIndex = Math.floor(index / 2) if (this.options.rightToLeft) { sheetIndex = this.pages.length - sheetIndex - 1 side = index % 2 == 0 ? 'back' : 'front' } else { side = index % 2 == 0 ? 'front' : 'back' } // console.log('onPageLoaded ', index, ' ', size) // this.pages[sheetIndex].onPageLoaded(index, side, size) } FLIPBOOK.BookWebGL.prototype.onPageUnloaded = function(index, size) { //console.log('onPageUnloaded ', index, ' ', size) var side var sheetIndex = Math.floor(index / 2) if (this.options.rightToLeft) { sheetIndex = this.pages.length - sheetIndex - 1 side = index % 2 == 0 ? 'back' : 'front' } else { side = index % 2 == 0 ? 'front' : 'back' } this.pages[sheetIndex].unload(side) } FLIPBOOK.BookWebGL.prototype.initHtmlContent = function() { var htmlLayer = document.createElement('div') htmlLayer.className = "htmlLayer " + Math.random() var $htmlLayer = jQuery(htmlLayer) this.$htmlLayer = $htmlLayer //jQuery(number).append(jQuery('')) this.$pageR = jQuery(document.createElement('div')) .addClass('R') .css({ 'width': 1000 * this.options.pageWidth / this.options.pageHeight + 'px', 'height': '1000px', 'position': 'absolute', 'top': '-500px', 'pointer-events': 'none' }) .appendTo($htmlLayer) this.$pageRInner = jQuery('
') .css('pointer-events', 'all') .appendTo(this.$pageR) this.$pageL = jQuery(document.createElement('div')) .addClass('L') .css({ 'width': 1000 * this.options.pageWidth / this.options.pageHeight + 'px', 'height': '1000px', 'position': 'absolute', 'top': '-500px', 'left': -1000 * this.options.pageWidth / this.options.pageHeight + 'px', 'pointer-events': 'none' }) .appendTo($htmlLayer) this.$pageLInner = jQuery(document.createElement('div')) .css('pointer-events', 'all') .appendTo(this.$pageL) this.$pageC = jQuery(document.createElement('div')) .addClass('C') .css({ 'width': 2 * 1000 * this.options.pageWidth / this.options.pageHeight + 'px', 'height': '1000px', 'position': 'absolute', 'top': '-500px', 'left': -1000 * this.options.pageWidth / this.options.pageHeight + 'px', 'pointer-events': 'none' }) .appendTo($htmlLayer) this.$pageCInner = jQuery(document.createElement('div')) .css('pointer-events', 'all') .appendTo(this.$pageC) this.htmlLayer = new FLIPBOOK.CSS3DObject(htmlLayer); //htmlObj.rotation.y = Math.PI/3 this.Scene.add(this.htmlLayer); this.cssRenderer = new FLIPBOOK.CSS3DRenderer(); var container = this.wrapper // this.cssRenderer.setSize(container.clientWidth, container.clientHeight); this.wrapper.appendChild(this.cssRenderer.domElement); this.cssRenderer.domElement.style.position = 'absolute' this.cssRenderer.domElement.style.top = '0' this.cssRenderer.domElement.style.left = '0' this.cssRenderer.domElement.style.pointerEvents = 'none' this.cssRenderer.domElement.className = "cssRenderer " + Math.random() var self = this this.model.on("toolSelect",function(){ self.updateTool() }) this.model.on("toolMove",function(){ self.updateTool() }) } FLIPBOOK.BookWebGL.prototype.enablePrev = function(val) { this.prevEnabled = val } FLIPBOOK.BookWebGL.prototype.enableNext = function(val) { this.nextEnabled = val } FLIPBOOK.BookWebGL.prototype.isZoomed = function() { return this.options.zoom > this.options.zoomMin && this.options.zoom > 1 } FLIPBOOK.BookWebGL.prototype.getRightPage = function() { return this.pages[this.flippedleft] } FLIPBOOK.BookWebGL.prototype.getNextPage = function() { return this.pages[this.flippedleft + 1] } FLIPBOOK.BookWebGL.prototype.getLeftPage = function() { return this.pages[this.flippedleft - 1] } FLIPBOOK.BookWebGL.prototype.getPrevPage = function() { return this.pages[this.flippedleft - 2] } FLIPBOOK.BookWebGL.prototype.onSwipe = function(event, phase, direction, distance, duration, fingerCount, fingerData) { //Here we can check the: //phase : 'start', 'move', 'end', 'cancel' //direction : 'left', 'right', 'up', 'down' //distance : Distance finger is from initial touch point in px //duration : Length of swipe in MS //fingerCount : the number of fingers used if (this.isZoomed()) return; //console.log(phase) if (phase == 'start') { //this.updateVisiblePages() } // out - distance is already calculated //distance = fingerData[0].start.x - fingerData[0].end.x if (direction == "right") distance *= -1; var left = this.getLeftPage() var right = this.getRightPage() var next = this.getNextPage() var prev = this.getPrevPage() if (this.options.rotateCameraOnMouseDrag && (!right || !right.dragging) && (!left || !left.dragging) && (this.onMouseMove == 'rotate' || this.onMouseMove == 'scroll')) return if ((phase == 'cancel' || phase == 'end') && fingerCount <= 1) { if (this.view == 1 && this.draggingBook && direction == "left") { this.nextPage() this.draggingBook = false return } if (this.view == 1 && this.draggingBook && direction == "right") { this.prevPage() this.draggingBook = false return } if (distance < 0 && (!right || !right.dragging)) this.prevPage() else if (distance > 0 && (!left || !left.dragging)) this.nextPage() else if (distance == 0) this.clickedPage ? this.clickedPage.isFlippedLeft ? this.prevPage() : this.nextPage() : null if (right) right.dragging = false if (left) left.dragging = false } if (phase == 'move' && fingerCount <= 1) { if (this.draggingBook) { this.centerContainer.position.x = this.draggingBookStartX - distance this.updateHtmlLayerPosition() return } if (this.view == 1 && this.isFocusedLeft() && direction == "left") { this.draggingBookStartX = this.centerContainer.position.x this.draggingBook = true return } if (this.view == 1 && this.isFocusedRight() && direction == "right") { this.draggingBookStartX = this.centerContainer.position.x this.draggingBook = true return } // distance = 180 * (fingerData[0].start.x - fingerData[0].end.x) / jQuery(this.wrapper).width() // if(direction == "right") // distance *= -1; distance = 180 * distance / this.wrapperW if ((left && left.flipping) || (right && right.flipping)) return //both down //console.log(left,right,distance) if ((!right || !right.dragging) && (!left || !left.dragging)) { if (distance != 0) { if (direction == 'right' && left && (!right || !right.dragging) && this.prevEnabled) { left._setAngle(distance, direction) left.positionZ(200) if (prev) prev.showMat() } else if (direction == 'left' && right && this.nextEnabled) { right._setAngle(distance, direction) right.positionZ(200) if (next) next.showMat() } } } //one is dragging else { if (left && !right || left && !right.dragging) { if (distance <= 0) left._setAngle(distance, direction) } else if (right && !left || right && !left.dragging) { if (distance >= 0) { right._setAngle(distance, direction) } } } } } FLIPBOOK.BookWebGL.prototype.onResize = function() { var m = this.model, w = m.wrapperW, h = m.wrapperH, o = this.options, pw = o.pageWidth, ph = o.pageHeight, r1 = w / h, r2 = pw / ph if(h < 1000 && window.devicePixelRatio == 1) this.renderer.setPixelRatio(2) else{ var pr = window.devicePixelRatio < o.minPixelRatio ? o.minPixelRatio : window.devicePixelRatio this.renderer.setPixelRatio(pr) } var s = Math.min(this.zoom, 1) var zoomMin = Number(o.zoomMin) if (o.responsiveView && w <= o.responsiveViewTreshold && r1 < 2 * r2) { //switch to single page mode this.view = 1 if (r2 > r1) this.sc = zoomMin * r1 / (r2 * s); else this.sc = 1; if (this.rightIndex == 0 || this.isFocusedRight()) this.focusRight(); else this.focusLeft(); } else { this.view = 2 if (r1 < 2 * r2) this.sc = zoomMin * r1 / (2 * r2 * s); else this.sc = 1; if (this.flippedleft == 0) this.focusRight(); else if (this.flippedright == 0) this.focusLeft() else this.focusBoth() } this.renderer.setSize(w, h); // console.log(w,h) // console.log(this.model.wrapperW) if (this.htmlLayer) { //this.cssRenderer.setSize(w*this.sc, h*this.sc); this.cssRenderer.setSize(w, h); this.htmlLayer.scale.set(this.sc, this.sc, this.sc) } // update the camera this.Camera.aspect = w / h; this.Camera.updateProjectionMatrix(); this.updateCameraPosition(); this.updateBookPosition(); this.wrapperW = w this.wrapperH = h }; FLIPBOOK.BookWebGL.prototype.updateCameraPosition = function() { //tilt var angle = Math.PI * this.tilt / 180; var cameraX = 0; var cameraY = this.options.cameraDistance * Math.sin(angle) / (this.zoom); var cameraZ = this.options.cameraDistance * Math.cos(angle) / (this.zoom); this.centerContainer.scale.set(this.sc, this.sc, this.sc); //pan angle = Math.PI * this.pan / 180; cameraX = Math.sin(angle) * cameraZ; cameraZ = Math.cos(angle) * cameraZ; this.cameraZ = cameraZ //this.Camera.fov = 20 //this.Camera.updateProjectionMatrix(); this.Camera.position.set(Math.round(cameraX), Math.round(cameraY), Math.round(cameraZ)); this.Camera.lookAt(this.Scene.position); this.needsUpdate = true }; FLIPBOOK.BookWebGL.prototype.createPages = function() { //create all pages var self = this; var texturefront, textureback, hardness, page, i; /*if(self.options.rightToLeft){ for (i=self.pagesArr.length-1;i>=0;i--) p.push(self.pagesArr[i]) }else{ p = self.pagesArr }*/ var options = self.options var marginW = options.pageMiddleShadowSize var c = document.createElement("canvas"); c.width = 64 c.height = 64 var ctx = c.getContext("2d"); var grd = ctx.createLinearGradient(64 - marginW, 0, 64, 0); grd.addColorStop(0, "#AAAAAA"); grd.addColorStop(1, options.pageMiddleShadowColorL); ctx.fillStyle = grd; ctx.fillRect(0, 0, 64, 64); var t = new THREE.CanvasTexture(c) /*console.log("new THREE.Texture")*/ t.needsUpdate = true; self.specularB = t var c2 = document.createElement("canvas"); c2.width = 64 c2.height = 64 var ctx2 = c2.getContext("2d"); var grd2 = ctx2.createLinearGradient(0, 0, marginW, 0); grd2.addColorStop(0, options.pageMiddleShadowColorR); grd2.addColorStop(1, "#AAAAAA"); ctx2.fillStyle = grd2; ctx2.fillRect(0, 0, 64, 64); var t2 = new THREE.CanvasTexture(c2) /*console.log("new THREE.Texture")*/ t2.needsUpdate = true; self.specularF = t2 var preloaderMatF, preloaderMatB if (self.options.pagePreloader) { var tex = new THREE.TextureLoader().load(self.options.pagePreloader, function() { }); if (self.options.lights) { preloaderMatF = new THREE.MeshStandardMaterial({ map: tex, roughness: self.options.pageRoughness, metalness: self.options.pageMetalness, emissive: 0x000000, color: 0xededed, lightMap: self.specularF }) preloaderMatB = new THREE.MeshStandardMaterial({ map: tex, roughness: self.options.pageRoughness, metalness: self.options.pageMetalness, emissive: 0x000000, color: 0xededed, lightMap: self.specularB }) } else { preloaderMatF = preloaderMatB = new THREE.MeshBasicMaterial({ map: tex, color: 0xededed }) } } else { if (self.options.lights) { preloaderMatF = new THREE.MeshStandardMaterial({ roughness: self.options.pageRoughness, metalness: self.options.pageMetalness, emissive: 0x000000, color: 0xededed, lightMap: self.specularF }) preloaderMatB = new THREE.MeshStandardMaterial({ roughness: self.options.pageRoughness, metalness: self.options.pageMetalness, emissive: 0x000000, color: 0xededed, lightMap: self.specularB }) } else { preloaderMatF = preloaderMatB = new THREE.MeshBasicMaterial({ color: 0xededed }) } } var p = self.options.pages for (i = 0; i < p.length / 2; i++) { hardness = (i == 0 || i == (p.length / 2 - 1)) ? self.options.coverHardness : self.options.pageHardness; page = new FLIPBOOK.PageWebGL(self, i, hardness, self.options, preloaderMatF, preloaderMatB); self.pages.push(page); self.centerContainer.add(page); self.flippedright++; /*if (self.options.loadAllPages) page.load()*/ var th = 4 if (i > 0) { page.position.z = self.pages[i - 1].position.z - th / 2 - th / 2 - 1; if (this.bg) this.bg.position.z = page.position.z - 5 } else page.position.z = th / 2; } self.initialized = true; this.updateHtmlLayer() /*window._m = new THREE.MeshBasicMaterial({color:0xff0000}) var t = new THREE.Mesh(new THREE.BoxGeometry(100,100,100), _m) this.Scene.add(t) console.log( "before", renderer.info.programs.length ); t.material.dispose() console.log( "after", renderer.info.programs.length );*/ /* setTimeout(function(){ console.log(window._m) window._m.dispose() setTimeout(function(){ console.log(window._m) },2000) },2000)*/ }; FLIPBOOK.BookWebGL.prototype.getNumPages = function() { return (this.pages.length); }; FLIPBOOK.BookWebGL.prototype.centerContainer = function() { return (this.centerContainer); }; FLIPBOOK.BookWebGL.prototype.goToPage = function(index, instant) { //index in book.pages, not page number if (!this.initialized) { // console.log("initializing...") var self = this; setTimeout(function() { self.goToPage(index, instant) }, 100) return; } //if(index % 2 != 0) index++; if (index < 0) index = 0 if (index > this.options.pages.length) index = this.options.pages.length if (index % 2 != 0) index--; if (index == this.rightIndex) { this.turnPageComplete() return; } this.goingToPage = index; var self = this; var delay = this.options.pageFlipDuration * 1000 / 6; if (typeof(instant) != 'undefined' && instant) { // delay = 0; // for(var i=0;i self.rightIndex) { while (self.rightIndex < index) this.nextPageInstant() } else { while (self.rightIndex > index) this.prevPageInstant() } this.updateBookPosition() this.turnPageComplete() this.updateHtmlLayer() return; } if (this.rightIndex > index) { delay = 1 / (this.rightIndex - index) * this.options.pageFlipDuration * 1000 / 6; if (this.rightIndex - index > 10) delay = 0 if (this.rightIndex - 2 > index) { this.prevPage(false); if (delay > 0) setTimeout(function() { self.goToPage(index, instant) }, delay); else self.goToPage(index, instant); } else { this.prevPage(); setTimeout(function() { if (typeof(instant) != 'undefined' && instant) { for (var i = 0; i < self.pages.length; i++) { self.pages[i].duration = self.options.pageFlipDuration; } } self.turnPageComplete() }, delay); } } else if (this.rightIndex < index) { delay = -1 / (this.rightIndex - index) * this.options.pageFlipDuration * 1000 / 6; if (this.rightIndex - index < -10) delay = 0 if ((this.rightIndex + 2) < index) { this.nextPage(false); if (delay > 0) setTimeout(function() { self.goToPage(index, instant) }, delay); else self.goToPage(index, instant); } else { this.nextPage(); setTimeout(function() { if (typeof(instant) != 'undefined' && instant) { for (var i = 0; i < self.pages.length; i++) { self.pages[i].duration = self.options.pageFlipDuration; } } self.turnPageComplete() }, delay); } } }; FLIPBOOK.BookWebGL.prototype.nextPageInstant = function(load) { if (this.flippedright == 0) return; // if(!this.nextEnabled) return // if flipping in opposite direction already - return var i; for (i = 0; i < this.pages.length; i++) { if (this.pages[i].flippingRight) return; } if (this.view == 1) { if (this.isFocusedLeft()) { this.focusRight(0); return } else { this.focusLeft(0, 0) } } else { if (this.flippedright == 1) this.focusLeft(0) else this.focusBoth(0) } var page = this.pages[this.pages.length - this.flippedright]; page.flipLeftInstant(); this.flippedleft++; this.flippedright--; this.setRightIndex(this.rightIndex + 2) this.updateBookPosition() }; FLIPBOOK.BookWebGL.prototype.setRightIndex = function(value) { this.rightIndex = value }, FLIPBOOK.BookWebGL.prototype.prevPageInstant = function(load) { if (this.flippedleft == 0) return; // if(!this.prevEnabled) return var i; for (i = 0; i < this.pages.length; i++) { if (this.pages[i].flippingLeft) return; } if (this.view == 1) { if (this.isFocusedRight()) { this.focusLeft(0); return } else { this.focusRight(0, 0) } } else { if (this.flippedleft == 1) this.focusRight(0) else this.focusBoth(0) } var page = this.pages[this.flippedleft - 1]; page.flipRightInstant(); this.flippedleft--; this.flippedright++; this.setRightIndex(this.rightIndex - 2) this.updateBookPosition() }; FLIPBOOK.BookWebGL.prototype.nextPage = function(load) { // this.nextPageInstant();return; if (this.flippedright == 0) return; this.clickedPage = null if (this.flippedright == 1 && this.pages.length * 2 > this.options.numPages && !this.options.rightToLeft) return; // if flipping in opposite direction already - return var i; var flipping = 0 for (i = 0; i < this.pages.length; i++) { if (this.pages[i].flippingRight) return; if (this.pages[i].flipping) flipping++; } var page = this.pages[this.pages.length - this.flippedright]; var prevPage = this.pages[page.index - 2]; var beforePrevPage = this.pages[page.index - 3]; var nextPage = this.pages[page.index + 1]; /* if(beforePrevPage) beforePrevPage.hideMat() if (nextPage) nextPage.showMat()*/ if (nextPage && flipping < 5) nextPage.showMat() if (this.view == 1) { if (this.isFocusedLeft()) { this.focusRight(300); return } else { this.focusLeft(600, 200) } } else { if (this.flippedright == 1) this.focusLeft(500) else this.focusBoth(500) } if (!page.flipping) { var self = this, onComplete; if (typeof(load) == 'undefined' || load) { onComplete = function(page) { self.turnPageComplete() } } page.flipLeft(onComplete); } this.flippedleft++; this.flippedright--; this.setRightIndex(this.rightIndex + 2) }; FLIPBOOK.BookWebGL.prototype.updateBookPosition = function() { if (this.view == 1) { this.isFocusedLeft() && this.rightIndex > 0 ? this.focusLeft() : this.focusRight() } else { if (this.rightIndex == 0) this.focusRight() else if (this.rightIndex >= this.options.numPages) this.focusLeft() else this.focusBoth() } this.centerContainer.position.y = 0 this.updateHtmlLayerPosition() this.needsUpdate = true }; FLIPBOOK.BookWebGL.prototype.updateHtmlLayerPosition = function() { if (this.htmlLayer) { this.htmlLayer.position.x = this.centerContainer.position.x this.htmlLayer.position.y = this.centerContainer.position.y } this.needsUpdate = true } FLIPBOOK.BookWebGL.prototype.turnPageComplete = function() { var self = this var pages = this.pages var main = this.options.main for (var i = 0; i < pages.length; i++) { var p = pages[i] if (p.flippingLeft || p.flippingRight) return } if (this.options.cornerCurl) { if (this.flippedleft == 0) this.pages[0].startCornerCurl() else this.pages[0].stopCornerCurl() } var rightPage = this.pages[this.flippedleft]; var leftPage = this.pages[this.flippedleft - 1]; var prevPage = this.pages[this.flippedleft - 2]; var nextPage = this.pages[this.flippedleft + 1]; var beforePrevPage = this.pages[this.flippedleft - 3]; var afterNextPage = this.pages[this.flippedleft + 2]; var updateHtmlLayer = this.updateHtmlLayer var loadMorePages = this.loadMorePages for (var i = 0; i < pages.length; i++) { var p = pages[i] if (p === rightPage || p === leftPage) p.showMat() if (leftPage && p.index < (leftPage.index - 2)) { p.hideMat() if (!this.options.pdfMode) p.disposeMat() } if (rightPage && p.index > (rightPage.index + 2)) { p.hideMat() if (!this.options.pdfMode) p.disposeMat() } } this.loadVisiblePages() this.options.main.turnPageComplete() } FLIPBOOK.BookWebGL.prototype.loadVisiblePages = function(){ var rightPage = this.pages[this.flippedleft]; var leftPage = this.pages[this.flippedleft - 1]; var prevPage = this.pages[this.flippedleft - 2]; var nextPage = this.pages[this.flippedleft + 1]; var beforePrevPage = this.pages[this.flippedleft - 3]; var afterNextPage = this.pages[this.flippedleft + 2]; var updateHtmlLayer = this.updateHtmlLayer var loadMorePages = this.loadMorePages var self = this var pages = this.pages var main = this.options.main main.setLoadingProgress(.1) if (leftPage) { leftPage.load("back", function(c) { if (rightPage) rightPage.load("front", function(c) { main.setLoadingProgress(1) updateHtmlLayer.call(self) loadMorePages.call(self) }); else { main.setLoadingProgress(1) updateHtmlLayer.call(self) loadMorePages.call(self) } }); } else { rightPage.load("front", function(c) { main.setLoadingProgress(1) updateHtmlLayer.call(self) loadMorePages.call(self) }); } } FLIPBOOK.BookWebGL.prototype.focusLeft = function(time, delay) { // if (this.isFocusedLeft()) return; var newX = this.options.pageWidth * .5 * this.centerContainer.scale.x this.moveToPos(newX, time, delay) }; FLIPBOOK.BookWebGL.prototype.focusRight = function(time, delay) { //if (this.isFocusedRight()) return; var newX = -this.options.pageWidth * .5 * this.centerContainer.scale.x this.moveToPos(newX, time, delay) }; FLIPBOOK.BookWebGL.prototype.focusBoth = function(time, delay) { if (this.isFocusedLeft() || this.isFocusedRight()) this.moveToPos(0, time, delay) }; FLIPBOOK.BookWebGL.prototype.moveToPos = function(pos, time, delay) { if (time && this.movingTo != pos && this.centerContainer.position.x != pos) { // console.log("tween") var self = this this.movingTo = pos var tween = new FLIPBOOK.TWEEN.Tween(this.centerContainer.position).to({ x: pos }, time) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.Out) .onUpdate(function() { self.updateHtmlLayerPosition() }) .onComplete(function() { self.movingTo = null self.updateHtmlLayerPosition() }) .delay(delay || 0) .start(); } else this.centerContainer.position.x = pos }; FLIPBOOK.BookWebGL.prototype.isFocusedLeft = function() { return this.centerContainer.position.x > 0 }; FLIPBOOK.BookWebGL.prototype.isFocusedRight = function() { return this.centerContainer.position.x < 0 }; FLIPBOOK.BookWebGL.prototype.prevPage = function(load) { // this.prevPageInstant();return; if (this.flippedleft == 0) return; this.clickedPage = null if (this.flippedleft == 1 && this.pages.length * 2 == this.options.numPages && this.options.rightToLeft && this.options.oddPages) return; var i; var flipping = 0 for (i = 0; i < this.pages.length; i++) { if (this.pages[i].flippingLeft) return; if (this.pages[i].flipping) flipping++; } var page = this.pages[this.flippedleft - 1]; var prevPage = this.pages[page.index - 1]; var nextPage = this.pages[page.index + 2]; var afterNextPage = this.pages[page.index + 3]; /* if (prevPage) prevPage.showMat() if(afterNextPage) afterNextPage.hideMat()*/ if (prevPage && flipping < 5) prevPage.showMat() if (this.view == 1) { if (this.isFocusedRight()) { this.focusLeft(300); return } else { this.focusRight(600, 200) } } else { if (this.flippedleft == 1) this.focusRight(500) else this.focusBoth(500) } if (!page.flipping) { var self = this, onComplete; if (typeof(load) == 'undefined' || load) { onComplete = function(page) { self.turnPageComplete() } } page.flipRight(onComplete); } this.flippedleft--; this.flippedright++; this.setRightIndex(this.rightIndex - 2) }; FLIPBOOK.BookWebGL.prototype.firstPage = function() { }; FLIPBOOK.BookWebGL.prototype.flipFinnished = function() { // this.pages[this.flippedleft].load(); // this.pages[this.flippedleft+1].load(); // console.log("flip finnished"); // this.pages[1].load(); //console.log('flip finnished') this.updateHtmlLayer() this.needsUpdate = true }; FLIPBOOK.BookWebGL.prototype.lastPage = function() { }; FLIPBOOK.BookWebGL.prototype.updateVisiblePages = function() { }; FLIPBOOK.BookWebGL.prototype.loadMorePages = function() { var spreadsToLoadF = this.options.loadPagesF var spreadsToLoadB = this.options.loadPagesB var rightPage = this.pages[this.flippedleft]; var leftPage = this.pages[this.flippedleft - 1]; for (var i = 0; i < spreadsToLoadF; i++) { leftPage = this.pages[this.flippedleft + i]; if (leftPage) leftPage.load("back", function() {}) rightPage = this.pages[this.flippedleft + 1 + i]; if (rightPage) rightPage.load("front", function() {}) } for (var i = 0; i < spreadsToLoadB; i++) { leftPage = this.pages[this.flippedleft - 2 + i]; if (leftPage) leftPage.load("back", function() {}) rightPage = this.pages[this.flippedleft - 1 + i]; if (rightPage) rightPage.load("front", function() {}) } } FLIPBOOK.BookWebGL.prototype.updateHtmlLayer = function() { if (!this.htmlLayer) return; for (var i = 0; i < this.pages.length; i++) { if (this.pages[i].flipping) return } //flip finnished //show left and right html content /* if(this.rightIndex == this.htmlContentRightIndex) return;*/ this.htmlContentRightIndex = this.rightIndex; this.htmlLayerVisible = false var R = this.options.rightToLeft ? this.options.pages.length - this.rightIndex - 1 : this.rightIndex var L = this.options.rightToLeft ? R + 1 : R - 1 if (this.options.doublePage) { //cover if (this.rightIndex == 0) { var html = this.options.pages[R].htmlContent this.$pageL.hide() this.$pageC.hide() if (html) { this.$pageRInner.empty() var content = jQuery(html).appendTo(this.$pageRInner) this.$pageR.show() this.htmlLayerVisible = true } else { this.$pageR.hide() } //back cover } else if (this.rightIndex == this.pages.length * 2) { var html = this.options.pages[L].htmlContent this.$pageR.hide() this.$pageC.hide() if (html) { this.$pageLInner.empty(); var content = jQuery(html).appendTo(this.$pageLInner); this.$pageL.show(); this.htmlLayerVisible = true; } else { this.$pageL.hide() } //spreads } else { this.$pageL.hide() this.$pageR.hide() var html = this.options.pages[L].htmlContent || this.options.pages[R].htmlContent if (html) { this.$pageCInner.empty() var content = jQuery(html).appendTo(this.$pageCInner) this.$pageC.show() this.htmlLayerVisible = true } else { this.$pageC.hide() } } } else { this.$pageC.hide() if (this.rightIndex == 0) { this.$pageL.hide() } else { //console.log(this.rightIndex,R,L) if (this.options.pages[L].htmlContent) { this.$pageLInner.empty(); var content = jQuery(this.options.pages[L].htmlContent).appendTo(this.$pageLInner); this.$pageL.show(); this.htmlLayerVisible = true; } else { this.$pageL.hide() } } if (this.rightIndex == this.pages.length * 2) { this.$pageR.hide() } else { //console.log(this.rightIndex,R,L) if (this.options.pages[R].htmlContent) { this.$pageRInner.empty() var content = jQuery(this.options.pages[R].htmlContent).appendTo(this.$pageRInner) this.$pageR.show() this.htmlLayerVisible = true } else { this.$pageR.hide() } } } this.updateTool() }; FLIPBOOK.BookWebGL.prototype.updateTool = function() { if(this.options.main.tool == "toolSelect"){ jQuery(".flipbook-textLayer").css("pointer-events","auto").removeClass(".flipbook-noselect") }else{ jQuery(".flipbook-textLayer").css("pointer-events","none").addClass(".flipbook-noselect") } } FLIPBOOK.BookWebGL.prototype.onZoom = function() { // var pageSize = this.zoom * this.model.wrapperH // this.options.pageTextureSize = pageSize return var self = this if (this.enabled) setTimeout(function() { /*for (var i = 0; i < self.pages.length; i++) { self.pages[i].loaded = false }*/ /*var rightPage = self.pages[self.flippedleft]; var leftPage = self.pages[self.flippedleft - 1]; if (rightPage) rightPage.load('front',2048); if (leftPage) leftPage.load('back',2048);*/ /*console.log(leftPage, rightPage)*/ self.turnPageComplete() }, 100) }; FLIPBOOK.BookWebGL.prototype.render = function(rendering) { var self = this; self.rendering = rendering; }; FLIPBOOK.BookWebGL.prototype.zoomTo = function(amount, time, x, y) { // console.log("zoom to ",amount) if (this.zooming) return; if (typeof(time) === 'undefined') time = 0; var newCenter = {x:0,y:0} if (typeof x != 'undefined' && typeof y != 'undefined') { var ph = this.zoom * this.wrapper.clientHeight var phNew = amount * this.wrapper.clientHeight var scaleFactor = ph / 1000 var scaleFactorNew = phNew / 1000 var zoomFactor = amount / this.zoom var center = this.centerContainer.position var focus = { x: (x - this.wrapper.clientWidth / 2) / scaleFactor - center.x, y: (-y + this.wrapper.clientHeight / 2) / scaleFactor - center.y } var focusNew = { x: (x - this.wrapper.clientWidth / 2) / scaleFactorNew - center.x, y: (-y + this.wrapper.clientHeight / 2) / scaleFactorNew - center.y } newCenter = center newCenter.x = center.x - (focus.x - focusNew.x) newCenter.y = center.y - (focus.y - focusNew.y) } var self = this; newZoom = amount > this.options.zoomMax ? this.options.zoomMax : amount; newZoom = amount < this.options.zoomMin ? this.options.zoomMin : amount; if (newZoom == this.options.zoom) { //reset book position var o = this.options; var focusedLeft = this.isFocusedLeft() if (this.view == 1) { focusedLeft ? this.focusLeft() : this.focusRight(); } else { this.centerContainer.position.set(0, 0, 0); } this.updateBookPosition() } time = 0 if (time > 0) { if (!this.zooming) { this.zooming = true; // console.log(self.centerContainer.position) new FLIPBOOK.TWEEN.Tween(this).to({ zoom: newZoom, }, time) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.In) .onUpdate(this.updateCameraPosition) .onComplete(function() { self.zooming = false self.onZoom() }) .start(); new FLIPBOOK.TWEEN.Tween(this.centerContainer.position).to({ x:newCenter.x, y:newCenter.y }, time) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.In) .onUpdate(function(){ // console.log(self.centerContainer.position) }) .onComplete(function() { // console.log(self.centerContainer.position) }) .start(); if(this.htmlLayer) new FLIPBOOK.TWEEN.Tween(this.htmlLayer.position).to({ x:newCenter.x, y:newCenter.y }, time) .easing(FLIPBOOK.TWEEN.Easing.Sinusoidal.In) .start(); } } else { this.zoom = newZoom this.centerContainer.position.set(newCenter.x, newCenter.y, 0); self.updateHtmlLayerPosition() this.updateCameraPosition() //this.centerContainer.position.set(newCenter.x, newCenter.y, 0); this.zooming = false self.onZoom() } if (amount <= 1 && amount <= this.zoom) this.updateBookPosition() this.options.main.onZoom(newZoom) this.turnPageComplete() }; FLIPBOOK.BookWebGL.prototype.tiltTo = function(amount) { // if(this.tilting) // return; var self = this, factor = .3; var newTilt = this.tilt + amount * factor; newTilt = newTilt > this.options.tiltMax ? this.options.tiltMax : newTilt; newTilt = newTilt < this.options.tiltMin ? this.options.tiltMin : newTilt; this.tilt = newTilt; this.updateCameraPosition(); // this.tilting = true; // new TWEEN.Tween(this).to({tilt:newTilt}, 400) // .easing( TWEEN.Easing.Sinusoidal.EaseInOut) // .onUpdate(this.updateCameraPosition) // .onComplete(function(){self.tilting = false}) // .start(); }; FLIPBOOK.BookWebGL.prototype.panTo = function(amount) { // if(this.tilting) // return; var self = this, factor = .2; var newPan = this.pan - amount * factor; newPan = newPan > this.options.panMax ? this.options.panMax : newPan; newPan = newPan < this.options.panMin ? this.options.panMin : newPan; this.pan = newPan; this.updateCameraPosition(); }; FLIPBOOK.BookWebGL.prototype._bind = function(type, el, bubble) { (el || this.wrapper).addEventListener(type, this, !!bubble); }; FLIPBOOK.BookWebGL.prototype.handleEvent = function(e) { var self = this; // e.preventDefault() //console.log(e); switch (e.type) { case 'mousedown': self._start(e); break; case 'touchstart': self._touchstart(e); break; case 'touchmove': self._touchmove(e); break; case 'mousemove': self._move(e); break; case 'mouseout': case 'mouseup': case 'touchend': self._end(e); break; } }; FLIPBOOK.BookWebGL.prototype.resetCameraPosition = function() { this.centerContainer.position.set(0, 0, 0); }; FLIPBOOK.BookWebGL.prototype._start = function(e) { this.mouseDown = true; this.onMouseMove = "" this.pointX = e.pageX; this.pointY = e.pageY; this.startPoint = e; var vector = this._getVector(e); vector.unproject(this.Camera) var raycaster = new THREE.Raycaster(this.Camera.position, vector.sub(this.Camera.position).normalize()); var intersects = raycaster.intersectObjects(this.pages, true); this.pageMouseDown = (intersects.length > 0); var canvasClicked = e.target.nodeName.toLowerCase() == "canvas" if (canvasClicked && !this.pageMouseDown && this.options.lightBox && this.options.lightboxCloseOnClick) { this.options.main.lightbox.closeLightbox() } }; FLIPBOOK.BookWebGL.prototype._touchstart = function(e) { if (e.touches.length > 1) { this.touches = [] this.touches[0] = { pageX: e.touches[0].pageX, pageY: e.touches[0].pageY } this.touches[1] = { pageX: e.touches[1].pageX, pageY: e.touches[1].pageY } var c1 = Math.abs(this.touches[0].pageX - this.touches[1].pageX); var c2 = Math.abs(this.touches[0].pageY - this.touches[1].pageY); this.touchesDistStart = Math.sqrt(c1 * c1 + c2 * c2); return; } e = e.touches[0] this._start(e) }; FLIPBOOK.BookWebGL.prototype._getVector = function(e) { var w = jQuery(this.canvas).width(), h = jQuery(this.canvas).height(), // x = e.clientX - jQuery(this.canvas).offset().left, x = e.pageX - jQuery(this.canvas).offset().left, // y = e.clientY - jQuery(this.canvas).offset().top, y = e.pageY - jQuery(this.canvas).offset().top, cx = jQuery(this.canvas).offset().x, cy = jQuery(this.canvas).offset().y; return new THREE.Vector3((x / w) * 2 - 1, -(y / h) * 2 + 1, 0.5); }; FLIPBOOK.BookWebGL.prototype._touchmove = function(e) { //e.preventDefault() var self = this; if (e.touches.length > 1) { return this.touches = [] this.touches[0] = { pageX: e.touches[0].pageX, pageY: e.touches[0].pageY } this.touches[1] = { pageX: e.touches[1].pageX, pageY: e.touches[1].pageY } var c1 = Math.abs(this.touches[0].pageX - this.touches[1].pageX); var c2 = Math.abs(this.touches[0].pageY - this.touches[1].pageY); this.touchesDist = Math.sqrt(c1 * c1 + c2 * c2); var newZoom = this.zoom * Math.pow(this.touchesDist / this.touchesDistStart, .2) if (newZoom >= this.options.zoomMin && newZoom <= this.options.zoomMax) this.zoomTo(newZoom, 20, this.touches[0].pageX / 2 + this.touches[1].pageX / 2, this.touches[0].pageY / 2 + this.touches[1].pageY / 2) this.updateCameraPosition() return; } e = e.touches[0]; this._move(e) }; FLIPBOOK.BookWebGL.prototype._move = function(e) { // return var vector = this._getVector(e); vector.unproject(this.Camera) var raycaster = new THREE.Raycaster(this.Camera.position, vector.sub(this.Camera.position).normalize()); var intersects = raycaster.intersectObjects(this.pages, true); /*if(intersects.length > 0){ this.wrapper.style.cursor = 'pointer'; }else{ this.wrapper.style.cursor = 'auto'; }*/ var point = e, deltaX = (point.pageX - this.pointX) * .5, deltaY = (point.pageY - this.pointY) * .5; this.pointX = point.pageX; this.pointY = point.pageY; if (!this.mouseDown) { this.onMouseMove = ""; if (this.options.rotateCameraOnMouseMove) { this.tilt = this.options.tiltMin2 + (this.options.tiltMax2 - this.options.tiltMin2) * (1 - this.pointY / jQuery(this.canvas).height()); this.pan = this.options.panMin2 + (this.options.panMax2 - this.options.panMin2) * this.pointX / jQuery(this.canvas).width(); this.updateCameraPosition(); } return; } if (intersects.length > 0) { if (this.onMouseMove == "") { if (this.zoom > 1) this.onMouseMove = "scroll"; } } else { if (this.onMouseMove == "") this.onMouseMove = "rotate"; } if (this.onMouseMove == "scroll") { if(this.options.main.tool == "toolSelect") return if (deltaX != 0 || deltaY != 0) { this.moved = true this.centerContainer.position.x += (10000 * deltaX / (this.cameraZ * this.zoom * this.zoom)); this.centerContainer.position.y -= (10000 * deltaY / (this.cameraZ * this.zoom * this.zoom)); } // this.centerContainer.position.x = 100 this.updateHtmlLayerPosition() } else if (this.onMouseMove == "rotate") { var right = this.getRightPage() var left = this.getLeftPage() if (!this.options.rotateCameraOnMouseMove && this.options.rotateCameraOnMouseDrag && (!left || !left.dragging) && (!right || !right.dragging)) { this.tiltTo(deltaY); //this.panTo(deltaX); } } }; FLIPBOOK.BookWebGL.prototype._end = function(e) { this.mouseDown = false; if (typeof(e.changedTouches) != 'undefined') e = e.changedTouches[0] this.pointX = e.pageX; this.pointY = e.pageY; this.endPoint = e; var vector = this._getVector(this.endPoint); vector.unproject(this.Camera) var raycaster = new THREE.Raycaster(this.Camera.position, vector.sub(this.Camera.position).normalize()); var intersects = raycaster.intersectObjects(this.pages, true); /*if(intersects.length > 0){ if(this.pageMouseDown && !this.moved ){ var intersect = intersects[0]; var page = intersect.object; if(page.flipping || page.dragging) return; if(this.getLeftPage() && this.getLeftPage().dragging ) return; if(this.getRightPage() && this.getRightPage().dragging ) return; if(page.isFlippedLeft) this.prevPage(); else this.nextPage(); } }*/ if (intersects.length > 0) { if (this.pageMouseDown && !this.moved) { var intersect = intersects[0]; this.clickedPage = intersect.object.parent; } } this.pageMouseDown = false; this.moved = false }; FLIPBOOK.BookWebGL.prototype.moveCamera = function(deltaX, deltaY) { }; FLIPBOOK.BookWebGL.prototype.enable = function() { if (this.enabled) { this.onResize(); return; } this.enabled = true; if (!this.initialized) { this.init3d(); this.createPages(); this.rendering = false; // this.disable(); this.onResize(); } this.render(true); this.onResize(); }; FLIPBOOK.BookWebGL.prototype.disable = function() { this.enabled = false; this.render(false); }; } { /* MOD3D */ /** * * http://github.com/foo123/MOD3 * * MOD3 3D Modifier Library (port of actionscript AS3Mod to javascript) * supports: THREE.js, J3D, Copperlicht, Pre3D * * @author Nikos M. * @url http://nikos-web-development.netai.net/ * **/ var MOD3 = MOD3 || {}; (function(a) { a.Constants = { PI: Math.PI, invPI: 1 / Math.PI, halfPI: 0.5 * Math.PI, doublePI: 2 * Math.PI, toRad: 1 / 180 * Math.PI, toDeg: 1 / 180 * Math.PI }; a.ModConstant = { LEFT: -1, RIGHT: 1, NONE: 0, X: 1, Y: 2, Z: 4 } })(MOD3); (function(a) { var c = a.Constants; a.XMath = {}; a.XMath.normalize = function(c, d, e) { return d - c == 0 ? 1 : a.XMath.trim(0, 1, (e - c) / d) }; a.XMath.toRange = function(a, c, e) { return c - a == 0 ? 0 : a + (c - a) * e }; a.XMath.inRange = function(a, c, e, f) { typeof f == "undefined" && (f = !1); return f ? e >= a && e <= c : e > a && e < c }; a.XMath.sign = function(a, c) { typeof c == "undefined" && (c = 0); return 0 == a ? c : a > 0 ? 1 : -1 }; a.XMath.trim = function(a, c, e) { return Math.min(c, Math.max(a, e)) }; a.XMath.wrap = function(a, c, e) { return e < a ? e + (c - a) : e >= c ? e - (c - a) : e }; a.XMath.degToRad = function(a) { return a * c.toRad }; a.XMath.radToDeg = function(a) { return a * c.toDeg }; a.XMath.presicion = function(a, c) { var e = Math.pow(10, c); return Math.round(a * e) / e }; a.XMath.uceil = function(a) { return a < 0 ? Math.floor(a) : Math.ceil(a) } })(MOD3); (function(a) { a.Range = function(a, b) { this.start = 0; this.end = 1; if (typeof a != "undefined") this.start = a; if (typeof b != "undefined") this.end = b }; a.Range.prototype.getSize = function() { return this.end - this.start }; a.Range.prototype.move = function(a) { this.start += a; this.end += a }; a.Range.prototype.isIn = function(a) { return a >= this.start && a <= this.end }; a.Range.prototype.normalize = function(c) { return a.XMath.normalize(this.start, this.end, c) }; a.Range.prototype.toRange = function(c) { return a.XMath.toRange(this.start, this.end, c) }; a.Range.prototype.trim = function(c) { return a.XMath.trim(this.start, this.end, c) }; a.Range.prototype.interpolate = function(a, b) { return this.toRange(b.normalize(a)) }; a.Range.prototype.toString = function() { return "[" + this.start + " - " + this.end + "]" } })(MOD3); (function(a) { a.Phase = function(a) { this.value = 0; if (typeof a != "undefined") this.value = a }; a.Phase.prototype.getPhasedValue = function() { return Math.sin(this.value) }; a.Phase.prototype.getAbsPhasedValue = function() { return Math.abs(this.getPhasedValue()) }; a.Phase.prototype.getNormValue = function() { return (this.getPhasedValue() + 1) * 0.5 } })(MOD3); (function(a) { a.Point = function(a, b) { this.y = this.x = 0; if (typeof a != "undefined") this.x = a; if (typeof b != "undefined") this.y = b }; a.Point.prototype.clone = function() { return new a.Point(this.x, this.y) } })(MOD3); (function(a) { a.Matrix = function(a, b, d, e) { this.m11 = 1; this.m21 = this.m12 = 0; this.m22 = 1; if (typeof a != "undefined") this.m11 = a; if (typeof b != "undefined") this.m12 = b; if (typeof d != "undefined") this.m21 = d; if (typeof e != "undefined") this.m22 = e }; a.Matrix.prototype.rotate = function(a) { var b = Math.cos(a), a = Math.sin(a); this.m11 = b; this.m12 = -a; this.m21 = a; this.m22 = b; return this }; a.Matrix.prototype.scale = function(a, b) { this.m21 = this.m12 = 0; if (typeof a != "undefined") this.m22 = this.m11 = a; if (typeof b != "undefined") this.m22 = b; return this }; a.Matrix.prototype.multiply = function(a) { var b = this.m11, d = this.m12, e = this.m21, f = this.m22, g = a.m11, h = a.m12, i = a.m21, a = a.m22; this.m11 = b * g + d * i; this.m12 = b * h + d * a; this.m21 = e * g + f * i; this.m22 = e * h + f * a; return this }; a.Matrix.prototype.transformPoint = function(c) { return new a.Point(this.m11 * c.x + this.m12 * c.y, this.m21 * c.x + this.m22 * c.y) } })(MOD3); (function(a) { a.Vector3 = function(a, b, d) { this.z = this.y = this.x = null; this.x = a; this.y = b; this.z = d }; a.Vector3.ZERO = function() { return new a.Vector3(0, 0, 0) }; a.Vector3.dot = function(a, b) { return a.x * b.x + a.y * b.y + a.z * b.z }; a.Vector3.prototype.clone = function() { return new a.Vector3(this.x, this.y, this.z) }; a.Vector3.prototype.equals = function(a) { return this.x == a.x && this.y == a.y && this.z == a.z }; a.Vector3.prototype.zero = function() { this.x = this.y = this.z = 0 }; a.Vector3.prototype.negate = function() { return new a.Vector3(-this.x, -this.y, -this.z) }; a.Vector3.prototype.add = function(c) { return new a.Vector3(this.x + c.x, this.y + c.y, this.z + c.z) }; a.Vector3.prototype.subtract = function(c) { return new a.Vector3(this.x - c.x, this.y - c.y, this.z - c.z) }; a.Vector3.prototype.multiplyScalar = function(c) { return new a.Vector3(this.x * c, this.y * c, this.z * c) }; a.Vector3.prototype.multiply = function(c) { return new a.Vector3(this.x * c.x, this.y * c.y, this.z * c.z) }; a.Vector3.prototype.divide = function(c) { c = 1 / c; return new a.Vector3(this.x * c, this.y * c, this.z * c) }; a.Vector3.prototype.normalize = function() { var a = this.x, b = this.y, d = this.z, a = a * a + b * b + d * d; a > 0 && (a = 1 / Math.sqrt(a), this.x *= a, this.y *= a, this.z *= a) }; a.Vector3.prototype.getMagnitude = function() { var a = this.x, b = this.y, d = this.z; return Math.sqrt(a * a + b * b + d * d) }; a.Vector3.prototype.setMagnitude = function(a) { this.normalize(); this.x *= a; this.y *= a; this.z *= a }; a.Vector3.prototype.toString = function() { return "[" + this.x + " , " + this.y + " , " + this.z + "]" }; a.Vector3.prototype.sum = function(a, b) { return a.add(b) }; a.Vector3.prototype.dot = function(a, b) { return a.x * b.x + a.y * b.y + a.z * b.z }; a.Vector3.prototype.cross = function(c, b) { var d = c.x, e = c.y, f = c.z, g = b.x, h = b.y, i = b.z; return new a.Vector3(e * i - f * h, f * g - d * i, d * h - e * g) }; a.Vector3.prototype.distance = function(a, b) { var d = a.x - b.x, e = a.y - b.y, f = a.z - b.z; return Math.sqrt(d * d + e * e + f * f) } })(MOD3); (function(a) { a.Matrix4 = function(a, b, d, e, f, g, h, i, n, m, o, k, p, l, j, q) { this.n11 = 1; this.n21 = this.n14 = this.n13 = this.n12 = 0; this.n22 = 1; this.n32 = this.n31 = this.n24 = this.n23 = 0; this.n33 = 1; this.n43 = this.n42 = this.n41 = this.n34 = 0; this.n44 = 1; if (typeof a != "undefined") this.n11 = a; if (typeof b != "undefined") this.n12 = b; if (typeof d != "undefined") this.n13 = d; if (typeof e != "undefined") this.n14 = e; if (typeof f != "undefined") this.n21 = f; if (typeof g != "undefined") this.n22 = g; if (typeof h != "undefined") this.n23 = h; if (typeof i != "undefined") this.n24 = i; if (typeof n != "undefined") this.n31 = n; if (typeof m != "undefined") this.n32 = m; if (typeof o != "undefined") this.n33 = o; if (typeof k != "undefined") this.n34 = k; if (typeof p != "undefined") this.n41 = p; if (typeof l != "undefined") this.n42 = l; if (typeof j != "undefined") this.n43 = j; if (typeof q != "undefined") this.n44 = q }; a.Matrix4.prototype.translationMatrix = function(a, b, d) { this.n14 = a; this.n24 = b; this.n34 = d; return this }; a.Matrix4.prototype.scaleMatrix = function(a, b, d) { this.n11 = a; this.n22 = b; this.n33 = d; return this }; a.Matrix4.prototype.rotationMatrix = function(a, b, d, e) { var f = Math.cos(e), g = Math.sin(e), e = 1 - f, h = a * b * e, i = b * d * e, n = a * d * e, m = g * d, o = g * b; g *= a; this.n11 = f + a * a * e; this.n12 = -m + h; this.n13 = o + n; this.n14 = 0; this.n21 = m + h; this.n22 = f + b * b * e; this.n23 = -g + i; this.n24 = 0; this.n31 = -o + n; this.n32 = g + i; this.n33 = f + d * d * e; this.n34 = 0; return this }; a.Matrix4.prototype.calculateMultiply = function(a, b) { var d = a.n11, e = b.n11, f = a.n21, g = b.n21, h = a.n31, i = b.n31, n = a.n12, m = b.n12, o = a.n22, k = b.n22, p = a.n32, l = b.n32, j = a.n13, q = b.n13, r = a.n23, t = b.n23, s = a.n33, u = b.n33, v = a.n14, w = b.n14, z = a.n24, x = b.n24, A = a.n34, y = b.n34; this.n11 = d * e + n * g + j * i; this.n12 = d * m + n * k + j * l; this.n13 = d * q + n * t + j * u; this.n14 = d * w + n * x + j * y + v; this.n21 = f * e + o * g + r * i; this.n22 = f * m + o * k + r * l; this.n23 = f * q + o * t + r * u; this.n24 = f * w + o * x + r * y + z; this.n31 = h * e + p * g + s * i; this.n32 = h * m + p * k + s * l; this.n33 = h * q + p * t + s * u; this.n34 = h * w + p * x + s * y + A }; a.Matrix4.prototype.multiply = function(a, b) { this.calculateMultiply(a, b); return this }; a.Matrix4.prototype.multiplyVector = function(a, b) { var d = b.x, e = b.y, f = b.z; b.x = d * a.n11 + e * a.n12 + f * a.n13 + a.n14; b.y = d * a.n21 + e * a.n22 + f * a.n23 + a.n24; b.z = d * a.n31 + e * a.n32 + f * a.n33 + a.n34 } })(MOD3); (function(a) { a.VertexProxy = function(a) { this.originalZ = this.originalY = this.originalX = this.ratioZ = this.ratioY = this.ratioX = null; if (typeof a != "undefined") this.vertex = a }; a.VertexProxy.prototype.setVertex = function() {}; a.VertexProxy.prototype.setRatios = function(a, b, d) { this.ratioX = a; this.ratioY = b; this.ratioZ = d }; a.VertexProxy.prototype.setOriginalPosition = function(a, b, d) { this.originalX = a; this.originalY = b; this.originalZ = d }; a.VertexProxy.prototype.getX = function() {}; a.VertexProxy.prototype.getY = function() {}; a.VertexProxy.prototype.getZ = function() {}; a.VertexProxy.prototype.setX = function() {}; a.VertexProxy.prototype.setY = function() {}; a.VertexProxy.prototype.setZ = function() {}; a.VertexProxy.prototype.getValue = function(c) { switch (c) { case a.ModConstant.X: return this.getX(); case a.ModConstant.Y: return this.getY(); case a.ModConstant.Z: return this.getZ() } return 0 }; a.VertexProxy.prototype.setValue = function(c, b) { switch (c) { case a.ModConstant.X: this.setX(b); break; case a.ModConstant.Y: this.setY(b); break; case a.ModConstant.Z: this.setZ(b) } }; a.VertexProxy.prototype.getRatio = function(c) { switch (c) { case a.ModConstant.X: return this.ratioX; case a.ModConstant.Y: return this.ratioY; case a.ModConstant.Z: return this.ratioZ } return -1 }; a.VertexProxy.prototype.getOriginalValue = function(c) { switch (c) { case a.ModConstant.X: return this.originalX; case a.ModConstant.Y: return this.originalY; case a.ModConstant.Z: return this.originalZ } return 0 }; a.VertexProxy.prototype.reset = function() { this.setX(this.originalX); this.setY(this.originalY); this.setZ(this.originalZ) }; a.VertexProxy.prototype.collapse = function() { this.originalX = this.getX(); this.originalY = this.getY(); this.originalZ = this.getZ() }; a.VertexProxy.prototype.getVector = function() { return new a.Vector3(this.getX(), this.getY(), this.getZ()) }; a.VertexProxy.prototype.setVector = function(a) { this.setX(a.x); this.setY(a.y); this.setZ(a.z) }; a.VertexProxy.prototype.getRatioVector = function() { return new a.Vector3(this.ratioX, this.ratioY, this.ratioZ) } })(MOD3); (function(a) { a.FaceProxy = function() { this.vertices = [] }; a.FaceProxy.prototype.addVertex = function(a) { this.vertices.push(a) }; a.FaceProxy.prototype.getVertices = function() { return this.vertices } })(MOD3); (function(a) { a.MeshProxy = function() { this.depth = this.height = this.width = this.minAxis = this.midAxis = this.maxAxis = this.minZ = this.minY = this.minX = this.maxZ = this.maxY = this.maxX = null; this.vertices = []; this.faces = []; this.mesh = null }; a.MeshProxy.prototype.getVertices = function() { return this.vertices }; a.MeshProxy.prototype.getFaces = function() { return this.faces }; a.MeshProxy.prototype.analyzeGeometry = function() { for (var c = this.getVertices(), b = c.length, d = b, e, f, g, h, i, n, m, o, k, p, l = !0, j = Math.min, q = Math.max; --d >= 0;) e = c[d], f = e.getX(), g = e.getY(), h = e.getZ(), l ? (i = n = f, m = o = g, k = p = h, l = !1) : (i = j(i, f), m = j(m, g), k = j(k, h), n = q(n, f), o = q(o, g), p = q(p, h)), e.setOriginalPosition(f, g, h); f = n - i; g = o - m; depth = p - k; this.width = f; this.height = g; this.depth = depth; this.minX = i; this.maxX = n; this.minY = m; this.maxY = o; this.minZ = k; this.maxZ = p; d = q(f, q(g, depth)); j = j(f, j(g, depth)); if (d == f && j == g) this.minAxis = a.ModConstant.Y, this.midAxis = a.ModConstant.Z, this.maxAxis = a.ModConstant.X; else if (d == f && j == depth) this.minAxis = a.ModConstant.Z, this.midAxis = a.ModConstant.Y, this.maxAxis = a.ModConstant.X; else if (d == g && j == f) this.minAxis = a.ModConstant.X, this.midAxis = a.ModConstant.Z, this.maxAxis = a.ModConstant.Y; else if (d == g && j == depth) this.minAxis = a.ModConstant.Z, this.midAxis = a.ModConstant.X, this.maxAxis = a.ModConstant.Y; else if (d == depth && j == f) this.minAxis = a.ModConstant.X, this.midAxis = a.ModConstant.Y, this.maxAxis = a.ModConstant.Z; else if (d == depth && j == g) this.minAxis = a.ModConstant.Y, this.midAxis = a.ModConstant.X, this.maxAxis = a.ModConstant.Z; for (d = b; --d >= 0;) e = c[d], e.setRatios((e.getX() - i) / f, (e.getY() - m) / g, (e.getZ() - k) / depth) }; a.MeshProxy.prototype.resetGeometry = function() { for (var a = this.getVertices(), b = a.length; --b >= 0;) a[b].reset() }; a.MeshProxy.prototype.collapseGeometry = function() { for (var a = this.getVertices(), b = a.length; --b >= 0;) a[b].collapse(); this.analyzeGeometry() }; a.MeshProxy.prototype.getMin = function(c) { switch (c) { case a.ModConstant.X: return this.minX; case a.ModConstant.Y: return this.minY; case a.ModConstant.Z: return this.minZ } return -1 }; a.MeshProxy.prototype.getMax = function(c) { switch (c) { case a.ModConstant.X: return this.maxX; case a.ModConstant.Y: return this.maxY; case a.ModConstant.Z: return this.maxZ } return -1 }; a.MeshProxy.prototype.getSize = function(c) { switch (c) { case a.ModConstant.X: return this.width; case a.ModConstant.Y: return this.height; case a.ModConstant.Z: return this.depth } return -1 }; a.MeshProxy.prototype.setMesh = function(a) { this.mesh = a; this.vertices = []; this.faces = [] }; a.MeshProxy.prototype.postApply = function() {}; a.MeshProxy.prototype.updateMeshPosition = function() {} })(MOD3); (function(a) { a.Modifier = function() { this.mod = null }; a.Modifier.prototype.setModifiable = function(a) { this.mod = a }; a.Modifier.prototype.getVertices = function() { return this.mod.getVertices() }; a.Modifier.prototype.apply = function() {} })(MOD3); (function(a) { a.Library3d = function() { this.id = ""; this.vertexClass = this.meshClass = null } })(MOD3); (function(a) { a.PluginFactory = {}; a.PluginFactory.getMeshProxy = function(a) { return new a.meshClass } })(MOD3); (function(a) { a.ModifierStack = function(c, b) { this.lib3d = c; this.stack = this.baseMesh = null; this.baseMesh = a.PluginFactory.getMeshProxy(c); this.baseMesh.setMesh(b); this.baseMesh.analyzeGeometry(); this.stack = [] }; a.ModifierStack.prototype.addModifier = function(a) { a.setModifiable(this.baseMesh); this.stack.push(a) }; a.ModifierStack.prototype.apply = function() { this.baseMesh.resetGeometry(); for (var a = this.stack, b = a.length, d = 0; d < b;) a[d++].apply(); this.baseMesh.postApply() }; a.ModifierStack.prototype.collapse = function() { this.apply(); this.baseMesh.collapseGeometry(); this.stack = [] }; a.ModifierStack.prototype.clear = function() { this.stack = [] }; a.ModifierStack.prototype.getMeshInfo = function() { return this.baseMesh } })(MOD3); (function(a) { a.Pivot = function(c, b, d) { this.pivot = new a.Vector3(c, b, d) }; a.Pivot.prototype = new a.Modifier; a.Pivot.prototype.constructor = a.Pivot; a.Pivot.prototype.setMeshCenter = function() { var c = this.mod; this.pivot = new a.Vector3(-(c.minX + 0.5 * c.width), -(c.minY + 0.5 * c.height), -(c.minZ + 0.5 * c.depth)) }; a.Pivot.prototype.apply = function() { for (var a = this.mod.getVertices(), b = a.length, d = this.pivot, e, f; --b >= 0;) e = a[b], f = e.getVector().clone(), e.setVector(f.add(d)); this.mod.updateMeshPosition(d.clone().negate()) } })(MOD3); (function(a) { a.Bend = function(c, b, d) { this.diagAngle = this.angle = this.offset = this.force = null; this.constraint = a.ModConstant.NONE; this.m2 = this.m1 = this.origin = this.height = this.width = this.mid = this.min = this.max = null; this.switchAxes = !1; this.force = c; this.offset = b; this.setAngle(d) }; a.Bend.prototype = new a.Modifier; a.Bend.prototype.constructor = a.Bend; a.Bend.prototype.setAngle = function(c) { this.angle = c; this.m1 = new a.Matrix; this.m1.rotate(c); this.m2 = new a.Matrix; this.m2.rotate(-c) }; a.Bend.prototype.setModifiable = function(c) { a.Modifier.prototype.setModifiable.call(this, c); this.max = this.switchAxes ? this.mod.midAxis : this.mod.maxAxis; this.min = this.mod.minAxis; this.mid = this.switchAxes ? this.mod.maxAxis : this.mod.midAxis; this.width = this.mod.getSize(this.max); this.height = this.mod.getSize(this.mid); this.origin = this.mod.getMin(this.max); this.diagAngle = Math.atan(this.width / this.height) }; a.Bend.prototype.apply = function() { if (this.force != 0) for (var c = this.mod.getVertices(), b = c.length, d = this.width, e = this.offset, f = this.origin, g = this.max, h = this.min, i = this.mid, n = this.m1, m = this.m2, o = f + d * e, k = d / Math.PI / this.force, p = a.Constants.doublePI * (d / (k * a.Constants.doublePI)), l, j, q, r, t = 1 / d, s = a.Constants.halfPI, u = Math.sin, v = Math.cos; --b >= 0;) d = c[b], l = d.getValue(g), j = d.getValue(i), q = d.getValue(h), j = n.transformPoint(new a.Point(l, j)), l = j.x, j = j.y, r = (l - f) * t, this.constraint == a.ModConstant.LEFT && r <= e || this.constraint == a.ModConstant.RIGHT && r >= e || (r = s - p * e + p * r, l = u(r) * (k + q), r = v(r) * (k + q), q = l - k, l = o - r), j = m.transformPoint(new a.Point(l, j)), l = j.x, j = j.y, d.setValue(g, l), d.setValue(i, j), d.setValue(h, q) } })(MOD3); (function(a) { a.Bloat = function() { this.center = a.Vector3.ZERO(); this.radius = 0; this.a = 0.01; this.u = a.Vector3.ZERO() }; a.Bloat.prototype = new a.Modifier; a.Bloat.prototype.constructor = a.Bloat; a.Bloat.prototype.setRadius = function(a) { this.radius = Math.max(0, a) }; a.Bloat.prototype.setA = function(a) { this.a = Math.max(0, a) }; a.Bloat.prototype.apply = function() { for (var a = this.mod.getVertices(), b = a.length, d = this.center, e = this.radius, f = this.a, g, h; --b >= 0;) g = a[b], this.u.x = g.getX() - d.x, this.u.y = g.getY() - d.y, this.u.z = g.getZ() - d.z, h = this.u.getMagnitude(), this.u.setMagnitude(h + e * Math.exp(-h * f)), g.setX(this.u.x + d.x), g.setY(this.u.y + d.y), g.setZ(this.u.z + d.z) } })(MOD3); (function(a) { a.Twist = function(c) { this.vector = new a.Vector3(0, 1, 0); this.angle = c; this.center = a.Vector3.ZERO() }; a.Twist.prototype = new a.Modifier; a.Twist.prototype.constructor = a.Twist; a.Twist.prototype.apply = function() { this.vector.normalize(); for (var c = this.mod, b = c.getVertices(), d = b.length, e = this.vector, f = this.angle, g = this.center, c = 1 / (new a.Vector3(0.5 * c.maxX, 0.5 * c.maxY, 0.5 * c.maxZ)).getMagnitude() * f, g = -a.Vector3.dot(e, g), h; --d >= 0;) f = b[d], h = f.getX() * e.x + f.getY() * e.y + f.getZ() * e.z + g, this.twistPoint(f, h * c) }; a.Twist.prototype.twistPoint = function(c, b) { var d = (new a.Matrix4).translationMatrix(c.getX(), c.getY(), c.getZ()), d = (new a.Matrix4).multiply((new a.Matrix4).rotationMatrix(this.vector.x, this.vector.y, this.vector.z, b), d); c.setX(d.n14); c.setY(d.n24); c.setZ(d.n34) } })(MOD3); (function(a) { a.Skew = function(c) { this.force = 0; this.skewAxis = null; if (typeof c != "undefined") this.force = c; this.offset = 0.5; this.constraint = a.ModConstant.NONE; this.falloff = this.power = 1; this.swapAxes = this.oneSide = this.inverseFalloff = !1 }; a.Skew.prototype = new a.Modifier; a.Skew.prototype.constructor = a.Skew; a.Skew.prototype.setModifiable = function(c) { a.Modifier.prototype.setModifiable.call(this, c); this.skewAxis = this.skewAxis || this.mod.maxAxis }; a.Skew.prototype.apply = function() { for (var c = this.mod.getVertices(), b = c.length, d = this.constraint, e = this.skewAxis, f = this.offset, g = this.oneSide, h = this.inverseFalloff, i = this.falloff, n = 1 - i, m = this.power, o = this.force, k = this.getDisplaceAxis(), p, l, j; --b >= 0;) p = c[b], !(d == a.ModConstant.LEFT && p.getRatio(e) <= f) && !(d == a.ModConstant.RIGHT && p.getRatio(e) > f) && (l = p.getRatio(e) - f, g && (l = Math.abs(l)), j = p.getRatio(k), h && (j = 1 - j), j = i + j * n, l = Math.pow(Math.abs(l), m) * a.XMath.sign(l, 1), l = p.getValue(k) + o * l * j, p.setValue(k, l)) }; a.Skew.prototype.getDisplaceAxis = function() { switch (this.skewAxis) { case a.ModConstant.X: return this.swapAxes ? a.ModConstant.Z : a.ModConstant.Y; case a.ModConstant.Y: return this.swapAxes ? a.ModConstant.Z : a.ModConstant.X; case a.ModConstant.Z: return this.swapAxes ? a.ModConstant.Y : a.ModConstant.X; default: return 0 } } })(MOD3); (function(a) { a.Taper = function(c) { this.power = this.force = null; this.start = 0; this.end = 1; this.vector = new a.Vector3(1, 0, 1); this.vector2 = new a.Vector3(0, 1, 0); if (typeof c != "undefined") this.force = c; this.power = 1 }; a.Taper.prototype = new a.Modifier; a.Taper.prototype.constructor = a.Taper; a.Taper.prototype.setFalloff = function(a, b) { this.start = 0; this.end = 1; if (typeof a != "undefined") this.start = a; if (typeof b != "undefined") this.end = b }; a.Taper.prototype.apply = function() { for (var c = this.mod.getVertices(), b = c.length, d = this.vector, e = this.vector2, f = this.force, g = this.power, h, i, n; --b >= 0;) h = c[b], i = h.getRatioVector().multiply(e), i = f * Math.pow(i.getMagnitude(), g), i = (new a.Matrix4).scaleMatrix(1 + i * d.x, 1 + i * d.y, 1 + i * d.z), n = h.getVector(), (new a.Matrix4).multiplyVector(i, n), h.setVector(n) } })(MOD3); (function(a) { a.Wheel = function() { this.radius = this.roll = this.turn = this.speed = null; this.steerVector = new a.Vector3(0, 1, 0); this.rollVector = new a.Vector3(0, 0, 1); this.roll = this.turn = this.speed = 0 }; a.Wheel.prototype = new a.Modifier; a.Wheel.prototype.constructor = a.Wheel; a.Wheel.prototype.setModifiable = function(c) { a.Modifier.prototype.setModifiable.call(this, c); this.radius = 0.5 * this.mod.width }; a.Wheel.prototype.apply = function() { this.roll += this.speed; var c = this.mod.getVertices(), b = c.length, d = this.steerVector, e = this.turn, f = this.rollVector, g = this.roll, h; 0 != e ? (h = (new a.Matrix4).rotationMatrix(d.x, d.y, d.z, e), d = f.clone(), (new a.Matrix4).multiplyVector(h, d), g = (new a.Matrix4).rotationMatrix(d.x, d.y, d.z, g)) : g = (new a.Matrix4).rotationMatrix(f.x, f.y, f.z, g); for (; --b >= 0;) d = c[b], f = d.getVector().clone(), 0 != e && (new a.Matrix4).multiplyVector(h, f), (new a.Matrix4).multiplyVector(g, f), d.setX(f.x), d.setY(f.y), d.setZ(f.z) }; a.Wheel.prototype.getStep = function() { return this.radius * this.speed * a.Constants.invPI }; a.Wheel.prototype.getPerimeter = function() { return this.radius * a.Constants.doublePI } })(MOD3); (function(a) { a.Break = function(c, b) { this.bv = new a.Vector3(0, 1, 0); this.angle = this.offset = 0; if (typeof c != "undefined") this.offset = c; if (typeof b != "undefined") this.angle = b; this.range = new a.Range(0, 1) }; a.Break.prototype = new a.Modifier; a.Break.prototype.constructor = a.Break; a.Break.prototype.apply = function() { var c = this.mod, b = c.getVertices(), d = b.length, e = this.range, f = this.angle, g = this.bv, h, i, c = new a.Vector3(0, 0, -(c.minZ + c.depth * this.offset)); h = c.negate(); for (i = (new a.Matrix4).rotationMatrix(g.x, g.y, g.z, f); --d >= 0;) f = b[d], g = f.getVector(), g = g.add(c), g.z >= 0 && e.isIn(f.ratioY) && (new a.Matrix4).multiplyVector(i, g), g = g.add(h), f.setX(g.x), f.setY(g.y), f.setZ(g.z) } })(MOD3); (function(a) { a.Noise = function(c) { this.force = 0; this.axc = a.ModConstant.NONE; this.end = this.start = 0; if (typeof c != "undefined") this.force = c }; a.Noise.prototype = new a.Modifier; a.Noise.prototype.constructor = a.Noise; a.Noise.prototype.constraintAxes = function(a) { this.axc = a }; a.Noise.prototype.setFalloff = function(a, b) { this.start = 0; this.end = 1; if (typeof a != "undefined") this.start = a; if (typeof b != "undefined") this.end = b }; a.Noise.prototype.apply = function() { for (var a = this.mod, b = this.axc, d = this.start, e = this.end, f = a.getVertices(), g = f.length, h = this.force, i = 0.5 * h, n = Math.random, m, o, k; --g >= 0;) m = f[g], o = n() * h - i, k = m.getRatio(a.maxAxis), d < e ? (k < d && (k = 0), k > e && (k = 1)) : d > e ? (k = 1 - k, k > d && (k = 0), k < e && (k = 1)) : k = 1, b & 1 || m.setX(m.getX() + o * k), b >> 1 & 1 || m.setY(m.getY() + o * k), b >> 2 & 1 || m.setZ(m.getZ() + o * k) } })(MOD3); (function(a) { a.LibraryThree = function() { this.id = "Three.js"; this.meshClass = a.MeshThree; this.vertexClass = a.VertexThree }; a.LibraryThree.prototype = new a.Library3d; a.LibraryThree.prototype.constructor = a.LibraryThree })(MOD3); (function(a) { a.VertexThree = function(a) { this.mesh = a }; a.VertexThree.prototype = new a.VertexProxy; a.VertexThree.prototype.setVertex = function(a) { this.vertex = a; this.originalX = a.x; this.originalY = a.y; this.originalZ = a.z }; a.VertexThree.prototype.getX = function() { return this.vertex.x }; a.VertexThree.prototype.getY = function() { return this.vertex.y }; a.VertexThree.prototype.getZ = function() { return this.vertex.z }; a.VertexThree.prototype.setX = function(a) { this.vertex.x = a; a = this.mesh; a.geometry.verticesNeedUpdate = !0; a.geometry.normalsNeedUpdate = !0; a.geometry.buffersNeedUpdate = !0; a.geometry.dynamic = !0 }; a.VertexThree.prototype.setY = function(a) { this.vertex.y = a; a = this.mesh; a.geometry.verticesNeedUpdate = !0; a.geometry.normalsNeedUpdate = !0; a.geometry.buffersNeedUpdate = !0; a.geometry.dynamic = !0 }; a.VertexThree.prototype.setZ = function(a) { this.vertex.z = a; a = this.mesh; a.geometry.verticesNeedUpdate = !0; a.geometry.normalsNeedUpdate = !0; a.geometry.buffersNeedUpdate = !0; a.geometry.dynamic = !0 } })(MOD3); (function(a) { a.MeshThree = function() {}; a.MeshThree.prototype = new a.MeshProxy; a.MeshThree.prototype.setMesh = function(c) { a.MeshProxy.prototype.setMesh.call(this, c); for (var c = [], b = 0, d = this.mesh.geometry.vertices, e = d.length, f = this.mesh.geometry.faces, g = f.length, h, b = 0; b < e;) h = new a.VertexThree(this.mesh), h.setVertex(d[b]), this.vertices.push(h), c[d[b]] = h, b++; for (b = 0; b < g;) e = new a.FaceProxy, f[b] instanceof THREE.Face3 ? (e.addVertex(c[d[f[b].a]]), e.addVertex(c[d[f[b].b]]), e.addVertex(c[d[f[b].c]])) : f[b] instanceof THREE.Face4 && (e.addVertex(c[d[f[b].a]]), e.addVertex(c[d[f[b].b]]), e.addVertex(c[d[f[b].c]]), e.addVertex(c[d[f[b].d]])), this.faces.push(e), b++; delete lookup }; a.MeshThree.prototype.updateMeshPosition = function(a) { var b = this.mesh; b.position.x += a.x; b.position.y += a.y; b.position.z += a.z } })(MOD3); (function(a) { a.LibraryPre3D = function() { this.id = "pre3d.js"; this.meshClass = a.MeshPre3D; this.vertexClass = a.VertexPre3D }; a.LibraryThree.prototype = new a.Library3d; a.LibraryThree.prototype.constructor = a.LibraryPre3D })(MOD3); (function(a) { a.VertexPre3D = function() {}; a.VertexPre3D.prototype = new a.VertexProxy; a.VertexPre3D.prototype.setVertex = function(a) { this.vertex = a; this.originalX = a.x; this.originalY = a.y; this.originalZ = a.z }; a.VertexPre3D.prototype.getX = function() { return this.vertex.x }; a.VertexPre3D.prototype.getY = function() { return this.vertex.y }; a.VertexPre3D.prototype.getZ = function() { return this.vertex.z }; a.VertexPre3D.prototype.setX = function(a) { this.vertex.x = a }; a.VertexPre3D.prototype.setY = function(a) { this.vertex.y = a }; a.VertexPre3D.prototype.setZ = function(a) { this.vertex.z = a } })(MOD3); (function(a) { a.MeshPre3D = function() {}; a.MeshPre3D.prototype = new a.MeshProxy; a.MeshPre3D.prototype.setMesh = function(c) { a.MeshProxy.prototype.setMesh.call(this, c); for (var c = [], b = this.mesh.vertices, d = this.mesh.quads, e = b.length, f = d.length, g = 0; g < e; g++) { var h = new a.VertexPre3D; h.setVertex(b[g]); this.vertices.push(h); c[b[g]] = h } for (g = 0; g < f; g++) e = new a.FaceProxy, d[g] instanceof Pre3d.QuadFace && (e.addVertex(c[b[d[g].i0]]), e.addVertex(c[b[d[g].i1]]), e.addVertex(c[b[d[g].i2]]), d[g].i3 != null && e.addVertex(c[b[d[g].i3]])), this.faces.push(e); delete lookup }; a.MeshPre3D.prototype.updateMeshPosition = function() {} })(MOD3); (function(a) { a.LibraryJ3D = function() { this.id = "J3D"; this.meshClass = a.MeshJ3D; this.vertexClass = a.VertexJ3D }; a.LibraryJ3D.prototype = new a.Library3d; a.LibraryJ3D.prototype.constructor = a.LibraryJ3D })(MOD3); (function(a) { a.VertexJ3D = function(a) { this.geometry = a }; a.VertexJ3D.prototype = new a.VertexProxy; a.VertexJ3D.prototype.setVertex = function(a) { this.vertex = a; var b = this.geometry; this.originalX = b.vertexPositionBuffer.data[a]; this.originalY = b.vertexPositionBuffer.data[a + 1]; this.originalZ = b.vertexPositionBuffer.data[a + 2] }; a.VertexJ3D.prototype.getX = function() { return this.geometry.vertexPositionBuffer.data[this.vertex] }; a.VertexJ3D.prototype.getY = function() { return this.geometry.vertexPositionBuffer.data[this.vertex + 1] }; a.VertexJ3D.prototype.getZ = function() { return this.geometry.vertexPositionBuffer.data[this.vertex + 2] }; a.VertexJ3D.prototype.setX = function(a) { var b = this.geometry; b.vertexPositionBuffer.data[this.vertex] = a; b.replaceArray(b.vertexPositionBuffer, b.vertexPositionBuffer.data) }; a.VertexJ3D.prototype.setY = function(a) { var b = this.geometry; b.vertexPositionBuffer.data[this.vertex + 1] = a; b.replaceArray(b.vertexPositionBuffer, b.vertexPositionBuffer.data) }; a.VertexJ3D.prototype.setZ = function(a) { var b = this.geometry; b.vertexPositionBuffer.data[this.vertex + 2] = a; b.replaceArray(b.vertexPositionBuffer, b.vertexPositionBuffer.data) } })(MOD3); (function(a) { a.MeshJ3D = function() {}; a.MeshJ3D.prototype = new a.MeshProxy; a.MeshJ3D.prototype.setMesh = function(c) { a.MeshProxy.prototype.setMesh.call(this, c); for (var b = 0, d = c.geometry.vertexPositionBuffer.data.length, e = c.geometry.vertexPositionBuffer.itemSize, f, b = 0; b < d;) f = new a.VertexJ3D(c.geometry), f.setVertex(b), this.vertices.push(f), b += e; this.faces = null }; a.MeshJ3D.prototype.updateMeshPosition = function(a) { var b = this.mesh; b.position.x += a.x; b.position.y += a.y; b.position.z += a.z } })(MOD3); (function(a) { a.LibraryCopperlicht = function() { this.id = "Copperlicht"; this.meshClass = a.MeshCopperlicht; this.vertexClass = a.VertexCopperlicht }; a.LibraryCopperlicht.prototype = new a.Library3d; a.LibraryCopperlicht.prototype.constructor = a.LibraryCopperlicht })(MOD3); (function(a) { a.VertexCopperlicht = function(a, b) { this.node = a; this.buffer = b }; a.VertexCopperlicht.prototype = new a.VertexProxy; a.VertexCopperlicht.prototype.setVertex = function(a) { this.vertex = a; this.originalX = this.vertex.Pos.X; this.originalY = this.vertex.Pos.Y; this.originalZ = this.vertex.Pos.Z }; a.VertexCopperlicht.prototype.getX = function() { return this.vertex.Pos.X }; a.VertexCopperlicht.prototype.getY = function() { return this.vertex.Pos.Y }; a.VertexCopperlicht.prototype.getZ = function() { return this.vertex.Pos.Z }; a.VertexCopperlicht.prototype.setX = function(a) { this.vertex.Pos.X = a; this.buffer.update(!0) }; a.VertexCopperlicht.prototype.setY = function(a) { this.vertex.Pos.Y = a; this.buffer.update(!0) }; a.VertexCopperlicht.prototype.setZ = function(a) { this.vertex.Pos.Z = a; this.buffer.update(!0) } })(MOD3); (function(a) { a.MeshCopperlicht = function() {}; a.MeshCopperlicht.prototype = new a.MeshProxy; a.MeshCopperlicht.prototype.setMesh = function(c) { a.MeshProxy.prototype.setMesh.call(this, c); for (var c = this.mesh.getMesh().GetMeshBuffers(), b = [], d = 0; d < c.length; d++) for (var b = c[d].Vertices, e = b.length, f = 0; f < e; f++) { var g = new a.VertexCopperlicht(this.mesh, c[d]); g.setVertex(b[f]); this.vertices.push(g) } this.faces = null; delete lookup }; a.MeshCopperlicht.prototype.updateMeshPosition = function(a) { this.mesh.Pos.X += a.x; this.mesh.Pos.Y += a.y; this.mesh.Pos.Z += a.z } })(MOD3); } { /** * Tween.js - Licensed under the MIT license * https://github.com/sole/tween.js * ---------------------------------------------- * * See https://github.com/sole/tween.js/graphs/contributors for the full list of contributors. * Thank you all, you're awesome! */ // performance.now polyfill (function(root) { if ('performance' in root === false) { root.performance = {}; } // IE 8 Date.now = (Date.now || function() { return new Date().getTime(); }); if ('now' in root.performance === false) { var offset = root.performance.timing && root.performance.timing.navigationStart ? performance.timing.navigationStart : Date.now(); root.performance.now = function() { return Date.now() - offset; }; } })(this); FLIPBOOK.TWEEN = FLIPBOOK.TWEEN || (function() { var _tweens = []; return { REVISION: '14', getAll: function() { return _tweens; }, removeAll: function() { _tweens = []; }, add: function(tween) { _tweens.push(tween); }, remove: function(tween) { var i = _tweens.indexOf(tween); if (i !== -1) { _tweens.splice(i, 1); } }, update: function(time) { if (_tweens.length === 0) return false; var i = 0; time = time !== undefined ? time : window.performance.now(); while (i < _tweens.length) { if (_tweens[i].update(time)) { i++; } else { _tweens.splice(i, 1); } } return true; } }; })(); FLIPBOOK.TWEEN.Tween = function(object) { var _object = object; var _valuesStart = {}; var _valuesEnd = {}; var _valuesStartRepeat = {}; var _duration = 1000; var _repeat = 0; var _yoyo = false; var _isPlaying = false; var _reversed = false; var _delayTime = 0; var _startTime = null; var _easingFunction = FLIPBOOK.TWEEN.Easing.Linear.None; var _interpolationFunction = FLIPBOOK.TWEEN.Interpolation.Linear; var _chainedTweens = []; var _onStartCallback = null; var _onStartCallbackFired = false; var _onUpdateCallback = null; var _onCompleteCallback = null; var _onStopCallback = null; // Set all starting values present on the target object for (var field in object) { _valuesStart[field] = parseFloat(object[field], 10); } this.to = function(properties, duration) { if (duration !== undefined) { _duration = duration; } _valuesEnd = properties; return this; }; this.start = function(time) { FLIPBOOK.TWEEN.add(this); _isPlaying = true; _onStartCallbackFired = false; _startTime = time !== undefined ? time : window.performance.now(); _startTime += _delayTime; for (var property in _valuesEnd) { // check if an Array was provided as property value if (_valuesEnd[property] instanceof Array) { if (_valuesEnd[property].length === 0) { continue; } // create a local copy of the Array with the start value at the front _valuesEnd[property] = [_object[property]].concat(_valuesEnd[property]); } _valuesStart[property] = _object[property]; if ((_valuesStart[property] instanceof Array) === false) { _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings } _valuesStartRepeat[property] = _valuesStart[property] || 0; } return this; }; this.stop = function() { if (!_isPlaying) { return this; } FLIPBOOK.TWEEN.remove(this); _isPlaying = false; if (_onStopCallback !== null) { _onStopCallback.call(_object); } this.stopChainedTweens(); return this; }; this.stopChainedTweens = function() { for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { _chainedTweens[i].stop(); } }; this.delay = function(amount) { _delayTime = amount; return this; }; this.repeat = function(times) { _repeat = times; return this; }; this.yoyo = function(yoyo) { _yoyo = yoyo; return this; }; this.easing = function(easing) { _easingFunction = easing; return this; }; this.interpolation = function(interpolation) { _interpolationFunction = interpolation; return this; }; this.chain = function() { _chainedTweens = arguments; return this; }; this.onStart = function(callback) { _onStartCallback = callback; return this; }; this.onUpdate = function(callback) { _onUpdateCallback = callback; return this; }; this.onComplete = function(callback) { _onCompleteCallback = callback; return this; }; this.onStop = function(callback) { _onStopCallback = callback; return this; }; this.update = function(time) { var property; if (time < _startTime) { return true; } if (_onStartCallbackFired === false) { if (_onStartCallback !== null) { _onStartCallback.call(_object); } _onStartCallbackFired = true; } var elapsed = (time - _startTime) / _duration; elapsed = elapsed > 1 ? 1 : elapsed; var value = _easingFunction(elapsed); for (property in _valuesEnd) { var start = _valuesStart[property] || 0; var end = _valuesEnd[property]; if (end instanceof Array) { _object[property] = _interpolationFunction(end, value); } else { // Parses relative end values with start as base (e.g.: +10, -3) if (typeof(end) === "string") { end = start + parseFloat(end, 10); } // protect against non numeric properties. if (typeof(end) === "number") { _object[property] = start + (end - start) * value; } } } if (_onUpdateCallback !== null) { _onUpdateCallback.call(_object, value); } if (elapsed == 1) { if (_repeat > 0) { if (isFinite(_repeat)) { _repeat--; } // reassign starting values, restart by making startTime = now for (property in _valuesStartRepeat) { if (typeof(_valuesEnd[property]) === "string") { _valuesStartRepeat[property] = _valuesStartRepeat[property] + parseFloat(_valuesEnd[property], 10); } if (_yoyo) { var tmp = _valuesStartRepeat[property]; _valuesStartRepeat[property] = _valuesEnd[property]; _valuesEnd[property] = tmp; } _valuesStart[property] = _valuesStartRepeat[property]; } if (_yoyo) { _reversed = !_reversed; } _startTime = time + _delayTime; return true; } else { if (_onCompleteCallback !== null) { _onCompleteCallback.call(_object); } for (var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++) { _chainedTweens[i].start(time); } return false; } } return true; }; }; FLIPBOOK.TWEEN.Easing = { Linear: { None: function(k) { return k; } }, Quadratic: { In: function(k) { return k * k; }, Out: function(k) { return k * (2 - k); }, InOut: function(k) { if ((k *= 2) < 1) return 0.5 * k * k; return -0.5 * (--k * (k - 2) - 1); } }, Cubic: { In: function(k) { return k * k * k; }, Out: function(k) { return --k * k * k + 1; }, InOut: function(k) { if ((k *= 2) < 1) return 0.5 * k * k * k; return 0.5 * ((k -= 2) * k * k + 2); } }, Quartic: { In: function(k) { return k * k * k * k; }, Out: function(k) { return 1 - (--k * k * k * k); }, InOut: function(k) { if ((k *= 2) < 1) return 0.5 * k * k * k * k; return -0.5 * ((k -= 2) * k * k * k - 2); } }, Quintic: { In: function(k) { return k * k * k * k * k; }, Out: function(k) { return --k * k * k * k * k + 1; }, InOut: function(k) { if ((k *= 2) < 1) return 0.5 * k * k * k * k * k; return 0.5 * ((k -= 2) * k * k * k * k + 2); } }, Sinusoidal: { In: function(k) { return 1 - Math.cos(k * Math.PI / 2); }, Out: function(k) { return Math.sin(k * Math.PI / 2); }, InOut: function(k) { return 0.5 * (1 - Math.cos(Math.PI * k)); } }, Exponential: { In: function(k) { return k === 0 ? 0 : Math.pow(1024, k - 1); }, Out: function(k) { return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); }, InOut: function(k) { if (k === 0) return 0; if (k === 1) return 1; if ((k *= 2) < 1) return 0.5 * Math.pow(1024, k - 1); return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); } }, Circular: { In: function(k) { return 1 - Math.sqrt(1 - k * k); }, Out: function(k) { return Math.sqrt(1 - (--k * k)); }, InOut: function(k) { if ((k *= 2) < 1) return -0.5 * (Math.sqrt(1 - k * k) - 1); return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); } }, Elastic: { In: function(k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); }, Out: function(k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); }, InOut: function(k) { var s, a = 0.1, p = 0.4; if (k === 0) return 0; if (k === 1) return 1; if (!a || a < 1) { a = 1; s = p / 4; } else s = p * Math.asin(1 / a) / (2 * Math.PI); if ((k *= 2) < 1) return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; } }, Back: { In: function(k) { var s = 1.70158; return k * k * ((s + 1) * k - s); }, Out: function(k) { var s = 1.70158; return --k * k * ((s + 1) * k + s) + 1; }, InOut: function(k) { var s = 1.70158 * 1.525; if ((k *= 2) < 1) return 0.5 * (k * k * ((s + 1) * k - s)); return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); } }, Bounce: { In: function(k) { return 1 - FLIPBOOK.TWEEN.Easing.Bounce.Out(1 - k); }, Out: function(k) { if (k < (1 / 2.75)) { return 7.5625 * k * k; } else if (k < (2 / 2.75)) { return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; } else if (k < (2.5 / 2.75)) { return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; } else { return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; } }, InOut: function(k) { if (k < 0.5) return FLIPBOOK.TWEEN.Easing.Bounce.In(k * 2) * 0.5; return FLIPBOOK.TWEEN.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; } } }; FLIPBOOK.TWEEN.Interpolation = { Linear: function(v, k) { var m = v.length - 1, f = m * k, i = Math.floor(f), fn = FLIPBOOK.TWEEN.Interpolation.Utils.Linear; if (k < 0) return fn(v[0], v[1], f); if (k > 1) return fn(v[m], v[m - 1], m - f); return fn(v[i], v[i + 1 > m ? m : i + 1], f - i); }, Bezier: function(v, k) { var b = 0, n = v.length - 1, pw = Math.pow, bn = FLIPBOOK.TWEEN.Interpolation.Utils.Bernstein, i; for (i = 0; i <= n; i++) { b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i); } return b; }, CatmullRom: function(v, k) { var m = v.length - 1, f = m * k, i = Math.floor(f), fn = FLIPBOOK.TWEEN.Interpolation.Utils.CatmullRom; if (v[0] === v[m]) { if (k < 0) i = Math.floor(f = m * (1 + k)); return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); } else { if (k < 0) return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]); if (k > 1) return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); } }, Utils: { Linear: function(p0, p1, t) { return (p1 - p0) * t + p0; }, Bernstein: function(n, i) { var fc = FLIPBOOK.TWEEN.Interpolation.Utils.Factorial; return fc(n) / fc(i) / fc(n - i); }, Factorial: (function() { var a = [1]; return function(n) { var s = 1, i; if (a[n]) return a[n]; for (i = n; i > 1; i--) s *= i; return a[n] = s; }; })(), CatmullRom: function(p0, p1, p2, p3, t) { var v0 = (p2 - p0) * 0.5, v1 = (p3 - p1) * 0.5, t2 = t * t, t3 = t * t2; return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; } } }; } { // var _Group=function(){this._tweens={},this._tweensAddedDuringUpdate={}};_Group.prototype={getAll:function(){return Object.keys(this._tweens).map(function(t){return this._tweens[t]}.bind(this))},removeAll:function(){this._tweens={}},add:function(t){this._tweens[t.getId()]=t,this._tweensAddedDuringUpdate[t.getId()]=t},remove:function(t){delete this._tweens[t.getId()],delete this._tweensAddedDuringUpdate[t.getId()]},update:function(t,n){var e=Object.keys(this._tweens);if(0===e.length)return!1;for(t=void 0!==t?t:TWEEN.now();0