Exemplo n.º 1
0
    public override void OnInspectorGUI()
    {
        MegaWireConnectionHelper mod = (MegaWireConnectionHelper)target;

        undoManager.CheckUndo();

#if UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_2017
#else
        EditorGUIUtility.LookLikeControls();
#endif

        mod.showgizmo = EditorGUILayout.Toggle("Show Connections", mod.showgizmo);
        if (GUILayout.Button("Add Wire"))
        {
            MegaWireConnectionDef cdef = new MegaWireConnectionDef();

            if (mod.connections.Count > 0)
            {
                MegaWireConnectionDef last = mod.connections[mod.connections.Count - 1];
                cdef.inOffset  = last.inOffset;
                cdef.outOffset = last.outOffset;
                cdef.radius    = last.radius;
            }
            mod.connections.Add(cdef);
        }

        for (int i = 0; i < mod.connections.Count; i++)
        {
            MegaWireConnectionDef con = mod.connections[i];
            EditorGUILayout.BeginVertical("box");

            con.radius    = EditorGUILayout.FloatField("Radius", con.radius);
            con.outOffset = EditorGUILayout.Vector3Field("Out Offset", con.outOffset);
            con.inOffset  = EditorGUILayout.Vector3Field("In Offset", con.inOffset);

            if (GUILayout.Button("Delete"))
            {
                if (mod.connections.Count > 1)
                {
                    mod.connections.RemoveAt(i);
                }
            }
            EditorGUILayout.EndVertical();
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }

        undoManager.CheckDirty();
    }
Exemplo n.º 2
0
    public void OnSceneGUI()
    {
        MegaWireConnectionHelper mod = (MegaWireConnectionHelper)target;

        if (mod.showgizmo)
        {
            Handles.matrix = mod.transform.localToWorldMatrix;

            for (int i = 0; i < mod.connections.Count; i++)
            {
                MegaWireConnectionDef con = mod.connections[i];

                con.inOffset  = Handles.PositionHandle(con.inOffset, Quaternion.identity);
                con.outOffset = Handles.PositionHandle(con.outOffset, Quaternion.identity);
                Handles.Label(con.inOffset, "in " + i);
                Handles.Label(con.outOffset, "out " + i);
            }
        }
    }
Exemplo n.º 3
0
    // each wire length should have a very simple script attached that can do onvisible etc
    // to turn off the updates, other than that all updates should be done from MegaWire
    static public MegaWire Create(MegaWire wire, List <GameObject> objs, Material mat, string name, MegaWire copyfrom, float wiresize, float str)
    {
        //MegaWire wire = null;

        if (objs != null && objs.Count > 1)
        {
            GameObject newwire = null;

            if (wire == null)
            {
                newwire      = new GameObject();
                newwire.name = name;

                wire = newwire.AddComponent <MegaWire>();

                wire.material = mat;
                wire.stretch  = str;
            }
            else
            {
                newwire = wire.gameObject;
            }

            wire.poles.Clear();
            wire.spans.Clear();
            wire.connections.Clear();
            wire.poles.Add(objs[0].transform);

            bool hide = true;
            if (copyfrom)
            {
                hide = copyfrom.hidespans;
            }

            // Make the connections, each connection is a new gameobject child of the wire object
            for (int i = 0; i < objs.Count - 1; i++)
            {
                GameObject pole = new GameObject();

                if (hide)
                {
                    pole.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector | HideFlags.NotEditable;
                }
                pole.name = name + " Span Mesh " + i;

                pole.transform.parent = newwire.transform;

                MegaWireSpan span = pole.AddComponent <MegaWireSpan>();

                span.start = objs[i].transform;
                span.end   = objs[i + 1].transform;

                MeshFilter mf = pole.GetComponent <MeshFilter>();

                mf.sharedMesh = new Mesh();
                MeshRenderer mr = pole.GetComponent <MeshRenderer>();

                Material[] mats = new Material[1];
                mats[0]            = wire.material;
                mr.sharedMaterials = mats;

                span.mesh      = mf.sharedMesh;
                span.mesh.name = name + " Wire Mesh " + i;
                span.Init(wire);
                wire.spans.Add(span);

                wire.poles.Add(objs[i + 1].transform);
            }

            MegaWireConnectionHelper helper = objs[0].GetComponent <MegaWireConnectionHelper>();

            if (copyfrom)
            {
                wire.Copy(copyfrom, helper);
            }
            else
            {
                // Check if any pole has a helper on it, if so use that
                if (helper)
                {
                    wire.Copy(wire, helper);
                }
                else
                {
                    // Add the first connection
                    MegaWireConnectionDef con = new MegaWireConnectionDef();
                    wire.connections.Add(con);
                }
            }

            if (wiresize != 1.0f)
            {
                for (int i = 0; i < wire.connections.Count; i++)
                {
                    wire.connections[i].radius *= wiresize;
                }
            }

            wire.Init();
        }

        return(wire);
    }
Exemplo n.º 4
0
 public MegaWireConnectionDef(MegaWireConnectionDef src)
 {
     inOffset  = src.inOffset;
     outOffset = src.outOffset;
     radius    = src.radius;
 }
    public override void OnInspectorGUI()
    {
        MegaWire mod = (MegaWire)target;

        undoManager.CheckUndo();

#if UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_2017
#else
        EditorGUIUtility.LookLikeControls();
#endif

        MegaWire.DisableAll = EditorGUILayout.Toggle("Disable All", MegaWire.DisableAll);

        if (GUILayout.Button("Rebuild"))
        {
            mod.Rebuild = true;
            mod.RebuildWire();
        }

        mod.warmPhysicsTime = EditorGUILayout.FloatField("Warm Physics Time", mod.warmPhysicsTime);
        if (GUILayout.Button("Run Physics"))
        {
            mod.RunPhysics(mod.warmPhysicsTime);
        }

        if (GUILayout.Button("Open Select Window"))
        {
        }

        if (GUILayout.Button("Add Wire"))
        {
            MegaWireConnectionDef last = mod.connections[mod.connections.Count - 1];
            MegaWireConnectionDef cdef = new MegaWireConnectionDef();
            cdef.inOffset  = last.inOffset;
            cdef.outOffset = last.outOffset;
            cdef.radius    = last.radius;
            mod.connections.Add(cdef);
            mod.RebuildWire();
            mod.Rebuild = true;
        }

        mod.Enabled = EditorGUILayout.Toggle("Enabled", mod.Enabled);

        bool ShowWire = EditorGUILayout.Toggle("Show Wire", mod.ShowWire);
        if (ShowWire != mod.ShowWire)
        {
            mod.ShowWire = ShowWire;
            mod.SetWireVisible(ShowWire);
        }
        // Lod params
        mod.disableOnDistance = EditorGUILayout.BeginToggleGroup("Disable On Dist", mod.disableOnDistance);
        mod.disableDist       = EditorGUILayout.FloatField("Disable Dist", mod.disableDist);
        EditorGUILayout.EndToggleGroup();

        mod.disableOnNotVisible = EditorGUILayout.Toggle("Disable On InVisible", mod.disableOnNotVisible);

        // Physics data
        mod.showphysics = EditorGUILayout.Foldout(mod.showphysics, "Physics Params");

        if (mod.showphysics)
        {
            EditorGUILayout.BeginVertical("box");

            int points = EditorGUILayout.IntSlider("Masses", mod.points, 2, 20);
            if (points != mod.points)
            {
                mod.points = points;
                mod.RebuildWire();
            }

            float Mass = EditorGUILayout.FloatField("Mass", mod.Mass);
            if (Mass != mod.Mass)
            {
                mod.Mass = Mass;
                mod.RebuildWire();
            }

            float massrnd = EditorGUILayout.FloatField("Mass Random", mod.massRand);
            if (massrnd != mod.massRand)
            {
                mod.massRand = massrnd;
                mod.RebuildWire();
            }

            float spring = EditorGUILayout.FloatField("Spring", mod.spring);
            if (spring != mod.spring)
            {
                mod.spring = spring;
                mod.RebuildWire();
            }

            float damp = EditorGUILayout.FloatField("Damp", mod.damp);
            if (damp != mod.damp)
            {
                mod.damp = damp;
                mod.RebuildWire();
            }

            float stretch = EditorGUILayout.FloatField("Stretch", mod.stretch);
            if (stretch != mod.stretch)
            {
                mod.stretch = stretch;
                mod.ChangeStretch(stretch);
            }

            mod.gravity = EditorGUILayout.Vector3Field("Gravity", mod.gravity);
            mod.airdrag = EditorGUILayout.Slider("Aero Drag", mod.airdrag, 0.0f, 1.0f);

            // These require a rebuild
            bool lencon = EditorGUILayout.Toggle("Length Constraints", mod.lengthConstraints);
            if (lencon != mod.lengthConstraints)
            {
                mod.lengthConstraints = lencon;
                mod.RebuildWire();
            }

            bool stiff = EditorGUILayout.BeginToggleGroup("Stiff Springs", mod.stiffnessSprings);
            if (stiff != mod.stiffnessSprings)
            {
                mod.stiffnessSprings = stiff;
                mod.RebuildWire();
            }

            float stiffrate = EditorGUILayout.FloatField("Stiff Rate", mod.stiffrate);
            if (stiffrate != mod.stiffrate)
            {
                mod.stiffrate = stiffrate;
                mod.RebuildWire();
            }

            float stiffdamp = EditorGUILayout.FloatField("Stiff Damp", mod.stiffdamp);
            if (stiffdamp != mod.stiffdamp)
            {
                mod.stiffdamp = stiffdamp;
                mod.RebuildWire();
            }
            EditorGUILayout.EndToggleGroup();

            mod.doCollisions = EditorGUILayout.BeginToggleGroup("Do Collisions", mod.doCollisions);
            mod.useraycast   = EditorGUILayout.Toggle("Use RayCast", mod.useraycast);

            if (mod.useraycast)
            {
                mod.collisionoff  = EditorGUILayout.FloatField("Collision Offset", mod.collisionoff);
                mod.collisiondist = EditorGUILayout.FloatField("Collision Dist", mod.collisiondist);
                mod.collisionmask = LayerMaskField("Mask", mod.collisionmask);
            }
            else
            {
                mod.floor = EditorGUILayout.FloatField("Floor", mod.floor);
            }

            EditorGUILayout.EndToggleGroup();

            mod.showWindParams = EditorGUILayout.Foldout(mod.showWindParams, "Wind Params");
            if (mod.showWindParams)
            {
                mod.wind         = (MegaWireWind)EditorGUILayout.ObjectField("Wind Src", mod.wind, typeof(MegaWireWind), true);
                MegaWire.windDir = EditorGUILayout.Vector3Field("Wind Dir", MegaWire.windDir);
                MegaWire.windFrc = EditorGUILayout.FloatField("Wind Frc", MegaWire.windFrc);
                mod.windEffect   = EditorGUILayout.FloatField("Wind Effect", mod.windEffect);
            }

            mod.showPhysicsAdv = EditorGUILayout.Foldout(mod.showPhysicsAdv, "Advanced Params");
            if (mod.showPhysicsAdv)
            {
                mod.timeStep  = EditorGUILayout.FloatField("Time Step", mod.timeStep);
                mod.fudge     = EditorGUILayout.FloatField("Time Mult", mod.fudge);
                mod.startTime = EditorGUILayout.FloatField("Start Time", mod.startTime);
                mod.awakeTime = EditorGUILayout.FloatField("Awake Time", mod.awakeTime);
                mod.frameWait = EditorGUILayout.IntField("Frame Wait", mod.frameWait);
                mod.frameNum  = EditorGUILayout.IntField("Frame Num", mod.frameNum);

                mod.iters = EditorGUILayout.IntSlider("Constraint Iters", mod.iters, 1, 8);
            }

            EditorGUILayout.EndVertical();
        }

        // Meshing options
        mod.showmeshparams = EditorGUILayout.Foldout(mod.showmeshparams, "Mesh Params");
        if (mod.showmeshparams)
        {
            EditorGUILayout.BeginVertical("box");

            Material mat = (Material)EditorGUILayout.ObjectField("Material", mod.material, typeof(Material), true);
            if (mat != mod.material)
            {
                mod.material = mat;
                for (int i = 0; i < mod.spans.Count; i++)
                {
                    Renderer rend = mod.spans[i].GetComponent <Renderer>();
                    if (rend)
                    {
                        rend.sharedMaterial = mat;
                    }
                }
            }
            mod.strandedMesher.sides        = EditorGUILayout.IntSlider("Sides", mod.strandedMesher.sides, 2, 32);
            mod.strandedMesher.segments     = EditorGUILayout.IntSlider("Segments", mod.strandedMesher.segments, 1, 64);
            mod.strandedMesher.SegsPerUnit  = EditorGUILayout.FloatField("Segs Per Unit", mod.strandedMesher.SegsPerUnit);
            mod.strandedMesher.strands      = EditorGUILayout.IntSlider("Strands", mod.strandedMesher.strands, 1, 8);
            mod.strandedMesher.offset       = EditorGUILayout.FloatField("Offset", mod.strandedMesher.offset);
            mod.strandedMesher.strandRadius = EditorGUILayout.FloatField("Strand Radius", mod.strandedMesher.strandRadius);

            mod.strandedMesher.Twist        = EditorGUILayout.FloatField("Twist", mod.strandedMesher.Twist);
            mod.strandedMesher.TwistPerUnit = EditorGUILayout.FloatField("Twist Per Unit", mod.strandedMesher.TwistPerUnit);

            bool genuv = EditorGUILayout.BeginToggleGroup("Gen UV", mod.strandedMesher.genuv);
            if (genuv != mod.strandedMesher.genuv)
            {
                mod.strandedMesher.genuv = genuv;
                mod.builduvs             = true;
            }

            float uvtwist = EditorGUILayout.FloatField("UV Twist", mod.strandedMesher.uvtwist);
            if (uvtwist != mod.strandedMesher.uvtwist)
            {
                mod.strandedMesher.uvtwist = uvtwist;
                mod.builduvs = true;
            }

            float uvtilex = EditorGUILayout.FloatField("UV Tile X", mod.strandedMesher.uvtilex);
            if (uvtilex != mod.strandedMesher.uvtilex)
            {
                mod.strandedMesher.uvtilex = uvtilex;
                mod.builduvs = true;
            }

            float uvtiley = EditorGUILayout.FloatField("UV Tile Y", mod.strandedMesher.uvtiley);
            if (uvtiley != mod.strandedMesher.uvtiley)
            {
                mod.strandedMesher.uvtiley = uvtiley;
                mod.builduvs = true;
            }
            EditorGUILayout.EndToggleGroup();

            mod.strandedMesher.linInterp    = EditorGUILayout.Toggle("Linear Interp", mod.strandedMesher.linInterp);
            mod.strandedMesher.calcBounds   = EditorGUILayout.Toggle("Calc Bounds", mod.strandedMesher.calcBounds);
            mod.strandedMesher.calcTangents = EditorGUILayout.Toggle("Calc Tangents", mod.strandedMesher.calcTangents);

            int vcount = mod.GetVertexCount();
            EditorGUILayout.LabelField("Vertex Count: " + vcount);
            EditorGUILayout.EndVertical();
        }

        mod.showconnections = EditorGUILayout.Foldout(mod.showconnections, "Connections");

        if (mod.showconnections)
        {
            for (int i = 0; i < mod.connections.Count; i++)
            {
                MegaWireConnectionDef con = mod.connections[i];
                EditorGUILayout.BeginVertical("box");

                float radius = EditorGUILayout.FloatField("Radius", con.radius);
                if (radius != con.radius)
                {
                    con.radius = radius;
                }

                Vector3 outOffset = EditorGUILayout.Vector3Field("Out Offset", con.outOffset);
                if (outOffset != con.outOffset)
                {
                    con.outOffset = outOffset;

                    mod.Rebuild = true;
                }

                Vector3 inOffset = EditorGUILayout.Vector3Field("In Offset", con.inOffset);
                if (inOffset != con.inOffset)
                {
                    con.inOffset = inOffset;
                    mod.Rebuild  = true;
                }

                if (GUILayout.Button("Delete"))
                {
                    if (mod.connections.Count > 1)
                    {
                        mod.connections.RemoveAt(i);
                        mod.RebuildWire();
                        mod.Rebuild = true;
                    }
                }

                EditorGUILayout.EndVertical();
            }
        }

        bool hidespans = EditorGUILayout.Toggle("Hide Spans", mod.hidespans);
        if (hidespans != mod.hidespans)
        {
            mod.hidespans = hidespans;
            mod.SetHidden(mod.hidespans);
            EditorApplication.RepaintHierarchyWindow();
        }

        mod.displayGizmo = EditorGUILayout.BeginToggleGroup("Show Gizmos", mod.displayGizmo);
        mod.gizmoColor   = EditorGUILayout.ColorField("Gizmo Color", mod.gizmoColor);
        EditorGUILayout.EndToggleGroup();

        mod.showAttach = EditorGUILayout.Foldout(mod.showAttach, "Span Connections");

        if (mod.showAttach)
        {
            EditorGUILayout.BeginVertical("Box");
            for (int i = 0; i < mod.spans.Count; i++)
            {
                if (i > 0)
                {
                    EditorGUILayout.Separator();
                }

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Start", GUILayout.MaxWidth(40.0f));
                for (int c = 0; c < mod.spans[i].connections.Count; c++)
                {
                    bool active = EditorGUILayout.Toggle(mod.spans[i].connections[c].constraints[0].active, GUILayout.MaxWidth(10.0f));
                    if (active != mod.spans[i].connections[c].constraints[0].active)
                    {
                        mod.spans[i].connections[c].SetEndConstraintActive(0, active, 2.0f);
                    }
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("End", GUILayout.MaxWidth(40.0f));
                for (int c = 0; c < mod.spans[i].connections.Count; c++)
                {
                    bool active = EditorGUILayout.Toggle(mod.spans[i].connections[c].constraints[1].active, GUILayout.MaxWidth(10.0f));
                    if (active != mod.spans[i].connections[c].constraints[1].active)
                    {
                        mod.spans[i].connections[c].SetEndConstraintActive(1, active, 2.0f);
                    }
                }
                EditorGUILayout.EndHorizontal();
            }
            EditorGUILayout.EndVertical();
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }

        undoManager.CheckDirty();
    }