/// <summary> /// Construye los nodos de un quadtree según el nivel /// </summary> /// <param name="nodes">Nodos</param> /// <returns>Devuelve la lista de nodos superiores del quadtree</returns> private SceneryNode[] BuildQuadtreeNodes(SceneryNode[] nodes) { int upperNodeCount = nodes.Length / 4; int upperNodeSide = Convert.ToInt32(Math.Sqrt(nodes.Length)); List <SceneryNode> resultNodes = new List <SceneryNode>(); for (int y = 0; y < upperNodeSide; y += 2) { for (int x = 0; x < upperNodeSide; x += 2) { int start = (y * upperNodeSide) + x; int indexA = start; int indexB = start + 1; int indexC = start + upperNodeSide; int indexD = start + upperNodeSide + 1; //Asignar nodos al nuevo nodo SceneryNode newNode = new SceneryNode(); newNode.Build( nodes[indexA], nodes[indexB], nodes[indexC], nodes[indexD]); resultNodes.Add(newNode); } } return(resultNodes.ToArray()); }
/// <summary> /// Obtiene la lista de nodos que tienen intersección con el AABB a partir del nodo especificado /// </summary> /// <param name="aabb">AABB</param> /// <param name="node">Nodo inicial</param> /// <param name="resultNodes">Obtiene la lista de nodos finales con intersección</param> private void GetNodes(BoundingBox aabb, SceneryNode node, ref List <SceneryTriangleNode> resultNodes) { if (node != null) { if (node.HasChilds) { if (aabb.Contains(node.NorthEast.AABB) != ContainmentType.Disjoint) { this.GetNodes(aabb, node.NorthEast, ref resultNodes); } if (aabb.Contains(node.NorthWest.AABB) != ContainmentType.Disjoint) { this.GetNodes(aabb, node.NorthWest, ref resultNodes); } if (aabb.Contains(node.SouthEast.AABB) != ContainmentType.Disjoint) { this.GetNodes(aabb, node.SouthEast, ref resultNodes); } if (aabb.Contains(node.SouthWest.AABB) != ContainmentType.Disjoint) { this.GetNodes(aabb, node.SouthWest, ref resultNodes); } } else { if (node is SceneryTriangleNode) { resultNodes.Add((SceneryTriangleNode)node); } } } }
protected override Scenery Read(ContentReader input, Scenery existingInstance) { Scenery scenery = existingInstance; if (scenery == null) { scenery = new Scenery(); } scenery.Terrain = input.ReadObject <Texture2D>(); scenery.TerrainBufferDeclaration = input.ReadObject <VertexDeclaration>(); scenery.TerrainBufferVertexStride = input.ReadInt32(); scenery.TerrainBuffer = input.ReadObject <VertexBuffer>(); scenery.TerrainBufferVertexCount = input.ReadInt32(); List <SceneryTriangleNode> nodes = new List <SceneryTriangleNode>(); int nodeCount = input.ReadInt32(); for (int i = 0; i < nodeCount; i++) { SceneryTriangleNode node = input.ReadObject <SceneryTriangleNode>(); nodes.Add(node); } SceneryNode root = BuildQuadtree(nodes.ToArray()); scenery.Root = root; scenery.TerrainIndexBuffers.Add(LOD.High, input.ReadObject <IndexBuffer>()); scenery.TerrainIndexBuffers.Add(LOD.Medium, input.ReadObject <IndexBuffer>()); scenery.TerrainIndexBuffers.Add(LOD.Low, input.ReadObject <IndexBuffer>()); scenery.Effect = input.ReadObject <Effect>(); scenery.Texture1 = input.ReadObject <Texture2D>(); scenery.Texture2 = input.ReadObject <Texture2D>(); scenery.Texture3 = input.ReadObject <Texture2D>(); scenery.Texture4 = input.ReadObject <Texture2D>(); scenery.DetailTexture1 = input.ReadObject <Texture2D>(); scenery.DetailTexture2 = input.ReadObject <Texture2D>(); scenery.DetailTexture3 = input.ReadObject <Texture2D>(); scenery.DetailTexture4 = input.ReadObject <Texture2D>(); //Leer el efecto para renderizar billboards scenery.BillboardEffect = input.ReadObject <Effect>(); scenery.BillboardGrassTexture = input.ReadObject <Texture2D>(); scenery.BillboardTreeTexture = input.ReadObject <Texture2D>(); return(scenery); }