示例#1
0
        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;
                    }
                }
            }
        }
示例#2
0
        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--;
            }
        }
示例#3
0
                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;
                }
示例#4
0
        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--;
            }
        }