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