public void OnBeforeSerialize() { Neutrino.Effect effect = neutrinoEffect_; if (effect == null) { return; } serializableEffect_.emitters_.Clear(); for (int emitterIndex = 0; emitterIndex < effect.numEmitters(); ++emitterIndex) { Neutrino.Emitter emitter = effect.emitter(emitterIndex); var serialEmitter = new SerializableEmitter(); serialEmitter.name_ = emitter.model().name(); serialEmitter.paused_ = emitter.paused(); serialEmitter.generatorsPaused_ = emitter.generatorsPaused(); serializableEffect_.emitters_.Add(serialEmitter); for (int propIndex = 0; propIndex < emitter.model().numProperties(); ++propIndex) { var serialProp = new SerializableProperty(); serialProp.name_ = emitter.model().propertyName(propIndex); serialEmitter.properties_.Add(serialProp); switch (emitter.model().propertyType(propIndex)) { case Neutrino.EmitterModel.PropertyType.FLOAT: { float value = (float)emitter.propertyValue(propIndex); serialProp.value_.Add(value); } break; case Neutrino.EmitterModel.PropertyType.VEC2: { _math.vec2 value = (_math.vec2)emitter.propertyValue(propIndex); serialProp.value_.Add(value.x); serialProp.value_.Add(value.y); } break; case Neutrino.EmitterModel.PropertyType.VEC3: { _math.vec3 value = (_math.vec3)emitter.propertyValue(propIndex); serialProp.value_.Add(value.x); serialProp.value_.Add(value.y); serialProp.value_.Add(value.z); } break; case Neutrino.EmitterModel.PropertyType.QUAT: // none until inspector is ready for quaternions break; } } } }
public override void OnInspectorGUI() { base.OnInspectorGUI(); NeutrinoRenderer renderer = (NeutrinoRenderer)target; Neutrino.Effect effect = renderer.neutrinoEffect(); if (effect == null) { return; } GUILayout.BeginHorizontal(); if (GUILayout.Button("Restart")) { renderer.reset(); } bool paused = renderer.paused(); if (GUILayout.Button(paused ? "Unpause" : "Pause")) { Undo.RecordObject(renderer, paused ? "Unpause particle effect" : "Pause particles effect"); if (paused) { renderer.unpause(); } else { renderer.pause(); } } bool generatorsPaused = renderer.generatorsPaused(); if (GUILayout.Button(generatorsPaused ? "Unpause generation" : "Pause generation")) { Undo.RecordObject(renderer, generatorsPaused ? "Unpause generation in particle effect" : "Pause generation in particles effect"); if (generatorsPaused) { renderer.unpauseGenerators(); } else { renderer.pauseGenerators(); } } GUILayout.EndHorizontal(); for (int emitterIndex = 0; emitterIndex < effect.numEmitters(); ++emitterIndex) { Neutrino.Emitter emitter = effect.emitter(emitterIndex); if (emitter.model().numProperties() == 0) { continue; } EditorGUILayout.Space(); EditorGUILayout.LabelField(emitter.model().name()); EditorGUI.indentLevel++; for (int propIndex = 0; propIndex < emitter.model().numProperties(); ++propIndex) { string name = emitter.model().propertyName(propIndex); switch (emitter.model().propertyType(propIndex)) { case Neutrino.EmitterModel.PropertyType.FLOAT: { float valueBefore = (float)emitter.propertyValue(propIndex); float valueAfter = EditorGUILayout.FloatField(name, valueBefore); emitter.setPropertyValue(propIndex, valueAfter); } break; case Neutrino.EmitterModel.PropertyType.VEC2: { _math.vec2 valueBefore = (_math.vec2)emitter.propertyValue(propIndex); UnityEngine.Vector2 valueAfter = EditorGUILayout.Vector2Field(name, new UnityEngine.Vector2(valueBefore.x, valueBefore.y)); emitter.setPropertyValue(propIndex, _math.vec2_(valueAfter.x, valueAfter.y)); } break; case Neutrino.EmitterModel.PropertyType.VEC3: { _math.vec3 valueBefore = (_math.vec3)emitter.propertyValue(propIndex); UnityEngine.Vector3 valueAfter = EditorGUILayout.Vector3Field(name, new UnityEngine.Vector3(valueBefore.x, valueBefore.y, valueBefore.z)); emitter.setPropertyValue(propIndex, _math.vec3_(valueAfter.x, valueAfter.y, valueAfter.z)); } break; case Neutrino.EmitterModel.PropertyType.QUAT: break; } } EditorGUI.indentLevel--; } }
public override void updateParticle(Emitter emitter, Particle particle, float dt) { ParticleImpl particleImpl = (ParticleImpl)particle; EmitterData emitterData = (EmitterData)emitter.data(); GeneratorPeriodic generator = (GeneratorPeriodic)emitter.generator(); GeneratorImpl generatorImpl = (GeneratorImpl)generator.impl(); particleImpl._lifetime += dt; _math.vec3 value_ = _math.vec3_(0F, 800F, 0F); _math.vec3 noise_a = _math.mulv3scalar_(_math.vec3_(100F, 50F, 30F), emitter.effect().time()); _math.addv3(out noise_a, noise_a, particleImpl._Position); _math.vec3 noise_i = _math.mulv3scalar_(noise_a, 1.0F / 1000F); _math.vec3 noise = _math.noisePixelLinear3_(noise_i); _math.mulv3(out noise, noise, _math.vec3_(0.0078125F, 0.0078125F, 0.0078125F)); _math.addv3(out noise, noise, _math.vec3_(-1F, -1F, -1F)); _math.mulv3scalar(out noise, noise, 1200F); _math.vec3 fmove_fs = value_; _math.addv3(out fmove_fs, fmove_fs, noise); _math.vec3 fmove_vs = _math.vec3_(0F, 0F, 0F); float fmove_dtl = dt; _math.vec3 fmove_v = particleImpl._Velocity; _math.vec3 fmove_p = particleImpl._Position; while (fmove_dtl > 0.0001F) { float fmove_dtp = fmove_dtl; _math.vec3 fmove_fsd = fmove_fs; _math.vec3 fmove_rw = _math.subv3_(fmove_vs, fmove_v); float fmove_rwl = _math.lengthv3sq_(fmove_rw); if (fmove_rwl > 0.0001F) { fmove_rwl = (float)Math.Sqrt(fmove_rwl); _math.vec3 fmove_rwn = _math.divv3scalar_(fmove_rw, fmove_rwl); float fmove_df = 0.01F * 1F * fmove_rwl; if (fmove_df * fmove_dtp > 0.2F) { fmove_dtp = 0.2F / fmove_df; } _math.addv3(out fmove_fsd, fmove_fsd, _math.mulv3scalar_(fmove_rwn, fmove_rwl * fmove_df)); } _math.addv3(out fmove_v, fmove_v, _math.mulv3scalar_(fmove_fsd, fmove_dtp)); _math.addv3(out fmove_p, fmove_p, _math.mulv3scalar_(fmove_v, fmove_dtp)); fmove_dtl -= fmove_dtp; } particleImpl._Position = fmove_p; particleImpl._Velocity = fmove_v; particle.position_ = particleImpl._Position; if (particleImpl._lifetime > particleImpl._Max_Life) { particle.dead_ = true; } _math.vec2 value_a = _math.vec2_(6F, 6F); float _plot_out; float _plot_in0 = (particleImpl._lifetime < 0F?0F:(particleImpl._lifetime > 1.35236F?(0F + ((particleImpl._lifetime - 0F) % 1.35236F)):particleImpl._lifetime)); _math.PathRes _plot_srch0 = _plot_in0 < 0.739748?_plot_in0 < 0.4?_plot_in0 < 0.1?_math.pathRes(0, (_plot_in0 - 0F) * 10F):_math.pathRes(1, (_plot_in0 - 0.1F) * 3.33333F):_plot_in0 < 0.558348?_math.pathRes(2, (_plot_in0 - 0.4F) * 6.3152F):_math.pathRes(3, (_plot_in0 - 0.558348F) * 5.51269F):_plot_in0 < 1.03367?_plot_in0 < 0.833292?_math.pathRes(4, (_plot_in0 - 0.739748F) * 10.6901F):_math.pathRes(5, (_plot_in0 - 0.833292F) * 4.99066F):_plot_in0 < 1.2?_math.pathRes(6, (_plot_in0 - 1.03367F) * 6.01203F):_math.pathRes(7, (_plot_in0 - 1.2F) * 6.56334F); _math.funcLerp(out _plot_out, this._plot[0][_plot_srch0.s], _plot_srch0.i); particleImpl.size2_ = value_a; particleImpl.alpha_ = _plot_out; }
public override void OnInspectorGUI() { base.OnInspectorGUI(); NeutrinoRenderer renderer = (NeutrinoRenderer)target; Neutrino.Effect effect = renderer.neutrinoEffect(); for (int emitterIndex = 0; emitterIndex < effect.numEmitters(); ++emitterIndex) { Neutrino.Emitter emitter = effect.emitter(emitterIndex); if (emitter.model().numProperties() == 0) { continue; } EditorGUILayout.Space(); EditorGUILayout.LabelField(emitter.model().name()); EditorGUI.indentLevel++; for (int propIndex = 0; propIndex < emitter.model().numProperties(); ++propIndex) { string name = emitter.model().propertyName(propIndex); switch (emitter.model().propertyType(propIndex)) { case Neutrino.EmitterModel.PropertyType.FLOAT: { float valueBefore = (float)emitter.propertyValue(propIndex); float valueAfter = EditorGUILayout.FloatField(name, valueBefore); emitter.setPropertyValue(propIndex, valueAfter); } break; case Neutrino.EmitterModel.PropertyType.VEC2: { _math.vec2 valueBefore = (_math.vec2)emitter.propertyValue(propIndex); UnityEngine.Vector2 valueAfter = EditorGUILayout.Vector2Field(name, new UnityEngine.Vector2(valueBefore.x, valueBefore.y)); emitter.setPropertyValue(propIndex, _math.vec2_(valueAfter.x, valueAfter.y)); } break; case Neutrino.EmitterModel.PropertyType.VEC3: { _math.vec3 valueBefore = (_math.vec3)emitter.propertyValue(propIndex); UnityEngine.Vector3 valueAfter = EditorGUILayout.Vector3Field(name, new UnityEngine.Vector3(valueBefore.x, valueBefore.y, valueBefore.z)); emitter.setPropertyValue(propIndex, _math.vec3_(valueAfter.x, valueAfter.y, valueAfter.z)); } break; case Neutrino.EmitterModel.PropertyType.QUAT: break; } } EditorGUI.indentLevel--; } }