Compare commits

...

15 Commits
4.1.2 ... 4.1.7

Author SHA1 Message Date
semantic-release-bot
a499f0c046 chore(release): 4.1.7 [skip ci]
## [4.1.7](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.6...4.1.7) (2022-08-30)

### Bug Fixes

* the annoying empty black scene overlay box shown even when nothing is selected ([bdeeabb](bdeeabbbe1))
2022-08-30 00:42:14 +00:00
takashi.sakai
447c83dbbc docs: add shader sample 2022-08-30 09:40:59 +09:00
Bamdad Bastani
bdeeabbbe1 fix: the annoying empty black scene overlay box shown even when nothing is selected 2022-08-30 09:40:00 +09:00
semantic-release-bot
5e6da2e158 chore(release): 4.1.6 [skip ci]
## [4.1.6](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.5...4.1.6) (2022-08-10)

### Bug Fixes

* fix abnormal mesh bounds error ([f60d6df](f60d6dfe60)), closes [#213](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/213) [#218](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/218)
2022-08-10 07:46:41 +00:00
takashi.sakai
f60d6dfe60 fix: fix abnormal mesh bounds error
close #213, close #218
2022-08-10 16:45:50 +09:00
semantic-release-bot
c795d24003 chore(release): 4.1.5 [skip ci]
## [4.1.5](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.4...4.1.5) (2022-08-10)

### Bug Fixes

* fix culling for RectMask2D ([9e2dbe7](9e2dbe7758)), closes [#220](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/220)
2022-08-10 01:44:58 +00:00
takashi.sakai
9e2dbe7758 fix: fix culling for RectMask2D
close #220
2022-08-10 10:31:50 +09:00
semantic-release-bot
4edcef1bbf chore(release): 4.1.4 [skip ci]
## [4.1.4](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.3...4.1.4) (2022-07-01)

### Bug Fixes

* add `Enabled` toggle in overlay window ([f97e619](f97e6195e6))
* if `m_Particles` contains null, an error will occur ([550d0c4](550d0c43be)), closes [#214](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/214)
* ParticleSystem reordering and refreshing in inspector does not work for prefab asset ([7eb4112](7eb41124db))
* refresh button does not works in prefab edit mode ([c1538a8](c1538a8399)), closes [#214](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/214)
* when `UIParticlrRenderer` destroy manually, an error will occur ([a11d2d0](a11d2d01ce))
2022-07-01 07:49:12 +00:00
mob-sakai
a11d2d01ce fix: when UIParticlrRenderer destroy manually, an error will occur 2022-07-01 16:10:10 +09:00
mob-sakai
550d0c43be fix: if m_Particles contains null, an error will occur
close #214
2022-07-01 16:10:10 +09:00
mob-sakai
c1538a8399 fix: refresh button does not works in prefab edit mode
close #214
2022-07-01 16:10:10 +09:00
mob-sakai
f97e6195e6 fix: add Enabled toggle in overlay window 2022-07-01 16:10:10 +09:00
mob-sakai
7eb41124db fix: ParticleSystem reordering and refreshing in inspector does not work for prefab asset 2022-07-01 16:10:09 +09:00
semantic-release-bot
65c60000c2 chore(release): 4.1.3 [skip ci]
## [4.1.3](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.2...4.1.3) (2022-06-28)

### Bug Fixes

* error on drag prefab to scene ([fa2f867](fa2f867bca)), closes [#211](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/211)
2022-06-28 08:07:32 +00:00
mob-sakai
fa2f867bca fix: error on drag prefab to scene
close #211
2022-06-28 14:26:09 +09:00
7 changed files with 227 additions and 26 deletions

View File

@@ -1,3 +1,42 @@
## [4.1.7](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.6...4.1.7) (2022-08-30)
### Bug Fixes
* the annoying empty black scene overlay box shown even when nothing is selected ([bdeeabb](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/bdeeabbbe140b0ba80fac7ac477874c2467d3a16))
## [4.1.6](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.5...4.1.6) (2022-08-10)
### Bug Fixes
* fix abnormal mesh bounds error ([f60d6df](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/f60d6dfe6030ac89527a4265e414e9a0a20d56db)), closes [#213](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/213) [#218](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/218)
## [4.1.5](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.4...4.1.5) (2022-08-10)
### Bug Fixes
* fix culling for RectMask2D ([9e2dbe7](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/9e2dbe7758eb28a4f6a7c11113d9169847880f96)), closes [#220](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/220)
## [4.1.4](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.3...4.1.4) (2022-07-01)
### Bug Fixes
* add `Enabled` toggle in overlay window ([f97e619](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/f97e6195e62b5acfa8f3e97bfe3bc4a7dcadf38a))
* if `m_Particles` contains null, an error will occur ([550d0c4](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/550d0c43be35cd07e390ffd5749557c89fee0332)), closes [#214](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/214)
* ParticleSystem reordering and refreshing in inspector does not work for prefab asset ([7eb4112](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/7eb41124db06ea794db76788b35ce82a0af2c402))
* refresh button does not works in prefab edit mode ([c1538a8](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/c1538a83998608a30dc90944b05f8b75e165cf05)), closes [#214](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/214)
* when `UIParticlrRenderer` destroy manually, an error will occur ([a11d2d0](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/a11d2d01ce5f67e3f430bcb0bfdee1ad9abf7cfe))
## [4.1.3](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.2...4.1.3) (2022-06-28)
### Bug Fixes
* error on drag prefab to scene ([fa2f867](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/fa2f867bcaff437bb9420da1abcef970cdb09ade)), closes [#211](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/211)
## [4.1.2](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.1...4.1.2) (2022-06-27) ## [4.1.2](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/4.1.1...4.1.2) (2022-06-27)

View File

@@ -195,9 +195,10 @@ NOTE: Press `Refresh` button to reconstruct rendering order based on children Pa
<br><br> <br><br>
### With `Mask` or `MaskRect2D` component ### With `Mask` or `RectMask2D` component
If you want to mask particles, set a stencil supported shader (such as `UI/UIAdditive`) to material for ParticleSystem. If you want to mask particles, set a stencil supported shader (such as `UI/UIAdditive`) to material for ParticleSystem.
If you use some custom shaders, see [How to make a custom shader to support Mask/RectMask2D component](#how-to-make-a-custom-shader-to-support-maskrectmask2d-component) section.
![](https://user-images.githubusercontent.com/12690315/95017591-3b512700-0695-11eb-864e-04166ea1809a.png) ![](https://user-images.githubusercontent.com/12690315/95017591-3b512700-0695-11eb-864e-04166ea1809a.png)
@@ -263,6 +264,99 @@ When improving performance, keep the following in mind:
- If you are using multiple materials, you will have more draw calls. - If you are using multiple materials, you will have more draw calls.
- Consider single material, atlasing the sprites, and using `Sprite` mode in the `Texture Sheet Animation` module in ParticleSystem. - Consider single material, atlasing the sprites, and using `Sprite` mode in the `Texture Sheet Animation` module in ParticleSystem.
### How to make a custom shader to support Mask/RectMask2D component
<details>
<summary>Shader tips</summary>
```ShaderLab
Shader "Your/Custom/Shader"
{
Properties
{
// ...
// #### required for Mask ####
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
}
SubShader
{
Tags
{
// ...
}
// #### required for Mask ####
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
ColorMask [_ColorMask]
// ...
Pass
{
// ...
// #### required for RectMask2D ####
#include "UnityUI.cginc"
#pragma multi_compile __ UNITY_UI_CLIP_RECT
float4 _ClipRect;
// #### required for Mask ####
#pragma multi_compile __ UNITY_UI_ALPHACLIP
struct appdata_t
{
// ...
};
struct v2f
{
// ...
// #### required for RectMask2D ####
float4 worldPosition : TEXCOORD1;
};
v2f vert(appdata_t v)
{
v2f OUT;
// ...
// #### required for RectMask2D ####
OUT.worldPosition = v.vertex;
return OUT;
}
fixed4 frag(v2f IN) : SV_Target
{
// ...
// #### required for RectMask2D ####
#ifdef UNITY_UI_CLIP_RECT
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
#endif
// #### required for Mask ####
#ifdef UNITY_UI_ALPHACLIP
clip (color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}
```
</details>
<br><br><br><br> <br><br><br><br>

View File

@@ -102,7 +102,7 @@ namespace Coffee.UIExtensions
#endif #endif
#if UNITY_2019_1_OR_NEWER #if UNITY_2019_1_OR_NEWER
SceneView.duringSceneGui += _ => miSceneViewOverlayWindow.Invoke(null, sceneViewArgs); SceneView.duringSceneGui += _ => { if (s_SerializedObject != null) miSceneViewOverlayWindow.Invoke(null, sceneViewArgs); };
#else #else
SceneView.onSceneGUIDelegate += _ => SceneView.onSceneGUIDelegate += _ =>
#endif #endif
@@ -120,15 +120,15 @@ namespace Coffee.UIExtensions
.Select(x => x.GetComponent<ParticleSystem>()) .Select(x => x.GetComponent<ParticleSystem>())
.Where(x => x) .Where(x => x)
.Select(x => x.GetComponentInParent<UIParticle>()) .Select(x => x.GetComponentInParent<UIParticle>())
.Where(x => x) .Where(x => x && x.canvas)
.Concat( .Concat(
Selection.gameObjects Selection.gameObjects
.Select(x => x.GetComponent<UIParticle>()) .Select(x => x.GetComponent<UIParticle>())
.Where(x => x) .Where(x => x && x.canvas)
) )
.Distinct() .Distinct()
.ToArray(); .ToArray();
return uiParticles.Any() ? new SerializedObject(uiParticles) : null; return 0 < uiParticles.Length ? new SerializedObject(uiParticles) : null;
}; };
s_SerializedObject = createSerializeObject(); s_SerializedObject = createSerializeObject();
@@ -155,9 +155,9 @@ namespace Coffee.UIExtensions
var sp = serializedObject.FindProperty("m_Particles"); var sp = serializedObject.FindProperty("m_Particles");
_ro = new ReorderableList(sp.serializedObject, sp, true, true, true, true); _ro = new ReorderableList(sp.serializedObject, sp, true, true, true, true);
_ro.elementHeight = EditorGUIUtility.singleLineHeight * 3 + 4; _ro.elementHeight = (EditorGUIUtility.singleLineHeight * 3) + 4;
_ro.elementHeightCallback = _ => 3 * (EditorGUIUtility.singleLineHeight + 2); _ro.elementHeightCallback = _ => 3 * (EditorGUIUtility.singleLineHeight + 2);
_ro.drawElementCallback = (rect, index, active, focused) => _ro.drawElementCallback = (rect, index, _, __) =>
{ {
EditorGUI.BeginDisabledGroup(sp.hasMultipleDifferentValues); EditorGUI.BeginDisabledGroup(sp.hasMultipleDifferentValues);
rect.y += 1; rect.y += 1;
@@ -175,7 +175,7 @@ namespace Coffee.UIExtensions
rect.y += rect.height + 1; rect.y += rect.height + 1;
MaterialField(rect, s_ContentTrailMaterial, materials, 1); MaterialField(rect, s_ContentTrailMaterial, materials, 1);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
if (materials != null) if (materials != null && materials.serializedObject.hasModifiedProperties)
{ {
materials.serializedObject.ApplyModifiedProperties(); materials.serializedObject.ApplyModifiedProperties();
} }
@@ -192,16 +192,10 @@ namespace Coffee.UIExtensions
foreach (UIParticle t in targets) foreach (UIParticle t in targets)
{ {
t.RefreshParticles(); t.RefreshParticles();
EditorUtility.SetDirty(t);
} }
} }
}; };
_ro.onReorderCallback = _ =>
{
foreach (UIParticle t in targets)
{
t.RefreshParticles(t.particles);
}
};
// On select UIParticle, refresh particles. // On select UIParticle, refresh particles.
foreach (UIParticle t in targets) foreach (UIParticle t in targets)
@@ -231,7 +225,7 @@ namespace Coffee.UIExtensions
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
var current = target as UIParticle; var current = target as UIParticle;
if (current == null) return; if (!current) return;
serializedObject.Update(); serializedObject.Update();
@@ -269,9 +263,18 @@ namespace Coffee.UIExtensions
EditorGUILayout.PropertyField(m_AbsoluteMode); EditorGUILayout.PropertyField(m_AbsoluteMode);
// Target ParticleSystems. // Target ParticleSystems.
EditorGUI.BeginChangeCheck();
EditorGUI.BeginDisabledGroup(targets.OfType<UIParticle>().Any(x => !x.canvas));
_ro.DoLayoutList(); _ro.DoLayoutList();
EditorGUI.EndDisabledGroup();
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
if (EditorGUI.EndChangeCheck())
{
foreach (var uip in targets.OfType<UIParticle>())
{
uip.RefreshParticles(uip.particles);
}
}
// Does the shader support UI masks? // Does the shader support UI masks?
if (current.maskable && current.GetComponentInParent<Mask>()) if (current.maskable && current.GetComponentInParent<Mask>())
@@ -319,7 +322,7 @@ namespace Coffee.UIExtensions
// Check to use 'TEXCOORD*.zw' components as custom vertex stream. // Check to use 'TEXCOORD*.zw' components as custom vertex stream.
foreach (var psr in allPsRenderers) foreach (var psr in allPsRenderers)
{ {
if (new SerializedObject(psr).FindProperty("m_UseCustomVertexStreams").boolValue == false) continue; if (!new SerializedObject(psr).FindProperty("m_UseCustomVertexStreams").boolValue) continue;
if (psr.activeVertexStreamsCount == 0) continue; if (psr.activeVertexStreamsCount == 0) continue;
psr.GetActiveVertexStreams(s_Streams); psr.GetActiveVertexStreams(s_Streams);
@@ -427,13 +430,14 @@ namespace Coffee.UIExtensions
{ {
try try
{ {
if (s_SerializedObject.targetObjects.Any(x => !x)) return; if (s_SerializedObject.targetObjects.OfType<UIParticle>().Any(x => !x || !x.canvas)) return;
s_SerializedObject.Update(); s_SerializedObject.Update();
using (new EditorGUILayout.VerticalScope(GUILayout.Width(220f))) using (new EditorGUILayout.VerticalScope(GUILayout.Width(220f)))
{ {
var labelWidth = EditorGUIUtility.labelWidth; var labelWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = 100; EditorGUIUtility.labelWidth = 100;
EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_Enabled"));
_xyzMode = DrawFloatOrVector3Field(s_SerializedObject.FindProperty("m_Scale3D"), _xyzMode); _xyzMode = DrawFloatOrVector3Field(s_SerializedObject.FindProperty("m_Scale3D"), _xyzMode);
EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_AbsoluteMode")); EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_AbsoluteMode"));
EditorGUIUtility.labelWidth = labelWidth; EditorGUIUtility.labelWidth = labelWidth;

View File

@@ -2,6 +2,7 @@
#define SERIALIZE_FIELD_MASKABLE #define SERIALIZE_FIELD_MASKABLE
#endif #endif
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Coffee.UIParticleExtensions; using Coffee.UIParticleExtensions;
using UnityEngine; using UnityEngine;
@@ -290,6 +291,7 @@ namespace Coffee.UIExtensions
var j = 0; var j = 0;
for (var i = 0; i < particles.Count; i++) for (var i = 0; i < particles.Count; i++)
{ {
if (!particles[i]) continue;
GetRenderer(j++).Set(this, particles[i], false); GetRenderer(j++).Set(this, particles[i], false);
if (particles[i].trails.enabled) if (particles[i].trails.enabled)
{ {
@@ -321,9 +323,15 @@ namespace Coffee.UIExtensions
{ {
if (!isActiveAndEnabled) return; if (!isActiveAndEnabled) return;
if (m_Renderers.Any(x => !x))
{
RefreshParticles(particles);
}
var bakeCamera = GetBakeCamera(); var bakeCamera = GetBakeCamera();
for (var i = 0; i < m_Renderers.Count; i++) for (var i = 0; i < m_Renderers.Count; i++)
{ {
if (!m_Renderers[i]) continue;
m_Renderers[i].UpdateMesh(bakeCamera); m_Renderers[i].UpdateMesh(bakeCamera);
} }
} }
@@ -332,6 +340,7 @@ namespace Coffee.UIExtensions
{ {
for (var i = 0; i < m_Renderers.Count; i++) for (var i = 0; i < m_Renderers.Count; i++)
{ {
if (!m_Renderers[i]) continue;
m_Renderers[i].UpdateParticleCount(); m_Renderers[i].UpdateParticleCount();
} }
} }
@@ -417,6 +426,10 @@ namespace Coffee.UIExtensions
{ {
m_Renderers.Add(UIParticleRenderer.AddRenderer(this, index)); m_Renderers.Add(UIParticleRenderer.AddRenderer(this, index));
} }
if (!m_Renderers[index])
{
m_Renderers[index] = UIParticleRenderer.AddRenderer(this, index);
}
return m_Renderers[index]; return m_Renderers[index];
} }

View File

@@ -14,15 +14,14 @@ namespace Coffee.UIExtensions
internal class UIParticleRenderer : MaskableGraphic internal class UIParticleRenderer : MaskableGraphic
{ {
private static readonly CombineInstance[] s_CombineInstances = new CombineInstance[] { new CombineInstance() }; private static readonly CombineInstance[] s_CombineInstances = new CombineInstance[] { new CombineInstance() };
//private static ParticleSystem.Particle[] s_Particles = new ParticleSystem.Particle[2048];
private static readonly List<Material> s_Materials = new List<Material>(2); private static readonly List<Material> s_Materials = new List<Material>(2);
private static MaterialPropertyBlock s_Mpb; private static MaterialPropertyBlock s_Mpb;
private static readonly List<UIParticleRenderer> s_Renderers = new List<UIParticleRenderer>(); private static readonly List<UIParticleRenderer> s_Renderers = new List<UIParticleRenderer>();
private static readonly Vector3[] s_Corners = new Vector3[4];
private ParticleSystemRenderer _renderer; private ParticleSystemRenderer _renderer;
private ParticleSystem _particleSystem; private ParticleSystem _particleSystem;
internal int _prevParticleCount = 0; private int _prevParticleCount = 0;
//private ParticleSystem _emitter;
private UIParticle _parent; private UIParticle _parent;
private int _index; private int _index;
private bool _isTrail; private bool _isTrail;
@@ -33,6 +32,7 @@ namespace Coffee.UIExtensions
private bool _delay = false; private bool _delay = false;
private bool _prewarm = false; private bool _prewarm = false;
private Material _currentMaterialForRendering; private Material _currentMaterialForRendering;
private Bounds _lastBounds;
public override Texture mainTexture public override Texture mainTexture
{ {
@@ -49,6 +49,37 @@ namespace Coffee.UIExtensions
return false; return false;
} }
} }
private Rect rootCanvasRect
{
get
{
s_Corners[0] = transform.TransformPoint(_lastBounds.min.x, _lastBounds.min.y, 0);
s_Corners[1] = transform.TransformPoint(_lastBounds.min.x, _lastBounds.max.y, 0);
s_Corners[2] = transform.TransformPoint(_lastBounds.max.x, _lastBounds.max.y, 0);
s_Corners[3] = transform.TransformPoint(_lastBounds.max.x, _lastBounds.min.y, 0);
if (canvas)
{
var worldToLocalMatrix = canvas.rootCanvas.transform.worldToLocalMatrix;
for (var i = 0; i < 4; ++i)
s_Corners[i] = worldToLocalMatrix.MultiplyPoint(s_Corners[i]);
}
var corner1 = (Vector2) s_Corners[0];
var corner2 = (Vector2) s_Corners[0];
for (var i = 1; i < 4; ++i)
{
if (s_Corners[i].x < corner1.x)
corner1.x = s_Corners[i].x;
else if (s_Corners[i].x > corner2.x)
corner2.x = s_Corners[i].x;
if (s_Corners[i].y < corner1.y)
corner1.y = s_Corners[i].y;
else if (s_Corners[i].y > corner2.y)
corner2.y = s_Corners[i].y;
}
return new Rect(corner1, corner2 - corner1);
}
}
public static UIParticleRenderer AddRenderer(UIParticle parent, int index) public static UIParticleRenderer AddRenderer(UIParticle parent, int index)
{ {
@@ -123,6 +154,7 @@ namespace Coffee.UIExtensions
material = null; material = null;
workerMesh.Clear(); workerMesh.Clear();
canvasRenderer.SetMesh(workerMesh); canvasRenderer.SetMesh(workerMesh);
_lastBounds = new Bounds();
enabled = false; enabled = false;
} }
} }
@@ -188,6 +220,7 @@ namespace Coffee.UIExtensions
Profiler.BeginSample("[UIParticleRenderer] Clear Mesh"); Profiler.BeginSample("[UIParticleRenderer] Clear Mesh");
workerMesh.Clear(); workerMesh.Clear();
canvasRenderer.SetMesh(workerMesh); canvasRenderer.SetMesh(workerMesh);
_lastBounds = new Bounds();
Profiler.EndSample(); Profiler.EndSample();
return; return;
@@ -241,7 +274,7 @@ namespace Coffee.UIExtensions
} }
else else
{ {
s_CombineInstances[0].mesh.Clear(); s_CombineInstances[0].mesh.Clear(false);
} }
Profiler.EndSample(); Profiler.EndSample();
@@ -269,6 +302,7 @@ namespace Coffee.UIExtensions
extents.z = 0; extents.z = 0;
bounds.extents = extents; bounds.extents = extents;
workerMesh.bounds = bounds; workerMesh.bounds = bounds;
_lastBounds = bounds;
} }
Profiler.EndSample(); Profiler.EndSample();
@@ -286,6 +320,7 @@ namespace Coffee.UIExtensions
{ {
if (s_Renderers[i] == this) continue; if (s_Renderers[i] == this) continue;
s_Renderers[i].canvasRenderer.SetMesh(workerMesh); s_Renderers[i].canvasRenderer.SetMesh(workerMesh);
s_Renderers[i]._lastBounds = _lastBounds;
} }
if (!_parent.canRender) if (!_parent.canRender)
@@ -353,6 +388,17 @@ namespace Coffee.UIExtensions
protected override void UpdateGeometry() protected override void UpdateGeometry()
{ {
} }
public override void Cull(Rect clipRect, bool validRect)
{
var cull = _lastBounds.extents == Vector3.zero || !validRect || !clipRect.Overlaps(rootCanvasRect, true);
if (canvasRenderer.cull == cull) return;
canvasRenderer.cull = cull;
UISystemProfilerApi.AddMarker("MaskableGraphic.cullingChanged", this);
onCullStateChanged.Invoke(cull);
OnCullingChanged();
}
private Vector3 GetWorldScale() private Vector3 GetWorldScale()
{ {

View File

@@ -62,7 +62,7 @@ namespace Coffee.UIExtensions
for (var i = 0; i < s_ActiveParticles.Count; i++) for (var i = 0; i < s_ActiveParticles.Count; i++)
{ {
var uip = s_ActiveParticles[i]; var uip = s_ActiveParticles[i];
if (!uip.isPrimary || s_UpdatedGroupIds.Contains(uip.groupId)) continue; if (!uip || !uip.canvas || !uip.isPrimary || s_UpdatedGroupIds.Contains(uip.groupId)) continue;
s_UpdatedGroupIds.Add(uip.groupId); s_UpdatedGroupIds.Add(uip.groupId);
uip.UpdateTransformScale(); uip.UpdateTransformScale();
@@ -73,6 +73,8 @@ namespace Coffee.UIExtensions
for (var i = 0; i < s_ActiveParticles.Count; i++) for (var i = 0; i < s_ActiveParticles.Count; i++)
{ {
var uip = s_ActiveParticles[i]; var uip = s_ActiveParticles[i];
if (!uip || !uip.canvas) continue;
uip.UpdateTransformScale(); uip.UpdateTransformScale();
if (!uip.useMeshSharing) if (!uip.useMeshSharing)
@@ -97,7 +99,10 @@ namespace Coffee.UIExtensions
// UpdateParticleCount. // UpdateParticleCount.
for (var i = 0; i < s_ActiveParticles.Count; i++) for (var i = 0; i < s_ActiveParticles.Count; i++)
{ {
s_ActiveParticles[i].UpdateParticleCount(); var uip = s_ActiveParticles[i];
if (!uip || !uip.canvas) continue;
uip.UpdateParticleCount();
} }
} }

View File

@@ -2,7 +2,7 @@
"name": "com.coffee.ui-particle", "name": "com.coffee.ui-particle",
"displayName": "UI Particle", "displayName": "UI Particle",
"description": "This plugin provide a component to render particle effect for uGUI.\nThe particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.", "description": "This plugin provide a component to render particle effect for uGUI.\nThe particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.",
"version": "4.1.2", "version": "4.1.7",
"unity": "2018.2", "unity": "2018.2",
"license": "MIT", "license": "MIT",
"repository": { "repository": {