Added doc on mesh.js
This commit is contained in:
parent
ebc30a3bc5
commit
e000ce6a34
234
geo/Mesh.js
234
geo/Mesh.js
|
@ -1,6 +1,9 @@
|
||||||
var mesh = {};
|
var mesh = {};
|
||||||
|
|
||||||
// Mesh
|
/**
|
||||||
|
* Reprensents a mesh
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
mesh.Mesh = function() {
|
mesh.Mesh = function() {
|
||||||
this.vertices = [];
|
this.vertices = [];
|
||||||
this.faces = [];
|
this.faces = [];
|
||||||
|
@ -12,14 +15,26 @@ mesh.Mesh = function() {
|
||||||
this.finished = false;
|
this.finished = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if there are normals in the mesh
|
||||||
|
* @returns {Boolean} true if there are normals in the mesh, false otherwise
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.hasNormals = function() {
|
mesh.Mesh.prototype.hasNormals = function() {
|
||||||
return this.normals.length > 0;
|
return this.normals.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if there are texture coordinates in the mesh
|
||||||
|
* @returns {Boolean} true if there are texture coordinates in the mesh, false otherwise
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.hasTexCoords = function() {
|
mesh.Mesh.prototype.hasTexCoords = function() {
|
||||||
return this.texCoords.length > 0;
|
return this.texCoords.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a vertex to a mesh
|
||||||
|
* @param {mesh.Vertex|String} A Vertex object or its string representation
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.addVertex = function(vertex) {
|
mesh.Mesh.prototype.addVertex = function(vertex) {
|
||||||
|
|
||||||
if (vertex instanceof mesh.Vertex) {
|
if (vertex instanceof mesh.Vertex) {
|
||||||
|
@ -34,6 +49,10 @@ mesh.Mesh.prototype.addVertex = function(vertex) {
|
||||||
return this.vertices[this.vertices.length - 1];
|
return this.vertices[this.vertices.length - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a face to a mesh
|
||||||
|
* @param {mesh.Face|String} A Face object or its string representation
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.addFaces = function(face) {
|
mesh.Mesh.prototype.addFaces = function(face) {
|
||||||
var faces;
|
var faces;
|
||||||
|
|
||||||
|
@ -54,6 +73,10 @@ mesh.Mesh.prototype.addFaces = function(face) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a texture coordinate to a mesh
|
||||||
|
* @param {mesh.TexCoord|String} A TexCoord object or its string representation
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.addTexCoord = function(texCoord) {
|
mesh.Mesh.prototype.addTexCoord = function(texCoord) {
|
||||||
if (texCoord instanceof mesh.TexCoord) {
|
if (texCoord instanceof mesh.TexCoord) {
|
||||||
this.texCoords.push(texCoord);
|
this.texCoords.push(texCoord);
|
||||||
|
@ -67,6 +90,10 @@ mesh.Mesh.prototype.addTexCoord = function(texCoord) {
|
||||||
return this.texCoords[this.texCoords.length - 1];
|
return this.texCoords[this.texCoords.length - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a normal to a mesh
|
||||||
|
* @param {mesh.Normal|String} A Normal object or its string representation
|
||||||
|
*/
|
||||||
mesh.Mesh.prototype.addNormal = function(normal) {
|
mesh.Mesh.prototype.addNormal = function(normal) {
|
||||||
if (normal instanceof mesh.Normal) {
|
if (normal instanceof mesh.Normal) {
|
||||||
this.normals.push(normal);
|
this.normals.push(normal);
|
||||||
|
@ -84,26 +111,69 @@ mesh.Mesh.prototype.isFinished = function() {
|
||||||
return this.faceIndex === this.faces.length;
|
return this.faceIndex === this.faces.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vertex
|
/**
|
||||||
|
* Represent a 3D vertex
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
mesh.Vertex = function() {
|
mesh.Vertex = function() {
|
||||||
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
||||||
var split = arguments[0].replace(/\s+/g, " ").split(' ');
|
var split = arguments[0].replace(/\s+/g, " ").split(' ');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* x coordinate of the vertex
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.x = parseFloat(split[1]);
|
this.x = parseFloat(split[1]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* y coordinate of the vertex
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.y = parseFloat(split[2]);
|
this.y = parseFloat(split[2]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* z coordinate of the vertex
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.z = parseFloat(split[3]);
|
this.z = parseFloat(split[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the vertex has been sent or not
|
||||||
|
* @type {Boolean}
|
||||||
|
*/
|
||||||
this.sent = false;
|
this.sent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a list representation of the vertex
|
||||||
|
* @returns {Array} An array representing the vertex
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var vertex = new mesh.Vertex('v 3.5 3.6 3.7');
|
||||||
|
* vertex.index = 5;
|
||||||
|
* console.log(vertex.toList()); // Prints ['v', 5, 3.5, 3.6, 3.7]
|
||||||
|
*/
|
||||||
mesh.Vertex.prototype.toList = function() {
|
mesh.Vertex.prototype.toList = function() {
|
||||||
return ['v', this.index, this.x, this.y, this.z];
|
return ['v', this.index, this.x, this.y, this.z];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a string representation of the vertex
|
||||||
|
* @returns {string} A string representing the vertex
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var vertex = new mesh.Vertex('v 3.5 3.6 3.7');
|
||||||
|
* console.log(vertex.toList()); // Prints v 3.5 3.6 3.7
|
||||||
|
*/
|
||||||
mesh.Vertex.prototype.toString = function() {
|
mesh.Vertex.prototype.toString = function() {
|
||||||
return 'v ' + this.x + ' ' + this.y + ' ' + this.z;
|
return 'v ' + this.x + ' ' + this.y + ' ' + this.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal is the same as a vertex, except for toList and toString
|
/**
|
||||||
|
* Represent a 3D normal
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
mesh.Normal = function() {
|
mesh.Normal = function() {
|
||||||
mesh.Vertex.apply(this, arguments);
|
mesh.Vertex.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
@ -111,38 +181,93 @@ mesh.Normal = function() {
|
||||||
mesh.Normal.prototype = Object.create(mesh.Vertex.prototype);
|
mesh.Normal.prototype = Object.create(mesh.Vertex.prototype);
|
||||||
mesh.Normal.prototype.constructor = mesh.Normal;
|
mesh.Normal.prototype.constructor = mesh.Normal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a list representation of the normal
|
||||||
|
* @returns {Array} An array representing the normal
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var normal = new mesh.Normal('vn 3.5 3.6 3.7');
|
||||||
|
* normal.index = 5;
|
||||||
|
* console.log(normal.toList()); // Prints ['vn', 5, 3.5, 3.6, 3.7]
|
||||||
|
*/
|
||||||
mesh.Normal.prototype.toList = function() {
|
mesh.Normal.prototype.toList = function() {
|
||||||
var superObject = mesh.Vertex.prototype.toList.call(this);
|
var superObject = mesh.Vertex.prototype.toList.call(this);
|
||||||
superObject[0] = 'vn';
|
superObject[0] = 'vn';
|
||||||
return superObject;
|
return superObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a string representation of the normal
|
||||||
|
* @returns {string} A string representing the normal
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var normal = new mesh.Normal('vn 3.5 3.6 3.7');
|
||||||
|
* console.log(normal.toList()); // Prints vn 3.5 3.6 3.7
|
||||||
|
*/
|
||||||
mesh.Normal.toString = function() {
|
mesh.Normal.toString = function() {
|
||||||
var superObject = mesh.Vertex.prototype.toString.call(this);
|
var superObject = mesh.Vertex.prototype.toString.call(this);
|
||||||
superObject.replace('v', 'vn');
|
superObject.replace('v', 'vn');
|
||||||
return superObject;
|
return superObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TexCoord : texture coordinates
|
/**
|
||||||
|
* Represent a texture coordinate element
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
mesh.TexCoord = function() {
|
mesh.TexCoord = function() {
|
||||||
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
||||||
var split = arguments[0].replace(/\s+/g, " ").split(' ');
|
var split = arguments[0].replace(/\s+/g, " ").split(' ');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* x coordinate of the texture
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.x = parseFloat(split[1]);
|
this.x = parseFloat(split[1]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* y coordinate of the texture
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.y = parseFloat(split[2]);
|
this.y = parseFloat(split[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the vertex has been sent or not
|
||||||
|
* @type {Boolean}
|
||||||
|
*/
|
||||||
this.sent = false;
|
this.sent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a list representation of the texture coordinate
|
||||||
|
* @returns {Array} An array representing the texture coordinate
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var texCoord = new mesh.TexCoord('vt 3.5 3.6');
|
||||||
|
* texture coordinate.index = 5;
|
||||||
|
* console.log(texture coordinate.toList()); // Prints ['vt', 5, 3.5, 3.6]
|
||||||
|
*/
|
||||||
mesh.TexCoord.prototype.toList = function() {
|
mesh.TexCoord.prototype.toList = function() {
|
||||||
return ['vt', this.index, this.x, this.y];
|
return ['vt', this.index, this.x, this.y];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a string representation of the texture coordinate
|
||||||
|
* @returns {string} A string representing the texture coordinate
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var texCoord = new mesh.TexCoord('vt 3.5 3.6');
|
||||||
|
* console.log(texCoord.toList()); // Prints vt 3.5 3.6
|
||||||
|
*/
|
||||||
mesh.TexCoord.prototype.toString = function() {
|
mesh.TexCoord.prototype.toString = function() {
|
||||||
return 'vt ' + this.x + ' ' + this.y;
|
return 'vt ' + this.x + ' ' + this.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Face
|
/**
|
||||||
|
* Represents a face
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
mesh.Face = function() {
|
mesh.Face = function() {
|
||||||
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
if (typeof arguments[0] === 'string' || arguments[0] instanceof String) {
|
||||||
if (arguments[0].indexOf('/') === -1) {
|
if (arguments[0].indexOf('/') === -1) {
|
||||||
|
@ -165,25 +290,78 @@ mesh.Face = function() {
|
||||||
var tIndex = 1;
|
var tIndex = 1;
|
||||||
var nIndex = 2;
|
var nIndex = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the first vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.a = parseInt(split1[vIndex]) - 1;
|
this.a = parseInt(split1[vIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the second vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.b = parseInt(split2[vIndex]) - 1;
|
this.b = parseInt(split2[vIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the third vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.c = parseInt(split3[vIndex]) - 1;
|
this.c = parseInt(split3[vIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the texture coordinate of the first vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.aTexture = parseInt(split1[tIndex]) - 1;
|
this.aTexture = parseInt(split1[tIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the texture coordinate of the second vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.bTexture = parseInt(split2[tIndex]) - 1;
|
this.bTexture = parseInt(split2[tIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the texture coordinate of the third vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.cTexture = parseInt(split3[tIndex]) - 1;
|
this.cTexture = parseInt(split3[tIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the normal of the first vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.aNormal = parseInt(split1[nIndex]) - 1;
|
this.aNormal = parseInt(split1[nIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the normal of the second vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.bNormal = parseInt(split2[nIndex]) - 1;
|
this.bNormal = parseInt(split2[nIndex]) - 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* index of the normal of the third vertex of the face
|
||||||
|
* @type {Number}
|
||||||
|
*/
|
||||||
this.cNormal = parseInt(split3[nIndex]) - 1;
|
this.cNormal = parseInt(split3[nIndex]) - 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the vertex has been sent or not
|
||||||
|
* @type {Boolean}
|
||||||
|
*/
|
||||||
this.sent = false;
|
this.sent = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a face line and returns an array of faces
|
||||||
|
*
|
||||||
|
* @param {String} a string representing a face
|
||||||
|
* @returns {Face[]} a single 3-vertices face or two 3-vertices face if it was
|
||||||
|
* a 4-vertices face
|
||||||
|
*/
|
||||||
var parseFace = function(arg) {
|
var parseFace = function(arg) {
|
||||||
|
|
||||||
var split = arg.trim().split(' ');
|
var split = arg.trim().split(' ');
|
||||||
|
@ -209,6 +387,10 @@ var parseFace = function(arg) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the max index of the vertices of the face
|
||||||
|
* @returns {Number} the max index of the vertices
|
||||||
|
*/
|
||||||
mesh.Face.prototype.max = function() {
|
mesh.Face.prototype.max = function() {
|
||||||
if (this.d !== undefined) {
|
if (this.d !== undefined) {
|
||||||
return Math.max(this.a, this.b, this.c, this.d);
|
return Math.max(this.a, this.b, this.c, this.d);
|
||||||
|
@ -217,6 +399,10 @@ mesh.Face.prototype.max = function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the max index of the texture coordinates of the face
|
||||||
|
* @returns {Number} the max index of the texture coordinates
|
||||||
|
*/
|
||||||
mesh.Face.prototype.maxTexture = function() {
|
mesh.Face.prototype.maxTexture = function() {
|
||||||
if (this.dTexture) {
|
if (this.dTexture) {
|
||||||
return Math.max(this.aTexture, this.bTexture, this.cTexture, this.dTexture);
|
return Math.max(this.aTexture, this.bTexture, this.cTexture, this.dTexture);
|
||||||
|
@ -225,6 +411,22 @@ mesh.Face.prototype.maxTexture = function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a list representation of the face
|
||||||
|
* @returns {Array} An array representing the texture coordinate
|
||||||
|
* <ol start=0>
|
||||||
|
* <li>'f'</li>
|
||||||
|
* <li>the index of the face</li>
|
||||||
|
* <li>a list containing the indices of the vertex of the face</li>
|
||||||
|
* <li>a list containing the indices of the texture coordinates</li>
|
||||||
|
* <li>a list containing the indices of the normals</li>
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var face = new mesh.Face('f 1/2/3 4/5/6 7/8/9');
|
||||||
|
* texture coordinate.index = 5;
|
||||||
|
* console.log(texture coordinate.toList()); // Prints ['f', 5, [1,4,7], [2,5,8], [3,6,9]]
|
||||||
|
*/
|
||||||
mesh.Face.prototype.toList = function() {
|
mesh.Face.prototype.toList = function() {
|
||||||
var l = ['f', this.index, this.meshIndex,
|
var l = ['f', this.index, this.meshIndex,
|
||||||
[this.a, this.b, this.c ],
|
[this.a, this.b, this.c ],
|
||||||
|
@ -251,16 +453,36 @@ mesh.Face.prototype.toString = function() {
|
||||||
return 'f ' + this.a + ' ' + this.b + ' ' + this.c + (this.d !== undefined ? ' ' + this.d : '');
|
return 'f ' + this.a + ' ' + this.b + ' ' + this.c + (this.d !== undefined ? ' ' + this.d : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Material
|
/**
|
||||||
|
* Represents a material name
|
||||||
|
* @constructor
|
||||||
|
* @param {string} line the string representing the material
|
||||||
|
*/
|
||||||
mesh.Material = function() {
|
mesh.Material = function() {
|
||||||
var split = arguments[0].replace(/\s+/g, ' ').trim().split(' ');
|
var split = arguments[0].replace(/\s+/g, ' ').trim().split(' ');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the material
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
this.name = split[1];
|
this.name = split[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a string representation of the material
|
||||||
|
* @returns {string} obj representation of usemtl
|
||||||
|
*/
|
||||||
mesh.Material.prototype.toString = function() {
|
mesh.Material.prototype.toString = function() {
|
||||||
return 'usemtl ' + this.name;
|
return 'usemtl ' + this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives a list representation of the material
|
||||||
|
* @returns {array} an array representing the material
|
||||||
|
* @example
|
||||||
|
* var material = new mesh.Material('usemtl MyMaterial');
|
||||||
|
* console.log(material.toList()); // Logs ['u', 'MyMaterial']
|
||||||
|
*/
|
||||||
mesh.Material.prototype.toList = function() {
|
mesh.Material.prototype.toList = function() {
|
||||||
return ['u', this.name];
|
return ['u', this.name];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue