Browse Source

Updated 3dm loader

Changed Dot translation to THREE.Sprites. Added Support for lights.
Luis Fraguada 5 years ago
parent
commit
9d979135eb
2 changed files with 37 additions and 29 deletions
  1. 36 19
      examples/jsm/loaders/3DMLoader.js
  2. 1 10
      examples/webgl_loader_3dm.html

+ 36 - 19
examples/jsm/loaders/3DMLoader.js

@@ -15,9 +15,13 @@ import {
 	PointLight,
 	PointLight,
 	SpotLight,
 	SpotLight,
 	RectAreaLight,
 	RectAreaLight,
-	Vector3
+	Vector3,
+	Sprite,
+	SpriteMaterial,
+	CanvasTexture,
+	LinearFilter,
+	ClampToEdgeWrapping
 } from "../../../build/three.module.js";
 } from "../../../build/three.module.js";
-import { CSS2DObject } from '../renderers/CSS2DRenderer.js';
 
 
 var Rhino3dmLoader = function ( manager ) {
 var Rhino3dmLoader = function ( manager ) {
 
 
@@ -431,26 +435,39 @@ Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 			case 'TextDot':
 			case 'TextDot':
 
 
 				geometry = obj.geometry;
 				geometry = obj.geometry;
-				var dotDiv = document.createElement( 'div' );
-				dotDiv.style.fontFamily = geometry.fontFace;
-				dotDiv.style.fontSize = `${geometry.fontHeight}px`;
-				dotDiv.style.marginTop = '-1em';
-				dotDiv.style.color = '#FFF';
-				dotDiv.style.padding = '2px';
-				dotDiv.style.paddingRight = '5px';
-				dotDiv.style.paddingLeft = '5px';
-				dotDiv.style.borderRadius = '5px';
+
+				var ctx = document.createElement( 'canvas' ).getContext( '2d' );
+				var font = `${geometry.fontHeight}px ${geometry.fontFace}`;
+				ctx.font = font;
+				var width = ctx.measureText( geometry.text ).width + 10;
+				var height = geometry.fontHeight + 10;
+
+				ctx.canvas.width = width;
+				ctx.canvas.height = height;
+
+				ctx.font = font;
+				ctx.textBaseline = 'middle';
+				ctx.textAlign = 'center';
 				var color = attributes.drawColor;
 				var color = attributes.drawColor;
-				dotDiv.style.background = `rgba(${color.r},${color.g},${color.b},${color.a})`;
-				dotDiv.textContent = geometry.text;
-				var dot = new CSS2DObject( dotDiv );
-				var location = geometry.point;
-				dot.position.set( location[ 0 ], location[ 1 ], location[ 2 ] );
+				ctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${color.a})`;
+				ctx.fillRect( 0, 0, width, height );
+				ctx.fillStyle = 'white';
+				ctx.fillText( geometry.text, width / 2, height / 2 );
+
+				var texture = new CanvasTexture( ctx.canvas );
+				texture.minFilter = LinearFilter;
+				texture.wrapS = ClampToEdgeWrapping;
+				texture.wrapT = ClampToEdgeWrapping;
+
+				var material = new SpriteMaterial( { map: texture, depthTest: false } );
+				var sprite = new Sprite( material );
+				sprite.position.set( geometry.point[ 0 ], geometry.point[ 1 ], geometry.point[ 2 ] );
+				sprite.scale.set( width / 10, height / 10, 1.0 );
 
 
-				dot.userData[ 'attributes' ] = attributes;
-				dot.userData[ 'objectType' ] = obj.objectType;
+				sprite.userData[ 'attributes' ] = attributes;
+				sprite.userData[ 'objectType' ] = obj.objectType;
 
 
-				return dot;
+				return sprite;
 
 
 			case 'Light':
 			case 'Light':
 
 

+ 1 - 10
examples/webgl_loader_3dm.html

@@ -15,7 +15,6 @@
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';
-			import { CSS2DRenderer } from './jsm/renderers/CSS2DRenderer.js';
 
 
 			import { OrbitControls } from './jsm/controls/OrbitControls.js';
 			import { OrbitControls } from './jsm/controls/OrbitControls.js';
 			import { Rhino3dmLoader } from './jsm/loaders/3DMLoader.js';
 			import { Rhino3dmLoader } from './jsm/loaders/3DMLoader.js';
@@ -23,7 +22,7 @@
 			import { GUI } from './jsm/libs/dat.gui.module.js';
 			import { GUI } from './jsm/libs/dat.gui.module.js';
 
 
 			var container, controls;
 			var container, controls;
-			var camera, scene, renderer, labelRenderer;
+			var camera, scene, renderer;
 			var gui;
 			var gui;
 
 
 			init();
 			init();
@@ -66,12 +65,6 @@
 				renderer.setSize( width, height );
 				renderer.setSize( width, height );
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
-				labelRenderer = new CSS2DRenderer();
-				labelRenderer.setSize( width, height );
-				labelRenderer.domElement.style.position = 'absolute';
-				labelRenderer.domElement.style.top = '0px';
-				container.appendChild( labelRenderer.domElement );
-
 				controls = new OrbitControls( camera, container );
 				controls = new OrbitControls( camera, container );
 
 
 				window.addEventListener( 'resize', resize, false );
 				window.addEventListener( 'resize', resize, false );
@@ -87,7 +80,6 @@
 				camera.updateProjectionMatrix();
 				camera.updateProjectionMatrix();
 
 
 				renderer.setSize( width, height );
 				renderer.setSize( width, height );
-				labelRenderer.setSize( width, height );
 
 
 			}
 			}
 
 
@@ -95,7 +87,6 @@
 
 
 				controls.update();
 				controls.update();
 				renderer.render( scene, camera );
 				renderer.render( scene, camera );
-				labelRenderer.render( scene, camera );
 
 
 				requestAnimationFrame( animate );
 				requestAnimationFrame( animate );