Beispiel #1
0
        public Node(VertexPositionNormalTexture v0, VertexPositionNormalTexture v1, VertexPositionNormalTexture v2, VertexPositionNormalTexture v3, World wld, Node parent = null)
        {
            Children = new Node[4];

            world = wld;
            Parent = parent;

            /*
            Vector3 n1 = -Vector3.Cross(v3.Position - v1.Position, v0.Position - v1.Position);
            Vector3 n2 = -Vector3.Cross(v0.Position - v2.Position, v3.Position - v2.Position);
            n1.Normalize();
            n2.Normalize();

            v0.Normal = (n1 + n2) / 2f;
            v1.Normal = n1;
            v2.Normal = n2;
            v3.Normal = (n1 + n2) / 2f;*/
            Verticies = new VertexPositionNormalTexture[4] { v0, v1, v2, v3 };

            float d = v1.Position.X - v0.Position.X;
            Vector3[] offsets1 = new Vector3[] { new Vector3(0, 0, -1), new Vector3(-1, 0, -1), new Vector3(-1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 1), new Vector3(0, 0, 1) };
            Vector3[] offsets2 = new Vector3[] { new Vector3(-1, 0, -1), new Vector3(-1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(1, 0, 0), new Vector3(1, 0, 1) };
            for (int i = 0; i < Verticies.Length; i++) {
                Verticies[i].Normal = Vector3.Zero;
                 Vector3 p = Verticies[i].Position;
                for (int j = 0; j < offsets1.Length; j++) {
                    Vector3 n = Vector3.Cross(
                        offsets1[j] * d + world.getHeight(p + offsets1[j] * d),
                        offsets2[j] * d + world.getHeight(p + offsets2[j] * d));
                    n.Normalize();
                    Verticies[i].Normal += n;
                }
                Verticies[i].Normal.Normalize();
            }

            Normals = new VertexPositionColor[] {
                new VertexPositionColor(v0.Position, Color.Red),
                new VertexPositionColor(v0.Position + v0.Normal, Color.Blue),
                new VertexPositionColor(v1.Position, Color.Red),
                new VertexPositionColor(v1.Position + v1.Normal, Color.Blue),
                new VertexPositionColor(v2.Position, Color.Red),
                new VertexPositionColor(v2.Position + v2.Normal, Color.Blue),
                new VertexPositionColor(v3.Position, Color.Red),
                new VertexPositionColor(v3.Position + v3.Normal, Color.Blue)
            };

            bsphere = new BoundingSphere((v0.Position + v1.Position + v2.Position + v3.Position) / 4f, 1f);
            bsphere.Radius = Vector3.DistanceSquared(bsphere.Center, v0.Position) * 10;
        }
Beispiel #2
0
        protected override void Initialize()
        {
            world = new World();

            base.Initialize();
        }