Пример #1
0
        public override void Update(Timer timer)
        {
            Entity[] entities = GetEntities();

            SingletonConfigVar  configVar  = WorldRef.GetSingletonComponent <SingletonConfigVar>();
            SingletonInput      input      = WorldRef.GetSingletonComponent <SingletonInput>();
            SingletonFrameScene frameScene = WorldRef.GetSingletonComponent <SingletonFrameScene>();

            frameScene.FrameData.Reset();

            Transform transform;
            Camera    camera;

            foreach (var entity in entities)
            {
                camera    = entity.GetComponent <Camera>();
                transform = entity.GetComponent <Transform>();

                UpdateCamera(timer.DeltaTime, camera, transform, input, configVar);
                frameScene.FrameData.AddCameraData(new StandardFrameData.CameraData()
                {
                    View                   = camera.View,
                    Projection             = camera.Projection,
                    ViewProjection         = camera.ViewProjection,
                    PreviousView           = camera.PreviousView,
                    PreviousViewProjection = camera.PreviousViewProjection,
                    Position               = transform.Position,
                    Forward                = transform.Direction,
                    Frustrum               = new BoundingFrustum(camera.ViewProjection),
                });
            }
        }
Пример #2
0
        public override void Update(Timer timer)
        {
            Entity[]            entities   = GetEntities();
            SingletonFrameScene frameScene = WorldRef.GetSingletonComponent <SingletonFrameScene>();

            Transform transform;
            Light     light;

            entities = entities.OrderBy(a => a.GetComponent <Light>().Type).ToArray();

            int            index = 0;
            bool           culled;
            BoundingSphere boundingSphere;

            foreach (var entity in entities)
            {
                culled    = true;
                transform = entity.GetComponent <Transform>();
                light     = entity.GetComponent <Light>();

                foreach (var camera in frameScene.FrameData.CamerasList)
                {
                    boundingSphere = new BoundingSphere(transform.Position, light.Radius * 2);
                    if (light.Type != Light.LightType.Directional && !camera.Frustrum.Intersects(ref boundingSphere))
                    {
                        continue;
                    }
                    culled = false;
                    frameScene.FrameData.AddLightDataToCamera(camera.index, index);
                }

                if (culled)
                {
                    continue;
                }

                if (light.IsCastShadows)
                {
                    light.ViewProjection = Matrix.LookAtLH(
                        transform.Position,
                        transform.Position + transform.Direction,
                        Vector3.Up
                        );
                    //light.ViewProjection *= Matrix.PerspectiveFovLH(MathUtil.PiOverTwo, 1.0f, 0.01f, 10000f);
                    light.ViewProjection *= Matrix.OrthoLH(110f, 110f, 0.5f, 300f);
                }

                frameScene.FrameData.AddLightData(new StandardFrameData.LightData()
                {
                    Type           = light.Type,
                    Radius         = light.Radius,
                    IsCastShadows  = light.IsCastShadows,
                    ViewProjection = light.ViewProjection,
                    Frustrum       = new BoundingFrustum(light.ViewProjection),
                    Position       = transform.Position,
                    Direction      = transform.Direction,
                    Color          = light.Color,
                    Intensity      = light.Intensity,
                });
                index++;
            }
        }
Пример #3
0
        public override void Update(Timer timer)
        {
            SingletonFrameScene frameScene = WorldRef.GetSingletonComponent <SingletonFrameScene>();

            Transform transform;
            Renderer  renderer;

            //TODO: faster ordering optimization

            /*Entity[] entities = GetEntities();
             * entities = entities.OrderBy(a => a.GetComponent<Renderer>().materialInfo.Queue)
             *      .ThenBy(a => a.GetComponent<Renderer>().materialInfo.Name)
             *      .ThenBy(a => a.GetComponent<Renderer>().meshInfo.Name).ToArray();*/

            int  index = 0;
            bool culled;

            foreach (Entity entity in SortedByRendererEntities)
            {
                culled = true;

                transform = entity.GetComponent <Transform>();
                renderer  = entity.GetComponent <Renderer>();

                renderer.Bounds = BoundsBox.TransformAABBFast(renderer.meshInfo.Bounds, transform.TransformMatrix);

                foreach (var camera in frameScene.FrameData.CamerasList)
                {
                    if (camera.Frustrum.Intersects(ref renderer.Bounds.boundingBox))
                    {
                        culled = false;
                        frameScene.FrameData.AddRendererDataToCamera(camera.index, index);
                    }
                }

                foreach (var light in frameScene.FrameData.LightsList)
                {
                    if (!light.IsCastShadows)
                    {
                        continue;
                    }
                    if (light.Frustrum.Intersects(ref renderer.Bounds.boundingBox))
                    {
                        culled = false;
                        frameScene.FrameData.AddRendererDataToLight(light.index, index);
                    }
                }

                if (culled)
                {
                    continue;
                }

                frameScene.FrameData.AddRendererData(new StandardFrameData.RendererData()
                {
                    EntityId = entity.ID,
                    PreviousTransformMatrix = transform.PreviousTransformMatrix,
                    TransformMatrix         = transform.TransformMatrix,
                    MeshName      = renderer.meshInfo.Name,
                    MaterialName  = renderer.materialInfo.Name,
                    MaterialQueue = renderer.materialInfo.Queue,
                    IsDynamic     = renderer.IsDynamic,
                });
                index++;
            }
        }