diff options
author | Kalle Viironen <kalle.viironen@digia.com> | 2014-05-26 13:51:28 +0300 |
---|---|---|
committer | Kalle Viironen <kalle.viironen@digia.com> | 2014-05-26 13:51:36 +0300 |
commit | c7edfa22fadbb5041b8dee1d5cd27adfcfb7f833 (patch) | |
tree | 8207705ee648774ed7e6a5922e4f0ab3ca2aa976 /basicsuite/webengine/content/webgl/helloqt.js | |
parent | d757a8ee2d86c3f4b694f8fdff5defa7b0dbab75 (diff) | |
parent | 536f2ed4438a1e04aeed372d08c46811603f5018 (diff) |
Merge branch 'stable' into releaseQtEE_v3.0.0
* stable: (28 commits)
webengine demo: rearrange layout to make all links visible on iMX6
webengine demo: add predefined links to page view
Fix webengine demo to hide home screen when adressbar is accepted
webengine demo: disable the pageview when it's hidden
Hide the webengine demo on the new nexus7
Add local CSS tetrahedron example and home page to webengine demo
Disable webengine demo on beaglebone and pi
[launchersettings] Add boundaries for signal strength bar.
Also deploy webengine demo local content
Display an error message if WebGL is not supported.
Add a simple WebEngine demo to the B2Qt basicsuite
Exclude qtdatavis3d from android-beaglebone
Disable autocompletion for password field
workaround for crash on linux
Camera demo doesn't work on new nexus just yet, exclude it
Remove yocto version from about-b2qt demo
remove datavis 3D from RPi launher demos
Fix typo in came exclude
Use consistent title naming
Remove non functional demos from i.MX6 SABRE SD launcher demo set
...
Change-Id: Ib08aba9f746c6f233090d79c38243caa657bf9be
Diffstat (limited to 'basicsuite/webengine/content/webgl/helloqt.js')
-rw-r--r-- | basicsuite/webengine/content/webgl/helloqt.js | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/basicsuite/webengine/content/webgl/helloqt.js b/basicsuite/webengine/content/webgl/helloqt.js new file mode 100644 index 0000000..b514628 --- /dev/null +++ b/basicsuite/webengine/content/webgl/helloqt.js @@ -0,0 +1,223 @@ +var shadow = false; + +var container = document.getElementById("container"); +var camera = null; +var scene; +var renderer; +var cbTexture; +var cbScene; +var cbCamera; +var cbUniforms = { + dy: { type: "f", value: 0 } +}; +var cb; +var logo; +var spotlight; + +var viewSize = { + w: 0, + h: 0, + update: function () { + viewSize.w = window.innerWidth;// / 2; + viewSize.h = window.innerHeight;// / 2; + } +}; + +var onResize = function (event) { + viewSize.update(); + if (!camera) { + camera = new THREE.PerspectiveCamera(60, viewSize.w / viewSize.h, 0.01, 100); + } else { + camera.aspect = viewSize.w / viewSize.h; + camera.updateProjectionMatrix(); + } + renderer.setSize(viewSize.w, viewSize.h); +}; + +var setupCheckerboard = function () { + cbTexture = new THREE.WebGLRenderTarget(512, 512, + { minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBFormat }); + cbScene = new THREE.Scene(); + cbCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, -100, 100); + var geom = new THREE.PlaneGeometry(2, 2); + var material = new THREE.ShaderMaterial({ + uniforms: cbUniforms, + vertexShader: document.getElementById("vsChecker").textContent, + fragmentShader: document.getElementById("fsChecker").textContent + }); + var mesh = new THREE.Mesh(geom, material); + cbScene.add(mesh); +}; + +var renderCheckerboard = function () { + cbUniforms.dy.value += 0.01; + renderer.render(cbScene, cbCamera, cbTexture, true); +}; + +var generateLogo = function () { + var geom = new THREE.Geometry(); + var idx = 0; + for (var i = 0; i < qtlogo.length; i += 18) { + geom.vertices.push(new THREE.Vector3(qtlogo[i], qtlogo[i+1], qtlogo[i+2])); + var n1 = new THREE.Vector3(qtlogo[i+3], qtlogo[i+4], qtlogo[i+5]); + geom.vertices.push(new THREE.Vector3(qtlogo[i+6], qtlogo[i+7], qtlogo[i+8])); + var n2 = new THREE.Vector3(qtlogo[i+9], qtlogo[i+10], qtlogo[i+11]); + geom.vertices.push(new THREE.Vector3(qtlogo[i+12], qtlogo[i+13], qtlogo[i+14])); + var n3 = new THREE.Vector3(qtlogo[i+15], qtlogo[i+16], qtlogo[i+17]); + geom.faces.push(new THREE.Face3(idx, idx+1, idx+2, [n1, n2, n3])); + idx += 3; + } + return geom; +}; + +var setupScene = function () { + if (shadow) + renderer.shadowMapEnabled = true; + + setupCheckerboard(); + var geom = new THREE.PlaneGeometry(4, 4); + var material = new THREE.MeshPhongMaterial({ ambient: 0x060606, + color: 0x40B000, + specular: 0x03AA00, + shininess: 10, + map: cbTexture }); + cb = new THREE.Mesh(geom, material); + if (shadow) + cb.receiveShadow = true; +// cb.rotation.x = -Math.PI / 3; + scene.add(cb); + + geom = generateLogo(); + material = new THREE.MeshPhongMaterial({ ambient: 0x060606, + color: 0x40B000, + specular: 0x03AA00, + shininess: 10 }); + logo = new THREE.Mesh(geom, material); + logo.position.z = 2; + logo.rotation.x = Math.PI; + if (shadow) + logo.castShadow = true; + scene.add(logo); + + spotlight = new THREE.SpotLight(0xFFFFFF); + spotlight.position.set(0, 0.5, 4); + scene.add(spotlight); + + if (shadow) { + spotlight.castShadow = true; + spotlight.shadowCameraNear = 0.01; + spotlight.shadowCameraFar = 100; + spotlight.shadowDarkness = 0.5; + spotlight.shadowMapWidth = 1024; + spotlight.shadowMapHeight = 1024; + } + + camera.position.z = 4; +}; + +var render = function () { + requestAnimationFrame(render); + renderCheckerboard(); + renderer.render(scene, camera); + logo.rotation.y += 0.01; +}; + +var pointerState = { + x: 0, + y: 0, + active: false, + touchId: 0 +}; + +var onMouseDown = function (e) { + e.preventDefault(); + if (pointerState.active) + return; + + if (e.changedTouches) { + var t = e.changedTouches[0]; + pointerState.touchId = t.identifier; + pointerState.x = t.clientX; + pointerState.y = t.clientY; + } else { + pointerState.x = e.clientX; + pointerState.y = e.clientY; + } + pointerState.active = true; +}; + +var onMouseUp = function (e) { + e.preventDefault(); + if (!pointerState.active) + return; + + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; ++i) + if (e.changedTouches[i].identifier == pointerState.touchId) { + pointerState.active = false; + break; + } + } else { + pointerState.active = false; + } +}; + +var onMouseMove = function (e) { + e.preventDefault(); + if (!pointerState.active) + return; + + var x, y; + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; ++i) + if (e.changedTouches[i].identifier == pointerState.touchId) { + x = e.changedTouches[i].clientX; + y = e.changedTouches[i].clientY; + break; + } + } else { + x = e.clientX; + y = e.clientY; + } + if (x === undefined) + return; + + var dx = x - pointerState.x; + var dy = y - pointerState.y; + pointerState.x = x; + pointerState.y = y; + dx /= 100; + dy /= -100; + spotlight.target.position.set(spotlight.target.position.x + dx, + spotlight.target.position.y + dy, + 0); +}; + +var main = function () { + scene = new THREE.Scene(); + try { + renderer = new THREE.WebGLRenderer({ antialias: false /*true*/ }); + } catch (e) { + console.log("Could not create WebGLRenderer."); + container.innerHTML = noWebGLMessage= "<div style=\"font-family: monospace; font-size: 13px; margin: 5em auto 0px; padding: 2em; width: 400px; " + + "height 100px; text-align: center; background-color: rgb(238, 238, 238);\">WebGLRenderer could not be created.</div>"; + return; + } + + container.appendChild(renderer.domElement); + onResize(); + window.addEventListener("resize", onResize); + window.addEventListener("mousedown", onMouseDown); + window.addEventListener("touchstart", onMouseDown); + window.addEventListener("mouseup", onMouseUp); + window.addEventListener("touchend", onMouseUp); + window.addEventListener("touchcancel", onMouseUp); + window.addEventListener("mousemove", onMouseMove); + window.addEventListener("touchmove", onMouseMove); + setupScene(); + render(); +}; + +main(); |