示例#1
0
 public void CacheAll()
 {
     for (int i = 0; i < groupInstances.Count; i++)
     {
         InstanceUtil.SetActiveRecursively(groupInstances[i], false);
     }
 }
 public void Deactivate()
 {
     for (int i = 0; i < groupInstances.Length; i++)
     {
         InstanceUtil.SetActiveRecursively(groupInstances[i], false);
     }
 }
        internal void CopyGroup(GroupCenter sourceGroup)
        {
            foreach (StaticInstance sourceInstance in sourceGroup.childInstances)
            {
                StaticInstance instance = new StaticInstance();
                instance.gameObject       = UnityEngine.Object.Instantiate(sourceInstance.model.prefab);
                instance.RelativePosition = sourceInstance.RelativePosition;
                instance.Orientation      = sourceInstance.Orientation;
                instance.CelestialBody    = CelestialBody;

                instance.Group       = Group;
                instance.groupCenter = this;

                instance.model = sourceInstance.model;
                if (!Directory.Exists(KSPUtil.ApplicationRootPath + "GameData/" + KerbalKonstructs.newInstancePath))
                {
                    Directory.CreateDirectory(KSPUtil.ApplicationRootPath + "GameData/" + KerbalKonstructs.newInstancePath);
                }
                instance.configPath = KerbalKonstructs.newInstancePath + "/" + sourceInstance.model.name + "-instances.cfg";
                instance.configUrl  = null;

                instance.SpawnObject();
                InstanceUtil.SetActiveRecursively(instance, true);
            }
        }
示例#4
0
        void OnMouseEnter()
        {
            if (HighLogic.LoadedScene == GameScenes.SPACECENTER)
            {
                try
                {
                    if (this.gameObject == null)
                    {
                        Destroy(this);
                    }
                    if (staticInstance == null)
                    {
                        staticInstance = InstanceUtil.GetStaticInstanceForGameObject(this.gameObject);
                    }
                    if (staticInstance == null)
                    {
                        Log.UserInfo("Cound not determin instance for mouse selector");
                        Destroy(this);
                    }

                    if (staticInstance.launchSite.isOpen)
                    {
                        staticInstance.HighlightObject(new Color(0.4f, 0.9f, 0.4f, 0.5f));
                    }
                    else
                    {
                        staticInstance.HighlightObject(new Color(0.9f, 0.4f, 0.4f, 0.5f));
                    }
                }
                catch
                {
                    Destroy(this);
                }
            }
        }
示例#5
0
        /// <summary>
        /// toggles the visiblility for all Instances at once
        /// </summary>
        /// <param name="bActive"></param>
        internal static void ToggleActiveAllStatics(bool bActive = true)
        {
            Log.Debug("StaticDatabase.ToggleActiveAllStatics");

            foreach (StaticInstance obj in allStaticInstances)
            {
                InstanceUtil.SetActiveRecursively(obj, bActive);
            }
        }
示例#6
0
        /// <summary>
        /// Returns the Color for the Instance Position
        /// </summary>
        /// <param name="instance"></param>
        /// <returns></returns>
        public Color GetCameraColor(StaticInstance instance)
        {
            SetupCameraForVessel(instance);
            // Move the current object out of the cams view
            InstanceUtil.SetLayerRecursively(instance, 0);
            grasCamera.targetTexture = cameraRenderTexture;
            grasCamera.enabled       = true;
            //Light light = grasCamera.gameObject.AddOrGetComponent<Light>();
            //light.type = LightType.Point;
            //light.intensity = 1;
            //light.color = Color.white;
            //light.enabled = true;
            grasCamera.Render();
            //light.enabled = false;

            Ray        myRay   = new Ray(cameraObject.transform.position, instance.CelestialBody.transform.position);
            RaycastHit castHit = new RaycastHit();

            if (!Physics.Raycast(myRay, out castHit, float.PositiveInfinity, 1 << 15))
            {
                Log.Normal("NO raycast hit");
            }
            else
            {
                Renderer rend = castHit.transform.GetComponent <Renderer>();

                if (rend != null)
                {
                    if (rend.materials.Length != 0)
                    {
                        foreach (string name in rend.material.GetTexturePropertyNames())
                        {
                            Texture2D lowTex = (Texture2D)rend.material.GetTexture("_lowTex");
                        }
                    }
                    else
                    {
                        Log.Normal("No Raycast material found");
                    }
                }
                else
                {
                    Log.Normal("No renderer found");
                }
            }


            // bring it back to the normal scenery
            InstanceUtil.SetLayerRecursively(instance, 15);

            Color newColor = GrassColorUtils.AverageColor(cameraRenderTexture.ToTexture2D().GetPixels());

            newColor.a = 1;

            return(newColor);
        }
        /// <summary>
        /// Spawns a new Instance in the Gameworld and registers itself to the Static Database
        /// </summary>
        /// <param name="editing"></param>
        /// <param name="bPreview"></param>
        internal void Orientate()
        {
            // mangle Squads statics
            CelestialBody.CBUpdate();

            InstanceUtil.CreateGroupCenterIfMissing(this);

            if (!StaticDatabase.HasGroupCenter(groupCenterName))
            {
                Log.UserWarning("cannot load " + configPath);
                return;
            }
            groupCenter = StaticDatabase.GetGroupCenter(groupCenterName);

            if (RelativePosition.Equals(Vector3.zero))
            {
                Log.Normal("LegacySpawnInstance called for " + groupCenterName + "_" + model.name);
                LegacySpawnInstance();
                gameObject.transform.parent = groupCenter.gameObject.transform;
                RelativePosition            = gameObject.transform.localPosition;
                Orientation = gameObject.transform.localEulerAngles;
            }
            else
            {
                gameObject.transform.position         = groupCenter.gameObject.transform.position + RelativePosition;;
                gameObject.transform.parent           = groupCenter.gameObject.transform;
                gameObject.transform.localEulerAngles = Orientation;
                gameObject.transform.localPosition    = RelativePosition;
            }


            RefLatitude    = (float)CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).x;
            RefLongitude   = (float)(CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).y);
            RadialPosition = radialPosition;

            StaticDatabase.AddStatic(this);

            // Add them to the bodys objectlist, so they show up as anomalies
            // After we got a new Name from StaticDatabase.AddStatic()
            if (isScanable)
            {
                var pqsObjectList = CelestialBody.pqsSurfaceObjects.ToList();
                if (!pqsObjectList.Contains((PQSSurfaceObject)groupCenter.pqsCity))
                {
                    Log.Normal("Added " + groupCenter.Group + " to scanable Objects");
                    pqsObjectList.Add(groupCenter.pqsCity as PQSSurfaceObject);
                }
                CelestialBody.pqsSurfaceObjects = pqsObjectList.ToArray();
            }
        }
示例#8
0
        public Texture2D GetCameraTexture(StaticInstance instance)
        {
            Texture2D MidTex2 = null;

            SetupCameraForVessel(instance);

            Ray        myRay   = new Ray(cameraObject.transform.position, instance.CelestialBody.transform.position);
            RaycastHit castHit = new RaycastHit();

            if (!Physics.Raycast(myRay, out castHit, float.PositiveInfinity, 1 << 15))
            {
                Log.Normal("NO raycast hit");
            }
            else
            {
                Renderer rend = castHit.transform.GetComponent <Renderer>();

                if (rend != null)
                {
                    if (rend.materials.Length != 0)
                    {
                        Texture midTex = rend.material.GetTexture("_lowTex");
                        if (midTex != null)
                        {
                            MidTex2 = midTex.ToTexture2D(64);
                            //rend.material.GetTexture("_midTex").ToTexture2D().WritePNG("Test/MidTex");
                            //rend.material.GetTexture("_highTex").ToTexture2D().WritePNG("Test/HighTex");
                        }
                        else
                        {
                            Log.Normal("No LowTex found");
                        }
                    }
                    else
                    {
                        Log.Normal("No Raycast material found");
                    }
                }
                else
                {
                    Log.Normal("No renderer found");
                }
            }

            InstanceUtil.SetLayerRecursively(instance, 15);

            return(MidTex2);
        }
示例#9
0
        /// <summary>
        /// toggles the visiblility of all statics in a group
        /// </summary>
        /// <param name="sGroup"></param>
        /// <param name="bActive"></param>
        /// <param name="bOpposite"></param>
        internal static void ToggleActiveStaticsInGroup(string sGroup, bool bActive = true, bool bOpposite = false)
        {
            Log.Debug("StaticDatabase.ToggleActiveStaticsInGroup");

            foreach (StaticInstance instance in allStaticInstances)
            {
                if (instance.Group == sGroup)
                {
                    InstanceUtil.SetActiveRecursively(instance, bActive);
                }
                else
                if (bOpposite)
                {
                    InstanceUtil.SetActiveRecursively(instance, !bActive);
                }
            }
        }
示例#10
0
        /// <summary>
        /// toggles the visiblility of all statics on a planet
        /// </summary>
        /// <param name="cBody"></param>
        /// <param name="bActive"></param>
        /// <param name="bOpposite"></param>
        internal static void ToggleActiveStaticsOnPlanet(CelestialBody cBody, bool bActive = true, bool bOpposite = false)
        {
            Log.Debug("StaticDatabase.ToggleActiveStaticsOnPlanet " + cBody.bodyName);

            foreach (StaticInstance instance in allStaticInstances)
            {
                if (instance.CelestialBody == cBody)
                {
                    InstanceUtil.SetActiveRecursively(instance, bActive);
                }
                else
                if (bOpposite)
                {
                    InstanceUtil.SetActiveRecursively(instance, !bActive);
                }
            }
        }
示例#11
0
        internal override KKFacility ParseConfig(ConfigNode node)
        {
            LaunchSite launchSite = base.ParseConfig(node) as LaunchSite;

            launchSite.lsGameObject = launchSite.gameObject;
            // this is might be slow
            launchSite.parentInstance = InstanceUtil.GetStaticInstanceForGameObject(lsGameObject);
            launchSite.body           = parentInstance.CelestialBody;

            if (!string.IsNullOrEmpty(LaunchSiteLogo))
            {
                logo = GameDatabase.Instance.GetTexture(LaunchSiteLogo, false);

                if (logo == null)
                {
                    logo = GameDatabase.Instance.GetTexture(launchSite.parentInstance.model.path + "/" + launchSite.LaunchSiteLogo, false);
                }
            }
            // use default logo
            if (logo == null)
            {
                logo = GameDatabase.Instance.GetTexture("KerbalKonstructs/Assets/DefaultSiteLogo", false);
            }

            if (!string.IsNullOrEmpty(LaunchSiteIcon))
            {
                icon = GameDatabase.Instance.GetTexture(LaunchSiteIcon, false);

                if (icon == null)
                {
                    icon = GameDatabase.Instance.GetTexture(launchSite.parentInstance.model.path + "/" + launchSite.LaunchSiteIcon, false);
                }
            }


            refLon = (float)Math.Round(KKMath.GetLongitudeInDeg(launchSite.parentInstance.RadialPosition), 2);
            refLat = (float)Math.Round(KKMath.GetLatitudeInDeg(launchSite.parentInstance.RadialPosition), 2);

            refAlt = launchSite.parentInstance.RadiusOffset;


            return(launchSite);
        }
        internal void Initialize()
        {
            staticInstance = facility.staticInstance;

            if (this.gameObject == null)
            {
                Destroy(this);
            }
            if (staticInstance == null)
            {
                staticInstance = InstanceUtil.GetStaticInstanceForGameObject(this.gameObject);
            }
            if (staticInstance == null)
            {
                Log.UserInfo("Cound not determin instance for mouse selector");
                Destroy(this);
            }
            facType     = facility.facType;
            initialized = true;
        }
示例#13
0
        /// <summary>
        /// gets called every second, when in flight by KerbalKonsructs.updateCache (InvokeRepeating) and through StaticDatabase.UpdateCache
        /// </summary>
        /// <param name="playerPos"></param>
        public void ActivateGroupMembers()
        {
            if (isActive)
            {
                return;
            }

            isActive = true;

            Log.Normal("Activate calles for group: " + name);

            foreach (StaticInstance instance in groupInstances)
            {
                string sFacType = instance.FacilityType;

                if (sFacType == "Hangar")
                {
                    HangarGUI.CacheHangaredCraft(instance);
                }

                if (sFacType == "LandingGuide")
                {
                    LandingGuideUI.instance.drawLandingGuide(instance);
                }

                if (sFacType == "TouchdownGuideL")
                {
                    LandingGuideUI.instance.drawTouchDownGuideL(instance);
                }

                if (sFacType == "TouchdownGuideR")
                {
                    LandingGuideUI.instance.drawTouchDownGuideR(instance);
                }

                InstanceUtil.SetActiveRecursively(instance, true);
            }
            groupCenter.gameObject.SetActive(true);
        }
        /// <summary>
        /// Deactivates the Statics of an Group
        /// </summary>
        public void DeactivateGroupMembers()
        {
            if (!isActive)
            {
                return;
            }

            Log.Normal("Deactivate calles for group: " + name);

            isActive = false;
            foreach (StaticInstance instance in groupInstances)
            {
                string sFacType = instance.FacilityType;

                if (sFacType == "Hangar")
                {
                    HangarGUI.CacheHangaredCraft(instance);
                }

                if (sFacType == "LandingGuide")
                {
                    LandingGuideUI.instance.drawLandingGuide(null);
                }

                if (sFacType == "TouchdownGuideL")
                {
                    LandingGuideUI.instance.drawTouchDownGuideL(null);
                }

                if (sFacType == "TouchdownGuideR")
                {
                    LandingGuideUI.instance.drawTouchDownGuideR(null);
                }

                InstanceUtil.SetActiveRecursively(instance, false);
            }
        }
        // Returns the StaticObject of a site. Can provide a sitename or a GameObject
        public static StaticInstance getSiteStaticObject(string siteName, GameObject go = null)
        {
            StaticInstance soSite = null;

            if (go != null)
            {
                soSite = InstanceUtil.GetStaticInstanceForGameObject(go);

                if (soSite == null)
                {
                    return(null);
                }
                return(soSite);
            }

            string sName = "";
            object oName = null;

            foreach (StaticInstance instance in StaticDatabase.allStaticInstances.Where(inst => inst.hasLauchSites == true))
            {
                oName = instance.launchSite.LaunchSiteName;
                if (oName == null)
                {
                    continue;
                }

                oName = null;

                sName = instance.launchSite.LaunchSiteName;
                if (sName == siteName)
                {
                    return(instance);
                }
            }

            return(null);
        }
示例#16
0
        /// <summary>
        /// Returns the Color for the Instance Position
        /// </summary>
        /// <param name="instance"></param>
        /// <returns></returns>
        public Color GetCameraColor(StaticInstance instance)
        {
            SetupCameraForVessel(instance);
            // Move the current object out of the cams view
            InstanceUtil.SetLayerRecursively(instance, 0);
            grasCamera.targetTexture = cameraRenderTexture;
            grasCamera.enabled       = true;
            grasCamera.Render();

            //Ray myRay = new Ray(cameraObject.transform.position, instance.CelestialBody.transform.position);
            //RaycastHit castHit = new RaycastHit();
            //if (!Physics.Raycast(myRay, out castHit, float.PositiveInfinity, 1 << 15))
            //{
            //    Log.Normal("NO raycast hit");
            //}
            //else
            //{

            //    Renderer rend = castHit.transform.GetComponentsInChildren<Renderer>(true).FirstOrDefault();

            //    if (rend == null)
            //    {
            //        Log.Normal("No renderer found");
            //    }
            //    if (rend.materials.Length == 0)
            //    {
            //        Log.Normal("No Raycast material found");
            //    }
            //    if (rend.material.shader == null)
            //    {
            //        Log.Normal("No shader found");
            //    }
            //    else
            //    {
            //        RenderTexture myTexture = new RenderTexture(20, 20, 24);
            //        Graphics.Blit(null, myTexture, rend.material);
            //        myTexture.
            //    }
            //}

            // bring it back to the normal scenery
            InstanceUtil.SetLayerRecursively(instance, 15);

            RenderTexture.active = cameraRenderTexture;
            cameraTexture.ReadPixels(new Rect(0, 0, frameWidth, frameHeight), 0, 0);

            grasCamera.targetTexture = null;
            grasCamera.enabled       = false;
            RenderTexture.active     = null;

            Color[] cols = cameraTexture.GetPixels();
            float   r = 0, g = 0, b = 0;
            int     len = cols.Length;

            for (int i = 0; i < len; i++)
            {
                r += cols[i].r;
                g += cols[i].g;
                b += cols[i].b;
            }
            Color outColor = new Color();

            outColor.r = r / len;
            outColor.g = g / len;
            outColor.b = b / len;
            //outColor.a = 0.014f;
            return(outColor);
        }
        /// <summary>
        /// Spawns a new Instance in the Gameworld and registers itself to the Static Database
        /// </summary>
        /// <param name="editing"></param>
        /// <param name="bPreview"></param>
        internal void SpawnObject(Boolean editing = false, Boolean bPreview = false)
        {
            // mangle Squads statics
            if (model.isSquad)
            {
                InstanceUtil.MangleSquadStatic(this);
            }

            // Objects spawned at runtime should be active, ones spawned at loading not
            InstanceUtil.SetActiveRecursively(this, editing);

            Transform[]       gameObjectList = gameObject.GetComponentsInChildren <Transform>();
            List <GameObject> rendererList   = (from t in gameObjectList where t.gameObject.GetComponent <Renderer>() != null select t.gameObject).ToList();

            InstanceUtil.SetLayerRecursively(this, 15);

            if (bPreview && editing)
            {
                this.ToggleAllColliders(false);
            }


            this.preview = bPreview;

            if (editing)
            {
                KerbalKonstructs.instance.selectObject(this, true, true, bPreview);
            }

            InstanceUtil.CreateGroupCenterIfMissing(this);

            groupCenter = StaticDatabase.allCenters[groupCenterName];

            if (RelativePosition.Equals(Vector3.zero))
            {
                Log.Normal("LegacySpawnInstance called for " + configPath);
                LegacySpawnInstance();
                gameObject.transform.parent = groupCenter.gameObject.transform;
                pqsCity.enabled             = false;
                pqsCity.sphere = null;
                pqsCity        = null;

                RelativePosition = gameObject.transform.localPosition;
                Orientation      = gameObject.transform.localEulerAngles;
            }
            else
            {
                gameObject.transform.position         = groupCenter.gameObject.transform.position;
                gameObject.transform.parent           = groupCenter.gameObject.transform;
                gameObject.transform.localPosition    = RelativePosition;
                gameObject.transform.localEulerAngles = Orientation;
            }

            //Scaling
            origScale = gameObject.transform.localScale;             // save the original scale for later use
            gameObject.transform.localScale *= ModelScale;

            RefLatitude    = (float)CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).x;
            RefLongitude   = (float)(CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).y);
            RadialPosition = radialPosition;

            foreach (StaticModule module in model.modules)
            {
                Type         moduleType = AssemblyLoader.loadedAssemblies.SelectMany(asm => asm.assembly.GetTypes()).FirstOrDefault(t => t.Namespace == module.moduleNamespace && t.Name == module.moduleClassname);
                StaticModule mod        = gameObject.AddComponent(moduleType) as StaticModule;

                if (mod != null)
                {
                    mod.staticInstance = this;
                    foreach (string fieldName in module.moduleFields.Keys)
                    {
                        FieldInfo field = mod.GetType().GetField(fieldName);
                        if (field != null)
                        {
                            field.SetValue(mod, Convert.ChangeType(module.moduleFields[fieldName], field.FieldType));
                        }
                        else
                        {
                            Log.UserWarning("Field " + fieldName + " does not exist in " + module.moduleClassname);
                        }
                    }
                }
                else
                {
                    Log.UserError("Module " + module.moduleClassname + " could not be loaded in " + gameObject.name);
                }
            }

            foreach (GameObject gorenderer in rendererList)
            {
                gorenderer.GetComponent <Renderer>().enabled = true;
            }

            StaticDatabase.AddStatic(this);

            // Add them to the bodys objectlist, so they show up as anomalies
            // After we got a new Name from StaticDatabase.AddStatic()
            if (isScanable)
            {
                Log.Normal("Added " + gameObject.name + " to scanable Objects");
                var pqsObjectList = CelestialBody.pqsSurfaceObjects.ToList();
                if (!pqsObjectList.Contains((PQSSurfaceObject)groupCenter.pqsCity))
                {
                    pqsObjectList.Add(groupCenter.pqsCity as PQSSurfaceObject);
                }
                CelestialBody.pqsSurfaceObjects = pqsObjectList.ToArray();
            }
        }
示例#18
0
        private void Spawn()
        {
            CelestialBody.CBUpdate();
            isSpawned = true;

            mesh = ModelVariant.SpawnVariant(this);
            {
                if (_mesh == null)
                {
                    Log.UserError("Cannot spawn 3dModel of Instance: " + model.name);
                    Destroy();
                    return;
                }
            }

            if (model.isSquad)
            {
                InstanceUtil.MangleSquadStatic(this);
            }
            InstanceUtil.SetLayerRecursively(this, 15);

            mesh.SetActive(true);

            //Scaling
            origScale = gameObject.transform.localScale;             // save the original scale for later use
            gameObject.transform.localScale *= ModelScale;

            foreach (StaticModule module in model.modules)
            {
                moduleKey = (module.moduleNamespace + "_" + module.moduleClassname);
                Type moduleType;
                if (staticModules.ContainsKey(moduleKey))
                {
                    moduleType = staticModules[moduleKey];
                }
                else
                {
                    moduleType = AssemblyLoader.loadedAssemblies.SelectMany(asm => asm.assembly.GetTypes()).FirstOrDefault(t => t.Namespace == module.moduleNamespace && t.Name == module.moduleClassname);
                    staticModules.Add(moduleKey, moduleType);
                }

                StaticModule mod = mesh.AddComponent(moduleType) as StaticModule;

                if (mod != null)
                {
                    mod.enabled        = false;
                    mod.staticInstance = this;
                    foreach (string fieldName in module.moduleFields.Keys)
                    {
                        FieldInfo field = mod.GetType().GetField(fieldName);
                        if (field != null)
                        {
                            field.SetValue(mod, Convert.ChangeType(module.moduleFields[fieldName], field.FieldType));
                        }
                        else
                        {
                            Log.UserWarning("Field " + fieldName + " does not exist in " + module.moduleClassname);
                        }
                    }
                    //myStaticModules.Add(mod);
                }
                else
                {
                    Log.UserError("Module " + module.moduleClassname + " could not be loaded in " + gameObject.name);
                }
            }


            foreach (Renderer renderer in gameObject.GetComponentsInChildren <Renderer>(true))
            {
                renderer.enabled = true;
                AdvancedTextures.CheckForExistingMaterial(renderer);
            }

            ModelVariant.ApplyVariant(this);

            //Make LaunchSites more sturdy
            if (!model.isSquad)
            {
                Destructable.MakeDestructable(this);
                if (hasLauchSites)
                {
                    destructible.impactMomentumThreshold = Math.Max(destructible.impactMomentumThreshold, 3000f);
                    launchSite.AttachSelector();
                }
            }

            foreach (var facility in myFacilities)
            {
                facility.AttachSelector();
            }
        }
        /// <summary>
        /// gets called every second, when in flight by KerbalKonsructs.updateCache (InvokeRepeating) and through StaticDatabase.UpdateCache
        /// </summary>
        /// <param name="playerPos"></param>
        public void CheckUngrouped(Vector3 playerPos)
        {
            //Log.Normal("Check ungrouped assets");
            foreach (StaticInstance instance in groupInstances)
            {
                float  dist     = Vector3.Distance(instance.gameObject.transform.position, playerPos);
                bool   visible  = (dist < visibilityRange);
                string sFacType = instance.FacilityType;

                if (sFacType == "Hangar")
                {
                    HangarGUI.CacheHangaredCraft(instance);
                }

                if (sFacType == "LandingGuide")
                {
                    if (visible)
                    {
                        LandingGuideUI.instance.drawLandingGuide(instance);
                    }
                    else
                    {
                        LandingGuideUI.instance.drawLandingGuide(null);
                    }
                }

                if (sFacType == "TouchdownGuideL")
                {
                    if (visible)
                    {
                        LandingGuideUI.instance.drawTouchDownGuideL(instance);
                    }
                    else
                    {
                        LandingGuideUI.instance.drawTouchDownGuideL(null);
                    }
                }

                if (sFacType == "TouchdownGuideR")
                {
                    if (visible)
                    {
                        LandingGuideUI.instance.drawTouchDownGuideR(instance);
                    }
                    else
                    {
                        LandingGuideUI.instance.drawTouchDownGuideR(null);
                    }
                }

                if (sFacType == "CityLights")
                {
                    if (dist < 65000f)
                    {
                        InstanceUtil.SetActiveRecursively(instance, false);
                        return;
                    }
                }

                if (visible)
                {
                    InstanceUtil.SetActiveRecursively(instance, true);
                }
                else
                {
                    InstanceUtil.SetActiveRecursively(instance, false);
                }
            }
        }
示例#20
0
        /// <summary>
        /// Spawns a new Instance in the Gameworld and registers itself to the Static Database
        /// </summary>
        /// <param name="editing"></param>
        /// <param name="bPreview"></param>
        internal void spawnObject(Boolean editing, Boolean bPreview)
        {
            // mangle Squads statics
            if (model.isSquad)
            {
                InstanceUtil.MangleSquadStatic(gameObject);
            }

            // Objects spawned at runtime should be active, ones spawned at loading not
            InstanceUtil.SetActiveRecursively(this, editing);

            Transform[]       gameObjectList = gameObject.GetComponentsInChildren <Transform>();
            List <GameObject> rendererList   = (from t in gameObjectList where t.gameObject.GetComponent <Renderer>() != null select t.gameObject).ToList();

            setLayerRecursively(gameObject, 15);

            if (bPreview)
            {
                this.ToggleAllColliders(false);
            }

            this.preview = bPreview;

            if (editing)
            {
                KerbalKonstructs.instance.selectObject(this, true, true, bPreview);
            }

            float objvisibleRange = VisibilityRange;

            if (objvisibleRange < 1)
            {
                objvisibleRange = 25000f;
            }

            PQSCity.LODRange range = new PQSCity.LODRange
            {
                renderers    = new GameObject[0],
                objects      = new GameObject[0],
                visibleRange = objvisibleRange
            };

            pqsCity                           = gameObject.AddComponent <PQSCity>();
            pqsCity.lod                       = new[] { range };
            pqsCity.frameDelta                = 10000;          //update interval for its own visiblility range checking. unused by KK, so set this to a high value
            pqsCity.repositionRadial          = RadialPosition; //position
            pqsCity.repositionRadiusOffset    = RadiusOffset;   //height
            pqsCity.reorientInitialUp         = Orientation;    //orientation
            pqsCity.reorientFinalAngle        = RotationAngle;  //rotation x axis
            pqsCity.reorientToSphere          = true;           //adjust rotations to match the direction of gravity
            gameObject.transform.parent       = CelestialBody.pqsController.transform;
            pqsCity.sphere                    = CelestialBody.pqsController;
            origScale                         = pqsCity.transform.localScale; // save the original scale for later use
            pqsCity.transform.localScale     *= ModelScale;
            pqsCity.order                     = 100;
            pqsCity.modEnabled                = true;
            pqsCity.repositionToSphere        = true;  //enable repositioning
            pqsCity.repositionToSphereSurface = false; //Snap to surface?



            CelestialBody.pqsController.GetSurfaceHeight(RadialPosition);

            pqsCity.OnSetup();
            pqsCity.Orientate();



            //PQSCity2.LodObject lodObject = new PQSCity2.LodObject();
            //lodObject.visibleRange = VisibilityRange;
            //lodObject.objects = new GameObject[] { };
            //pqsCity2 = gameObject.AddComponent<PQSCity2>();
            //pqsCity2.objects = new [] { lodObject } ;
            //pqsCity2.objectName = "";
            //pqsCity2.lat = RefLatitude;
            //pqsCity2.lon = RefLongitude;
            //pqsCity2.alt = RadiusOffset;
            //pqsCity2.up = Orientation;
            //pqsCity2.rotation = RotationAngle;
            //pqsCity2.sphere = CelestialBody.pqsController;


            //pqsCity2.OnSetup();
            //pqsCity2.Orientate();


            foreach (StaticModule module in model.modules)
            {
                Type          moduleType = AssemblyLoader.loadedAssemblies.SelectMany(asm => asm.assembly.GetTypes()).FirstOrDefault(t => t.Namespace == module.moduleNamespace && t.Name == module.moduleClassname);
                MonoBehaviour mod        = gameObject.AddComponent(moduleType) as MonoBehaviour;

                if (mod != null)
                {
                    foreach (string fieldName in module.moduleFields.Keys)
                    {
                        FieldInfo field = mod.GetType().GetField(fieldName);
                        if (field != null)
                        {
                            field.SetValue(mod, Convert.ChangeType(module.moduleFields[fieldName], field.FieldType));
                        }
                        else
                        {
                            Log.UserWarning("Field " + fieldName + " does not exist in " + module.moduleClassname);
                        }
                    }
                }
                else
                {
                    Log.UserError("Module " + module.moduleClassname + " could not be loaded in " + gameObject.name);
                }
            }

            foreach (GameObject gorenderer in rendererList)
            {
                gorenderer.GetComponent <Renderer>().enabled = true;
            }

            StaticDatabase.AddStatic(this);

            // Add them to the bodys objectlist, so they show up as anomalies
            // After we got a new Name from StaticDatabase.AddStatic()
            if (isScanable)
            {
                Log.Normal("Added " + gameObject.name + " to scanable Objects");
                var pqsObjectList = CelestialBody.pqsSurfaceObjects.ToList();
                pqsObjectList.Add(pqsCity as PQSSurfaceObject);
                CelestialBody.pqsSurfaceObjects = pqsObjectList.ToArray();
            }
        }