@@ -43,6 +43,9 @@ import { VoxelChunk } from "./world/VoxelChunk.ts";
4343import type { VoxelEntry , VoxelCoord } from "./world/types.ts" ;
4444import { packTransform , type FACE } from "./utils/math.ts" ;
4545import { FACE_OFFSETS } from "./mesh/math.ts" ;
46+ import type {
47+ VoxelLayerHookListener
48+ } from "./hooks.ts" ;
4649
4750type MaterialCustomizerFn = (
4851 material : THREE . MeshLambertMaterial | THREE . MeshStandardMaterial ,
@@ -131,6 +134,12 @@ export interface VoxelRendererOptions {
131134 * Uses the engine's default logger if not provided.
132135 */
133136 logger ?: Systems . Logger ;
137+
138+ /**
139+ * Optional callback that is called whenever a layer is added, removed, or updated.
140+ * Useful for synchronizing external systems with changes to the voxel world.
141+ */
142+ onLayerUpdated ?: VoxelLayerHookListener ;
134143}
135144
136145/**
@@ -172,6 +181,7 @@ export class VoxelRenderer extends ActorComponent {
172181 #alphaTest: number ;
173182
174183 #logger: Systems . Logger ;
184+ #onLayerUpdated?: VoxelLayerHookListener ;
175185
176186 constructor (
177187 actor : Actor < any > ,
@@ -191,12 +201,14 @@ export class VoxelRenderer extends ActorComponent {
191201 blocks = [ ] ,
192202 shapes = [ ] ,
193203 alphaTest = 0.1 ,
194- logger = actor . world . logger
204+ logger = actor . world . logger ,
205+ onLayerUpdated
195206 } = options ;
196207
197208 this . #materialType = material ;
198209 this . #materialCustomizer = materialCustomizer ;
199210 this . #alphaTest = alphaTest ;
211+ this . #onLayerUpdated = onLayerUpdated ;
200212 this . #logger = logger . child ( {
201213 namespace : "VoxelRenderer"
202214 } ) ;
@@ -304,13 +316,23 @@ export class VoxelRenderer extends ActorComponent {
304316 position ,
305317 { blockId, transform }
306318 ) ;
319+ this . #onLayerUpdated?.( {
320+ action : "voxel-set" ,
321+ layerName,
322+ metadata : { position, blockId, rotation, flipX, flipZ }
323+ } ) ;
307324 }
308325
309326 removeVoxel (
310327 layerName : string ,
311328 options : VoxelRemoveOptions
312329 ) : void {
313330 this . world . removeVoxelAt ( layerName , options . position ) ;
331+ this . #onLayerUpdated?.( {
332+ action : "voxel-removed" ,
333+ layerName,
334+ metadata : { position : options . position }
335+ } ) ;
314336 }
315337
316338 getVoxel ( position : THREE . Vector3Like ) : VoxelEntry | undefined ;
@@ -359,27 +381,69 @@ export class VoxelRenderer extends ActorComponent {
359381 name : string ,
360382 options : VoxelLayerConfigurableOptions = { }
361383 ) : VoxelLayer {
362- return this . world . addLayer ( name , options ) ;
384+ const layer = this . world . addLayer ( name , options ) ;
385+ this . #onLayerUpdated?.( {
386+ action : "added" ,
387+ layerName : name ,
388+ metadata : { options }
389+ } ) ;
390+
391+ return layer ;
392+ }
393+
394+ updateLayer (
395+ name : string ,
396+ options : Partial < VoxelLayerConfigurableOptions >
397+ ) : boolean {
398+ const result = this . world . updateLayer ( name , options ) ;
399+ if ( result ) {
400+ this . #onLayerUpdated?.( {
401+ action : "updated" ,
402+ layerName : name ,
403+ metadata : { options }
404+ } ) ;
405+ }
406+
407+ return result ;
363408 }
364409
365410 removeLayer (
366411 name : string
367412 ) : boolean {
368- return this . world . removeLayer ( name ) ;
413+ const result = this . world . removeLayer ( name ) ;
414+ if ( result ) {
415+ this . #onLayerUpdated?.( {
416+ action : "removed" ,
417+ layerName : name ,
418+ metadata : { }
419+ } ) ;
420+ }
421+
422+ return result ;
369423 }
370424
371425 setLayerOffset (
372426 name : string ,
373427 offset : VoxelCoord
374428 ) : void {
375429 this . world . setLayerOffset ( name , offset ) ;
430+ this . #onLayerUpdated?.( {
431+ action : "offset-updated" ,
432+ layerName : name ,
433+ metadata : { offset }
434+ } ) ;
376435 }
377436
378437 translateLayer (
379438 name : string ,
380439 delta : VoxelCoord
381440 ) : void {
382441 this . world . translateLayer ( name , delta ) ;
442+ this . #onLayerUpdated?.( {
443+ action : "offset-updated" ,
444+ layerName : name ,
445+ metadata : { delta }
446+ } ) ;
383447 }
384448
385449 async loadTileset (
0 commit comments