Bladeren bron

Updated TDSLoader

Tentone 8 jaren geleden
bovenliggende
commit
80686ac013
1 gewijzigde bestanden met toevoegingen van 95 en 19 verwijderingen
  1. 95 19
      examples/js/loaders/TDSLoader.js

+ 95 - 19
examples/js/loaders/TDSLoader.js

@@ -1,10 +1,10 @@
-/**
- * Autodesk 3DS threee.js file loader based on lib3ds.
+/*
+ * Autodesk 3DS threee.js file loader, based on lib3ds.
  * 
  * Loads geometry with uv and materials basic properties.
  * 
- * @author @timknip
  * @author @tentone
+ * @author @timknip
  */
 
 "use strict";
@@ -12,7 +12,7 @@
 THREE.TDSLoader = function(manager)
 {
 	this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;
-	this.debug = true;
+	this.debug = false;
 
 	this.group = null;
 	this.position = 0;
@@ -179,14 +179,33 @@ THREE.TDSLoader.prototype.readMaterialEntry = function(data)
 		}
 		else if(next === MAT_TEXMAP)
 		{
-			this.debugMessage("   Map");
+			this.debugMessage("   Map (TODO ImageLoader)");
 			//var map = this.readMap(data);
 			//TODO <ADD CODE HERE>
 		}
 		else if(next === MAT_BUMPMAP)
 		{
-			this.debugMessage("   BumpMap");
-			//var bumpMap = this.readMap(data);
+			this.debugMessage("   BumpMap (TODO ImageLoader)");
+			//TODO <ADD CODE HERE>
+		}
+		else if(next == MAT_OPACMAP)
+		{
+			this.debugMessage("   OpacityMap (TODO ImageLoader)");
+			//TODO <ADD CODE HERE>
+		}
+		else if(next == MAT_SPECMAP)
+		{
+			this.debugMessage("   SpecularMap (TODO ImageLoader)");
+			//TODO <ADD CODE HERE>
+		}
+		else if(next == MAT_SHINMAP)
+		{
+			this.debugMessage("   ShininessrMap (TODO ImageLoader)");
+			//TODO <ADD CODE HERE>
+		}
+		else if(next == MAT_REFLMAP)
+		{
+			this.debugMessage("   RelectMap (TODO ImageLoader)");
 			//TODO <ADD CODE HERE>
 		}
 		else
@@ -241,7 +260,19 @@ THREE.TDSLoader.prototype.readMesh = function(data)
 	var chunk = this.readChunk(data);
 	var next = this.nextChunk(data, chunk);
 
-	var geometry = new THREE.Geometry();
+	var useBufferGeometry = false;
+	var geometry = null;
+	var uvs = [];
+
+	if(useBufferGeometry)
+	{
+		geometry = new THREE.BufferGeometry();
+	}
+	else
+	{
+		geometry = new THREE.Geometry();
+	}
+
 	var material = new THREE.MeshPhongMaterial();
 	var mesh = new THREE.Mesh(geometry, material);
 	mesh.name = "mesh";
@@ -252,12 +283,28 @@ THREE.TDSLoader.prototype.readMesh = function(data)
 		{
 			var points = this.readWord(data);
 
-			for(var i = 0; i < points; i++)
+			this.debugMessage("   Vertex: " + points);
+
+			//BufferGeometry
+			if(useBufferGeometry)
 			{
-				geometry.vertices.push(new THREE.Vector3(this.readFloat(data), this.readFloat(data), this.readFloat(data)));
+				var vertices = [];
+				for(var i = 0; i < points; i++)
+				{
+					vertices.push(this.readFloat(data));
+					vertices.push(this.readFloat(data));
+					vertices.push(this.readFloat(data));
+				}
+				geometry.addAttribute("position", new THREE.BufferAttribute(new Float32Array(vertices), 3));
+			}
+			//Geometry
+			else
+			{
+				for(var i = 0; i < points; i++)
+				{
+					geometry.vertices.push(new THREE.Vector3(this.readFloat(data), this.readFloat(data), this.readFloat(data)));
+				}
 			}
-
-			this.debugMessage("   Vertex: " + points);
 		}
 		else if(next === FACE_ARRAY)
 		{
@@ -268,16 +315,32 @@ THREE.TDSLoader.prototype.readMesh = function(data)
 		{
 			var texels = this.readWord(data);
 
-			for(var i = 0; i < texels; i++)
+			this.debugMessage("   UV: " + texels);
+
+			//BufferGeometry
+			if(useBufferGeometry)
 			{
-				//geometry.faceVertexUvs[0].push(new THREE.Vector2(this.readFloat(data), this.readFloat(data)));
+				var uvs = [];
+				for(var i = 0; i < texels; i++)
+				{
+					uvs.push(this.readFloat(data));
+					uvs.push(this.readFloat(data));
+				}
+				geometry.addAttribute("uv", new THREE.BufferAttribute(new Float32Array(uvs), 2));
+			}
+			//Geometry
+			else
+			{
+				uvs = [];
+				for(var i = 0; i < texels; i++)
+				{
+					uvs.push(new THREE.Vector2(this.readFloat(data), this.readFloat(data)));
+				}
 			}
-
-			this.debugMessage("   UV: " + texels);
 		}
 		else if(next === MESH_MATRIX)
 		{
-			this.debugMessage("   Matrix");
+			this.debugMessage("   Tranformation Matrix (TODO)");
 			//TODO <ADD CODE HERE>
 		}
 		else
@@ -287,9 +350,21 @@ THREE.TDSLoader.prototype.readMesh = function(data)
 
 		next = this.nextChunk(data, chunk);
 	}
-
 	this.endChunk(chunk);
 
+	if(!useBufferGeometry)
+	{
+		//geometry.faceVertexUvs[0][faceIndex][vertexIndex]
+		var faceUV = [];
+		for(var i = 0; i < geometry.faces.length; i++)
+		{
+			faceUV.push([uvs[geometry.faces[i].a], uvs[geometry.faces[i].b], uvs[geometry.faces[i].c]]);
+		}
+		geometry.faceVertexUvs[0] = faceUV;
+
+		geometry.computeVertexNormals();
+	}
+
 	return mesh;
 };
 
@@ -333,7 +408,7 @@ THREE.TDSLoader.prototype.readFaceArray = function(data, mesh)
 		}
 		else if(chunk.id === SMOOTH_GROUP)
 		{
-			this.debugMessage("      Smooth Group");
+			this.debugMessage("      Smooth Group (TODO)");
 			//TODO <ADD CODE HERE>
 		}
 		else
@@ -347,6 +422,7 @@ THREE.TDSLoader.prototype.readFaceArray = function(data, mesh)
 	this.endChunk(chunk);
 };
 
+
 THREE.TDSLoader.prototype.readMap = function(data)
 {
 	var chunk = this.readChunk(data);