Пример #1
0
        public bool Bake(apModifiedBone srcModBone, apPortrait portrait)
        {
            _portrait         = portrait;
            _meshGroupID_Bone = srcModBone._meshGropuUniqueID_Bone;
            apOptTransform meshGroupTransform = portrait.GetOptTransformAsMeshGroup(_meshGroupID_Bone);

            if (meshGroupTransform == null)
            {
                Debug.LogError("[ModBone] Bake 실패 : 찾을 수 없는 OptTransform [" + _meshGroupID_Bone + "]");
                return(false);
            }

            _transformUniqueID = meshGroupTransform._transformID;
            _meshGroup_Bone    = meshGroupTransform;

            _boneID = srcModBone._boneID;

            _bone = meshGroupTransform.GetBone(_boneID);
            if (_bone == null)
            {
                Debug.LogError("[ModBone] Bake 실패 : 찾을 수 없는 Bone [" + _boneID + "]");
                return(false);
            }
            _transformMatrix = new apMatrix(srcModBone._transformMatrix);
            return(true);
        }
                public bool Link(apPortrait portrait, apCache <apOptTransform> cache)
                {
                    _bone = null;

                    //Cache를 통해서 일단 MeshGroup에 해당하는 optTransform을 찾자
                    apOptTransform meshGroup = null;

                    if (cache.IsContain(_meshGroupID))
                    {
                        meshGroup = cache.Get(_meshGroupID);
                    }
                    else
                    {
                        meshGroup = portrait.GetOptTransformAsMeshGroup(_meshGroupID);
                        if (meshGroup == null)
                        {
                            Debug.LogError("VertRig Bake 실패 : MeshGroup을 찾을 수 없다. [" + _meshGroupID + "]");
                            return(false);
                        }

                        //캐시에 담고
                        cache.Add(_meshGroupID, meshGroup);
                    }

                    //본을 찾자
                    _bone = meshGroup.GetBone(_boneID);
                    if (_bone == null)
                    {
                        Debug.LogError("VertRig Bake 실패 : Bone을 찾을 수 없다. [" + _boneID + "]");
                        return(false);
                    }

                    return(true);
                }
        public void LinkOpt(apPortrait portrait)
        {
            _portrait = portrait;


            if (_targetMeshGroupID < 0)
            {
                //연결되지 않았네요.
                UnityEngine.Debug.LogError("No MeshGroup Linked");
                return;
            }


            _targetOptTranform = _portrait.GetOptTransformAsMeshGroup(_targetMeshGroupID);


            if (_targetOptTranform == null)
            {
                //UnityEngine.Debug.LogError("AnimClip이 적용되는 Target Opt Transform이 Null이다. [" + _targetMeshGroupID + "] (" + _name + ")");
                //이 AnimClip을 사용하지 맙시다.
                return;
            }


            for (int i = 0; i < _timelines.Count; i++)
            {
                _timelines[i].LinkOpt(this);
            }
        }
Пример #4
0
        public void LinkOpt(apPortrait portrait)
        {
            _portrait          = portrait;
            _targetOptTranform = _portrait.GetOptTransformAsMeshGroup(_targetMeshGroupID);
            if (_targetOptTranform == null)
            {
                UnityEngine.Debug.LogError("AnimClip이 적용되는 Target Opt Transform이 Null이다. [" + _targetMeshGroupID + "] (" + _name + ")");
            }

            for (int i = 0; i < _timelines.Count; i++)
            {
                _timelines[i].LinkOpt(this);
            }
        }
Пример #5
0
            public bool Link(apPortrait portrait)
            {
                _meshGroup = portrait.GetOptTransformAsMeshGroup(_meshGroupID);
                if (_meshGroup == null)
                {
                    Debug.LogError("VertRig Bake 실패 : MeshGroup을 찾을 수 없다. [" + _meshGroupID + "]");
                    return(false);
                }

                _bone = _meshGroup.GetBone(_boneID);
                if (_bone == null)
                {
                    Debug.LogError("VertRig Bake 실패 : Bone을 찾을 수 없다. [" + _boneID + "]");
                    return(false);
                }

                return(true);
            }
Пример #6
0
        public IEnumerator LinkOptAsync(apPortrait portrait, apAsyncTimer asyncTimer)
        {
            _portrait = portrait;


            if (_targetMeshGroupID < 0)
            {
                //연결되지 않았네요.
                UnityEngine.Debug.LogError("AnyPortrait : Animation Clip [" + _name + "] : No MeshGroup Linked");
                yield break;
            }


            _targetOptTranform = _portrait.GetOptTransformAsMeshGroup(_targetMeshGroupID);

            //추가 : 여기서 FPS 관련 코드 확인
            if (_FPS < 1)
            {
                _FPS = 1;
            }
            _secPerFrame = 1.0f / (float)_FPS;


            if (_targetOptTranform == null)
            {
                //UnityEngine.Debug.LogError("AnimClip이 적용되는 Target Opt Transform이 Null이다. [" + _targetMeshGroupID + "] (" + _name + ")");
                //이 AnimClip을 사용하지 맙시다.
                yield break;
            }


            for (int i = 0; i < _timelines.Count; i++)
            {
                yield return(_timelines[i].LinkOptAsync(this, asyncTimer));
            }

            if (asyncTimer.IsYield())
            {
                yield return(asyncTimer.WaitAndRestart());
            }
        }
Пример #7
0
        public void LinkOpt(apPortrait portrait)
        {
            _portrait = portrait;


            if (_targetMeshGroupID < 0)
            {
                //연결되지 않았네요.
                UnityEngine.Debug.LogError("AnyPortrait : Animation Clip [" + _name + "] : No MeshGroup Linked");
                return;
            }


            _targetOptTranform = _portrait.GetOptTransformAsMeshGroup(_targetMeshGroupID);

            //추가 : 여기서 FPS 관련 코드 확인
            if (_FPS < 1)
            {
                _FPS = 1;
            }
            _secPerFrame = 1.0f / (float)_FPS;


            if (_targetOptTranform == null)
            {
                //UnityEngine.Debug.LogError("AnimClip이 적용되는 Target Opt Transform이 Null이다. [" + _targetMeshGroupID + "] (" + _name + ")");
                //이 AnimClip을 사용하지 맙시다.
                return;
            }


            for (int i = 0; i < _timelines.Count; i++)
            {
                _timelines[i].LinkOpt(this);
            }
        }
        // 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);
        }
        public void Bake(apModifierStack modStack, apPortrait portrait, bool isUseModMesh)
        {
            _portrait = portrait;
            _modifiers.Clear();

            _parentTransformID = -1;
            _parentTransform   = null;

            if (modStack._parentMeshGroup != null)
            {
                //MeshGroup 타입의 OptTransform을 찾자
                apOptTransform optTransform = _portrait.GetOptTransformAsMeshGroup(modStack._parentMeshGroup._uniqueID);
                if (optTransform != null)
                {
                    _parentTransformID = optTransform._transformID;
                    _parentTransform   = optTransform;
                }
            }
            if (_parentTransform == null)
            {
                Debug.LogError("Opt Modifier Stack -> Null Opt Transform");
            }

            //Modifier를 Bake해주자
            for (int i = 0; i < modStack._modifiers.Count; i++)
            {
                apModifierBase modifier = modStack._modifiers[i];

                apOptModifierUnitBase optMod = new apOptModifierUnitBase();

                ////ModifierType에 맞게 상속된 클래스로 생성한다.
                //switch (modifier.ModifierType)
                //{
                //	case apModifierBase.MODIFIER_TYPE.Base:
                //		optMod = new apOptModifierUnitBase();
                //		break;

                //	case apModifierBase.MODIFIER_TYPE.AnimatedMorph:
                //		break;

                //	case apModifierBase.MODIFIER_TYPE.Morph:
                //		optMod = new apOptModifierUnit_Morph();//Morph
                //		break;

                //	case apModifierBase.MODIFIER_TYPE.Physic:
                //		break;

                //	case apModifierBase.MODIFIER_TYPE.Rigging:
                //		break;

                //	case apModifierBase.MODIFIER_TYPE.Volume:
                //		break;

                //	default:
                //		Debug.LogError("apOptModifierSubStack Bake : 알 수 없는 Mod 타입 : " + modifier.ModifierType);
                //		break;

                //}

                if (optMod != null)
                {
                    optMod.Bake(modifier, _portrait, isUseModMesh);
                    optMod.Link(_portrait, _parentTransform);

                    _modifiers.Add(optMod);
                }
            }

            _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);
            }

            //추가 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);
        }
Пример #11
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);
        }