Пример #1
0
        XElement AddObjectsFromObjectContainers(XElement el, ObjectContainer objCon, string parentid, string layerid)
        {
            XElement elObject = el;

            layerid = GuidUtility.GenLayerID("Main");
            string layerName = "Main";
            List <ObjectContainer> objContainers = new List <ObjectContainer>();

            objContainers.Add(objCon);
            foreach (Child child in objCon.childs)
            {
                if (!child.IsExternal())
                {
                    objContainers.Add(child.Soc);
                }
            }
            foreach (ObjectContainer oc in objContainers)
            {
                string portName = oc.portName;
                foreach (PrefabObject po in oc.prefabObjects)
                {
                    if (po.Geometry != null)
                    {
                        layerid   = GuidUtility.GenLayerID("Main");
                        layerName = "Main";
                        //string layerName = oc.name;
                        //string entid = GuidUtility.GenID("ent" + parentid +oc.name+po.Name+ po.Geometry);
                        //string compGuid = GuidUtility.GenID("entcomp" + parentid + oc.name + po.Name + po.Geometry);
                        string entid         = GuidUtility.GenID();
                        string componentGuid = GuidUtility.GenID();
                        //string prefid = GuidUtility.GenID("entpref" + parentid + oc.name + po.Name+ po.Geometry);

                        XElement obj1 = po.GetAsEntityWithComponent(parentid, layerid, entid, componentGuid, portName, layerName, lodRatio);

                        elObject.Add(obj1);

                        foreach (PrefabObject childPo in po.attachments)
                        {
                            string childentid         = GuidUtility.GenID();
                            string childcomponentGuid = GuidUtility.GenID();

                            XElement childObj = childPo.GetAsEntityWithComponent(entid, layerid, childentid, childcomponentGuid, childPo.AttachmentTarget, layerName, lodRatio);

                            elObject.Add(childObj);
                        }
                    }
                    if (po.EntityClass == "AnimObject")
                    {
                        layerid   = GuidUtility.GenLayerID("Main");
                        layerName = "Main";
                        string entid         = GuidUtility.GenID();
                        string componentGuid = GuidUtility.GenID();

                        XElement obj1 = po.GetAsAnimObject(parentid, layerid, entid, componentGuid, portName, layerName, lodRatio);

                        elObject.Add(obj1);
                    }

                    if (po.EntityClass == "LightGroup")
                    {
                        layerid   = GuidUtility.GenLayerID("Main");
                        layerName = "Main";
                        XElement obj1 = po.GetAsFlowgraphEntity(parentid, layerid, layerName, oc.portName);

                        elObject.Add(obj1);

                        int i = 0;
                        //lights and probes (enveroinmentlight)
                        foreach (Light lt in po.lights)
                        {
                            if (lt.EntityClass == "Light")
                            {
                                obj1 = po.GetAsLight(i, layerid, layerName);

                                elObject.Add(obj1);
                            }
                            if (lt.EntityClass == "EnvironmentLight")
                            {
                                obj1 = po.GetAsEnvironmentLight(i, layerid, layerName);

                                elObject.Add(obj1);
                            }
                            i++;
                        }
                    }
                    //if (po.Type == "VisArea")
                    //{
                    //    layerid = GuidUtility.GenLayerID("Main");
                    //    layerName = "Main";
                    //    string entid = GuidUtility.GenID();
                    //    XElement obj1 = po.GetAsVisArea(entid, layerid, layerName);

                    //    Object.Add(obj1);
                    //}
                    //if (po.Type == "Portal")
                    //{
                    //    layerid = GuidUtility.GenLayerID("Main");
                    //    layerName = "Main";
                    //    string entid = GuidUtility.GenID();
                    //    XElement obj1 = po.GetAsPortal(entid, layerid, layerName);

                    //    Object.Add(obj1);
                    //}
                    if (po.Type == "EnvironmentLight")
                    {
                        layerid   = GuidUtility.GenLayerID("Main");
                        layerName = "Main";
                        XElement obj1 = po.GetAsFlowgraphEntity(parentid, layerid, layerName, oc.portName);

                        elObject.Add(obj1);

                        layerid   = GuidUtility.GenLayerID("Main");
                        layerName = "Main";
                        string entid = GuidUtility.GenID();
                        obj1 = po.GetAsEnvironmentLight2(entid, layerid, layerName);

                        elObject.Add(obj1);
                    }
                    if (po.EntityClass == "Light")
                    {
                        string   layername = oc.name;
                        XElement obj1      = new XElement("Object");
                        string   entid     = GuidUtility.GenID();
                        string   prefid    = GuidUtility.GenID();

                        obj1.Add(new XAttribute("Name", po.Name));
                        if (parentid != "")
                        {
                            obj1.Add(new XAttribute("LinkedTo", parentid));
                        }
                        obj1.Add(new XAttribute("Id", entid));
                        obj1.Add(new XAttribute("LayerGUID", layerid));
                        obj1.Add(new XAttribute("Layer", "Main"));
                        if (po.Pos != null)
                        {
                            obj1.Add(new XAttribute("Pos", po.Pos));
                        }
                        else
                        {
                            obj1.Add(new XAttribute("Pos", "0,0,0"));
                        }
                        if (po.Rotate != null)
                        {
                            obj1.Add(new XAttribute("Rotate", po.Rotate));
                        }
                        obj1.Add(new XAttribute("Type", "Entity"));
                        obj1.Add(new XAttribute("EntityClass", "Light"));
                        obj1.Add(new XAttribute("ColorRGB", "65535"));
                        obj1.Add(po.Properties);

                        elObject.Add(obj1);
                    }
                }

                //foreach (Part part in ship.parts)
                //{
                //    if (part.attachmentPoints != null)
                //    {
                //        List<PrefabObject> prefObjects = oc.GetPrefabObjectsByAttachmentName(p);
                //    }
                //}
            }
            foreach (Child child in objCon.childs)
            {
                if (child.IsExternal())
                {
                    layerid   = GuidUtility.GenLayerID("Main");
                    layerName = "Main";
                    XElement obj1root = child.GetAsFlowgraphEntity(parentid, layerid, layerName, "");
                    elObject.Add(obj1root);

                    elObject = AddObjectsFromObjectContainers(elObject, child.Soc, child.Guid, layerid);
                }
            }

            return(elObject);
        }
Пример #2
0
        void MakePrefab()
        {
            XDocument doc = new XDocument();

            string prefLibName = objectContainer.SocpakPath;

            prefLibName = prefLibName.TrimStart("./data/".ToCharArray());
            prefLibName = prefLibName.Replace("\\", "/");
            prefLibName = prefLibName.TrimEnd(".socpak".ToCharArray());
            prefLibName = prefLibName.TrimEnd(".soc".ToCharArray());

            //./data/ObjectContainers\AC\Area18\area18.socpak
            //prefLibName = ship.GetVehicleType() + "/" + ship.GetManufacturer() + "/" + prefLibName;
            XElement PrefabsLibrary = new XElement("PrefabsLibrary");

            PrefabsLibrary.Add(new XAttribute("Name", prefLibName));

            string   prefabName = Path.GetFileNameWithoutExtension(objectContainer.SocpakPath);
            string   prefabId   = GuidUtility.GenPrefabID(prefLibName);
            XElement Prefab     = new XElement("Prefab");

            Prefab.Add(new XAttribute("Name", prefabName));
            Prefab.Add(new XAttribute("Id", prefabId));
            Prefab.Add(new XAttribute("Library", prefLibName));

            XElement Objects = new XElement("Objects");

            XElement Object   = new XElement("Object");
            string   partid   = GuidUtility.GenID();
            string   layerid  = GuidUtility.GenID();
            string   parentid = "";

            //parentid = partid;
            Object = AddObjectsFromObjectContainers(Object, objectContainer, parentid, layerid);

            Objects.Add(Object);

            XElement ObjectsNew = new XElement("Objects");

            foreach (XElement obj in Objects.Descendants("Object"))
            {
                XElement ObjectNew = new XElement("Object");
                //ObjectNew.Add(new XElement("Properties"));
                if (obj.Element("Properties") != null)
                {
                    ObjectNew.Add(obj.Element("Properties"));
                }
                foreach (XAttribute atr in obj.Attributes())
                {
                    ObjectNew.Add(atr);
                }
                if (obj.Element("Components") != null)
                {
                    ObjectNew.Add(obj.Element("Components"));
                }

                if (obj.Element("Points") != null)
                {
                    ObjectNew.Add(obj.Element("Points"));
                }

                if (ObjectNew.Attribute("Name") != null)
                {
                    ObjectsNew.Add(ObjectNew);
                }
            }

            Prefab.Add(ObjectsNew);
            PrefabsLibrary.Add(Prefab);
            doc.Add(PrefabsLibrary);

            xmlDoc = doc;
            xml    = doc.ToString();
        }
        public PrefabObject GetGeomAsPrefabObject(List <Item> itemsList)
        {
            PrefabObject prefabObj = null;

            if (propertiesDataCore != null)
            {
                prefabObj           = new PrefabObject();
                prefabObj.Id        = GuidUtility.GenID();
                prefabObj.Name      = Name;
                prefabObj.Layer     = Layer;
                prefabObj.LayerGUID = LayerGUID;
                if (Pos != null)
                {
                    prefabObj.Pos = Pos;
                }
                if (Rotate != null)
                {
                    prefabObj.Rotate = Rotate;
                }
                if (Scale != null)
                {
                    prefabObj.Scale = Scale;
                }
                if (Material != null)
                {
                    prefabObj.Material = Material;
                }

                if (Entity.Attribute("Geometry") != null)
                {
                    prefabObj.Geometry    = Entity.Attribute("Geometry").Value;
                    prefabObj.Type        = "GeomEntity";
                    prefabObj.EntityClass = "GeomEntity";
                }
                else if (propertiesDataCore.Geometry != "")
                {
                    prefabObj.Geometry    = propertiesDataCore.Geometry;
                    prefabObj.Type        = "GeomEntity";
                    prefabObj.EntityClass = "GeomEntity";
                    if (propertiesDataCore.Material != "")
                    {
                        prefabObj.Material = propertiesDataCore.Material;
                    }
                    if (Material != null)
                    {
                        prefabObj.Material = Material;
                    }
                }
                else if (propertiesDataCore.Loadout != null)
                {
                    Item entityItem = null;
                    foreach (Item it in itemsList)
                    {
                        if (it.name == EntityClass)
                        {
                            entityItem = it;
                        }
                    }
                    if (entityItem != null)
                    {
                        if (entityItem.geometry != "")
                        {
                            prefabObj.Geometry    = entityItem.geometry;
                            prefabObj.Type        = "GeomEntity";
                            prefabObj.EntityClass = "GeomEntity";

                            foreach (ItemPort loadoutItemPort in propertiesDataCore.Loadout.itemPorts)
                            {
                                //Item childItem = exporter.GetItem(loadoutItemPort.itemName);
                                Item childItem = null;
                                foreach (Item it in itemsList)
                                {
                                    if (it.name == loadoutItemPort.itemName)
                                    {
                                        childItem = it;
                                    }
                                }
                                if (childItem != null)
                                {
                                    if (childItem.geometry != "")
                                    {
                                        PrefabObject childObj = new PrefabObject();

                                        ItemPort targetItemPort = entityItem.GetItemPort(loadoutItemPort.portName);
                                        if (targetItemPort != null)
                                        {
                                            string targetJointName = targetItemPort.helperName;

                                            childObj.Geometry       = childItem.geometry;
                                            childObj.Id             = GuidUtility.GenID();
                                            childObj.Name           = loadoutItemPort.itemName;
                                            childObj.Layer          = Layer;
                                            childObj.LayerGUID      = LayerGUID;
                                            childObj.Pos            = "0,0,0";
                                            childObj.Rotate         = "1,0,0,0";
                                            childObj.Type           = "GeomEntity";
                                            childObj.EntityClass    = "GeomEntity";
                                            childObj.ParentId       = prefabObj.Id;
                                            childObj.AttachmentType = "CharacterBone";
                                            if (targetJointName != null)
                                            {
                                                childObj.AttachmentTarget = targetJointName;
                                            }
                                            else
                                            {
                                                childObj.AttachmentTarget = targetItemPort.portName;
                                            }

                                            prefabObj.attachments.Add(childObj);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    Item entityItem = null;
                    foreach (Item it in itemsList)
                    {
                        if (it.name == EntityClass)
                        {
                            entityItem = it;
                        }
                    }
                    if (entityItem != null)
                    {
                        if (entityItem.geometry != "")
                        {
                            prefabObj.Geometry    = entityItem.geometry;
                            prefabObj.Type        = "GeomEntity";
                            prefabObj.EntityClass = "GeomEntity";

                            prefabObj.Name      = Name;
                            prefabObj.Layer     = Layer;
                            prefabObj.LayerGUID = LayerGUID;
                            if (Pos != null)
                            {
                                prefabObj.Pos = Pos;
                            }
                            if (Rotate != null)
                            {
                                prefabObj.Rotate = Rotate;
                            }
                            if (Scale != null)
                            {
                                prefabObj.Scale = Scale;
                            }
                            if (Material != null)
                            {
                                prefabObj.Material = Material;
                            }
                        }
                    }
                }
            }
            else
            {
                if (EntityClass == "AnimObject")
                {
                    prefabObj    = new PrefabObject();
                    prefabObj.Id = GuidUtility.GenID();

                    prefabObj.Type        = "AnimObject";
                    prefabObj.EntityClass = "AnimObject";

                    prefabObj.Name      = Name;
                    prefabObj.Layer     = Layer;
                    prefabObj.LayerGUID = LayerGUID;
                    if (Pos != null)
                    {
                        prefabObj.Pos = Pos;
                    }
                    if (Rotate != null)
                    {
                        prefabObj.Rotate = Rotate;
                    }
                    if (Scale != null)
                    {
                        prefabObj.Scale = Scale;
                    }
                    if (Material != null)
                    {
                        prefabObj.Material = Material;
                    }

                    prefabObj.Properties = Properties;
                }
                if (EntityClass == "GeomEntity")
                {
                }
            }

            //delete %level% geoms
            if (prefabObj != null)
            {
                if (prefabObj.Geometry != null)
                {
                    if (prefabObj.Geometry.StartsWith("%level%", StringComparison.OrdinalIgnoreCase))
                    {
                        prefabObj.Geometry = null;
                    }
                }
            }

            return(prefabObj);
        }