UNPKG

@spearwolf/twopoint5d

Version:

a library to create 2.5d realtime graphics and pixelart with three.js

107 lines (87 loc) 2.94 kB
import { DoubleSide, Texture } from 'three'; import { unpick } from '../../utils/unpick.js'; import { CustomChunksShaderMaterial } from '../CustomChunksShaderMaterial.js'; import ShaderLib from '../ShaderLib.js'; const vertexShader = ` attribute vec2 quadSize; attribute vec3 instancePosition; attribute vec4 texCoords; attribute float rotation; attribute vec4 color; varying vec2 vTexCoords; varying vec4 vBaseColor; #include <extra_pars_vertex> #include <rotateZ_vertex> #ifdef RENDER_AS_BILLBOARDS #include <makeBillboard_fn_vertex> #endif void main() { #ifdef RENDER_AS_BILLBOARDS #include <vertexPosition_makeBillboard_instanced_vertex> #else #include <vertexPosition_instanced_vertex> #endif #include <after_vertexPosition_vertex> gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPosition.xyz, 1.0); vTexCoords = texCoords.xy + (uv * texCoords.zw); vBaseColor = color; #include <post_main_vertex> } `; const fragmentShader = ` uniform sampler2D colorMap; varying vec2 vTexCoords; varying vec4 vBaseColor; #include <extra_pars_fragment> void main() { vec4 col = texture2D(colorMap, vTexCoords); gl_FragColor = vBaseColor * col; #include <discard_by_alpha_fragment> #include <post_main_fragment> } `; export class TexturedSpritesMaterial extends CustomChunksShaderMaterial { constructor(options) { super({ vertexShader, fragmentShader, uniforms: { ...options?.uniforms, colorMap: { value: options?.colorMap, }, }, transparent: true, side: DoubleSide, ...unpick(options, 'colorMap', 'uniforms'), }); this.name = options?.name ?? 'twopoint5d.TexturedSpritesMaterial'; this.replaceVertexShaderChunks = [ 'extra_pars_vertex', 'rotateZ_vertex', 'makeBillboard_fn_vertex', 'vertexPosition_makeBillboard_instanced_vertex', 'vertexPosition_instanced_vertex', 'after_vertexPosition_vertex', 'post_main_vertex', ]; this.replaceFragmentShaderChunks = ['extra_pars_fragment', 'discard_by_alpha_fragment', 'post_main_fragment']; this.addStaticChunks(ShaderLib); } get colorMap() { return this.uniforms['colorMap'].value; } set colorMap(colorMap) { if (this.uniforms['colorMap'].value !== colorMap) { this.uniforms['colorMap'].value = colorMap; this.uniformsNeedUpdate = true; } } get renderAsBillboards() { return this.defines?.['RENDER_AS_BILLBOARDS'] === 1; } set renderAsBillboards(renderAsBillboards) { this.updateBoolDefine('RENDER_AS_BILLBOARDS', renderAsBillboards); } } //# sourceMappingURL=TexturedSpritesMaterial.js.map