103 lines
2.8 KiB
JavaScript
103 lines
2.8 KiB
JavaScript
|
|
/**
|
||
|
|
* @module echarts-gl/util/geometry/QuadsGeometry
|
||
|
|
* @author Yi Shen(http://github.com/pissang)
|
||
|
|
*/
|
||
|
|
import Geometry from 'claygl/src/Geometry';
|
||
|
|
import * as echarts from 'echarts/lib/echarts';
|
||
|
|
import dynamicConvertMixin from './dynamicConvertMixin';
|
||
|
|
import glmatrix from 'claygl/src/dep/glmatrix';
|
||
|
|
var vec3 = glmatrix.vec3;
|
||
|
|
/**
|
||
|
|
* @constructor
|
||
|
|
* @alias module:echarts-gl/util/geometry/QuadsGeometry
|
||
|
|
* @extends clay.Geometry
|
||
|
|
*/
|
||
|
|
|
||
|
|
var QuadsGeometry = Geometry.extend(function () {
|
||
|
|
return {
|
||
|
|
segmentScale: 1,
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Need to use mesh to expand lines if lineWidth > MAX_LINE_WIDTH
|
||
|
|
*/
|
||
|
|
useNativeLine: true,
|
||
|
|
attributes: {
|
||
|
|
position: new Geometry.Attribute('position', 'float', 3, 'POSITION'),
|
||
|
|
normal: new Geometry.Attribute('normal', 'float', 3, 'NORMAL'),
|
||
|
|
color: new Geometry.Attribute('color', 'float', 4, 'COLOR')
|
||
|
|
}
|
||
|
|
};
|
||
|
|
},
|
||
|
|
/** @lends module: echarts-gl/util/geometry/QuadsGeometry.prototype */
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* Reset offset
|
||
|
|
*/
|
||
|
|
resetOffset: function () {
|
||
|
|
this._vertexOffset = 0;
|
||
|
|
this._faceOffset = 0;
|
||
|
|
},
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param {number} nQuad
|
||
|
|
*/
|
||
|
|
setQuadCount: function (nQuad) {
|
||
|
|
var attributes = this.attributes;
|
||
|
|
var vertexCount = this.getQuadVertexCount() * nQuad;
|
||
|
|
var triangleCount = this.getQuadTriangleCount() * nQuad;
|
||
|
|
|
||
|
|
if (this.vertexCount !== vertexCount) {
|
||
|
|
attributes.position.init(vertexCount);
|
||
|
|
attributes.normal.init(vertexCount);
|
||
|
|
attributes.color.init(vertexCount);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (this.triangleCount !== triangleCount) {
|
||
|
|
this.indices = vertexCount > 0xffff ? new Uint32Array(triangleCount * 3) : new Uint16Array(triangleCount * 3);
|
||
|
|
}
|
||
|
|
},
|
||
|
|
getQuadVertexCount: function () {
|
||
|
|
return 4;
|
||
|
|
},
|
||
|
|
getQuadTriangleCount: function () {
|
||
|
|
return 2;
|
||
|
|
},
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Add a quad, which in following order:
|
||
|
|
* 0-----1
|
||
|
|
* 3-----2
|
||
|
|
*/
|
||
|
|
addQuad: function () {
|
||
|
|
var a = vec3.create();
|
||
|
|
var b = vec3.create();
|
||
|
|
var normal = vec3.create();
|
||
|
|
var indices = [0, 3, 1, 3, 2, 1];
|
||
|
|
return function (coords, color) {
|
||
|
|
var positionAttr = this.attributes.position;
|
||
|
|
var normalAttr = this.attributes.normal;
|
||
|
|
var colorAttr = this.attributes.color;
|
||
|
|
vec3.sub(a, coords[1], coords[0]);
|
||
|
|
vec3.sub(b, coords[2], coords[1]);
|
||
|
|
vec3.cross(normal, a, b);
|
||
|
|
vec3.normalize(normal, normal);
|
||
|
|
|
||
|
|
for (var i = 0; i < 4; i++) {
|
||
|
|
positionAttr.set(this._vertexOffset + i, coords[i]);
|
||
|
|
colorAttr.set(this._vertexOffset + i, color);
|
||
|
|
normalAttr.set(this._vertexOffset + i, normal);
|
||
|
|
}
|
||
|
|
|
||
|
|
var idx = this._faceOffset * 3;
|
||
|
|
|
||
|
|
for (var i = 0; i < 6; i++) {
|
||
|
|
this.indices[idx + i] = indices[i] + this._vertexOffset;
|
||
|
|
}
|
||
|
|
|
||
|
|
this._vertexOffset += 4;
|
||
|
|
this._faceOffset += 2;
|
||
|
|
};
|
||
|
|
}()
|
||
|
|
});
|
||
|
|
echarts.util.defaults(QuadsGeometry.prototype, dynamicConvertMixin);
|
||
|
|
export default QuadsGeometry;
|