// Init
 //----------------------------------------------
 public apRetargetSubUnit()
 {
     _isImported               = false;
     _targetMeshTransform      = null;
     _targetMeshGroupTransform = null;
     _targetBone               = null;
 }
 public apModifierParamSetGroupVertWeight GetWeightVertexData(apTransform_Mesh meshTransform)
 {
     return(_calculatedWeightedVertexList.Find(delegate(apModifierParamSetGroupVertWeight a)
     {
         return a._meshTransform_ID == meshTransform._transformUniqueID;
     }));
 }
Exemple #3
0
        public void SetMesh(apMeshGroup meshGroup, apTransform_Mesh meshTransform, apRenderUnit parentRenderUnit)
        {
            _unitType = UNIT_TYPE.Mesh;

            _meshGroup = meshGroup;

            _meshGroupTransform = null;
            _meshTransform      = meshTransform;

            _meshTransform._linkedRenderUnit = this;

            _depth = 0;
            if (parentRenderUnit != null)
            {
                _depth += parentRenderUnit._depth;
            }
            if (_meshGroupTransform != null)
            {
                _depth += _meshGroupTransform._depth;
            }
            _depth += meshTransform._depth;


            if (parentRenderUnit != null)
            {
                parentRenderUnit._childRenderUnits.Add(this);
                _parentRenderUnit = parentRenderUnit;
            }
        }
Exemple #4
0
        public void SetGroup(apMeshGroup meshGroup, apTransform_MeshGroup meshGroupTransform, apRenderUnit parentRenderUnit)
        {
            _unitType = UNIT_TYPE.GroupNode;

            _meshGroup = meshGroup;

            _meshGroupTransform = meshGroupTransform;
            _meshTransform      = null;

            //역으로 Link를 하자
            _meshGroupTransform._linkedRenderUnit = this;



            _depth = 0;
            if (_meshTransform != null)
            {
                _depth += _meshTransform._depth;
            }
            if (parentRenderUnit != null)
            {
                _depth += parentRenderUnit._depth;
            }
            if (meshGroupTransform != null)
            {
                //루트가 아니라면 Mesh Group Transform도 있다.
                _depth += _meshGroupTransform._depth;
            }

            if (parentRenderUnit != null)
            {
                parentRenderUnit._childRenderUnits.Add(this);
                _parentRenderUnit = parentRenderUnit;
            }
        }
Exemple #5
0
        private static int MakeSubUnitsFromMeshGroupTransformRecursive(
            apMeshGroup rootMeshGroup,
            apTransform_MeshGroup meshGroupTransform,
            int startUnitID,
            List <apRetargetSubUnit> transforms_All,
            List <apRetargetSubUnit> transforms_Root,
            apRetargetSubUnit parentSubUnit
            )
        {
            //MeshGroup Transform을 추가한다.
            apRetargetSubUnit newGroupSubUnit = new apRetargetSubUnit();

            newGroupSubUnit.SetSubData(startUnitID, null, meshGroupTransform, null, parentSubUnit);

            transforms_All.Add(newGroupSubUnit);
            if (parentSubUnit == null)
            {
                transforms_Root.Add(newGroupSubUnit);
            }

            startUnitID++;

            if (meshGroupTransform._meshGroup != null && meshGroupTransform._meshGroup != rootMeshGroup)
            {
                if (meshGroupTransform._meshGroup._childMeshTransforms != null)
                {
                    for (int i = 0; i < meshGroupTransform._meshGroup._childMeshTransforms.Count; i++)
                    {
                        //MeshTransform을 추가한다.
                        apTransform_Mesh meshTransform = meshGroupTransform._meshGroup._childMeshTransforms[i];

                        apRetargetSubUnit newSubUnit = new apRetargetSubUnit();
                        newSubUnit.SetSubData(startUnitID, meshTransform, null, null, newGroupSubUnit);
                        startUnitID++;

                        transforms_All.Add(newSubUnit);
                    }
                }

                //하위에 다른 MeshGroup Transform이 있는 경우
                if (meshGroupTransform._meshGroup._childMeshGroupTransforms != null)
                {
                    //재귀 호출을 한다
                    for (int i = 0; i < meshGroupTransform._meshGroup._childMeshGroupTransforms.Count; i++)
                    {
                        apTransform_MeshGroup childMeshGroup = meshGroupTransform._meshGroup._childMeshGroupTransforms[i];

                        startUnitID = MakeSubUnitsFromMeshGroupTransformRecursive(
                            rootMeshGroup,
                            childMeshGroup,
                            startUnitID,
                            transforms_All,
                            transforms_Root,
                            newGroupSubUnit
                            );
                    }
                }
            }
            return(startUnitID);
        }
Exemple #6
0
 public apPSDSetLayer GetLayer(apTransform_Mesh meshTransform)
 {
     return(_layers.Find(delegate(apPSDSetLayer a)
     {
         return a._transformID == meshTransform._transformUniqueID && a._isImageLayer;
     }));
 }
 public bool IsSubMeshInGroup(apTransform_Mesh subMeshTransform)
 {
     if (subMeshTransform == null)
     {
         return(false);
     }
     return(_syncTransform_Mesh.Contains(subMeshTransform));
 }
Exemple #8
0
        public void LinkMeshTransform(apTransform_Mesh meshTransform)
        {
            _meshTransform = meshTransform;
            if (_meshTransform == null)
            {
                _meshTransform_ID = -1;
            }

            RefreshVertexList();
        }
        // Init
        //--------------------------------------------------------------------
        public void Init(apEditor editor,
                         object loadKey,
                         apMeshGroup srcMeshGroup,
                         apTransform_Mesh srcMeshTransform,
                         FUNC_SELECT_MESH_TF_COPY funcResult)
        {
            _editor     = editor;
            _loadKey    = loadKey;
            _meshGroup  = srcMeshGroup;
            _funcResult = funcResult;

            _srcMeshTransform = srcMeshTransform;

            //타겟을 검색하자
            _meshTransforms.Clear();



            _img_Mesh     = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Mesh);
            _img_FoldDown = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown);

            //대상이 되는 데이터를 가져온다.
            for (int i = 0; i < _meshGroup._renderUnits_All.Count; i++)
            {
                apRenderUnit renderUnit = _meshGroup._renderUnits_All[i];
                if (renderUnit._meshTransform == null || renderUnit._meshTransform == _srcMeshTransform)
                {
                    continue;
                }

                if (!_meshTransforms.Contains(renderUnit._meshTransform))
                {
                    _meshTransforms.Add(renderUnit._meshTransform);
                }
            }

            _meshTransforms.Reverse();


            if (_copiedProperties == null)
            {
                _copiedProperties = new Dictionary <COPIED_PROPERTIES, bool>();
            }

            _copiedProperties.Clear();

            _copiedProperties.Add(COPIED_PROPERTIES.DefaultColor, false);
            _copiedProperties.Add(COPIED_PROPERTIES.ShaderType, false);
            _copiedProperties.Add(COPIED_PROPERTIES.CustomShader, false);
            _copiedProperties.Add(COPIED_PROPERTIES.RenderTextureSize, false);
            _copiedProperties.Add(COPIED_PROPERTIES.TwoSides, false);
            _copiedProperties.Add(COPIED_PROPERTIES.ShadowSettings, false);
            _copiedProperties.Add(COPIED_PROPERTIES.MaterialSet, false);
            _copiedProperties.Add(COPIED_PROPERTIES.MaterialProperties, false);
        }
Exemple #10
0
        public override bool Save(object target, string strParam)
        {
            base.Save(target, strParam);

            apModifiedMesh modMesh = target as apModifiedMesh;

            if (modMesh == null)
            {
                return(false);
            }

            _key_MeshGroupOfMod       = modMesh._meshGroupOfModifier;
            _key_MeshGroupOfTransform = modMesh._meshGroupOfTransform;

            _key_MeshTransform      = null;
            _key_MeshGroupTransform = null;
            _key_RenderUnit         = null;

            if (modMesh._transform_Mesh != null)
            {
                _key_MeshTransform = modMesh._transform_Mesh;
            }
            if (modMesh._transform_MeshGroup != null)
            {
                _key_MeshGroupTransform = modMesh._transform_MeshGroup;
            }
            _key_RenderUnit = modMesh._renderUnit;

            _vertices.Clear();
            int nVert = modMesh._vertices.Count;

            for (int i = 0; i < nVert; i++)
            {
                apModifiedVertex modVert = modMesh._vertices[i];
                _vertices.Add(new VertData(modVert._vertex, modVert._deltaPos));
            }

            _transformMatrix = new apMatrix(modMesh._transformMatrix);
            _meshColor       = modMesh._meshColor;
            _isVisible       = modMesh._isVisible;


            _isExtraValueEnabled = false;
            _extraValue          = null;

            //추가 3.29 : ExtraValue도 복사
            if (modMesh._isExtraValueEnabled)
            {
                _isExtraValueEnabled = true;
                _extraValue          = new ExtraDummyValue(modMesh._extraValue);
            }

            return(true);
        }
Exemple #11
0
 public bool IsContainMeshTransform(apTransform_Mesh meshTransform)
 {
     if (meshTransform == null)
     {
         return(false);
     }
     return(_meshData.Exists(delegate(apModifiedMesh a)
     {
         return a._isMeshTransform && a._transform_Mesh == meshTransform;
     }));
 }
 /// <summary>
 /// 처리를 도와주는 함수. MeshTransform의 Parent MeshGroup을 검색한다.
 /// </summary>
 /// <param name="meshTransform"></param>
 /// <returns></returns>
 private apMeshGroup GetParentMeshGroupOfMeshTransform(apTransform_Mesh meshTransform)
 {
     for (int i = 0; i < _portrait._meshGroups.Count; i++)
     {
         if (_portrait._meshGroups[i]._childMeshTransforms.Contains(meshTransform))
         {
             //찾았다!
             return(_portrait._meshGroups[i]);
         }
     }
     return(null);
 }
Exemple #13
0
 // 비교 관련
 //------------------------------------------
 public bool IsContains_MeshTransform(apMeshGroup meshGroup, apTransform_Mesh meshTransform, apMesh mesh)
 {
     if (_meshGroupUniqueID_Modifier == meshGroup._uniqueID &&
         _transformUniqueID == meshTransform._transformUniqueID &&
         _transformUniqueID >= 0 &&
         _meshUniqueID == mesh._uniqueID &&
         _isMeshTransform
         )
     {
         return(true);
     }
     return(false);
 }
Exemple #14
0
        public apModifierParamSetGroupVertWeight(apTransform_Mesh meshTransform)
        {
            _meshTransform    = meshTransform;
            _meshTransform_ID = _meshTransform._transformUniqueID;
            _weightedVerts.Clear();

            if (_meshTransform._mesh != null)
            {
                List <apVertex> verts = _meshTransform._mesh._vertexData;
                for (int i = 0; i < verts.Count; i++)
                {
                    _weightedVerts.Add(new WeightedVertex(verts[i]._uniqueID, i));
                }
            }
        }
        // 추가
        //--------------------------------------------------------------------------------
        /// <summary>
        /// ParamSetGroup 내의 모든 ParamSet에서 MeshTransform을 포함한 ModMesh를 모두 삭제한다.
        /// 주의 메세지를 꼭 출력할 것
        /// </summary>
        /// <param name="meshTransform"></param>
        public void RemoveModifierMeshes(apTransform_Mesh meshTransform)
        {
            apModifierParamSet paramSet = null;

            for (int i = 0; i < _paramSetList.Count; i++)
            {
                paramSet = _paramSetList[i];
                int nRemoved = paramSet._meshData.RemoveAll(delegate(apModifiedMesh a)
                {
                    return(a.IsContains_MeshTransform(_parentModifier._meshGroup, meshTransform, meshTransform._mesh));
                });

                if (nRemoved > 0)
                {
                    //Debug.LogError("Remove ModMesh [RemoveModifierMeshes / MeshTransform] : " + meshTransform._nickName + " / " + nRemoved);
                }
            }
        }
Exemple #16
0
        //public void SetTarget_Bone(int boneID)
        //{
        //	_boneUniqueID = boneID;
        //}

        #region [미사용 코드] 타입에 따른 초기화는 유연성이 떨어져서 패스.
        //public void Init_VertexMorph(int meshGroupID, int meshTransformID, int meshID)
        //{
        //	_targetType = TARGET_TYPE.VertexWithMeshTransform;
        //	_meshGroupUniqueID = meshGroupID;
        //	_transformUniqueID = meshTransformID;
        //	_meshUniqueID = meshID;
        //	_boneUniqueID = -1;


        //}

        //public void Init_MeshTransform(int meshGroupID, int meshTransformID, int meshID)
        //{
        //	_targetType = TARGET_TYPE.MeshTransformOnly;
        //	_meshGroupUniqueID = meshGroupID;
        //	_transformUniqueID = meshTransformID;
        //	_meshUniqueID = meshID;
        //	_boneUniqueID = -1;
        //}

        //public void Init_MeshGroupTransform(int meshGroupID, int meshGroupTransformID)
        //{
        //	_targetType = TARGET_TYPE.MeshGroupTransformOnly;
        //	_meshGroupUniqueID = meshGroupID;
        //	_transformUniqueID = meshGroupTransformID;
        //	_meshUniqueID = -1;
        //	_boneUniqueID = -1;
        //}

        //public void Init_BoneTransform(int meshGroupID, int boneID)
        //{
        //	_targetType = TARGET_TYPE.Bone;
        //	_meshGroupUniqueID = meshGroupID;
        //	_transformUniqueID = -1;
        //	_meshUniqueID = -1;
        //	_boneUniqueID = boneID;
        //}
        #endregion


        // Init - ID에 맞게 세팅
        //--------------------------------------------------------
        //이건 날립니더
        //public void Link_VertexMorph(apMeshGroup meshGroup, apTransform_Mesh meshTransform, apRenderUnit renderUnit)
        //{
        //	_meshGroup = meshGroup;
        //	_transform_Mesh = meshTransform;
        //	_renderUnit = renderUnit;

        //	//RefreshVertices();

        //}

        /// <summary>
        /// MeshTransform과 ModMesh를 연결한다.
        /// </summary>
        /// <param name="meshGroupOfMod">Modifier가 속한 MeshGroup</param>
        ///<param name="meshGroupOfTransform">Transform이 속한 MeshGroup</param>
        public void Link_MeshTransform(apMeshGroup meshGroupOfMod, apMeshGroup meshGroupOfTransform, apTransform_Mesh meshTransform, apRenderUnit renderUnit, apPortrait portrait)
        {
            _meshGroupOfModifier  = meshGroupOfMod;
            _meshGroupOfTransform = meshGroupOfTransform;

            _transform_Mesh = meshTransform;
            _renderUnit     = renderUnit;

            if (_isUsePhysicParam)
            {
                if (_physicMeshParam == null)
                {
                    _physicMeshParam = new apPhysicsMeshParam();
                }
                _physicMeshParam.Link(portrait);
            }

            //Debug.Log("ModMesh Link RenderUnit");
            RefreshModifiedValues(meshGroupOfMod._parentPortrait);
        }
        public void AddClippedChildMesh(apTransform_Mesh meshTransform, apRenderUnit renderUnit)
        {
            _isClipping_Parent = true;

            if (_clipChildMeshes.Exists(delegate(ClipMeshSet a)
            {
                return(a._meshTransform == meshTransform);
            }))
            {
                //겹친다면 Pass
                SortClipMeshTransforms();
                return;
            }

            int clippIndex = _clipChildMeshes.Count;

            _clipChildMeshes.Add(new ClipMeshSet(meshTransform, renderUnit));
            meshTransform._isClipping_Child    = true;
            meshTransform._clipIndexFromParent = clippIndex;

            #region [미사용 코드]
            //_clipChildMeshTransformIDs.Add(meshTransform._transformUniqueID);
            //_clipChildMeshTransforms.Add(meshTransform);
            //_clipChildRenderUnits.Add(renderUnit);

            //이전 코드 : 3개 고정
            //for (int i = 0; i < 3; i++)
            //{
            //	if(_clipChildMeshTransforms[i] == null)
            //	{
            //		_clipChildMeshTransforms[i] = meshTransform;
            //		_clipChildMeshTransformIDs[i] = meshTransform._transformUniqueID;
            //		_clipChildRenderUnits[i] = renderUnit;
            //		break;
            //	}
            //}
            #endregion

            SortClipMeshTransforms();
        }
        // Show Window
        //--------------------------------------------------------------
        public static object ShowDialog(apEditor editor,
                                        apMeshGroup srcMeshGroup,
                                        apTransform_Mesh srcMeshTransform,
                                        FUNC_SELECT_MESH_TF_COPY funcResult)
        {
            CloseDialog();

            if (editor == null || editor._portrait == null)
            {
                return(null);
            }



            EditorWindow curWindow = EditorWindow.GetWindow(typeof(apDialog_SelectMeshTransformsToCopy), true, "Select Child Meshes", true);
            apDialog_SelectMeshTransformsToCopy curTool = curWindow as apDialog_SelectMeshTransformsToCopy;

            object loadKey = new object();

            if (curTool != null && curTool != s_window)
            {
                int width  = 500;
                int height = 600;
                s_window          = curTool;
                s_window.position = new Rect((editor.position.xMin + editor.position.xMax) / 2 - (width / 2),
                                             (editor.position.yMin + editor.position.yMax) / 2 - (height / 2),
                                             width, height);
                s_window.Init(editor, loadKey, srcMeshGroup, srcMeshTransform, funcResult);

                return(loadKey);
            }
            else
            {
                return(null);
            }
        }
        // GUI
        //--------------------------------------------------------------------
        void OnGUI()
        {
            int width  = (int)position.width;
            int height = (int)position.height;

            if (_editor == null || _funcResult == null)
            {
                return;
            }

            Color prevColor = GUI.backgroundColor;

            GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f);

            //Top : (탭) 또는 없음

            int yOffset           = 10;
            int height_Properties = 80;
            int height_Bottom     = 70;
            int height_Main       = height - (height_Properties + height_Bottom + 60);


            GUI.Box(new Rect(0, yOffset, width, height_Main), "");


            GUI.backgroundColor = prevColor;

            EditorGUILayout.BeginVertical();


            //Request Type이 "Mesh" 또는 "ChildTransform"이라면 탭이 없다.
            //Request Type이 "MeshAndMeshGroups"라면 탭이 있다.


            //1. Tab
            GUILayout.Space(5);


            int    width_BtnHalf = (width - 10) / 2 - 2;
            string strCategory   = _meshGroup._name;

            GUILayout.Space(5);

            GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none);

            guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor;

            GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none);

            if (EditorGUIUtility.isProSkin)
            {
                guiStyle_Selected.normal.textColor = Color.cyan;
            }
            else
            {
                guiStyle_Selected.normal.textColor = Color.white;
            }

            int    height_ListItem = 20;
            string strSelected     = _editor.GetText(TEXT.DLG_Selected);
            string strNotSelected  = _editor.GetText(TEXT.DLG_NotSelected);

            _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height_Main));
            EditorGUILayout.BeginVertical(GUILayout.Width(width - 24));

            GUILayout.Button(new GUIContent(strCategory, _img_FoldDown), guiStyle_None, GUILayout.Height(height_ListItem));            //<투명 버튼

            //리스트 방식 : 아이콘 + 이름 / Selected 버튼 (토글)

            int width_SelectBtn = 100;
            int width_Label     = width - (width_SelectBtn + 42);

            bool isSelected = false;

            //MeshTransform을 출력하자
            apTransform_Mesh curMeshTF = null;

            for (int i = 0; i < _meshTransforms.Count; i++)
            {
                curMeshTF = _meshTransforms[i];

                isSelected = _selectedMeshTransforms.Contains(curMeshTF);

                EditorGUILayout.BeginHorizontal(GUILayout.Height(height_ListItem));
                GUILayout.Space(10);
                EditorGUILayout.LabelField(new GUIContent(" " + curMeshTF._nickName, _img_Mesh), GUILayout.Width(width_Label), GUILayout.Height(height_ListItem));

                if (apEditorUtil.ToggledButton_2Side(strSelected, strNotSelected, isSelected, true, width_SelectBtn, height_ListItem))
                {
                    if (isSelected)
                    {
                        _selectedMeshTransforms.Remove(curMeshTF);
                    }
                    else
                    {
                        _selectedMeshTransforms.Add(curMeshTF);
                    }
                }

                EditorGUILayout.EndHorizontal();
                GUILayout.Space(2);
            }

            GUILayout.Space(height + 20);

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndScrollView();

            EditorGUILayout.EndVertical();

            GUILayout.Space(5);

            //복사할 속성들을 토글한다.
            //두줄로 적자

            //"Select Properties to copy"
            EditorGUILayout.LabelField(_editor.GetText(TEXT.SelectPropertiesToCopy));
            GUILayout.Space(5);

            EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(height_Properties));

            GUILayout.Space(5);

            //왼쪽 줄
            EditorGUILayout.BeginVertical(GUILayout.Width(width_BtnHalf), GUILayout.Height(height_Properties));
            DrawPropertyToggle(COPIED_PROPERTIES.DefaultColor, _editor.GetText(TEXT.DefaultColor), width_BtnHalf);           //"Default Color"
            DrawPropertyToggle(COPIED_PROPERTIES.ShaderType, _editor.GetText(TEXT.BlendingType), width_BtnHalf);             //"Blending Type"
            DrawPropertyToggle(COPIED_PROPERTIES.CustomShader, _editor.GetText(TEXT.CustomShader), width_BtnHalf);           //"Custom Shader"
            DrawPropertyToggle(COPIED_PROPERTIES.RenderTextureSize, _editor.GetText(TEXT.RenderTextureSize), width_BtnHalf); //"Render Texture Size"

            EditorGUILayout.EndVertical();

            GUILayout.Space(5);

            //오른쪽 줄
            EditorGUILayout.BeginVertical(GUILayout.Width(width_BtnHalf), GUILayout.Height(height_Properties));
            DrawPropertyToggle(COPIED_PROPERTIES.TwoSides, _editor.GetText(TEXT.TwoSidedMesh), width_BtnHalf);                       //"2-Sides Rendering"
            DrawPropertyToggle(COPIED_PROPERTIES.ShadowSettings, _editor.GetText(TEXT.ShadowSettings), width_BtnHalf);               //"Shadow Settings"
            DrawPropertyToggle(COPIED_PROPERTIES.MaterialSet, _editor.GetText(TEXT.MaterialSet), width_BtnHalf);                     //"Material Set"
            DrawPropertyToggle(COPIED_PROPERTIES.MaterialProperties, _editor.GetText(TEXT.CustomMaterialProperties), width_BtnHalf); //"Custom Material Properties"
            EditorGUILayout.EndVertical();



            EditorGUILayout.EndHorizontal();

            GUILayout.Space(10);

            //첫줄에는 Select All / Deselect All
            //둘째줄에는 Add 또는 Apply (인자로 받음) / Close
            EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
            GUILayout.Space(5);
            if (GUILayout.Button(_editor.GetText(TEXT.DLG_SelectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22)))
            {
                //Select All
                for (int i = 0; i < _meshTransforms.Count; i++)
                {
                    curMeshTF = _meshTransforms[i];
                    if (!_selectedMeshTransforms.Contains(curMeshTF))
                    {
                        _selectedMeshTransforms.Add(curMeshTF);
                    }
                }
            }
            if (GUILayout.Button(_editor.GetText(TEXT.DLG_DeselectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22)))
            {
                //Deselect All
                _selectedMeshTransforms.Clear();
            }


            EditorGUILayout.EndHorizontal();

            GUILayout.Space(5);

            EditorGUILayout.BeginHorizontal(GUILayout.Height(30));
            GUILayout.Space(5);

            bool isClose = false;

            if (GUILayout.Button(_editor.GetText(TEXT.DLG_Apply), GUILayout.Width(width_BtnHalf), GUILayout.Height(30)))
            {
                _funcResult(true, _loadKey, _srcMeshTransform, _selectedMeshTransforms, GetCopiedPropertyList());
                isClose = true;
            }
            if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width_BtnHalf), GUILayout.Height(30)))            //"Close"
            {
                _funcResult(false, _loadKey, null, null, null);
                isClose = true;
            }
            EditorGUILayout.EndHorizontal();

            if (isClose)
            {
                CloseDialog();
            }
        }
Exemple #20
0
        public bool _isRemapPosOffset_Initialized = false;        //<<Transform과 연결후, 또는 PSD Set Layer의 값으로 부터 초기화가 되었는가

        // Init
        //---------------------------------------------------
        public apPSDLayerData(int layerIndex, IPsdLayer psdLayer, int imageTotalWidth, int imageTotalHeight)
        {
            _layerIndex = layerIndex;

            _name       = psdLayer.Name;
            _isClipping = psdLayer.IsClipping;
            _isBakable  = true;
            //_srcPsdLayer = psdLayer;
            _isClippingValid = true;            //일단 가능하다고 체크

            if (psdLayer.HasImage)
            {
                //1. 이미지 타입의 레이어
                _isImageLayer = true;

                _width          = psdLayer.Width;
                _height         = psdLayer.Height;
                _posOffset_Left = psdLayer.Left;
                _posOffset_Top  = imageTotalHeight - psdLayer.Top;               //좌표계 특성상 반전하자

                _posOffset_Right  = psdLayer.Right;
                _posOffset_Bottom = imageTotalHeight - psdLayer.Bottom;

                _posOffset = new Vector2(
                    (float)(_posOffset_Left + _posOffset_Right) * 0.5f,
                    (float)(_posOffset_Top + _posOffset_Bottom) * 0.5f
                    );

                _opacity            = psdLayer.Opacity;
                _transparentColor2X = new Color(0.5f, 0.5f, 0.5f, _opacity);


                _colorData = new byte[_width * _height * 4];                //W x H x RGBA(4)
                //_colors = new Color[_width * _height];

                int subDataLength   = _width * _height;
                int totalDataLength = imageTotalWidth * imageTotalHeight;

                byte[] colorData_R    = new byte[subDataLength];
                byte[] colorData_G    = new byte[subDataLength];
                byte[] colorData_B    = new byte[subDataLength];
                byte[] colorData_A    = new byte[subDataLength];
                byte[] colorData_Mask = new byte[subDataLength];

                bool isMask = false;

                for (int i = 0; i < subDataLength; i++)
                {
                    colorData_R[i]    = 0;
                    colorData_G[i]    = 0;
                    colorData_B[i]    = 0;
                    colorData_A[i]    = 255;
                    colorData_Mask[i] = 255;
                }


                for (int iChannel = 0; iChannel < psdLayer.Channels.Length; iChannel++)
                {
                    IChannel curChannel   = psdLayer.Channels[iChannel];
                    byte[]   curColorData = null;

                    if (curChannel.Type == ChannelType.Mask)
                    {
                        continue;
                    }

                    switch (curChannel.Type)
                    {
                    case ChannelType.Red:
                        curColorData = colorData_R;
                        break;

                    case ChannelType.Green:
                        curColorData = colorData_G;
                        break;

                    case ChannelType.Blue:
                        curColorData = colorData_B;
                        break;

                    case ChannelType.Alpha:
                        curColorData = colorData_A;
                        break;

                    case ChannelType.Mask:
                        //마스크는 무시한다.
                        curColorData = colorData_Mask;
                        isMask       = true;
                        break;
                    }

                    int dataLength = curChannel.Data.Length;
                    if (subDataLength != dataLength)
                    {
                        //저장되었어야할 데이터와 실제 데이터가 다르다.
                        bool isError = true;
                        if (curChannel.Type == ChannelType.Mask)
                        {
                            isMask = false;

                            //만약 -> Mask의 경우
                            //이미지 전체가 들어올 수는 있다.
                            //확장된 데이터 사이즈와 비교를 하자
                            if (dataLength == totalDataLength)
                            {
                                isError = false;
                                isMask  = true;

                                //데이터가 Height가 거꾸로 되어있다.
                                //X, Y의 오프셋을 적용해야한다.
                                //Debug.Log("Mask Image : Total : " + dataLength + "( " + imageTotalWidth + " x " + imageTotalHeight + " )");
                                //Debug.Log("X : " + _posOffset_Left + " ~ " + _posOffset_Right);
                                //Debug.Log("Y : " + +_posOffset_Top + " ~ " + _posOffset_Bottom);
                            }
                        }

                        if (isError)
                        {
                            Debug.LogError("Data Length is not correct : " + _name + " [ Channel : " + curChannel.Type + " ]");
                            //Debug.LogError("Data Size : " + curChannel.Data.Length + " (Expected : " + totalDataLength + " / Sub : " + subDataLength + ")");
                            //Debug.Log("Mask Image : Total : " + dataLength + "( " + imageTotalWidth + " x " + imageTotalHeight + " )");
                            //Debug.Log("X : " + _posOffset_Left + " ~ " + _posOffset_Right);
                            //Debug.Log("Y : " + +_posOffset_Top + " ~ " + _posOffset_Bottom);
                            continue;
                        }
                    }
                    else
                    {
                        //칼라값을 복사하자
                        Array.Copy(curChannel.Data, curColorData, dataLength);
                    }
                }

                //이제 마지막으로 byte 배열을 만들고 Texture로 구성하자
                int iMainColor = 0;
                int iX         = 0;
                int iY         = 0;
                if (!isMask)
                {
                    //Debug.Log("Image : " + layerIndex + " [ No Mask ]");
                    //마스크가 없는 경우
                    for (int iColor = 0; iColor < subDataLength; iColor++)
                    {
                        //iColor = y * Width + x
                        //RevYColor = ((Height - Y) * Width) + X
                        //iMainColor = iColor * 4;
                        iY         = iColor / _width;
                        iX         = iColor % _width;
                        iMainColor = ((((_height - 1) - iY) * _width) + iX) * 4;
                        _colorData[iMainColor + 0] = colorData_R[iColor];
                        _colorData[iMainColor + 1] = colorData_G[iColor];
                        _colorData[iMainColor + 2] = colorData_B[iColor];
                        _colorData[iMainColor + 3] = colorData_A[iColor];

                        //_colors[iColor] = ByteToColor(
                        //	_colorData[iMainColor + 0],
                        //	_colorData[iMainColor + 1],
                        //	_colorData[iMainColor + 2],
                        //	_colorData[iMainColor + 3]
                        //	);
                    }
                }
                else
                {
                    //Debug.Log("Image : " + layerIndex + " [ Mask ]");
                    //마스크가 있는 경우
                    for (int iColor = 0; iColor < subDataLength; iColor++)
                    {
                        //iMainColor = iColor * 4;
                        //iColor = y * Width + x
                        //RevYColor = ((Height - Y) * Width) + X
                        //iMainColor = iColor * 4;
                        iY         = iColor / _width;
                        iX         = iColor % _width;
                        iMainColor = ((((_height - 1) - iY) * _width) + iX) * 4;

                        _colorData[iMainColor + 0] = GetMaskedColor(colorData_R[iColor], colorData_Mask[iColor]);
                        _colorData[iMainColor + 1] = GetMaskedColor(colorData_G[iColor], colorData_Mask[iColor]);
                        _colorData[iMainColor + 2] = GetMaskedColor(colorData_B[iColor], colorData_Mask[iColor]);
                        _colorData[iMainColor + 3] = GetMaskedColor(colorData_A[iColor], colorData_Mask[iColor]);

                        //_colors[iColor] = ByteToColor(
                        //	_colorData[iMainColor + 0],
                        //	_colorData[iMainColor + 1],
                        //	_colorData[iMainColor + 2],
                        //	_colorData[iMainColor + 3]
                        //	);
                    }
                }

                _image = new Texture2D(_width, _height, TextureFormat.RGBA32, false);
                //_image.SetPixels(_colors);
                _image.LoadRawTextureData(_colorData);
                _image.wrapMode = TextureWrapMode.Clamp;
                _image.Apply();
            }
            else
            {
                _isImageLayer = false;

                _image     = null;
                _width     = 0;
                _height    = 0;
                _colorData = null;

                _width          = psdLayer.Width;
                _height         = psdLayer.Height;
                _posOffset_Left = psdLayer.Left;
                _posOffset_Top  = imageTotalHeight - psdLayer.Top;               //좌표계 특성상 반전하자

                _posOffset_Right  = psdLayer.Right;
                _posOffset_Bottom = imageTotalHeight - psdLayer.Bottom;

                _posOffset = new Vector2(
                    (float)(_posOffset_Left + _posOffset_Right) * 0.5f,
                    (float)(_posOffset_Top + _posOffset_Bottom) * 0.5f
                    );

                _opacity            = 1.0f;
                _transparentColor2X = Color.black;
            }

            _posOffsetLocal = _posOffset;

            _parentLayer = null;
            _childLayers = null;

            _isRemapSelected   = false;
            _remap_TransformID = -1;

            _remap_MeshTransform      = null;
            _remap_MeshGroupTransform = null;

            _remapPosOffsetDelta_X        = 0;
            _remapPosOffsetDelta_Y        = 0;
            _isRemapPosOffset_Initialized = false;

            //추가 : GUI를 위해서 랜덤한 색상을 정하자
            MakeRandomGUIColor();
        }
Exemple #21
0
        public apGizmos.SelectResult Select__MeshGroup_Setting(Vector2 mousePosGL, Vector2 mousePosW, int btnIndex, apGizmos.SELECT_TYPE selectType)
        {
            if (Editor.Select.MeshGroup == null)
            {
                return(null);
            }

            apTransform_MeshGroup prevSelectedMeshGroupTransform = Editor.Select.SubMeshGroupInGroup;
            //apTransform_Mesh prevSelectedMeshTransform = Editor.Select.SubMeshInGroup;
            //apGizmos.SELECT_RESULT result = apGizmos.SELECT_RESULT.None;

            //int result = 0;
            object resultObj = null;


            if (Editor.Controller.IsMouseInGUI(mousePosGL))
            {
                apTransform_Mesh selectedMeshTransform = null;

                //정렬된 Render Unit
                //List<apRenderUnit> renderUnits = Editor.Select.MeshGroup._renderUnits_All;//<<이전 : RenderUnits_All 이용
                List <apRenderUnit> renderUnits = Editor.Select.MeshGroup.SortedRenderUnits;               //<<변경 : Sorted 리스트 이용

                for (int iUnit = 0; iUnit < renderUnits.Count; iUnit++)
                {
                    apRenderUnit renderUnit = renderUnits[iUnit];
                    if (renderUnit._meshTransform != null && renderUnit._meshTransform._mesh != null)
                    {
                        if (renderUnit._meshTransform._isVisible_Default)
                        {
                            //Debug.LogError("TODO : Mouse Picking 바꿀것");
                            //bool isPick = apEditorUtil.IsMouseInMesh(
                            //	mousePosGL,
                            //	renderUnit._meshTransform._mesh,
                            //	renderUnit.WorldMatrixOfNode.inverse
                            //	);
                            bool isPick = apEditorUtil.IsMouseInRenderUnitMesh(
                                mousePosGL, renderUnit);

                            if (isPick)
                            {
                                selectedMeshTransform = renderUnit._meshTransform;
                                //찾았어도 계속 찾는다.
                                //뒤의 아이템이 "앞쪽"에 있는 것이기 때문
                            }
                        }
                    }
                }

                if (selectedMeshTransform != null)
                {
                    //이전 버전
                    //>> 만약 ChildMeshGroup에 속한 거라면, Mesh Group 자체를 선택해야 한다.
                    //apMeshGroup parentMeshGroup = Editor.Select.MeshGroup.FindParentMeshGroupOfMeshTransform(selectedMeshTransform);
                    //if (parentMeshGroup == null || parentMeshGroup == Editor.Select.MeshGroup)
                    //{
                    //	Editor.Select.SetSubMeshInGroup(selectedMeshTransform);
                    //}
                    //else
                    //{
                    //	apTransform_MeshGroup childMeshGroupTransform = Editor.Select.MeshGroup.FindChildMeshGroupTransform(parentMeshGroup);
                    //	if (childMeshGroupTransform != null)
                    //	{
                    //		Editor.Select.SetSubMeshGroupInGroup(childMeshGroupTransform);
                    //	}
                    //	else
                    //	{
                    //		Editor.Select.SetSubMeshInGroup(selectedMeshTransform);
                    //	}
                    //}

                    //수정된 버전
                    //>> 그냥 MeshGroup Transform은 마우스로 선택 못하는 걸로 하자
                    Editor.Select.SetSubMeshInGroup(selectedMeshTransform);

                    //result = 1;
                    resultObj = selectedMeshTransform;

                    //if(prevSelectedMeshGroupTransform == Editor.Select.SubMeshGroupInGroup
                    //	//&& prevSelectedMeshGroupTransform == Editor.Select.SubMeshGroupInGroup//<<이거 뭐야?
                    //	)
                    //{
                    //	//isSameObject = true;
                    //	//result = apGizmos.SELECT_RESULT.SameSelected;
                    //	result = 1;
                    //	resultObj = Editor.Select.SubMeshGroupInGroup;
                    //}
                    //else
                    //{
                    //	//isSameObject = false;
                    //	//result = apGizmos.SELECT_RESULT.NewSelected;
                    //	result = 1;
                    //}
                }
                else
                {
                    Editor.Select.SetSubMeshInGroup(null);
                }

                Editor.RefreshControllerAndHierarchy();
                //Editor.Repaint();
                Editor.SetRepaint();
            }

            if (resultObj == null)
            {
                resultObj = prevSelectedMeshGroupTransform;
            }
            //return result;
            return(apGizmos.SelectResult.Main.SetSingle(resultObj));
        }
 public RenderUnitTransformMeshSet(apTransform_Mesh meshTransform, apRenderUnit renderUnit)
 {
     _meshTransform = meshTransform;
     _renderUnit    = renderUnit;
 }
Exemple #23
0
        private static void MakeSubUnits(apMeshGroup targetMeshGroup,
                                         List <apRetargetSubUnit> transforms_All,
                                         List <apRetargetSubUnit> transforms_Root,
                                         List <apRetargetSubUnit> bones_All,
                                         List <apRetargetSubUnit> bones_Root)
        {
            int unitID = 0;


            if (targetMeshGroup._childMeshTransforms != null)
            {
                for (int i = 0; i < targetMeshGroup._childMeshTransforms.Count; i++)
                {
                    apTransform_Mesh meshTransform = targetMeshGroup._childMeshTransforms[i];

                    apRetargetSubUnit newSubUnit = new apRetargetSubUnit();
                    newSubUnit.SetSubData(unitID, meshTransform, null, null, null);
                    unitID++;

                    transforms_All.Add(newSubUnit);
                    transforms_Root.Add(newSubUnit);
                }
            }


            if (targetMeshGroup._childMeshGroupTransforms != null)
            {
                for (int i = 0; i < targetMeshGroup._childMeshGroupTransforms.Count; i++)
                {
                    apTransform_MeshGroup meshGroupTransform = targetMeshGroup._childMeshGroupTransforms[i];

                    //재귀 호출로 ChildMeshGroup의 SubUnit을 만들어주자
                    unitID = MakeSubUnitsFromMeshGroupTransformRecursive(targetMeshGroup, meshGroupTransform,
                                                                         unitID,
                                                                         transforms_All, transforms_Root,
                                                                         null);
                }
            }

            //Sort를 다시 하자
            for (int i = 0; i < transforms_All.Count; i++)
            {
                apRetargetSubUnit subUnit = transforms_All[i];
                int sortIndex             = -1;
                if (subUnit._type == apRetargetSubUnit.TYPE.MeshTransform)
                {
                    sortIndex = targetMeshGroup._renderUnits_All.FindIndex(delegate(apRenderUnit a)
                    {
                        if (a._meshTransform == null)
                        {
                            return(false);
                        }
                        return(a._meshTransform._transformUniqueID == subUnit._uniqueID);
                    });
                }
                else if (subUnit._type == apRetargetSubUnit.TYPE.MeshGroupTransform)
                {
                    sortIndex = targetMeshGroup._renderUnits_All.FindIndex(delegate(apRenderUnit a)
                    {
                        if (a._meshGroupTransform == null)
                        {
                            return(false);
                        }
                        return(a._meshGroupTransform._transformUniqueID == subUnit._uniqueID);
                    });
                }
                subUnit._sortIndex = sortIndex;
            }
            transforms_All.Sort(delegate(apRetargetSubUnit a, apRetargetSubUnit b)
            {
                return(b._sortIndex - a._sortIndex);
            });



            //Bone도 넣자
            //<BONE_EDIT>
            //if(targetMeshGroup._boneList_Root.Count > 0)
            //{
            //	for (int i = 0; i < targetMeshGroup._boneList_Root.Count; i++)
            //	{
            //		unitID = MakeSubUnitsFromBonesRecursive(targetMeshGroup,
            //												targetMeshGroup._boneList_Root[i],
            //												unitID, bones_All, bones_Root, null);
            //	}
            //}

            //>> Bone Set으로 변경
            if (targetMeshGroup._boneListSets.Count > 0)
            {
                apMeshGroup.BoneListSet boneSet = null;
                for (int iSet = 0; iSet < targetMeshGroup._boneListSets.Count; iSet++)
                {
                    boneSet = targetMeshGroup._boneListSets[iSet];
                    for (int iRoot = 0; iRoot < boneSet._bones_Root.Count; iRoot++)
                    {
                        unitID = MakeSubUnitsFromBonesRecursive(
                            boneSet._bones_Root[iRoot],
                            unitID, bones_All, bones_Root, null);
                    }
                }
            }


            //Sort를 다시 하자
            for (int i = 0; i < bones_All.Count; i++)
            {
                apRetargetSubUnit subUnit = bones_All[i];
                //<BONE_EDIT>

                //subUnit._sortIndex = targetMeshGroup._boneList_All.FindIndex(delegate (apBone a)
                //{
                //	return a._uniqueID == subUnit._uniqueID;
                //});

                //>>Bone Set을 이용
                subUnit._sortIndex = -1;

                apMeshGroup.BoneListSet boneSet = null;
                int startIndex = 0;
                for (int iSet = 0; iSet < targetMeshGroup._boneListSets.Count; iSet++)
                {
                    boneSet = targetMeshGroup._boneListSets[iSet];

                    //현재의 Bone List에 있는지 확인
                    int resultIndex = boneSet._bones_All.FindIndex(delegate(apBone a)
                    {
                        return(a._uniqueID == subUnit._uniqueID);
                    });

                    if (resultIndex >= 0 && resultIndex < boneSet._bones_All.Count)
                    {
                        //찾았다.
                        subUnit._sortIndex = startIndex + resultIndex;
                        break;
                    }
                    else
                    {
                        //업다면 기본 인덱스 증가
                        startIndex += boneSet._bones_All.Count;
                    }
                }
            }
            bones_All.Sort(delegate(apRetargetSubUnit a, apRetargetSubUnit b)
            {
                return(a._sortIndex - b._sortIndex);
            });
        }
        public void Link(apAnimClip animClip, apAnimTimeline timeline)
        {
            _parentAnimClip = animClip;
            _parentTimeline = timeline;

            _linkType = _parentTimeline._linkType;

            _parentAnimClip._portrait.RegistUniqueID(apIDManager.TARGET.AnimTimelineLayer, _uniqueID);

            switch (_linkType)
            {
            case apAnimClip.LINK_TYPE.AnimatedModifier:
            {
                switch (_linkModType)
                {
                case LINK_MOD_TYPE.MeshTransform:
                    //수정 : 재귀적으로 링크를 수행한다.
                    _linkedMeshTransform = _parentAnimClip._targetMeshGroup.GetMeshTransformRecursive(_transformID);
                    if (_linkedMeshTransform == null)
                    {
                        _transformID = -1;
                    }
                    break;

                case LINK_MOD_TYPE.MeshGroupTransform:
                    //수정 : 재귀적으로 링크를 수행한다.
                    _linkedMeshGroupTransform = _parentAnimClip._targetMeshGroup.GetMeshGroupTransformRecursive(_transformID);
                    if (_linkedMeshGroupTransform == null)
                    {
                        _transformID = -1;
                    }
                    break;

                case LINK_MOD_TYPE.Bone:
                    _linkedBone = _parentAnimClip._targetMeshGroup.GetBoneRecursive(_boneID);                                            //Recursive 방식으로 검색한다.
                    if (_linkedBone == null)
                    {
                        _boneID = -1;
                    }
                    break;

                case LINK_MOD_TYPE.None:
                    //?? 이 타입이 들어올리가 없는뎅..
                    _linkedMeshTransform      = null;
                    _linkedMeshGroupTransform = null;
                    _linkedBone = null;

                    _transformID = -1;
                    _boneID      = -1;
                    break;
                }
            }
            break;

            case apAnimClip.LINK_TYPE.ControlParam:
            {
                _linkedControlParam = _parentAnimClip._portrait.GetControlParam(_controlParamID);
                if (_linkedControlParam == null)
                {
                    _controlParamID = -1;
                }
            }
            break;
            }


            for (int i = 0; i < _keyframes.Count; i++)
            {
                _keyframes[i].Link(this);
            }
        }
Exemple #25
0
        /// <summary>
        /// 재활용을 위해 OptTransform 객체를 찾자
        /// </summary>
        public apOptTransform FindOptTransform(apTransform_Mesh meshTransform, apTransform_MeshGroup meshGroupTransform)
        {
            //return null;

            //_stopwatches[TIMER_TYPE.OptTransform].Start();

            apBakeLinkParam resultLinkParam = null;

            if (meshTransform != null)
            {
                int transformID = meshTransform._transformUniqueID;

                if (_totalParams_OptTransform.ContainsKey(transformID))
                {
                    apBakeLinkParam curParam = null;
                    for (int i = 0; i < _totalParams_OptTransform[transformID].Count; i++)
                    {
                        curParam = (_totalParams_OptTransform[transformID])[i];
                        if (!curParam._isRecycled && curParam._isOptGameObject && curParam._optTransform != null)
                        {
                            if (curParam._optTransform._unitType == apOptTransform.UNIT_TYPE.Mesh &&
                                curParam._optTransform._transformID == meshTransform._transformUniqueID)
                            {
                                resultLinkParam = curParam;
                                break;
                            }
                        }
                    }
                }
            }
            else if (meshGroupTransform != null)
            {
                int transformID = meshGroupTransform._transformUniqueID;
                if (_totalParams_OptTransform.ContainsKey(transformID))
                {
                    apBakeLinkParam curParam = null;
                    for (int i = 0; i < _totalParams_OptTransform[transformID].Count; i++)
                    {
                        curParam = (_totalParams_OptTransform[transformID])[i];

                        if (!curParam._isRecycled && curParam._isOptGameObject && curParam._optTransform != null)
                        {
                            if (curParam._optTransform._unitType == apOptTransform.UNIT_TYPE.Group &&
                                curParam._optTransform._transformID == meshGroupTransform._transformUniqueID)
                            {
                                resultLinkParam = curParam;
                                break;
                            }
                        }
                    }
                }
            }

            //_stopwatches[TIMER_TYPE.OptTransform].Stop();
            //_timerCalls[TIMER_TYPE.OptTransform] = _timerCalls[TIMER_TYPE.OptTransform] + 1;

            if (resultLinkParam == null)
            {
                return(null);
            }

            resultLinkParam._isRecycled = true;            //<<Recycle 된걸로 전환



            return(resultLinkParam._optTransform);
        }
 public ClipMeshSet(apTransform_Mesh meshTransform, apRenderUnit renderUnit)
 {
     _transformID   = meshTransform._transformUniqueID;
     _meshTransform = meshTransform;
     _renderUnit    = renderUnit;
 }
        // 중요!
        //Mesh Transform / MeshGroup Transform을 각각의 ParamSet에 넣어준다.
        //Modifier 조건에 맞게 처리한다.
        private bool AddMeshTransformToParamSet(apModifierParamSet paramSet, apTransform_Mesh meshTransform)
        {
            //if(_parentModifier.ModifiedTargetType != apModifiedMesh.TARGET_TYPE.MeshTransformOnly &&
            //	_parentModifier.ModifiedTargetType != apModifiedMesh.TARGET_TYPE.VertexWithMeshTransform)
            //{
            //	//추가할 수 없다.
            //	return false;
            //}
            if (!_parentModifier.IsTarget_MeshTransform)
            {
                return(false);
            }

            bool isExist = paramSet._meshData.Exists(delegate(apModifiedMesh a)
            {
                return(a.IsContains_MeshTransform(_parentModifier._meshGroup, meshTransform, meshTransform._mesh));
            });

            if (!isExist)
            {
                apRenderUnit targetRenderUnit = _parentModifier._meshGroup.GetRenderUnit(meshTransform);
                if (targetRenderUnit != null)
                {
                    apMeshGroup parentMeshGroupOfTransform = GetParentMeshGroupOfMeshTransform(meshTransform);
                    if (parentMeshGroupOfTransform == null)
                    {
                        //Parent MeshGroup이 없네염
                        return(false);
                    }

                    apModifiedMesh modMesh = new apModifiedMesh();



                    modMesh.Init(_parentModifier._meshGroup._uniqueID, parentMeshGroupOfTransform._uniqueID, _parentModifier.ModifiedValueType);

                    modMesh.SetTarget_MeshTransform(meshTransform._transformUniqueID, meshTransform._mesh._uniqueID, meshTransform._meshColor2X_Default, meshTransform._isVisible_Default);
                    modMesh.Link_MeshTransform(_parentModifier._meshGroup, parentMeshGroupOfTransform, meshTransform, targetRenderUnit, _portrait);

                    #region [미사용 코드] 확장성 있는 코드로 변경했다.
                    //if (_parentModifier.ModifiedTargetType == apModifiedMesh.TARGET_TYPE.VertexWithMeshTransform)
                    //{
                    //	modMesh.Init_VertexMorph(_parentModifier._meshGroup._uniqueID,
                    //		meshTransform._transformUniqueID,
                    //		meshTransform._mesh._uniqueID);

                    //	modMesh.Link_VertexMorph(_parentModifier._meshGroup, meshTransform, targetRenderUnit);
                    //}
                    //else if (_parentModifier.ModifiedTargetType == apModifiedMesh.TARGET_TYPE.MeshTransformOnly)
                    //{
                    //	modMesh.Init_MeshTransform(_parentModifier._meshGroup._uniqueID,
                    //		meshTransform._transformUniqueID,
                    //		meshTransform._mesh._uniqueID);

                    //	modMesh.Link_MeshTransform(_parentModifier._meshGroup, meshTransform, targetRenderUnit);
                    //}
                    #endregion

                    paramSet._meshData.Add(modMesh);
                }
            }

            return(!isExist);
        }
        public bool RefreshSync()
        {
            if (_syncTransform_Mesh == null)
            {
                _syncTransform_Mesh = new List <apTransform_Mesh>();
            }
            _syncTransform_Mesh.Clear();

            if (_syncTransform_MeshGroup == null)
            {
                _syncTransform_MeshGroup = new List <apTransform_MeshGroup>();
            }
            _syncTransform_MeshGroup.Clear();

            if (_syncBone == null)
            {
                _syncBone = new List <apBone>();
            }
            _syncBone.Clear();

            //한번이라도 등장한 MeshTransform / MeshGroup Transform을 찾자
            for (int i = 0; i < _paramSetList.Count; i++)
            {
                apModifierParamSet paramSet = _paramSetList[i];

                for (int iModMesh = 0; iModMesh < paramSet._meshData.Count; iModMesh++)
                {
                    apModifiedMesh modMesh = paramSet._meshData[iModMesh];
                    if (modMesh._transform_Mesh != null)
                    {
                        //수정 4.1 : Mesh가 없는 MeshTransform
                        if (modMesh._transform_Mesh._mesh == null)
                        {
                            //Debug.Log("AnyPortrait : Mesh of [" + modMesh._transform_Mesh._nickName + "] is removed. Please check it.");
                        }
                        else
                        {
                            if (!_syncTransform_Mesh.Contains(modMesh._transform_Mesh))
                            {
                                _syncTransform_Mesh.Add(modMesh._transform_Mesh);
                            }
                        }

                        //이전 코드
                        //if (!_syncTransform_Mesh.Contains(modMesh._transform_Mesh))
                        //{
                        //	_syncTransform_Mesh.Add(modMesh._transform_Mesh);
                        //}
                    }
                    if (modMesh._transform_MeshGroup != null)
                    {
                        if (!_syncTransform_MeshGroup.Contains(modMesh._transform_MeshGroup))
                        {
                            _syncTransform_MeshGroup.Add(modMesh._transform_MeshGroup);
                        }
                    }
                }
                for (int iModBone = 0; iModBone < paramSet._boneData.Count; iModBone++)
                {
                    apModifiedBone modBone = paramSet._boneData[iModBone];

                    if (modBone._bone != null)
                    {
                        //>> 이건 Bone Set이 필요없다.
                        if (modBone._meshGroup_Bone != null &&
                            modBone._meshGroup_Bone._boneList_All.Contains(modBone._bone)                               //해당 MeshGroup에 Bone이 존재하는가.
                            )
                        {
                            if (!_syncBone.Contains(modBone._bone))
                            {
                                _syncBone.Add(modBone._bone);
                            }
                        }
                        else
                        {
                            //Modifier로 등록되었지만 Bone이 삭제되었다면 여기로 들어온다.
                            //Sync가 안됨
                        }
                    }
                }
            }

            //동기화 전용 Sync Transform을 모든 ParamSet에 넣자
            bool isAnyChanged = false;

            for (int iSync = 0; iSync < _syncTransform_Mesh.Count; iSync++)
            {
                apTransform_Mesh meshTransform = _syncTransform_Mesh[iSync];
                //bool isAdd = _parentModifier.AddMeshTransformToAllParamSet(_parentModifier._meshGroup, meshTransform, false);
                for (int iParamSet = 0; iParamSet < _paramSetList.Count; iParamSet++)
                {
                    bool isAdd = AddMeshTransformToParamSet(_paramSetList[iParamSet], meshTransform);
                    if (isAdd)
                    {
                        isAnyChanged = true;
                    }
                }
            }

            for (int iSync = 0; iSync < _syncTransform_MeshGroup.Count; iSync++)
            {
                apTransform_MeshGroup meshGroupTransform = _syncTransform_MeshGroup[iSync];
                for (int iParamSet = 0; iParamSet < _paramSetList.Count; iParamSet++)
                {
                    bool isAdd = AddMeshGroupTransformToParamSet(_paramSetList[iParamSet], meshGroupTransform);
                    //bool isAdd = _parentModifier.AddMeshGroupTransformToAllParamSet(_parentModifier._meshGroup, meshGroupTransform, false);
                    if (isAdd)
                    {
                        isAnyChanged = true;
                    }
                }
            }

            for (int iSync = 0; iSync < _syncBone.Count; iSync++)
            {
                apBone bone = _syncBone[iSync];

                apTransform_MeshGroup meshGroupTransform = null;
                if (_parentModifier._meshGroup == bone._meshGroup)
                {
                    meshGroupTransform = _parentModifier._meshGroup._rootMeshGroupTransform;
                }
                else
                {
                    meshGroupTransform = _parentModifier._meshGroup.FindChildMeshGroupTransform(bone._meshGroup);
                }

                for (int iParamSet = 0; iParamSet < _paramSetList.Count; iParamSet++)
                {
                    //이전
                    //bool isAdd = AddBoneToParamSet(_paramSetList[iParamSet], bone._meshGroup._rootMeshGroupTransform, bone);
                    //변경 : ChildMeshGroup의 Root MGTF로 설정하는 코드는 잘못되었다.
                    bool isAdd = AddBoneToParamSet(_paramSetList[iParamSet], meshGroupTransform, bone);
                    if (isAdd)
                    {
                        isAnyChanged = true;
                    }
                }
            }

            //추가 : Sync시 WeightedVertex도 같이 처리해주자
            // 동기화 안된건 자동 삭제
            for (int i = 0; i < _calculatedWeightedVertexList.Count; i++)
            {
                _calculatedWeightedVertexList[i]._isSync = false;
            }

            for (int iSync = 0; iSync < _syncTransform_Mesh.Count; iSync++)
            {
                apTransform_Mesh meshTransform            = _syncTransform_Mesh[iSync];
                apModifierParamSetGroupVertWeight existWV = _calculatedWeightedVertexList.Find(delegate(apModifierParamSetGroupVertWeight a)
                {
                    return(a._meshTransform_ID == meshTransform._transformUniqueID);
                });
                if (existWV != null)
                {
                    existWV._isSync = true;
                    existWV.LinkMeshTransform(meshTransform);
                }
                else
                {
                    //없다. 새로 만들자
                    apModifierParamSetGroupVertWeight newVW = new apModifierParamSetGroupVertWeight(meshTransform);
                    newVW._isSync = true;
                    _calculatedWeightedVertexList.Add(newVW);
                }
            }

            //동기화 되지 않은건 지운다.
            _calculatedWeightedVertexList.RemoveAll(delegate(apModifierParamSetGroupVertWeight a)
            {
                return(!a._isSync);
            });

            return(isAnyChanged);
        }
        /// <summary>
        /// Physic Modifier내에서의 Gizmo 이벤트 : Vertex 계열 선택시 [단일 선택]
        /// </summary>
        /// <param name="mousePosGL"></param>
        /// <param name="mousePosW"></param>
        /// <param name="btnIndex"></param>
        /// <param name="selectType"></param>
        /// <returns></returns>
        public apGizmos.SelectResult Select__Modifier_Physics(Vector2 mousePosGL, Vector2 mousePosW, int btnIndex, apGizmos.SELECT_TYPE selectType)
        {
            if (Editor.Select.MeshGroup == null || Editor.Select.Modifier == null)
            {
                return(null);
            }

            //(Editing 상태일 때)
            //1. Vertex 선택
            //2. (Lock 걸리지 않았다면) 다른 Transform을 선택

            //(Editing 상태가 아닐 때)
            //(Lock 걸리지 않았다면) Transform을 선택한다.
            // Child 선택이 가능하면 MeshTransform을 선택. 그렇지 않아면 MeshGroupTransform을 선택해준다.

            if (Editor.Select.ModRenderVertListOfMod == null)
            {
                return(null);
            }

            int prevSelectedCount = Editor.Select.ModRenderVertListOfMod.Count;

            if (!Editor.Controller.IsMouseInGUI(mousePosGL))
            {
                return(apGizmos.SelectResult.Main.SetMultiple <apSelection.ModRenderVert>(Editor.Select.ModRenderVertListOfMod));
            }

            bool isChildMeshTransformSelectable = Editor.Select.Modifier.IsTarget_ChildMeshTransform;

            //apGizmos.SELECT_RESULT result = apGizmos.SELECT_RESULT.None;

            bool isTransformSelectable = false;

            if (Editor.Select.ExEditingMode != apSelection.EX_EDIT.None)
            {
                //(Editing 상태일 때)
                //1. Vertex 선택
                //2. (Lock 걸리지 않았다면) 다른 Transform을 선택
                bool selectVertex = false;
                if (Editor.Select.ExKey_ModMesh != null && Editor.Select.MeshGroup != null)
                {
                    //일단 선택한 Vertex가 클릭 가능한지 체크
                    if (Editor.Select.ModRenderVertOfMod != null)
                    {
                        if (Editor.Select.ModRenderVertListOfMod.Count == 1)
                        {
                            if (Editor.Controller.IsVertexClickable(apGL.World2GL(Editor.Select.ModRenderVertOfMod._renderVert._pos_World), mousePosGL))
                            {
                                if (selectType == apGizmos.SELECT_TYPE.Subtract)
                                {
                                    //삭제인 경우 : ModVertWeight를 선택한다.
                                    Editor.Select.RemoveModVertexOfModifier(null, null, Editor.Select.ModRenderVertOfMod._modVertWeight, Editor.Select.ModRenderVertOfMod._renderVert);
                                }
                                else
                                {
                                    //그 외에는 => 그대로 갑시다.
                                    selectVertex = true;
                                    //return apGizmos.SELECT_RESULT.SameSelected;
                                }
                                //return Editor.Select.ModRenderVertListOfMod.Count;
                                return(apGizmos.SelectResult.Main.SetMultiple <apSelection.ModRenderVert>(Editor.Select.ModRenderVertListOfMod));
                            }
                        }
                        else
                        {
                            //여러개라고 하네요.
                            List <apSelection.ModRenderVert> modRenderVerts = Editor.Select.ModRenderVertListOfMod;
                            for (int iModRenderVert = 0; iModRenderVert < modRenderVerts.Count; iModRenderVert++)
                            {
                                apSelection.ModRenderVert modRenderVert = modRenderVerts[iModRenderVert];

                                if (Editor.Controller.IsVertexClickable(apGL.World2GL(modRenderVert._renderVert._pos_World), mousePosGL))
                                {
                                    if (selectType == apGizmos.SELECT_TYPE.Subtract)
                                    {
                                        //삭제인 경우
                                        //하나 지우고 끝
                                        //결과는 List의 개수
                                        Editor.Select.RemoveModVertexOfModifier(null, null, modRenderVert._modVertWeight, modRenderVert._renderVert);
                                    }
                                    else if (selectType == apGizmos.SELECT_TYPE.Add)
                                    {
                                        //Add 상태에서 원래 선택된걸 누른다면
                                        //추가인 경우 => 그대로
                                        selectVertex = true;
                                    }
                                    else
                                    {
                                        //만약... new 라면?
                                        //다른건 초기화하고
                                        //얘만 선택해야함
                                        apRenderVertex         selectedRenderVert    = modRenderVert._renderVert;
                                        apModifiedVertexWeight selectedModVertWeight = modRenderVert._modVertWeight;
                                        Editor.Select.SetModVertexOfModifier(null, null, null, null);
                                        Editor.Select.SetModVertexOfModifier(null, null, selectedModVertWeight, selectedRenderVert);
                                    }

                                    //return Editor.Select.ModRenderVertListOfMod.Count;
                                    return(apGizmos.SelectResult.Main.SetMultiple <apSelection.ModRenderVert>(Editor.Select.ModRenderVertListOfMod));
                                }
                            }
                        }
                    }

                    if (selectType == apGizmos.SELECT_TYPE.New)
                    {
                        //Add나 Subtract가 아닐땐, 잘못 클릭하면 선택을 해제하자 (전부)
                        Editor.Select.SetModVertexOfModifier(null, null, null, null);
                    }

                    if (selectType != apGizmos.SELECT_TYPE.Subtract)
                    {
                        if (Editor.Select.ExKey_ModMesh._transform_Mesh != null &&
                            Editor.Select.ExKey_ModMesh._vertices != null)
                        {
                            //선택된 RenderUnit을 고르자
                            apRenderUnit targetRenderUnit = Editor.Select.MeshGroup.GetRenderUnit(Editor.Select.ExKey_ModMesh._transform_Mesh);

                            if (targetRenderUnit != null)
                            {
                                for (int iVert = 0; iVert < targetRenderUnit._renderVerts.Count; iVert++)
                                {
                                    apRenderVertex renderVert = targetRenderUnit._renderVerts[iVert];
                                    bool           isClick    = Editor.Controller.IsVertexClickable(apGL.World2GL(renderVert._pos_World), mousePosGL);
                                    if (isClick)
                                    {
                                        apModifiedVertexWeight selectedModVertWeight = Editor.Select.ExKey_ModMesh._vertWeights.Find(delegate(apModifiedVertexWeight a)
                                        {
                                            return(renderVert._vertex._uniqueID == a._vertexUniqueID);
                                        });

                                        if (selectedModVertWeight != null)
                                        {
                                            if (selectType == apGizmos.SELECT_TYPE.New)
                                            {
                                                Editor.Select.SetModVertexOfModifier(null, null, selectedModVertWeight, renderVert);
                                            }
                                            else if (selectType == apGizmos.SELECT_TYPE.Add)
                                            {
                                                Editor.Select.AddModVertexOfModifier(null, null, selectedModVertWeight, renderVert);
                                            }

                                            selectVertex = true;
                                            //result = apGizmos.SELECT_RESULT.NewSelected;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                //Vertex를 선택한게 없다면
                //+ Lock 상태가 아니라면
                if (!selectVertex && !Editor.Select.IsLockExEditKey)
                {
                    //Transform을 선택
                    isTransformSelectable = true;
                }
            }
            else
            {
                //(Editing 상태가 아닐때)
                isTransformSelectable = true;

                if (Editor.Select.ExKey_ModMesh != null && Editor.Select.IsLockExEditKey)
                {
                    //뭔가 선택된 상태에서 Lock이 걸리면 다른건 선택 불가
                    isTransformSelectable = false;
                }
            }

            if (isTransformSelectable && selectType == apGizmos.SELECT_TYPE.New)
            {
                //(Editing 상태가 아닐 때)
                //Transform을 선택한다.

                apTransform_Mesh selectedMeshTransform = null;

                List <apRenderUnit> renderUnits = Editor.Select.MeshGroup._renderUnits_All;               //<<정렬된 Render Unit
                for (int iUnit = 0; iUnit < renderUnits.Count; iUnit++)
                {
                    apRenderUnit renderUnit = renderUnits[iUnit];
                    if (renderUnit._meshTransform != null && renderUnit._meshTransform._mesh != null)
                    {
                        if (renderUnit._meshTransform._isVisible_Default && renderUnit._meshColor2X.a > 0.1f)                        //Alpha 옵션 추가
                        {
                            //Debug.LogError("TODO : Mouse Picking 바꿀것");
                            bool isPick = apEditorUtil.IsMouseInRenderUnitMesh(
                                mousePosGL, renderUnit);

                            if (isPick)
                            {
                                selectedMeshTransform = renderUnit._meshTransform;
                                //찾았어도 계속 찾는다.
                                //뒤의 아이템이 "앞쪽"에 있는 것이기 때문
                            }
                        }
                    }
                }

                if (selectedMeshTransform != null)
                {
                    //만약 ChildMeshGroup에 속한 거라면,
                    //Mesh Group 자체를 선택해야 한다. <- 추가 : Child Mesh Transform이 허용되는 경우 그럴 필요가 없다.
                    apMeshGroup parentMeshGroup = Editor.Select.MeshGroup.FindParentMeshGroupOfMeshTransform(selectedMeshTransform);
                    if (parentMeshGroup == null || parentMeshGroup == Editor.Select.MeshGroup || isChildMeshTransformSelectable)
                    {
                        Editor.Select.SetSubMeshInGroup(selectedMeshTransform);
                    }
                    else
                    {
                        apTransform_MeshGroup childMeshGroupTransform = Editor.Select.MeshGroup.FindChildMeshGroupTransform(parentMeshGroup);
                        if (childMeshGroupTransform != null)
                        {
                            Editor.Select.SetSubMeshGroupInGroup(childMeshGroupTransform);
                        }
                        else
                        {
                            Editor.Select.SetSubMeshInGroup(selectedMeshTransform);
                        }
                    }
                }
                else
                {
                    Editor.Select.SetSubMeshInGroup(null);
                }

                Editor.RefreshControllerAndHierarchy();
                //Editor.Repaint();
                Editor.SetRepaint();
            }

            //개수에 따라 한번더 결과 보정
            if (Editor.Select.ModRenderVertListOfMod != null)
            {
                //return Editor.Select.ModRenderVertListOfMod.Count;
                return(apGizmos.SelectResult.Main.SetMultiple <apSelection.ModRenderVert>(Editor.Select.ModRenderVertListOfMod));
            }
            return(null);
        }
 // Get / Set
 //-------------------------------------------------
 public bool IsMeshTransformContain(apTransform_Mesh meshTransform)
 {
     return(_syncTransform_Mesh.Contains(meshTransform));
 }