@spearwolf/twopoint5d
Version:
Create 2.5D realtime graphics and pixelart with WebGL and three.js
68 lines • 2.72 kB
JavaScript
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