void Update() { Vector3 imageCenter = transform.TransformPoint(new Vector3(0, 0, -ImagePlane)); if (ExpectingResults) { NativeStream.Reader reader = lastResults.PixelData.AsReader(); for (int i = 0; i < lastResults.PixelData.ForEachCount; i++) { reader.BeginForEachIndex(i); while (reader.RemainingItemCount > 0) { int x = reader.Read <int>(); int y = reader.Read <int>(); Color c = reader.Read <Color>(); blasterTexture.SetPixel(x, y, c); } reader.EndForEachIndex(); } blasterTexture.Apply(); lastResults.PixelData.Dispose(); ExpectingResults = false; } if (BasePhysicsDemo.DefaultWorld == null) { return; } RayTracerSystem rbs = BasePhysicsDemo.DefaultWorld.GetExistingSystem <RayTracerSystem>(); if (rbs == null || !rbs.IsEnabled) { return; } Vector3 lightDir = new Vector3(0, 0, -1); GameObject sceneLight = GameObject.Find("Directional Light"); if (sceneLight != null) { lightDir = sceneLight.transform.rotation * lightDir; } Vector3 up = transform.rotation * new Vector3(0, 1, 0); Vector3 right = transform.rotation * new Vector3(1, 0, 0); lastResults = rbs.AddRequest(new RayTracerSystem.RayRequest { PinHole = transform.position, ImageCenter = imageCenter, Up = up, Right = right, LightDir = lightDir, RayLength = RayLength, PlaneHalfExtents = planeHalfExtents, AmbientLight = AmbientLight, ImageResolution = ImageRes, AlternateKeys = AlternateKeys, CastSphere = CastSphere, Shadows = Shadows, CollisionFilter = CollisionFilter.Default }); ExpectingResults = true; }
void Update() { if (World.DefaultGameObjectInjectionWorld == null) { return; } RayTracerSystem rbs = World.DefaultGameObjectInjectionWorld.GetExistingSystem <RayTracerSystem>(); if (rbs == null || !rbs.IsEnabled || !rbs.GetOutputDependency().IsCompleted) { return; } if (nextResults.PixelData.IsCreated) { // rbs.GetOutputDependency().IsCompleted is true here // so this is only needed to quieten the JobsDebugger? rbs.GetOutputDependency().Complete(); NativeStream.Reader reader = nextResults.PixelData.AsReader(); for (int i = 0; i < nextResults.PixelData.ForEachCount; i++) { reader.BeginForEachIndex(i); while (reader.RemainingItemCount > 0) { int x = reader.Read <int>(); int y = reader.Read <int>(); Color c = reader.Read <Color>(); blasterTexture.SetPixel(x, y, c); } reader.EndForEachIndex(); } blasterTexture.Apply(); // NOTE: If this logic is moved to the likes of LateUpdate there will be order issues // with the RayTracerSystem.OnUpdate function as PixelData will be invalid. nextResults.Dispose(); } Vector3 imageCenter = transform.TransformPoint(new Vector3(0, 0, -ImagePlane)); Vector3 lightDir = new Vector3(0, 0, -1); GameObject sceneLight = GameObject.Find("Directional Light"); if (sceneLight != null) { lightDir = sceneLight.transform.rotation * lightDir; } Vector3 up = transform.rotation * new Vector3(0, 1, 0); Vector3 right = transform.rotation * new Vector3(1, 0, 0); nextResults = rbs.AddRequest(new RayTracerSystem.RayRequest { PinHole = transform.position, ImageCenter = imageCenter, Up = up, Right = right, LightDir = lightDir, RayLength = RayLength, PlaneHalfExtents = planeHalfExtents, AmbientLight = AmbientLight, ImageResolution = imageRes, AlternateKeys = AlternateKeys, CastSphere = CastSphere, Shadows = Shadows, CollisionFilter = CollisionFilter.Default }); }