three#Material TypeScript Examples
The following examples show how to use
three#Material.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: MapView.ts From geo-three with MIT License | 6 votes |
/**
* Ajust node configuration depending on the camera distance.
*
* Called everytime before render.
*/
public onBeforeRender: (renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group)=> void = (renderer, scene, camera, geometry, material, group) =>
{
this.lod.updateLOD(this, camera, renderer, scene);
};
Example #2
Source File: MapHeightNode.ts From geo-three with MIT License | 6 votes |
/**
* Map height node constructor.
*
* @param parentNode - The parent node of this node.
* @param mapView - Map view object where this node is placed.
* @param location - Position in the node tree relative to the parent.
* @param level - Zoom level in the tile tree of the node.
* @param x - X position of the node in the tile tree.
* @param y - Y position of the node in the tile tree.
* @param material - Material used to render this height node.
* @param geometry - Geometry used to render this height node.
*/
public constructor(parentNode: MapHeightNode = null, mapView: MapView = null, location: number = MapNode.root, level: number = 0, x: number = 0, y: number = 0, geometry: BufferGeometry = MapHeightNode.geometry, material: Material = new MeshPhongMaterial({wireframe: false, color: 0xffffff}))
{
super(parentNode, mapView, location, level, x, y, geometry, material);
this.isMesh = true;
this.visible = false;
this.matrixAutoUpdate = false;
}
Example #3
Source File: MapHeightNodeShader.ts From geo-three with MIT License | 6 votes |
/**
* Prepare the three.js material to be used in the map tile.
*
* @param material - Material to be transformed.
*/
public static prepareMaterial(material: Material): Material
{
material.userData = {heightMap: {value: MapHeightNodeShader.emptyTexture}};
material.onBeforeCompile = (shader) =>
{
// Pass uniforms from userData to the
for (const i in material.userData)
{
shader.uniforms[i] = material.userData[i];
}
// Vertex variables
shader.vertexShader =
`
uniform sampler2D heightMap;
` + shader.vertexShader;
// Vertex depth logic
shader.vertexShader = shader.vertexShader.replace('#include <fog_vertex>', `
#include <fog_vertex>
// Calculate height of the title
vec4 _theight = texture2D(heightMap, vUv);
float _height = ((_theight.r * 255.0 * 65536.0 + _theight.g * 255.0 * 256.0 + _theight.b * 255.0) * 0.1) - 10000.0;
vec3 _transformed = position + _height * normal;
// Vertex position based on height
gl_Position = projectionMatrix * modelViewMatrix * vec4(_transformed, 1.0);
`);
};
return material;
}
Example #4
Source File: MapNode.ts From geo-three with MIT License | 6 votes |
public constructor(parentNode: MapNode = null, mapView: MapView = null, location: number = MapNode.root, level: number = 0, x: number = 0, y: number = 0, geometry: BufferGeometry = null, material: Material = null)
{
super(geometry, material);
this.mapView = mapView;
this.parentNode = parentNode;
this.location = location;
this.level = level;
this.x = x;
this.y = y;
this.initialize();
}
Example #5
Source File: Material.ts From trois with MIT License | 6 votes |
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function materialComponent<P extends Readonly<ComponentPropsOptions>>(
name: string,
props: P,
createMaterial: {(opts: any): Material}
) {
return defineComponent({
name,
extends: BaseMaterial,
props,
methods: {
createMaterial() {
return createMaterial(this.getMaterialParams())
},
},
})
}
Example #6
Source File: TextMeshObject.ts From movy with MIT License | 5 votes |
material: Material;
Example #7
Source File: MapView.d.ts From geo-three with MIT License | 5 votes |
onBeforeRender: (renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group) => void;
Example #8
Source File: MapHeightNode.d.ts From geo-three with MIT License | 5 votes |
constructor(parentNode?: MapHeightNode, mapView?: MapView, location?: number, level?: number, x?: number, y?: number, geometry?: BufferGeometry, material?: Material);
Example #9
Source File: MapHeightNodeShader.d.ts From geo-three with MIT License | 5 votes |
static prepareMaterial(material: Material): Material;
Example #10
Source File: MapMartiniHeightNode.d.ts From geo-three with MIT License | 5 votes |
static prepareMaterial(material: Material, level: number, exageration?: number): any;
Example #11
Source File: MapNode.d.ts From geo-three with MIT License | 5 votes |
constructor(parentNode?: MapNode, mapView?: MapView, location?: number, level?: number, x?: number, y?: number, geometry?: BufferGeometry, material?: Material);
Example #12
Source File: MapHeightNodeShader.ts From geo-three with MIT License | 5 votes |
public constructor(parentNode: MapHeightNode = null, mapView: MapView = null, location: number = MapNode.root, level: number = 0, x: number = 0, y: number = 0)
{
const material: Material = MapHeightNodeShader.prepareMaterial(new MeshPhongMaterial({map: MapHeightNodeShader.emptyTexture, color: 0xFFFFFF}));
super(parentNode, mapView, location, level, x, y, MapHeightNodeShader.geometry, material);
this.frustumCulled = false;
}
Example #13
Source File: Mesh.ts From trois with MIT License | 5 votes |
Mesh = defineComponent({
name: 'Mesh',
extends: Object3D,
props: {
castShadow: Boolean,
receiveShadow: Boolean,
},
setup(): MeshSetupInterface {
return {}
},
provide() {
return {
[MeshInjectionKey as symbol]: this,
}
},
mounted() {
// TODO : proper ?
if (!this.mesh && !this.loading) this.initMesh()
},
methods: {
initMesh() {
const mesh = new TMesh(this.geometry, this.material)
bindProp(this, 'castShadow', mesh)
bindProp(this, 'receiveShadow', mesh)
this.mesh = mesh
this.initObject3D(mesh)
},
createGeometry() {},
addGeometryWatchers(props: Readonly<ComponentPropsOptions>) {
Object.keys(props).forEach(prop => {
// @ts-ignore
watch(() => this[prop], () => {
this.refreshGeometry()
})
})
},
setGeometry(geometry: BufferGeometry) {
this.geometry = geometry
if (this.mesh) this.mesh.geometry = geometry
},
setMaterial(material: Material) {
this.material = material
if (this.mesh) this.mesh.material = material
},
refreshGeometry() {
const oldGeo = this.geometry
this.createGeometry()
if (this.mesh && this.geometry) this.mesh.geometry = this.geometry
oldGeo?.dispose()
},
},
unmounted() {
// for predefined mesh (geometry/material are not unmounted)
if (this.geometry) this.geometry.dispose()
if (this.material) this.material.dispose()
},
__hmrId: 'Mesh',
})
Example #14
Source File: vanilla.ts From THREE-CustomShaderMaterial with MIT License | 4 votes |
export default class CustomShaderMaterial extends Material {
uniforms: { [key: string]: IUniform<any> }
constructor({ baseMaterial, fragmentShader, vertexShader, uniforms, cacheKey, ...opts }: iCSMParams) {
const base = new baseMaterial(opts)
super()
this.uniforms = uniforms || {}
for (const key in base) {
let k = key
if (key.startsWith('_')) {
k = key.split('_')[1]
}
// @ts-ignore
if (this[k] === undefined) this[k] = 0
// @ts-ignore
this[k] = base[k]
}
this.update({ fragmentShader, vertexShader, uniforms, cacheKey })
}
update({ fragmentShader, vertexShader, uniforms, cacheKey }: iCSMUpdateParams) {
const serializedUniforms = Object.values(uniforms || {}).forEach(({ value }) => {
return JSON.stringify(value)
})
this.uuid = cacheKey?.() || hash([fragmentShader, vertexShader, serializedUniforms])
this.generateMaterial({ fragmentShader, vertexShader, uniforms })
}
private generateMaterial({ fragmentShader, vertexShader, uniforms }: iCSMUpdateParams) {
const parsedFragmentShdaer = this.parseShader(fragmentShader)
const parsedVertexShdaer = this.parseShader(vertexShader)
this.uniforms = uniforms || {}
this.customProgramCacheKey = () => {
return this.uuid
}
this.onBeforeCompile = (shader) => {
if (parsedFragmentShdaer) {
const patchedFragmentShdaer = this.patchShader(parsedFragmentShdaer, shader.fragmentShader, PATCH_MAP.FRAG)
shader.fragmentShader = patchedFragmentShdaer
}
if (parsedVertexShdaer) {
const patchedVertexShdaer = this.patchShader(parsedVertexShdaer, shader.vertexShader, PATCH_MAP.VERT)
shader.vertexShader = '#define IS_VERTEX;\n' + patchedVertexShdaer
}
shader.uniforms = { ...shader.uniforms, ...this.uniforms }
this.uniforms = shader.uniforms
}
this.needsUpdate = true
}
private patchShader(
customShader: iCSMShader,
shader: string,
patchMap: {
[key: string]: {
[key: string]: any
}
}
): string {
let patchedShader: string = shader
Object.keys(patchMap).forEach((name: string) => {
Object.keys(patchMap[name]).forEach((key) => {
if (isExactMatch(customShader.main, name)) {
patchedShader = replaceAll(patchedShader, key, patchMap[name][key])
}
})
})
patchedShader = patchedShader.replace(
'void main() {',
`
${customShader.header}
void main() {
vec3 csm_Position;
vec4 csm_PositionRaw;
vec3 csm_Normal;
vec3 csm_Emissive;
#ifdef IS_VERTEX
csm_Position = position;
csm_PositionRaw = projectionMatrix * modelViewMatrix * vec4(position, 1.);
#endif
#ifdef IS_VERTEX
csm_Normal = normal;
#endif
#ifndef IS_VERTEX
#ifdef STANDARD
csm_Emissive = emissive;
#endif
#endif
vec4 csm_DiffuseColor = vec4(1., 0., 0., 1.);
vec4 csm_FragColor = vec4(1., 0., 0., 1.);
float csm_PointSize = 1.;
${customShader.main}
`
)
patchedShader = customShader.defines + patchedShader
return patchedShader
}
private parseShader(shader?: string): iCSMShader | undefined {
if (!shader) return
const parsedShader: iCSMShader = {
defines: '',
header: '',
main: '',
}
const main = shader.match(/^(\s*)(void\s*main\s*\(.*\)\s*).*?{[\s\S]*?^\1}\s*$/gm)
if (main?.length) {
const mainBody = main[0].match(/{[\w\W\s\S]*}/gm)
if (mainBody?.length) {
parsedShader.main = mainBody[0]
}
const rest = shader.replace(main[0], '')
const defines = rest.match(/#(.*?;)/g) || []
const header = defines.reduce((prev, curr) => prev.replace(curr, ''), rest)
parsedShader.header = header
parsedShader.defines = defines.join('\n')
}
return parsedShader
}
}
Example #15
Source File: MapMartiniHeightNode.ts From geo-three with MIT License | 4 votes |
public static prepareMaterial(material: Material, level: number, exageration: number = 1.0): any
{
material.userData = {
heightMap: {value: MapMartiniHeightNode.emptyTexture},
drawNormals: {value: 0},
drawBlack: {value: 0},
zoomlevel: {value: level},
computeNormals: {value: 1},
drawTexture: {value: 1}
};
material.onBeforeCompile = (shader) =>
{
// Pass uniforms from userData to the
for (let i in material.userData)
{
shader.uniforms[i] = material.userData[i];
}
// Vertex variables
shader.vertexShader =
`
uniform bool computeNormals;
uniform float zoomlevel;
uniform sampler2D heightMap;
` + shader.vertexShader;
shader.fragmentShader =
`
uniform bool drawNormals;
uniform bool drawTexture;
uniform bool drawBlack;
` + shader.fragmentShader;
// Vertex depth logic
shader.fragmentShader = shader.fragmentShader.replace('#include <dithering_fragment>',
`
if(drawBlack) {
gl_FragColor = vec4( 0.0,0.0,0.0, 1.0 );
} else if(drawNormals) {
gl_FragColor = vec4( ( 0.5 * vNormal + 0.5 ), 1.0 );
} else if (!drawTexture) {
gl_FragColor = vec4( 0.0,0.0,0.0, 0.0 );
}`
);
shader.vertexShader = shader.vertexShader.replace('#include <fog_vertex>',
`
#include <fog_vertex>
// queried pixels:
// +-----------+
// | | | |
// | a | b | c |
// | | | |
// +-----------+
// | | | |
// | d | e | f |
// | | | |
// +-----------+
// | | | |
// | g | h | i |
// | | | |
// +-----------+
if (computeNormals) {
float e = getElevation(vUv, 0.0);
ivec2 size = textureSize(heightMap, 0);
float offset = 1.0 / float(size.x);
float a = getElevation(vUv + vec2(-offset, -offset), 0.0);
float b = getElevation(vUv + vec2(0, -offset), 0.0);
float c = getElevation(vUv + vec2(offset, -offset), 0.0);
float d = getElevation(vUv + vec2(-offset, 0), 0.0);
float f = getElevation(vUv + vec2(offset, 0), 0.0);
float g = getElevation(vUv + vec2(-offset, offset), 0.0);
float h = getElevation(vUv + vec2(0, offset), 0.0);
float i = getElevation(vUv + vec2(offset,offset), 0.0);
float normalLength = 500.0 / zoomlevel;
vec3 v0 = vec3(0.0, 0.0, 0.0);
vec3 v1 = vec3(0.0, normalLength, 0.0);
vec3 v2 = vec3(normalLength, 0.0, 0.0);
v0.z = (e + d + g + h) / 4.0;
v1.z = (e+ b + a + d) / 4.0;
v2.z = (e+ h + i + f) / 4.0;
vNormal = (normalize(cross(v2 - v0, v1 - v0))).rbg;
}
`
);
};
return material;
}