UNPKG

@spearwolf/twopoint5d

Version:

Create 2.5D realtime graphics and pixelart with WebGL and three.js

68 lines 2.72 kB
var _a; import { createEffect, createSignal, SignalGroup } from '@spearwolf/signalize'; import { attribute, float, vec3, vec4 } from 'three/tsl'; import { NodeMaterial } from 'three/webgpu'; import { colorFromTextureByTexCoords, vertexByInstancePosition } from '../../sprites/node-utils.js'; const createShaderAttributeNodeSignal = (name, attach) => createSignal(attribute(name), { attach }); export class TileSpritesMaterial extends NodeMaterial { static { this.PositionAttributeName = 'position'; } static { this.InstancePositionAttributeName = 'instancePosition'; } static { this.QuadSizeAttributeName = 'quadSize'; } static { this.DefaultColor = vec4(0.5, 0.5, 0.5, 1); } #vertexPositionNode = createShaderAttributeNodeSignal(_a.PositionAttributeName, this); #instancePositionNode = createShaderAttributeNodeSignal(_a.InstancePositionAttributeName, this); #quadSizeNode = createShaderAttributeNodeSignal(_a.QuadSizeAttributeName, this); #colorMap = createSignal(undefined, { attach: this }); get colorMap() { return this.#colorMap.get(); } set colorMap(value) { this.#colorMap.set(value); } get vertexPositionNode() { return this.#vertexPositionNode.get(); } set vertexPositionNode(node) { this.#vertexPositionNode.set(node); } get instancePositionNode() { return this.#instancePositionNode.get(); } set instancePositionNode(node) { this.#instancePositionNode.set(node); } get quadSizeNode() { return this.#quadSizeNode.get(); } set quadSizeNode(node) { this.#quadSizeNode.set(node); } constructor(options = {}) { super(); this.name = options?.name ?? 'twopoint5d.TileSpritesMaterial'; createEffect(() => { const vertexPosition = this.vertexPositionNode; const instancePosition = this.instancePositionNode; const scale = vec3(this.quadSizeNode.x, 0, this.quadSizeNode.y); this.positionNode = vertexByInstancePosition({ vertexPosition, instancePosition, scale, }); this.needsUpdate = true; }, { attach: this }); createEffect(() => { const colorMap = this.colorMap; this.colorNode = colorMap ? colorFromTextureByTexCoords(colorMap) : _a.DefaultColor; this.needsUpdate = true; }, { attach: this }); this.alphaTestNode = float(0.001); this.colorMap = options?.colorMap; } dispose() { SignalGroup.destroy(this); super.dispose(); } } _a = TileSpritesMaterial; //# sourceMappingURL=TileSpritesMaterial.js.map