Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions Editor/BufferParticleCreator.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor;
using UnityEngine;

namespace VRLabs.ParticleBufferer
{
public class BufferParticleCreator
{
public static ParticleSystem CreateBufferParticleFromTarget(ParticleSystem particle)
public static ParticleSystem CreateBufferParticleFromTarget(ParticleSystem particle, bool withRenderer)
{
Undo.RecordObject(particle, "Create Particle From Target");

ApplySubParticleSettings(particle);
particle.gameObject.SetActive(true);

var bufferParticle = CreateBufferParticleBase();
var bufferParticle = CreateBufferParticleBase(withRenderer);
CopyTransformSettings(particle.transform, bufferParticle.transform);
bufferParticle.transform.rotation = Quaternion.identity;
GameObjectUtility.EnsureUniqueNameForSibling(bufferParticle.gameObject);
Expand All @@ -24,7 +23,7 @@ public static ParticleSystem CreateBufferParticleFromTarget(ParticleSystem parti
return bufferParticle;
}

public static void CreateDefaultBufferParticle(out ParticleSystem bufferParticle, out ParticleSystem subParticle)
public static void CreateDefaultBufferParticle(out ParticleSystem bufferParticle, out ParticleSystem subParticle, bool withRenderer)
{
var subGameObject = new GameObject("Sub Particle");
subParticle = subGameObject.AddComponent<ParticleSystem>();
Expand All @@ -43,24 +42,28 @@ public static void CreateDefaultBufferParticle(out ParticleSystem bufferParticle
emission.SetBursts(new []{new ParticleSystem.Burst(0,1)});
#endregion

bufferParticle = CreateBufferParticleFromTarget(subParticle);
bufferParticle = CreateBufferParticleFromTarget(subParticle, withRenderer);
}

public static ParticleSystem CreateBufferParticleBase()
public static ParticleSystem CreateBufferParticleBase(bool withRenderer)
{
GameObject bufferParticleObject = new GameObject("Buffer Particle");
Undo.RegisterCreatedObjectUndo(bufferParticleObject, "Create Buffer Particle");
bufferParticleObject.SetActive(false);
ParticleSystem bufferParticle = bufferParticleObject.AddComponent<ParticleSystem>();
Object.DestroyImmediate(bufferParticleObject.GetComponent<ParticleSystemRenderer>());


if (withRenderer)
bufferParticle.GetComponent<ParticleSystemRenderer>().enabled = false;
else
Object.DestroyImmediate(bufferParticleObject.GetComponent<ParticleSystemRenderer>());

#region Buffer Particle Settings
var main = bufferParticle.main;
main.duration = 1;
main.playOnAwake = true;
main.loop = false;
main.startLifetime = 1000;
main.startSpeed = 0.0001f;
main.startSpeed = 0.001f;
main.maxParticles = 1;

var em = bufferParticle.emission;
Expand All @@ -69,6 +72,10 @@ public static ParticleSystem CreateBufferParticleBase()

var shape = bufferParticle.shape;
shape.enabled = false;

if (withRenderer)
bufferParticle.GetComponent<ParticleSystemRenderer>().renderMode = ParticleSystemRenderMode.None;

#endregion

return bufferParticle;
Expand Down
74 changes: 64 additions & 10 deletions Editor/ParticleBufferer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,21 @@ static ParticleBufferer ()
#region Validation

public static bool SelectionHasParticleSystem() => Selection.gameObjects.Any(go => go != null && go.GetComponent<ParticleSystem>() != null);

public static bool SelectionHasParticleSystemWithRenderer() => Selection.gameObjects.Any(go => go != null && go.GetComponent<ParticleSystem>() != null && go.GetComponent<ParticleSystemRenderer>() != null);
public static bool SelectionHasParticleSystemWithNoRenderer() => Selection.gameObjects.Any(go => go != null && go.GetComponent<ParticleSystem>() != null && go.GetComponent<ParticleSystemRenderer>() == null);

[MenuItem("GameObject/Effects/Buffer Particle/From Selected", true, 1000)]
public static bool CreateBufferParticleFromSelectedValidate() => SelectionHasParticleSystem();

[MenuItem("GameObject/Effects/Buffer Particle/For Each Selected", true, 1001)]
public static bool CreateBufferParticleForEachSelectedValidate() => SelectionHasParticleSystem();


[MenuItem("GameObject/Effects/Particle System Renderer/Add Renderer", true, 1003)]
public static bool AddParticleSystemRendererValidate() => SelectionHasParticleSystem() && SelectionHasParticleSystemWithNoRenderer();

[MenuItem("GameObject/Effects/Particle System Renderer/Remove Renderer", true, 1004)]
public static bool RemoveParticleSystemRendererValidate() => SelectionHasParticleSystem() && SelectionHasParticleSystemWithRenderer();

#endregion

[MenuItem("GameObject/Effects/Buffer Particle/From Selected", false, 1000)]
Expand All @@ -38,7 +46,7 @@ public static void CreateBufferParticleFromSelected()

ParticleSystem firstParticle = particles.Aggregate((c, d) => c.transform.GetSiblingIndex() < d.transform.GetSiblingIndex() ? c : d); // Get the lowest sibling index particle

var bufferParticle = BufferParticleCreator.CreateBufferParticleFromTarget(firstParticle);
var bufferParticle = BufferParticleCreator.CreateBufferParticleFromTarget(firstParticle, withRenderer: true);

var subEmitterModule = bufferParticle.subEmitters;
for (int i = 0; i < particles.Count; i++)
Expand All @@ -65,34 +73,34 @@ public static void CreateBufferParticleForEachSelected()

foreach (var subParticle in particles)
{
ParticleSystem bufferParticle = BufferParticleCreator.CreateBufferParticleFromTarget(subParticle);
ParticleSystem bufferParticle = BufferParticleCreator.CreateBufferParticleFromTarget(subParticle, withRenderer: true);
UpdateAnimationsForParticles(bufferParticle, new []{subParticle});
}

}

[MenuItem("GameObject/Effects/Buffer Particle/Empty", false, 1002)]
public static void CreateBufferParticleFromEmpty()
{
if (doneThisFrame) return;
doneThisFrame = true;
var targets = Selection.gameObjects.Any() ? Selection.gameObjects : new GameObject[] {null};

var targets = Selection.gameObjects.Any() ? Selection.gameObjects : new GameObject[] { null };
foreach (var go in targets)
{
Transform parent = go == null ? null : go.transform;
BufferParticleCreator.CreateDefaultBufferParticle(out var bufferParticle, out var subParticle);
BufferParticleCreator.CreateDefaultBufferParticle(out var bufferParticle, out var subParticle, withRenderer: true);

if (parent == null)
{
GameObjectUtility.EnsureUniqueNameForSibling(bufferParticle.gameObject);
GameObjectUtility.EnsureUniqueNameForSibling(subParticle.gameObject);
continue;
}

BufferParticleCreator.CopyTransformSettings(parent, bufferParticle.transform);
BufferParticleCreator.CopyTransformSettings(bufferParticle.transform, subParticle.transform);

bufferParticle.transform.parent = parent;
subParticle.transform.parent = parent;
bufferParticle.transform.rotation = Quaternion.identity;
Expand All @@ -102,6 +110,52 @@ public static void CreateBufferParticleFromEmpty()
}
}

[MenuItem("GameObject/Effects/Particle System Renderer/Add Renderer", false, 1003)]
public static void AddParticleSystemRenderer()
{
if (doneThisFrame) return;
doneThisFrame = true;

var particles = Selection.gameObjects.Select(go => go == null ? null : go.GetComponent<ParticleSystem>()).Where(ps => ps != null).ToList();
if (!particles.Any()) return;

foreach (var particle in particles)
{
if (particle.gameObject.GetComponent<ParticleSystem>() != null)
{
if (particle.gameObject.GetComponent<ParticleSystemRenderer>() == null)
{
Undo.AddComponent<ParticleSystemRenderer>(particle.gameObject);

if (particle.GetComponent<ParticleSystemRenderer>() != null)
{
particle.GetComponent<ParticleSystemRenderer>().enabled = false;
particle.GetComponent<ParticleSystemRenderer>().renderMode = ParticleSystemRenderMode.None;
}
}
}
}
}

[MenuItem("GameObject/Effects/Particle System Renderer/Remove Renderer", false, 1004)]
public static void RemoveParticleSystemRenderer()
{
if (doneThisFrame) return;
doneThisFrame = true;

var particles = Selection.gameObjects.Select(go => go == null ? null : go.GetComponent<ParticleSystem>()).Where(ps => ps != null).ToList();
if (!particles.Any()) return;

foreach (var particle in particles)
{
if (particle.gameObject.GetComponent<ParticleSystem>() != null)
{
if (particle.gameObject.GetComponent<ParticleSystemRenderer>() != null)
Undo.DestroyObjectImmediate(particle.gameObject.GetComponent<ParticleSystemRenderer>());
}
}
}

public static void UpdateAnimationsForParticles(ParticleSystem bufferParticle, ParticleSystem[] subParticles)
{
#if VRCHAT_AVATARS
Expand Down