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); } }
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); } }
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); }
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()); } }
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); }
// 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); }