public void Bake(apPortrait portrait, apOptModifierUnitBase parentModifier, apModifierParamSetGroup srcParamSetGroup)
        {
            _portrait       = portrait;
            _parentModifier = parentModifier;

            _syncTarget = srcParamSetGroup._syncTarget;

            //_keyControlParamName = srcParamSetGroup._keyControlParamName;
            _keyControlParamID = srcParamSetGroup._keyControlParamID;
            _keyControlParam   = null;          //<<이건 링크로 해결하자

            //애니메이션 값도 넣어주자
            _keyAnimClipID          = srcParamSetGroup._keyAnimClipID;
            _keyAnimTimelineID      = srcParamSetGroup._keyAnimTimelineID;
            _keyAnimTimelineLayerID = srcParamSetGroup._keyAnimTimelineLayerID;
            _keyAnimClip            = null;
            _keyAnimTimeline        = null;
            _keyAnimTimelineLayer   = null;

            _paramSetList.Clear();

            for (int i = 0; i < srcParamSetGroup._paramSetList.Count; i++)
            {
                apModifierParamSet srcParamSet = srcParamSetGroup._paramSetList[i];

                apOptParamSet optParamSet = new apOptParamSet();
                optParamSet.LinkParamSetGroup(this, portrait);
                optParamSet.BakeModifierParamSet(srcParamSet, portrait);


                _paramSetList.Add(optParamSet);
            }

            _isEnabled   = srcParamSetGroup._isEnabled;
            _layerIndex  = srcParamSetGroup._layerIndex;
            _layerWeight = srcParamSetGroup._layerWeight;
            _blendMethod = srcParamSetGroup._blendMethod;

            _isColorPropertyEnabled = srcParamSetGroup._isColorPropertyEnabled;            //<<추가.

            _calculatedWeightedVertexList.Clear();

            for (int i = 0; i < srcParamSetGroup._calculatedWeightedVertexList.Count; i++)
            {
                apModifierParamSetGroupVertWeight srcWV = srcParamSetGroup._calculatedWeightedVertexList[i];

                apOptParamSetGroupVertWeight optWV = new apOptParamSetGroupVertWeight();
                optWV.Bake(srcWV);

                optWV.Link(portrait.GetOptTransform(optWV._meshTransform_ID));                //OptTransform을 연결한다.

                _calculatedWeightedVertexList.Add(optWV);
            }

            LinkPortrait(portrait, parentModifier);
        }
Пример #2
0
        public void LinkPortrait(apPortrait portrait, apOptModifierUnitBase parentModifier)
        {
            _portrait       = portrait;
            _parentModifier = parentModifier;

            switch (_syncTarget)
            {
            case apModifierParamSetGroup.SYNC_TARGET.Static:
                break;

            case apModifierParamSetGroup.SYNC_TARGET.Controller:
                //_keyControlParam = _portrait.GetControlParam(_keyControlParamName);
                _keyControlParam = _portrait.GetControlParam(_keyControlParamID);
                break;

            case apModifierParamSetGroup.SYNC_TARGET.KeyFrame:
                _keyAnimClip = _portrait.GetAnimClip(_keyAnimClipID);
                if (_keyAnimClip == null)
                {
                    Debug.LogError("Error : No AnimClip [" + _keyAnimClipID + "]");
                    break;
                }

                _keyAnimTimeline = _keyAnimClip.GetTimeline(_keyAnimTimelineID);
                if (_keyAnimTimeline == null)
                {
                    Debug.LogError("Error : No AnimTimeline [" + _keyAnimTimelineID + "]");
                    break;
                }

                _keyAnimTimelineLayer = _keyAnimTimeline.GetTimelineLayer(_keyAnimTimelineLayerID);

                if (_keyAnimTimelineLayer == null)
                {
                    Debug.LogError("Error : No AnimTimelineLayer [" + _keyAnimTimelineLayerID + "]");
                    break;
                }

                break;

            default:
                Debug.LogError("apOptParamSetGroup : 알수 없는 타입 : " + _syncTarget);
                break;
            }

            for (int i = 0; i < _paramSetList.Count; i++)
            {
                _paramSetList[i].LinkParamSetGroup(this, portrait);
            }

            for (int i = 0; i < _calculatedWeightedVertexList.Count; i++)
            {
                _calculatedWeightedVertexList[i].Link(portrait.GetOptTransform(_calculatedWeightedVertexList[i]._meshTransform_ID));
            }
        }
Пример #3
0
        public void Link(apPortrait portrait)
        {
            _portrait = portrait;

            _parentTransform = _portrait.GetOptTransform(_parentTransformID);

            for (int i = 0; i < _modifiers.Count; i++)
            {
                _modifiers[i].Link(portrait);
            }

            _nModifiers = _modifiers.Count;
        }
        // Init - Bake
        //--------------------------------------------
        public bool Bake(apModifiedMesh srcModMesh, apPortrait portrait)
        {
            _portrait = portrait;
            _rootMeshGroupUniqueID = srcModMesh._meshGroupUniqueID_Modifier;

            _meshUniqueID      = srcModMesh._meshUniqueID;
            _transformUniqueID = srcModMesh._transformUniqueID;

            //_boneUniqueID = srcModMesh._boneUniqueID;

            _isMeshTransform = srcModMesh._isMeshTransform;

            apOptTransform rootTransform   = _portrait.GetOptTransformAsMeshGroup(_rootMeshGroupUniqueID);
            apOptTransform targetTransform = _portrait.GetOptTransform(_transformUniqueID);

            if (targetTransform == null)
            {
                Debug.LogError("Bake 실패 : 찾을 수 없는 연결된 OptTransform [" + _transformUniqueID + "]");
                Debug.LogError("이미 삭제된 객체에 연결된 ModMesh가 아닌지 확인해보세염");
                return(false);
            }
            apOptMesh targetMesh = null;

            if (targetTransform._unitType == apOptTransform.UNIT_TYPE.Mesh)
            {
                targetMesh = targetTransform._childMesh;
            }



            if (rootTransform == null)
            {
                Debug.LogError("ModifiedMesh 연동 에러 : 알수 없는 RootTransform");
                return(false);
            }

            //_targetType = srcModMesh._targetType;
            _modValueType = srcModMesh._modValueType;

            //switch (srcModMesh._targetType)
            Color meshColor = srcModMesh._meshColor;

            if (!srcModMesh._isVisible)
            {
                meshColor.a = 0.0f;
            }

            _isUsePhysicParam = srcModMesh._isUsePhysicParam;
            if (_isUsePhysicParam)
            {
                _physicMeshParam = new apOptPhysicsMeshParam();
                _physicMeshParam.Bake(srcModMesh.PhysicParam);
                _physicMeshParam.Link(_portrait);
            }

            //Modifier Value에 맞게 Bake를 하자
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexPosList) != 0)
            {
                Bake_VertexMorph(rootTransform,
                                 targetTransform,
                                 targetMesh,
                                 srcModMesh._vertices,
                                 meshColor,
                                 srcModMesh._isVisible);
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.TransformMatrix) != 0)
            {
                if (srcModMesh._isMeshTransform)
                {
                    Bake_MeshTransform(rootTransform,
                                       targetTransform,
                                       targetMesh,
                                       srcModMesh._transformMatrix,
                                       meshColor,
                                       srcModMesh._isVisible);
                }
                else
                {
                    Bake_MeshGroupTransform(rootTransform,
                                            targetTransform,
                                            srcModMesh._transformMatrix,
                                            meshColor,
                                            srcModMesh._isVisible);
                }
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.BoneVertexWeightList) != 0)
            {
                //추가 : VertRig 데이터를 넣는다.
                Bake_VertexRigs(rootTransform, targetTransform, targetMesh, srcModMesh._vertRigs);
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList_Physics) != 0 ||
                     (int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList_Volume) != 0)
            {
                Bake_VertexWeights(rootTransform, targetTransform, targetMesh, srcModMesh._vertWeights);
            }
            else
            {
                Debug.LogError("연동 에러 : 알 수 없는 ModifierMesh 타입 : " + srcModMesh._modValueType);
                return(false);
            }
            #region [미사용 코드] ModValue를 고정된 타입으로 Bake할때 (코드 손상됨)
            //switch(srcModMesh._modValueType)
            //{
            //	//case apModifiedMesh.TARGET_TYPE.VertexWithMeshTransform:
            //	case apModifiedMesh.MOD_VALUE_TYPE.VertexPosList:
            //		{
            //			//TODO : 여기서부터 연동하자.

            //		}
            //		break;

            //	//case apModifiedMesh.TARGET_TYPE.MeshTransformOnly:
            //	case apModifiedMesh.MOD_VALUE_TYPE.TransformMatrix:
            //		{

            //		}
            //		break;

            //	case apModifiedMesh.MOD_VALUE_TYPE.Color:
            //		{
            //			Debug.LogError("TODO : OptModMesh에서 Color에 대한 처리를 해야한다.");
            //		}
            //		break;

            //	case apModifiedMesh.MOD_VALUE_TYPE.BoneVertexWeightList:
            //		{
            //			Debug.LogError("TODO : 본 연동");
            //		}
            //		break;

            //	//case apModifiedMesh.TARGET_TYPE.Bone:
            //	case apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList:
            //		{
            //			Debug.LogError("TODO : 버텍스 가중시 연동");
            //		}
            //		break;

            //	default:
            //		//Debug.LogError("연동 에러 : 알수 없는 ModifierMesh 타입 : " + srcModMesh._targetType);
            //		Debug.LogError("연동 에러 : 알 수 없는 ModifierMesh 타입 : " + srcModMesh._modValueType);
            //		break;
            //}
            #endregion

            return(true);
        }
        // Init - Bake
        //--------------------------------------------
        public bool Bake(apModifiedMesh srcModMesh, apPortrait portrait)
        {
            _portrait = portrait;
            _rootMeshGroupUniqueID = srcModMesh._meshGroupUniqueID_Modifier;

            _meshUniqueID      = srcModMesh._meshUniqueID;
            _transformUniqueID = srcModMesh._transformUniqueID;

            //_boneUniqueID = srcModMesh._boneUniqueID;

            _isMeshTransform = srcModMesh._isMeshTransform;

            apOptTransform rootTransform   = _portrait.GetOptTransformAsMeshGroup(_rootMeshGroupUniqueID);
            apOptTransform targetTransform = _portrait.GetOptTransform(_transformUniqueID);

            if (targetTransform == null)
            {
                Debug.LogError("Bake 실패 : 찾을 수 없는 연결된 OptTransform [" + _transformUniqueID + "]");
                Debug.LogError("이미 삭제된 객체에 연결된 ModMesh가 아닌지 확인해보세염");
                return(false);
            }
            apOptMesh targetMesh = null;

            if (targetTransform._unitType == apOptTransform.UNIT_TYPE.Mesh)
            {
                targetMesh = targetTransform._childMesh;
            }



            if (rootTransform == null)
            {
                Debug.LogError("ModifiedMesh 연동 에러 : 알수 없는 RootTransform");
                return(false);
            }

            //_targetType = srcModMesh._targetType;
            _modValueType = srcModMesh._modValueType;

            //switch (srcModMesh._targetType)
            Color meshColor = srcModMesh._meshColor;

            if (!srcModMesh._isVisible)
            {
                meshColor.a = 0.0f;
            }

            _isUsePhysicParam = srcModMesh._isUsePhysicParam;
            if (_isUsePhysicParam)
            {
                _physicMeshParam = new apOptPhysicsMeshParam();
                _physicMeshParam.Bake(srcModMesh.PhysicParam);
                _physicMeshParam.Link(_portrait);
            }

            //추가 ExtraOption
            _isExtraValueEnabled = srcModMesh._isExtraValueEnabled;
            _extraValue.Bake(srcModMesh._extraValue);
            if (!_extraValue._isDepthChanged && !_extraValue._isTextureChanged)
            {
                _isExtraValueEnabled = false;
            }

            //Modifier Value에 맞게 Bake를 하자
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexPosList) != 0)
            {
                Bake_VertexMorph(rootTransform,
                                 targetTransform,
                                 targetMesh,
                                 srcModMesh._vertices,
                                 meshColor,
                                 srcModMesh._isVisible);
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.TransformMatrix) != 0)
            {
                if (srcModMesh._isMeshTransform)
                {
                    Bake_MeshTransform(rootTransform,
                                       targetTransform,
                                       targetMesh,
                                       srcModMesh._transformMatrix,
                                       meshColor,
                                       srcModMesh._isVisible);
                }
                else
                {
                    Bake_MeshGroupTransform(rootTransform,
                                            targetTransform,
                                            srcModMesh._transformMatrix,
                                            meshColor,
                                            srcModMesh._isVisible);
                }
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.BoneVertexWeightList) != 0)
            {
                //추가 : VertRig 데이터를 넣는다.
                bool isValidVertexRigsData = Bake_VertexRigs(rootTransform, targetTransform, targetMesh, srcModMesh._vertRigs);
                if (!isValidVertexRigsData)
                {
                    //유효하지 않은 Rigging의 ModMesh가 있다.
                    //Rig 데이터가 아무것도 없는 ModMesh는 Opt에서 오작동을 한다. (오류 검사를 안하므로)
                    //Debug.LogError("Rig 데이터가 없는 ModMesh");
                    string strTransform = rootTransform._name + " / " + targetTransform._name;
                    Debug.LogError("AnyPortrait : Vertices with missing rigging data have been detected. Rigging for [" + strTransform + "] is not Bake.");
                    return(false);
                }
            }
            else if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList_Physics) != 0 ||
                     (int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList_Volume) != 0)
            {
                Bake_VertexWeights(rootTransform, targetTransform, targetMesh, srcModMesh._vertWeights);
            }
            else
            {
                Debug.LogError("연동 에러 : 알 수 없는 ModifierMesh 타입 : " + srcModMesh._modValueType);
                return(false);
            }



            return(true);
        }
Пример #6
0
        // Bake
        //---------------------------------------------------------------------------------
        public bool Bake(apModifierBase srcModifier,
                         apModifierParamSetGroup srcModParamSetGroup,
                         apModifiedMesh srcModMesh,
                         apPortrait portrait)
        {
            _portrait = portrait;
            _rootMeshGroupUniqueID = srcModMesh._meshGroupUniqueID_Modifier;

            _meshUniqueID      = srcModMesh._meshUniqueID;
            _transformUniqueID = srcModMesh._transformUniqueID;

            //_boneUniqueID = srcModMesh._boneUniqueID;

            _isMeshTransform = srcModMesh._isMeshTransform;

            apOptTransform rootTransform   = _portrait.GetOptTransformAsMeshGroup(_rootMeshGroupUniqueID);
            apOptTransform targetTransform = _portrait.GetOptTransform(_transformUniqueID);

            if (targetTransform == null)
            {
                Debug.LogError("Bake 실패 : 찾을 수 없는 연결된 OptTransform [" + _transformUniqueID + "]");
                Debug.LogError("이미 삭제된 객체에 연결된 ModMesh가 아닌지 확인해보세염");
                return(false);
            }
            apOptMesh targetMesh = null;

            if (targetTransform._unitType == apOptTransform.UNIT_TYPE.Mesh)
            {
                targetMesh = targetTransform._childMesh;
            }



            if (rootTransform == null)
            {
                Debug.LogError("ModifiedMesh 연동 에러 : 알수 없는 RootTransform");
                return(false);
            }

            _rootTransform   = rootTransform;
            _targetTransform = targetTransform;
            _targetMesh      = targetMesh;


            //각각의 타입
            _dataType = DATA_TYPE.None;

            //1. Vertex
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexPosList) != 0)
            {
                Bake_Vertex(srcModMesh._vertices);
            }

            //2. Transform
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.TransformMatrix) != 0)
            {
                Bake_Transform(srcModMesh._transformMatrix);
            }

            //3. Rigging
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.BoneVertexWeightList) != 0)
            {
                Bake_VertexRigs(srcModMesh._vertRigs);
            }

            //4. Physics
            if ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexWeightList_Physics) != 0 &&
                srcModMesh._isUsePhysicParam)
            {
                Bake_Physics(srcModMesh.PhysicParam, srcModMesh._vertWeights, portrait);
            }


            if (((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.VertexPosList) != 0) ||
                ((int)(srcModMesh._modValueType & apModifiedMesh.MOD_VALUE_TYPE.TransformMatrix) != 0)
                )
            {
                //Morph, Transform 모디파이어에서..

                //5. Color
                if (srcModifier._isColorPropertyEnabled &&
                    srcModParamSetGroup._isColorPropertyEnabled)
                {
                    //색상 옵션이 켜진 경우
                    Color meshColor = srcModMesh._meshColor;
                    if (!srcModMesh._isVisible)
                    {
                        meshColor.a = 0.0f;
                    }

                    Bake_Color(meshColor, srcModMesh._isVisible);
                }

                //6. Extra
                if (srcModMesh._isExtraValueEnabled &&
                    (srcModMesh._extraValue._isDepthChanged || srcModMesh._extraValue._isTextureChanged)
                    )
                {
                    //Extra 옵션이 켜진 경우
                    Bake_ExtraValue(srcModMesh);
                }
            }


            return(true);
        }