{"_id":"@bitruvius/point-symbols","_rev":"8-7a3ffc014d8a53e479a19012eb7ce9c5","name":"@bitruvius/point-symbols","dist-tags":{"latest":"0.3.3"},"versions":{"0.3.0":{"name":"@bitruvius/point-symbols","version":"0.3.0","keywords":["bitruvius","geospatial","webgl2","i3s","billboard","renderer"],"license":"SEE LICENSE IN LICENSE","_id":"@bitruvius/point-symbols@0.3.0","maintainers":[{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},{"name":"danrhedges","email":"danrhedges@gmail.com"}],"homepage":"https://dev.bitruvius.com/sdks/js/","bugs":{"url":"https://github.com/bitruvius/support"},"dist":{"shasum":"205382a508305263d945d24e8357ea9fe44874c3","tarball":"https://registry.npmjs.org/@bitruvius/point-symbols/-/point-symbols-0.3.0.tgz","fileCount":8,"integrity":"sha512-15lLoMpWVfudt/uavXASaLPG+iMA11smC95NK4oft9M3iP16NlXELLRcztLi4Drlm+Y4O0IX+HAREzjcgdvGkA==","signatures":[{"sig":"MEQCIEsS5jcU49aGLyP23ClPzAOD1gM8zkYeqRAZI1AwmGo6AiAuEQq+5jlmZhjZpy3Gikg7VYHftGXje/KSGUTGbHmoYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43840},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"205382a508305263d945d24e8357ea9fe44874c3","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test","build":"bun build ./src/index.ts --outdir dist --format esm --target browser --minify --external '@bitruvius/*' && tsc --emitDeclarationOnly"},"_npmUser":{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},"_integrity":"sha512-15lLoMpWVfudt/uavXASaLPG+iMA11smC95NK4oft9M3iP16NlXELLRcztLi4Drlm+Y4O0IX+HAREzjcgdvGkA==","_npmVersion":"10.8.3","description":"Bitruvius point-symbol renderer: instanced icon/billboard quads (sprite atlas, screen-space sizing, RGBA8UI picking) for I3S Point-feature symbology, in the shared ENU frame","directories":{},"sideEffects":["./src/index.ts"],"_nodeVersion":"24.3.0","dependencies":{"@bitruvius/geo-core":"^0.3.0","@bitruvius/render-runtime":"^0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/point-symbols_0.3.0_1785722198515_0.2707768506847512","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bitruvius/point-symbols","version":"0.3.1","keywords":["bitruvius","geospatial","webgl2","i3s","billboard","renderer"],"license":"SEE LICENSE IN LICENSE","_id":"@bitruvius/point-symbols@0.3.1","maintainers":[{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},{"name":"danrhedges","email":"danrhedges@gmail.com"}],"homepage":"https://dev.bitruvius.com/sdks/js/","bugs":{"url":"https://github.com/bitruvius/support"},"dist":{"shasum":"d5f8ba6c3f3b18b9ce08bfedf0df8e6617bf055f","tarball":"https://registry.npmjs.org/@bitruvius/point-symbols/-/point-symbols-0.3.1.tgz","fileCount":8,"integrity":"sha512-LVaXWEE2fv6OsDlVInX+jTA1b9YxiC2ak39gbB12dfoXhUtUMlGKehnzQ1YFgD36JWOksN3EOGtsy6j5LhfH8A==","signatures":[{"sig":"MEQCIEJqkBIWZg0fL0E8U+C3VcMIeeUAR6leM4C8ORNQE+WDAiBurI3E6KzPjY2lYlepKeMu+vhXblbRMH/zkJcVArJzEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44018},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"d5f8ba6c3f3b18b9ce08bfedf0df8e6617bf055f","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test","build":"bun build ./src/index.ts --outdir dist --format esm --target browser --minify --external '@bitruvius/*' && tsc --emitDeclarationOnly"},"_npmUser":{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},"_integrity":"sha512-LVaXWEE2fv6OsDlVInX+jTA1b9YxiC2ak39gbB12dfoXhUtUMlGKehnzQ1YFgD36JWOksN3EOGtsy6j5LhfH8A==","_npmVersion":"10.8.3","description":"Bitruvius point-symbol renderer: instanced icon/billboard quads (sprite atlas, screen-space sizing, RGBA8UI picking) for I3S Point-feature symbology, in the shared ENU frame","directories":{},"sideEffects":["./src/index.ts"],"_nodeVersion":"24.3.0","dependencies":{"@bitruvius/geo-core":"^0.3.1","@bitruvius/render-runtime":"^0.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/point-symbols_0.3.1_1785725531300_0.031239769582484866","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bitruvius/point-symbols","version":"0.3.2","keywords":["bitruvius","geospatial","webgl2","i3s","billboard","renderer"],"license":"SEE LICENSE IN LICENSE","_id":"@bitruvius/point-symbols@0.3.2","maintainers":[{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},{"name":"danrhedges","email":"danrhedges@gmail.com"}],"homepage":"https://dev.bitruvius.com/sdks/js/","bugs":{"url":"https://github.com/bitruvius/support"},"dist":{"shasum":"ba893097077930f83fb8ab6c84e8a1ecc933c00e","tarball":"https://registry.npmjs.org/@bitruvius/point-symbols/-/point-symbols-0.3.2.tgz","fileCount":8,"integrity":"sha512-tUBRuegX5QICiyxDzPV3NPUOG35dJPx1L+ELg84TLQ78Clzv78jRWz6LRRrGDMzQbBowjkbntpQsGzuBzGQb1w==","signatures":[{"sig":"MEQCICHgr5e4JOMxhDq1DqhdcMNbK7upaNmWZw5on+M7PwrnAiBknnTUplYExev1goLt6Yqj3SG4AhCWt56qOQxH9bsGUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44018},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"ba893097077930f83fb8ab6c84e8a1ecc933c00e","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"bun test","build":"bun build ./src/index.ts --outdir dist --format esm --target browser --minify --external '@bitruvius/*' && tsc --emitDeclarationOnly"},"_npmUser":{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},"_integrity":"sha512-tUBRuegX5QICiyxDzPV3NPUOG35dJPx1L+ELg84TLQ78Clzv78jRWz6LRRrGDMzQbBowjkbntpQsGzuBzGQb1w==","_npmVersion":"10.8.3","description":"Bitruvius point-symbol renderer: instanced icon/billboard quads (sprite atlas, screen-space sizing, RGBA8UI picking) for I3S Point-feature symbology, in the shared ENU frame","directories":{},"sideEffects":["./src/index.ts"],"_nodeVersion":"24.3.0","dependencies":{"@bitruvius/geo-core":"^0.3.2","@bitruvius/render-runtime":"^0.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/point-symbols_0.3.2_1785952498119_0.07465340403508192","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"_id":"@bitruvius/point-symbols@0.3.3","bugs":{"url":"https://github.com/bitruvius/support"},"dist":{"shasum":"9336652e37dd236dae73f186599177ab1a0ab0ad","tarball":"https://registry.npmjs.org/@bitruvius/point-symbols/-/point-symbols-0.3.3.tgz","fileCount":8,"integrity":"sha512-lWdNJ4jaunFsDi2EYfUY0L8TXO7G/qcQLs+U9OaCEAhqqV6CzwpZCNas1Dq/vQWzK+d2PPk4vek78IMsfFQUaA==","signatures":[{"sig":"MEQCIDWazzl7Zg5hQOdionwZpwzOADmOA+JlcDOI5DF44sUcAiAKrc/YR0H0l5itk3NpCWJ7JuVCRVdtHXXoF74H2Qrg7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDoWQx+jkvHEkhYMaqkk8hA4ALIxgA4Zfdaw2Z7XYWiogIhAJHd5MzngDU7GBowgHi5ux8IyvYx56E5jAgQDJqFX+ts"}],"unpackedSize":44018},"main":"./dist/index.js","name":"@bitruvius/point-symbols","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"9336652e37dd236dae73f186599177ab1a0ab0ad","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"license":"SEE LICENSE IN LICENSE","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outdir dist --format esm --target browser --minify --external '@bitruvius/*' && tsc --emitDeclarationOnly"},"version":"0.3.3","_npmUser":{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},"homepage":"https://dev.bitruvius.com/sdks/js/","keywords":["bitruvius","geospatial","webgl2","i3s","billboard","renderer"],"_integrity":"sha512-lWdNJ4jaunFsDi2EYfUY0L8TXO7G/qcQLs+U9OaCEAhqqV6CzwpZCNas1Dq/vQWzK+d2PPk4vek78IMsfFQUaA==","_npmVersion":"10.8.3","description":"Bitruvius point-symbol renderer: instanced icon/billboard quads (sprite atlas, screen-space sizing, RGBA8UI picking) for I3S Point-feature symbology, in the shared ENU frame","directories":{},"maintainers":[{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},{"name":"danrhedges","email":"danrhedges@gmail.com"}],"sideEffects":["./src/index.ts"],"_nodeVersion":"24.3.0","dependencies":{"@bitruvius/geo-core":"^0.3.3","@bitruvius/render-runtime":"^0.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/point-symbols_0.3.3_1790299991236_0.4020201729705526"}}},"time":{"created":"2026-08-03T01:56:38.327Z","modified":"2026-09-25T01:33:11.522Z","0.1.0":"2026-07-24T21:36:33.642Z","0.3.0":"2026-08-03T01:56:38.666Z","0.3.1":"2026-08-03T02:52:11.427Z","0.3.2":"2026-08-05T17:54:58.269Z","0.3.3":"2026-09-25T01:33:11.336Z"},"bugs":{"url":"https://github.com/bitruvius/support"},"license":"SEE LICENSE IN LICENSE","homepage":"https://dev.bitruvius.com/sdks/js/","keywords":["bitruvius","geospatial","webgl2","i3s","billboard","renderer"],"description":"Bitruvius point-symbol renderer: instanced icon/billboard quads (sprite atlas, screen-space sizing, RGBA8UI picking) for I3S Point-feature symbology, in the shared ENU frame","maintainers":[{"name":"geoffhtaylor3d","email":"geoffhtaylor3d@gmail.com"},{"name":"danrhedges","email":"danrhedges@gmail.com"}],"readme":"<p align=\"center\">\n  <a href=\"https://bitruvius.com\"><img src=\"https://cdn.bitruvius.com/brand/bitruvius-logo.png\" width=\"360\" alt=\"Bitruvius\"></a>\n</p>\n\n# @bitruvius/point-symbols\n\n**One instanced WebGL2 draw path for every screen-facing symbol in a 3D scene: icons, markers and text labels.**\n\n> **Internal building block.** This package exists so that\n> [`@bitruvius/sdk-maplibre`](https://www.npmjs.com/package/@bitruvius/sdk-maplibre) and the\n> Bitruvius codecs can resolve their dependencies on npm. It has no standalone product story.\n> Unless you are deliberately building against it, install the SDK instead.\n\n## Why it is its own package\n\nThe renderer has to draw an I3S Point layer's `drawingInfo` icons, but it must not know what I3S is.\nIts entire input contract is a sprite atlas: one RGBA image plus a symbol table of atlas sub-rects,\non-screen sizes, tints and rotations, indexed by a per-feature `symbolId`. Nothing in that shape\nnames a service, a format or a map.\n\nThat decoupling is what lets unrelated callers share one draw path. An I3S layer builds an atlas from\n`drawingInfo` sprites, a label pass rasterises text into cells as tiles stream in, and an application\ncan hand over its own icon sheet. All three get the same instanced quads and the same picking. If the\nrenderer lived inside the I3S package, the label and marker paths would have to depend on I3S in\norder to draw a quad.\n\nIt depends only on `@bitruvius/geo-core` (the shared ENU frame and the packed tile type) and\n`@bitruvius/render-runtime` (GL plumbing). It takes a `WebGL2RenderingContext` and a matrix, not a\nmap, so it stays viewer-agnostic.\n\n## What is in it\n\n`PointBillboardRenderer` draws many tiles of screen-facing quads from one shared atlas. Positions ride\na `PackedPointTile` unchanged and are dequantized in the vertex shader (`world = q·scale + offset`),\nso a streaming engine uploads its integer buffers with no repacking.\n\n```ts\nconst r = new PointBillboardRenderer(gl);\nr.setAtlas(atlas);                       // BillboardSpriteAtlas, once\nconst h = r.upload(tile, symbolIds, featureIds);\n// per frame:\nr.render({ mvpWorld, viewportWidth, viewportHeight, devicePixelRatio }, [h]);\n// on click:\nconst hit = r.pick(frame, [h], cssX, cssY);\n// on tile eviction / teardown:\nr.release(h);\nr.dispose();\n```\n\nThe decisions worth knowing about:\n\n- **Alpha-tested opaque, never blended.** Fragments below the cutoff are discarded and the rest write\n  depth, so billboards z-buffer correctly against mesh, point clouds and splats with no global\n  back-to-front sort.\n- **Screen-space sizing.** Symbol sizes are CSS px, scaled by device pixel ratio and a global\n  `sizeScale`, applied after projection and divided by `clip.w`, so a symbol keeps its pixel size at\n  any depth.\n- **Labels as well as icons.** `anchorBottom` seats a quad above its point instead of centring it on\n  the point, `marginPx` floats it a few pixels higher, and the anchor offset is not rotated, so labels\n  stay upright while icons still rotate with a per-feature heading.\n- **GPU picking.** `pick()` renders ids into an `RGBA8UI` target scissored to a small box around the\n  cursor and reads back one texel. Transparent texels do not pick. A hit reports the tile handle, the\n  index within that tile, the feature's ENU position in metres, the symbol id, and the `featureId`\n  you joined at upload.\n- **Nothing draws as NaN.** `packBillboardInstances` is pure and unit-tested without a GL context; a\n  `symbolId` outside the table falls back to symbol 0, or to a 16 px white quad if the table is empty.\n\nOne constraint to plan around: `upload` bakes the atlas sub-rect into each instance buffer. Growing an\natlas reflows its cells, so resident tiles must be re-uploaded against the new one.\n\n## Who should depend on it\n\nAlmost nobody directly. Install [`@bitruvius/sdk-maplibre`](https://www.npmjs.com/package/@bitruvius/sdk-maplibre):\nits I3S Point layer wires this renderer for icon and label symbology, `BillboardInstancesLayer` places\nyour own atlas at a set of lng/lat points, and the SDK re-exports `BillboardSpriteAtlas`,\n`SymbolEntry` and `BillboardPickHit` so you can build an atlas without adding this package to your\ndependencies.\n\nDepend on it directly only when you drive WebGL2 yourself and want the same billboard pass inside your\nown renderer.\n\n## Trademarks\n\nEsri, ArcGIS and I3S are trademarks of Environmental Systems Research Institute, Inc. MapLibre is a\ntrademark of the MapLibre organization. All other marks are the property of their respective owners.\n\nThese names are used solely to describe the data formats this software interoperates with.\nBitruvius is not affiliated with, sponsored by, or endorsed by any of them, and no such\nrelationship is implied.\n\n## License\n\nProprietary. The full terms ship as `LICENSE` inside this package, and are readable\nbefore installing at [cdn.bitruvius.com/legal/sdk-license-v1.txt](https://cdn.bitruvius.com/legal/sdk-license-v1.txt).\n\n© Bitruvius, Inc.\n","readmeFilename":"README.md"}