public override object Process(Scene scene, Frame node)
        {
            if (scene == null)
            {
                return(null);
            }

            string tag = node.Tag;

            var match = _pattern.Match(tag);

            if (!match.Success)
            {
                return(null);
            }

            ShadowMapTechnique sm;

            if (match.Groups["S"].Success)
            {
                sm = new ShadowMapTechnique(int.Parse(match.Groups["S"].Value))
                {
                    IsDynamic = match.Groups["D"].Success
                }
            }
            ;
            else
            {
                sm = new ShadowMapTechnique()
                {
                    IsDynamic = match.Groups["D"].Success
                }
            };

            Camera camera   = (Camera)node.Component;
            Frame  affector = scene.FindNode(match.Groups["A"].Value);

            sm.Camera = camera;

            sm.Affector = affector;
            sm.UpdatePose(affector.GlobalPose);
            affector.Technique = sm;

            if (!match.Groups["K"].Success)
            {
                node.Component = null;
                node.Remove();
                node.Dispose();
            }

            if (!EngineState.Shadow.ShadowMapping.Enable)
            {
                EngineState.Shadow.ShadowMapping.Enable = true;
                EngineState.Shadow.Enable = true;
            }

            return(sm);
        }
    }
예제 #2
0
        public void AutomaticShadowMapping()
        {
            SceneTests.InitializeScene();
            var content = ImportContent();

            content.OnSceneAttach(SceneManager.Scene);

            //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\nissan2.DAE");
            //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\talia.DAE");

            if (SceneManager.Scene.Physics != null)
            {
                SceneManager.Scene.Physics.Enable = true;
            }

            if (SceneManager.Scene.Lights.Count == 0)
            {
                var light = new Light()
                {
                    Diffuse  = new Vector3(1, 1, 1),
                    Specular = new Vector3(1, 1, 1),
                    Type     = LightType.Directional,
                    Enable   = true
                };

                SceneManager.Scene.Create("DirectionalLight0", new FrameLight(light),
                                          localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0));
            }
            FrameLight.CreateShadowMapForAllLights(SceneManager.Scene);
            _technique    = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault();
            _targetCamera = _technique.Camera;

            _technique.Bias = 0.9e-2f;

            SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0);
            SceneManager.Scene.AmbientLight.SkyColor    = new Vector3(0.2f, 0.2f, 0.2f);

            Engine.Presenter.Rendering += Presenter_Rendering;
            SceneManager.Scene.Dynamics.Add(new Dynamic(x =>
            {
                if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D1))
                {
                    _technique.KernelSize = 3;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D2))
                {
                    _technique.KernelSize = 5;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D3))
                {
                    _technique.KernelSize = 7;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D4))
                {
                    _technique.KernelSize = 1;
                }
            }));
        }
예제 #3
0
        public void Import()
        {
            SceneTests.InitializeScene();

            //RenderManager.PushTechnique<DefferedLigthing<DefferedLightingEffect>>();
            //EngineState.Shadow.Enable = true;
            //EngineState.Shadow.ShadowMapping.Enable = true;
            //Deffered.DrawGBuffers<DefferedShadowRender>();

            // var content = ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\shadowScene.DAE");
            var content = ImportContent();

            if (content == null)
            {
                return;
            }

            if (SceneManager.Scene.Physics != null)
            {
                SceneManager.Scene.Physics.Enable = true;
            }

            if (SceneManager.Scene.Lights.Count == 0)
            {
                var light = new Light()
                {
                    Diffuse  = new Vector3(1, 1, 1),
                    Specular = new Vector3(1, 1, 1),
                    Type     = LightType.Directional,
                    Enable   = true
                };

                SceneManager.Scene.Create("DirectionalLight0", new FrameLight(light),
                                          localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0));

                FrameLight.CreateShadowMapForAllLights(SceneManager.Scene);
            }
            _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault();
            if (_technique == null)
            {
                FrameLight.CreateShadowMapForAllLights(SceneManager.Scene);
                _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault();
            }
            _targetCamera         = _technique.Camera;
            _technique.KernelSize = 3;
            //targetCamera.ZNear = 1;
            //targetCamera.ZFar = 1000;
            //targetCamera.AspectRatio = 1;
            //targetCamera.FieldOfView = Numerics.PIover6;
            //targetCamera.Type = ProjectionType.Perspective;
            //targetCamera.CommitChanges();
            _technique.Bias = 0.9e-2f;

            SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0);
            SceneManager.Scene.AmbientLight.SkyColor    = new Vector3(0.2f, 0.2f, 0.2f);
            //EngineState.Lighting.Reflection.UseDefaultTechnique = true;

            Engine.Presenter.Rendering += Presenter_Rendering;
            SceneManager.Scene.Dynamics.Add(new Dynamic(x =>
            {
                if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D1))
                {
                    _technique.KernelSize = 3;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D2))
                {
                    _technique.KernelSize = 5;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D3))
                {
                    _technique.KernelSize = 7;
                }
                else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D4))
                {
                    _technique.KernelSize = 1;
                }
            }));
            //    }
            //}
        }
예제 #4
0
        public void EdgeFiltering()
        {
            SceneTests.InitializeScene();

            //var content = ImportContent();
            var content = ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\shadowScene.DAE");

            EngineState.Shadow.ShadowMapping.PcfBlurSize = 5;
            content.OnSceneAttach(SceneManager.Scene);

            //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\nissan2.DAE");
            //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\talia.DAE");

            if (SceneManager.Scene.Physics != null)
            {
                SceneManager.Scene.Physics.Enable = true;
            }

            //if (SceneManager.Scene.Lights.Count == 0)
            //{
            //    var light = new Light()
            //    {
            //        Diffuse = new Vector3(1, 1, 1),
            //        Specular = new Vector3(1, 1, 1),
            //        Type = LightType.Directional,
            //        Enable = true
            //    };

            //    SceneManager.Scene.Create("DirectionalLight0", new LightInstance(light),
            //        localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0));
            //}
            FrameLight.CreateShadowMapForAllLights(SceneManager.Scene);
            _technique    = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault();
            _targetCamera = _technique.Camera;

            _technique.Bias = 0.9e-2f;

            SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0);
            SceneManager.Scene.AmbientLight.SkyColor    = new Vector3(0.2f, 0.2f, 0.2f);

            EngineState.Shadow.ShadowMapping.PcfBlurSize = 3;
            var edgeTechnique = new EdgeShadowFilteringTechnique();

            RenderManager.PushTechnique(edgeTechnique);
            bool debug = true;

            if (debug)
            {
                Form form = new Form();
                form.BackColor     = Color.Blue;
                form.StartPosition = FormStartPosition.CenterScreen;
                form.Size          = new System.Drawing.Size(edgeTechnique.ShadowFactorTex.Width, edgeTechnique.ShadowFactorTex.Height);

                form.SuspendLayout();

                Canvas3D canvas = new Canvas3D()
                {
                    Width  = form.Width,
                    Height = form.Height
                };
                canvas.Dock = DockStyle.Fill;
                var presenter = canvas.CreateSwapChainPresenter();
                form.Controls.Add(canvas);
                form.ResumeLayout();

                Engine.RenderFrame += () =>
                {
                    presenter.Begin(new Color4(Color.Aqua.ToArgb()));

                    var device = GraphicDeviceFactory.Device;
                    device.Ps.SamplerStacks[0].Push(SamplerState.Linear);
                    device.Blend = SceneTechnique.NoBlend;

                    var texture = edgeTechnique.EdgeSrcTexture;
                    RenderTexture(device, texture, width: texture.Width, height: texture.Height);

                    device.Ps.SamplerStacks[0].Pop();

                    presenter.End();
                };

                form.Show();
            }
        }
 public ShadowMapGlyp(Scene scene, ShadowMapTechnique sm) : base(scene, sm.Camera)
 {
     this.sm = sm;
 }
예제 #6
0
        public ShadowMapTechnique CreateShadowMap(Scene scene, int size, bool isDynamic, Vector3 maxWorld, Vector3 minWorld)
        {
            if (scene == null)
            {
                throw new NullReferenceException("Scene");
            }

            var sm = new ShadowMapTechnique(size)
            {
                IsDynamic = isDynamic
            };
            var viewMat = Matrix.LookAt(_globalPosition, _globalPosition + _globalDirection, Vector3.UnitY);
            var camera  = new Camera();

            camera.View = viewMat;

            if (_light.Type == LightType.Directional)
            {
                var   centerWorld = 0.5f * (maxWorld + minWorld);
                float distance    = Vector3.Distance(minWorld, maxWorld) * 0.5f;
                var   newPosition = centerWorld - _globalDirection * distance;
                camera.Position = newPosition;
                viewMat         = camera.View;
            }

            Vector3 maxView = new Vector3(float.MinValue, float.MinValue, float.MinValue);
            Vector3 minView = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);

            foreach (var n in scene.Geometries)
            {
                var meshContainer = n.Component as FrameMesh;
                if (meshContainer != null)
                {
                    Mesh mesh         = meshContainer.Mesh;
                    var  globalPose   = n.GlobalPose;
                    var  pose         = globalPose * viewMat;
                    var  positionView = mesh.GetVertexBufferView <Vector3>(IASemantic.Position);

                    for (int i = 0; i < positionView.Count; i++)
                    {
                        var pos     = positionView[i];
                        var posView = Vector3.TransformCoordinates(pos, pose);

                        maxView = Vector3.Max(posView, maxView);
                        minView = Vector3.Min(posView, minView);
                    }

                    mesh.ReleaseViews();
                }

                FrameSkin skin = n.Component as FrameSkin;
                if (skin != null)
                {
                    TransformSkin(skin.Skin, ref minView, ref maxView, viewMat);
                }
            }

            camera.ZNear       = Math.Max(1, minView.Z);
            camera.ZFar        = Math.Max(2, maxView.Z);
            camera.OrthoWidth  = maxView.X - minView.X;
            camera.OrthoHeight = maxView.Y - minView.Y;
            camera.FieldOfView = Numerics.PIover2;

            camera.Type    = ProjectionType.Orthographic;
            sm.Camera      = camera;
            sm.Affector    = Node;
            Node.Technique = sm;

            sm.OnSceneAttach(scene);

            return(sm);
        }