void PointCloudCompleted(AsyncGPUReadbackRequest request) { particleUnifiedArray.AsynchUpdate(request); if (pointCloud != null) { pointCloud.UpdatePointCloud(particleUnifiedArray.nativeArray); } gate = true; }
void PointCloudDataCompleted(AsyncGPUReadbackRequest request) { lidarDataByte.AsynchUpdate(request); message = new LidarMessage(LidarHorisontalRes * NrOfLasers * NrOfCameras, OSPtime, lidarDataByte.array); gate = true; /* * var stringarray = System.BitConverter.ToSingle(lidarDataByte.array, lidarDataByte.array.Length - 12); * Debug.Log("x in bytes: " + stringarray.ToString()); * Debug.Log("CPU is little endian: " + System.BitConverter.IsLittleEndian.ToString()); */ }
private IEnumerator UpdateRadar() { // Set Global Buffers computeShader.SetMatrix("inv_CameraMatrix", radarCameras[0].projectionMatrix.inverse); computeShader.SetInt("ImageWidthRes", WidthRes); computeShader.SetInt("ImageHeightRes", HeightRes); computeShader.SetInt("NrOfImages", NrOfCameras); computeShader.SetInt("radarResolution", radarSpokeResolution); computeShader.SetInt("radarSweepResolution", radarSweepResolution); computeShader.SetFloat("MaxDist", MaxDistance); computeShader.SetFloat("MinDist", MinDistance); computeShader.SetFloat("AntennaGainDbi", AntennaGainDbi); computeShader.SetFloat("PowerW", PowerW); computeShader.SetFloat("RadarFrequencyGhz", RadarFrequencyGhz); computeShader.SetFloat("SpokeAngle", SpokeAngle); // Radar Spokes buffers int RadarSpokesHandle = computeShader.FindKernel("RadarSpokes"); computeShader.SetTexture(RadarSpokesHandle, "RadarCharacteristics", RadiationPattern); int dataSize = sizeof(int); ComputeBuffer RadarSpokesIntBuffer = new ComputeBuffer(radarSpokeResolution * radarSweepResolution, dataSize); RadarSpokesInt = new NativeArray <int>(radarSpokeResolution * radarSweepResolution, Allocator.Temp, NativeArrayOptions.ClearMemory); RadarSpokesIntBuffer.SetData(RadarSpokesInt); computeShader.SetBuffer(RadarSpokesHandle, "RadarSpokesInt", RadarSpokesIntBuffer); for (int i = 0; i < radarCameras.Length; i++) { Quaternion angle = Quaternion.Euler(0, i * 360.0f / NrOfCameras, 0); Matrix4x4 m = Matrix4x4.Rotate(angle); computeShader.SetTexture(RadarSpokesHandle, "depthImage" + i.ToString(), radarCameras[i].targetTexture); computeShader.SetMatrix("CameraRotationMatrix" + i.ToString(), m); } // Radar range Convolution buffers int RadarRangeCovolutionHandle = computeShader.FindKernel("RadarRangeCovolution"); computeShader.SetBuffer(RadarRangeCovolutionHandle, "RadarSpokesInt", RadarSpokesIntBuffer); dataSize = sizeof(float); ComputeBuffer RadarSpokesFloatBuffer = new ComputeBuffer(radarSpokeResolution * radarSweepResolution, dataSize); RadarSpokesFloat = new NativeArray <float>(radarSpokeResolution * radarSweepResolution, Allocator.Temp, NativeArrayOptions.ClearMemory); RadarSpokesFloatBuffer.SetData(RadarSpokesFloat); computeShader.SetBuffer(RadarRangeCovolutionHandle, "RadarSpokesFloat", RadarSpokesFloatBuffer); // Radar spoke max buffers int RadarSpokeMax = computeShader.FindKernel("FindRadarSpokeMax"); ComputeBuffer MaxSpokesBuffer = new ComputeBuffer(radarSweepResolution, sizeof(float)); NativeArray <float> MaxSpokes = new NativeArray <float>(radarSweepResolution, Allocator.Temp, NativeArrayOptions.ClearMemory); MaxSpokesBuffer.SetData(MaxSpokes); computeShader.SetBuffer(RadarSpokeMax, "MaxSpokes", MaxSpokesBuffer); computeShader.SetBuffer(RadarSpokeMax, "RadarSpokesFloat", RadarSpokesFloatBuffer); // Radar plot image buffers int RadarPlotImageHandle = computeShader.FindKernel("CreateRadarPlotImage"); if (RadarPlotExternalImage != null) { dataSize = 24; RadarPlotImage = new RenderTexture(RadarPlotExternalImage.width, RadarPlotExternalImage.height, dataSize); RadarPlotImage.enableRandomWrite = true; RadarPlotImage.Create(); computeShader.SetTexture(RadarPlotImageHandle, "plotImage", RadarPlotImage); computeShader.SetBuffer(RadarPlotImageHandle, "RadarSpokesFloat", RadarSpokesFloatBuffer); computeShader.SetBuffer(RadarPlotImageHandle, "MaxSpokes", MaxSpokesBuffer); } // Radar spoke image buffers int RadarSpokeImageHandle = computeShader.FindKernel("CreateRadarSpokeImage"); if (RadarSpokeExternalImage != null) { dataSize = 24; RadarSpokeImage = new RenderTexture(RadarSpokeExternalImage.width, RadarSpokeExternalImage.height, dataSize); RadarSpokeImage.enableRandomWrite = true; RadarSpokeImage.Create(); computeShader.SetTexture(RadarSpokeImageHandle, "spokeImage", RadarSpokeImage); computeShader.SetBuffer(RadarSpokeImageHandle, "RadarSpokesFloat", RadarSpokesFloatBuffer); computeShader.SetBuffer(RadarSpokeImageHandle, "MaxSpokes", MaxSpokesBuffer); } // Radar Data string radarDataKernel = "RadarDataKernel"; string timeInSecondsBuffer = "timeInSeconds"; string azimuthBuffer = "azimuth"; string radarDataBuffer = "spokeData"; UnifiedArray <byte> radarData = new UnifiedArray <byte>(radarSweepResolution * radarSpokeResolution / 4, sizeof(uint), radarDataBuffer); radarData.SetBuffer(computeShader, radarDataKernel); UnifiedArray <float> azimuth = new UnifiedArray <float>(radarSweepResolution, sizeof(float), azimuthBuffer);; azimuth.SetBuffer(computeShader, radarDataKernel); UnifiedArray <double> timeInSeconds = new UnifiedArray <double>(radarSweepResolution, sizeof(double), timeInSecondsBuffer);; timeInSeconds.SetBuffer(computeShader, radarDataKernel); int radarDataKernelHandle = computeShader.FindKernel(radarDataKernel); computeShader.SetBuffer(radarDataKernelHandle, "RadarSpokesFloat", RadarSpokesFloatBuffer); computeShader.SetBuffer(radarDataKernelHandle, "MaxSpokes", MaxSpokesBuffer); ComputeBuffer timeArray = new ComputeBuffer(2, sizeof(double)); double[] timeArr = new double[2] { OSPtime, nextOSPtime }; timeArray.SetData(timeArr); computeShader.SetBuffer(radarDataKernelHandle, "timeArray", timeArray); // Radar clear buffers int ClearKernelHandle = computeShader.FindKernel("ClearRadar"); computeShader.SetBuffer(ClearKernelHandle, "RadarSpokesInt", RadarSpokesIntBuffer); // Fetch data from GPU float tempSens = -1; float tempSpokeAngle = -1; while (true) { // Check change in Inspector Variables if (Sensitivity != tempSens) { computeShader.SetFloat("Sensitivity", Sensitivity); tempSens = Sensitivity; } if (SpokeAngle != tempSpokeAngle) { computeShader.SetFloat("SpokeAngle", SpokeAngle); tempSpokeAngle = SpokeAngle; } timeArr[0] = OSPtime; timeArr[1] = nextOSPtime; timeArray.SetData(timeArr); computeShader.SetBuffer(radarDataKernelHandle, "timeArray", timeArray); // Create and Radar Data computeShader.Dispatch(RadarSpokesHandle, (int)Mathf.Ceil(NrOfCameras * WidthRes / 32), (int)Mathf.Ceil(HeightRes / 32), 1); computeShader.Dispatch(RadarRangeCovolutionHandle, (int)Mathf.Ceil(radarSweepResolution / 512), 1, 1); computeShader.Dispatch(RadarSpokeMax, (int)Mathf.Ceil(radarSweepResolution / 512), 1, 1); computeShader.Dispatch(radarDataKernelHandle, (int)Mathf.Ceil(radarSweepResolution / 512), 1, 1); // Recieve and send radar data var request2 = AsyncGPUReadback.Request(radarData.buffer); yield return(new WaitUntil(() => request2.done)); radarData.AsynchUpdate(request2); var request3 = AsyncGPUReadback.Request(azimuth.buffer); yield return(new WaitUntil(() => request3.done)); azimuth.AsynchUpdate(request3); var request4 = AsyncGPUReadback.Request(timeInSeconds.buffer); yield return(new WaitUntil(() => request4.done)); timeInSeconds.AsynchUpdate(request4); message = new RadarMessage(radarData.array, timeInSeconds.array, azimuth.array, (uint)MinDistance, (uint)MaxDistance, (uint)radarSpokeResolution); gate = true; // Debugging Images if (RadarPlotExternalImage != null) { computeShader.Dispatch(RadarPlotImageHandle, (int)Mathf.Ceil(RadarPlotImage.width / 32), (int)Mathf.Ceil(RadarPlotImage.height / 32), 1); } if (RadarSpokeExternalImage != null) { computeShader.Dispatch(RadarSpokeImageHandle, (int)Mathf.Ceil(RadarSpokeImage.width / 32), (int)Mathf.Ceil(RadarSpokeImage.height / 32), 1); } // Clear GPU memory computeShader.Dispatch(ClearKernelHandle, (int)Mathf.Ceil((radarSpokeResolution * radarSweepResolution) / 1024), 1, 1); } }