Exemple #1
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();

            foreach (var entity in emanager.GetEntities())
            {
                if (entity.TryGetComponent <MovingComponent>(out var moving))
                {
                    if (moving.MovingMatrix.IsIdentity)
                    {
                        entity.RemoveComponent <MovingComponent>();
                        continue;
                    }

                    var transform = entity.GetComponent <TransformComponent>();
                    //dispose transform buffer to force update it in render technique
                    if (entity.TryGetComponent <D3DRenderComponent>(out var d3d))
                    {
                        d3d.TransformWorldBuffer.Dispose();
                    }
                    //
                    entity.UpdateComponent(transform.Multiply(moving.MovingMatrix));

                    entity.RemoveComponent <MovingComponent>();
                }
            }
        }
        public unsafe void RenderScene(ISceneSnapshot scene)
        {
            scene.AddReference();
            _graphicsDevice.ImmediateContext.GetBackBufferViews(out var backBufferDepthStencilView, out var backBufferRenderTargetView);

            var renderContext = _graphicsDevice.ImmediateContext; // : _graphicsDevice.CreateDeferredRenderContext();

            renderContext.SetRasterizerConfiguration(RasterizerConfiguration.FillFrontBack);
            renderContext.SetDepthConfiguration(DepthConfiguration.Enabled);

            renderContext.SetConstantBuffer(0, _sceneBuffer, RenderStage.VertexDomainPixel);
            renderContext.SetConstantBuffer(1, _batchBuffer, RenderStage.VertexDomainPixel);
            renderContext.SetConstantBuffer(2, _textureDescriptorBuffer, RenderStage.VertexDomainPixel);

            if (true)
            {
                RenderScene_Forward(renderContext, (SceneSnapshot)scene, backBufferDepthStencilView, backBufferRenderTargetView);
            }
            else
            {
            }

            _graphicsDevice.ImmediateContext.SetRenderTargets(backBufferDepthStencilView, backBufferRenderTargetView);
            _graphicsDevice.ImmediateContext.Present();
            scene.ReleaseReference();
        }
Exemple #3
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            Synchronize();
            var registrator = new RenderTechniqueRegistrator <TToolkitFrameProperties>(nested);

            try {
                using (var frame = graphics.FrameBegin()) {
                    RenderFrame(frame, snapshot, registrator);
                }
            } catch (SharpDX.CompilationException cex) {
                System.Diagnostics.Trace.WriteLine($"CompilationException[\n{cex.Message.Trim()}]");
            } catch (SharpDX.SharpDXException shex) {
                var reason = graphics.Device.D3DDevice.DeviceRemovedReason;
                System.Diagnostics.Trace.WriteLine(shex.Message);
                throw shex;
            } catch (System.Runtime.InteropServices.SEHException seh) {
                System.Diagnostics.Trace.WriteLine(seh.Message);
                throw seh;
            } catch (Exception ex) {
                System.Diagnostics.Trace.WriteLine(ex.Message);
                throw ex;
            } finally {
                registrator.Cleanup();
                Pass = registrator.Techniques.SelectMany(x => x.GetPass()).ToArray();
            }
        }
Exemple #4
0
        //TODO: remake executer it looks bad :(


        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;
            var window   = snapshot.Window;
            var emanager = ContextState.GetEntityManager();

            try {
                foreach (var entity in emanager.GetEntities())
                {
                    foreach (var com in entity.GetComponents <OrthographicCameraComponent>())
                    {
                        entity
                        .GetComponents <CameraMovementComponent>()
                        .DoFirst(movment => {
                            movment.Execute(CreateHandlerOrthographicHandler(com, snapshot));
                        });

                        com.UpdateViewMatrix();
                        com.UpdateProjectionMatrix(window.Width, window.Height);

                        snapshot.UpdateCamera(entity.Tag, com.GetState());
                    }

                    var isCamera = entity.GetComponents <PerspectiveCameraComponent>();
                    if (isCamera.Any())
                    {
                        var cameraCom = isCamera.Single();

                        foreach (var component in entity.GetComponents())
                        {
                            switch (component)
                            {
                            case CameraMovementComponent movment:
                                movment.Execute(CreateHandlerPerspectiveHandler(cameraCom, snapshot));
                                //entity.RemoveComponent(movment);
                                break;

                            case RayCollidedWithEntityComponent c:
                                //the case when camera is moved to position on some object mesh
                                MoveToPosition(cameraCom, c.IntersectionPositionWorld);
                                entity.RemoveComponent(c);
                                break;
                                //case MoveCameraToTargetComponent mvtt:
                                //    MoveToPosition(cameraCom, mvtt.TargetPosition);
                                //    entity.RemoveComponent(mvtt);
                                //    break;
                            }
                        }

                        cameraCom.UpdateViewMatrix();
                        cameraCom.UpdateProjectionMatrix(window.Width, window.Height);

                        snapshot.UpdateCamera(entity.Tag, cameraCom.GetState());
                    }
                }
            } catch (Exception ex) {
                ex.ToString();
                throw ex;
            }
        }
Exemple #5
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;
            var emanager = ContextState.GetEntityManager();

            foreach (var entity in emanager.GetEntities())
            {
                var coms = entity.GetComponents <ITerrainComponent>();
                if (!coms.Any())
                {
                    continue;
                }
                var conf = coms.OfType <TerrainConfigurationComponent>().Single();
                if (conf.IsModified)
                {
                    entity.RemoveComponents <TerrainGeneratorComponent>();
                    conf.IsModified = false;
                    var generator = new TerrainGeneratorComponent(conf.Width, conf.Height, conf);
                    generator.StartGeneratingAsync();
                    entity.AddComponent(generator);
                    continue;
                }
                var generating = coms.OfType <TerrainGeneratorComponent>().SingleOrDefault();
                if (generating.IsNull())
                {
                    continue;
                }
                if (generating.IsGenerated)
                {
                    entity.RemoveComponent(generating);

                    var geo = entity.GetComponents <TerrainGeometryCellsComponent>();
                    if (geo.Any())
                    {
                        entity.RemoveComponent(geo.First());
                    }

                    var newgeo = new TerrainGeometryCellsComponent();

                    newgeo.MaxHeight = generating.MaxHeight;
                    newgeo.MinHeight = generating.MinHeight;

                    BuildGeometry(generating.HeightMap, conf, newgeo);

                    entity.AddComponent(newgeo);

                    conf.Texture = generating.Texture;

                    var box = BoundingBox.CreateFromVertices(newgeo.Positions.ToArray());

                    entity.UpdateComponent(TransformComponent.Create(Matrix4x4.CreateTranslation(-box.GetCenter())));

                    entity.GetComponent <IRenderableComponent>().CanRender = true;

                    BuildCellsAsync(newgeo, conf);

                    break;
                }
            }
        }
        protected virtual OrthographicCameraComponent HandleChangingRotateCenter(ISceneSnapshot snapshot,
                                                                                 OrthographicCameraComponent camera, ref CameraMovementComponent component)
        {
            var world = ContextState.GetEntityManager().GetEntity(snapshot.WorldTag);

            if (world.TryGetComponents(
                    out CaptureTargetUnderMouseComponent capture,
                    out CollidedWithEntityByRayComponent collided))
            {
                var changed = OrthographicCameraComponent.Clone(camera);
                changed.RotatePoint = collided.IntersectionPositionWorld;

                var begin          = snapshot.Viewport.Vector3ToScreen(changed.Position, camera.GetState(), snapshot.Surface);
                var move           = new Vector2(capture.ScreenPosition.X - begin.X, capture.ScreenPosition.Y - begin.Y);
                var PanK           = (changed.Width * changed.Scale) / snapshot.Surface.Size.Width;
                var projectionMove = new Vector2(move.X * PanK, move.Y * PanK);
                var left           = Vector3.Cross(changed.UpDirection, changed.LookDirection).Normalized();
                var up             = Vector3.Cross(changed.LookDirection, left).Normalized();
                var panVector      = left * projectionMove.X + up * projectionMove.Y;
                changed.Position += -panVector;

                world.RemoveComponents <CaptureTargetUnderMouseComponent, CollidedWithEntityByRayComponent>();

                camera = changed;
            }

            return(camera);
        }
Exemple #7
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();
            var camera   = snapshot.Camera;

            try {
                foreach (var entity in emanager.GetEntities())
                {
                    if (!entity.Has <LightComponent>())
                    {
                        continue;
                    }
                    var light = entity.GetComponent <LightComponent>();
                    var color = entity.GetComponent <ColorComponent>();

                    snapshot.UpdateLight(light.Index, new LightState {
                        Intensity = light.Intensity,
                        Position  = light.Position,
                        Direction = light.Direction,
                        Color     = color.Color,
                        Type      = light.Type
                    });
                }
            } catch (Exception ex) {
                ex.ToString();
                throw ex;
            }
        }
Exemple #8
0
 public void Execute(ISceneSnapshot snapshot)
 {
     try {
         stopwatch.Restart();
         Executing(snapshot);
     } finally {
         stopwatch.Stop();
         ExecutionTime = stopwatch.Elapsed;
     }
 }
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var p1 = InputState.ButtonsStates[type].PointV2;

            var manager = context.GetEntityManager();
            var world   = manager.GetEntity(snapshot.WorldTag);

            world.UpdateComponent(CaptureTargetUnderMouseComponent.Create(p1));

            return(true);
        }
Exemple #10
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;
            var emanager = ContextState.GetEntityManager();

            var time = snapshot.FrameRateTime;

            foreach (var entity in emanager.GetEntities())
            {
                var has = entity.GetComponents <XZPlaneMovementComponent>();
                if (has.Any())
                {
                    var com = has.Single();

                    var first = com.TimeMovement == TimeSpan.Zero;

                    var delta = time - com.PrevTime;

                    com.PrevTime      = time;
                    com.TimeMovement += time;
                    if (first)
                    {
                        continue;
                    }

                    var spent = com.TimeMovement;

                    var tr          = entity.GetComponent <TransformComponent>();
                    var geoLocal    = entity.GetComponent <IGeometryComponent>();
                    var orientation = entity.GetComponent <OrientationComponent>();

                    var directionWorld = Vector3.TransformNormal(orientation.FrontDirectionLocal, tr.MatrixWorld);

                    var movement = Matrix4x4.Identity;
                    if (spent > TimeSpan.FromSeconds(2))
                    {
                        com.TimeMovement = TimeSpan.Zero;
                        var centerWorld = Vector3.Transform(geoLocal.Box.GetCenter(), tr.MatrixWorld);

                        movement       = Matrix4x4.CreateRotationY(10f.ToRad(), centerWorld);
                        directionWorld = Vector3.TransformNormal(orientation.FrontDirectionLocal, movement);
                    }

                    //S = V • t
                    var s = com.SpeedValue * ((float)delta.TotalMilliseconds / 1000.0f);
                    movement *= Matrix4x4.CreateTranslation(directionWorld * s);

                    entity.UpdateComponent(TransformComponent.Create(tr.MatrixWorld * movement));

                    snapshot.Notifier.NotifyChange(tr);
                }
            }
        }
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var input = snapshot.InputSnapshot;

            foreach (var cmd in input.Events)
            {
                if (cmd.Execute(snapshot, ContextState))
                {
                    input.RemoveEvent(cmd);
                }
            }
        }
Exemple #12
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);

            if (entity.TryGetComponent <CameraMovementComponent>(out var com) &&
                com.MovementType != CameraMovementComponent.MovementTypes.ChangeRotationCenter)
            {
                entity.RemoveComponent <CameraMovementComponent>();
            }

            return(true);
        }
Exemple #13
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();
            var ticks    = (float)snapshot.FrameRateTime.TotalMilliseconds;

            Synchronize();
            var registrator = new RenderTechniqueRegistrator <ToolkitRenderProperties>(nested);

            try {
                using (var frame = graphics.FrameBegin()) {
                    foreach (var entity in emanager.GetEntities().OrderBy(x => x.GetOrderIndex <RenderSystem>()))
                    {
                        if (entity.Contains(typeof(RenderableComponent), typeof(TransformComponent)))
                        {
                            registrator.Register(entity);
                        }
                    }

                    if (!registrator.HasAny)
                    {
                        return;
                    }

                    prevCameraState = snapshot.Camera;
                    var lights   = snapshot.Lights.Select(x => LightStructBuffer.From(x)).ToArray();
                    var gamebuff = GameStructBuffer.FromCameraState(prevCameraState, snapshot.Surface.Size);

                    frame.Graphics.UpdateDynamicBuffer(ref gamebuff, gameDataBuffer);
                    frame.Graphics.UpdateDynamicBuffer(lights, lightDataBuffer);

                    foreach (var str in registrator.Techniques)
                    {
                        if (str is IGraphicSystemContextDependent dependent)
                        {
                            dependent.ContextState = ContextState;
                        }
                        str.Render(frame.Graphics, new ToolkitRenderProperties(gameDataBuffer, lightDataBuffer, prevCameraState));
                    }
                }
            } catch (SharpDX.CompilationException cex) {
                ContextState.Logger.Error(cex);
            } catch (SharpDX.SharpDXException shex) {
                ContextState.Logger.Error(shex);
                throw shex;
            } catch (Exception ex) {
                ContextState.Logger.Error(ex.Message);
                throw ex;
            } finally {
                registrator.Cleanup();
                Pass = registrator.Techniques.SelectMany(x => x.GetPass()).ToArray();
            }
        }
Exemple #14
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;
            var emanager = ContextState.GetEntityManager();

            foreach (var entity in emanager.GetEntities())
            {
                foreach (var com in entity.GetComponents <IAnimationComponent>())
                {
                    com.Animate(entity, snapshot.FrameRateTime);
                }
            }
        }
        protected virtual OrthographicCameraComponent HandleZooming(ISceneSnapshot snapshot, OrthographicCameraComponent camera, CameraMovementComponent component)
        {
            var   changed = OrthographicCameraComponent.Clone(camera);
            float delta   = component.Delta;

            var nscale = camera.Scale - (delta * component.SpeedValue);

            if (nscale > 0)
            {
                changed.Scale = nscale;
            }

            return(changed);
        }
Exemple #16
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;

            var colliding = new Colliding(snapshot, ContextState);
            var emanager  = ContextState.GetEntityManager();

            foreach (var ev in snapshot.InputSnapshot.Events)
            {
                switch (ev)
                {
                case CaptureTargetUnderMouseCameraCommand capture:
                    if (colliding.TryToColliding(capture.ScreenPosition, out var collidedWith))
                    {
                        var entity = emanager.GetEntity(collidedWith.With);
                        var has    = entity.GetComponents <ManipulatableComponent>();
                        if (has.Any() && !entity.Has <CapturedToManipulateComponent>())
                        {
                            entity.AddComponent(new CapturedToManipulateComponent()
                            {
                                CapturePointWorld = collidedWith.IntersectionPositionWorld,
                            });
                            snapshot.InputSnapshot.RemoveEvent(ev);
                        }
                    }
                    break;
                }
            }

            foreach (var entity in emanager.GetEntities())
            {
                foreach (var com in entity.GetComponents <ICollidableComponent>())
                {
                    switch (com)
                    {
                    case CollidingWithScreenRayComponent byRay:
                        try {
                            if (colliding.TryToColliding(byRay.ScreenPosition, out var collidedWith))
                            {
                                entity.AddComponent(collidedWith);
                            }
                        } finally {
                            entity.RemoveComponent(byRay);
                        }
                        break;
                    }
                }
            }
        }
Exemple #17
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var           snapshot  = (SceneSnapshot)ss;
            var           emanager  = ContextState.GetEntityManager();
            var           toProcess = new List <GraphicEntity>();
            GraphicEntity source    = null;

            foreach (var entity in emanager.GetEntities())
            {
                if (entity.Has <IStickOnHeightMapComponent>())
                {
                    toProcess.Add(entity);
                }
                var s = entity.GetComponents <IHeightMapSourceComponent>();
                if (s.Any())
                {
                    source = entity;
                }
            }

            if (source.IsNull())
            {
                return;
            }

            foreach (var en in toProcess)
            {
                var com = en.GetComponent <IStickOnHeightMapComponent>();
                var tr  = en.GetComponent <TransformComponent>();

                var rayLocal   = new Ray(com.AttachPointLocal, com.AxisUpLocal);
                var rayEnWorld = rayLocal.Transformed(tr.MatrixWorld);

                //

                var sourceTr = source.GetComponent <TransformComponent>();
                var map      = source.GetComponent <IHeightMapSourceComponent>();

                var rayMapLocal = rayEnWorld.Transformed(sourceTr.MatrixWorld.Inverted());
                var matrix      = map.GetTransfromToMap(ref rayMapLocal);

                if (!matrix.IsIdentity)
                {
                    en.UpdateComponent(TransformComponent.Create(tr.MatrixWorld * matrix));

                    snapshot.Notifier.NotifyChange(tr);
                }
            }
        }
Exemple #18
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();
            var ticks    = (float)snapshot.FrameRateTime.TotalMilliseconds;

            Synchronize();
            var registrator = new RenderTechniqueRegistrator <CustomRenderProperties>(nested);

            try {
                using (var frame = graphics.Device.FrameBegin()) {
                    foreach (var entity in emanager.GetEntities().OrderBy(x => x.GetOrderIndex <RenderSystem>()))
                    {
                        var renders = entity.GetComponents <IRenderableComponent>();
                        if (renders.Any() && renders.All(x => x.CanRender))
                        {
                            if (!entity.Has <IGeometryComponent>() || !entity.Has <TransformComponent>())
                            {
                                throw new Exception("There are not all necessary components in entity to render.");
                            }
                            registrator.Register(entity);
                        }
                    }

                    prevCameraState = snapshot.Camera;
                    var lights   = snapshot.Lights.Select(x => LightStructBuffer.From(x)).ToArray();
                    var gamebuff = GameStructBuffer.FromCameraState(prevCameraState);

                    frame.Graphics.UpdateSubresource(ref gamebuff, gameDataBuffer, GameStructBuffer.RegisterResourceSlot);
                    frame.Graphics.UpdateDynamicBuffer(lights, lightDataBuffer, LightStructBuffer.RegisterResourceSlot);

                    foreach (var str in registrator.Techniques)
                    {
                        str.Render(frame.Graphics, new CustomRenderProperties(gameDataBuffer, lightDataBuffer, prevCameraState));
                    }
                }
            } catch (SharpDX.CompilationException cex) {
                System.Diagnostics.Trace.WriteLine($"CompilationException[\n{cex.Message.Trim()}]");
            } catch (SharpDX.SharpDXException shex) {
                //var reason = frame.Graphics.D3DDevice.DeviceRemovedReason;
                System.Diagnostics.Trace.WriteLine(shex.Message);
                throw shex;
            } catch (Exception ex) {
                System.Diagnostics.Trace.WriteLine(ex.Message);
                throw ex;
            } finally {
                registrator.Cleanup();
                Pass = registrator.Techniques.Select(x => x.GetPass()).ToArray();
            }
        }
Exemple #19
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var input = snapshot.InputSnapshot;

            foreach (var en in ContextState.GetEntityManager().GetEntities())
            {
                foreach (var cmd in input.Events)
                {
                    if (cmd.Execute(en))
                    {
                        input.RemoveEvent(cmd);
                    }
                }
            }
        }
Exemple #20
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);
            var state  = entity.GetComponent <OrthographicCameraComponent>().GetState();

            var delta = InputState.Delta;

            var data = new MovementData {
                End = InputState.CurrentPosition
            };

            entity.UpdateComponent(CameraMovementComponent.CreateZoom(state, data, delta, 0.001f));

            return(true);
        }
        public void ExportSnapshot(ISceneSnapshot s)
        {
            var snapshot = (SceneSnapshot)s;

            snapshot.Textures.Clear();
            foreach (var tex in textures)
            {
                snapshot.Textures.TryAdd(tex);
            }

            snapshot.Materials.Clear();
            foreach (var mat in materials)
            {
                snapshot.Materials.Add(mat);
            }

            snapshot.RenderJobBatches.Clear();
            foreach (var batch in renderJobBatches)
            {
                snapshot.RenderJobBatches.Add(batch);
            }

            snapshot.SpotlightInfos.Clear();
            foreach (var spotlightInfo in spotlightInfos)
            {
                snapshot.SpotlightInfos.Add(spotlightInfo);
            }

            snapshot.CameraEye   = _cameraEye;
            snapshot.ProjView    = _projView;
            snapshot.ProjViewInv = _projViewInv;

            foreach (var batch in snapshot.RenderJobBatches)
            {
                if (batch.MaterialResourcesIndexOverride != -1)
                {
                    foreach (var job in batch.Jobs)
                    {
                        if (job.MaterialResourcesIndex >= snapshot.Materials.Count)
                        {
                            throw new InvalidOperationException();
                        }
                    }
                }
            }

            snapshot.Time = _time;
        }
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var p1 = InputState.ButtonsStates[GeneralMouseButtons.Left].PointV2;

            var manager = context.GetEntityManager();
            var camera  = manager.GetEntity(snapshot.CurrentCameraTag);
            var world   = manager.GetEntity(snapshot.WorldTag);

            world.UpdateComponent(CaptureTargetUnderMouseComponent.Create(p1));
            camera.AddComponent(CameraMovementComponent.ChangeRotationCenter(
                                    camera.GetComponent <OrthographicCameraComponent>().GetState(),
                                    new MovementData {
                Begin = p1
            }));

            return(true);
        }
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();

            var world = emanager.GetEntity(snapshot.WorldTag);

            if (!world.Contains <ZoomToAllCompponent>())
            {
                return;
            }

            var fullBox = new AxisAlignedBox();

            foreach (var entity in emanager.GetEntities())
            {
                if (entity.TryGetComponents <GeometryBoundsComponent, TransformComponent, RenderableComponent>
                        (out var box, out var tr, out var renderable) && renderable.IsRenderable)
                {
                    fullBox = fullBox.Merge(box.Bounds.Transform(tr.MatrixWorld));
                }
            }

            var surface     = snapshot.Surface.Size;
            var aspectRatio = surface.Width / surface.Height;

            var size = fullBox.Size();

            var camera = ContextState.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);
            var com    = OrthographicCameraComponent.Clone(camera.GetComponent <OrthographicCameraComponent>());

            var move = Math.Max(Math.Abs(com.LookDirection.X * size.X),
                                Math.Max(Math.Abs(com.LookDirection.Y * size.Y), Math.Abs(com.LookDirection.Z * size.Z)));

            com.Position    = fullBox.Center + com.LookDirection * -move * 10;
            com.RotatePoint = fullBox.Center;
            com.Width       = Math.Max(size.X, Math.Max(size.Y, size.Z)) * aspectRatio;
            com.Scale       = 1;

            camera.UpdateComponent(com);



            world.RemoveComponent <ZoomToAllCompponent>();
        }
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);
            var state  = entity.GetComponent <OrthographicCameraComponent>().GetState();

            var p11  = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;
            var p2   = InputState.CurrentPosition;
            var data = new MovementData {
                Begin = p11, End = p2
            };

            //var any = entity.GetComponents<CameraMovementComponent>();
            //if (any.Any()) {//get prev state... means manipulate is continuing
            //    state = any.Single().State;
            //}

            entity.UpdateComponent(CameraMovementComponent.CreateRotate(state, data, sensitivity));

            return(true);
        }
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);

            if (!entity.TryGetComponent(out OrthographicCameraComponent ccom))
            {
                return(false);
            }

            var p11  = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;
            var p2   = InputState.CurrentPosition;
            var data = new MovementData {
                Begin = p11, End = p2
            };

            var state = ccom.GetState();

            entity.UpdateComponent(CameraMovementComponent.CreateRotate(state, data, sensitivity));

            return(true);
        }
        protected virtual OrthographicCameraComponent HandlePanning(ISceneSnapshot snapshot, OrthographicCameraComponent camera, CameraMovementComponent component)
        {
            var state = component.State;
            var data  = component.MovementData;

            var changed = OrthographicCameraComponent.Clone(camera);

            var forward = state.LookDirection;
            var left    = Vector3.Cross(state.UpDirection, forward).Normalized();
            var up      = Vector3.Cross(forward, left).Normalized();

            var move           = new Vector2(data.End.X - data.Begin.X, data.End.Y - data.Begin.Y);
            var PanK           = (changed.Width * changed.Scale) / snapshot.Surface.Size.Width;
            var projectionMove = new Vector2(move.X * PanK, move.Y * PanK);

            var panVector = left * projectionMove.X + up * projectionMove.Y;

            changed.Position = state.Position + panVector;

            return(changed);
        }
Exemple #27
0
        public bool Execute(ISceneSnapshot snapshot, IContextState context)
        {
            var entity = context.GetEntityManager().GetEntity(snapshot.CurrentCameraTag);

            var p1 = InputState.ButtonsStates[GeneralMouseButtons.Right].PointV2;// InputState.PrevPosition;
            var p2 = InputState.CurrentPosition;

            var data = new MovementData {
                Begin = p1, End = p2
            };

            var state = entity.GetComponent <OrthographicCameraComponent>().GetState();

            if (entity.TryGetComponent <CameraMovementComponent>(out var movement))
            {
                //get prev state... means manipulate is continuing
                state = movement.State;
            }

            entity.UpdateComponent(CameraMovementComponent.CreatePan(state, data));
            return(true);
        }
Exemple #28
0
        protected override void Executing(ISceneSnapshot ss)
        {
            var snapshot = (SceneSnapshot)ss;
            var emanager = ContextState.GetEntityManager();

            foreach (var entity in emanager.GetEntities())
            {
                var meshes = entity.GetComponents <CMOAnimateMeshComponent>();
                if (meshes.Any())
                {
                    var mesh = meshes.First();
                    var anim = entity.GetComponent <MeshAnimationComponent>();
                    if (mesh.Bones.IsNull())
                    {
                        continue;
                    }

                    CurrentAnimationTime += snapshot.FrameRateTime.TotalMilliseconds / 1000.0f;
                    var currentAnimation = mesh.Animations[anim.AnimationName];

                    anim.Bones      = CalculateBonesMatrix(mesh, currentAnimation);
                    anim.IsModified = true;

                    var hasGeo = entity.GetComponents <AnimationHittableGeometryComponent>();

                    if (!hasGeo.Any())
                    {
                        entity.AddComponent(ConstructMesh(anim.Bones, mesh));
                    }
                    else if (hasGeo.First().Tree.IsBuilt&& !entity.Has <OrientationComponent>())
                    {
                        var c = new XZPlaneMovementComponent {
                        };
                        entity.AddComponents(CreateStickOnComponent(hasGeo.First()), c);
                    }
                }
            }
        }
Exemple #29
0
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var emanager = ContextState.GetEntityManager();
            var cmanager = ContextState.GetComponentManager();

            var world = emanager.GetEntity(snapshot.WorldTag);

            if (!world.TryGetComponent <CaptureTargetUnderMouseComponent>(out var capture) || !capture.IsValid)
            {
                return;
            }

            if (!cmanager.TryGetComponent <OrthographicCameraComponent>(snapshot.CurrentCameraTag, out var camera) ||
                !capture.IsValid)
            {
                return;
            }
            var prevCameraState = camera.GetState();

            var geoPool  = ContextState.GetGeometryPool();
            var rayWorld = snapshot.Viewport.UnProject(capture.ScreenPosition, prevCameraState, snapshot.Surface);

            var octree = ContextState.GetOctreeManager();

            var priority = uint.MaxValue;
            var closest  = float.MaxValue;
            var hit      = Vector3.Zero;

            var result = octree.GetColliding(ref rayWorld, enTag => {
                var entity = emanager.GetEntity(enTag);

                if (!entity.GetComponent <RenderableComponent>().IsRenderable)
                {
                    return(false);
                }

                if (!entity.TryGetComponents <GeometryPoolComponent, TransformComponent, HittableComponent>(
                        out var geoId, out var transform, out var hittable) && geoId.IsValid && transform.IsValid)
                {
                    return(false);
                }

                if (priority < hittable.PriorityIndex)
                {
                    return(false); //ignore less priority objcts
                }

                if (priority > hittable.PriorityIndex)
                {
                    closest  = float.MaxValue; //not interesting distance because the priority is highest
                    priority = hittable.PriorityIndex;
                }

                var geo = geoPool.GetGeometry <GeometryStructures>(geoId);

                if (!geo.IsBuilt)
                {
                    return(false);
                }

                var toLocal  = Matrix4x4.Identity;
                var toWorld  = Matrix4x4.Identity;
                var rayLocal = rayWorld;
                if (!transform.MatrixWorld.IsIdentity)
                {
                    toWorld  = transform.MatrixWorld;
                    toLocal  = toWorld.Inverted();
                    rayLocal = rayLocal.Transformed(toLocal);//to local
                }

                var hits = geo.HitByLocal(rayLocal);

                if (!hits.Any())
                {
                    return(false);
                }

                var min = hits.Min(x => x.Distance);

                if (closest < min)
                {
                    return(false);
                }

                closest = min;
                hit     = hits.First(x => x.Distance == min).Point.TransformedCoordinate(toWorld);
                return(true);
            });

            if (result.Any())  //important to update not add, to rewrite existed component
            {
                world.UpdateComponent(CollidedWithEntityByRayComponent.Create(result.Last(), hit));
            }
            else
            {
                //can't find any hitable object under mouse
                world.RemoveComponent <CaptureTargetUnderMouseComponent>();
            }
        }
        protected override void Executing(ISceneSnapshot snapshot)
        {
            var window   = snapshot.Surface;
            var emanager = ContextState.GetEntityManager();

            var entity = emanager.GetEntity(snapshot.CurrentCameraTag);

            if (!entity.TryGetComponent(out OrthographicCameraComponent camera))
            {
                Debug.WriteLine("Camera System: no camera in context");
                return;
            }

            if (entity.TryGetComponent(out CameraMovementComponent movement) && movement.IsValid)
            {
                bool needUpdate;
                bool needRemove;
                camera = OrthographicCameraComponent.Clone(camera);
                switch (movement.MovementType)
                {
                case CameraMovementComponent.MovementTypes.Rotate:
                    camera     = HandleRotatingWithCursorReturningPosition(snapshot, camera, movement);
                    needUpdate = true;
                    needRemove = true;
                    break;

                case CameraMovementComponent.MovementTypes.Zoom:
                    camera     = HandleZooming(snapshot, camera, movement);
                    needUpdate = true;
                    needRemove = true;
                    break;

                case CameraMovementComponent.MovementTypes.Pan:
                    camera     = HandlePanning(snapshot, camera, movement);
                    needUpdate = true;
                    needRemove = false;
                    break;

                case CameraMovementComponent.MovementTypes.ChangeRotationCenter:
                    camera     = HandleChangingRotateCenter(snapshot, camera, ref movement);
                    needUpdate = true;
                    needRemove = true;
                    break;

                default:
                    throw new Exception($"Type {movement.MovementType} is not supported.");
                }
                //entity.RemoveComponent(movement);
                if (needUpdate)
                {
                    entity.UpdateComponent(camera);
                }
                if (needRemove)
                {
                    //need to remove zoom com. manually because WinForm pushs many mouse wheel commands for one user scroll
                    //also remove for all, there is no garantee to get mouse up
                    entity.RemoveComponent <CameraMovementComponent>();
                }
            }

            camera.UpdateViewMatrix();
            camera.UpdateProjectionMatrix(window.Size);

            snapshot.UpdateCamera(entity.Tag, camera.GetState());
        }