const THREE = require('three');
/**
* Zinc representation of glyph graphic, it contains the colours,
* geometry and transformation of the glyph.
*
* @param {THREE.Geometry} geometry - Geometry of the glyph .
* @param {THREE.Material} materialIn - Material of the glyph.
* @param {Number} idIn - Id of the glyph.
*
* @class
* @author Alan Wu
* @return {Glyph}
*/
const Glyph = function (geometry, materialIn, idIn, glyphsetIn) {
(require('./zincObject').ZincObject).call(this);
let material = undefined;
if (materialIn) {
material = materialIn.clone();
material.vertexColors = THREE.FaceColors;
}
const parent = glyphsetIn;
this.id = idIn;
let label = undefined;
let labelString = undefined;
this.isGlyph = true;
/**
* Create a glyph using mesh
* @param {THREE.Mesh} meshIn - Mesh to create the glyph from
*
* @returns {Boolean} true if successful
*/
this.fromMesh = meshIn => {
if (meshIn && meshIn.isMesh) {
this.morph = meshIn.clone();
this.morph.userData = this;
this.group.add(this.morph);
return true;
}
return false;
}
if (geometry && material) {
this.fromMesh(new THREE.Mesh(geometry, material));
}
/**
* Get the {Glyphset} containing this glyph.
*
* @returns {Boolean} true if successful
*/
this.getGlyphset = function () {
return parent;
}
/**
* Set and update the text containing this glyph.
* @param {String} text - Label to be set for this instance
*/
this.setLabel = text => {
if (text && (typeof text === 'string' || text instanceof String)) {
labelString = text;
if (this.morph)
this.morph.name = text;
}
if (label)
this.showLabel();
}
/**
* Display label with the choosen colour. It will replace the current
* label.
* @param {THREE.Color} colour - Colour for the label.
*/
this.showLabel = (colour) => {
if (label) {
position = label.getPosition();
this.group.remove(label.getSprite());
label.dispose();
label = undefined;
}
if (labelString && (typeof labelString === 'string' || labelString instanceof String)) {
let position = [0, 0, 0];
label = new (require('./label').Label)(labelString, colour);
label.setPosition(position[0], position[1], position[2]);
this.group.add(label.getSprite());
}
}
/**
* Get the label of this glyph
* @return {Label}
*/
this.getLabel = () => {
return labelString;
}
/**
* Get the mesh of this glyph.
* @return {THREE.Mesh}
*/
this.getMesh = () => {
return this.morph;
}
/**
* Set the transformation of this glyph.
* @param {Array} position - Three components vectors containing position of the
* transformation.
* @param {Array} axis1 - Three components vectors containing axis1 rotation of the
* transformation.
* @param {Array} axis2 - Three components vectors containing axis2 rotation of the
* transformation.
* @param {Array} position - Three components vectors containing axis3 rotation of the
* transformation.
*/
this.setTransformation = (position, axis1, axis2, axis3) => {
if (this.morph) {
this.morph.matrix.elements[0] = axis1[0];
this.morph.matrix.elements[1] = axis1[1];
this.morph.matrix.elements[2] = axis1[2];
this.morph.matrix.elements[3] = 0.0;
this.morph.matrix.elements[4] = axis2[0];
this.morph.matrix.elements[5] = axis2[1];
this.morph.matrix.elements[6] = axis2[2];
this.morph.matrix.elements[7] = 0.0;
this.morph.matrix.elements[8] = axis3[0];
this.morph.matrix.elements[9] = axis3[1];
this.morph.matrix.elements[10] = axis3[2];
this.morph.matrix.elements[11] = 0.0;
this.morph.matrix.elements[12] = position[0];
this.morph.matrix.elements[13] = position[1];
this.morph.matrix.elements[14] = position[2];
this.morph.matrix.elements[15] = 1.0;
this.morph.matrixAutoUpdate = false;
}
if (label)
label.setPosition(position[0], position[1], position[2]);
}
/**
* Set the color of the glyph and its label.
*
* @param {THREE.Color} color - Colour to be set.
*/
this.setColour = (color) => {
if (label)
label.setColour(color);
if (this.secondaryMesh && this.secondaryMesh.material)
this.secondaryMesh.material.color = colour;
this.geometry.colorsNeedUpdate = true;
}
/**
* Clear and free its memory.
*/
this.dispose = () => {
if (this.material)
this.material.dispose();
this.morph = undefined;
}
}
Glyph.prototype = Object.create((require('./zincObject').ZincObject).prototype);
exports.Glyph = Glyph;