/// <summary> /// Handles the SurfaceObserver's OnDataReady event. /// </summary> /// <param name="cookedData">Struct containing output data.</param> /// <param name="outputWritten">Set to true if output has been written.</param> /// <param name="elapsedCookTimeSeconds">Seconds between mesh cook request and propagation of this event.</param> private void SurfaceObserver_OnDataReady(SurfaceData cookedData, bool outputWritten, float elapsedCookTimeSeconds) { //We have new visuals, so we can disable and cleanup the older surface GameObject surfaceToCleanup; if (pendingCleanup.TryGetValue(cookedData.id.handle, out surfaceToCleanup)) { CleanupSurface(surfaceToCleanup); pendingCleanup.Remove(cookedData.id.handle); } GameObject surface; if (surfaces.TryGetValue(cookedData.id.handle, out surface)) { // Set the draw material for the renderer. MeshRenderer renderer = surface.GetComponent <MeshRenderer>(); renderer.sharedMaterial = SpatialMappingManager.Instance.SurfaceMaterial; renderer.enabled = SpatialMappingManager.Instance.DrawVisualMeshes; if (SpatialMappingManager.Instance.CastShadows == false) { renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; } } surfaceWorkOutstanding = false; SurfaceObserver.SurfaceDataReadyDelegate dataReady = DataReady; if (dataReady != null) { dataReady(cookedData, outputWritten, elapsedCookTimeSeconds); } }
public bool RequestMeshAsync(SurfaceData dataRequest, SurfaceObserver.SurfaceDataReadyDelegate onDataReady) { if (onDataReady == null) { throw new ArgumentNullException("onDataReady"); } if (dataRequest.outputMesh == null) { throw new ArgumentNullException("dataRequest.outputMesh"); } if (dataRequest.outputAnchor == null) { throw new ArgumentNullException("dataRequest.outputAnchor"); } if (dataRequest.outputCollider == null && dataRequest.bakeCollider) { throw new ArgumentException("dataRequest.outputCollider must be non-NULL if dataRequest.bakeCollider is true", "dataRequest.outputCollider"); } if ((double)dataRequest.trianglesPerCubicMeter < 0.0) { throw new ArgumentException("dataRequest.trianglesPerCubicMeter must be greater than zero", "dataRequest.trianglesPerCubicMeter"); } bool flag = SurfaceObserver.Internal_AddToWorkQueue(this.m_Observer, onDataReady, dataRequest.id.handle, dataRequest.outputMesh, dataRequest.outputAnchor, dataRequest.outputCollider, dataRequest.trianglesPerCubicMeter, dataRequest.bakeCollider); if (!flag) { Debug.LogError("RequestMeshAsync has failed. Is your surface ID valid?"); } return(flag); }
private static void InvokeSurfaceDataReadyEvent(SurfaceObserver.SurfaceDataReadyDelegate onDataReady, int surfaceId, MeshFilter outputMesh, WorldAnchor outputAnchor, MeshCollider outputCollider, float trisPerCubicMeter, bool bakeCollider, bool outputWritten, float elapsedBakeTimeSeconds) { if (onDataReady != null) { SurfaceData bakedData; bakedData.id.handle = surfaceId; bakedData.outputMesh = outputMesh; bakedData.outputAnchor = outputAnchor; bakedData.outputCollider = outputCollider; bakedData.trianglesPerCubicMeter = trisPerCubicMeter; bakedData.bakeCollider = bakeCollider; onDataReady(bakedData, outputWritten, elapsedBakeTimeSeconds); } }
private static extern bool Internal_AddToWorkQueue(IntPtr observer, SurfaceObserver.SurfaceDataReadyDelegate onDataReady, int surfaceId, MeshFilter filter, WorldAnchor wa, MeshCollider mc, float trisPerCubicMeter, bool createColliderData);