예제 #1
0
        private static SceneObjectIdentifier CreateObjectID(IExportContainer container, Object asset)
        {
            long lid = asset == null ? 0 : container.GetExportID(asset);
            SceneObjectIdentifier soId = new SceneObjectIdentifier(lid, 0);

            return(soId);
        }
예제 #2
0
        private void SetExportData(IExportContainer container)
        {
            // if < 3.0.0 this asset doesn't exist

            // 3.0.0 to 5.5.0 this asset is created by culling settings so it has set data already
            if (OcclusionCullingSettings.IsReadPVSData(container.Version))
            {
                return;
            }

            // if >= 5.5.0 and !Release this asset containts renderer data
            if (IsReadStaticRenderers(container.Flags))
            {
                return;
            }

            // if >= 5.5.0 and Release this asset doesn't containt renderers data so we need to create it
            List <OcclusionCullingSettings> cullingSettings = new List <OcclusionCullingSettings>();

            foreach (Object asset in File.Collection.FetchAssets())
            {
                if (asset.ClassID == ClassIDType.OcclusionCullingSettings)
                {
                    OcclusionCullingSettings cullingSetting = (OcclusionCullingSettings)asset;
                    if (cullingSetting.OcclusionCullingData.IsAsset(cullingSetting.File, this))
                    {
                        cullingSettings.Add(cullingSetting);
                    }
                }
            }

            int maxRenderer = Scenes.Max(j => j.IndexRenderers + j.SizeRenderers);

            m_staticRenderers = new SceneObjectIdentifier[maxRenderer];
            int maxPortal = Scenes.Max(j => j.IndexPortals + j.SizePortals);

            m_portals = new SceneObjectIdentifier[maxPortal];

            foreach (OcclusionCullingSettings cullingSetting in cullingSettings)
            {
                int sceneIndex = Scenes.IndexOf(t => t.Scene == cullingSetting.SceneGUID);
                if (sceneIndex == -1)
                {
                    Logger.Log(LogType.Error, LogCategory.Export, $"Unable to find scene data with GUID {cullingSetting.SceneGUID} in {ValidName}");
                    continue;
                }

                OcclusionScene scene = Scenes[sceneIndex];
                if (scene.SizeRenderers != cullingSetting.StaticRenderers.Count)
                {
                    throw new Exception($"Scene renderer count {scene.SizeRenderers} doesn't match with given {cullingSetting.StaticRenderers.Count}");
                }
                if (scene.SizePortals != cullingSetting.Portals.Count)
                {
                    throw new Exception($"Scene portal count {scene.SizePortals} doesn't match with given {cullingSetting.Portals.Count}");
                }
                SetIDs(container, cullingSetting, scene);
            }
        }
        private static SceneObjectIdentifier CreateObjectID(IExportContainer container, Object asset)
        {
            string id  = container.GetExportID(asset);
            long   lid = long.Parse(id);
            SceneObjectIdentifier soId = new SceneObjectIdentifier(lid, 0);

            return(soId);
        }
예제 #4
0
        private void SetExportData(IExportContainer container)
        {
            // if < 3.0.0 this asset doesn't exist

            // 3.0.0 to 5.5.0 this asset is created by culling settings so it has set data already
            if (OcclusionCullingSettings.IsReadPVSData(container.Version))
            {
                return;
            }

            // if >= 5.5.0 and !Release this asset containts renderer data
            if (IsReadStaticRenderers(container.Flags))
            {
                return;
            }

            // if >= 5.5.0 and Release this asset doesn't containt renderers data so we need to create it
            List <OcclusionCullingSettings> cullingSettings = new List <OcclusionCullingSettings>();

            foreach (ISerializedFile file in File.Collection.Files)
            {
                foreach (Object asset in file.FetchAssets())
                {
                    if (asset.ClassID == ClassIDType.OcclusionCullingSettings)
                    {
                        OcclusionCullingSettings cullingSetting = (OcclusionCullingSettings)asset;
                        if (Scenes.Any(t => t.Scene == cullingSetting.SceneGUID))
                        {
                            cullingSettings.Add(cullingSetting);
                        }
                    }
                }
            }

            int            maxRenderer = Scenes.Max(j => j.IndexRenderers);
            OcclusionScene rscene      = Scenes.First(t => t.IndexRenderers == maxRenderer);

            m_staticRenderers = new SceneObjectIdentifier[rscene.IndexRenderers + rscene.SizeRenderers];

            int            maxPortal = Scenes.Max(j => j.IndexPortals);
            OcclusionScene pscene    = Scenes.First(t => t.IndexPortals == maxPortal);

            m_portals = new SceneObjectIdentifier[pscene.IndexPortals + pscene.SizePortals];

            foreach (OcclusionCullingSettings cullingSetting in cullingSettings)
            {
                OcclusionScene scene = Scenes.First(t => t.Scene == cullingSetting.SceneGUID);
                if (scene.SizeRenderers != cullingSetting.StaticRenderers.Count)
                {
                    throw new Exception($"Scene renderer count {scene.SizeRenderers} doesn't match with given {cullingSetting.StaticRenderers.Count}");
                }
                if (scene.SizePortals != cullingSetting.Portals.Count)
                {
                    throw new Exception($"Scene portal count {scene.SizePortals} doesn't match with given {cullingSetting.Portals.Count}");
                }
                SetIDs(container, cullingSetting, scene);
            }
        }
예제 #5
0
        private static SceneObjectIdentifier CreateObjectID(IExportContainer container, Object asset)
        {
            long lid = 0;

            if (asset != null)
            {
                lid = (long)container.GetExportID(asset);
            }
            SceneObjectIdentifier soId = new SceneObjectIdentifier(lid, 0);

            return(soId);
        }
예제 #6
0
        public void Initialize(IExportContainer container, OcclusionCullingSettings cullingSetting)
        {
            m_PVSData = (byte[])cullingSetting.PVSData;
            int            renderCount = cullingSetting.StaticRenderers.Count;
            int            portalCount = cullingSetting.Portals.Count;
            OcclusionScene scene       = new OcclusionScene(cullingSetting.SceneGUID, renderCount, portalCount);

            m_scenes = new OcclusionScene[] { scene };

            m_staticRenderers = new SceneObjectIdentifier[scene.SizeRenderers];
            m_portals         = new SceneObjectIdentifier[scene.SizePortals];
            SetIDs(container, cullingSetting, scene);
        }
예제 #7
0
        public void SetIDs(IExportContainer container,
                           UtinyGUID guid, IReadOnlyList <PPtr <Renderer> > renderers, IReadOnlyList <PPtr <OcclusionPortal> > portals)
        {
            if (m_staticRenderers.Length == 0 && renderers.Count != 0 || m_portals.Length == 0 && portals.Count != 0)
            {
                int            maxRenderer = Scenes.Max(j => j.IndexRenderers);
                OcclusionScene rscene      = Scenes.First(t => t.IndexRenderers == maxRenderer);
                m_staticRenderers = new SceneObjectIdentifier[rscene.IndexRenderers + rscene.SizeRenderers];

                int            maxPortal = Scenes.Max(j => j.IndexPortals);
                OcclusionScene pscene    = Scenes.First(t => t.IndexPortals == maxPortal);
                m_portals = new SceneObjectIdentifier[pscene.IndexPortals + pscene.SizePortals];
            }

            OcclusionScene curScene = Scenes.First(t => t.Scene == guid);

            if (curScene.SizeRenderers != renderers.Count)
            {
                throw new Exception($"Scene renderer count {curScene.SizeRenderers} doesn't match with given {renderers.Count}");
            }
            if (curScene.SizePortals != portals.Count)
            {
                throw new Exception($"Scene portal count {curScene.SizeRenderers} doesn't match with given {renderers.Count}");
            }

            for (int i = 0; i < renderers.Count; i++)
            {
                PPtr <Renderer> prenderer = renderers[i];
                Renderer        renderer  = prenderer.FindObject(container);
                m_staticRenderers[curScene.IndexRenderers + i] = CreateObjectID(container, renderer);
            }

            m_portals = new SceneObjectIdentifier[portals.Count];
            for (int i = 0; i < portals.Count; i++)
            {
                PPtr <OcclusionPortal> pportal = portals[i];
                OcclusionPortal        portal  = pportal.FindObject(container);
                m_portals[i] = CreateObjectID(container, portal);
            }
        }
예제 #8
0
 public static void GetRootObjects(List <Collider> colliders, List <GameObject> results)
 {
     results.Clear();
     for (int i = 0; i < colliders.Count; i++)
     {
         GameObject gameObject  = colliders[i].gameObject;
         GameObject gameObject2 = UWE.Utils.GetEntityRoot(gameObject);
         if (gameObject2 == null)
         {
             SceneObjectIdentifier componentInParent = gameObject.GetComponentInParent <SceneObjectIdentifier>();
             if (componentInParent != null)
             {
                 gameObject2 = componentInParent.gameObject;
             }
         }
         gameObject = ((gameObject2 != null) ? gameObject2 : gameObject);
         if (!results.Contains(gameObject))
         {
             results.Add(gameObject);
         }
     }
 }
예제 #9
0
        public static bool LateUpdatePrefix(PlaceTool __instance)
        {
            if (__instance.usingPlayer == null || !SnapBuilder.Config.Snapping.Enabled)
            {
                Inventory.main.quickSlots.SetIgnoreHotkeyInput(false);
                return(true);
            }

            Inventory.main.quickSlots.SetIgnoreHotkeyInput(__instance.rotationEnabled && SnapBuilder.Config.ToggleRotation.Enabled);

            Transform  aimTransform = Builder.GetAimTransform();
            RaycastHit hit;
            bool       bHit     = Physics.Raycast(aimTransform.position, aimTransform.forward, out hit, 5f, PlaceTool.placeLayerMask, QueryTriggerInteraction.Ignore);
            Vector3    position = __instance.ghostModel.transform.position;
            Quaternion rotation = __instance.ghostModel.transform.rotation;

            SnapBuilder.ApplyAdditiveRotation(ref __instance.additiveRotation, out var _);

            if (bHit)
            {
                bHit = SnapBuilder.TryGetSnappedHitPoint(PlaceTool.placeLayerMask, out hit, out Vector3 snappedHitPoint, out Vector3 snappedHitNormal);

                if (bHit)
                {
                    position = snappedHitPoint;

                    PlaceTool.SurfaceType surfaceType = PlaceTool.SurfaceType.Floor;
                    if (Mathf.Abs(hit.normal.y) < 0.3f)
                    {
                        surfaceType = PlaceTool.SurfaceType.Wall;
                    }
                    else if (hit.normal.y < 0f)
                    {
                        surfaceType = PlaceTool.SurfaceType.Ceiling;
                    }

                    if (__instance.rotationEnabled)
                    {   // New calculation of the rotation
                        rotation = SnapBuilder.CalculateRotation(ref __instance.additiveRotation, hit, snappedHitPoint, snappedHitNormal, true);
                    }
                    else
                    {   // Calculate rotation in the same manner as the original method
                        Vector3 forward;

                        if (__instance.alignWithSurface || surfaceType == PlaceTool.SurfaceType.Wall)
                        {
                            forward = hit.normal;
                        }
                        else
                        {
                            forward = new Vector3(-aimTransform.forward.x, 0f, -aimTransform.forward.z).normalized;
                        }

                        rotation = Quaternion.LookRotation(forward, Vector3.up);
                        if (__instance.rotationEnabled)
                        {
                            rotation *= Quaternion.AngleAxis(__instance.additiveRotation, Vector3.up);
                        }
                    }

                    switch (surfaceType)
                    {
                    case PlaceTool.SurfaceType.Floor:
                        __instance.validPosition = __instance.allowedOnGround;
                        break;

                    case PlaceTool.SurfaceType.Wall:
                        __instance.validPosition = __instance.allowedOnWalls;
                        break;

                    case PlaceTool.SurfaceType.Ceiling:
                        __instance.validPosition = __instance.allowedOnCeiling;
                        break;
                    }
                }
            }

            if (!bHit)
            {   // If there is no new hit, then the position we're snapping to isn't valid
                position = aimTransform.position + aimTransform.forward * 1.5f;
                rotation = Quaternion.LookRotation(-aimTransform.forward, Vector3.up);
                if (__instance.rotationEnabled)
                {
                    rotation *= Quaternion.AngleAxis(__instance.additiveRotation, Vector3.up);
                }
            }

            __instance.ghostModel.transform.position = position;
            __instance.ghostModel.transform.rotation = rotation;

            if (bHit)
            {
                Rigidbody componentInParent = hit.collider.gameObject.GetComponentInParent <Rigidbody>();
                __instance.validPosition = (__instance.validPosition &&
                                            (componentInParent == null || componentInParent.isKinematic || __instance.allowedOnRigidBody));
            }

            SubRoot currentSub = Player.main.GetCurrentSub();

            bool isInside = Player.main.IsInsideWalkable();

            if (bHit && hit.collider.gameObject.CompareTag("DenyBuilding"))
            {
                __instance.validPosition = false;
            }

#if BELOWZERO
            if (!__instance.allowedUnderwater && hit.point.y < 0)
            {
                __instance.validPosition = false;
            }
#endif

            if (bHit && ((__instance.allowedInBase && isInside) || (__instance.allowedOutside && !isInside)))
            {
                GameObject root = UWE.Utils.GetEntityRoot(hit.collider.gameObject);
                if (!root)
                {
                    SceneObjectIdentifier identifier = hit.collider.GetComponentInParent <SceneObjectIdentifier>();
                    if (identifier)
                    {
                        root = identifier.gameObject;
                    }
                    else
                    {
                        root = hit.collider.gameObject;
                    }
                }

                if (currentSub == null)
                {
                    __instance.validPosition &= Builder.ValidateOutdoor(root);
                }

                if (!__instance.allowedOnConstructable)
                {
                    __instance.validPosition &= root.GetComponentInParent <Constructable>() == null;
                }

                __instance.validPosition &= Builder.CheckSpace(position, rotation, PlaceTool.localBounds, PlaceTool.placeLayerMask, hit.collider);
            }
            else
            {
                __instance.validPosition = false;
            }

            MaterialExtensions.SetColor(__instance.renderers, ShaderPropertyID._Tint,
                                        __instance.validPosition ? PlaceTool.placeColorAllow : PlaceTool.placeColorDeny);
            if (__instance.hideInvalidGhostModel)
            {
                __instance.ghostModel.SetActive(__instance.validPosition);
            }

            return(false);
        }