Beispiel #1
0
        public void Draw(OctTreeModule octTreeModule)
        {
            var frustum = Camera.GetFrustum();
            var nodes = octTreeModule.Query(frustum).Distinct()
                .Select(id => renderables.ContainsKey(id) ? renderables[id] : null);

            foreach (var node in nodes)
            {
                if (node != null) (node as IRenderable).PreDraw(device, renderContext);
            }

            device.SetRenderTarget(null);
            device.Clear(ClearOptions.DepthBuffer, Color.Black, 1.0f, 0);
            //device.Clear(Color.Black);
            device.BlendState = BlendState.AlphaBlend;
            device.DepthStencilState = DepthStencilState.Default;
            drawEffect.Parameters["World"].SetValue(Matrix.Identity);
            drawEffect.Parameters["View"].SetValue(Camera.View);
            drawEffect.Parameters["Projection"].SetValue(Camera.Projection);
            drawEffect.Parameters["WorldInverseTranspose"].SetValue(Matrix.Transpose(Matrix.Invert(Matrix.Identity)));
            //drawEffect.Parameters["DiffuseColor"].SetValue(new Vector4(1, 1, 1, 1));
            //drawEffect.Parameters["DiffuseLightDirection"].SetValue(Vector3.Normalize(new Vector3(1, 0, -1)));
            //drawEffect.Parameters["FillColor"].SetValue(new Vector4(0.5f, 0.5f, 1, 1));
            //drawEffect.Parameters["FillLightDirection"].SetValue(Vector3.Normalize(new Vector3(0, 1, 1)));
            drawEffect.Parameters["FogColor"].SetValue(Color.Black.ToVector4());
            drawEffect.CurrentTechnique = drawEffect.Techniques[0];
            renderContext.BeginScene(drawEffect, device);

            foreach (var node in nodes)
            {
                if (node != null) (node as IRenderable).DrawEx(renderContext);
            }

            debug.Begin(Matrix.Identity, Camera.View, Camera.Projection);
            foreach (var line in debugLines)
                debug.Line(line.Item1, line.Item2);
            debug.Flush();
            debugLines.Clear();
        }
Beispiel #2
0
        public UInt32 MousePick(OctTreeModule octTreeModule, Vector2 mouseCoordinates)
        {
            AddDebugLine(new VertexPositionColor(Vector3.Zero, Color.Red),
                new VertexPositionColor(Camera.Unproject(new Vector3(mouseCoordinates, 0)), Color.Blue));

            device.SetRenderTarget(mousePickTarget);
            device.Clear(ClearOptions.Target, Vector4.Zero, 0xFFFFFF, 0);
            device.BlendState = BlendState.Opaque;
            drawIDEffect.Parameters["World"].SetValue(Matrix.Identity);
            drawIDEffect.Parameters["View"].SetValue(Camera.View);
            var projection = Camera.GetSinglePixelProjection(mouseCoordinates);
            drawIDEffect.Parameters["Projection"].SetValue(projection);
            var frustum = new BoundingFrustum(Camera.View * projection);
            var nodes = octTreeModule.Query(frustum).Distinct()
                .Select(id => renderables.ContainsKey(id) ? renderables[id] : null);
            drawIDEffect.CurrentTechnique = drawIDEffect.Techniques[0];

            var context = new RenderIDContext();
            context.BeginScene(drawIDEffect, device);

            foreach (var node in nodes)
                if (node != null)
                {
                    //drawIDEffect.Parameters["World"].SetValue(node.World);
                    //drawIDEffect.Parameters["WorldInverseTranspose"].SetValue(Matrix.Transpose(Matrix.Invert(node.World)));

                    var idBytes = BitConverter.GetBytes((node as Component).EntityID);
                    drawIDEffect.Parameters["ID"].SetValue(
                        new Vector4(idBytes[0] / 255.0f, idBytes[1] / 255.0f, idBytes[2] / 255.0f, idBytes[3] / 255.0f));
                    //drawIDEffect.CurrentTechnique.Passes[0].Apply();
                    (node as IRenderable).DrawEx(context);
                    //(node as IRenderable).Draw(device);
                }

            device.SetRenderTarget(null);
            var data = new Color[1];
            mousePickTarget.GetData(data);
            var result = data[0].PackedValue;

            if (renderables.ContainsKey(result))
            {
                var mouseRay = new Ray(Camera.GetPosition(), Camera.Unproject(new Vector3(mouseCoordinates, 0)) - Camera.GetPosition());
                mouseRay.Direction = Vector3.Normalize(mouseRay.Direction);
                renderables[result].CalculateLocalMouse(mouseRay, AddDebugLine);
            }

            return result;
        }