1
<!DOCTYPE html>
2
<html lang="en">
3
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
4
<title> Book Engine Demo </title>
5
<meta charset="utf-8">
6
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
7
	<style>
8
	body
9
	{
10
	 /*background-color:#121212;*/
11
	}
12
	</style>
13
  <!--script src="../jquery-1.9.0.js"></script-->
14
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
15
	<script type="text/javascript" src="js/lib/three.js"></script>
16
	<script type="text/javascript" src="js/lib/MOD3.js"></script>
17
	<script type="text/javascript" src="js/lib/Tween.js"></script>
18
	<script type="text/javascript" src="js/lib/reqanim.js"></script>
19
	<script type="text/javascript" src="js/FlipBook3D.js"></script>
20
	</head>
21
	<body>
22
		<div id="controls" style="position:absolute;z-index:1000">
23
		<input type="button" id="flipleft" value="flipLeft" />
24
		<br />
25
		<input type="button" id="flipright" value="flipRight" />
26
		<br />
27
		<input type="button" id="magnify" value="Magnify is Off"/>
28
		</div>
29
		<div id="container" style="position:relative;margin:0 auto;padding:0;z-index:0;cursor:pointer;"></div>
30
		<script>
31
			var container;
32
			var camera, scene, renderer, projector, clock, mag_cam;
33
      var clientX, clientY, magnify = false;
34
35
			var targetRotationY = 0;
36
			var targetRotationOnMouseDownY = 0;
37
			var targetRotationX = 0;
38
			var targetRotationOnMouseDownX = 0;
39
			var rad = 200;
40
			var mouse={x:0,y:0};
41
			var mouseX = 0;
42
			var mouseXOnMouseDown = 0;
43
			var mouseY = 0;
44
			var mouseYOnMouseDown = 0;
45
			var mstack,bend;
46
			var windowHalfX = window.innerWidth / 2;
47
			var windowHalfY = window.innerHeight / 2;
48
			var w,h,w2,h2;
49
			var book, test_book;
50
			var pagew = 80;
51
			var pageh = pagew * 10/7;
52
			var fl,fr;
53
54
      var max_allowed_pages = 20;
55
      var max_pages;
56
      var fetched = 0;
57
58
      var controls;
59
60
      $.getJSON('books.json', function(books) {
61
        test_book = books[0];
62
        max_pages = (test_book.pages > max_allowed_pages) ? max_allowed_pages : test_book.pages;
63
			  init();
64
			  animate();
65
      });
66
67
68
			function init() {
69
70
				container=document.getElementById('container');
71
				w=window.innerWidth;
72
				h=window.innerHeight;
73
				w2=w/2;
74
				h2=h/2;
75
				container.style.width=w+"px";
76
				container.style.height=h+"px";
77
				container.style.marginTop=0.5*(window.innerHeight-h)+'px';
78
79
        clock = new THREE.Clock();
80
				scene = new THREE.Scene();
81
82
				camera = new THREE.PerspectiveCamera( 45, w / h, 0.1, 10000 );
83
        camera.position.z = rad;
84
				scene.add( camera );
85
86
        //book_cam = new THREE.PerspectiveCamera(45, w/h, 0.1, 1000);
87
        //scene.add(book_cam);
88
89
        /*mag_cam = new THREE.OrthographicCamera(
90
          window.innerWidth / -4,// Left
91
          window.innerWidth / 4,// Right
92
          window.innerHeight / 4,// Top
93
          window.innerHeight / -4,// Bottom
94
          1,            // Near 
95
          100);           // Far -- enough to see the skybox
96
        //topCamera.up = new THREE.Vector3(0,0,-1)  ;*/
97
        mag_cam  = new THREE.PerspectiveCamera(45, w/h, 0.1, 10000);
98
        mag_cam.position.set(0, 0, 60);
99
        mag_cam.lookAt(scene.position);
100
        scene.add(mag_cam)    
101
				
102
				projector = new THREE.Projector();
103
104
				// webgl renderer gives better rendering without problems
105
				renderer = new THREE.WebGLRenderer();
106
				renderer.setSize( w, h );
107
        renderer.setClearColorHex( 0x000000, 1 );
108
        renderer.autoClear = false;
109
110
				container.appendChild( renderer.domElement );
111
112
				container.addEventListener( 'mousedown', onDocumentMouseDown, false );
113
        container.addEventListener( 'mousemove', onMousemoveForMag, false );
114
115
				book=new FlipBook3D.Book();
116
				book.pageWidth=pagew;
117
				book.pageHeight=pageh;
118
				scene.add(book);
119
120
121
        for(var i=0; i<max_pages; i+=2) {
122
          //var texturefront = t.ImageUtils.loadTexture(images[i].f);
123
          var texturefront = THREE.ImageUtils.loadTexture(test_book.url + i + '.jpg');
124
          var textureback = THREE.ImageUtils.loadTexture(test_book.url + (i+1) + '.jpg');
125
          book.addPage(texturefront, textureback, 0);
126
          fetched = i;
127
        }
128
        console.log('fetched', fetched);
129
130
				fl=document.getElementById('flipleft');
131
				fr=document.getElementById('flipright');
132
        fl.addEventListener('click',function(){
133
          book.pages[book.pages.length-book.flippedright].flipLeft()
134
          prefetch();
135
        });
136
        fr.addEventListener('click',function(){
137
          book.pages[book.flippedleft-1].flipRight()
138
          prefetch();
139
        });
140
        var mag = document.getElementById('magnify');
141
        mag.addEventListener('click', function(event) {
142
          if(magnify == true) {
143
            mag.value = "Magnify is Off";
144
            magnify = false;
145
          }
146
          else {
147
            mag.value = "Magnify is On";
148
            magnify = true;
149
          }
150
        });
151
			}
152
153
      function prefetch() {
154
        var pageno = book.flippedleft * 2;
155
        if(test_book.pages < max_allowed_pages) {
156
          return;
157
        }
158
        if(pageno <= fetched - 5) {
159
          return;
160
        }
161
        console.log('fetching books..');
162
        var load_pages = fetched + 20;
163
        if(load_pages > test_book.pages) {
164
          return;
165
        }
166
        for(var i = fetched + 1; i < load_pages; i += 2) {
167
          var texturefront = THREE.ImageUtils.loadTexture(test_book.url + i + '.jpg');
168
          var textureback = THREE.ImageUtils.loadTexture(test_book.url + (i+1) + '.jpg');
169
          book.addPage(texturefront, textureback, 0);
170
          fetched = i;
171
        }
172
      }
173
174
			function onDocumentMouseDown( event ) {
175
				event.preventDefault();
176
				mouseX=(( event.clientX / w ) * 2 - 1);
177
				targetRotationY=mouseX;
178
				mouseY=(( event.clientY / h ) * 2 - 1);
179
				targetRotationX=mouseY;
180
				container.addEventListener( 'mousemove', onDocumentMouseMove, false );
181
				container.addEventListener( 'mouseup', onDocumentMouseUp, false );
182
				container.addEventListener( 'mouseout', onDocumentMouseOut, false );
183
				//window.addEventListener( 'keydown', onKeyDown, false );
184
				//window.addEventListener( 'keyup', onKeyUp, false );
185
			}
186
187
			function onKeyDown(event) {
188
        var key = event.keyCode;
189
        var scale = book.centerContainer.scale;
190
        if(key == 87 || key == 38) {
191
          book.centerContainer.scale.set(scale.x+=0.1, scale.y +=0.1, scale.z += 0.1);
192
          //book.centerContainer.translateZ(10);
193
        }
194
        else if(key == 83 || key == 40) {
195
          book.centerContainer.scale.set(scale.x-=0.1, scale.y -=0.1, scale.z -= 0.1);
196
          //book.centerContainer.translateZ(-10);
197
        }
198
        /*else if(key == 65) {
199
          //book.centerContainer.position.x += 1;
200
          book.centerContainer.translateX(-10);
201
        }
202
        else if(key == 68) {
203
          book.centerContainer.translateX(10);
204
        }*/
205
        //book.centerContainer.position.z += 1;
206
      }
207
208
      function onKeyUp(event) {
209
      }
210
211
      function onMousemoveForMag(event) {
212
        clientX = event.clientX;
213
        clientY = event.clientY;
214
        var mousex = ((event.clientX / w) * 2 - 1);
215
				var mousey = - ((event.clientY / h) * 2 - 1);
216
        var vec = new THREE.Vector3(mousex, mousey, 0);
217
        projector.unprojectVector(vec, camera);
218
        var raycaster = new THREE.Raycaster(camera.position, vec.sub(camera.position).normalize());
219
        //var intersects = raycaster.intersectObjects(book.pages, true);
220
        var intersects = raycaster.intersectObject(book, true);
221
        if(intersects.length) {
222
          var pos = intersects[0].point;
223
          //console.log(camera.position);
224
          //var dir_vec = vec.sub(camera.position).normalize();
225
          //console.log(dir_vec);
226
          //var ray = new THREE.Raycaster(camera.position, dir_vec);
227
          //var distance = -camera.position.z / dir_vec.z;
228
          //var pos = camera.position.clone().add(dir_vec.multiplyScalar(distance));
229
          //console.log(pos);
230
          mag_cam.position.set(pos.x+25, pos.y, 10);
231
        }
232
      }
233
234
			function onDocumentMouseMove( event ) {
235
236
				/*mouseX = event.clientX - w2;
237
				mouseY = event.clientY - h2;
238
239
				targetRotationY = targetRotationOnMouseDownY + ( mouseX - mouseXOnMouseDown ) * 0.02;
240
				targetRotationX = targetRotationOnMouseDownX + ( mouseY - mouseYOnMouseDown ) * 0.02;*/
241
				//var target=
242
				//mouse_path.push(e.seenas.ray);
243
				mouseX=(( event.clientX / w ) * 2 - 1);
244
				targetRotationY=mouseX;
245
				mouseY=(( event.clientY / h ) * 2 - 1);
246
				targetRotationX=mouseY;
247
			}
248
249
			function onDocumentMouseUp( event ) {
250
				container.removeEventListener( 'mousemove', onDocumentMouseMove, false );
251
				container.removeEventListener( 'mouseup', onDocumentMouseUp, false );
252
				container.removeEventListener( 'mouseout', onDocumentMouseOut, false );
253
			}
254
			
255
256
			function onDocumentMouseOut( event ) {
257
258
				container.removeEventListener( 'mousemove', onDocumentMouseMove, false );
259
				container.removeEventListener( 'mouseup', onDocumentMouseUp, false );
260
				container.removeEventListener( 'mouseout', onDocumentMouseOut, false );
261
			}
262
			//
263
264
			function animate() {
265
266
				requestAnimationFrame( animate );
267
268
				render();
269
			}
270
			
271
			function render2()
272
			{
273
        var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
274
				TWEEN.update();
275
        // setViewport parameters:
276
        //  lower_left_x, lower_left_y, viewport_width, viewport_height
277
        renderer.setViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
278
        renderer.clear(); 
279
280
        // left side
281
        renderer.setViewport( 1, 1, SCREEN_WIDTH - 200, SCREEN_HEIGHT);
282
        renderer.render( scene, camera);
283
284
        // right side
285
        if(magnify) {
286
          renderer.setViewport(SCREEN_WIDTH - 450, 50, 400, 400);
287
          renderer.render( scene, mag_cam);
288
        }
289
290
			}
291
			
292
			function render() {
293
294
				var multx=0.5*Math.PI;
295
				var multy=-Math.PI;
296
				camera.position.x = rad * Math.sin( targetRotationY*multy ) * Math.cos( targetRotationX*multx );
297
				camera.position.y = rad * Math.sin( targetRotationX*multx );
298
				camera.position.z = rad * Math.cos( targetRotationY*multy ) * Math.cos( targetRotationX*multx );
299
				camera.lookAt(scene.position);
300
				render2();
301
			}
302
		</script>
303
</body></html>