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; }
protected override void Initialize() { world = new World(); base.Initialize(); }