62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
var colorHelper = new THREE.Color();
|
|
|
|
/**
|
|
* Set geometry vertex colors, allows for geometry merging using one material
|
|
* while retaining colors.
|
|
*/
|
|
AFRAME.registerComponent('vertex-colors-buffer', {
|
|
schema: {
|
|
baseColor: {type: 'color'},
|
|
itemSize: {default: 3}
|
|
},
|
|
|
|
update: function (oldData) {
|
|
var colors;
|
|
var data = this.data;
|
|
var i;
|
|
var el = this.el;
|
|
var geometry;
|
|
var mesh;
|
|
var self = this;
|
|
|
|
mesh = this.el.getObject3D('mesh');
|
|
|
|
if (!mesh || !mesh.geometry) {
|
|
el.addEventListener('object3dset', function reUpdate (evt) {
|
|
if (evt.detail.type !== 'mesh') { return; }
|
|
el.removeEventListener('object3dset', reUpdate);
|
|
self.update(oldData);
|
|
});
|
|
return;
|
|
}
|
|
|
|
geometry = mesh.geometry;
|
|
|
|
// Empty geometry.
|
|
if (!geometry.attributes.position) {
|
|
console.warn('Geometry has no vertices', el);
|
|
return;
|
|
}
|
|
|
|
if (!geometry.attributes.color) {
|
|
geometry.addAttribute('color',
|
|
new THREE.BufferAttribute(
|
|
new Float32Array(geometry.attributes.position.array.length), 3
|
|
)
|
|
);
|
|
}
|
|
|
|
colors = geometry.attributes.color.array;
|
|
|
|
// TODO: For some reason, incrementing loop by 3 doesn't work. Need to do by 4 for glTF.
|
|
colorHelper.set(data.baseColor);
|
|
for (i = 0; i < colors.length; i += data.itemSize) {
|
|
colors[i] = colorHelper.r;
|
|
colors[i + 1] = colorHelper.g;
|
|
colors[i + 2] = colorHelper.b;
|
|
}
|
|
|
|
geometry.attributes.color.needsUpdate = true;
|
|
}
|
|
});
|