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;
        }
示例#2
0
        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
            });
        }