examples-vite/layers/marker/base.ts (112 lines of code) (raw):
import IR, { isRenderable } from '@gs.i/schema-scene'
import { Mesh, Geom, PbrMaterial } from '@gs.i/frontend-sdk'
import { buildCylinder } from '@gs.i/utils-geom-builders'
import { StandardLayer } from '@polaris.gl/gsi'
import { PolarisLite } from '@polaris.gl/lite'
import { generateScene } from '@gs.i/utils-random-scene'
import { IndicatorProcessor } from '@gs.i/processor-indicator'
import { HelperLayer } from '@polaris.gl/layer-std-helper'
import { MarkerLayer, Marker } from '@polaris.gl/layer-std-marker'
import { traverseBFS } from '@gs.i/utils-traverse'
await test(true, 'PolarisLite', () => {
const p = new PolarisLite({
container: document.querySelector('#container') as HTMLDivElement,
background: 'transparent',
lights: { ambientLight: { type: 'ambient', intensity: 1 } },
// autoplay: false,
})
const h = new HelperLayer()
p.add(h)
h.setProps({ box: false })
// p.addEventListener('viewChange', (e) => {
// console.log(e)
// })
globalThis.p = p
console.log(p)
const div = document.createElement('div')
div.style.backgroundColor = 'pink'
div.innerText = 'hoho'
const markerLayer = new MarkerLayer({
pickable: true,
recursivePicking: true,
data: [
{ html: 'hahaha', lng: 0, lat: 0 },
{ html: div, lng: 0.01, lat: 0 },
{
object3d: generateScene({
// scale: 1000,
count: 10,
depth: 10,
useAnimation: true,
useSprite: true,
usePoint: false,
resolution: [500, 500],
}),
lng: 0.01,
lat: 0.01,
},
{
object3d: generateScene({
// scale: 1000,
count: 10,
depth: 10,
useAnimation: true,
useSprite: true,
usePoint: false,
resolution: [500, 500],
}),
lng: -0.01,
lat: 0.01,
},
// {
// object3d: new Mesh({
// name: 'cylinder',
// geometry: generateCylinder(),
// material: new PbrMaterial({
// baseColorFactor: { r: 1, g: 0.5, b: 0.5 },
// }),
// }),
// lng: 0,
// lat: 0,
// alt: 300,
// },
],
})
p.add(markerLayer)
setAttrsDisposableFalseRecur(markerLayer)
console.log(markerLayer)
// const marker = new Marker({ html: 'hahaha' })
// markerLayer.add(marker)
// console.log(marker)
// const marker2 = new Marker({ html: 'hoho', lng: 0.01 })
// markerLayer.add(marker2)
// const marker3 = new Marker({
// object3d: generateScene({
// // scale: 1000,
// count: 10,
// depth: 10,
// useAnimation: true,
// useSprite: true,
// usePoint: false,
// resolution: [500, 500],
// }),
// lng: 0.01,
// lat: 0.01,
// })
// markerLayer.add(marker3)
// const marker4 = new Marker({
// object3d: generateScene({
// // scale: 1000,
// count: 10,
// depth: 10,
// useAnimation: true,
// useSprite: true,
// usePoint: false,
// resolution: [500, 500],
// }),
// lng: -0.01,
// lat: 0.01,
// })
// markerLayer.add(marker4)
// const indicator = new IndicatorProcessor({
// // hideOriginal: true,
// useBBox: true,
// useBSphere: true,
// // useWireframe: true,
// })
// indicator.traverse(scene)
// const l = new StandardLayer({})
// l.view.gsi.group.add(scene)
// p.add(l)
markerLayer.addEventListener('pick', (e) => {
if (e.result) {
console.log('hit', e)
} else {
console.log('not hit', e)
}
})
})
function generateCylinder() {
const cylinder = new Geom(
buildCylinder({
radiusTop: 300,
radiusBottom: 50,
height: 1000,
normal: true,
uv: true,
})
)
for (const key in cylinder.attributes) {
if (Object.prototype.hasOwnProperty.call(cylinder.attributes, key)) {
const attr = cylinder.attributes[key]
attr && (attr.disposable = false)
}
}
cylinder.indices && (cylinder.indices.disposable = false)
return cylinder
}
function setAttrsDisposableFalseRecur(markerLayer: MarkerLayer) {
markerLayer.markers.forEach((marker) => {
if (marker.object3d) {
traverseBFS(marker.object3d, (node) => {
if (isRenderable(node)) {
for (const name in node.geometry.attributes) {
const attr = node.geometry.attributes[name]
attr && (attr.disposable = false)
}
node.geometry.indices && (node.geometry.indices.disposable = false)
}
})
}
})
}
// ===
async function test(enable: boolean, name: string, fun: () => void, duration = 1000) {
if (!enable) return
console.group(name)
fun()
await new Promise((resolve, reject) => {
setTimeout(() => resolve(true), duration)
})
console.log(`test end (${name})`)
console.groupEnd()
return
}