'use strict';
import * as THREE from 'three';
/**
* Whether to draw edges on front and back faces.
* Values are NONE, FRONT, BACK, BOTH.
*/
EdgesHelper.EDGES_MODES = {
NONE: 0,
FRONT: 1,
BACK: 2,
BOTH: 3
};
/**
* Create an object to render the edges of a mesh
* @private
* @param {Three.Mesh} mesh The mesh to convert
* @param {Three.Material} material The material on the mesh
* @return {Three.EdgesHelper} The edges object
*/
var _createEdges = function(mesh, material) {
var helper = new THREE.EdgesHelper(mesh);
helper.material = material;
helper.matrixAutoUpdate = false;
helper.matrix = mesh.matrix;
return helper;
};
/**
* Create an object to render a mesh as edges
* @class EdgesHelper
* @param {Three.Object3D} model The mesh
*/
export default function EdgesHelper(model) {
THREE.Object3D.call( this );
this.type = 'EdgesHelper';
this.frontMaterial = new THREE.LineBasicMaterial({color: 0x000000});
this.frontMaterial.depthFunc = THREE.LessEqualDepth;
this.backMaterial = new THREE.LineBasicMaterial({color: 0x000000});
this.backMaterial.transparent = true;
this.backMaterial.depthFunc = THREE.GreaterDepth;
this.backMaterial.opacity = 0.25;
var _this = this;
model.traverse(function(child) {
if (child instanceof THREE.Mesh) {
// create edge helper for front and back edges
_this.add(
_createEdges(child, _this.frontMaterial)
);
_this.add(
_createEdges(child, _this.backMaterial)
);
}
});
}
EdgesHelper.prototype = Object.create( THREE.Object3D.prototype );
EdgesHelper.prototype.constructor = EdgesHelper;
/**
* Create the edges geometry for a model
* @param {THREE.Object3D} newModel The model with edges
* @param {EdgesHelper.EDGES_MODES} edgesMode Whether to draw edges enumeration
* @return {EdgesHelper} The edges object
*/
EdgesHelper.AddEdges = function(newModel, edgesMode) {
if (edgesMode === EdgesHelper.EDGES_MODES.NONE) return null;
newModel.edgesHelper = new EdgesHelper(newModel);
newModel.edgesHelper.frontMaterial.visible = false;
if (edgesMode === EdgesHelper.EDGES_MODES.FRONT || edgesMode === EdgesHelper.EDGES_MODES.BOTH) {
newModel.edgesHelper.frontMaterial.visible = true;
}
newModel.edgesHelper.backMaterial.visible = false;
if (edgesMode === EdgesHelper.EDGES_MODES.BACK || edgesMode === EdgesHelper.EDGES_MODES.BOTH) {
newModel.edgesHelper.backMaterial.visible = true;
}
return newModel.edgesHelper;
};