//개선된 버전 19.5.23 public void Link(apOptModifiedMesh_Physics modMeshPhysics, apOptModifiedMeshSet modMeshSet, apOptTransform optTransform, apOptRenderVertex vertex) { //>>19.5.23 : 삭제 (불필요) //_modifiedMesh = modifiedMesh; //_mesh = mesh; _vertex = vertex; _optTransform = optTransform; if (_linkedVertices == null) { _linkedVertices = new List <LinkedVertex>(); } apOptMesh mesh = modMeshSet._targetMesh; //이미 Bake 되었으므로 바로 Link하면 된다. for (int i = 0; i < _linkedVertices.Count; i++) { LinkedVertex linkedVert = _linkedVertices[i]; apOptRenderVertex renderVert = mesh.RenderVertices[linkedVert._vertIndex]; apOptModifiedPhysicsVertex linkVert = modMeshSet.SubModMesh_Physics._vertWeights[linkedVert._vertIndex]; linkedVert.Link(renderVert, linkVert); } DampPhysicVertex(); }
/// <summary> /// Linked Vertex의 객체를 Link한다. /// </summary> /// <param name="parentModMesh"></param> public void Link(apModifiedMesh parentModMesh, apModifiedVertexWeight parentModVertWeight) { _parentModMesh = parentModMesh; _parentModVertWeight = parentModVertWeight; if (_linkedVertices == null) { _linkedVertices = new List <LinkedVertex>(); } if (parentModMesh._transform_Mesh == null || parentModMesh._transform_Mesh._mesh == null) { Debug.LogError("Physics Param Link Error : MeshTransform is Null of Mesh is Null"); return; } //???? //이게 왜 Link에 있지?? //이거 많이 느림 //데이터 저장 후 ID를 통해서 바로 Link해야하는데 매번 조회 후 생성+연결하려고 함. //이 부분을 고쳐서 Physic.LinkedVertex를 미리 생성하고 여기서는 바로 연결해야한다. 로딩 느릴수밖에 없네.. //TODO //...대체 방법이 없는데요.. apMesh mesh = parentModMesh._transform_Mesh._mesh; //int maxVertLevel = 3; int maxVertLevel = 1; //연결된 apVertex를 받아오자 (최대 3레벨) //수정 > 1레벨로도 충분할 듯 List <apMesh.LinkedVertexResult> linkedVerticesOnMesh = mesh.GetLinkedVertex(_parentModVertWeight._vertex, maxVertLevel); //두개의 리스트를 비교하여 //- 같으면 단순 Link //- 없으면 추가해서 Link //- 연결되지 않았으면 제외 //+Contraint 체크를 위해서, 1-Level 을 따로 분류 (또는 Level 값을 넣자) //1. 추가할 것을 체크하자 apMesh.LinkedVertexResult srcVert = null; apModifiedVertexWeight modVertWeight = null; for (int iSrcVert = 0; iSrcVert < linkedVerticesOnMesh.Count; iSrcVert++) { srcVert = linkedVerticesOnMesh[iSrcVert]; modVertWeight = _parentModMesh.GetVertexWeight(srcVert._vertex); LinkedVertex linkedVert = _linkedVertices.Find(delegate(LinkedVertex a) { return(a._vertUniqueID == srcVert._vertex._uniqueID); }); if (linkedVert == null) { //새로 추가해야하는 Linked Vert LinkedVertex newLinkedVert = new LinkedVertex(srcVert._vertex, srcVert._level); newLinkedVert.Link(srcVert._vertex, modVertWeight); _linkedVertices.Add(newLinkedVert); } else { //이미 추가되었으니 Link만 하자 linkedVert.Link(srcVert._vertex, modVertWeight); } } //2. 이제 제거할 것을 체크하자 //연결 안된건 지우자 _linkedVertices.RemoveAll(delegate(LinkedVertex a) { if (a._vertex == null || a._modVertWeight == null) { return(true); } if (!linkedVerticesOnMesh.Exists(delegate(apMesh.LinkedVertexResult b) { return(b._vertex == a._vertex); })) { //연결된게 아니다. 찾을 수 없다. return(true); } return(false); }); //전체 길이를 체크하여 역 Weight를 걸자 RefreshLinkedVertex(); }