public void Term() { if (m_PBMesh) { UObject.DestroyImmediate(m_PBMesh.gameObject); } }
void IState.End() { UnsubscribeEvents(); _model.End(); Object.DestroyImmediate(_view.gameObject); Object.DestroyImmediate(_model); }
/// <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); }
public static void DestroyImmediate(this UObject obj) { if (obj != null) { UObject.DestroyImmediate(obj); } }
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(); }
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); } }
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); } }
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; } }
/// <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) { } } }
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; }
/// <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); }
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"); }
public void Dispose() { Object.DestroyImmediate(_instance.gameObject); }
/// <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); }
/// <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); }
/// <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); }
/// <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 }