playcanvas
Version:
PlayCanvas WebGL game engine
73 lines (70 loc) • 2.28 kB
JavaScript
import { Mat4 } from '../../core/math/mat4.js';
import { PRIMITIVE_LINES } from '../../platform/graphics/constants.js';
import { Mesh } from '../mesh.js';
import { MeshInstance } from '../mesh-instance.js';
import { GraphNode } from '../graph-node.js';
const identityGraphNode = new GraphNode();
identityGraphNode.worldTransform = Mat4.IDENTITY;
identityGraphNode._dirtyWorld = identityGraphNode._dirtyNormal = false;
class ImmediateBatch {
constructor(device, material, layer){
this.material = material;
this.layer = layer;
this.positions = [];
this.colors = [];
this.mesh = new Mesh(device);
this.meshInstance = null;
}
addLines(positions, color) {
const destPos = this.positions;
const count = positions.length;
for(let i = 0; i < count; i++){
const pos = positions[i];
destPos.push(pos.x, pos.y, pos.z);
}
const destCol = this.colors;
if (color.length) {
for(let i = 0; i < count; i++){
const col = color[i];
destCol.push(col.r, col.g, col.b, col.a);
}
} else {
for(let i = 0; i < count; i++){
destCol.push(color.r, color.g, color.b, color.a);
}
}
}
addLinesArrays(positions, color) {
const destPos = this.positions;
for(let i = 0; i < positions.length; i += 3){
destPos.push(positions[i], positions[i + 1], positions[i + 2]);
}
const destCol = this.colors;
if (color.length) {
for(let i = 0; i < color.length; i += 4){
destCol.push(color[i], color[i + 1], color[i + 2], color[i + 3]);
}
} else {
const count = positions.length / 3;
for(let i = 0; i < count; i++){
destCol.push(color.r, color.g, color.b, color.a);
}
}
}
onPreRender(visibleList, transparent) {
if (this.positions.length > 0 && this.material.transparent === transparent) {
this.mesh.setPositions(this.positions);
this.mesh.setColors(this.colors);
this.mesh.update(PRIMITIVE_LINES, false);
if (!this.meshInstance) {
this.meshInstance = new MeshInstance(this.mesh, this.material, identityGraphNode);
}
visibleList.push(this.meshInstance);
}
}
clear() {
this.positions.length = 0;
this.colors.length = 0;
}
}
export { ImmediateBatch };