/// <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);
 }
Example #2
0
 /// <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);
    }