/// <summary> /// Return a pointer to the unmanaged version of this callback. /// </summary> /// <param name="callback">The callback.</param> /// <returns>A pointer to a shadow c++ callback</returns> public static IntPtr ToIntPtr(ComputeTransform callback) { return ToCallbackPtr<ComputeTransform>(callback); }
/// <summary> /// Return a pointer to the unamanged version of this callback. /// </summary> /// <param name="callback">The callback.</param> /// <returns>A pointer to a shadow c++ callback</returns> public static IntPtr ToIntPtr(ComputeTransform callback) { return(ToCallbackPtr <ComputeTransform>(callback)); }
void UpdateBuffers() { m_ComputeBuffers.Clear(); m_InstMat.SetFloat("_count", (float)m_InstCount); ReleaseBuffers(); #region Create buffers argsBuffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments); // compute pos buffer m_BaseTransformBuffer = new ComputeBuffer(m_InstCount, 16 * 3); m_ModifiedTransformBuffer = new ComputeBuffer(m_InstCount, 16 * 3); m_PosCurveBuffer = new ComputeBuffer(m_InstCount, 16); m_RotCurveBuffer = new ComputeBuffer(m_InstCount, 16); m_ScaleCurveBuffer = new ComputeBuffer(m_InstCount, 16); m_ComputeBuffers.Add(m_BaseTransformBuffer); m_ComputeBuffers.Add(m_ModifiedTransformBuffer); m_ComputeBuffers.Add(m_PosCurveBuffer); m_ComputeBuffers.Add(m_RotCurveBuffer); m_ComputeBuffers.Add(m_ScaleCurveBuffer); #endregion #region Fill initial transforms Vector4[] positions = new Vector4[m_InstCount]; Vector4[] rotations = new Vector4[m_InstCount]; ComputeTransform[] computeTforms = new ComputeTransform[m_InstCount]; for (int i = 0; i < m_InstCount; i++) { float norm = (float)i / (float)m_InstCount; Vector3 pos; if (m_Pattern != null) { pos = m_Pattern.Transforms[i].position; } else { pos = Vector3.Lerp(m_Anchor0.position, m_Anchor1.position, norm); } // Scale float scale = m_ScaleCurve.Evaluate(norm); if (m_Pattern != null) { scale = m_Pattern.Transforms[i].localScale.x; } positions[i] = new Vector4(pos.x, pos.y, pos.z, scale); // Rot Quaternion q = Quaternion.identity; if (m_Pattern != null) { q = m_Pattern.Transforms[i].rotation; } else { q = Quaternion.LookRotation(m_Anchor1.position - m_Anchor0.position); } Vector4 rot = new Vector4(q.w, q.x, q.y, q.z); computeTforms[i] = new ComputeTransform(); computeTforms[i].position = pos; computeTforms[i].rotation = rot; computeTforms[i].scale = Vector3.one * scale; } #endregion // Set buffers m_BaseTransformBuffer.SetData(computeTforms); m_ModifiedTransformBuffer.SetData(computeTforms); UpdateCurves(); // indirect args uint numIndices = (m_InstMesh != null) ? (uint)m_InstMesh.GetIndexCount(0) : 0; args[0] = numIndices; args[1] = (uint)m_InstCount; argsBuffer.SetData(args); }