UNPKG

@babylonjs/core

Version:

Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.

263 lines 9.71 kB
import { Color3, Color4 } from "../Maths/math.color.js"; import { VertexBuffer } from "../Buffers/buffer.js"; import { Mesh } from "../Meshes/mesh.js"; import { InstancedMesh } from "../Meshes/instancedMesh.js"; import { Material } from "../Materials/material.js"; import { ShaderMaterial } from "../Materials/shaderMaterial.js"; Mesh._LinesMeshParser = (parsedMesh, scene) => { return LinesMesh.Parse(parsedMesh, scene); }; /** * Line mesh * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param */ export class LinesMesh extends Mesh { _isShaderMaterial(shader) { if (!shader) { return false; } return shader.getClassName() === "ShaderMaterial"; } /** * Creates a new LinesMesh * @param name defines the name * @param scene defines the hosting scene * @param parent defines the parent mesh if any * @param source defines the optional source LinesMesh used to clone data from * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False. * When false, achieved by calling a clone(), also passing False. * This will make creation of children, recursive. * @param useVertexColor defines if this LinesMesh supports vertex color * @param useVertexAlpha defines if this LinesMesh supports vertex alpha * @param material material to use to draw the line. If not provided, will create a new one */ constructor(name, scene = null, parent = null, source = null, doNotCloneChildren, /** * If vertex color should be applied to the mesh */ useVertexColor, /** * If vertex alpha should be applied to the mesh */ useVertexAlpha, material) { super(name, scene, parent, source, doNotCloneChildren); this.useVertexColor = useVertexColor; this.useVertexAlpha = useVertexAlpha; /** * Color of the line (Default: White) */ this.color = new Color3(1, 1, 1); /** * Alpha of the line (Default: 1) */ this.alpha = 1; /** Shader language used by the material */ this._shaderLanguage = 0 /* ShaderLanguage.GLSL */; if (source) { this.color = source.color.clone(); this.alpha = source.alpha; this.useVertexColor = source.useVertexColor; this.useVertexAlpha = source.useVertexAlpha; } this.intersectionThreshold = 0.1; const defines = []; const options = { attributes: [VertexBuffer.PositionKind], uniforms: ["world", "viewProjection"], needAlphaBlending: true, defines: defines, useClipPlane: null, shaderLanguage: 0 /* ShaderLanguage.GLSL */, }; if (!this.useVertexAlpha) { options.needAlphaBlending = false; } else { options.defines.push("#define VERTEXALPHA"); } if (!this.useVertexColor) { options.uniforms.push("color"); this._color4 = new Color4(); } else { options.defines.push("#define VERTEXCOLOR"); options.attributes.push(VertexBuffer.ColorKind); } if (material) { this.material = material; } else { const engine = this.getScene().getEngine(); if (engine.isWebGPU && !LinesMesh.ForceGLSL) { this._shaderLanguage = 1 /* ShaderLanguage.WGSL */; } options.shaderLanguage = this._shaderLanguage; options.extraInitializationsAsync = async () => { if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) { await Promise.all([import("../ShadersWGSL/color.vertex.js"), import("../ShadersWGSL/color.fragment.js")]); } else { await Promise.all([import("../Shaders/color.vertex.js"), import("../Shaders/color.fragment.js")]); } }; this.material = new ShaderMaterial("colorShader", this.getScene(), "color", options, false); this.material.doNotSerialize = true; } } /** * @returns the string "LineMesh" */ getClassName() { return "LinesMesh"; } /** * @internal */ get material() { return this._internalAbstractMeshDataInfo._material; } /** * @internal */ set material(value) { this._setMaterial(value); if (this.material) { this.material.fillMode = Material.LineListDrawMode; } } /** * @internal */ get checkCollisions() { return false; } set checkCollisions(value) { // Just ignore it } /** * @internal */ _bind(_subMesh, colorEffect) { if (!this._geometry) { return this; } // VBOs const indexToBind = this.isUnIndexed ? null : this._geometry.getIndexBuffer(); if (!this._userInstancedBuffersStorage || this.hasThinInstances) { this._geometry._bind(colorEffect, indexToBind); } else { this._geometry._bind(colorEffect, indexToBind, this._userInstancedBuffersStorage.vertexBuffers, this._userInstancedBuffersStorage.vertexArrayObjects); } // Color if (!this.useVertexColor && this._isShaderMaterial(this.material)) { const { r, g, b } = this.color; this._color4.set(r, g, b, this.alpha); this.material.setColor4("color", this._color4); } return this; } /** * @internal */ _draw(subMesh, fillMode, instancesCount) { if (!this._geometry || !this._geometry.getVertexBuffers() || (!this._unIndexed && !this._geometry.getIndexBuffer())) { return this; } const engine = this.getScene().getEngine(); // Draw order if (this._unIndexed) { engine.drawArraysType(Material.LineListDrawMode, subMesh.verticesStart, subMesh.verticesCount, instancesCount); } else { engine.drawElementsType(Material.LineListDrawMode, subMesh.indexStart, subMesh.indexCount, instancesCount); } return this; } /** * Disposes of the line mesh * @param doNotRecurse If children should be disposed * @param disposeMaterialAndTextures This parameter is not used by the LineMesh class * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material is disposed) */ // eslint-disable-next-line @typescript-eslint/no-unused-vars dispose(doNotRecurse, disposeMaterialAndTextures = false, doNotDisposeMaterial) { if (!doNotDisposeMaterial) { this.material?.dispose(false, false, true); } super.dispose(doNotRecurse); } /** * Returns a new LineMesh object cloned from the current one. * @param name defines the cloned mesh name * @param newParent defines the new mesh parent * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default) * @returns the new mesh */ clone(name, newParent = null, doNotCloneChildren) { if (newParent && newParent._addToSceneRootNodes === undefined) { const createOptions = newParent; createOptions.source = this; return new LinesMesh(name, this.getScene(), createOptions.parent, createOptions.source, createOptions.doNotCloneChildren); } return new LinesMesh(name, this.getScene(), newParent, this, doNotCloneChildren); } /** * Creates a new InstancedLinesMesh object from the mesh model. * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances * @param name defines the name of the new instance * @returns a new InstancedLinesMesh */ createInstance(name) { const instance = new InstancedLinesMesh(name, this); if (this.instancedBuffers) { instance.instancedBuffers = {}; for (const key in this.instancedBuffers) { instance.instancedBuffers[key] = this.instancedBuffers[key]; } } return instance; } /** * Serializes this ground mesh * @param serializationObject object to write serialization to */ serialize(serializationObject) { super.serialize(serializationObject); serializationObject.color = this.color.asArray(); serializationObject.alpha = this.alpha; } /** * Parses a serialized ground mesh * @param parsedMesh the serialized mesh * @param scene the scene to create the ground mesh in * @returns the created ground mesh */ static Parse(parsedMesh, scene) { const result = new LinesMesh(parsedMesh.name, scene); result.color = Color3.FromArray(parsedMesh.color); result.alpha = parsedMesh.alpha; return result; } } /** * Force all the LineMeshes to compile their default color material to glsl even on WebGPU engines. * False by default. This is mostly meant for backward compatibility. */ LinesMesh.ForceGLSL = false; /** * Creates an instance based on a source LinesMesh */ export class InstancedLinesMesh extends InstancedMesh { constructor(name, source) { super(name, source); this.intersectionThreshold = source.intersectionThreshold; } /** * @returns the string "InstancedLinesMesh". */ getClassName() { return "InstancedLinesMesh"; } } //# sourceMappingURL=linesMesh.js.map