Пример #1
0
        public static SceneGraph PickClosestObject(SceneGraph root, Camera Camera, Matrix ProjMatrix, Vector2 ClickPoint, Vector2 ScreenDims)
        {
            // Convert screen pixel to view space
            Vector2 viewSpacePixel = new Vector2((2.0f * ClickPoint.X / ScreenDims.X - 1.0f) / ProjMatrix.M11, (-2.0f * ClickPoint.Y / ScreenDims.Y + 1.0f) / ProjMatrix.M22);
            Ray viewRay = new Ray(new Vector3(), new Vector3(viewSpacePixel.X, viewSpacePixel.Y, 1.0f));

            // View Ray is now the thing we will use...
            Matrix toWorld = Matrix.Invert(Camera.GetViewMatrix());
            viewRay.Direction = Vector3.TransformNormal(viewRay.Direction, toWorld);
            viewRay.Position = Vector3.TransformCoordinate(viewRay.Position, toWorld);

            return pickClosestObject(root, Camera.GetViewMatrix(), viewRay);
        }
Пример #2
0
        private void RenderNode(SceneGraph Node, Camera Camera, SlimDX.Matrix ProjMatrix, int indexOffset, int vertexOffset, out int indicesConsumed, out int verticesConsumed)
        {
            var ic = indexOffset;
            var vc = vertexOffset;

            if (Node.Renderable != null)
            {
                WorldViewProj = Node.WorldTransform * Camera.GetViewMatrix() * ProjMatrix;
                CPO_WorldViewProj.SetMatrix(WorldViewProj);

                int nIndices = Node.Renderable.GetIndexList(EffectName()).Length;
                int nVerts = Node.Renderable.GetVertexList(EffectName()).Length;

                // TODO KAM: This is horribly inefficient, change this!
                ImmediateContext.DrawIndexed(nIndices, indexOffset, vertexOffset);

                ic += nIndices;
                vc += nVerts;
            }

            foreach (var Child in Node.Children)
            {
                int cic, cvc;
                RenderNode(Child.Value, Camera, ProjMatrix, indexOffset + ic, vertexOffset + vc, out cic, out cvc);
                ic += cic;
                vc += cvc;
            }

            indicesConsumed = ic;
            verticesConsumed = vc;
        }