void CheckTexture() { var targetWidth = -1; var targetHeight = -1; if (Distorted) { // Distorted + fisheye - render to cubemap, then distort to sensor-sized texture if (Fisheye) { if (renderTarget != null && (!renderTarget.IsCube || !renderTarget.IsValid(CubemapSize, CubemapSize))) { renderTarget.Release(); renderTarget = null; } if (renderTarget == null) { renderTarget = SensorRenderTarget.CreateCube(CubemapSize, CubemapSize, faceMask); SensorCamera.targetTexture = null; } } // Distorted - render to larger texture, then distort to sensor-sized one else { targetWidth = LensDistortion.ActualWidth; targetHeight = LensDistortion.ActualHeight; } if (DistortedHandle != null && !DistortedHandle.IsValid(Width, Height)) { DistortedHandle.Release(); DistortedHandle = null; } if (DistortedHandle == null) { DistortedHandle = SensorRenderTarget.Create2D(Width, Height, GraphicsFormat.R8G8B8A8_SRGB, true); } } else { // Undistorted - use only sensor-sized texture if (DistortedHandle != null) { DistortedHandle.Release(); DistortedHandle = null; } targetWidth = Width; targetHeight = Height; } if (targetWidth > 0) { if (renderTarget != null && !renderTarget.IsValid(targetWidth, targetHeight)) { renderTarget.Release(); renderTarget = null; } if (renderTarget == null) { renderTarget = SensorRenderTarget.Create2D(targetWidth, targetHeight, GraphicsFormat.R8G8B8A8_SRGB, !Distorted); SensorCamera.targetTexture = renderTarget; } } if (CurrentByteBufferSize != ByteBufferSize) { ReadbackPool.Resize(ByteBufferSize); CurrentByteBufferSize = ByteBufferSize; } }
private void Reset() { if (PointCloudBuffer != null) { PointCloudBuffer.Release(); PointCloudBuffer = null; } if (LatitudeAnglesBuffer != null) { LatitudeAnglesBuffer.Release(); LatitudeAnglesBuffer = null; } UsedMeasurementsPerRotation = (int)(MeasurementsPerRotation * HorizontalAngle / 360f); DeltaLongitudeAngle = HorizontalAngle / 360f / UsedMeasurementsPerRotation; StartLongitudeOffset = ForwardAngle / 360f - HorizontalAngle / 720f + 0.5f; MaxAngle = Mathf.Abs(CenterAngle) + FieldOfView / 2.0f; float startLatitudeAngle; // Assuming center of view frustum is horizontal, find the vertical FOV (of view frustum) that can encompass the tilted Lidar FOV. // "MaxAngle" is half of the vertical FOV of view frustum. if (VerticalRayAngles.Count == 0) { MaxAngle = Mathf.Abs(CenterAngle) + FieldOfView / 2.0f; MinAngle = Mathf.Abs(CenterAngle) - FieldOfView / 2.0f; startLatitudeAngle = 90.0f + MaxAngle; //If the Lidar is tilted up, ignore lower part of the vertical FOV. if (CenterAngle < 0.0f) { startLatitudeAngle -= MaxAngle * 2.0f - FieldOfView; } } else { LaserCount = VerticalRayAngles.Count; startLatitudeAngle = 90.0f - VerticalRayAngles.Min(); var endLatitudeAngle = 90.0f - VerticalRayAngles.Max(); FieldOfView = startLatitudeAngle - endLatitudeAngle; MaxAngle = Mathf.Max(startLatitudeAngle - 90.0f, 90.0f - endLatitudeAngle); MinAngle = Mathf.Min(startLatitudeAngle - 90.0f, 90.0f - endLatitudeAngle); } CurrentVerticalRayAngles = new List <float>(VerticalRayAngles); CurrentLaserCount = LaserCount; CurrentUsedMeasurementsPerRotation = UsedMeasurementsPerRotation; CurrentHorizontalAngle = HorizontalAngle; CurrentForwardAngle = ForwardAngle; CurrentFieldOfView = FieldOfView; CurrentCenterAngle = CenterAngle; CurrentMinDistance = MinDistance; CurrentMaxDistance = MaxDistance; var latitudeAngles = new float[LaserCount]; if (VerticalRayAngles.Count == 0) { if (LaserCount == 1) { latitudeAngles[0] = 1f - (90f + CenterAngle) * Mathf.Deg2Rad / Mathf.PI; } else { var deltaLatitudeAngle = FieldOfView / LaserCount; var index = 0; var angle = startLatitudeAngle; while (index < LaserCount) { latitudeAngles[index] = 1f - angle * Mathf.Deg2Rad / Mathf.PI; index++; angle -= deltaLatitudeAngle; } } } else { for (var index = 0; index < LaserCount; index++) { latitudeAngles[index] = 1f - ((90.0f - VerticalRayAngles[index]) * Mathf.Deg2Rad / Mathf.PI); } } LatitudeAnglesBuffer = new ComputeBuffer(LaserCount, sizeof(float)); LatitudeAnglesBuffer.SetData(latitudeAngles); var totalCount = LaserCount * UsedMeasurementsPerRotation; PointCloudBuffer = new ComputeBuffer(totalCount, UnsafeUtility.SizeOf <Vector4>()); Points = new Vector4[totalCount]; ReadbackPool.Resize(totalCount); if (PointCloudMaterial != null) { PointCloudMaterial.SetBuffer(Properties.PointCloud, PointCloudBuffer); } }