public static int OnNewRibbonRendererSetup(IntPtr rendererDescPtr)
    {
        SBatchDesc batchDesc = null;

        unsafe
        {
            SPopcornRendererDesc *desc = (SPopcornRendererDesc *)rendererDescPtr.ToPointer();
            batchDesc = new SBatchDesc(ERendererType.Ribbon, *desc);
        }

        // Create the material description:
        Material mat = PKFxSettings.MaterialFactory.ResolveParticleMaterial(batchDesc);

        GameObject renderingObject = GetNewRenderingObject(batchDesc.m_GeneratedName);

        return(SetupRenderingObject(renderingObject, batchDesc, mat));
    }
    public static int OnNewMeshRendererSetup(IntPtr rendererDescPtr)
    {
        SBatchDesc batchDesc = null;

        unsafe
        {
            SMeshRendererDesc *desc = (SMeshRendererDesc *)rendererDescPtr.ToPointer();

            batchDesc = new SBatchDesc(*desc);
        }

        // Create the material description:
        Material mat = PKFxSettings.MaterialFactory.ResolveParticleMaterial(batchDesc);

        mat.enableInstancing = true;
        GameObject renderingObject = GetNewRenderingObject(batchDesc.m_GeneratedName);

        return(SetupMeshRenderingObject(renderingObject, batchDesc, mat));
    }
    public static void OnRendererNamesAdded(int rendererGUID, IntPtr effectNames)
    {
        string effectNamesStr = null;

        if (effectNames != IntPtr.Zero)
        {
            effectNamesStr = Marshal.PtrToStringAnsi(effectNames);
        }

        SBatchDesc batchDesc = m_Renderers[rendererGUID].m_BatchDesc;

        Debug.Assert(m_Renderers.Count > rendererGUID);
        batchDesc.m_EffectNames += effectNamesStr;

        string particleMeshGeneratedName = batchDesc.m_GeneratedName;

        PKFxSettings.SParticleMeshDefaultSize meshSizeToUpdate = GetParticleMeshDefaultSizeSettings(particleMeshGeneratedName);

        if (meshSizeToUpdate != null)
        {
            meshSizeToUpdate.m_EffectNames = batchDesc.m_EffectNames;
        }
    }