/// <summary>
        /// Calculate mesh generation parameters
        /// </summary>
        private void CreateMesh()
        {
            Profiler.BeginSample("CreateMesh");

            if (_spline == null)
            {
                return;
            }

            if (_auxTransform1 != null)
            {
                GetAuxTranforms();
            }

            if (_auxTransform1 == null)
            {
                return;
            }

            bool exceededVertsLimit = false;

            _splineLength = _spline.Length;

            // 2.0 Mesh generation
            _spline.CalculateOrientedPoints(_baseMeshLength);

            int penultimateIndex = _spline.OrientedPoints.Length - 2;

            for (int i = 0; i <= penultimateIndex; i++)
            {
                // Set aux transform 1
                _auxTransform1.rotation = _spline.OrientedPoints[i].Rotation;
                _auxTransform1.position = _spline.OrientedPoints[i].Position + _meshOffset;
                // Set aux transform 2
                _auxTransform2.rotation = _spline.OrientedPoints[i + 1].Rotation;
                _auxTransform2.position = _spline.OrientedPoints[i + 1].Position + _meshOffset;

                exceededVertsLimit = false;
                AddMeshSegment(_auxTransform1, _auxTransform2, out exceededVertsLimit);
                if (exceededVertsLimit)
                {
                    _meshGenerationMethod = MeshGenerationMethod.Manual;
                    break;
                }
            }

            Profiler.EndSample();
        }
Ejemplo n.º 2
0
    /// <summary>
    /// Custom inspector
    /// </summary>
    public override void OnInspectorGUI()
    {
        //base.OnInspectorGUI();
        _splineMeshRenderer = (SplineMeshRenderer)target;

        //Set up the box style if null
        if (_menuBoxStyle == null)
        {
            _menuBoxStyle = new GUIStyle(GUI.skin.box);
            _menuBoxStyle.normal.textColor = GUI.skin.label.normal.textColor;
            _menuBoxStyle.fontStyle        = FontStyle.Bold;
            _menuBoxStyle.alignment        = TextAnchor.UpperLeft;
        }

        serializedObject.Update();
        EditorGUILayout.PropertyField(serializedObject.FindProperty("_spline"), false);
        serializedObject.ApplyModifiedProperties();

        EditorGUI.BeginChangeCheck();
        _selectedMenuIndex = GUILayout.Toolbar(_selectedMenuIndex, _toolbarMenuOptions);
        if (EditorGUI.EndChangeCheck())
        {
            GUI.FocusControl(null);
        }

        GUILayout.BeginVertical(_menuBoxStyle);

        if (_selectedMenuIndex == (int)MeshRendererInspectorMenu.MeshGenerationSettings)
        {
            #region Mesh Generation Settings

            GUILayout.Label("Generation Settings", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            MeshGenerationMethod meshGenerationMethod = (MeshGenerationMethod)EditorGUILayout.EnumPopup("Mesh Generation Method", _splineMeshRenderer.MeshGenerationMethod);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_splineMeshRenderer, "Mesh Generation Method Changed");
                MarkSceneAlteration();
                _splineMeshRenderer.MeshGenerationMethod = meshGenerationMethod;
            }

            EditorGUI.BeginChangeCheck();
            Mesh baseMesh = (Mesh)EditorGUILayout.ObjectField("Base Mesh", _splineMeshRenderer.BaseMesh, typeof(Mesh), false);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_splineMeshRenderer, "Base Mesh Changed");
                MarkSceneAlteration();
                _splineMeshRenderer.BaseMesh = baseMesh;
            }

            EditorGUI.BeginChangeCheck();
            Vector3 meshOffset = EditorGUILayout.Vector3Field("Mesh Offset", _splineMeshRenderer.MeshOffset);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_splineMeshRenderer, "Mesh Offset Changed");
                MarkSceneAlteration();
                _splineMeshRenderer.MeshOffset = meshOffset;
            }

            GUILayout.Label("Mesh Operations", EditorStyles.boldLabel);

            GUILayout.BeginHorizontal();
            if (_splineMeshRenderer.MeshGenerationMethod != MeshGenerationMethod.Manual)
            {
                if (GUILayout.Button(_btnPrintMeshDetails))
                {
                    _splineMeshRenderer.PrintMeshDetails();
                }
            }
            else
            {
                if (GUILayout.Button(_btnCreateMesh))
                {
                    _splineMeshRenderer.ExtrudeMesh();
                }
            }

            if (GUILayout.Button(_btnBakeMesh))
            {
                BakeMeshWindow.ShowWindow();
            }
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button(_btnConnectNewRenderer))
            {
                Selection.activeGameObject = _splineMeshRenderer.ConnectNewRenderer();
                MarkSceneAlteration();
            }
            GUILayout.EndHorizontal();

            #endregion
        }
        else if (_selectedMenuIndex == (int)MeshRendererInspectorMenu.CollisionSettings)
        {
            #region Collision Settings

            GUILayout.Label("Collision Settings", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            bool enableCollision = EditorGUILayout.Toggle("Enable Collision", _splineMeshRenderer.EnableCollision);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_splineMeshRenderer, "Enable Collision Changed");
                MarkSceneAlteration();
                _splineMeshRenderer.EnableCollision = enableCollision;
            }

            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("_customMeshColliders"), true);
            serializedObject.ApplyModifiedProperties();

            #endregion
        }

        GUILayout.EndVertical();
    }