PathLinearInterpolator ReadPathData(BinaryReader br) { PathLinearInterpolator pi = new PathLinearInterpolator(); pi.m_WorldMatrix = Utility.ReadMatrix4x4(br); pi.m_WorldRotation = Utility.ReadQuaternion(br); pi.m_MaxDistance = br.ReadSingle(); pi.m_SampleMaxDistance = br.ReadSingle(); pi.m_HasPathEvent = br.ReadBoolean(); int sampleCount = br.ReadInt32(); int nodeCount = br.ReadInt32(); pi.m_NodeList = new LinearNodeData[nodeCount]; pi.m_SplineDataList = new SplineSampleData[sampleCount]; for (int i = 0; i < nodeCount; ++i) { LinearNodeData node = new LinearNodeData(); node.EventType = br.ReadByte(); node.Times = br.ReadUInt16(); pi.m_NodeList[i] = node; } m_NodeCount += sampleCount; for (int j = 0; j < sampleCount; ++j) { SplineSampleData node = new SplineSampleData(); node.pos = Utility.ReadVec3(br); node.rot = Utility.ReadQuaternion(br); node.timeScaling = br.ReadSingle(); node.nodeIdx = br.ReadInt16(); pi.m_SplineDataList[j] = node; } return(pi); }
public float GetTimeScaling(float time, out short nodeIdx) { float t = m_SplineDataList.Length * time; int idx = (int)t; t -= idx; if (idx < m_SplineDataList.Length - 1) { nodeIdx = m_SplineDataList[idx].nodeIdx; return(Utility.LerpFloat(m_SplineDataList[idx].timeScaling, m_SplineDataList[idx + 1].timeScaling, t)); } else { SplineSampleData node1 = m_SplineDataList[m_SplineDataList.Length - 1]; nodeIdx = node1.nodeIdx; return(node1.timeScaling); } }
public short GetPosRotTimeScaling(float time, out Vector3 pos, out Quaternion rot) { float t = m_SplineDataList.Length * time; int idx = (int)t; t -= idx; if (idx < m_SplineDataList.Length - 1) { SplineSampleData node1 = m_SplineDataList[idx]; SplineSampleData node2 = m_SplineDataList[idx + 1]; pos = Vector3.Lerp(node1.pos, node2.pos, t); rot = Quaternion.Slerp(node1.rot, node2.rot, t); return(m_SplineDataList[idx].nodeIdx); } else { SplineSampleData node1 = m_SplineDataList[m_SplineDataList.Length - 1]; pos = node1.pos; rot = node1.rot; return(node1.nodeIdx); } }
private void Initialize() { m_Contolpoints = gameObject.GetComponentsInChildren <BezierSplineContolPoint>(); m_timeInc = 1f / NormalizeSamples; Vector3[] array = new Vector3[NormalizeSamples + 1]; m_SamplePointTime = new Single[NormalizeSamples + 1]; for (Int32 i = 0; i <= NormalizeSamples; i++) { Single p_curveTime = i * m_timeInc; array[i] = GetPointOnCurveTime(p_curveTime, false); } Single num = 0f; for (Int32 j = 1; j <= NormalizeSamples; j++) { num += Vector3.Distance(array[j - 1], array[j]); } m_SamplePointTime[0] = 0f; Single num2 = 0f; for (Int32 k = 1; k <= NormalizeSamples; k++) { num2 += Vector3.Distance(array[k - 1], array[k]) / num; m_SamplePointTime[k] = num2; } m_SamplePointTime[NormalizeSamples] = 1f; SampleData = new SplineSampleData[NormalizeSamples]; Vector3 b = GetPointOnCurveTime(-m_timeInc); for (Int32 l = 0; l < SampleData.Length; l++) { Vector3 pointOnCurveTime = GetPointOnCurveTime(l * m_timeInc); Quaternion rot = Quaternion.LookRotation(pointOnCurveTime - b); b = pointOnCurveTime; Single speedOnCurveTime = GetSpeedOnCurveTime(l * m_timeInc); SampleData[l] = new SplineSampleData(pointOnCurveTime, rot, speedOnCurveTime); } }