//anchor is local //vertices are local //have vector2 return? /// <summary> /// Rebuilds the anchor. /// </summary> /// <param name="anchor">The anchor (In local space).</param> /// <param name="isAnchorA">Whether to rebuild the first anchor as opposed to rebuilding the second anchor.</param> /// <param name="useBaseShape">Whether use JelloBody.Shape instead of JelloPointMass.Position. Has no effect if Transform has no JelloBody attached.</param> /// <param name="affectedIndices">The indices of the affected / affecting JelloPointMass objects. Has no effect if Transform has no JelloBody attached.</param> /// <param name="affectedVertices">The positions (in local space) of the affected / affecting JelloPointMass objects. Has no effect if Transform has no JelloBody attached.</param> public void RebuildAnchor(Vector2 anchor, bool isAnchorA, bool useBaseShape, int[] affectedIndices = null, Vector2[] affectedVertices = null) { //Vector2 point; if(isAnchorA) { localAnchorA = anchor; if(mTransformA == null) return; if(bodyA != null) { if(affectedIndices == null) affectedIndices = affectedIndicesA; else affectedIndicesA = affectedIndices; if(affectedVertices == null)//grab from point mass positions? { if(useBaseShape) { affectedVertices = new Vector2[affectedIndicesA.Length]; for(int i = 0; i < affectedIndicesA.Length; i++) affectedVertices[i] = bodyA.Shape.getVertex(affectedIndicesA[i]); } else { affectedVertices = new Vector2[affectedIndicesA.Length]; for(int i = 0; i < affectedIndicesA.Length; i++) affectedVertices[i] = bodyA.getPointMass(affectedIndicesA[i]).LocalPosition; } } if(affectedIndices != null) { if(affectedIndices.Length == 1) { scalarsA = new float[1]; scalarsA[0] = 1f; } else if(affectedIndices.Length == 2) { Vector2 hit; scalarsA = new float[2]; JelloVectorTools.getClosestPointOnSegmentSquared (localAnchorA, affectedVertices[0], affectedVertices[1], out hit, out scalarsA[1]); scalarsA[0] = 1 - scalarsA[1]; } else if(affectedIndices.Length == 3) { scalarsA = JelloShapeTools.GetBarycentricCoords(localAnchorA, affectedVertices); } } } } else { localAnchorB = anchor; if(mTransformB == null) return; if(bodyB != null) { if(affectedIndices == null) affectedIndices = affectedIndicesB; else affectedIndicesB = affectedIndices; if(affectedVertices == null)//grab from point mass positions? { if(useBaseShape) { affectedVertices = new Vector2[affectedIndicesB.Length]; for(int i = 0; i < affectedIndicesB.Length; i++) affectedVertices[i] = bodyB.Shape.getVertex(affectedIndicesB[i]); } else { affectedVertices = new Vector2[affectedIndicesB.Length]; for(int i = 0; i < affectedIndicesB.Length; i++) affectedVertices[i] = bodyB.getPointMass(affectedIndicesB[i]).LocalPosition; } } if(affectedIndices != null) { if(affectedIndices.Length == 1) { scalarsB = new float[1]; scalarsB[0] = 1f; } else if(affectedIndices.Length == 2) { Vector2 hit; scalarsB = new float[2]; JelloVectorTools.getClosestPointOnSegmentSquared (localAnchorB, affectedVertices[0], affectedVertices[1], out hit, out scalarsB[1]); scalarsB[0] = 1 - scalarsB[1]; } else if(affectedIndices.Length == 3) { scalarsB = JelloShapeTools.GetBarycentricCoords(localAnchorB, affectedVertices); } } } } }
/// <summary> /// Rebuild this JelloAttachPoint. /// </summary> /// <param name="attachPoint">The point (local to the JelloAttachPoint.body) at which to attach the JelloAttachPoint.AttachedTransform.</param> /// <param name="jelloBody">The JelloBody to to be attached to.</param> /// <param name="indices">The JelloPointMass Indices. Should have a length of 1, 2, or 3.</param> /// <param name="useBaseShape">Whether to use the JelloBody.Shape positions (instead of JelloPointMass.Position) when building the JelloAttachPoint.</param> public void Rebuild(Vector2 attachPoint, JelloBody jelloBody, int[] indices, bool useBaseShape = true) { body = jelloBody; transform = body.transform; if (indices == null) { if (affectedIndices == null) { Rebuild(attachPoint, jelloBody, useBaseShape); return; } else { indices = affectedIndices; } } else if (indices.Length > 4) { affectedIndices = new int[3]; for (int i = 0; i < 3; i++) { affectedIndices[i] = indices[i]; } } else { affectedIndices = indices; } Vector2[] verts = new Vector2[3]; if (useBaseShape) { for (int i = 0; i < affectedIndices.Length; i++) { verts[i] = body.Shape.getVertex(affectedIndices[i]); } } else { attachPoint = transform.TransformPoint(attachPoint); for (int i = 0; i < affectedIndices.Length; i++) { verts[i] = body.getPointMass(affectedIndices[i]).Position; } } if (affectedIndices.Length == 1) { scalars = new float[1]; scalars[0] = 1f; } else if (affectedIndices.Length == 2) { Vector2 hit; scalars = new float[2]; JelloVectorTools.getClosestPointOnSegmentSquared(attachPoint, verts[0], verts[1], out hit, out scalars[1]); scalars[0] = 1 - scalars[1]; } else if (affectedIndices.Length == 3) { scalars = JelloShapeTools.GetBarycentricCoords(attachPoint, verts); } //throw into for loop... point = Vector2.zero; for (int i = 0; i < affectedIndices.Length; i++) { point += scalars[i] * verts[i]; } if (!useBaseShape) { point = transform.InverseTransformPoint(point); } if (mAttachedTransform != null) { Vector3 newPos = transform.TransformPoint(point); newPos.z = mAttachedTransform.position.z; mAttachedTransform.position = newPos; } }