@spearwolf/twopoint5d
Version:
a library to create 2.5d realtime graphics and pixelart with three.js
107 lines (87 loc) • 2.94 kB
JavaScript
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;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPosition.xyz, 1.0);
vTexCoords = texCoords.xy + (uv * texCoords.zw);
vBaseColor = color;
}
`;
const fragmentShader = `
uniform sampler2D colorMap;
varying vec2 vTexCoords;
varying vec4 vBaseColor;
void main() {
vec4 col = texture2D(colorMap, vTexCoords);
gl_FragColor = vBaseColor * col;
}
`;
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