-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CustomLayer component #41
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
<script lang="ts"> | ||
import { MapLibre, CustomLayer } from 'svelte-maplibre-gl'; | ||
import maplibregl from 'maplibre-gl'; | ||
|
||
class CustomLayerImpl implements Omit<maplibregl.CustomLayerInterface, 'id' | 'type'> { | ||
program: WebGLProgram | null = null; | ||
aPos: number = 0; | ||
buffer: WebGLBuffer | null = null; | ||
|
||
onAdd(_map: maplibregl.Map, gl: WebGL2RenderingContext) { | ||
//create GLSL source for vertex shader | ||
const vertexSource = `#version 300 es | ||
uniform mat4 u_matrix; | ||
in vec2 a_pos; | ||
void main() { | ||
gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); | ||
}`; | ||
|
||
// create GLSL source for fragment shader | ||
const fragmentSource = `#version 300 es | ||
out highp vec4 fragColor; | ||
void main() { | ||
fragColor = vec4(1.0, 0.0, 0.0, 0.5); | ||
}`; | ||
|
||
// create a vertex shader | ||
const vertexShader = gl.createShader(gl.VERTEX_SHADER)!; | ||
gl.shaderSource(vertexShader, vertexSource); | ||
gl.compileShader(vertexShader); | ||
|
||
// create a fragment shader | ||
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!; | ||
gl.shaderSource(fragmentShader, fragmentSource); | ||
gl.compileShader(fragmentShader); | ||
|
||
// link the two shaders into a WebGL program | ||
this.program = gl.createProgram()!; | ||
gl.attachShader(this.program, vertexShader); | ||
gl.attachShader(this.program, fragmentShader); | ||
gl.linkProgram(this.program); | ||
|
||
this.aPos = gl.getAttribLocation(this.program, 'a_pos'); | ||
|
||
// define vertices of the triangle to be rendered in the custom style layer | ||
const helsinki = maplibregl.MercatorCoordinate.fromLngLat({ lng: 25.004, lat: 60.239 }); | ||
const berlin = maplibregl.MercatorCoordinate.fromLngLat({ lng: 13.403, lat: 52.562 }); | ||
const kyiv = maplibregl.MercatorCoordinate.fromLngLat({ lng: 30.498, lat: 50.541 }); | ||
|
||
// create and initialize a WebGLBuffer to store vertex and color data | ||
this.buffer = gl.createBuffer(); | ||
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); | ||
gl.bufferData( | ||
gl.ARRAY_BUFFER, | ||
new Float32Array([helsinki.x, helsinki.y, berlin.x, berlin.y, kyiv.x, kyiv.y]), | ||
gl.STATIC_DRAW | ||
); | ||
} | ||
|
||
// method fired on each animation frame | ||
render(gl: WebGL2RenderingContext | WebGLRenderingContext, options: maplibregl.CustomRenderMethodInput) { | ||
gl.useProgram(this.program); | ||
gl.uniformMatrix4fv( | ||
gl.getUniformLocation(this.program!, 'u_matrix'), | ||
false, | ||
options.defaultProjectionData.mainMatrix | ||
); | ||
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); | ||
gl.enableVertexAttribArray(this.aPos); | ||
gl.vertexAttribPointer(this.aPos, 2, gl.FLOAT, false, 0, 0); | ||
gl.enable(gl.BLEND); | ||
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); | ||
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3); | ||
} | ||
Comment on lines
+60
to
+73
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure compatibility with WebGL1 contexts The Consider updating the code to check if |
||
} | ||
|
||
const customLayerImpl = new CustomLayerImpl(); | ||
</script> | ||
|
||
<MapLibre | ||
class="h-[55vh] min-h-[300px]" | ||
style="https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json" | ||
zoom={3} | ||
center={[20, 58]} | ||
antialias | ||
> | ||
<CustomLayer implementation={customLayerImpl} /> | ||
</MapLibre> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--- | ||
title: Custom style layer | ||
description: Use a custom style layer to render custom WebGL content. | ||
--- | ||
|
||
<script lang="ts"> | ||
import Demo from "./CustomLayer.svelte"; | ||
import demoRaw from "./CustomLayer.svelte?raw"; | ||
import CodeBlock from "../../CodeBlock.svelte"; | ||
</script> | ||
|
||
<Demo /> | ||
|
||
<CodeBlock content={demoRaw} /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add error handling for shader compilation and program linking
To ensure the robustness of the application, it's important to check if the shaders compile successfully and if the program links correctly. Without these checks, shader compilation or linking failures may go unnoticed, making debugging difficult.
Apply this diff to add error handling:
📝 Committable suggestion