Exemple #1
0
        public void CreateMeshes()
        {
            List <GameObject> used = new List <GameObject>();

            for (int i = 0; i < spline.GetCurves().Count; i++)
            {
                var curve = spline.GetCurves()[i];
                foreach (var tm in segments[i].transformedMeshes)
                {
                    if (tm.mesh == null)
                    {
                        // if there is no mesh specified for this segment, we ignore it.
                        continue;
                    }

                    // we try to find a game object previously generated. this avoids destroying/creating
                    // game objects at each update, wich is faster.
                    var        childName      = "segment " + i + " mesh " + segments[i].transformedMeshes.IndexOf(tm);
                    var        childTransform = generated.transform.Find(childName);
                    GameObject go;
                    if (childTransform == null)
                    {
                        go = UOUtility.Create(childName,
                                              generated,
                                              typeof(MeshFilter),
                                              typeof(MeshRenderer),
                                              typeof(MeshBender),
                                              typeof(MeshCollider));
                        go.isStatic = true;
                    }
                    else
                    {
                        go = childTransform.gameObject;
                    }
                    go.GetComponent <MeshRenderer>().material = tm.material;
                    go.GetComponent <MeshCollider>().material = tm.physicMaterial;

                    // we update the data in the bender. It will decide itself if the bending must be recalculated.
                    MeshBender mb = go.GetComponent <MeshBender>();
                    mb.Source      = tm.mesh;
                    mb.Curve       = curve;
                    mb.Translation = tm.translation;
                    mb.Rotation    = Quaternion.Euler(tm.rotation);
                    mb.Scale       = tm.scale;
                    mb.ComputeIfNeeded();
                    used.Add(go);
                }
            }

            // finally, we destroy the unused objects
            foreach (var go in generated.transform
                     .Cast <Transform>()
                     .Select(child => child.gameObject).Except(used))
            {
                UOUtility.Destroy(go);
            }
        }
Exemple #2
0
        private void GenerateMesh()
        {
            UOUtility.DestroyChildren(generated);

            int   i             = 0;
            float textureOffset = 0.0f;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                GameObject go = UOUtility.Create("segment " + i++,
                                                 generated,
                                                 typeof(MeshFilter),
                                                 typeof(MeshRenderer),
                                                 typeof(ExtrusionSegment),
                                                 typeof(MeshCollider));
                go.isStatic = true; // TODO Changed
                go.GetComponent <MeshRenderer>().material = material;
                ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>();
                mb.ShapeVertices = shapeVertices;
                mb.TextureScale  = textureScale;
                mb.TextureOffset = textureOffset;
                mb.SampleSpacing = sampleSpacing;
                mb.SetInterval(curve);

                textureOffset += curve.Length;
            }
        }
Exemple #3
0
        private void GenerateMesh()
        {
            UOUtility.DestroyChildren(generated);

            _bounds = new Bounds();
            int   i             = 0;
            float textureOffset = 0.0f;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                GameObject go = UOUtility.Create("segment " + i++,
                                                 generated,
                                                 typeof(MeshFilter),
                                                 typeof(MeshRenderer),
                                                 typeof(ExtrusionSegment),
                                                 typeof(MeshCollider));
                go.GetComponent <MeshRenderer>().material = material;
                ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>();
                mb.SetShapeVertices(shapeVertices, false);
                mb.SetLoopAround(loopAround, false);
                mb.SetTextureScale(textureScale, false);
                mb.SetCurve(curve, true);
                mb.SetTextureOffset(textureOffset, true);
                textureOffset += curve.Length;
                _bounds.Encapsulate(go.GetComponent <MeshFilter>().sharedMesh.bounds);
            }
        }
Exemple #4
0
        private void OnEnable()
        {
            string generatedName     = "generated by " + GetType().Name;
            var    generatedTranform = transform.Find(generatedName);

            generated = generatedTranform != null ? generatedTranform.gameObject : UOUtility.Create(generatedName, gameObject);

            spline = GetComponentInParent <Spline>();
            spline.NodeListChanged += (s, e) => {
                toUpdate = true;
                foreach (CubicBezierCurve curve in spline.GetCurves())
                {
                    curve.Changed.AddListener(() => toUpdate = true);
                }
            };
            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                curve.Changed.AddListener(() => toUpdate = true);
            }
        }
Exemple #5
0
 static void DisplayUnselected(Spline spline, GizmoType gizmoType)
 {
     foreach (CubicBezierCurve curve in spline.GetCurves())
     {
         Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position),
                            spline.transform.TransformPoint(curve.n2.Position),
                            spline.transform.TransformPoint(curve.n1.Direction),
                            spline.transform.TransformPoint(curve.GetInverseDirection()),
                            CURVE_COLOR,
                            null,
                            3);
     }
 }
Exemple #6
0
 static void SceneBezierDrawer(Spline spline, GizmoType gizmoType)
 {
     // draw a bezier curve for each curve in the spline
     foreach (CubicBezierCurve curve in spline.GetCurves())
     {
         Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position),
                            spline.transform.TransformPoint(curve.n2.Position),
                            spline.transform.TransformPoint(curve.n1.Direction),
                            spline.transform.TransformPoint(curve.GetInverseDirection()),
                            Color.white,
                            null,
                            3);
     }
 }
Exemple #7
0
        private void OnValidate()
        {
            if (spline == null)
            {
                return;
            }

            // apply scale and roll at each node
            float currentLength = 0;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                float startRate = currentLength / spline.Length;
                currentLength += curve.Length;
                float endRate = currentLength / spline.Length;

                curve.n1.Scale = Vector2.one * (startScale + (endScale - startScale) * startRate);
                curve.n2.Scale = Vector2.one * (startScale + (endScale - startScale) * endRate);

                curve.n1.Roll = startRoll + (endRoll - startRoll) * startRate;
                curve.n2.Roll = startRoll + (endRoll - startRoll) * endRate;
            }
            toUpdate = true;
        }
Exemple #8
0
        public void CreateMeshes()
        {
            UOUtility.DestroyChildren(generated);

            int i = 0;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                GameObject go = UOUtility.Create("SplineMesh" + i++, generated,
                                                 typeof(MeshFilter),
                                                 typeof(MeshRenderer),
                                                 typeof(MeshBender));
                go.GetComponent <MeshRenderer>().material = material;
                MeshBender mb = go.GetComponent <MeshBender>();
                mb.Source   = mesh;
                mb.Rotation = Quaternion.Euler(rotation);
                mb.Curve    = curve;
                mb.ComputeIfNeeded();
            }
        }
Exemple #9
0
        private void GenerateMesh()
        {
            UOUtility.DestroyChildren(generated);

            int i = 0;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                GameObject go = UOUtility.Create("segment " + i++,
                                                 generated,
                                                 typeof(MeshFilter),
                                                 typeof(MeshRenderer),
                                                 typeof(ExtrusionSegment),
                                                 typeof(MeshCollider));
                go.GetComponent <MeshRenderer>().material = material;
                ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>();
                mb.SetShapeVertices(shapeVertices, false);
                mb.SetTextureScale(textureScale, false);
                mb.SetCurve(curve, true);
            }
        }
Exemple #10
0
        protected void GenerateMesh()
        {
            UOUtility.DestroyChildren(generated);

            int   i             = 0;
            float textureOffset = 0.0f;

            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                GameObject go = UOUtility.Create("segment " + i++,
                                                 generated,
                                                 typeof(MeshFilter),
                                                 typeof(MeshRenderer),
                                                 typeof(ExtrusionSegment),
                                                 typeof(MeshCollider));
                MeshRenderer goRenderer = go.GetComponent <MeshRenderer>();
                goRenderer.material = material;
                ExtrusionSegment seg = go.GetComponent <ExtrusionSegment>();
                seg.ShapeVertices = shapeVertices;
                seg.TextureScale  = textureScale;
                seg.TextureOffset = textureOffset;
                seg.SampleSpacing = sampleSpacing;
                seg.SetInterval(curve);
                goRenderer.enabled = visible;
                if (go.TryGetComponent(out MeshCollider meshCollider))
                {
                    meshCollider.enabled = collisionEnabled;
                }
                int layerNum = LayerMask.NameToLayer(layer);
                if (layerNum > -1)
                {
                    go.gameObject.layer = layerNum;
                }

                textureOffset += curve.Length;
            }
        }
Exemple #11
0
        void OnSceneGUI()
        {
            Event e = Event.current;

            if (e.type == EventType.MouseDown)
            {
                Undo.RegisterCompleteObjectUndo(spline, "change spline topography");
                // if alt key pressed, we will have to create a new node if node position is changed
                if (e.shift)
                {
                    mustCreateNewNode = true;
                }
            }
            if (e.type == EventType.MouseUp)
            {
                mustCreateNewNode = false;
            }

            // disable game object transform gyzmo
            if (Selection.activeGameObject == spline.gameObject)
            {
                Tools.current = Tool.None;
                if (selection == null && spline.nodes.Count > 0)
                {
                    selection = spline.nodes[0];
                }
            }

            // draw a bezier curve for each curve in the spline
            foreach (CubicBezierCurve curve in spline.GetCurves())
            {
                Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position),
                                   spline.transform.TransformPoint(curve.n2.Position),
                                   spline.transform.TransformPoint(curve.n1.Direction),
                                   spline.transform.TransformPoint(curve.GetInverseDirection()),
                                   CURVE_COLOR,
                                   null,
                                   3);
            }

            // draw the selection handles
            switch (selectionType)
            {
            case SelectionType.Node:
                // place a handle on the node and manage position change
                Vector3 newPosition = spline.transform.InverseTransformPoint(Handles.PositionHandle(spline.transform.TransformPoint(selection.Position), Quaternion.identity));
                if (newPosition != selection.Position)
                {
                    // position handle has been moved
                    if (mustCreateNewNode)
                    {
                        mustCreateNewNode    = false;
                        selection            = AddClonedNode(selection);
                        selection.Direction += newPosition - selection.Position;
                        selection.Position   = newPosition;
                    }
                    else
                    {
                        selection.Direction += newPosition - selection.Position;
                        selection.Position   = newPosition;
                    }
                }
                break;

            case SelectionType.Direction:
                var result = Handles.PositionHandle(spline.transform.TransformPoint(selection.Direction), Quaternion.identity);
                selection.Direction = spline.transform.InverseTransformPoint(result);
                break;

            case SelectionType.InverseDirection:
                result = Handles.PositionHandle(2 * spline.transform.TransformPoint(selection.Position) - spline.transform.TransformPoint(selection.Direction), Quaternion.identity);
                selection.Direction = 2 * selection.Position - spline.transform.InverseTransformPoint(result);
                break;

            case SelectionType.Up:
                result       = Handles.PositionHandle(spline.transform.TransformPoint(selection.Position + selection.Up), Quaternion.LookRotation(selection.Direction - selection.Position));
                selection.Up = (spline.transform.InverseTransformPoint(result) - selection.Position).normalized;
                break;
            }

            // draw the handles of all nodes, and manage selection motion
            Handles.BeginGUI();
            foreach (SplineNode n in spline.nodes)
            {
                var dir    = spline.transform.TransformPoint(n.Direction);
                var pos    = spline.transform.TransformPoint(n.Position);
                var invDir = spline.transform.TransformPoint(2 * n.Position - n.Direction);
                var up     = spline.transform.TransformPoint(n.Position + n.Up);
                // first we check if at least one thing is in the camera field of view
                if (!(CameraUtility.IsOnScreen(pos) ||
                      CameraUtility.IsOnScreen(dir) ||
                      CameraUtility.IsOnScreen(invDir) ||
                      (showUpVector && CameraUtility.IsOnScreen(up))))
                {
                    continue;
                }

                Vector3 guiPos = HandleUtility.WorldToGUIPoint(pos);
                if (n == selection)
                {
                    Vector3 guiDir    = HandleUtility.WorldToGUIPoint(dir);
                    Vector3 guiInvDir = HandleUtility.WorldToGUIPoint(invDir);
                    Vector3 guiUp     = HandleUtility.WorldToGUIPoint(up);

                    // for the selected node, we also draw a line and place two buttons for directions
                    Handles.color = Color.red;
                    Handles.DrawLine(guiDir, guiInvDir);

                    // draw quads direction and inverse direction if they are not selected
                    if (selectionType != SelectionType.Node)
                    {
                        if (Button(guiPos, directionButtonStyle))
                        {
                            selectionType = SelectionType.Node;
                        }
                    }
                    if (selectionType != SelectionType.Direction)
                    {
                        if (Button(guiDir, directionButtonStyle))
                        {
                            selectionType = SelectionType.Direction;
                        }
                    }
                    if (selectionType != SelectionType.InverseDirection)
                    {
                        if (Button(guiInvDir, directionButtonStyle))
                        {
                            selectionType = SelectionType.InverseDirection;
                        }
                    }
                    if (showUpVector)
                    {
                        Handles.color = Color.green;
                        Handles.DrawLine(guiPos, guiUp);
                        if (selectionType != SelectionType.Up)
                        {
                            if (Button(guiUp, upButtonStyle))
                            {
                                selectionType = SelectionType.Up;
                            }
                        }
                    }
                }
                else
                {
                    if (Button(guiPos, nodeButtonStyle))
                    {
                        selection     = n;
                        selectionType = SelectionType.Node;
                    }
                }
            }
            Handles.EndGUI();

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