mirror of
https://github.com/raylib-cs/raylib-cs
synced 2025-07-02 19:13:43 -04:00
4.0 (#100)
* Fix formatting/update doc comments in Raylib.cs * Update types in Raylib.cs to 4.0 * Remove app.config * Update Raylib.cs functions * Split Enums, Structs & Classes into own files * Testing utils for Raylib.cs * Update Raylib-cs.csproj * Reorganize types - Move into types folder - Group types based on usage * Fix parameter names * Rename CloseAudioStream to UnloadAudioStream * Remove ref SetShaderValue overloads * Remove some constants from Raylib.cs * Include README.md in package * Replace old version of GetDroppedUtils * Update README.md * Remove Physac-cs and Raygui-cs - Not actively maintained and a pain for users to setup... * Update comments to xmldoc * Rename Gestures enum to Gesture * Minor fixes - Rename Gestures enum to Gesture - Update tests to net6.0 * Testing CBool type instead of bool * Update XmlDoc comments * Update build.yml to net6.0 for tests * Remove Easings.cs - Easings used to be part of raylib. It is now a separate extra library so I am removing it from the main bindings. * Update rlgl * More XmlDoc comments * Use CBool in structs * Big unsafe update * Fix typos and change refs to pointers in Rlgl * Update LoggingUtils and Material * Fix typo in Rlgl * Update build.yml * Rename RaylibUtils.cs to Raylib.Utils now a partial class * Convert some RLGL consts to Enums Also added helper methods/overloads for related methods * Make class Raylib partial * Convert some text functions to not use ref I dont think they will work. need testing * Testing fixes for Text functions * Create rlMultMatrixf safe overload * Implement safe ModelAnimation * Testing fix for ModelAnimation using wrapper struct * Added TODOs * Fix rlMultMatrixf - Add missing ToFloatV functions to Raymath - Fix rlMultMatrixf overload to use MatrixToFloatV * Fix IsGestureDetected and formatting * Add a few text tests * Move wrapper functions into Raylib.Utils * Remove ref from raylib bindings * Multi-target net5.0 * Testing string approaches * Fixing more util and unsafe functions * Testing TraceLogCallback fix Set lang version to C# 10 * Replace managed callbacks with unsafe delegates * Update default LogConsole callback * Setup unsafe/safe functions for math types in Raylib.cs * Replace string in Rlgl with sbyte* * Yet more string changes - Use sbyte/byte correctly in Raylib.cs - Using Marshal.StringToCoTaskMemUTF8 - Update utils string usage * Fix typo bug and whitespace * Fix DrawTextPro and more whitespace * Remove unused ToString * Add file functions back into Raylib * Test paths filter for pull requests * Change to paths-ignore filter * Redo partial change * Move binding functions into interop folder Co-authored-by: Ben Parsons <9parsonsb@gmail.com>
This commit is contained in:
166
Raylib-cs/types/Logging.cs
Normal file
166
Raylib-cs/types/Logging.cs
Normal file
@ -0,0 +1,166 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Raylib_cs
|
||||
{
|
||||
internal readonly struct Native
|
||||
{
|
||||
internal const string Msvcrt = "msvcrt";
|
||||
internal const string Libc = "libc";
|
||||
internal const string LibSystem = "libSystem";
|
||||
|
||||
[DllImport(LibSystem, EntryPoint = "vasprintf", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern int vasprintf_apple(ref IntPtr buffer, IntPtr format, IntPtr args);
|
||||
|
||||
[DllImport(Libc, EntryPoint = "vsprintf", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern int vsprintf_linux(IntPtr buffer, IntPtr format, IntPtr args);
|
||||
|
||||
[DllImport(Msvcrt, EntryPoint = "vsprintf", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern int vsprintf_windows(IntPtr buffer, IntPtr format, IntPtr args);
|
||||
|
||||
[DllImport(Libc, EntryPoint = "vsnprintf", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern int vsnprintf_linux(IntPtr buffer, UIntPtr size, IntPtr format, IntPtr args);
|
||||
|
||||
[DllImport(Msvcrt, EntryPoint = "vsnprintf", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern int vsnprintf_windows(IntPtr buffer, UIntPtr size, IntPtr format, IntPtr args);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4)]
|
||||
struct VaListLinuxX64
|
||||
{
|
||||
uint gpOffset;
|
||||
uint fpOffset;
|
||||
IntPtr overflowArgArea;
|
||||
IntPtr regSaveArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logging workaround for formatting strings from native code
|
||||
/// </summary>
|
||||
public static unsafe class Logging
|
||||
{
|
||||
static Logging()
|
||||
{
|
||||
Raylib.SetTraceLogCallback(&LogConsole);
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(CallConvs = new[] { typeof(System.Runtime.CompilerServices.CallConvCdecl) })]
|
||||
public static unsafe void LogConsole(int msgType, sbyte* text, sbyte* args)
|
||||
{
|
||||
var message = GetLogMessage(new IntPtr(text), new IntPtr(args));
|
||||
Console.WriteLine(message);
|
||||
}
|
||||
|
||||
public static string GetLogMessage(IntPtr format, IntPtr args)
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
return AppleLogCallback(format, args);
|
||||
}
|
||||
|
||||
// Special marshalling is needed on Linux desktop 64 bits.
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && IntPtr.Size == 8)
|
||||
{
|
||||
return LinuxX64LogCallback(format, args);
|
||||
}
|
||||
|
||||
var byteLength = vsnprintf(IntPtr.Zero, UIntPtr.Zero, format, args) + 1;
|
||||
if (byteLength <= 1)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var buffer = Marshal.AllocHGlobal(byteLength);
|
||||
vsprintf(buffer, format, args);
|
||||
|
||||
string result = Marshal.PtrToStringUTF8(buffer);
|
||||
Marshal.FreeHGlobal(buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static string AppleLogCallback(IntPtr format, IntPtr args)
|
||||
{
|
||||
IntPtr buffer = IntPtr.Zero;
|
||||
try
|
||||
{
|
||||
var count = Native.vasprintf_apple(ref buffer, format, args);
|
||||
if (count == -1)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
return Marshal.PtrToStringUTF8(buffer) ?? string.Empty;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Marshal.FreeHGlobal(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
static string LinuxX64LogCallback(IntPtr format, IntPtr args)
|
||||
{
|
||||
// The args pointer cannot be reused between two calls. We need to make a copy of the underlying structure.
|
||||
var listStructure = Marshal.PtrToStructure<VaListLinuxX64>(args);
|
||||
IntPtr listPointer = IntPtr.Zero;
|
||||
int byteLength = 0;
|
||||
string result = "";
|
||||
|
||||
// Get length of args
|
||||
listPointer = Marshal.AllocHGlobal(Marshal.SizeOf(listStructure));
|
||||
Marshal.StructureToPtr(listStructure, listPointer, false);
|
||||
byteLength = Native.vsnprintf_linux(IntPtr.Zero, UIntPtr.Zero, format, listPointer) + 1;
|
||||
|
||||
// Allocate buffer for result
|
||||
Marshal.StructureToPtr(listStructure, listPointer, false);
|
||||
|
||||
IntPtr utf8Buffer = IntPtr.Zero;
|
||||
utf8Buffer = Marshal.AllocHGlobal(byteLength);
|
||||
|
||||
// Print result into buffer
|
||||
Native.vsprintf_linux(utf8Buffer, format, listPointer);
|
||||
result = Marshal.PtrToStringUTF8(utf8Buffer);
|
||||
|
||||
Marshal.FreeHGlobal(listPointer);
|
||||
Marshal.FreeHGlobal(utf8Buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// https://github.com/dotnet/runtime/issues/51052
|
||||
static int vsnprintf(IntPtr buffer, UIntPtr size, IntPtr format, IntPtr args)
|
||||
{
|
||||
var os = Environment.OSVersion;
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return Native.vsnprintf_windows(buffer, size, format, args);
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
return Native.vsnprintf_linux(buffer, size, format, args);
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("ANDROID")))
|
||||
{
|
||||
return Native.vsprintf_linux(buffer, format, args);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// https://github.com/dotnet/runtime/issues/51052
|
||||
static int vsprintf(IntPtr buffer, IntPtr format, IntPtr args)
|
||||
{
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
return Native.vsprintf_windows(buffer, format, args);
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||
{
|
||||
return Native.vsprintf_linux(buffer, format, args);
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("ANDROID")))
|
||||
{
|
||||
return Native.vsprintf_linux(buffer, format, args);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user