예제 #1
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;
            }
        }
예제 #2
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;
            }
        }
예제 #3
0
        // Init
        //--------------------------------------------------------------------
        public void Init(apEditor editor, object loadKey, apMeshGroup srcMeshGroup, FUNC_SELECT_TRANSFORM_RESULT funcResult)
        {
            _editor  = editor;
            _loadKey = loadKey;
            //_srcMeshGroup = srcMeshGroup;
            _funcResult = funcResult;

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

            for (int i = 0; i < _editor._portrait._meshes.Count; i++)
            {
                _meshes.Add(_editor._portrait._meshes[i]);
            }


            for (int i = 0; i < _editor._portrait._meshGroups.Count; i++)
            {
                apMeshGroup meshGroup = _editor._portrait._meshGroups[i];
                if (meshGroup == srcMeshGroup)
                {
                    continue;
                }
                //재귀적으로 이미 포함된 MeshGroup인지 판단한다.
                //추가 12.03 : 그 반대도 포함해야 한다.
                apTransform_MeshGroup childMeshGroupTransform     = srcMeshGroup.FindChildMeshGroupTransform(meshGroup);
                apTransform_MeshGroup childMeshGroupTransform_Rev = meshGroup.FindChildMeshGroupTransform(srcMeshGroup);
                if (childMeshGroupTransform == null && childMeshGroupTransform_Rev == null)
                {
                    //child가 아닐때
                    _meshGroups.Add(meshGroup);
                }
            }
        }
예제 #4
0
        public void UpdateBeforeBake(apPortrait portrait, apMeshGroup mainMeshGroup, apTransform_MeshGroup mainMeshGroupTransform)
        {
            //Bake 전에 업데이트할게 있으면 여기서 업데이트하자

            //1. VertRig의 LocalPos 갱신을 여기서 하자
            #region [미사용 코드]
            //if(_vertRigs != null && _vertRigs.Count > 0)
            //{
            //	apModifiedVertexRig vertRig = null;
            //	//기존 링크 말고, Bake 직전의 Transform 등을 검색하여 값을 넣어주자
            //	apTransform_Mesh meshTransform = mainMeshGroup.GetMeshTransformRecursive(_transformUniqueID);
            //	if (meshTransform != null)
            //	{
            //		apMesh mesh = meshTransform._mesh;
            //		if (mesh != null)
            //		{
            //			for (int iVR = 0; iVR < _vertRigs.Count; iVR++)
            //			{
            //				vertRig = _vertRigs[iVR];
            //				apVertex vert = vertRig._vertex;

            //				for (int iW = 0; iW < vertRig._weightPairs.Count; iW++)
            //				{
            //					apModifiedVertexRig.WeightPair weightPair = vertRig._weightPairs[iW];
            //					weightPair.CalculateLocalPos(vert._pos, mesh.Matrix_VertToLocal, meshTransform._matrix_TFResult_WorldWithoutMod, weightPair._bone._defaultMatrix);
            //				}

            //			}
            //		}
            //	}
            //}
            #endregion
        }
예제 #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);
        }
예제 #6
0
 public apPSDSetLayer GetLayer(apTransform_MeshGroup meshGroupTransform)
 {
     return(_layers.Find(delegate(apPSDSetLayer a)
     {
         return a._transformID == meshGroupTransform._transformUniqueID && !a._isImageLayer;
     }));
 }
 // Init
 //----------------------------------------------
 public apRetargetSubUnit()
 {
     _isImported               = false;
     _targetMeshTransform      = null;
     _targetMeshGroupTransform = null;
     _targetBone               = null;
 }
예제 #8
0
        //TODO Link 등등
        //에디터에서 제대로 Link를 해야한다.
        public void Link(apMeshGroup meshGroup_Modifier, apMeshGroup meshGroup_Bone, apBone bone, apRenderUnit renderUnit, apTransform_MeshGroup meshGroupTransform)
        {
            _meshGroup_Modifier = meshGroup_Modifier;
            _meshGroup_Bone     = meshGroup_Bone;
            _bone       = bone;
            _renderUnit = renderUnit;


            _meshGroupTransform = meshGroupTransform;


            //if (_meshGroup_Bone != meshGroup_Modifier)
            //{
            //	//Debug.Log(" ------------Sub Bone의 Link ------------");
            //	if (_renderUnit == null)
            //	{
            //		//Debug.LogError("<<< Render Unit이 Null이다. >>> ");
            //	}
            //	Debug.Log("meshGroup_Modifier : " + (meshGroup_Modifier == null ? "NULL" : meshGroup_Modifier._name));
            //	Debug.Log("_meshGroup_Bone : " + (_meshGroup_Bone == null ? "NULL" : _meshGroup_Bone._name));
            //	Debug.Log("_bone : " + (_bone == null ? "NULL" : _bone._name));
            //	Debug.Log("_meshGroupTransform : " + (_meshGroupTransform == null ? "NULL" : _meshGroupTransform._nickName));
            //	Debug.Log("_transformUniqueID : " + _transformUniqueID);
            //}
        }
예제 #9
0
        private bool AddBoneToParamSet(apModifierParamSet paramSet, apTransform_MeshGroup meshGroupTransform, apBone bone)
        {
            if (!_parentModifier.IsTarget_Bone)
            {
                return(false);
            }

            bool isExist = paramSet._boneData.Exists(delegate(apModifiedBone a)
            {
                return(a._bone == bone);
            });

            if (!isExist)
            {
                apMeshGroup parentMeshGroupOfBone = GetParentMeshGroupOfBone(bone);
                if (parentMeshGroupOfBone == null)
                {
                    return(false);
                }

                apRenderUnit targetRenderUnit = _parentModifier._meshGroup.GetRenderUnit(meshGroupTransform);

                apModifiedBone modBone = new apModifiedBone();
                modBone.Init(_parentModifier._meshGroup._uniqueID, parentMeshGroupOfBone._uniqueID, meshGroupTransform._transformUniqueID, bone);
                modBone.Link(_parentModifier._meshGroup, parentMeshGroupOfBone, bone, targetRenderUnit, meshGroupTransform);


                paramSet._boneData.Add(modBone);
            }

            return(!isExist);
        }
예제 #10
0
 public bool IsSubMeshGroupInGroup(apTransform_MeshGroup subMeshGroupTransform)
 {
     if (subMeshGroupTransform == null)
     {
         return(false);
     }
     return(_syncTransform_MeshGroup.Contains(subMeshGroupTransform));
 }
        //TODO Link 등등
        //에디터에서 제대로 Link를 해야한다.
        public void Link(apMeshGroup meshGroup_Modifier, apMeshGroup meshGroup_Bone, apBone bone, apRenderUnit renderUnit, apTransform_MeshGroup meshGroupTransform)
        {
            _meshGroup_Modifier = meshGroup_Modifier;
            _meshGroup_Bone     = meshGroup_Bone;
            _bone       = bone;
            _renderUnit = renderUnit;

            _meshGroupTransform = meshGroupTransform;
        }
예제 #12
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);
        }
예제 #13
0
 public bool IsContainMeshGroupTransform(apTransform_MeshGroup meshGroupTransform)
 {
     if (meshGroupTransform == null)
     {
         return(false);
     }
     return(_meshData.Exists(delegate(apModifiedMesh a)
     {
         return !a._isMeshTransform && a._transform_MeshGroup == meshGroupTransform;
     }));
 }
예제 #14
0
        /// <summary>
        /// MeshGroupTransform과 ModMesh를 연결한다.
        /// </summary>
        /// <param name="meshGroupOfMod">Modifier가 속한 MeshGroup</param>
        /// <param name="meshGroupOfTransform">Transform이 속한 MeshGroup</param>
        public void Link_MeshGroupTransform(apMeshGroup meshGroupOfMod, apMeshGroup meshGroupOfTransform, apTransform_MeshGroup meshGroupTransform, apRenderUnit renderUnit)
        {
            _meshGroupOfModifier  = meshGroupOfMod;
            _meshGroupOfTransform = meshGroupOfTransform;

            _transform_MeshGroup = meshGroupTransform;
            _renderUnit          = renderUnit;


            RefreshModifiedValues(meshGroupOfMod._parentPortrait);
        }
예제 #15
0
 public bool IsContains_MeshGroupTransform(apMeshGroup meshGroup, apTransform_MeshGroup meshGroupTransform)
 {
     if (_meshGroupUniqueID_Modifier == meshGroup._uniqueID &&
         _transformUniqueID == meshGroupTransform._transformUniqueID &&
         _transformUniqueID >= 0 &&
         !_isMeshTransform)
     {
         return(true);
     }
     return(false);
 }
예제 #16
0
 /// <summary>
 /// 처리를 도와주는 함수. MeshTransform의 Parent MeshGroup을 검색한다.
 /// </summary>
 /// <param name="meshTransform"></param>
 /// <returns></returns>
 private apMeshGroup GetParentMeshGroupOfMeshGroupTransform(apTransform_MeshGroup meshGroupTransform)
 {
     for (int i = 0; i < _portrait._meshGroups.Count; i++)
     {
         if (_portrait._meshGroups[i]._childMeshGroupTransforms.Contains(meshGroupTransform))
         {
             //찾았다!
             return(_portrait._meshGroups[i]);
         }
     }
     return(null);
 }
예제 #17
0
 // Functions
 //------------------------------------------
 //추가되었다.
 //Bake 전에 업데이트하는 부분
 public void UpdateBeforeBake(apPortrait portrait, apMeshGroup mainMeshGroup, apTransform_MeshGroup mainMeshGroupTransform)
 {
     if (_meshData != null && _meshData.Count > 0)
     {
         for (int i = 0; i < _meshData.Count; i++)
         {
             _meshData[i].UpdateBeforeBake(portrait, mainMeshGroup, mainMeshGroupTransform);
         }
     }
     if (_boneData != null && _boneData.Count > 0)
     {
         for (int i = 0; i < _boneData.Count; i++)
         {
             _boneData[i].UpdateBeforeBake(portrait, mainMeshGroup, mainMeshGroupTransform);
         }
     }
 }
예제 #18
0
        /// <summary>
        /// ParamSetGroup 내의 모든 ParamSet에서 MeshGroupTransform을 포함한 ModMesh를 모두 삭제한다.
        /// 주의 메세지를 꼭 출력할 것
        /// </summary>
        /// <param name="meshGroupTransform"></param>
        public void RemoveModifierMeshes(apTransform_MeshGroup meshGroupTransform)
        {
            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_MeshGroupTransform(_parentModifier._meshGroup, meshGroupTransform));
                });

                if (nRemoved > 0)
                {
                    //Debug.LogError("Remove ModMesh [RemoveModifierMeshes / MeshGroupTransform] : " + meshGroupTransform._nickName + " / " + nRemoved);
                }
            }
        }
예제 #19
0
        private bool AddMeshGroupTransformToParamSet(apModifierParamSet paramSet, apTransform_MeshGroup meshGroupTransform)
        {
            //if(_parentModifier.ModifiedTargetType != apModifiedMesh.TARGET_TYPE.MeshGroupTransformOnly)
            //{
            //	return false;
            //}
            if (!_parentModifier.IsTarget_MeshGroupTransform)
            {
                return(false);
            }

            bool isExist = paramSet._meshData.Exists(delegate(apModifiedMesh a)
            {
                return(a.IsContains_MeshGroupTransform(_parentModifier._meshGroup, meshGroupTransform));
            });

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

                    apModifiedMesh modMesh = new apModifiedMesh();
                    modMesh.Init(_parentModifier._meshGroup._uniqueID, parentMeshGroupOfTransform._uniqueID, _parentModifier.ModifiedValueType);
                    modMesh.SetTarget_MeshGroupTransform(meshGroupTransform._transformUniqueID, meshGroupTransform._meshColor2X_Default, meshGroupTransform._isVisible_Default);

                    //modMesh.Init_MeshGroupTransform(_parentModifier._meshGroup._uniqueID,
                    //		meshGroupTransform._transformUniqueID);

                    modMesh.Link_MeshGroupTransform(_parentModifier._meshGroup, parentMeshGroupOfTransform, meshGroupTransform, targetRenderUnit);
                    paramSet._meshData.Add(modMesh);
                }
            }

            return(!isExist);
        }
예제 #20
0
        // 에디터 관련 코드
        //----------------------------------------------------
        public void ActiveAllModifierFromExclusiveEditing()
        {
            apModifierBase modifier = null;

            for (int i = 0; i < _modifiers.Count; i++)
            {
                modifier = _modifiers[i];
                modifier._editorExclusiveActiveMod = apModifierBase.MOD_EDITOR_ACTIVE.Enabled;

                for (int iP = 0; iP < modifier._paramSetGroup_controller.Count; iP++)
                {
                    modifier._paramSetGroup_controller[iP]._isEnabledExclusive = true;
                }

                //List<apCalculatedResultParam> calParamList = modifier._calculatedResultParams;
                //for (int iCal = 0; iCal < calParamList.Count; iCal++)
                //{
                //	calParamList[iCal].ActiveAllParamList();
                //}
            }

            //Child MeshGroup에도 모두 적용하자
            if (_parentMeshGroup != null)
            {
                if (_parentMeshGroup._childMeshGroupTransforms != null)
                {
                    for (int i = 0; i < _parentMeshGroup._childMeshGroupTransforms.Count; i++)
                    {
                        apTransform_MeshGroup meshGroupTransform = _parentMeshGroup._childMeshGroupTransforms[i];
                        if (meshGroupTransform._meshGroup != null && meshGroupTransform._meshGroup != _parentMeshGroup)
                        {
                            meshGroupTransform._meshGroup._modifierStack.ActiveAllModifierFromExclusiveEditing();
                        }
                    }
                }
            }
        }
예제 #21
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 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);
            }
        }
        /// <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);
        }
예제 #24
0
        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);
        }
예제 #25
0
 public bool IsMeshGroupTransformContain(apTransform_MeshGroup meshGroupTransform)
 {
     return(_syncTransform_MeshGroup.Contains(meshGroupTransform));
 }
예제 #26
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));
        }
        // Functions
        //--------------------------------------
        public void SetMeshGroup(apMeshGroup meshGroup)
        {
            if (meshGroup == null)
            {
                _childMeshGroup = null;

                //ID를 반납하자
                if (_childMeshGroupTransform != null)
                {
                    //_portrait.PushUniqueID_Transform(_childMeshGroupTransform._transformUniqueID);
                    _portrait.PushUnusedID(apIDManager.TARGET.Transform, _childMeshGroupTransform._transformUniqueID);

                    _childMeshGroupTransform = null;
                }
                _renderUnit = null;
            }
            if (meshGroup != null)
            {
                _childMeshGroup = meshGroup;

                bool resetMeshGroupTransform = false;
                if (_childMeshGroupTransform == null)
                {
                    resetMeshGroupTransform = true;
                }
                else if (_childMeshGroupTransform._meshGroupUniqueID != meshGroup._uniqueID)
                {
                    //_portrait.PushUniqueID_Transform(_childMeshGroupTransform._transformUniqueID);
                    _portrait.PushUnusedID(apIDManager.TARGET.Transform, _childMeshGroupTransform._transformUniqueID);

                    _childMeshGroupTransform = null;
                    resetMeshGroupTransform  = true;
                }

                if (resetMeshGroupTransform)
                {
                    //Root는 별도의 Transform_MeshGroup을 가진다.

                    //새로운 ID로 Transform을 만들자
                    //_childMeshGroupTransform = new apTransform_MeshGroup(_portrait.MakeUniqueID_Transform());
                    _childMeshGroupTransform = new apTransform_MeshGroup(_portrait.MakeUniqueID(apIDManager.TARGET.Transform));

                    _childMeshGroupTransform._meshGroupUniqueID = meshGroup._uniqueID;
                    _childMeshGroupTransform._nickName          = meshGroup._name;
                    _childMeshGroupTransform._meshGroup         = meshGroup;
                    _childMeshGroupTransform._matrix            = new apMatrix();
                    _childMeshGroupTransform._isVisible_Default = true;

                    _childMeshGroupTransform._depth = 1;

                    //추가
                    //Root Transform_MeshGroup에 해당하는 RenderUnit
                    _renderUnit = new apRenderUnit(_portrait, "Root");
                    _renderUnit.SetGroup(meshGroup, _childMeshGroupTransform, null);
                    _renderUnit._childRenderUnits.Add(meshGroup._rootRenderUnit);
                }
                else
                {
                    _childMeshGroupTransform._meshGroup = meshGroup;                    //Link만 하자
                    if (_renderUnit == null)
                    {
                        _renderUnit = new apRenderUnit(_portrait, "Root");
                        _renderUnit.SetGroup(meshGroup, _childMeshGroupTransform, null);
                        _renderUnit._childRenderUnits.Add(meshGroup._rootRenderUnit);
                    }
                    else
                    {
                        _renderUnit._meshGroupTransform = _childMeshGroupTransform;
                        _renderUnit._meshGroup          = meshGroup;
                        _renderUnit._childRenderUnits.Clear();
                        _renderUnit._childRenderUnits.Add(meshGroup._rootRenderUnit);
                    }
                }
            }
        }
 // Functions
 //------------------------------------------
 public void UpdateBeforeBake(apPortrait portrait, apMeshGroup mainMeshGroup, apTransform_MeshGroup mainMeshGroupTransform)
 {
 }
예제 #29
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();
        }
예제 #30
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);
            });
        }