Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

INTRODUCTION Christian Liebel Manuel Rauber [email protected] @chris_liebel [email protected] @manuelrauber https://christianliebel.com https://manuel-rauber.com

Slide 3

Slide 3 text

TALKING POINTS 2D 3D Overview Browser support, performance API Basics, retina scaling, animation, interaction Examples Overview Basics WebGL & three.js Browser support, controls Examples

Slide 4

Slide 4 text

2D VISUALIZATION HTML5 CANVAS Manuel Rauber @manuelrauber

Slide 5

Slide 5 text

CROSS PLATFORM Native Multi Platform Cross Platform One app per platform Less to none code sharing Java/Swift/C# One app per supported platforms Medium code sharing Xamarin (C#) One app for all High code sharing HTML/JS

Slide 6

Slide 6 text

OVERVIEW Plain bitmap for the web Cross platform graphic manipulations High performance Mouse, touch & gamepad support Low energy consumpting animations

Slide 7

Slide 7 text

BROWSER SUPPORT (BASIC) From http://caniuse.com/#search=canvas

Slide 8

Slide 8 text

BROWSER SUPPORT (OVERALL) From http://caniuse.com/#search=canvas

Slide 9

Slide 9 text

PERFORMANCE CHROME @ MACBOOK PRO From http://jsperf.com/html-vs-svg-vs-canvas/31

Slide 10

Slide 10 text

PERFORMANCE ANDROID @ SAMSUNG GALAXY NOTE From http://jsperf.com/html-vs-svg-vs-canvas/31

Slide 11

Slide 11 text

COORDINATE SYSTEM Cartesian: (0/0) bottom left Canvas: (0/0) top left From http://www.sitepoint.com/html5-canvas-tutorial-introduction/

Slide 12

Slide 12 text

USAGE < ! D O C T Y P E h t m l > < h t m l > < h e a d > < t i t l e > C a n v a s ! < / t i t l e > < / h e a d > < b o d y > < c a n v a s > < / c a n v a s > < / b o d y > < / h t m l >

Slide 13

Slide 13 text

FALLBACK < ! D O C T Y P E h t m l > < h t m l > < h e a d > < t i t l e > C a n v a s ! < / t i t l e > < / h e a d > < b o d y > < c a n v a s > T h i s t e x t i s s h o w n , w h e n a b r o w s e r d o e s n o t s u p p o r t c a n v a s . < / c a n v a s > < / b o d y > < / h t m l >

Slide 14

Slide 14 text

CONTEXTS 2D context: CanvasRenderingContext2D v a r c o n t e x t = c a n v a s . g e t C o n t e x t ( ' 2 d ' ) ; WebGL context: WebGLRenderingContext v a r c o n t e x t = c a n v a s . g e t C o n t e x t ( ' w e b g l ' ) ;

Slide 15

Slide 15 text

API DRAWING v o i d f i l l R e c t ( x , y , w i d t h , h e i g h t ) ; v o i d s t r o k e R e c t ( x , y , w i d t h , h e i g h t ) ; v o i d c l e a r R e c t ( x , y , w i d t h , h e i g h t ) ; v o i d f i l l T e x t ( t e x t , x , y [ , m a x W i d t h ] ) ; v o i d s t r o k e T e x t ( t e x t , x , y [ , m a x W i d t h ] ) ; MDN: CanvasRenderingContext2D

Slide 16

Slide 16 text

API PATHS v o i d b e g i n P a t h ( ) ; v o i d c l o s e P a t h ( ) ; v o i d m o v e T o ( x , y ) ; v o i d l i n e T o ( x , y ) ; v o i d b e z i e r C u r v e T o ( c p 1 x , c p 1 y , c p 2 x , c p 2 y , x , y ) ; v o i d r e c t ( x , y , w i d t h , h e i g h t ) ; v o i d f i l l ( ) ; v o i d s t r o k e ( ) ; MDN: CanvasRenderingContext2D

Slide 17

Slide 17 text

API PIXEL MANIPULATION I m a g e D a t a c r e a t e I m a g e D a t a ( w i d t h , h e i g h t ) ; I m a g e D a t a g e t I m a g e D a t a ( s x , s y , s w , s h ) ; v o i d p u t I m a g e D a t a ( i m a g e d a t a , d x , d y ) ; MDN: CanvasRenderingContext2D

Slide 18

Slide 18 text

RETINA SUPPORT

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

RETINA - HOW TO f u n c t i o n a d j u s t F o r R e t i n a ( ) { i f ( ! w i n d o w . d e v i c e P i x e l R a t i o | | w i n d o w . d e v i c e P i x e l R a t i o < = 1 ) { r e t u r n ; } v a r w i d t h = c a n v a s . w i d t h ; v a r h e i g h t = c a n v a s . h e i g h t ; c a n v a s . s t y l e . w i d t h = w i d t h + ' p x ' ; c a n v a s . s t y l e . h e i g h t = h e i g h t + ' p x ' ; c a n v a s . w i d t h = w i d t h * w i n d o w . d e v i c e P i x e l R a t i o ; c a n v a s . h e i g h t = h e i g h t * w i n d o w . d e v i c e P i x e l R a t i o ; c o n t e x t . s c a l e ( w i n d o w . d e v i c e P i x e l R a t i o , w i n d o w . d e v i c e P i x e l R a t i o ) ; }

Slide 21

Slide 21 text

ANIMATIONS THE OLD WAY setTimeout f u n c t i o n d r a w ( ) { / / d r a w r o u t i n e s e t T i m e o u t ( d r a w , 1 0 0 0 / 6 0 ) ; } setInterval s e t I n t e r v a l ( f u n c t i o n ( ) { / / d r a w r o u t i n e } , 1 0 0 0 / 6 0 ) ;

Slide 22

Slide 22 text

ANIMATIONS THE MODERN WAY requestAnimationFrame v a r a n i m a t i o n F r a m e ; f u n c t i o n s t a r t A n i m a t i o n ( ) { v a r s t e p = f u n c t i o n ( ) { / / d r a w r o u t i n e a n i m a t i o n F r a m e = w i n d o w . r e q u e s t A n i m a t i o n F r a m e ( s t e p ) ; } a n i m a t i o n F r a m e = w i n d o w . r e q u e s t A n i m a t i o n F r a m e ( s t e p ) ; f u n c t i o n s t o p A n i m a t i o n ( ) { w i n d o w . c a n c e l A n i m a t i o n F r a m e ( a n i m a t i o n F r a m e ) ; } MDN: , requestAnimationFrame cancelAnimationFrame

Slide 23

Slide 23 text

ANIMATIONS PROBLEMS WITH "OLD" TECHNIQUES If the callback function takes longer than the timer will call it, the callback function gets queued. Could lead quickly to an "infinite" amount of queued callback functions. Timers continue to work in background tabs, the browser will render invisible animations (wastage of CPU and battery life). Especially bad for mobile devices. From https://dev.opera.com/articles/better-performance-with-requestanimationframe/

Slide 24

Slide 24 text

ANIMATIONS WHAT REQUESTANIMATIONFRAME DOES Only executed when visible to the user (will stop in background tabs!). No wastage of CPU and battery life. Frame is only drawn when browser is ready and no other frame waits for drawing. No "infinite" amount of queued callback functions. From https://dev.opera.com/articles/better-performance-with-requestanimationframe/

Slide 25

Slide 25 text

ANIMATIONS WHAT REQUESTANIMATIONFRAME DOESN'T DO As the name suggests: Only one frame is requested. r e q u e s t A n i m a t i o n F r a m e has to be called within the callback to get an animation loop. You don't know, when the callback will be executed. Animations on the same page, where one is in the visible area and one not, will not run synchronously since the hidden one's r e q u e s t A n i m a t i o n F r a m e will not be called. From https://dev.opera.com/articles/better-performance-with-requestanimationframe/

Slide 26

Slide 26 text

INTERACTION KEYBOARD & MOUSE SUPPORT Canvas supports all keyboard & mouse events like k e y d o w n , k e y u p , m o u s e d o w n or m o u s e m o v e . c a n v a s . a d d E v e n t L i s t e n e r ( ' m o u s e m o v e ' , f u n c t i o n ( m o u s e E v e n t ) { / / m o u s e e v e n t r o u t i n e } ) ; c a n v a s . a d d E v e n t L i s t e n e r ( ' k e y d o w n ' , f u n c t i o n ( k e y E v e n t ) { / / k e y d o w n e v e n t r o u t i n e } ) ; MDN: , MouseEvent KeyboardEvent

Slide 27

Slide 27 text

INTERACTION TOUCH Canvas supports all touch events like t o u c h s t a r t , t o u c h m o v e , t o u c h e n d . Consider using a library for recognizing gestures like . HammerJS c a n v a s . a d d E v e n t L i s t e n e r ( ' t o u c h m o v e ' , f u n c t i o n ( t o u c h E v e n t ) { / / t o u c h m o v e e v e n t r o u t i n e } ) ; MDN: , Touch events TouchEvent

Slide 28

Slide 28 text

EXAMPLES WITHIN GITHUB REPOSITORY 1. Basic circle 2. Circle with gradient 3. Retina support 4. requestAnimationFrame 5. Time-based animations 6. Mouse Move 7. Touch Move 8. Manipulating a rectangle with HammerJS 9. Rotating Pie Chart

Slide 29

Slide 29 text

EXAMPLES WITHIN THE WEB Gesture recognition: Video explosion: Zen Photon Garden: Zoom Charts: Many more examples @ http://revealjs.herokuapp.com/ http://www.craftymind.com/factory/html5video/CanvasVideo http://zenphoton.com/ https://zoomcharts.com/developers/en/net- chart/examples/items/link-items.html http://www.canvasdemos.com/

Slide 30

Slide 30 text

VIDEO EXPLOSION From http://www.craftymind.com/factory/html5video/CanvasVideo.html

Slide 31

Slide 31 text

ZEN PHOTON GARDEN From http://zenphoton.com/

Slide 32

Slide 32 text

ZOOM CHARTS From https://zoomcharts.com/developers/en/net-chart/examples/items/link-items.html

Slide 33

Slide 33 text

LIVE DEMO

Slide 34

Slide 34 text

3D VISUALIZATION Christian Liebel @chris_liebel

Slide 35

Slide 35 text

3D CONTENT IN A 3D WORLD WITH 2D SCREENS scenes, cameras, rendering

Slide 36

Slide 36 text

COORDINATE SYSTEM Right-handed From https://msdn.microsoft.com/library/dn479430(v=vs.85).aspx

Slide 37

Slide 37 text

CAMERA FRUSTUM From https://msdn.microsoft.com/library/dn479430(v=vs.85).aspx

Slide 38

Slide 38 text

WEBGL Web Graphics Library Hardware accelerated (GPU) New canvas rendering context w e b g l

Slide 39

Slide 39 text

PROVEN TECHNOLOGY Based on OpenGL for Embedded Systems Blender & Unity can export to WebGL ANGLE (Chrome/Firefox): Rendering on Direct3D

Slide 40

Slide 40 text

THREE.JS Native WebGL is complex Open-source JavaScript library High-level API abstracting WebGL (and more)

Slide 41

Slide 41 text

STRUCTURE Geometry: shape (cube, sphere, …) Material: color, texture, light reflection Mesh: 3D object (geometry + material)

Slide 42

Slide 42 text

BROWSER SUPPORT From http://caniuse.com/#search=webgl

Slide 43

Slide 43 text

MOBILE PLATFORM SUPPORT iOS 8+ Android WebView 36+ Crosswalk Windows (Phone) 8.1+

Slide 44

Slide 44 text

CONTROLS Mouse/Keyboard Touch Gamepad

Slide 45

Slide 45 text

A WORD ON TOUCH EVENTS… Pointer Events vs. Touch Events Browser support varies on desktop three.js controls only support Touch Events

Slide 46

Slide 46 text

A WORD ON GAMEPADS… HTML5 Gamepad API Polling (requestAnimationFrame) Supported by Chrome, Firefox, MS Edge, Opera

Slide 47

Slide 47 text

THE CREATION OF THE WORLD

Slide 48

Slide 48 text

EVEN MORE SAMPLES… Flight Arcade Physijs three.js samples

Slide 49

Slide 49 text

SUMMARY Cross platform high-performance graphic manipulation 2D & 3D Hardware acceleration Supported by all major browsers Touch-enabled, gamepad-enabled

Slide 50

Slide 50 text

CHANNEL9 Cross-Platform Development https://channel9.msdn.com/Series/Thementag-Cross- Plattform-Entwicklung-mit-HTML5--Javascript

Slide 51

Slide 51 text

THANK YOU! GitHub repository: https://github.com/thinktecture/basta-2d-3d thinktecture.com

Slide 52

Slide 52 text

RESOURCES GitHub repository: Canvas browser support: Cordova: Ionic: Gulp: TypeScript: CanvasRenderingContext2D: WebGLRenderingContext: requestAnimationFrame: https://github.com/thinktecture/basta-2d-3d http://caniuse.com/#search=canvas https://cordova.apache.org/ http://ionicframework.com/ http://gulpjs.com http://www.typescriptlang.org/ https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D https://developer.mozilla.org/en/docs/Web/API/WebGLRenderingContext https://developer.mozilla.org/en- US/docs/Web/API/window/requestAnimationFrame