bool InitSkin() { if (target) { SkinnedMeshRenderer skin = target.GetComponent <SkinnedMeshRenderer>(); if (skin) { Quaternion rot = transform.rotation; attachrot = Quaternion.identity; skinned = true; Mesh ms = skin.sharedMesh; Vector3 pt = transform.position; CalcSkinVerts(); Vector3 objSpacePt = pt; Vector3[] verts = calcskinverts; int[] tris = ms.triangles; int index = -1; MegaNearestPointTest.NearestPointOnMesh1(objSpacePt, verts, tris, ref index, ref BaryCoord); //ref tribary); if (index >= 0) { BaryVerts[0] = tris[index]; BaryVerts[1] = tris[index + 1]; BaryVerts[2] = tris[index + 2]; } MegaNearestPointTest.NearestPointOnMesh1(objSpacePt + attachforward, verts, tris, ref index, ref BaryCoord1); if (index >= 0) { BaryVerts1[0] = tris[index]; BaryVerts1[1] = tris[index + 1]; BaryVerts1[2] = tris[index + 2]; } skinverts = new MegaSkinVert[6]; for (int i = 0; i < 3; i++) { int vert = BaryVerts[i]; BoneWeight bw = ms.boneWeights[vert]; skinverts[i] = new MegaSkinVert(); skinverts[i].vert = vert; skinverts[i].weights[0] = bw.weight0; skinverts[i].weights[1] = bw.weight1; skinverts[i].weights[2] = bw.weight2; skinverts[i].weights[3] = bw.weight3; skinverts[i].bones[0] = skin.bones[bw.boneIndex0]; skinverts[i].bones[1] = skin.bones[bw.boneIndex1]; skinverts[i].bones[2] = skin.bones[bw.boneIndex2]; skinverts[i].bones[3] = skin.bones[bw.boneIndex3]; skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0]; skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1]; skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2]; skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3]; } for (int i = 3; i < 6; i++) { int vert = BaryVerts1[i - 3]; BoneWeight bw = ms.boneWeights[vert]; skinverts[i] = new MegaSkinVert(); skinverts[i].vert = vert; skinverts[i].weights[0] = bw.weight0; skinverts[i].weights[1] = bw.weight1; skinverts[i].weights[2] = bw.weight2; skinverts[i].weights[3] = bw.weight3; skinverts[i].bones[0] = skin.bones[bw.boneIndex0]; skinverts[i].bones[1] = skin.bones[bw.boneIndex1]; skinverts[i].bones[2] = skin.bones[bw.boneIndex2]; skinverts[i].bones[3] = skin.bones[bw.boneIndex3]; skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0]; skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1]; skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2]; skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3]; } GetSkinPos1(); attachrot = Quaternion.Inverse(transform.rotation) * rot; return(true); } else { skinned = false; } } return(false); }
bool InitSkin() { if ( target ) { SkinnedMeshRenderer skin = target.GetComponent<SkinnedMeshRenderer>(); if ( skin ) { Quaternion rot = transform.rotation; attachrot = Quaternion.identity; skinned = true; Mesh ms = skin.sharedMesh; Vector3 pt = transform.position; CalcSkinVerts(); Vector3 objSpacePt = pt; Vector3[] verts = calcskinverts; int[] tris = ms.triangles; int index = -1; //Vector3 tribary = Vector3.zero; MegaNearestPointTest.NearestPointOnMesh1(objSpacePt, verts, tris, ref index, ref BaryCoord); //ref tribary); if ( index >= 0 ) { BaryVerts[0] = tris[index]; BaryVerts[1] = tris[index + 1]; BaryVerts[2] = tris[index + 2]; } //Vector3 worldPt = target.transform.TransformPoint(meshPt); //if ( index >= 0 ) //{ //Vector3 cp2 = GetCoordMine(verts[tris[index]], verts[tris[index + 1]], verts[tris[index + 2]], tribary); //worldPt = cp2; //} MegaNearestPointTest.NearestPointOnMesh1(objSpacePt + attachforward, verts, tris, ref index, ref BaryCoord1); if ( index >= 0 ) { BaryVerts1[0] = tris[index]; BaryVerts1[1] = tris[index + 1]; BaryVerts1[2] = tris[index + 2]; } skinverts = new MegaSkinVert[6]; for ( int i = 0; i < 3; i++ ) { int vert = BaryVerts[i]; BoneWeight bw = ms.boneWeights[vert]; skinverts[i] = new MegaSkinVert(); skinverts[i].vert = vert; skinverts[i].weights[0] = bw.weight0; skinverts[i].weights[1] = bw.weight1; skinverts[i].weights[2] = bw.weight2; skinverts[i].weights[3] = bw.weight3; skinverts[i].bones[0] = skin.bones[bw.boneIndex0]; skinverts[i].bones[1] = skin.bones[bw.boneIndex1]; skinverts[i].bones[2] = skin.bones[bw.boneIndex2]; skinverts[i].bones[3] = skin.bones[bw.boneIndex3]; skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0]; skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1]; skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2]; skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3]; } for ( int i = 3; i < 6; i++ ) { int vert = BaryVerts1[i - 3]; BoneWeight bw = ms.boneWeights[vert]; skinverts[i] = new MegaSkinVert(); skinverts[i].vert = vert; skinverts[i].weights[0] = bw.weight0; skinverts[i].weights[1] = bw.weight1; skinverts[i].weights[2] = bw.weight2; skinverts[i].weights[3] = bw.weight3; skinverts[i].bones[0] = skin.bones[bw.boneIndex0]; skinverts[i].bones[1] = skin.bones[bw.boneIndex1]; skinverts[i].bones[2] = skin.bones[bw.boneIndex2]; skinverts[i].bones[3] = skin.bones[bw.boneIndex3]; skinverts[i].bindposes[0] = ms.bindposes[bw.boneIndex0]; skinverts[i].bindposes[1] = ms.bindposes[bw.boneIndex1]; skinverts[i].bindposes[2] = ms.bindposes[bw.boneIndex2]; skinverts[i].bindposes[3] = ms.bindposes[bw.boneIndex3]; } //Vector3 up = transform.up; //Vector3 fwd = transform.forward; GetSkinPos1(); attachrot = Quaternion.Inverse(transform.rotation) * rot; //Debug.Log("arot " + attachrot.eulerAngles); return true; } else skinned = false; } return false; }