var schema = require('./schema');
var processSchema = schema.process;
var geometries = module.exports.geometries = {}; // Registered geometries.
var geometryNames = module.exports.geometryNames = []; // Names of registered geometries.
var THREE = require('../lib/three');
/**
* Geometry class definition.
*
* Geometries extend the geometry component API to create and register geometry types.
*/
var Geometry = module.exports.Geometry = function () {};
Geometry.prototype = {
/**
* Contains the type schema and defaults for the data values.
* Data is coerced into the types of the values of the defaults.
*/
schema: {},
/**
* Init handler. Similar to attachedCallback.
* Called during shader initialization and is only run once.
*/
init: function (data) {
this.geometry = new THREE.Geometry();
return this.geometry;
},
/**
* Update handler. Similar to attributeChangedCallback.
* Called whenever the associated geometry data changes.
*
* @param {object} data - New geometry data.
*/
update: function (data) { /* no-op */ }
};
/**
* Registers a geometry to A-Frame.
*
* @param {string} name - Geometry name.
* @param {object} definition - Geometry property and methods.
* @returns {object} Geometry.
*/
module.exports.registerGeometry = function (name, definition) {
var NewGeometry;
var proto = {};
// Format definition object to prototype object.
Object.keys(definition).forEach(function expandDefinition (key) {
proto[key] = {
value: definition[key],
writable: true
};
});
if (geometries[name]) {
throw new Error('The geometry `' + name + '` has been already registered');
}
NewGeometry = function () { Geometry.call(this); };
NewGeometry.prototype = Object.create(Geometry.prototype, proto);
NewGeometry.prototype.name = name;
NewGeometry.prototype.constructor = NewGeometry;
geometries[name] = {
Geometry: NewGeometry,
schema: processSchema(NewGeometry.prototype.schema)
};
geometryNames.push(name);
return NewGeometry;
};