Added doc on mesh.js

This commit is contained in:
Thomas FORGIONE 2015-06-22 17:12:24 +02:00
parent ebc30a3bc5
commit e000ce6a34
1 changed files with 228 additions and 6 deletions

View File

@ -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];
} }