示例#1
0
        public MeshBaker(Model model, List <MeshAnimation> animations, Studio studio, string sIndex, string parentFolderPath)
            : base(model, studio, sIndex, parentFolderPath)
        {
            this.animations = animations;

            meshModel = model as MeshModel;

            if (studio.shadow.type == ShadowType.Simple && studio.shadow.simple.isDynamicScale)
            {
                simpleShadowBaseScale = studio.shadow.obj.transform.localScale;
            }

            stateMachine = new StateMachine <BakingState>();
            stateMachine.AddState(BakingState.Initialize, OnInitialize);
            stateMachine.AddState(BakingState.BeginAnimation, OnBeginAnimation);
            stateMachine.AddState(BakingState.BeginView, OnBeginView);
            stateMachine.AddState(BakingState.BeginFrame, OnBeginFrame);
            stateMachine.AddState(BakingState.CaptureFrame, OnCaptureFrame);
            stateMachine.AddState(BakingState.EndFrame, OnEndFrame);
            stateMachine.AddState(BakingState.EndView, OnEndView);
            stateMachine.AddState(BakingState.EndAnimation, OnEndAnimation);
            stateMachine.AddState(BakingState.Finalize, OnFinalize);

            stateMachine.ChangeState(BakingState.Initialize);
        }
示例#2
0
        public static void ScaleMatteField(MeshModel model, GameObject fieldObj, LightProperty lit)
        {
            if (model == null || model.mainRenderer == null || fieldObj == null || lit == null)
            {
                return;
            }

            Renderer fieldRenderer = fieldObj.GetComponent <Renderer>();

            if (fieldRenderer == null)
            {
                return;
            }

            float   tan            = Mathf.Tan(lit.com.transform.rotation.eulerAngles.x * Mathf.Deg2Rad);
            Vector3 modelSize      = model.mainRenderer.bounds.size;
            float   modelHalfWidth = Mathf.Max(modelSize.x, modelSize.z) / 2;
            float   fieldWidth     = (modelSize.y / tan + modelHalfWidth) * 2;

            fieldObj.transform.localScale = Vector3.one; // important
            fieldObj.transform.localScale = new Vector3
                                            (
                fieldWidth / fieldRenderer.bounds.size.x,
                1f,
                fieldWidth / fieldRenderer.bounds.size.z
                                            );
        }
示例#3
0
        private bool DrawFixToGroundField(MeshModel model, out bool isChanged)
        {
            EditorGUI.BeginChangeCheck();
            bool isFixingToGround = EditorGUILayout.Toggle(new GUIContent("Fix to Ground",
                                                                          "animates on ground, preventing from floating"), model.isFixingToGround);

            isChanged = EditorGUI.EndChangeCheck();

            return(isFixingToGround);
        }
示例#4
0
        private bool DrawFixToOriginField(MeshModel model, out bool isChanged)
        {
            EditorGUI.BeginChangeCheck();
            bool isFixingToOrigin = EditorGUILayout.Toggle(new GUIContent("Fix to Origin",
                                                                          "animates in place"), model.isFixingToOrigin);

            isChanged = EditorGUI.EndChangeCheck();

            return(isFixingToOrigin);
        }
示例#5
0
        private PivotType DrawPivotTypeField(MeshModel model, out bool isChanged)
        {
            EditorGUI.BeginChangeCheck();
            PivotType pivotType = (PivotType)EditorGUILayout.EnumPopup(new GUIContent("Pivot Type",
                                                                                      "type of the root object's world position"), model.pivotType);

            isChanged = EditorGUI.EndChangeCheck();

            return(pivotType);
        }
示例#6
0
        public MeshSampler(Model model, MeshAnimation animation, Studio studio) : base(model, studio)
        {
            this.animation = animation;

            meshModel = model as MeshModel;

            if (studio.shadow.type == ShadowType.Simple && studio.shadow.simple.isDynamicScale)
            {
                modelBaseSize         = model.GetSize();
                simpleShadowBaseScale = studio.shadow.obj.transform.localScale;
            }
        }
示例#7
0
        public StaticBaker(Model model, Studio studio, string sIndex, string parentFolderPath)
            : base(model, studio, sIndex, parentFolderPath)
        {
            meshModel = model as MeshModel;

            stateMachine = new StateMachine <BakingState>();
            stateMachine.AddState(BakingState.Initialize, OnInitialize);
            stateMachine.AddState(BakingState.BeginView, OnBeginView);
            stateMachine.AddState(BakingState.CaptureFrame, OnCaptureFrame);
            stateMachine.AddState(BakingState.EndView, OnEndView);
            stateMachine.AddState(BakingState.Finalize, OnFinalize);

            stateMachine.ChangeState(BakingState.Initialize);
        }
示例#8
0
        public static void ScaleSimpleShadowDynamically(Vector3 modelBaseSize, Vector3 simpleShadowBaseScale, MeshModel meshModel, Studio studio)
        {
            Vector3 modelCurrentSize = meshModel.GetSize();

            float xScaleRatio = modelBaseSize.x / modelCurrentSize.x;
            float zScaleRatio = modelBaseSize.z / modelCurrentSize.z;

            Debug.Assert(xScaleRatio > 0f && zScaleRatio > 0f);

            Transform shadowTransform = studio.shadow.obj.transform;

            shadowTransform.localScale = simpleShadowBaseScale;

            shadowTransform.localScale = new Vector3
                                         (
                shadowTransform.localScale.x * xScaleRatio,
                1.0f,
                shadowTransform.localScale.z * zScaleRatio
                                         );
        }
示例#9
0
        void OnEnable()
        {
            model = target as MeshModel;

            animReorderableList = new UnityEditorInternal.ReorderableList(serializedObject, serializedObject.FindProperty("animations"))
            {
                drawHeaderCallback = (Rect rect) =>
                {
                    EditorGUI.LabelField(rect, new GUIContent("Animations", "animation list to bake"));
                },

                drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
                {
                    SerializedProperty element = animReorderableList.serializedProperty.GetArrayElementAtIndex(index);
                    rect.y += 2;

                    const float LEFT_MARGIN    = 50;
                    float       rectWidth      = rect.width - LEFT_MARGIN;
                    float       popupWidth     = rect.width * 0.4f;
                    const float CHECKBOX_WIDTH = 15;

                    SerializedProperty clipProperty = element.FindPropertyRelative("clip");
                    float animClipWidth             = rectWidth - popupWidth - CHECKBOX_WIDTH;
                    EditorGUI.BeginChangeCheck();
                    EditorGUI.PropertyField(
                        new Rect(rect.x + LEFT_MARGIN, rect.y, animClipWidth, EditorGUIUtility.singleLineHeight),
                        clipProperty, GUIContent.none);
                    if (EditorGUI.EndChangeCheck())
                    {
                        model.animations[index].selectedFrames.Clear();
                    }

                    if (model.referenceController != null && refStateMachine != null && refStateMachine.states.Length > 0 && clipProperty.objectReferenceValue != null)
                    {
                        string[] stateNames = new string[refStateMachine.states.Length];
                        for (int i = 0; i < refStateMachine.states.Length; ++i)
                        {
                            stateNames[i] = refStateMachine.states[i].state.name;
                        }

                        SerializedProperty stateIndexProperty = element.FindPropertyRelative("stateIndex");
                        stateIndexProperty.intValue =
                            EditorGUI.Popup(new Rect(rect.x + LEFT_MARGIN + animClipWidth + 5, rect.y, popupWidth - CHECKBOX_WIDTH - 10, EditorGUIUtility.singleLineHeight),
                                            stateIndexProperty.intValue, stateNames);

                        SerializedProperty stateNameProperty = element.FindPropertyRelative("stateName");
                        if (stateNames.Length > stateIndexProperty.intValue)
                        {
                            stateNameProperty.stringValue = stateNames[stateIndexProperty.intValue];
                        }
                    }

                    SerializedProperty loopingProperty = element.FindPropertyRelative("isLooping");
                    loopingProperty.boolValue =
                        GUI.Toggle(new Rect(rect.x + rect.width - CHECKBOX_WIDTH - 10, rect.y, CHECKBOX_WIDTH + 10, EditorGUIUtility.singleLineHeight),
                                   loopingProperty.boolValue, new GUIContent(LoopMarkTexture, "generates looping animation clip"), GUI.skin.button);
                },

                onAddCallback = (UnityEditorInternal.ReorderableList l) => {
                    var index = l.serializedProperty.arraySize;
                    l.serializedProperty.arraySize++;
                    SerializedProperty element = l.serializedProperty.GetArrayElementAtIndex(index);
                    element.FindPropertyRelative("clip").objectReferenceValue = null;
                },

                onSelectCallback = (UnityEditorInternal.ReorderableList l) =>
                {
                    SetAnimationByIndex(l.index);
                },

                onRemoveCallback = (UnityEditorInternal.ReorderableList l) =>
                {
                    int index = l.index;
                    UnityEditorInternal.ReorderableList.defaultBehaviours.DoRemoveButton(l);

                    if (l.serializedProperty.arraySize > index)
                    {
                        reservedAnimIndex = index;
                    }
                    else if (l.serializedProperty.arraySize > 0)
                    {
                        reservedAnimIndex = l.serializedProperty.arraySize - 1;
                    }
                }
            };

            animIndex = EditorPrefs.GetInt(model.GetInstanceID().ToString(), -1);
            if (model.animations.Count > 0 && animIndex < 0)
            {
                animIndex = 0;
            }

            SetAnimationByIndex(animIndex);
        }
示例#10
0
        protected void OnInspectorGUI_Multi()
        {
            EditorGUILayout.HelpBox("Displayed information is of the first selected model,\nbut any change affects all selected models.", MessageType.Info);

            MeshModel[] models = new MeshModel[targets.Length];

            for (int i = 0; i < models.Length; ++i)
            {
                models[i] = targets[i] as MeshModel;
            }

            MeshModel firstModel = models[0];

            bool isAllSkinnedModel = true;

            foreach (MeshModel model in models)
            {
                isAllSkinnedModel &= model.IsSkinnedModel();
            }

            bool isAllNotFixingToGround = true;

            foreach (MeshModel model in models)
            {
                isAllNotFixingToGround &= (!model.isFixingToOrigin || !model.isFixingToGround);
            }

            PivotType pivotType            = PivotType.Bottom;
            bool      isPivotTypeChanged   = false;
            bool      isGroundPivot        = false;
            bool      isGroundPivotChanged = false;

            if (isAllSkinnedModel || isAllNotFixingToGround)
            {
                EditorGUILayout.Space();

                if (isAllSkinnedModel)
                {
                    pivotType = DrawPivotTypeField(firstModel, out isPivotTypeChanged);
                }

                if (isAllNotFixingToGround)
                {
                    isGroundPivot = DrawGroundPivotField(firstModel, out isGroundPivotChanged);
                }
            }

            bool hasAllRootBone = true;

            foreach (MeshModel model in models)
            {
                hasAllRootBone &= (model.rootBoneObj != null);
            }

            bool isFixingToOrigin        = false;
            bool isFixingToOriginChanged = false;

            bool isAllFixingToOrigin     = true;
            bool isAllNotGroundPivot     = true;
            bool isFixingToGround        = false;
            bool isFixingToGroundChanged = false;

            if (isAllSkinnedModel && hasAllRootBone)
            {
                EditorGUILayout.Space();

                EditorGUILayout.LabelField("Root Bone");

                EditorGUI.indentLevel++;
                {
                    isFixingToOrigin = DrawFixToOriginField(firstModel, out isFixingToOriginChanged);

                    foreach (MeshModel model in models)
                    {
                        isAllFixingToOrigin &= model.isFixingToOrigin;
                    }
                    foreach (MeshModel model in models)
                    {
                        isAllNotGroundPivot &= !model.isGroundPivot;
                    }

                    if (isAllFixingToOrigin && isAllNotGroundPivot)
                    {
                        EditorGUI.indentLevel++;
                        isFixingToGround = DrawFixToGroundField(firstModel, out isFixingToGroundChanged);
                        EditorGUI.indentLevel--;
                    }
                }
                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            bool       isSpritePrefabChanged;
            GameObject spritePrefab = DrawSpritePrefabField(firstModel, out isSpritePrefabChanged);

            bool hasAllSpritePrefab = true;

            foreach (MeshModel model in models)
            {
                hasAllSpritePrefab &= (model.spritePrefab != null);
            }

            PrefabBuilder prefabBuilder          = null;
            bool          isPrefabBuilderChanged = false;

            if (hasAllSpritePrefab)
            {
                EditorGUI.indentLevel++;
                prefabBuilder = DrawPrefabBuilderField(model, out isPrefabBuilderChanged);
                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            bool   isNameSuffixChanged;
            string nameSuffix = DrawModelNameSuffix(firstModel, out isNameSuffixChanged);

            if (isNameSuffixChanged)
            {
                PathHelper.CorrectPathString(ref nameSuffix);
            }

            if (isPivotTypeChanged || isGroundPivotChanged || isFixingToOriginChanged || isFixingToGroundChanged ||
                isSpritePrefabChanged || isPrefabBuilderChanged || isNameSuffixChanged)
            {
                foreach (MeshModel model in models)
                {
                    Undo.RecordObject(model, "Mesh Model");

                    if (isAllSkinnedModel && isPivotTypeChanged)
                    {
                        model.pivotType = pivotType;
                    }
                    if (isAllNotFixingToGround && isGroundPivotChanged)
                    {
                        model.isGroundPivot = isGroundPivot;
                    }

                    if (isAllSkinnedModel && hasAllRootBone)
                    {
                        if (isFixingToOriginChanged)
                        {
                            model.isFixingToOrigin = isFixingToOrigin;
                        }
                        if (isAllFixingToOrigin && isAllNotGroundPivot && isFixingToGroundChanged)
                        {
                            model.isFixingToGround = isFixingToGround;
                        }
                    }

                    if (isSpritePrefabChanged)
                    {
                        model.spritePrefab = spritePrefab;
                    }

                    if (hasAllSpritePrefab && isPrefabBuilderChanged)
                    {
                        model.prefabBuilder = prefabBuilder;
                    }

                    if (isNameSuffixChanged)
                    {
                        model.nameSuffix = nameSuffix;
                    }
                }
            }

            Studio studio = FindObjectOfType <Studio>();

            if (studio == null)
            {
                return;
            }

            EditorGUILayout.Space();

            if (DrawingHelper.DrawWideButton("Add all to the model list"))
            {
                foreach (MeshModel model in models)
                {
                    AddToModelList(model);
                }
            }
        }
示例#11
0
        private void OnInspectorGUI_Single()
        {
            Undo.RecordObject(model, "Mesh Model");

            bool isAnyChanged = false;

            EditorGUILayout.Space();

            EditorGUI.BeginChangeCheck();
            model.mainRenderer = EditorGUILayout.ObjectField(new GUIContent("Main Renderer",
                                                                            "the most important and biggest renderer in hierarchy"), model.mainRenderer, typeof(Renderer), true) as Renderer;
            bool mainRendererChanged = EditorGUI.EndChangeCheck();

            if (model.mainRenderer == null)
            {
                model.mainRenderer = MeshModel.FindBiggestRenderer(model.gameObject);
            }

            if (model.IsSkinnedModel())
            {
                EditorGUILayout.Space();

                if (mainRendererChanged)
                {
                    model.pivotType = PivotType.Bottom;
                }

                bool isPivotTypeChanged;
                model.pivotType = DrawPivotTypeField(model, out isPivotTypeChanged);
                if (isPivotTypeChanged)
                {
                    UpdateSceneWindow();
                }
            }
            else
            {
                model.pivotType = PivotType.Center;
            }

            if (model.isFixingToOrigin && model.isFixingToGround)
            {
                GUI.enabled = false;
            }
            {
                bool isGroundPivotChanged;
                model.isGroundPivot = DrawGroundPivotField(model, out isGroundPivotChanged);
                if (isGroundPivotChanged)
                {
                    UpdateSceneWindow();
                }
            }
            if (model.isFixingToOrigin && model.isFixingToGround)
            {
                GUI.enabled = true;
            }

            if (model.IsSkinnedModel())
            {
                EditorGUILayout.Space();

                EditorGUI.BeginChangeCheck();

                model.rootBoneObj = EditorGUILayout.ObjectField(new GUIContent("Root Bone",
                                                                               "root bone object to fix body"), model.rootBoneObj, typeof(Transform), true) as Transform;

                if (model.rootBoneObj == null)
                {
                    GUI.enabled = false;
                }
                EditorGUI.indentLevel++;
                {
                    model.isFixingToOrigin = DrawFixToOriginField(model, out isAnyChanged);
                    if (model.isFixingToOrigin)
                    {
                        EditorGUI.indentLevel++;
                        if (model.isGroundPivot)
                        {
                            GUI.enabled = false;
                        }
                        model.isFixingToGround = DrawFixToGroundField(model, out isAnyChanged);
                        if (model.isGroundPivot)
                        {
                            GUI.enabled = true;
                        }
                        EditorGUI.indentLevel--;
                    }
                }
                EditorGUI.indentLevel--;
                if (model.rootBoneObj == null)
                {
                    GUI.enabled = true;
                }

                if (EditorGUI.EndChangeCheck())
                {
                    model.Animate(SelectedAnimation, Frame.BEGIN);
                }
            }

            EditorGUILayout.Space();

            if (reservedAnimIndex >= 0)
            {
                SetAnimationByIndex(reservedAnimIndex);
                reservedAnimIndex = -1;
            }

            Rect animBoxRect = EditorGUILayout.BeginVertical();

            serializedObject.Update();
            animReorderableList.DoLayoutList();
            serializedObject.ApplyModifiedProperties();
            EditorGUILayout.EndVertical();

            switch (Event.current.type)
            {
            case EventType.DragUpdated:
            case EventType.DragPerform:
            {
                if (!animBoxRect.Contains(Event.current.mousePosition))
                {
                    break;
                }
                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
                if (Event.current.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();
                    foreach (object draggedObj in DragAndDrop.objectReferences)
                    {
                        AnimationClip clip = draggedObj as AnimationClip;
                        if (clip != null)
                        {
                            MeshAnimation anim = new MeshAnimation();
                            anim.clip           = clip;
                            anim.selectedFrames = new List <Frame>();
                            model.AddAnimation(anim);
                        }
                    }
                }
            }
                Event.current.Use();
                break;
            }

            if (model.animations.Count > 0 && DrawingHelper.DrawMiddleButton("Clear all"))
            {
                model.animations.Clear();
            }

            EditorGUILayout.Space();

            DrawReferenceControllerField();
            if (model.referenceController != null)
            {
                EditorGUI.indentLevel++;
                model.outputController = EditorGUILayout.ObjectField(new GUIContent("Output Controller",
                                                                                    "controller to which a baker saves animation states related to the animation list's animations"),
                                                                     model.outputController, typeof(AnimatorController), false) as AnimatorController;
                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            model.spritePrefab = DrawSpritePrefabField(model, out isAnyChanged);
            if (model.spritePrefab != null)
            {
                EditorGUI.indentLevel++;
                model.prefabBuilder = DrawPrefabBuilderField(model, out isAnyChanged);
                EditorGUI.indentLevel--;
            }

            EditorGUILayout.Space();

            if (SelectedAnimation != null)
            {
                SelectedAnimation.customizer = EditorGUILayout.ObjectField(new GUIContent("Customizer",
                                                                                          "component that customizes this model at every frames in the selected animation"),
                                                                           SelectedAnimation.customizer, typeof(AnimationCustomizer), true) as AnimationCustomizer;
            }

            EditorGUILayout.Space();

            bool isNameSuffixChanged;

            model.nameSuffix = DrawModelNameSuffix(model, out isNameSuffixChanged);
            if (isNameSuffixChanged)
            {
                PathHelper.CorrectPathString(ref model.nameSuffix);
            }

            EditorGUILayout.Space();

            if (DrawingHelper.DrawWideButton("Add to the model list"))
            {
                AddToModelList(model);
            }
        }
示例#12
0
        private static void DrawBakingProgress(int editorWidth, int editorHeight, GUIStyle titleStyle, List <Model> bakingModels, Batcher batcher)
        {
            const float HELP_BOX_HEIGHT    = 54; // help box + two spaces
            const float TITLE_HEIGHT       = 30; // title label + two spaces
            const float BOTTOM_AREA_HEIGHT = 34; // cancel button + two spaces
            float       maxBodyAreaHeight  = editorHeight - HELP_BOX_HEIGHT - TITLE_HEIGHT - BOTTOM_AREA_HEIGHT;

            float FIELD_HEIGHT = 16;

            float computedBodyHeight = 0;

            for (int i = 0; i < bakingModels.Count; ++i)
            {
                computedBodyHeight += FIELD_HEIGHT;

                Model model = bakingModels[i];
                if (Model.IsMeshModel(model))
                {
                    computedBodyHeight += Model.AsMeshModel(model).GetValidAnimations().Count *FIELD_HEIGHT;
                }
            }

            float bodyAreaHeight = Mathf.Min(computedBodyHeight, maxBodyAreaHeight);

            Rect titleRect = EditorGUILayout.BeginVertical();

            EditorGUILayout.LabelField(string.Format("Baking.. ({0}/{1})", batcher.ModelIndex, bakingModels.Count), titleStyle, GUILayout.Height(TITLE_HEIGHT + bodyAreaHeight));
            EditorGUILayout.EndVertical();

            float bodyY = titleRect.y + TITLE_HEIGHT;

            int firstModelIndex = 0;

            if (computedBodyHeight > maxBodyAreaHeight)
            {
                float simulatedBodyHeight = 0;
                for (int i = 0; i < bakingModels.Count; ++i)
                {
                    float totalModelHeight = FIELD_HEIGHT;

                    Model model = bakingModels[i];
                    if (Model.IsMeshModel(model))
                    {
                        totalModelHeight += Model.AsMeshModel(model).GetValidAnimations().Count *FIELD_HEIGHT;
                    }

                    float thresholdHeight = totalModelHeight + FIELD_HEIGHT * 2; // extra two for baking one & post ellipsis;

                    if (simulatedBodyHeight + thresholdHeight < maxBodyAreaHeight)
                    {
                        simulatedBodyHeight += totalModelHeight;
                    }
                    else
                    {
                        if (i > batcher.ModelIndex)
                        {
                            break;
                        }
                        firstModelIndex++;

                        if (firstModelIndex == 1)
                        {
                            simulatedBodyHeight += FIELD_HEIGHT; // for pre ellipsis
                        }
                    }
                }
            }
            Debug.Assert(firstModelIndex < bakingModels.Count);

            GUIStyle labelStyle = new GUIStyle();

            labelStyle.normal.textColor = EditorGUIUtility.isProSkin ? Color.white : Color.black;

            { // progress bar
                int totalTargetCount   = 0;
                int ongoingTargetCount = 0;
                for (int i = 0; i < bakingModels.Count; ++i)
                {
                    Model model = bakingModels[i];
                    if (Model.IsMeshModel(model))
                    {
                        int validAnimationCount = Model.AsMeshModel(model).GetValidAnimations().Count;
                        if (validAnimationCount > 0)
                        {
                            totalTargetCount += validAnimationCount;
                            if (i < batcher.ModelIndex)
                            {
                                ongoingTargetCount += validAnimationCount;
                            }
                            else if (i == batcher.ModelIndex)
                            {
                                MeshBaker animationBaker = batcher.CurrentBaker as MeshBaker;
                                if (animationBaker != null)
                                {
                                    ongoingTargetCount += animationBaker.AnimationIndex;
                                }
                            }
                        }
                        else
                        {
                            totalTargetCount++;
                            if (i <= batcher.ModelIndex)
                            {
                                ongoingTargetCount++;
                            }
                        }
                    }
                    else
                    {
                        totalTargetCount++;
                        if (i <= batcher.ModelIndex)
                        {
                            ongoingTargetCount++;
                        }
                    }
                }

                float progress = (float)ongoingTargetCount / (float)totalTargetCount;

                const float PROGRESS_BAR_WIDTH = 10;

                Rect progressBarBgRect = new Rect(editorWidth, bodyY, PROGRESS_BAR_WIDTH, bodyAreaHeight);
                DrawingHelper.FillRect(progressBarBgRect, EditorGUIUtility.isProSkin ? lightGrayColor : darkGrayColor);

                Rect progressBarFgRect = new Rect(editorWidth, bodyY, PROGRESS_BAR_WIDTH, bodyAreaHeight * progress);
                DrawingHelper.FillRect(progressBarFgRect, EditorGUIUtility.isProSkin ? Color.white : Color.black);

                labelStyle.alignment = TextAnchor.MiddleRight;
                float progressLabelY    = bodyY + bodyAreaHeight * progress - (FIELD_HEIGHT / 2);
                Rect  progressLabelRect = new Rect(14, progressLabelY, editorWidth - 17, FIELD_HEIGHT);
                EditorGUI.LabelField(progressLabelRect, string.Format("{0:0}%", progress * 100), labelStyle);
            }

            labelStyle.alignment = TextAnchor.MiddleLeft;

            float FIELD_X    = 14;
            float bodyHeight = 0;

            if (firstModelIndex > 0)
            {
                Rect ellipsisRect = new Rect(FIELD_X, bodyY + bodyHeight, editorWidth, FIELD_HEIGHT);
                EditorGUI.indentLevel++; EditorGUI.indentLevel++;
                EditorGUI.LabelField(ellipsisRect, "...", labelStyle);
                EditorGUI.indentLevel--; EditorGUI.indentLevel--;
                bodyHeight += FIELD_HEIGHT;
            }

            for (int mi = firstModelIndex; mi < bakingModels.Count; ++mi)
            {
                if (bodyHeight + FIELD_HEIGHT > maxBodyAreaHeight)
                {
                    return;
                }

                Model model = bakingModels[mi];

                Rect modelRect = new Rect(FIELD_X, bodyY + bodyHeight, editorWidth, FIELD_HEIGHT);
                bodyHeight += FIELD_HEIGHT;

                FieldState state = FieldState.None;
                if (mi < batcher.ModelIndex)
                {
                    state = FieldState.Completed;
                }
                else if (mi == batcher.ModelIndex)
                {
                    state = FieldState.Baking;
                }

                bool elliptical = false;
                if (bodyHeight + FIELD_HEIGHT > maxBodyAreaHeight)
                {
                    if (mi < bakingModels.Count - 1)
                    {
                        elliptical = true;
                    }
                }

                string labelText;
                if (elliptical)
                {
                    labelText = "...";
                }
                else
                {
                    labelText = mi.ToString() + ". " + model.name;
                    if (model.nameSuffix.Length > 0)
                    {
                        labelText += model.nameSuffix;
                    }
                }

                labelStyle.fontStyle = GetLabelFontStyle(state);

                EditorGUI.indentLevel++;
                EditorGUI.LabelField(modelRect, labelText, labelStyle);
                EditorGUI.indentLevel--;

                if (state == FieldState.Completed && !elliptical)
                {
                    DrawCheckMark(modelRect);
                }

                if (Model.IsMeshModel(model))
                {
                    MeshModel            meshModel       = Model.AsMeshModel(model);
                    List <MeshAnimation> validAnimations = meshModel.GetValidAnimations();

                    for (int ai = 0; ai < validAnimations.Count; ++ai)
                    {
                        if (bodyHeight + FIELD_HEIGHT > maxBodyAreaHeight)
                        {
                            return;
                        }

                        MeshAnimation anim = validAnimations[ai];

                        MeshBaker animationBaker = batcher.CurrentBaker as MeshBaker;

                        Rect animationRect = new Rect(FIELD_X, bodyY + bodyHeight, editorWidth, FIELD_HEIGHT);
                        bodyHeight += FIELD_HEIGHT;

                        state = FieldState.None;
                        if (mi < batcher.ModelIndex || (mi == batcher.ModelIndex && (animationBaker != null && ai < animationBaker.AnimationIndex)))
                        {
                            state = FieldState.Completed;
                        }
                        else if (mi == batcher.ModelIndex && (animationBaker != null && ai == animationBaker.AnimationIndex))
                        {
                            state = FieldState.Baking;
                        }

                        elliptical = false;
                        if (bodyHeight + FIELD_HEIGHT > maxBodyAreaHeight)
                        {
                            if (mi < bakingModels.Count - 1 || ai < validAnimations.Count - 1)
                            {
                                elliptical = true;
                            }
                        }

                        if (elliptical)
                        {
                            labelText = "...";
                        }
                        else
                        {
                            labelText = (meshModel.referenceController != null) ? anim.stateName : anim.clip.name;
                        }

                        labelStyle.fontStyle = GetLabelFontStyle(state);

                        EditorGUI.indentLevel++; EditorGUI.indentLevel++;
                        EditorGUI.LabelField(animationRect, labelText, labelStyle);
                        EditorGUI.indentLevel--; EditorGUI.indentLevel--;

                        if (state == FieldState.Completed && !elliptical)
                        {
                            DrawCheckMark(animationRect, 10);
                        }
                    }
                }
            }
        }
示例#13
0
        private static void MakeRendererModels()
        {
            GameObject       groupObject = null;
            List <MeshModel> models      = null;

            string[] selectedPathes = GetSelectedPathes();

            string[] allAssetPaths = AssetDatabase.GetAllAssetPaths();
            foreach (string assetPath in allAssetPaths)
            {
                if (!IsInAnyPathes(assetPath, selectedPathes))
                {
                    continue;
                }

                GameObject prefab = AssetDatabase.LoadAssetAtPath(assetPath, typeof(GameObject)) as GameObject;
                if (prefab == null)
                {
                    continue;
                }

                Renderer renderer = prefab.GetComponentInChildren <Renderer>();
                if (renderer == null)
                {
                    continue;
                }

                if (groupObject == null)
                {
                    groupObject = new GameObject("Mesh Model Group");
                    models      = new List <MeshModel>();
                }

                GameObject obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, groupObject.transform);
                obj.name = prefab.name;

                MeshModel model = obj.GetComponent <MeshModel>();
                if (model == null)
                {
                    model = obj.AddComponent <MeshModel>();

                    if (model.mainRenderer is SkinnedMeshRenderer)
                    {
                        model.pivotType = PivotType.Bottom;
                    }
                    else
                    {
                        model.pivotType = PivotType.Center;
                    }
                }

                if (model.mainRenderer == null)
                {
                    model.mainRenderer = MeshModel.FindBiggestRenderer(obj);
                }

                models.Add(model);
            }

            if (models != null)
            {
                foreach (MeshModel model in models)
                {
                    float rangeX = model.mainRenderer.bounds.size.x * models.Count;
                    float rangeZ = model.mainRenderer.bounds.size.z * models.Count;
                    model.transform.position = new Vector3(Random.Range(-rangeX, rangeX), 0, Random.Range(-rangeZ, rangeZ));
                }
            }
        }
示例#14
0
        public void UpdateState()
        {
            try
            {
                if (CurrentBaker != null)
                {
                    if (CurrentBaker.IsInProgress())
                    {
                        CurrentBaker.UpdateState();

                        if (CurrentBaker.IsCancelled)
                        {
                            throw new Exception("Cancelled");
                        }
                        return;
                    }
                    else
                    {
                        EditorUtility.ClearProgressBar();

                        ModelIndex++;
                    }
                }

                Model model = NextModel();
                if (model != null)
                {
                    string sIndex = "";
                    if (modelList.Count > 1)
                    {
                        sIndex = ModelIndex.ToString().PadLeft((modelList.Count + 1).ToString().Length, '0');
                    }

                    for (int i = 0; i < modelList.Count; ++i)
                    {
                        modelList[i].gameObject.SetActive(false);
                    }
                    model.gameObject.SetActive(true);

                    if (Model.IsMeshModel(model))
                    {
                        MeshModel            meshModel       = Model.AsMeshModel(model);
                        List <MeshAnimation> validAnimations = meshModel.GetValidAnimations();

                        if (validAnimations.Count > 0)
                        {
                            CurrentBaker = new MeshBaker(model, validAnimations, studio, sIndex, batchingFolderPath);
                        }
                        else
                        {
                            CurrentBaker = new StaticBaker(model, studio, sIndex, batchingFolderPath);
                        }
                    }
                    else if (Model.IsParticleModel(model))
                    {
                        CurrentBaker = new ParticleBaker(model, studio, sIndex, batchingFolderPath);
                    }
                }
                else
                {
                    EditorUtility.FocusProjectWindow();

                    if (needPassingFinalUpdate)
                    {
                        needPassingFinalUpdate = false;
                        return;
                    }

                    Finish();
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Finish();
            }
        }