/** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ using AOT; using Live2D.Cubism.Core.Unmanaged; using System; using System.Runtime.InteropServices; using UnityEngine; namespace Live2D.Cubism.Core { /// /// Wrapper for core logs. /// internal static class CubismLogging { #region Delegates /// /// Delegate compatible with unmanaged log function. /// /// Message to log. private unsafe delegate void UnmanagedLogDelegate(char* message); #endregion /// /// Delegate to pass to native Api. /// // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable private static UnmanagedLogDelegate LogDelegate { get; set; } #region Initialization /// /// Registers delegates. /// [RuntimeInitializeOnLoadMethod] // ReSharper disable once UnusedMember.Local private static unsafe void Initialize() { LogDelegate = LogUnmanaged; var logFunction = Marshal.GetFunctionPointerForDelegate(LogDelegate); csmSetLogFunction(logFunction); } #endregion /// /// Prints an unmanaged, null-terminated message. /// /// Message to log. [MonoPInvokeCallback(typeof(UnmanagedLogDelegate))] private static unsafe void LogUnmanaged(char* message) { // Marshal message and log it. var managedMessage = Marshal.PtrToStringAnsi(new IntPtr(message)); Debug.LogFormat("[Cubism] Core: {0}.", managedMessage); } #region Extern C [DllImport(CubismCoreDll.DllName)] private static extern void csmSetLogFunction(IntPtr logFunction); #endregion } }