Пример #1
0
 public void Term()
 {
     if (m_PBMesh)
     {
         UObject.DestroyImmediate(m_PBMesh.gameObject);
     }
 }
Пример #2
0
 void IState.End()
 {
     UnsubscribeEvents();
     _model.End();
     Object.DestroyImmediate(_view.gameObject);
     Object.DestroyImmediate(_model);
 }
Пример #3
0
        /// <summary>
        /// Render the pb_Object selection with the special selection picker shader and return a texture and color -> {object, edge} dictionary.
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="selection"></param>
        /// <param name="doDepthTest"></param>
        /// <param name="map"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        internal static Texture2D RenderSelectionPickerTexture(
            Camera camera,
            IList <ProBuilderMesh> selection,
            bool doDepthTest,
            out Dictionary <uint, SimpleTuple <ProBuilderMesh, Edge> > map,
            int width  = -1,
            int height = -1)
        {
            GameObject[] depthObjects, pickerObjects;
            GenerateEdgePickingObjects(selection, doDepthTest, out map, out depthObjects, out pickerObjects);

            BuiltinMaterials.facePickerMaterial.SetColor(k_FacePickerOcclusionTintUniform, k_Blackf);

            Texture2D tex = pickerRenderer.RenderLookupTexture(camera, BuiltinMaterials.selectionPickerShader, "ProBuilderPicker", width, height);

            for (int i = 0, c = pickerObjects.Length; i < c; i++)
            {
                UObject.DestroyImmediate(pickerObjects[i].GetComponent <MeshFilter>().sharedMesh);
                UObject.DestroyImmediate(pickerObjects[i]);
            }

            if (doDepthTest)
            {
                for (int i = 0, c = depthObjects.Length; i < c; i++)
                {
                    UObject.DestroyImmediate(depthObjects[i]);
                }
            }
            return(tex);
        }
Пример #4
0
 public static void DestroyImmediate(this UObject obj)
 {
     if (obj != null)
     {
         UObject.DestroyImmediate(obj);
     }
 }
Пример #5
0
 static AssetImportPostProcessor()
 {
     tree = new FolderTree(Root, DefaultAssetConfigName, (string path) =>
     {
         path    = path.Replace("\\", "/");
         var ret = AssetDatabase.LoadAssetAtPath <AssetConfig>(path);
         return(ret);
     }, (config => Object.DestroyImmediate(config, true)));
     tree.Init();
 }
Пример #6
0
        public void Cleanup()
        {
            if (m_PBMesh)
            {
                UObject.DestroyImmediate(m_PBMesh.gameObject);
            }
            ProBuilderEditor.selectMode = m_PreviousSelectMode;

            // close editor window if we had to open it
            if (m_OpenedWindow && ProBuilderEditor.instance != null)
            {
                ProBuilderEditor.instance.Close();
            }
        }
        public IEnumerator SubScene_OpenedForEdit_UnloadsSceneOnDestroyImmediate()
        {
            EditorSceneManager.OpenScene("Assets/HelloCube/3. SubScene/SubScene.unity", OpenSceneMode.Single);
            var subScene = Object.FindObjectOfType <SubScene>();

            Assert.NotNull(subScene);
            SubSceneInspectorUtility.EditScene(subScene);
            Assert.IsTrue(subScene.IsLoaded);
            Assert.AreEqual(2, SceneManager.sceneCount);

            Object.DestroyImmediate(subScene.gameObject);

            yield return(null);

            Assert.AreEqual(1, SceneManager.sceneCount);
        }
        internal static void Destroy(UnityObject obj, bool allowDestroyingAssets = false)
        {
            if (obj == null)
            {
                return;
            }

            if (EditorApplication.isPlaying)
            {
                UnityObject.Destroy(obj);
            }
            else
            {
                UnityObject.DestroyImmediate(obj, allowDestroyingAssets);
            }
        }
Пример #9
0
        public void Destroy()
        {
            if (!_isValid)
            {
                return;
            }
            _isValid = false;

            try
            {
                OnDestroy?.Invoke(this);
            }
            catch (Exception e)
            {
                _runtime.GetLogger()?.WriteException(e);
            }
            _atoms.Clear();

            JSApi.JS_FreeValue(_ctx, _numberConstructor);
            JSApi.JS_FreeValue(_ctx, _stringConstructor);
            JSApi.JS_FreeValue(_ctx, _globalObject);
            JSApi.JS_FreeValue(_ctx, _operatorCreate);

            JSApi.JS_FreeValue(_ctx, _moduleCache);
            JSApi.JS_FreeValue(_ctx, _require);
            JSApi.JS_FreeContext(_ctx);
            var id = _contextId;

            _contextId = -1;

            if (_coroutines != null)
            {
                Object.DestroyImmediate(_coroutines);
                _coroutines = null;
            }

            _ctx = JSContext.Null;
            try
            {
                OnAfterDestroy?.Invoke(id);
            }
            catch (Exception e)
            {
                _runtime.GetLogger()?.WriteException(e);
            }
        }
Пример #10
0
        void OnDetachFromPanel(DetachFromPanelEvent evt)
        {
            if (m_PayloadInspector != null)
            {
                Object.DestroyImmediate(m_PayloadInspector);
                m_PayloadInspector = null;
            }

            if (m_Tag != null)
            {
                m_Tag.Changed -= Refresh;
            }

            if (m_Clip != null)
            {
                m_Clip.Asset.AssetWasDeserialized -= Refresh;
            }
        }
Пример #11
0
 /// <inheritdoc />
 public void RegisterAll()
 {
     foreach (TrainingSceneObject trainingObject in SceneUtils.GetActiveAndInactiveComponents <TrainingSceneObject>())
     {
         try
         {
             Register(trainingObject);
         }
         catch (NameNotUniqueException)
         {
             logger.ErrorFormat("Registration of training scene object entity with name '{0}' failed. Name is not unique! Entity will destroy itself. Referenced game object: '{1}'.", trainingObject.UniqueName, trainingObject.GameObject.name);
             Object.DestroyImmediate(trainingObject.gameObject);
         }
         catch (AlreadyRegisteredException)
         {
         }
     }
 }
Пример #12
0
        public static void Destroy(UnityObject obj)
        {
            if (obj != null)
            {
#if UNITY_EDITOR
                if (Application.isPlaying)
                {
                    UnityObject.Destroy(obj);
                }
                else
                {
                    UnityObject.DestroyImmediate(obj);
                }
#else
                UnityObject.Destroy(obj);
#endif
            }
        }
        public static void Destroy(Object obj, bool allowDestroyingAssets = false)
        {
            if (obj == null)
            {
                return;
            }
#if UNITY_EDITOR
            if (UnityEditor.EditorApplication.isPlaying)
            {
                Object.Destroy(obj);
            }
            else
            {
                Object.DestroyImmediate(obj, allowDestroyingAssets);
            }
#else
            Object.Destroy(m_HostGO);
#endif
            obj = null;
        }
Пример #14
0
        /// <summary>
        /// Render the pb_Object selection with the special selection picker shader and return a texture and color -> {object, face} dictionary.
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="selection"></param>
        /// <param name="map"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        internal static Texture2D RenderSelectionPickerTexture(
            Camera camera,
            IList <ProBuilderMesh> selection,
            out Dictionary <uint, SimpleTuple <ProBuilderMesh, Face> > map,
            int width  = -1,
            int height = -1)
        {
            var pickerObjects = GenerateFacePickingObjects(selection, out map);

            BuiltinMaterials.facePickerMaterial.SetColor(k_FacePickerOcclusionTintUniform, k_Whitef);

            Texture2D tex = pickerRenderer.RenderLookupTexture(camera, BuiltinMaterials.selectionPickerShader, "ProBuilderPicker", width, height);

            foreach (GameObject go in pickerObjects)
            {
                UObject.DestroyImmediate(go.GetComponent <MeshFilter>().sharedMesh);
                UObject.DestroyImmediate(go);
            }

            return(tex);
        }
Пример #15
0
        public IEnumerator SendThrowsExceptionAfterClose()
        {
            var            test    = new MonoBehaviourTest <SignalingPeers>();
            RTCDataChannel channel = test.component.CreateDataChannel(0, "test");

            yield return(test);

            byte[] message1 = { 1, 2, 3 };
            string message2 = "123";

            var op1 = new WaitUntilWithTimeout(() => channel.ReadyState == RTCDataChannelState.Open, 5000);

            yield return(op1);

            Assert.That(op1.IsCompleted, Is.True);
            Assert.That(() => channel.Send(message1), Throws.Nothing);
            Assert.That(() => channel.Send(message2), Throws.Nothing);
            channel.Close();
            Assert.That(() => channel.Send(message1), Throws.TypeOf <InvalidOperationException>());
            Assert.That(() => channel.Send(message2), Throws.TypeOf <InvalidOperationException>());
            test.component.Dispose();
            Object.DestroyImmediate(test.gameObject);
        }
        public static void QuadsImportWithCorrectWinding()
        {
            var srcPath = TestUtility.TemporarySavedAssetsDirectory + "maya-cube-quads.fbx";

            // do this song and dance because AssetDatabase.LoadAssetAtPath doesn't seem to work with models in the
            // Package directories
            File.Copy(TestUtility.TemplatesDirectory + "MeshImporter/maya-cube-quads.fbx", srcPath);
            AssetDatabase.Refresh();
            var source       = AssetDatabase.LoadMainAssetAtPath(srcPath);
            var meshImporter = (ModelImporter)AssetImporter.GetAtPath(srcPath);

            meshImporter.globalScale = 100f;
            meshImporter.isReadable  = true;
            meshImporter.SaveAndReimport();

            Assert.IsNotNull(source);

            var instance = (GameObject)UObject.Instantiate(source);
            var result   = new GameObject().AddComponent <ProBuilderMesh>();
            var importer = new MeshImporter(result);

            Assert.IsTrue(importer.Import(instance, new MeshImportSettings()
            {
                quads          = true,
                smoothing      = false,
                smoothingAngle = 1f
            }), "Failed importing mesh");

            result.Rebuild();

            // Assert.IsNotNull doesn't work with  UnityObject magic
            Assert.IsFalse(result.mesh == null);

#if PB_CREATE_TEST_MESH_TEMPLATES
            TestUtility.SaveAssetTemplate(result.mesh, "imported-cube-triangles");
#endif

            TestUtility.AssertMeshesAreEqual(TestUtility.GetAssetTemplate <Mesh>("imported-cube-triangles"), result.mesh);

            UObject.DestroyImmediate(result);

            UObject.DestroyImmediate(instance);
            meshImporter.keepQuads = true;
            meshImporter.SaveAndReimport();
            instance = (GameObject)UObject.Instantiate(source);

            var quadMesh = instance.GetComponent <MeshFilter>().sharedMesh;
            Assert.AreEqual(MeshTopology.Quads, quadMesh.GetTopology(0));

            result   = new GameObject().AddComponent <ProBuilderMesh>();
            importer = new MeshImporter(result);

            Assert.IsTrue(importer.Import(instance, new MeshImportSettings()
            {
                quads          = true,
                smoothing      = false,
                smoothingAngle = 1f
            }), "Failed importing mesh");

            result.Rebuild();

#if PB_CREATE_TEST_MESH_TEMPLATES
            TestUtility.SaveAssetTemplate(result.mesh, "imported-cube-quads");
#endif

            TestUtility.AssertMeshesAreEqual(TestUtility.GetAssetTemplate <Mesh>("imported-cube-quads"), result.mesh);
            UObject.DestroyImmediate(result);
            AssetDatabase.DeleteAsset(TestUtility.TemporarySavedAssetsDirectory + "maya-cube-quads.fbx");
        }
Пример #17
0
 public void Dispose()
 {
     Object.DestroyImmediate(_instance.gameObject);
 }
Пример #18
0
        /// <summary>
        /// Select edges touching a rect.
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="pickerRect"></param>
        /// <param name="selection"></param>
        /// <param name="doDepthTest"></param>
        /// <param name="renderTextureWidth"></param>
        /// <param name="renderTextureHeight"></param>
        /// <returns>A dictionary of pb_Object and selected edges.</returns>
        public static Dictionary <ProBuilderMesh, HashSet <Edge> > PickEdgesInRect(
            Camera camera,
            Rect pickerRect,
            IList <ProBuilderMesh> selection,
            bool doDepthTest,
            int renderTextureWidth  = -1,
            int renderTextureHeight = -1)
        {
            var selected = new Dictionary <ProBuilderMesh, HashSet <Edge> >();

#if PB_RENDER_PICKER_TEXTURE
            List <Color> rectImg = new List <Color>();
#endif

            Dictionary <uint, SimpleTuple <ProBuilderMesh, Edge> > map;
            Texture2D tex = RenderSelectionPickerTexture(camera, selection, doDepthTest, out map, renderTextureWidth, renderTextureHeight);
            Color32[] pix = tex.GetPixels32();

#if PB_RENDER_PICKER_TEXTURE
            System.IO.File.WriteAllBytes("Assets/edge_scene.png", tex.EncodeToPNG());
#endif

            int ox          = System.Math.Max(0, Mathf.FloorToInt(pickerRect.x));
            int oy          = System.Math.Max(0, Mathf.FloorToInt((tex.height - pickerRect.y) - pickerRect.height));
            int imageWidth  = tex.width;
            int imageHeight = tex.height;
            int width       = Mathf.FloorToInt(pickerRect.width);
            int height      = Mathf.FloorToInt(pickerRect.height);
            UObject.DestroyImmediate(tex);

            var pixelCount = new Dictionary <uint, uint>();

            for (int y = oy; y < System.Math.Min(oy + height, imageHeight); y++)
            {
                for (int x = ox; x < System.Math.Min(ox + width, imageWidth); x++)
                {
#if PB_RENDER_PICKER_TEXTURE
                    rectImg.Add(pix[y * imageWidth + x]);
#endif
                    uint v = DecodeRGBA(pix[y * imageWidth + x]);

                    if (v == k_PickerHashNone || v == k_PickerHashMax)
                    {
                        continue;
                    }

                    if (!pixelCount.ContainsKey(v))
                    {
                        pixelCount.Add(v, 1);
                    }
                    else
                    {
                        pixelCount[v] = pixelCount[v] + 1;
                    }
                }
            }

            foreach (var kvp in pixelCount)
            {
                SimpleTuple <ProBuilderMesh, Edge> hit;

                if (kvp.Value > k_MinEdgePixelsForValidSelection && map.TryGetValue(kvp.Key, out hit))
                {
                    HashSet <Edge> edges = null;

                    if (selected.TryGetValue(hit.item1, out edges))
                    {
                        edges.Add(hit.item2);
                    }
                    else
                    {
                        selected.Add(hit.item1, new HashSet <Edge>()
                        {
                            hit.item2
                        });
                    }
                }
            }

#if PB_RENDER_PICKER_TEXTURE
            if (width > 0 && height > 0)
            {
                Texture2D img = new Texture2D(width, height);
                img.SetPixels(rectImg.ToArray());
                img.Apply();
                System.IO.File.WriteAllBytes("Assets/edge_rect_" + s_RenderTextureFormat.ToString() + ".png", img.EncodeToPNG());
#if UNITY_EDITOR
                UnityEditor.AssetDatabase.Refresh();
#endif
                UObject.DestroyImmediate(img);
            }
#endif

            return(selected);
        }
Пример #19
0
        /// <summary>
        /// Select vertex indexes contained within a rect.
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="pickerRect"></param>
        /// <param name="selection"></param>
        /// <param name="doDepthTest"></param>
        /// <param name="renderTextureWidth"></param>
        /// <param name="renderTextureHeight"></param>
        /// <returns>A dictionary of pb_Object selected vertex indexes.</returns>
        public static Dictionary <ProBuilderMesh, HashSet <int> > PickVerticesInRect(
            Camera camera,
            Rect pickerRect,
            IList <ProBuilderMesh> selection,
            bool doDepthTest,
            int renderTextureWidth  = -1,
            int renderTextureHeight = -1)
        {
            Dictionary <uint, SimpleTuple <ProBuilderMesh, int> > map;
            Dictionary <ProBuilderMesh, HashSet <int> >           selected = new Dictionary <ProBuilderMesh, HashSet <int> >();

#if PB_RENDER_PICKER_TEXTURE
            List <Color> rectImg = new List <Color>();
#endif

            Texture2D tex = RenderSelectionPickerTexture(camera, selection, doDepthTest, out map, renderTextureWidth, renderTextureHeight);
            Color32[] pix = tex.GetPixels32();

            int ox          = System.Math.Max(0, Mathf.FloorToInt(pickerRect.x));
            int oy          = System.Math.Max(0, Mathf.FloorToInt((tex.height - pickerRect.y) - pickerRect.height));
            int imageWidth  = tex.width;
            int imageHeight = tex.height;
            int width       = Mathf.FloorToInt(pickerRect.width);
            int height      = Mathf.FloorToInt(pickerRect.height);

            UObject.DestroyImmediate(tex);

            SimpleTuple <ProBuilderMesh, int> hit;
            HashSet <int>  indexes = null;
            HashSet <uint> used    = new HashSet <uint>();

            for (int y = oy; y < System.Math.Min(oy + height, imageHeight); y++)
            {
                for (int x = ox; x < System.Math.Min(ox + width, imageWidth); x++)
                {
                    uint v = DecodeRGBA(pix[y * imageWidth + x]);

#if PB_RENDER_PICKER_TEXTURE
                    rectImg.Add(pix[y * imageWidth + x]);
#endif

                    if (used.Add(v) && map.TryGetValue(v, out hit))
                    {
                        if (selected.TryGetValue(hit.item1, out indexes))
                        {
                            indexes.Add(hit.item2);
                        }
                        else
                        {
                            selected.Add(hit.item1, new HashSet <int>()
                            {
                                hit.item2
                            });
                        }
                    }
                }
            }

            var coincidentSelection = new Dictionary <ProBuilderMesh, HashSet <int> >();

            // workaround for picking vertices that share a position but are not shared
            foreach (var meshSelection in selected)
            {
                var positions      = meshSelection.Key.positionsInternal;
                var sharedVertices = meshSelection.Key.sharedVerticesInternal;
                var positionHash   = new HashSet <int>(meshSelection.Value.Select(x => VectorHash.GetHashCode(positions[sharedVertices[x][0]])));
                var collected      = new HashSet <int>();

                for (int i = 0, c = sharedVertices.Length; i < c; i++)
                {
                    var hash = VectorHash.GetHashCode(positions[sharedVertices[i][0]]);
                    if (positionHash.Contains(hash))
                    {
                        collected.Add(i);
                    }
                }

                coincidentSelection.Add(meshSelection.Key, collected);
            }
            selected = coincidentSelection;

#if PB_RENDER_PICKER_TEXTURE
            if (width > 0 && height > 0)
            {
                Texture2D img = new Texture2D(width, height);
                img.SetPixels(rectImg.ToArray());
                img.Apply();
                System.IO.File.WriteAllBytes("Assets/rect_" + s_RenderTextureFormat.ToString() + ".png", img.EncodeToPNG());
#if UNITY_EDITOR
                UnityEditor.AssetDatabase.Refresh();
#endif
                UObject.DestroyImmediate(img);
            }
#endif

            return(selected);
        }
Пример #20
0
        /// <summary>
        /// Given a camera and selection rect (in screen space) return a Dictionary containing the number of faces touched by the rect.
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="pickerRect"></param>
        /// <param name="selection"></param>
        /// <param name="renderTextureWidth"></param>
        /// <param name="renderTextureHeight"></param>
        /// <returns></returns>
        public static Dictionary <ProBuilderMesh, HashSet <Face> > PickFacesInRect(
            Camera camera,
            Rect pickerRect,
            IList <ProBuilderMesh> selection,
            int renderTextureWidth  = -1,
            int renderTextureHeight = -1)
        {
            Dictionary <uint, SimpleTuple <ProBuilderMesh, Face> > map;
            Texture2D tex = RenderSelectionPickerTexture(camera, selection, out map, renderTextureWidth, renderTextureHeight);

            Color32[] pix = tex.GetPixels32();

            int ox          = System.Math.Max(0, Mathf.FloorToInt(pickerRect.x));
            int oy          = System.Math.Max(0, Mathf.FloorToInt((tex.height - pickerRect.y) - pickerRect.height));
            int imageWidth  = tex.width;
            int imageHeight = tex.height;
            int width       = Mathf.FloorToInt(pickerRect.width);
            int height      = Mathf.FloorToInt(pickerRect.height);

            UObject.DestroyImmediate(tex);

            Dictionary <ProBuilderMesh, HashSet <Face> > selected = new Dictionary <ProBuilderMesh, HashSet <Face> >();
            SimpleTuple <ProBuilderMesh, Face>           hit;
            HashSet <Face> faces = null;
            HashSet <uint> used  = new HashSet <uint>();

#if PB_RENDER_PICKER_TEXTURE
            List <Color> rectImg = new List <Color>();
#endif

            for (int y = oy; y < System.Math.Min(oy + height, imageHeight); y++)
            {
                for (int x = ox; x < System.Math.Min(ox + width, imageWidth); x++)
                {
#if PB_RENDER_PICKER_TEXTURE
                    rectImg.Add(pix[y * imageWidth + x]);
#endif

                    uint v = SelectionPickerRenderer.DecodeRGBA(pix[y * imageWidth + x]);

                    if (used.Add(v) && map.TryGetValue(v, out hit))
                    {
                        if (selected.TryGetValue(hit.item1, out faces))
                        {
                            faces.Add(hit.item2);
                        }
                        else
                        {
                            selected.Add(hit.item1, new HashSet <Face>()
                            {
                                hit.item2
                            });
                        }
                    }
                }
            }

#if PB_RENDER_PICKER_TEXTURE
            if (width > 0 && height > 0)
            {
//              Debug.Log("used: \n" + used.Select(x => string.Format("{0} ({1})", x, EncodeRGBA(x))).ToString("\n"));
                Texture2D img = new Texture2D(width, height);
                img.SetPixels(rectImg.ToArray());
                img.Apply();
                byte[] bytes = img.EncodeToPNG();
                System.IO.File.WriteAllBytes("Assets/rect.png", bytes);
#if UNITY_EDITOR
                UnityEditor.AssetDatabase.Refresh();
#endif
                UObject.DestroyImmediate(img);
            }
#endif

            return(selected);
        }
            /// <summary>
            /// Render the camera with a replacement shader and return the resulting image.
            /// RenderTexture is always initialized with no gamma conversion (RenderTextureReadWrite.Linear)
            /// </summary>
            /// <param name="camera"></param>
            /// <param name="shader"></param>
            /// <param name="tag"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            /// <returns></returns>
            public Texture2D RenderLookupTexture(
                Camera camera,
                Shader shader,
                string tag,
                int width  = -1,
                int height = -1)
            {
                bool autoSize = width < 0 || height < 0;

                int _width  = autoSize ? (int)camera.pixelRect.width : width;
                int _height = autoSize ? (int)camera.pixelRect.height : height;

                GameObject go        = new GameObject();
                Camera     renderCam = go.AddComponent <Camera>();

                renderCam.CopyFrom(camera);

                renderCam.renderingPath   = RenderingPath.Forward;
                renderCam.enabled         = false;
                renderCam.clearFlags      = CameraClearFlags.SolidColor;
                renderCam.backgroundColor = Color.white;
#if UNITY_5_6_OR_NEWER
                renderCam.allowHDR  = false;
                renderCam.allowMSAA = false;
                renderCam.forceIntoRenderTexture = true;
#endif

#if UNITY_2017_1_OR_NEWER
                RenderTextureDescriptor descriptor = new RenderTextureDescriptor()
                {
                    width             = _width,
                    height            = _height,
                    colorFormat       = renderTextureFormat,
                    autoGenerateMips  = false,
                    depthBufferBits   = 16,
                    dimension         = UnityEngine.Rendering.TextureDimension.Tex2D,
                    enableRandomWrite = false,
                    memoryless        = RenderTextureMemoryless.None,
                    sRGB        = false,
                    useMipMap   = false,
                    volumeDepth = 1,
                    msaaSamples = 1
                };
                RenderTexture rt = RenderTexture.GetTemporary(descriptor);
#else
                RenderTexture rt = RenderTexture.GetTemporary(
                    _width,
                    _height,
                    16,
                    renderTextureFormat,
                    RenderTextureReadWrite.Linear,
                    1);
#endif

                RenderTexture prev = RenderTexture.active;
                renderCam.targetTexture = rt;
                RenderTexture.active    = rt;

#if PB_DEBUG
                /* Debug.Log(string.Format("antiAliasing {0}\nautoGenerateMips {1}\ncolorBuffer {2}\ndepth {3}\ndepthBuffer {4}\ndimension {5}\nenableRandomWrite {6}\nformat {7}\nheight {8}\nmemorylessMode {9}\nsRGB {10}\nuseMipMap {11}\nvolumeDepth {12}\nwidth {13}",
                 *  RenderTexture.active.antiAliasing,
                 *  RenderTexture.active.autoGenerateMips,
                 *  RenderTexture.active.colorBuffer,
                 *  RenderTexture.active.depth,
                 *  RenderTexture.active.depthBuffer,
                 *  RenderTexture.active.dimension,
                 *  RenderTexture.active.enableRandomWrite,
                 *  RenderTexture.active.format,
                 *  RenderTexture.active.height,
                 *  RenderTexture.active.memorylessMode,
                 *  RenderTexture.active.sRGB,
                 *  RenderTexture.active.useMipMap,
                 *  RenderTexture.active.volumeDepth,
                 *  RenderTexture.active.width));
                 */
#endif
                renderCam.RenderWithShader(shader, tag);

                Texture2D img = new Texture2D(_width, _height, textureFormat, false, false);
                img.ReadPixels(new Rect(0, 0, _width, _height), 0, 0);
                img.Apply();

                RenderTexture.active = prev;
                RenderTexture.ReleaseTemporary(rt);

                UObject.DestroyImmediate(go);

                return(img);
            }
Пример #22
0
            /// <summary>
            /// Render the camera with a replacement shader and return the resulting image.
            /// RenderTexture is always initialized with no gamma conversion (RenderTextureReadWrite.Linear)
            /// </summary>
            /// <param name="camera"></param>
            /// <param name="shader"></param>
            /// <param name="tag"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            /// <returns></returns>
            public Texture2D RenderLookupTexture(
                Camera camera,
                Shader shader,
                string tag,
                int width  = -1,
                int height = -1)
            {
                bool autoSize = width < 0 || height < 0;

                int _width  = autoSize ? (int)camera.pixelRect.width : width;
                int _height = autoSize ? (int)camera.pixelRect.height : height;

                GameObject go        = new GameObject();
                Camera     renderCam = go.AddComponent <Camera>();

                renderCam.CopyFrom(camera);

                renderCam.renderingPath          = RenderingPath.Forward;
                renderCam.enabled                = false;
                renderCam.clearFlags             = CameraClearFlags.SolidColor;
                renderCam.backgroundColor        = Color.white;
                renderCam.allowHDR               = false;
                renderCam.allowMSAA              = false;
                renderCam.forceIntoRenderTexture = true;

                RenderTextureDescriptor descriptor = new RenderTextureDescriptor()
                {
                    width             = _width,
                    height            = _height,
                    colorFormat       = renderTextureFormat,
                    autoGenerateMips  = false,
                    depthBufferBits   = 16,
                    dimension         = UnityEngine.Rendering.TextureDimension.Tex2D,
                    enableRandomWrite = false,
                    memoryless        = RenderTextureMemoryless.None,
                    sRGB        = false,
                    useMipMap   = false,
                    volumeDepth = 1,
                    msaaSamples = 1
                };

                RenderTexture rt   = RenderTexture.GetTemporary(descriptor);
                RenderTexture prev = RenderTexture.active;

                renderCam.targetTexture = rt;
                RenderTexture.active    = rt;

#if PB_DEBUG
                /* Debug.Log(string.Format("antiAliasing {0}\nautoGenerateMips {1}\ncolorBuffer {2}\ndepth {3}\ndepthBuffer {4}\ndimension {5}\nenableRandomWrite {6}\nformat {7}\nheight {8}\nmemorylessMode {9}\nsRGB {10}\nuseMipMap {11}\nvolumeDepth {12}\nwidth {13}",
                 *  RenderTexture.active.antiAliasing,
                 *  RenderTexture.active.autoGenerateMips,
                 *  RenderTexture.active.colorBuffer,
                 *  RenderTexture.active.depth,
                 *  RenderTexture.active.depthBuffer,
                 *  RenderTexture.active.dimension,
                 *  RenderTexture.active.enableRandomWrite,
                 *  RenderTexture.active.format,
                 *  RenderTexture.active.height,
                 *  RenderTexture.active.memorylessMode,
                 *  RenderTexture.active.sRGB,
                 *  RenderTexture.active.useMipMap,
                 *  RenderTexture.active.volumeDepth,
                 *  RenderTexture.active.width));
                 */
#endif

                // URP does not support replacement shaders or custom passes from code, so for now it is necessary to
                // force the pipeline to built-in when rendering. In editor it may be possible to use Handles.DrawCamera
                // to avoid disposing and re-assigning the pipeline, as the RenderEditorCamera function has some logic
                // that switches rendering path if replacement shaders are in use, but I wasn't able to get that
                // approach to work without also requiring that the drawing happen during a repaint event.
                var currentRenderPipeline         = GraphicsSettings.renderPipelineAsset;
                var qualitySettingsRenderPipeline = QualitySettings.renderPipeline;
                GraphicsSettings.renderPipelineAsset = null;
                QualitySettings.renderPipeline       = null;
                renderCam.RenderWithShader(shader, tag);
                GraphicsSettings.renderPipelineAsset = currentRenderPipeline;
                QualitySettings.renderPipeline       = qualitySettingsRenderPipeline;

                Texture2D img = new Texture2D(_width, _height, textureFormat, false, false);
                img.ReadPixels(new Rect(0, 0, _width, _height), 0, 0);
                img.Apply();

                RenderTexture.active = prev;
                RenderTexture.ReleaseTemporary(rt);

                UObject.DestroyImmediate(go);

                return(img);
            }
        private static void UpdateMask()
        {
            var maskType = UnityDeviceMaskSetting.UnityDeviceMaskType;

            // お掃除
            foreach (var gabage in Object.FindObjectsOfType <UnityDeviceMaskObject>())
            {
                Object.DestroyImmediate(gabage.gameObject);
            }

            if (maskType == UnityDeviceMaskType.None)
            {
                return;
            }

            // GameViewSizeAttributeが設定されてたらGameViewに設定
            var memberInfos            = typeof(UnityDeviceMaskType).GetMember(maskType.ToString());
            var gameViewSizeAttributes = memberInfos[0].GetCustomAttributes(typeof(GameViewSizeAttribute), false);

            if (gameViewSizeAttributes.Length != 0)
            {
                var gameViewSizeAttribute = (GameViewSizeAttribute)gameViewSizeAttributes[0];

                var gameViewSizes               = typeof(Editor).Assembly.GetType("UnityEditor.GameViewSizes");
                var scriptableSingleton         = typeof(ScriptableSingleton <>).MakeGenericType(gameViewSizes);
                var getGroup                    = gameViewSizes.GetMethod("GetGroup");
                var scriptableSingletonInstance = scriptableSingleton.GetProperty("instance");
                var gameViewSizesInstance       = scriptableSingletonInstance.GetValue(null, null);
                var group = getGroup.Invoke(gameViewSizesInstance, new object[] { 0 /* = Standalone */ });

                // サイズがあるか検索
                var getTotalCount = group.GetType().GetMethod("GetTotalCount");
                var totalCount    = (int)getTotalCount.Invoke(group, new object[0]);
                var index         = (int?)null;
                for (int i = 0; i < totalCount; ++i)
                {
                    var getTargetGameViewSize = group.GetType().GetMethod("GetGameViewSize");
                    var targetGameViewSize    = getTargetGameViewSize.Invoke(group, new object[] { i });
                    var baseText = (string)targetGameViewSize.GetType().GetProperty("baseText").GetValue(targetGameViewSize, new object[0]);
                    if (baseText == maskType.ToString())
                    {
                        index = i;
                    }
                }

                if (!index.HasValue)
                {
                    // サイズを追加
                    var addCustomSize = getGroup.ReturnType.GetMethod("AddCustomSize");
                    var gameViewSize  = typeof(Editor).Assembly.GetType("UnityEditor.GameViewSize");
#if UNITY_2017_4_OR_NEWER
                    var gameViewSizeType = typeof(Editor).Assembly.GetType("UnityEditor.GameViewSizeType");
                    var constructor      = gameViewSize.GetConstructor(new Type[] { gameViewSizeType, typeof(int), typeof(int), typeof(string) });
#else
                    var constructor = gameViewSize.GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(string) });
#endif
                    var newSize = constructor.Invoke(new object[] { (int)gameViewSizeAttribute.GameViewSizeType, gameViewSizeAttribute.Width, gameViewSizeAttribute.Height, maskType.ToString() });
                    addCustomSize.Invoke(group, new object[] { newSize });
                }

                // 設定した解像度をGameViewに反映
                var gameView       = typeof(Editor).Assembly.GetType("UnityEditor.GameView");
                var gameViewWindow = EditorWindow.GetWindow(gameView);
                var setSize        = gameView.GetMethod("SizeSelectionCallback",
                                                        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                setSize.Invoke(gameViewWindow, new object[] { index.HasValue?index.Value: totalCount /* 最後に追加してるのでtotalCount-1+1ということ */, null });
            }

            // 生成
            var instance = Object.Instantiate(UnityEngine.Resources.Load <UnityDeviceMaskObject>("UnityDeviceMask"));
            instance.Initialize();
        }
 public virtual void Dispose()
 {
     Object.DestroyImmediate(Target);
 }
            public Texture2D RenderLookupTexture(
                Camera camera,
                Shader shader,
                string tag,
                int width  = -1,
                int height = -1)
            {
#if HDRP_7_1_0_OR_NEWER
                bool autoSize = width < 0 || height < 0;

                int _width  = autoSize ? (int)camera.pixelRect.width : width;
                int _height = autoSize ? (int)camera.pixelRect.height : height;

                GameObject go        = new GameObject();
                Camera     renderCam = go.AddComponent <Camera>();
                renderCam.CopyFrom(camera);

                renderCam.renderingPath          = RenderingPath.Forward;
                renderCam.enabled                = false;
                renderCam.clearFlags             = CameraClearFlags.SolidColor;
                renderCam.backgroundColor        = Color.white;
                renderCam.allowHDR               = false;
                renderCam.allowMSAA              = false;
                renderCam.forceIntoRenderTexture = true;

                Rendering.HighDefinition.HDAdditionalCameraData hdCamData = go.AddComponent <Rendering.HighDefinition.HDAdditionalCameraData>();
                hdCamData.flipYMode     = Rendering.HighDefinition.HDAdditionalCameraData.FlipYMode.ForceFlipY;
                hdCamData.customRender += CustomRenderPass;

                RenderTextureDescriptor descriptor = new RenderTextureDescriptor()
                {
                    width             = _width,
                    height            = _height,
                    colorFormat       = renderTextureFormat,
                    autoGenerateMips  = false,
                    depthBufferBits   = 16,
                    dimension         = UnityEngine.Rendering.TextureDimension.Tex2D,
                    enableRandomWrite = false,
                    memoryless        = RenderTextureMemoryless.None,
                    sRGB        = false,
                    useMipMap   = false,
                    volumeDepth = 1,
                    msaaSamples = 1
                };
                RenderTexture rt = RenderTexture.GetTemporary(descriptor);

                RenderTexture prev = RenderTexture.active;
                renderCam.targetTexture = rt;
                RenderTexture.active    = rt;

                renderCam.Render();

                Texture2D img = new Texture2D(_width, _height, textureFormat, false, false);
                img.ReadPixels(new Rect(0, 0, _width, _height), 0, 0);
                img.Apply();

                RenderTexture.active = prev;
                RenderTexture.ReleaseTemporary(rt);

                UObject.DestroyImmediate(go);

                return(img);
#else
                return(null);
#endif
            }