XRPlanes constructor

XRPlanes(
  1. WebGLRenderer renderer
)

Implementation

XRPlanes(WebGLRenderer renderer ):super(){
	final matrix = Matrix4();
	final currentPlanes = {};
	final xr = renderer.xr as WebXRWorker;

	xr.addEventListener( 'planesdetected', (event){
		final frame = event.data as XRFrame;
		final planes = frame.detectedPlanes.dartify() as Map?;
      if(planes != null){
        final referenceSpace = xr.getReferenceSpace();

        bool planeschanged = false;

        for ( final plane in currentPlanes.keys ) {
          final Mesh? mesh = currentPlanes[plane];
          if ( planes.containsKey( plane ) == false ) {
            mesh!.geometry?.dispose();
            mesh.material?.dispose();
            remove( mesh );

            currentPlanes.remove( plane );
            planeschanged = true;
          }
        }

        for (final plane in planes.keys ) {
          if ( !currentPlanes.containsKey( plane )) {
            final pose = frame.getPose( plane.planeSpace, referenceSpace !)!;
            matrix.copyFromUnknown( pose.transform.matrix.dartify() );

            final polygon = plane.polygon;

            int minX = double.maxFinite.toInt();
            int maxX = -double.maxFinite.toInt();
            int minZ = double.maxFinite.toInt();
            int maxZ = -double.maxFinite.toInt();

            for ( final point in polygon ) {
              minX = math.min( minX, point.x );
              maxX = math.max( maxX, point.x );
              minZ = math.min( minZ, point.z );
              maxZ = math.max( maxZ, point.z );
            }

            final width = maxX - minX;
            final height = maxZ - minZ;

            final geometry = BoxGeometry( width.toDouble(), 0.01, height.toDouble() );
            final material = MeshBasicMaterial.fromMap( { 'color': (0xffffff * math.Random().nextDouble().toInt()) } );

            final mesh = Mesh( geometry, material );
            mesh.position.setFromMatrixPosition( matrix );
            mesh.quaternion.setFromRotationMatrix( matrix );
            add( mesh );

            currentPlanes[plane] =  mesh;
            planeschanged = true;
          }
        }

        if ( planeschanged ) {
          dispatchEvent(Event(type: 'planeschanged' ));
        }
      }
	});
}