private void generateAudioOcclusion_Click(object sender, EventArgs e)
        {
            if (XDocImap != null && XDocItyp != null)
            {
                CommonFileDialogResult dialogResult = folderPicker.ShowDialog();

                if (dialogResult == CommonFileDialogResult.Ok)
                {
                    string         directory      = folderPicker.FileName;
                    MloInterior    mloInterior    = ParseXml.GetMloInterior(XDocItyp, XDocImap);
                    PortalInfoList portalInfoList = naOcclusionInteriorMetadata.GetPortalInfoList(mloInterior);
                    PathNodeList   pathNodeList   = naOcclusionInteriorMetadata.GetPathNodeList(portalInfoList, mloInterior);

                    if (mloInterior.name.StartsWith("hash_") || mloInterior.Rooms.Any(room => room.name.StartsWith("hash_")))
                    {
                        MessageBox.Show("CMloArchetypeDef, CMloInstanceDef, or CMloRoomDef had a hashed name! Real strings are required.", "Occlusion Generator", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    LogAction(">> Generated " + mloInterior.occlHash.occlusionHash + ".ymt.pso.xml");

                    naOcclusionInteriorMetadata.SavePsoXML(directory, mloInterior.occlHash.occlusionHash, portalInfoList, pathNodeList);
                }
            }
            else
            {
                MessageBox.Show("Empty field!", "Occlusion Generator", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
        public static void SavePsoXML(string directory, uint fileName, PortalInfoList portalInfoList, PathNodeList pathNodeList)
        {
            XElement occlusionFile = new XElement("naOcclusionInteriorMetadata");

            occlusionFile.Add(portalInfoList.XML());
            occlusionFile.Add(pathNodeList.XML());
            occlusionFile.Save(Path.Combine(directory, fileName + ".ymt.pso.xml"));
        }
Beispiel #3
0
        public static PathNodeList GetPaths(PortalInfoList portalInfoList, MloInterior mloInterior)
        {
            List <Node>  nodes        = Node.GetNodes(portalInfoList, mloInterior);
            PathNodeList pathNodeList = new PathNodeList();

            GetPathsOfType(pathNodeList, nodes, PathType.Unk01, PathType.Unk00);
            GetPathsOfType(pathNodeList, nodes, PathType.Unk02, PathType.Unk01);
            GetPathsOfType(pathNodeList, nodes, PathType.Unk03, PathType.Unk02);
            GetPathsOfType(pathNodeList, nodes, PathType.Unk04, PathType.Unk03);
            GetPathsOfType(pathNodeList, nodes, PathType.Unk05, PathType.Unk04);

            return(pathNodeList);
        }
        public static List <Node> GetNodes(PortalInfoList portalInfoList, MloInterior mloInterior)
        {
            List <Node> nodes = new List <Node>();

            foreach (Room room in mloInterior.Rooms)
            {
                Node node = new Node(room, mloInterior.occlHash);

                foreach (PortalInfoItem portal in portalInfoList.Items)
                {
                    if (portal.roomIdx == node.index)
                    {
                        node.Portals.Add(portal);
                    }
                }

                nodes.Add(node);
            }

            foreach (Node node in nodes)
            {
                foreach (Node neighbor in nodes)
                {
                    foreach (PortalInfoItem nodePortal in node.Portals)
                    {
                        if (nodePortal.destRoomIdx == neighbor.index)
                        {
                            if (!node.Edges.Contains(neighbor))
                            {
                                node.Edges.Add(neighbor);
                            }
                        }
                    }
                }
            }
            return(nodes);
        }
        public static void CommentOcclFile(XDocument XDoc, PortalInfoList portalInfoList, MloInterior mloInterior)
        {
            XElement    portalInfos  = XDoc.Root.Element("PortalInfoList");
            XElement    pathNodeKeys = XDoc.Root.Element("PathNodeList");
            List <Node> nodes        = Node.GetNodes(portalInfoList, mloInterior);

            foreach (XElement portalInfo in portalInfos.Elements("Item"))
            {
                XComment XCom = new XComment(portalInfo.ElementsBeforeSelf().Count().ToString());
                portalInfo.AddFirst(XCom);
            }

            foreach (XElement keyItem in pathNodeKeys.Elements("Item"))
            {
                XElement childList = keyItem.Element("PathNodeChildList");

                foreach (Node nodeA in nodes)
                {
                    foreach (Node nodeB in nodes)
                    {
                        if (nodeA != nodeB)
                        {
                            for (int i = 1; i < 6; i++)
                            {
                                if ((nodeA.key - nodeB.key) + i == int.Parse(keyItem.Element("Key").Attribute("value").Value, CultureInfo.InvariantCulture))
                                {
                                    XComment XCom = new XComment(nodeA.name + "[" + nodeA.index + "]" + " -> " + nodeB.name + "[" + nodeB.index + "]" + " +" + i);
                                    keyItem.Element("Key").AddAfterSelf(XCom);
                                }
                            }
                        }
                    }
                }

                foreach (XElement childItem in childList.Elements("Item"))
                {
                    string value =
                        " "
                        +
                        portalInfos.Elements("Item").ElementAt(int.Parse(childItem.Element("PortalInfoIdx").Attribute("value").Value, CultureInfo.InvariantCulture)).Element("RoomIdx").Attribute("value").Value.ToString()
                        +
                        "->"
                        +
                        portalInfos.Elements("Item").ElementAt(int.Parse(childItem.Element("PortalInfoIdx").Attribute("value").Value, CultureInfo.InvariantCulture)).Element("DestRoomIdx").Attribute("value").Value.ToString()
                        + " ";

                    XComment XComPortal = new XComment(value);
                    childItem.Element("PortalInfoIdx").AddAfterSelf(XComPortal);

                    foreach (Node nodeA in nodes)
                    {
                        foreach (Node nodeB in nodes)
                        {
                            if (nodeA != nodeB)
                            {
                                for (int i = 1; i < 6; i++)
                                {
                                    if ((nodeA.key - nodeB.key) + i == int.Parse(childItem.Element("PathNodeKey").Attribute("value").Value, CultureInfo.InvariantCulture))
                                    {
                                        XComment XCom = new XComment(nodeA.name + "[" + nodeA.index + "]" + " -> " + nodeB.name + "[" + nodeB.index + "]" + " +" + i);

                                        childItem.Element("PathNodeKey").AddAfterSelf(XCom);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            XDoc.Save("commentexample.xml");
        }
        public static PortalInfoList GetPortalInfoList(MloInterior mloInterior)
        {
            PortalInfoList portalInfoList = new PortalInfoList();

            foreach (Room room in mloInterior.Rooms)
            {
                uint portalIdx = 0;

                foreach (Portal portal in mloInterior.Portals)
                {
                    if (!Bit.IsBitSet(portal.flags, 1) && !Bit.IsBitSet(portal.flags, 2))
                    {
                        if (portal.roomFrom == room.roomIndex)
                        {
                            PortalInfoItem portalInfoItem = new PortalInfoItem(
                                mloInterior.occlHash.proxyHash,
                                portalIdx,
                                portal.roomFrom,
                                portal.roomTo
                                );


                            foreach (Entity entity in portal.attachedEntities)
                            {
                                PortalEntityItem portalEntityItem;
                                switch (entity.entityType)
                                {
                                case (EntityType.ENTITY_TYPE_DOOR):
                                    portalEntityItem = new PortalEntityItem(entity, true, false, 0.7f);
                                    break;

                                case (EntityType.ENTITY_TYPE_GLASS):
                                    portalEntityItem = new PortalEntityItem(entity, false, true, 0.0f);
                                    break;

                                default:
                                    portalEntityItem = new PortalEntityItem(entity, false, false, 0.0f);
                                    break;
                                }


                                portalInfoItem.Items.Add(portalEntityItem);
                            }

                            portalInfoList.Items.Add(portalInfoItem);

                            portalIdx++;
                        }
                        else if (portal.roomTo == room.roomIndex)
                        {
                            PortalInfoItem portalInfoItem = new PortalInfoItem(
                                mloInterior.occlHash.proxyHash,
                                portalIdx,
                                portal.roomTo,
                                portal.roomFrom
                                );

                            foreach (Entity entity in portal.attachedEntities)
                            {
                                PortalEntityItem portalEntityItem;
                                switch (entity.entityType)
                                {
                                case (EntityType.ENTITY_TYPE_DOOR):
                                    portalEntityItem = new PortalEntityItem(entity, true, false, 0.7f);
                                    break;

                                case (EntityType.ENTITY_TYPE_GLASS):
                                    portalEntityItem = new PortalEntityItem(entity, false, true, 0.0f);
                                    break;

                                default:
                                    portalEntityItem = new PortalEntityItem(entity, false, false, 0.0f);
                                    break;
                                }

                                portalInfoItem.Items.Add(portalEntityItem);
                            }

                            portalInfoList.Items.Add(portalInfoItem);

                            portalIdx++;
                        }
                    }
                }
            }

            foreach (PortalInfoItem portal in portalInfoList.Items)
            {
                portal.infoIdx = (uint)portalInfoList.Items.IndexOf(portal);
            }

            return(portalInfoList);
        }
        public static PathNodeList GetPathNodeList(PortalInfoList portalInfoList, MloInterior mloInterior)
        {
            PathNodeList pathNodeList = PathAlgorithm.GetPaths(portalInfoList, mloInterior);

            return(pathNodeList);
        }