Răsfoiți Sursa

Added example using a canvas as a texture.

Chris Brown 8 ani în urmă
părinte
comite
b5da8c8867
1 a modificat fișierele cu 165 adăugiri și 0 ștergeri
  1. 165 0
      examples/webgl_materials_texture_canvas.html

+ 165 - 0
examples/webgl_materials_texture_canvas.html

@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - materials - canvas texture</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<style>
+			body {
+				margin: 0px;
+				background-color: #050505;
+				color: #fff;
+				overflow: hidden;
+			}
+
+			a { color: #e00 }
+
+			#info {
+				position: absolute;
+				top: 0px; width: 100%;
+				color: #ffffff;
+				padding: 5px;
+				font-family: Monospace;
+				font-size: 13px;
+				text-align: center;
+				z-index: 1000;
+			}
+
+			#drawing-canvas {
+				position: absolute;
+				background-color: #000000;
+				top: 0px;
+				right: 0px;
+				z-index: 3000;
+				cursor: crosshair;
+			}
+		</style>
+	</head>
+	<body>
+
+		<div id="info">
+			<a href="http://threejs.org" target="_blank">three.js</a> - webgl - canvas as a texture
+			<div>click and draw in the white box</div>
+		</div>
+		<canvas id="drawing-canvas" height="128" width="128"></canvas>
+
+		<script src="../build/three.js"></script>
+
+		<script src="js/Detector.js"></script>
+		<script src="js/libs/stats.min.js"></script>
+
+		<script>
+
+			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
+
+			var camera, scene, renderer, mesh, material;
+			var drawStartPos = { x: 0, y: 0 };
+
+			init();
+			setupCanvasDrawing();
+			animate();
+
+			function init() {
+
+				camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 2000 );
+				camera.position.z = 400;
+
+				scene = new THREE.Scene();
+
+				geometry = new THREE.BoxGeometry( 200, 200, 200 );
+
+				material = new THREE.MeshBasicMaterial();
+
+				mesh = new THREE.Mesh( geometry, material );
+				scene.add( mesh );
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				document.body.appendChild( renderer.domElement );
+
+				stats = new Stats();
+				document.body.appendChild( stats.dom );
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+			
+			// Sets up the drawing canvas and adds it as the material map.
+			function setupCanvasDrawing() {
+				// get canvas and context
+				var drawingCanvas = document.getElementById( 'drawing-canvas' );
+				var drawingContext = drawingCanvas.getContext( '2d' );
+
+				// draw white background
+				drawingContext.fillStyle = "#FFFFFF";
+				drawingContext.fillRect( 0, 0, 128, 128 );
+
+				// set canvas as material.map (this could be done to any map, bump, displacement etc.)
+				material.map = new THREE.Texture( drawingCanvas );
+				// need to flag the map as needing updating.
+				material.map.needsUpdate = true;
+
+				// set the variable to keep track of when to draw
+				var paint = false;
+
+				// add canvas event listeners
+				drawingCanvas.addEventListener( 'mousedown', function( e ) {
+					paint = true;
+					drawStartPos = { x: e.offsetX, y: e.offsetY };
+				} );
+
+				drawingCanvas.addEventListener( 'mousemove', function( e ) {
+					if(paint){
+						draw( drawingContext, e.offsetX, e.offsetY );
+					}
+				} );
+
+				drawingCanvas.addEventListener( 'mouseup', function( e ) {
+					paint = false;
+				} );
+				
+				drawingCanvas.addEventListener( 'mouseleave', function( e ) {
+					paint = false;
+				} );
+
+			}
+
+			function draw( drawContext, x, y ) {
+
+				drawContext.moveTo( drawStartPos.x, drawStartPos.y );
+				drawContext.strokeStyle = '#000000';
+				drawContext.lineTo( x, y );
+				drawContext.stroke();
+				// reset drawing start position to current position.
+				drawStartPos = { x: x, y: y };
+				// need to flag the map as needing updating.
+				material.map.needsUpdate = true;
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+
+				mesh.rotation.x += 0.01;
+				mesh.rotation.y += 0.01;
+
+				renderer.render( scene, camera );
+				stats.update();
+
+			}
+
+		</script>
+
+	</body>
+</html>