commit d59cdbc52cf5ea20122f8e868cb673b7bbcae793 Author: ishanjitchattaraj Date: Sat Oct 24 11:04:41 2026 +0200 Initial commit diff --git a/.idea/.idea.sober-imgui.dir/.idea/.gitignore b/.idea/.idea.sober-imgui.dir/.idea/.gitignore new file mode 100644 index 0000000..c109466 --- /dev/null +++ b/.idea/.idea.sober-imgui.dir/.idea/.gitignore @@ -0,0 +1,15 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Rider ignored files +/modules.xml +/contentModel.xml +/projectSettingsUpdater.xml +/.idea.sober-imgui.iml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.sober-imgui.dir/.idea/encodings.xml b/.idea/.idea.sober-imgui.dir/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.sober-imgui.dir/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.sober-imgui.dir/.idea/indexLayout.xml b/.idea/.idea.sober-imgui.dir/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.sober-imgui.dir/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/AssemblyInfo.cs b/AssemblyInfo.cs new file mode 100644 index 0000000..e58f77d --- /dev/null +++ b/AssemblyInfo.cs @@ -0,0 +1 @@ +[assembly: System.Runtime.Versioning.SupportedOSPlatform("linux")] diff --git a/BridgeServer.cs b/BridgeServer.cs new file mode 100644 index 0000000..e394c5e --- /dev/null +++ b/BridgeServer.cs @@ -0,0 +1,92 @@ +using System.Net.Sockets; +using System.Numerics; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using Microsoft.Win32.SafeHandles; +namespace SoberEsp; +public sealed class BridgeServer(string path,bool allowCameraWrites=false) +{ + [DllImport("libc")]static extern uint geteuid(); + [DllImport("libc")]static extern int chown(string path,uint uid,uint gid); + [DllImport("libc")]static extern int getsockopt(int fd,int level,int option,out Credentials value,ref uint length); + [StructLayout(LayoutKind.Sequential)]struct Credentials{public int Pid;public uint Uid,Gid;} + readonly JsonSerializerOptions jsonOptions=new(){PropertyNamingPolicy=JsonNamingPolicy.CamelCase}; + int pid;string stamp="";SafeFileHandle? memory, cameraMemory;List cached=[];long cacheTime; + static string Identity(int p)=>File.ReadAllText($"/proc/{p}/stat").Split(')').Last().Split(' ',StringSplitOptions.RemoveEmptyEntries)[19]; + public static List ReadMaps(int p) + { + var result=new List();foreach(string line in File.ReadLines($"/proc/{p}/maps")){var v=line.Split(' ',6,StringSplitOptions.RemoveEmptyEntries);var range=v[0].Split('-');result.Add(new(Convert.ToUInt64(range[0],16),Convert.ToUInt64(range[1],16),v[1],Convert.ToUInt64(v[2],16),v.Length>5?v[5]:""));}return result; + } + static uint Owner(int p)=>uint.Parse(File.ReadLines($"/proc/{p}/status").First(s=>s.StartsWith("Uid:")).Split((char[]?)null,StringSplitOptions.RemoveEmptyEntries)[1]); + int Target(uint uid) + { + try{if(pid!=0&&Identity(pid)==stamp)return pid;}catch(IOException){} + foreach(string directory in Directory.EnumerateDirectories("/proc"))try + { + if(!int.TryParse(System.IO.Path.GetFileName(directory),out int p)||Owner(p)!=uid||File.ReadAllText($"{directory}/comm").Trim()!="Main")continue; + if(!File.ReadAllLines($"{directory}/root/.flatpak-info").Contains("name=org.vinegarhq.Sober"))continue; + cameraMemory?.Dispose();cameraMemory=null;memory?.Dispose();memory=File.OpenHandle($"/proc/{p}/mem",FileMode.Open,FileAccess.Read,FileShare.ReadWrite,FileOptions.RandomAccess);pid=p;stamp=Identity(p);cached=[];Console.WriteLine($"Memory connection to Sober PID {p}");return p; + }catch(IOException){}catch(UnauthorizedAccessException){} + throw new IOException("Waiting for Sober"); + } + byte[] Read(ulong address,int length) + { + if(length<1||length>1048576||address>long.MaxValue-(ulong)length)throw new IOException("Invalid read range"); + if(cached.Count==0||System.Diagnostics.Stopwatch.GetElapsedTime(cacheTime).TotalSeconds>1){cached=ReadMaps(pid);cacheTime=System.Diagnostics.Stopwatch.GetTimestamp();} + int lo=0,hi=cached.Count;while(locached[lo-1].End||!cached[lo-1].Permissions.StartsWith('r'))throw new IOException("Read must stay inside one readable mapping"); + var result=new byte[length];int n=RandomAccess.Read(memory!,result,(long)address);if(n!=length)throw new IOException("Short memory read");return result; + } + // This is the only write operation: exactly nine camera rotation floats. + // The caller supplies object identities, never an arbitrary destination or byte payload. + object AimCamera(JsonElement request) + { + if(!allowCameraWrites)throw new IOException("Camera mode needs a bridge started with --allow-camera-writes; restart the managed session"); + if(request.GetProperty("pid").GetInt32()!=pid)throw new IOException("Sober process changed"); + ulong baseAddress=request.GetProperty("baseAddress").GetUInt64(),workspace=request.GetProperty("workspace").GetUInt64(); + ulong camera=request.GetProperty("camera").GetUInt64(),model=request.GetProperty("model").GetUInt64(); + float response=request.GetProperty("response").GetSingle(); + if(!float.IsFinite(response)||response<0||response>1)throw new IOException("Invalid camera response"); + if(baseAddress>long.MaxValue-Offsets.WorkspaceVtable||camera>long.MaxValue-Offsets.Camera.Frame-Offsets.Camera.FrameBytes)throw new IOException("Invalid camera address"); + foreach(var fingerprint in Offsets.Fingerprints) + if(!Read(baseAddress+fingerprint.Key,fingerprint.Value.Length).AsSpan().SequenceEqual(fingerprint.Value))throw new IOException("Unsupported camera build"); + var mem=new SceneMemory(Read); + if(mem.Type(workspace)!="N3RBX9WorkspaceE"||mem.U64(workspace)!=baseAddress+Offsets.WorkspaceVtable||mem.U64(workspace+Offsets.Instance.Self)!=workspace|| + mem.Type(camera)!="N3RBX6CameraE"||mem.U64(camera+Offsets.Instance.Parent)!=workspace||!mem.Children(workspace).Contains(camera))throw new TargetUnavailableException("Scene or camera changed"); + ulong dataModel=mem.U64(workspace+Offsets.Instance.Parent),players=mem.Children(dataModel).FirstOrDefault(p=>mem.Type(p)=="N3RBX7PlayersE"); + if(players==0)throw new TargetUnavailableException("Players service unavailable"); + ulong local=mem.U64(players+Offsets.Players.LocalPlayer); + if(local==0||!mem.Children(players).Any(p=>p!=local&&mem.Type(p)=="N3RBX6PlayerE"&&mem.U64(p+Offsets.Player.Character)==model)|| + mem.Type(model)!="N3RBX13ModelInstanceE"||!CharacterReader.IsInWorkspace(mem,model,workspace))throw new TargetUnavailableException("Target character is unavailable"); + var parts=CharacterReader.Resolve(mem,model,mem.Name(model),requirePosition:true); + var position=request.GetProperty("head").GetBoolean()?CharacterReader.Position(mem,parts.Head,model):null; + position??=CharacterReader.Position(mem,parts.Root,model); + if(position==null)throw new TargetUnavailableException("Target part is unavailable"); + // Read this again directly so cached validation pages do not supply an old rotation. + var bytes=Read(camera+Offsets.Camera.Frame,Offsets.Camera.FrameBytes);var frame=new float[Offsets.Camera.FrameFloats];Buffer.BlockCopy(bytes,0,frame,0,bytes.Length); + var rotation=CameraAim.Rotation(frame,position.Value,response); + var output=new byte[Offsets.Camera.RotationBytes];Buffer.BlockCopy(rotation,0,output,0,output.Length); + ulong destination=camera+Offsets.Camera.Frame; + if(Identity(pid)!=stamp||!ReadMaps(pid).Any(m=>m.Start<=destination&&destination+(ulong)output.Length<=m.End&&m.Permissions.StartsWith("rw")))throw new IOException("Camera mapping changed"); + cameraMemory??=File.OpenHandle($"/proc/{pid}/mem",FileMode.Open,FileAccess.Write,FileShare.ReadWrite,FileOptions.RandomAccess); + RandomAccess.Write(cameraMemory,output,(long)destination); + return new{ok=true}; + } + public void Run(CancellationToken token) + { + uint uid=uint.TryParse(Environment.GetEnvironmentVariable("SUDO_UID"),out uint caller)?caller:geteuid();if(File.Exists(path))throw new IOException("Bridge socket already exists; stop the previous helper first"); + using var server=new Socket(AddressFamily.Unix,SocketType.Stream,ProtocolType.Unspecified);server.Bind(new UnixDomainSocketEndPoint(path));File.SetUnixFileMode(path,UnixFileMode.UserRead|UnixFileMode.UserWrite);if(geteuid()==0&&chown(path,uid,uint.MaxValue)!=0)throw new IOException("Could not assign socket ownership");server.Listen(4);Console.WriteLine($"Memory bridge ready (camera writes {(allowCameraWrites?"enabled":"disabled")}): {path}"); + using var registration=token.Register(()=>server.Close()); + try{while(!token.IsCancellationRequested) + { + using var client=server.Accept();uint size=12;if(getsockopt((int)client.Handle,1,17,out var credentials,ref size)!=0||credentials.Uid!=uid)continue;client.ReceiveTimeout=5000;client.SendTimeout=5000; + object response;try + { + using var stream=new NetworkStream(client,false);var request=new List();while(request.Count<=4096){int b=stream.ReadByte();if(b<0||b==10)break;request.Add((byte)b);}if(request.Count>4096)throw new IOException("Request too large");using var json=JsonDocument.Parse(request.ToArray());int target=Target(uid);var root=json.RootElement; + response=root.GetProperty("op").GetString() switch{"maps"=>new{pid=target,maps=ReadMaps(target)},"read"=>new{data=Convert.ToBase64String(Read(root.GetProperty("address").GetUInt64(),root.GetProperty("length").GetInt32()))},"aim_camera"=>AimCamera(root),_=>throw new IOException("Supported operations: maps, read, aim_camera")}; + }catch(Exception e){response=new{error=e.Message,code=e is TargetUnavailableException?"target_unavailable":"request_failed"};} + try{byte[] data=Encoding.UTF8.GetBytes(JsonSerializer.Serialize(response,jsonOptions)+"\n");int done=0;while(done!float.IsFinite(f))|| + !float.IsFinite(target.X)||!float.IsFinite(target.Y)||!float.IsFinite(target.Z)|| + !float.IsFinite(response)||response<0||response>1)throw new IOException("Invalid camera aim input"); + var right=new Vector3(frame[0],frame[3],frame[6]); + var up=new Vector3(frame[1],frame[4],frame[7]); + var back=new Vector3(frame[2],frame[5],frame[8]); + if(Math.Abs(right.LengthSquared()-1)>.02f||Math.Abs(up.LengthSquared()-1)>.02f||Math.Abs(back.LengthSquared()-1)>.02f|| + Math.Abs(Vector3.Dot(right,up))>.02f||Math.Abs(Vector3.Dot(right,back))>.02f||Math.Abs(Vector3.Dot(up,back))>.02f|| + Vector3.Dot(Vector3.Cross(right,up),back)<.98f)throw new IOException("Camera basis is not a valid rotation"); + var delta=new Vector3(frame[9],frame[10],frame[11])-target; + if(delta.LengthSquared()<.0001f)throw new IOException("Target is at the camera position"); + var wantedBack=Vector3.Normalize(delta);var wantedRight=Vector3.Cross(Vector3.UnitY,wantedBack); + if(wantedRight.LengthSquared()<.0001f)wantedRight=right-wantedBack*Vector3.Dot(right,wantedBack); + if(wantedRight.LengthSquared()<.0001f)wantedRight=Vector3.Cross(Vector3.UnitZ,wantedBack); + wantedRight=Vector3.Normalize(wantedRight);var wantedUp=Vector3.Normalize(Vector3.Cross(wantedBack,wantedRight)); + static Quaternion Q(Vector3 r,Vector3 u,Vector3 b)=>Quaternion.Normalize(Quaternion.CreateFromRotationMatrix( + new Matrix4x4(r.X,r.Y,r.Z,0,u.X,u.Y,u.Z,0,b.X,b.Y,b.Z,0,0,0,0,1))); + var rotation=Matrix4x4.CreateFromQuaternion(Quaternion.Slerp(Q(right,up,back),Q(wantedRight,wantedUp,wantedBack),response)); + return [rotation.M11,rotation.M21,rotation.M31,rotation.M12,rotation.M22,rotation.M32,rotation.M13,rotation.M23,rotation.M33]; + } +} diff --git a/CharacterReader.cs b/CharacterReader.cs new file mode 100644 index 0000000..57c89df --- /dev/null +++ b/CharacterReader.cs @@ -0,0 +1,82 @@ +using System.Numerics; +namespace SoberEsp; + +public sealed class TargetUnavailableException(string message):IOException(message); + +public record CharacterSample(Target Target,Vector3 Position,Vector3? Head); + +public static class CharacterReader +{ + public static bool IsInWorkspace(SceneMemory memory,ulong instance,ulong workspace) + { + var seen=new HashSet(); + for(int depth=0;depth<64&&instance!=0&&seen.Add(instance);depth++) + { + if(instance==workspace)return true; + instance=memory.U64(instance+Offsets.Instance.Parent); + } + return false; + } + public static Target Resolve(SceneMemory memory,ulong model,string name,ulong player=0,bool requirePosition=false) + { + var parts=new Dictionary(); + foreach(var child in memory.ChildrenChecked(model)) + if(memory.U64(child+Offsets.Instance.Parent)==model)parts[memory.Name(child)]=child; + ulong root=0; + foreach(string part in new[]{"HumanoidRootPart","UpperTorso","Torso","LowerTorso","Head"}) + if(parts.TryGetValue(part,out var candidate)&&(!requirePosition||Position(memory,candidate,model)!=null)){root=candidate;break;} + return new(model,name,root,parts.GetValueOrDefault("Head"),player); + } + public static Vector3? Position(SceneMemory memory,ulong part,ulong model=0) + { + if(part==0)return null; + try + { + if(model!=0&&memory.U64(part+Offsets.Instance.Parent)!=model)return null; + ulong primitive=memory.U64(part+Offsets.Part.Primitive);if(primitive==0)return null; + var v=memory.Floats(primitive+Offsets.Part.Position,3); + return v.All(f=>float.IsFinite(f)&&Math.Abs(f)<1e7)?new Vector3(v[0],v[1],v[2]):null; + } + catch(IOException){return null;} + } + public static CharacterSample? Read(SceneMemory memory,Target target,ulong workspace) + { + if(target.Player!=0&&memory.U64(target.Player+Offsets.Player.Character)!=target.Model)return null; + if(!IsInWorkspace(memory,target.Model,workspace))return null; + var position=Position(memory,target.Root,target.Model); + if(position==null) + { + target=Resolve(memory,target.Model,target.Name,target.Player,requirePosition:true); + position=Position(memory,target.Root,target.Model); + } + if(position is not {} root)return null; + // A missing, streamed, replaced, or unreadable head must not hide a valid body. + return new(target,root,Position(memory,target.Head,target.Model)); + } +} + +public static class EntityProjection +{ + public static Entity? Create(Target target,Vector3 position,Vector3? head,float[] frame,float fov,int width,int height,Vector3? localPosition) + { + var body=Tracker.Project(position,frame,fov,width,height);if(body is null)return null; + var headScreen=head is {} h?Tracker.Project(h,frame,fov,width,height):null; + var aim=headScreen??body.Value; + // Project a volume rather than subtracting two Y coordinates: prone/rolling + // characters and a close-up body can have coincident or near-plane endpoints. + var points=new List(); + for(int x=-1;x<=1;x+=2)for(int y=-1;y<=1;y+=2)for(int z=-1;z<=1;z+=2) + if(Tracker.Project(position+new Vector3(x*1.5f,y*3,z*1.5f),frame,fov,width,height) is {} point)points.Add(point); + points.Add(body.Value); + if(headScreen is {} projectedHead)points.Add(projectedHead); + float left=points.Min(p=>p.X),right=points.Max(p=>p.X),top=points.Min(p=>p.Y),bottom=points.Max(p=>p.Y); + // Tiny/distant bodies remain selectable, and close boxes are clipped instead + // of causing the entire character to be rejected by a size threshold. + if(right-left<2){left-=1;right+=1;} + if(bottom-top<2){top-=1;bottom+=1;} + left=Math.Clamp(left,0,width);right=Math.Clamp(right,0,width);top=Math.Clamp(top,0,height);bottom=Math.Clamp(bottom,0,height); + bool boxVisible=right>left&&bottom>top; + return new(target.Name,new(left,top,right-left,bottom-top),Vector3.Distance(position,new(frame[9],frame[10],frame[11])),position, + new(aim.X,aim.Y),target.Model,localPosition is {} local?Vector3.Distance(position,local):null,new(body.Value.X,body.Value.Y),boxVisible,headScreen!=null); + } +} diff --git a/CharacterTrackingTests.cs b/CharacterTrackingTests.cs new file mode 100644 index 0000000..94ec832 --- /dev/null +++ b/CharacterTrackingTests.cs @@ -0,0 +1,69 @@ +using System.Buffers.Binary; +using System.Numerics; +using System.Text; +namespace SoberEsp; + +public static class CharacterTrackingTests +{ + public static void Run() + { + var pages=new Dictionary();ulong next=0x100000; + ulong Alloc(){ulong a=next;next+=4096;pages[a]=new byte[4096];return a;} + void Bytes(ulong a,byte[] b)=>Buffer.BlockCopy(b,0,pages[a&~4095UL],(int)(a&4095),b.Length); + void U64(ulong a,ulong v){var b=new byte[8];BinaryPrimitives.WriteUInt64LittleEndian(b,v);Bytes(a,b);} + void Position(ulong primitive,Vector3 v){var bytes=new byte[12];Buffer.BlockCopy(new[]{v.X,v.Y,v.Z},0,bytes,0,12);Bytes(primitive+Offsets.Part.Position,bytes);} + ulong Object(string name,ulong parent) + { + ulong a=Alloc(),text=Alloc();U64(a+Offsets.Instance.Parent,parent);U64(a+Offsets.Instance.Name,text); + Bytes(text+Offsets.Instance.NameText,[(byte)(name.Length*2),..Encoding.UTF8.GetBytes(name)]);return a; + } + void Children(ulong a,params ulong[] children) + { + ulong v=Alloc(),data=Alloc();U64(a+Offsets.Instance.Children,v);U64(v,data);U64(v+8,data+(ulong)children.Length*16); + for(int i=0;inew((a,n)=>pages.TryGetValue(a,out var page)?page.ToArray():throw new IOException("Fixture page unavailable")); + void Check(bool value,string error){if(!value)throw new Exception("Character tracking: "+error);} + ulong workspace=Object("Workspace",0),folder=Object("Characters",workspace),model=Object("Remote",folder),player=Object("Player",0); + ulong root=Object("HumanoidRootPart",model),head=Object("Head",model),rootPrimitive=Alloc(),headPrimitive=Alloc(); + U64(player+Offsets.Player.Character,model);U64(root+Offsets.Part.Primitive,rootPrimitive);U64(head+Offsets.Part.Primitive,headPrimitive);Children(model,root,head); + var target=new Target(model,"Remote",root,head,player); + float[] frame=[1,0,0,0,1,0,0,0,1,0,0,0]; + var settings=new Settings{MaxDistance=10000}; + foreach(var position in new[]{new Vector3(0,0,-20),new Vector3(6,2,-20),new Vector3(-6,-2,-20),new Vector3(1000,0,-2000),new Vector3(-1000,0,-2000)}) + { + Position(rootPrimitive,position);Position(headPrimitive,position+new Vector3(0,2,0)); + var sample=CharacterReader.Read(Memory(),target,workspace); + Check(sample!=null,"moving/nested character disappeared"); + var entity=EntityProjection.Create(sample!.Target,sample.Position,sample.Head,frame,MathF.PI/2,1000,1000,null); + Check(entity is {BoxVisible:true},"fast/distant movement dropped box"); + } + Position(rootPrimitive,new(0,0,-.1f));Position(headPrimitive,new(0,2,.5f)); + var close=CharacterReader.Read(Memory(),target,workspace)!; + var closeEntity=EntityProjection.Create(close.Target,close.Position,close.Head,frame,MathF.PI/2,1000,1000,null)!; + Check(closeEntity.BoxVisible&&!closeEntity.HeadAvailable&&AimMath.Eligible(closeEntity,Vector2.One,new(500,500),settings),"near-plane head dropped valid body/aim"); + Check(closeEntity.Rect.X>=0&&closeEntity.Rect.Y>=0&&closeEntity.Rect.X+closeEntity.Rect.Z<=1000&&closeEntity.Rect.Y+closeEntity.Rect.W<=1000,"close box was not clipped"); + Position(rootPrimitive,new(0,0,-20));Position(headPrimitive,new(3,-3.8f,-20)); + var ragdoll=CharacterReader.Read(Memory(),target,workspace)!; + Check(EntityProjection.Create(ragdoll.Target,ragdoll.Position,ragdoll.Head,frame,MathF.PI/2,1000,1000,null) is {BoxVisible:true},"coincident head/feet Y removed ragdoll"); + U64(head+Offsets.Part.Primitive,0xdead0000); + var partial=CharacterReader.Read(Memory(),target,workspace); + Check(partial is {Head:null},"unreadable head removed body"); + var partialEntity=EntityProjection.Create(partial!.Target,partial.Position,partial.Head,frame,MathF.PI/2,1000,1000,null)!; + Check(!partialEntity.HeadAvailable&&AimMath.Eligible(partialEntity,Vector2.One,new(500,500),settings),"head fallback not aimable"); + U64(head+Offsets.Part.Primitive,headPrimitive);U64(head+Offsets.Instance.Parent,0); + Check(CharacterReader.Read(Memory(),target,workspace) is {Head:null},"reparented stale head was trusted"); + ulong replacement=Object("HumanoidRootPart",model),replacementPrimitive=Alloc();U64(replacement+Offsets.Part.Primitive,replacementPrimitive);Position(replacementPrimitive,new(2,0,-20)); + U64(root+Offsets.Instance.Parent,0);Children(model,replacement); + var replaced=CharacterReader.Read(Memory(),target,workspace); + Check(replaced?.Target.Root==replacement&&replaced.Position.X==2,"replaced root was not resolved immediately"); + ulong newPrimitive=Alloc();Position(newPrimitive,new(-3,0,-20));U64(replacement+Offsets.Part.Primitive,newPrimitive); + Check(CharacterReader.Read(Memory(),replaced!.Target,workspace)?.Position.X==-3,"swapped physics primitive retained old position"); + ulong torso=Object("UpperTorso",model),torsoPrimitive=Alloc();U64(torso+Offsets.Part.Primitive,torsoPrimitive);Position(torsoPrimitive,new(0,0,-20)); + U64(replacement+Offsets.Part.Primitive,0);Children(model,replacement,torso); + Check(CharacterReader.Read(Memory(),replaced.Target,workspace)?.Target.Root==torso,"unreadable root did not fall back to a live torso"); + U64(player+Offsets.Player.Character,0);Check(CharacterReader.Read(Memory(),replaced.Target,workspace)==null,"removed character retained ghost target"); + U64(player+Offsets.Player.Character,model);U64(model+Offsets.Instance.Parent,0);Check(CharacterReader.Read(Memory(),replaced.Target,workspace)==null,"detached model retained ghost target"); + U64(model+Offsets.Instance.Parent,folder);U64(folder+Offsets.Instance.Parent,model);Check(!CharacterReader.IsInWorkspace(Memory(),model,workspace),"cyclic ancestry was accepted"); + } +} diff --git a/Discovery.cs b/Discovery.cs new file mode 100644 index 0000000..9632c64 --- /dev/null +++ b/Discovery.cs @@ -0,0 +1,32 @@ +using System.Diagnostics; +using System.Text.Json; +namespace SoberEsp; +public record Profile(int Pid,ulong Base,ulong Workspace,ulong Camera,bool Provisional=false,ulong HeapSize=0,ulong HeapOffset=0); +public sealed class Discovery(MemoryBridge bridge,string home) +{ + string Cache=>System.IO.Path.Combine(home,"profile.json"); + Profile? Load(){try{return JsonSerializer.Deserialize(File.ReadAllText(Cache));}catch{return null;}} + public bool Matches(ulong address){try{return Offsets.Fingerprints.All(p=>bridge.Read(address+p.Key,p.Value.Length).AsSpan().SequenceEqual(p.Value));}catch(IOException){return false;}} + (int Models,ulong Camera)? Candidate(SceneMemory mem,ulong workspace) + { + try{if(mem.Type(workspace)!="N3RBX9WorkspaceE"||mem.U64(workspace+Offsets.Instance.Self)!=workspace)return null;var children=mem.Children(workspace);int models=children.Count(c=>mem.Type(c)=="N3RBX13ModelInstanceE");foreach(var camera in children){if(mem.Type(camera)!="N3RBX6CameraE"||mem.U64(camera+Offsets.Instance.Parent)!=workspace)continue;var viewport=mem.Read(camera+Offsets.Camera.Viewport,4);int w=BitConverter.ToInt16(viewport),h=BitConverter.ToInt16(viewport,2);if(w>1&&h>1&&w<20000&&h<20000)return(models,camera);}}catch{}return null; + } + public Profile Find(ProcessMaps live,Action status,CancellationToken token,bool useCache=true) + { + var timer=Stopwatch.StartNew();var mem=new SceneMemory(bridge);var old=Load(); + if(useCache&&old?.Pid==live.Pid&&Matches(old.Base)&&Candidate(mem,old.Workspace) is {Models:>0} cached)return old with{Camera=cached.Camera}; + ulong baseAddress=live.Maps.Where(r=>r.Permissions.Contains('x')&&r.Path.Contains("memfd:")&&r.End-r.Start>Offsets.MinimumLibraryMappingSize).Select(r=>r.Start).FirstOrDefault(Matches); + if(baseAddress==0)throw new IOException("Waiting for the supported client library"); + Profile Save(ulong workspace,(int Models,ulong Camera) result){var r=live.Maps.FirstOrDefault(r=>r.Start<=workspace&&workspacer.Permissions.StartsWith("rw")&&r.Path.Contains("mimalloc")).ToList(); + if(old is not null)foreach(var heap in heaps.Where(r=>r.End-r.Start==old.HeapSize)){var candidate=Candidate(mem,heap.Start+old.HeapOffset);if(candidate is {Models:>0} value)return Save(heap.Start+old.HeapOffset,value);} + byte[] needle=BitConverter.GetBytes(baseAddress+Offsets.WorkspaceVtable);ulong total=0;Profile? fallback=null; + foreach(var region in heaps)for(ulong address=region.Start;address0} ready)return Save(address+(uint)i,ready);if(found.HasValue)fallback=new(live.Pid,baseAddress,address+(uint)i,found.Value.Camera,true);} + if(total%(64*1048576UL)==0)status($"Searching for the active game: {total/1048576} MiB checked"); + } + if(fallback is not null)return Save(fallback.Workspace,(0,fallback.Camera));throw new IOException("Waiting for a playable scene"); + } +} diff --git a/ExplorerReader.cs b/ExplorerReader.cs new file mode 100644 index 0000000..de31684 --- /dev/null +++ b/ExplorerReader.cs @@ -0,0 +1,50 @@ +using System.Diagnostics; +using System.Numerics; +namespace SoberEsp; + +public record ExplorerNode(ulong Address,string Name,string ClassName,string RawType,ulong Parent,Vector3? Position=null); +public record ExplorerBranch(ExplorerNode Node,IReadOnlyList Children,int Total,int NextOffset,int Skipped=0,int Offset=0); + +public static class ExplorerReader +{ + public static string ClassName(string raw) + { + int index=raw.StartsWith('N')?1:0;string last=""; + while(indexraw.Length-index)return raw; + last=raw.Substring(index,length);index+=length; + } + return last.Length>0&&index==raw.Length-(raw.StartsWith('N')?1:0)?last:raw; + } + static ExplorerNode Inspect(SceneMemory memory,ulong address) + { + string raw=memory.Type(address);if(raw=="?")throw new IOException("Instance is unavailable; refresh the hierarchy"); + string type=ClassName(raw);Vector3? position=null; + if(type is "PartInstance" or "MeshPart" or "WedgePart" or "CornerWedgePart" or "UnionOperation") + { + try{var values=memory.Floats(memory.U64(address+Offsets.Part.Primitive)+Offsets.Part.Position,3);if(values.All(f=>float.IsFinite(f)&&Math.Abs(f)<1e7))position=new(values[0],values[1],values[2]);}catch(IOException){} + } + return new(address,memory.Name(address),type,raw,memory.U64(address+Offsets.Instance.Parent),position); + } + public static ExplorerBranch Read(SceneMemory memory,CameraContext context,ulong address,int offset,CancellationToken token) + { + token.ThrowIfCancellationRequested(); + if(memory.Type(context.Workspace)!="N3RBX9WorkspaceE")throw new IOException("Scene changed; waiting for a new hierarchy"); + ulong root=memory.U64(context.Workspace+Offsets.Instance.Parent); + if(root==0)throw new IOException("Game root is unavailable"); + if(address==0)address=root; + var node=Inspect(memory,address);var children=memory.ChildrenChecked(address); + if(offset<0||offset>children.Count)throw new IOException("Children changed; refresh this branch"); + var result=new List();int next=offset,skipped=0;var timer=Stopwatch.StartNew(); + // Load one page at a time, on a worker. Never scan the complete scene for the UI. + while(next2)break; + } + return new(node,result,children.Count,next,skipped,offset); + } +} diff --git a/ExplorerTests.cs b/ExplorerTests.cs new file mode 100644 index 0000000..a537717 --- /dev/null +++ b/ExplorerTests.cs @@ -0,0 +1,46 @@ +using System.Buffers.Binary; +using System.Text; +namespace SoberEsp; + +public static class ExplorerTests +{ + public static void Run() + { + var pages=new Dictionary();ulong next=0x100000; + ulong Alloc(){ulong address=next;next+=4096;pages[address]=new byte[4096];return address;} + void Bytes(ulong address,byte[] bytes){Buffer.BlockCopy(bytes,0,pages[address&~4095UL],(int)(address&4095),bytes.Length);} + void U64(ulong address,ulong value){var b=new byte[8];BinaryPrimitives.WriteUInt64LittleEndian(b,value);Bytes(address,b);} + ulong Object(string name,string type,ulong parent) + { + ulong address=Alloc(),vtable=Alloc()+8,info=Alloc(),raw=Alloc(),text=Alloc(); + U64(address,vtable);U64(vtable-Offsets.Rtti.VtableTypeInfoBack,info);U64(info+Offsets.Rtti.TypeName,raw);Bytes(raw,Encoding.ASCII.GetBytes(type+"\0")); + U64(address+Offsets.Instance.Name,text);Bytes(text+Offsets.Instance.NameText,[(byte)(name.Length*2),..Encoding.UTF8.GetBytes(name)]); + U64(address+Offsets.Instance.Parent,parent);return address; + } + ulong Children(ulong address,IReadOnlyList children) + { + ulong vector=Alloc(),data=Alloc();U64(address+Offsets.Instance.Children,vector);U64(vector,data);U64(vector+8,data+(ulong)children.Count*16); + for(int i=0;inew((address,length)=>pages.TryGetValue(address,out var page)?page.ToArray():throw new IOException("Unmapped fixture page")); + void Check(bool value,string error){if(!value)throw new Exception("Explorer: "+error);} + ulong root=Object("Game","N3RBX9DataModelE",0),workspace=Object("Workspace","N3RBX9WorkspaceE",root); + var children=new List{workspace}; + for(int i=1;i<130;i++)children.Add(Object("Child"+i,"N3RBX13ModelInstanceE",root)); + var vector=Children(root,children);var scene=new CameraContext(1,0,workspace,0); + var first=ExplorerReader.Read(Memory(),scene,0,0,CancellationToken.None); + Check(first.Node.Address==root&&first.Node.ClassName=="DataModel","game root/class lookup"); + Check(first.Total==130&&first.Children.Count==128&&first.NextOffset==128,"first page bounds"); + var second=ExplorerReader.Read(Memory(),scene,root,first.NextOffset,CancellationToken.None); + Check(second.Children.Count==2&&second.NextOffset==130&&second.Offset==128,"second page bounds"); + Check(!first.Children.Select(n=>n.Address).Intersect(second.Children.Select(n=>n.Address)).Any(),"pagination repeated a child"); + U64(children[1]+Offsets.Instance.Parent,workspace); + var moved=ExplorerReader.Read(Memory(),scene,root,0,CancellationToken.None); + Check(moved.Skipped==1&&moved.Children.Count==127,"moved children must be skipped"); + U64(vector+8,next+1000000); + try{ExplorerReader.Read(Memory(),scene,root,0,CancellationToken.None);throw new Exception("Explorer accepted malformed children");}catch(IOException){} + using var cancel=new CancellationTokenSource();cancel.Cancel(); + try{ExplorerReader.Read(Memory(),scene,root,0,cancel.Token);throw new Exception("Explorer ignored cancellation");}catch(OperationCanceledException){} + Check(ExplorerReader.ClassName("N3RBX9WorkspaceE")=="Workspace"&&ExplorerReader.ClassName("unknown")=="unknown","class-name formatting"); + } +} diff --git a/GameExplorer.cs b/GameExplorer.cs new file mode 100644 index 0000000..370a488 --- /dev/null +++ b/GameExplorer.cs @@ -0,0 +1,137 @@ +using ImGuiNET; +using System.Numerics; +namespace SoberEsp; + +public sealed class GameExplorer(Func read):IDisposable +{ + readonly Dictionary branches=[]; + readonly Dictionary nodes=[]; + readonly Queue<(ulong Address,int Offset)> queue=[]; + readonly HashSet<(ulong,int)> queued=[]; + readonly Dictionary errors=[]; + Task? pending;CancellationTokenSource? cancellation; + (ulong Address,int Offset) pendingKey;CameraContext? context,pendingContext,previewContext; + ulong root,selected;int treeId;string message=""; + const int MaxNodes=4096; + static bool SameScene(CameraContext? a,CameraContext? b)=>a?.Pid==b?.Pid&&a?.Workspace==b?.Workspace&&a?.Base==b?.Base; + void Clear() + { + Pause();branches.Clear();nodes.Clear();errors.Clear();root=selected=0;treeId++;message=""; + } + public void Pause(){queue.Clear();queued.Clear();cancellation?.Cancel();} + void Request(ulong address,int offset=0) + { + if(nodes.Count>=MaxNodes){message="Explorer cache limit reached. Refresh to browse another branch.";return;} + var key=(address,offset); + if(errors.ContainsKey(address)||queued.Contains(key)||(pending!=null&&pendingKey==key))return; + if(queue.Count<128){queue.Enqueue(key);queued.Add(key);} + } + void Pump() + { + if(pending is {IsCompleted:true}) + { + try + { + var result=pending.GetAwaiter().GetResult(); + if(!cancellation!.IsCancellationRequested&&SameScene(context,pendingContext)) + { + if(pendingKey.Address==0){root=result.Node.Address;if(selected==0)selected=root;} + if(result.Offset>0&&branches.TryGetValue(result.Node.Address,out var previous)) + result=result with{Children=previous.Children.Concat(result.Children).DistinctBy(n=>n.Address).ToArray(),Skipped=previous.Skipped+result.Skipped}; + branches[result.Node.Address]=result;nodes[result.Node.Address]=result.Node; + foreach(var child in result.Children)nodes[child.Address]=child; + errors.Remove(result.Node.Address); + } + } + catch(OperationCanceledException){} + catch(Exception error){if(!cancellation!.IsCancellationRequested&&SameScene(context,pendingContext))errors[pendingKey.Address]=error.Message;} + finally{pending=null;cancellation?.Dispose();cancellation=null;} + } + if(pending==null&&queue.TryDequeue(out var request)&&context is {} scene) + { + queued.Remove(request);pendingKey=request;pendingContext=scene;cancellation=new();var token=cancellation.Token; + pending=Task.Run(()=>read(scene,request.Address,request.Offset,token),token); + } + } + void Node(ExplorerNode node,HashSet ancestors,int depth=0) + { + if(depth>=32||!ancestors.Add(node.Address)){ImGui.TextDisabled("Cycle or depth limit reached");return;} + bool loaded=branches.TryGetValue(node.Address,out var branch); + var flags=ImGuiTreeNodeFlags.OpenOnArrow|ImGuiTreeNodeFlags.SpanAvailWidth; + if(selected==node.Address)flags|=ImGuiTreeNodeFlags.Selected; + if(loaded&&branch!.Total==0)flags|=ImGuiTreeNodeFlags.Leaf; + if(node.Address==root)flags|=ImGuiTreeNodeFlags.DefaultOpen; + string name=node.Name.Replace('#','#').Replace('\n',' '); + bool open=ImGui.TreeNodeEx($"{name} [{node.ClassName}]##{node.Address:X}",flags); + if(ImGui.IsItemClicked()){selected=node.Address;if(!loaded)Request(node.Address);} + if(open) + { + if(errors.TryGetValue(node.Address,out var error)){ImGui.TextWrapped(error);if(ImGui.SmallButton($"Retry##{node.Address:X}")){errors.Remove(node.Address);Request(node.Address);}} + else if(!loaded){Request(node.Address);ImGui.TextDisabled("Loading children...");} + else + { + foreach(var child in branch!.Children)Node(child,ancestors,depth+1); + if(branch.NextOffset0)ImGui.TextDisabled($"{branch.Skipped} unavailable or moved children skipped"); + } + ImGui.TreePop(); + } + ancestors.Remove(node.Address); + } + string Path(ExplorerNode node) + { + var names=new List();var visited=new HashSet();var current=node; + while(visited.Add(current.Address)&&names.Count<32){names.Add(current.Name);if(!nodes.TryGetValue(current.Parent,out var parent))break;current=parent;} + names.Reverse();return string.Join(" / ",names); + } + public void Draw(Snapshot state) + { + var scene=previewContext??state.CameraContext; + if(!SameScene(context,scene)){Clear();context=scene;} + Pump(); + if(ImGui.Button("Refresh hierarchy"))Clear();ImGui.SameLine();ImGui.TextDisabled(pending!=null?"Loading...":"Read-only explorer"); + ImGui.TextWrapped("Expand arrows to load children. Select an instance to inspect it. Scroll either pane with the mouse wheel."); + if(context==null){ImGui.TextWrapped("Waiting for a playable scene: "+state.Status);return;} + if(root==0) + { + if(errors.TryGetValue(0,out var error))ImGui.TextWrapped(error);else{Request(0);Pump();ImGui.TextDisabled("Loading game root...");} + return; + } + if(message.Length>0)ImGui.TextWrapped(message); + var size=ImGui.GetContentRegionAvail();float left=Math.Max(180,size.X*.56f); + ImGui.PushID(treeId); + ImGui.BeginChild("hierarchy",new(left,Math.Max(140,size.Y)),ImGuiChildFlags.Borders,ImGuiWindowFlags.HorizontalScrollbar); + if(nodes.TryGetValue(root,out var rootNode))Node(rootNode,[]); + ImGui.EndChild();ImGui.PopID();ImGui.SameLine(); + ImGui.BeginChild("properties",new(0,Math.Max(140,size.Y)),ImGuiChildFlags.Borders); + if(nodes.TryGetValue(selected,out var node)) + { + ImGui.TextUnformatted(node.Name);ImGui.Separator(); + ImGui.TextWrapped("Class: "+node.ClassName);ImGui.TextWrapped($"Address: 0x{node.Address:X}"); + ImGui.TextWrapped($"Parent: 0x{node.Parent:X}");ImGui.TextWrapped("Path: "+Path(node)); + if(branches.TryGetValue(selected,out var branch))ImGui.TextWrapped($"Children: {branch.Total} ({branch.Children.Count} loaded)"); + else{Request(selected);ImGui.TextDisabled("Children: loading...");} + if(node.Position is {} position)ImGui.TextWrapped($"Position: {position.X:F2}, {position.Y:F2}, {position.Z:F2}"); + ImGui.TextWrapped("RTTI: "+node.RawType); + if(ImGui.Button("Refresh selected")){errors.Remove(selected);Request(selected);} + if(errors.TryGetValue(selected,out var error))ImGui.TextWrapped(error); + } + else ImGui.TextWrapped("Select an instance in the hierarchy."); + ImGui.EndChild();Pump(); + } + public static GameExplorer CreatePreview() + { + var scene=new CameraContext(1,1,0x2000,0x3000); + var root=new ExplorerNode(0x1000,"Game","DataModel","N3RBX9DataModelE",0); + var workspace=new ExplorerNode(0x2000,"Workspace","Workspace","N3RBX9WorkspaceE",0x1000); + var camera=new ExplorerNode(0x3000,"Camera","Camera","N3RBX6CameraE",0x2000); + var player=new ExplorerNode(0x4000,"Player character","ModelInstance","N3RBX13ModelInstanceE",0x2000); + var preview=new GameExplorer((_,address,_,token)=>throw new InvalidOperationException("Preview branch missing")){context=scene,previewContext=scene,root=root.Address,selected=camera.Address}; + foreach(var node in new[]{root,workspace,camera,player})preview.nodes[node.Address]=node; + preview.branches[root.Address]=new(root,[workspace],1,1); + preview.branches[workspace.Address]=new(workspace,[camera,player],2,2); + preview.branches[camera.Address]=new(camera,[],0,0);preview.branches[player.Address]=new(player,[],0,0); + return preview; + } + public void Dispose(){Pause();cancellation?.Dispose();} +} diff --git a/Memory.cs b/Memory.cs new file mode 100644 index 0000000..e0ecd76 --- /dev/null +++ b/Memory.cs @@ -0,0 +1,64 @@ +using System.Buffers.Binary; +using System.Net.Sockets; +using System.Text; +using System.Text.Json; +namespace SoberEsp; +public record Mapping(ulong Start,ulong End,string Permissions,ulong Offset,string Path); +public record ProcessMaps(int Pid,List Maps); +public sealed class MemoryBridge(string path) +{ + public string Path=>path; + public JsonDocument Request(object request) + { + using var socket=new Socket(AddressFamily.Unix,SocketType.Stream,ProtocolType.Unspecified); + socket.ReceiveTimeout=5000;socket.SendTimeout=5000;socket.Connect(new UnixDomainSocketEndPoint(path)); + var bytes=Encoding.UTF8.GetBytes(JsonSerializer.Serialize(request)+"\n");int sent=0;while(sent=0)break;if(buffer.Length>32*1024*1024)throw new IOException("Bridge response too large");} + var json=JsonDocument.Parse(buffer.ToArray());if(json.RootElement.TryGetProperty("error",out var error)){string message=error.GetString()??"Bridge error";bool transient=json.RootElement.TryGetProperty("code",out var code)&&code.GetString()=="target_unavailable";json.Dispose();if(transient)throw new TargetUnavailableException(message);throw new IOException(message);}return json; + } + public ProcessMaps GetMaps() + { + using var json=Request(new{op="maps"});var root=json.RootElement; + return new(root.GetProperty("pid").GetInt32(),root.GetProperty("maps").EnumerateArray().Select(r=>new Mapping(r.GetProperty("start").GetUInt64(),r.GetProperty("end").GetUInt64(),r.GetProperty("permissions").GetString()!,r.GetProperty("offset").GetUInt64(),r.GetProperty("path").GetString()!)).ToList()); + } + public void AimCamera(CameraContext context,ulong model,bool head,float response) + { + using var json=Request(new{op="aim_camera",pid=context.Pid,baseAddress=context.Base,workspace=context.Workspace,camera=context.Camera,model,head,response}); + } + public byte[] Read(ulong address,int length) + { + using var json=Request(new{op="read",address,length});return Convert.FromBase64String(json.RootElement.GetProperty("data").GetString()!); + } +} +public sealed class SceneMemory(Func readMemory) +{ + public SceneMemory(MemoryBridge bridge):this(bridge.Read){} + readonly Dictionary pages=[]; + public byte[] Read(ulong address,int length) + { + if(length<0||length>1048576)throw new IOException("Invalid memory range");var result=new byte[length];int done=0; + while(doneBinaryPrimitives.ReadUInt64LittleEndian(Read(address,8)); + public float[] Floats(ulong address,int count){var b=Read(address,count*4);var result=new float[count];Buffer.BlockCopy(b,0,result,0,b.Length);return result;} + public string Text(ulong address) + { + var d=Read(address,Offsets.Text.Size);if((d[0]&1)==0)return Encoding.UTF8.GetString(d,Offsets.Text.ShortData,Math.Min(d[0]>>1,Offsets.Text.ShortCapacity));ulong n=BinaryPrimitives.ReadUInt64LittleEndian(d.AsSpan(Offsets.Text.Length));if(n>256)return "?";return Encoding.UTF8.GetString(Read(BinaryPrimitives.ReadUInt64LittleEndian(d.AsSpan(Offsets.Text.Data)),(int)n)); + } + public string Name(ulong address){try{return Text(U64(address+Offsets.Instance.Name)+Offsets.Instance.NameText);}catch{return "?";}} + public string Type(ulong address) + { + try{ulong v=U64(address),ti=U64(v-Offsets.Rtti.VtableTypeInfoBack),name=U64(ti+Offsets.Rtti.TypeName);var data=Read(name,96);int end=Array.IndexOf(data,(byte)0);return Encoding.ASCII.GetString(data,0,end<0?data.Length:end);}catch{return "?";} + } + public List Children(ulong address){try{return ChildrenChecked(address);}catch{return [];}} + public List ChildrenChecked(ulong address) + { + ulong vector=U64(address+Offsets.Instance.Children);if(vector==0)return []; + ulong begin=U64(vector+Offsets.Instance.ChildrenBegin),end=U64(vector+Offsets.Instance.ChildrenEnd); + if(end160000||(end-begin)%Offsets.Instance.ChildStride!=0)throw new IOException("Instance children changed or are invalid"); + var data=Read(begin,(int)(end-begin));var result=new List(); + for(int i=0;i Fingerprints=new Dictionary + { + [0x498cd14]=Convert.FromHexString("554889e541574156534883ec384989f6"), + [0x6635602]=Convert.FromHexString("554889e55350488b9f68010000") + }; + public static class Instance + { + public const ulong Self=8, Parent=0x68, Name=0x70, Children=0x78; + public const ulong NameText=8, ChildrenBegin=0, ChildrenEnd=8; + public const int ChildStride=16; + } + public static class Rtti {public const ulong VtableTypeInfoBack=8, TypeName=8;} + public static class Text {public const int Size=24, ShortData=1, ShortCapacity=22, Length=8, Data=16;} + public static class Players {public const ulong LocalPlayer=0x110;} + public static class Player {public const ulong Character=0x240;} + public static class Part {public const ulong Primitive=0x168, Position=0xd4;} + public static class Camera + { + public const ulong Frame=0xc0, Viewport=0x274; + public const int RotationBytes=36; + public const int SampleSize=0x200, FrameBytes=48, FrameFloats=12; + public const int FovInSample=0x68, WidthInSample=0x1b4, HeightInSample=0x1b6; + } +} diff --git a/Overlay.cs b/Overlay.cs new file mode 100644 index 0000000..e7ea01c --- /dev/null +++ b/Overlay.cs @@ -0,0 +1,184 @@ +using Dear_ImGui_Sample.Backends; +using ImGuiNET; +using OpenTK.Graphics.OpenGL4; +using OpenTK.Mathematics; +using OpenTK.Windowing.Common; +using OpenTK.Windowing.Desktop; +using OpenTK.Windowing.GraphicsLibraryFramework; +using Num=System.Numerics; +namespace SoberEsp; +public unsafe sealed class Overlay(Tracker tracker,string home,bool renderTest=false):GameWindow(new GameWindowSettings{UpdateFrequency=60},new NativeWindowSettings{Title="Sober ImGui ESP",ClientSize=new(800,600),StartVisible=false,StartFocused=false,WindowBorder=WindowBorder.Hidden,TransparentFramebuffer=true,APIVersion=new(3,3),Profile=ContextProfile.Core}) +{ + X11? x11;nuint own,game;int frames;long lastLookup;bool menu,insertWasDown,mouseWasDown;string lastStatus="",saveError="",aimError=""; + readonly Settings settings=Settings.Load(Path.Combine(home,"settings.json")); + readonly AimSelection selection=new();int aimPid; + readonly HashSet renderedTabs=[]; + readonly GameExplorer explorer=renderTest?GameExplorer.CreatePreview():new GameExplorer(tracker.ReadExplorer); + Num.Vector2 remainder; + protected override void OnLoad() + { + base.OnLoad();x11=new();own=(nuint)GLFW.GetX11Window(WindowPtr);if(own==0)throw new IOException("Overlay X11 window not found");x11.Unmanaged(own); + GLFW.SetWindowAttrib(WindowPtr,WindowAttribute.FocusOnShow,false);GLFW.SetWindowAttrib(WindowPtr,WindowAttribute.Floating,true);MousePassthrough=true;x11.ClickThrough(own); + if(!HasTransparentFramebuffer)throw new IOException("A transparent OpenGL framebuffer could not be created"); + ImGui.CreateContext();var io=ImGui.GetIO();io.NativePtr->IniFilename=null;io.DisplaySize=new(800,600);io.DeltaTime=1/60f;ImguiImplOpenGL3.Init(false);VSync=VSyncMode.Off; + Console.WriteLine("Overlay ready. Insert: menu. Aim: hold right mouse (disabled by default)."); + } + void Save(){try{settings.Save(Path.Combine(home,"settings.json"));saveError="";}catch(Exception e){saveError=e.Message;Console.Error.WriteLine("Settings: "+e.Message);}} + void SetMenu(bool value) + { + bool returnFocus=menu&&x11!.Focused(own); + menu=value; + if(value)IsVisible=true; + MousePassthrough=!value;x11!.Interactive(own,value);remainder=default;selection.Reset(); + if(value){x11.Focus(own);Console.WriteLine("Settings menu opened");} + else{explorer.Pause();if(returnFocus&&game!=0)x11.Focus(game);Save();Console.WriteLine("Settings menu closed");} + } + protected override void OnResize(ResizeEventArgs e){base.OnResize(e);if(own!=0)x11?.Interactive(own,menu);} + protected override void OnMouseWheel(MouseWheelEventArgs e) + { + base.OnMouseWheel(e);if(menu)ImGui.GetIO().AddMouseWheelEvent(e.OffsetX,e.OffsetY); + } + void DrawAimbot() + { + ImGui.Checkbox("Enable aim assistance (hold right mouse)",ref settings.AimEnabled); + int method=(int)settings.AimMethod; + if(ImGui.Combo("Aim method",ref method,"Mouse\0Camera\0")){settings.AimMethod=(AimMethod)method;selection.Reset();remainder=default;aimError="";} + ImGui.Checkbox("Show FOV circle",ref settings.ShowFov);ImGui.SameLine();ImGui.Checkbox("Target marker",ref settings.TargetMarker); + ImGui.SliderFloat("FOV radius (pixels)",ref settings.FovRadius,20,600,"%.0f"); + ImGui.SliderFloat("Sensitivity multiplier",ref settings.Sensitivity,.1f,20,"%.2f"); + ImGui.SliderFloat("Smoothness",ref settings.Smoothness,1,30,"%.1f"); + ImGui.SliderFloat("Maximum distance",ref settings.MaxDistance,10,10000,"%.0f studs"); + int priority=(int)settings.TargetPriority; + if(ImGui.Combo("Target priority",ref priority,"Closest to mouse\0Closest to player\0")){settings.TargetPriority=(TargetPriority)priority;selection.Reset();} + if(ImGui.Checkbox("Aim lock (keep target while held)",ref settings.AimLock))selection.Reset(); + ImGui.Checkbox("Aim at head (otherwise torso)",ref settings.AimAtHead); + ImGui.TextWrapped("Higher smoothness moves more slowly. Closest to mouse uses the centered crosshair, not the captured desktop cursor. Both priorities use the FOV circle. Closest to player uses your character position. Lock pauses if its target becomes unavailable; release right mouse to choose another. No team or wall/occlusion filtering."); + if(aimError.Length>0)ImGui.TextWrapped("Aim: "+aimError); + } + void DrawEsp() + { + ImGui.Checkbox("Player boxes",ref settings.Boxes); + ImGui.Checkbox("Player names",ref settings.Names); + ImGui.Checkbox("Distances (studs)",ref settings.Distances); + ImGui.Checkbox("Status bar",ref settings.Status); + ImGui.Separator();ImGui.TextWrapped("Boxes follow other players. Your own character is excluded. FOV and target markers are configured in the Aimbot tab."); + } + static bool BeginTab(string label,bool selected) + { + var bytes=System.Text.Encoding.UTF8.GetBytes(label+"\0"); + fixed(byte* text=bytes)return ImGuiNative.igBeginTabItem(text,null,selected?ImGuiTabItemFlags.SetSelected:ImGuiTabItemFlags.None)!=0; + } + void DrawMenu(Snapshot state) + { + ImGui.SetNextWindowPos(new(35,55),ImGuiCond.FirstUseEver);ImGui.SetNextWindowSize(new(760,Math.Clamp(ClientSize.Y-90,360,700)),ImGuiCond.FirstUseEver); + bool open=true,explorerActive=false; + ImGui.Begin("Settings",ref open,ImGuiWindowFlags.NoCollapse); + ImGui.TextWrapped("test.");ImGui.TextWrapped(state.Status);ImGui.Separator(); + if(ImGui.BeginTabBar("Settings tabs")) + { + var testTab=renderTest?(frames-1)/2:-1; + if(BeginTab("Aimbot",testTab==0)) + { + if(renderTest)renderedTabs.Add(0); + ImGui.BeginChild("aimbot-content",new(0,Math.Max(160,ImGui.GetContentRegionAvail().Y-48))); + DrawAimbot();ImGui.EndChild();ImGui.EndTabItem(); + } + if(BeginTab("ESP",testTab==1)) + { + if(renderTest)renderedTabs.Add(1); + ImGui.BeginChild("esp-content",new(0,Math.Max(160,ImGui.GetContentRegionAvail().Y-48))); + DrawEsp();ImGui.EndChild();ImGui.EndTabItem(); + } + if(BeginTab("Game Explorer",testTab==2)) + { + if(renderTest)renderedTabs.Add(2); + explorerActive=true; + ImGui.BeginChild("explorer-content",new(0,Math.Max(160,ImGui.GetContentRegionAvail().Y-48))); + explorer.Draw(state);ImGui.EndChild();ImGui.EndTabItem(); + } + ImGui.EndTabBar(); + } + if(!explorerActive)explorer.Pause(); + ImGui.Separator();if(ImGui.Button("Save settings"))Save();ImGui.SameLine();if(ImGui.Button("Close (Insert)"))open=false; + if(saveError.Length>0)ImGui.TextWrapped("Save failed: "+saveError); + ImGui.End();if(!open)SetMenu(false); + } + protected override void OnRenderFrame(FrameEventArgs e) + { + base.OnRenderFrame(e);frames++;var state=tracker.Latest;bool focused=false; + if(!renderTest) + { + if(System.Diagnostics.Stopwatch.GetElapsedTime(lastLookup).TotalMilliseconds>250){game=x11!.FindSober();lastLookup=System.Diagnostics.Stopwatch.GetTimestamp();} + focused=game!=0&&x11!.Focused(game); + bool overlayFocused=menu&&x11!.Focused(own); + bool insert=x11!.InsertDown(); + if(insert&&!insertWasDown&&(focused||overlayFocused))SetMenu(!menu); + insertWasDown=insert; + // Opening the menu transfers focus from Sober to this overlay. That is not an Alt-Tab. + focused=game!=0&&x11.Focused(game); + overlayFocused=menu&&x11.Focused(own); + if(!focused&&!overlayFocused&&menu)SetMenu(false); + bool visible=game!=0&&(focused||overlayFocused); + if(IsVisible!=visible){IsVisible=visible;if(visible){x11.Interactive(own,menu);x11.Raise(own);}} + if(game!=0)try{var g=x11.Geometry(game);if(Location.X!=g.X||Location.Y!=g.Y)Location=new(g.X,g.Y);if(ClientSize.X!=g.W||ClientSize.Y!=g.H)ClientSize=new(Math.Max(1,g.W),Math.Max(1,g.H));}catch(IOException){game=0;focused=false;IsVisible=false;} + string status=game==0?"Waiting for Sober's X11 window (use start-sober.sh)":state.Status; + if(status!=lastStatus){Console.WriteLine(status);lastStatus=status;} + } + var io=ImGui.GetIO();io.DisplaySize=new(ClientSize.X,ClientSize.Y);io.DisplayFramebufferScale=new((float)FramebufferSize.X/Math.Max(1,ClientSize.X),(float)FramebufferSize.Y/Math.Max(1,ClientSize.Y));io.DeltaTime=(float)Math.Clamp(e.Time,.001,.1); + var pointer=x11!.Pointer(own);io.AddMousePosEvent(pointer.X,pointer.Y);bool left=menu&&pointer.Left;if(left!=mouseWasDown){io.AddMouseButtonEvent(0,left);mouseWasDown=left;} + ImguiImplOpenGL3.NewFrame();ImGui.NewFrame();var list=ImGui.GetBackgroundDrawList(); + if(renderTest) + { + list.AddRect(new(100,100),new(300,350),0xff40ff60,0,ImDrawFlags.None,2);list.AddText(new(100,80),0xffffffff,"Renderer smoke test"); + DrawMenu(state); + } + else + { + var scale=new Num.Vector2((float)ClientSize.X/Math.Max(1,state.Width),(float)ClientSize.Y/Math.Max(1,state.Height));var center=new Num.Vector2(ClientSize.X/2f,ClientSize.Y/2f); + foreach(var entity in state.Entities??[]) + { + if(!entity.BoxVisible)continue; + var r=entity.Rect;var a=new Num.Vector2(r.X,r.Y)*scale;var b=a+new Num.Vector2(r.Z,r.W)*scale; + if(settings.Boxes){list.AddRect(a,b,0xc0000000,0,ImDrawFlags.None,4);list.AddRect(a,b,0xff60ff40,0,ImDrawFlags.None,1.5f);} + string text=(settings.Names?entity.Name:"")+(settings.Distances?$" {entity.Distance:F0} studs":""); + if(text.Length>0){list.AddText(a+new Num.Vector2(1,-15),0xff000000,text);list.AddText(a+new Num.Vector2(0,-16),0xffd0ffe0,text);} + } + if(settings.ShowFov)list.AddCircle(center,settings.FovRadius,settings.AimEnabled?0xb060ff40u:0x80808080u,96,1.5f); + if(aimPid!=state.Pid&&state.Pid!=0){selection.Reset();aimPid=state.Pid;} + bool aiming=settings.AimEnabled&&pointer.Right&&!menu&&focused; + var target=selection.Update(state.Status=="Live"?state.Entities??[]:[],scale,center,settings,aiming); + if(target is not null) + { + var point=AimMath.Point(target,scale,settings); + if(settings.AimEnabled&&settings.TargetMarker)list.AddCircle(point,5,0xff00c0ff,20,2); + if(aiming) + { + try + { + if(settings.AimMethod==AimMethod.Camera){remainder=default;tracker.AimCamera(state,target,settings,e.Time);} + else + { + var move=AimMath.Motion(point-center,settings.Sensitivity,settings.Smoothness,e.Time)+remainder;int dx=(int)MathF.Truncate(move.X),dy=(int)MathF.Truncate(move.Y);remainder=move-new Num.Vector2(dx,dy); + x11.MovePointer(dx,dy); + } + aimError=""; + } + catch(TargetUnavailableException error){remainder=default;aimError="Waiting: "+error.Message;} + catch(Exception error)when(error is IOException or System.Net.Sockets.SocketException or DllNotFoundException) + { + settings.AimEnabled=false;selection.Reset();remainder=default;aimError="Stopped: "+error.Message;Console.Error.WriteLine("Aim: "+aimError); + } + } + else remainder=default; + } + else remainder=default; + if(settings.Status){list.AddRectFilled(new(8,8),new(700,33),0xb0000000);list.AddText(new(16,15),0xffb0ffc0,$"{state.Status} · {state.Entities?.Count(e=>e.BoxVisible)??0}/{state.Tracked} visible · {state.SampleMs:F1} ms · Insert: settings");} + if(aimError.Length>0)list.AddText(new(16,40),0xff8080ff,"Aim: "+aimError); + if(menu)DrawMenu(state); + } + ImGui.Render();GL.Viewport(0,0,FramebufferSize.X,FramebufferSize.Y);GL.ClearColor(0,0,0,0);GL.Clear(ClearBufferMask.ColorBufferBit);ImguiImplOpenGL3.RenderDrawData(ImGui.GetDrawData()); + if(renderTest&&frames%2==0){var pixels=new byte[FramebufferSize.X*FramebufferSize.Y*4];GL.ReadPixels(0,0,FramebufferSize.X,FramebufferSize.Y,PixelFormat.Rgba,PixelType.UnsignedByte,pixels);int painted=Enumerable.Range(0,pixels.Length/4).Count(i=>pixels[4*i+3]>0);if(painted<40000||GL.GetError()!=OpenTK.Graphics.OpenGL4.ErrorCode.NoError)throw new IOException("ImGui render validation failed");Console.WriteLine($"Renderer/tab {(frames/2)} smoke test passed: {painted} painted pixels, transparent framebuffer, no GL errors.");if(frames==6){if(renderedTabs.Count!=3)throw new IOException("Not all three menu tabs rendered");Close();}} + SwapBuffers(); + } + protected override void OnUnload(){explorer.Dispose();if(!renderTest)Save();ImguiImplOpenGL3.Shutdown();ImGui.DestroyContext();x11?.Dispose();base.OnUnload();} +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..100712e --- /dev/null +++ b/Program.cs @@ -0,0 +1,115 @@ +using System.Numerics; +using System.Text.Json; +using System.Runtime.InteropServices; +using SoberEsp; +public static class Program +{ + [STAThread]public static int Main(string[] args) + { + string? Option(string name){int i=Array.IndexOf(args,name);return i>=0&&i+1{e.Cancel=true;cancel.Cancel();}; + using var terminate=PosixSignalRegistration.Create(PosixSignal.SIGTERM,context=>{context.Cancel=true;cancel.Cancel();}); + using var hangup=PosixSignalRegistration.Create(PosixSignal.SIGHUP,context=>{context.Cancel=true;cancel.Cancel();}); + try + { + if(args.Contains("--self-test")){SelfTest();return 0;} + if(args.Contains("--bridge")) + { + if(Option("--watch-pid") is {} watch) + { + int watched=int.Parse(watch); + _=Task.Run(async()=>{try{using var process=System.Diagnostics.Process.GetProcessById(watched);await process.WaitForExitAsync(cancel.Token);}catch(ArgumentException){}catch(OperationCanceledException){}finally{cancel.Cancel();}}); + } + new BridgeServer(socket,args.Contains("--allow-camera-writes")).Run(cancel.Token);return 0; + } + OpenTK.Windowing.GraphicsLibraryFramework.GLFW.InitHint(OpenTK.Windowing.GraphicsLibraryFramework.InitHintPlatform.Platform,OpenTK.Windowing.GraphicsLibraryFramework.Platform.X11); + var bridge=new MemoryBridge(socket);var tracker=new Tracker(bridge,home); + if(args.Contains("--render-test")){using var test=new Overlay(tracker,home,true);test.Run();return 0;} + var worker=Task.Run(()=>tracker.Run(cancel.Token)); + if(args.Contains("--snapshot")) + { + var end=DateTime.UtcNow.AddSeconds(30);while(DateTime.UtcNowoverlay.Close());overlay.Run();}finally{cancel.Cancel();File.Delete(Path.Combine(home,"overlay.pid"));} + return 0; + } + catch(Exception e){Console.Error.WriteLine(e);return 1;} + } + static void SelfTest() + { + float[] identity=[1,0,0,0,1,0,0,0,1,0,0,0];var center=Tracker.Project(new(0,0,-10),identity,MathF.PI/2,1000,1000);if(center is null||Vector3.Distance(center.Value,new(500,500,10))>.01)throw new Exception("Center projection failed"); + var axes=Tracker.Project(new(1,1,-10),identity,MathF.PI/2,1000,1000);if(axes is null||Vector3.Distance(axes.Value,new(550,450,10))>.01)throw new Exception("Axes projection failed"); + if(Tracker.Project(new(0,0,10),identity,1,100,100)!=null||Tracker.Project(new(float.NaN,0,-10),identity,1,100,100)!=null)throw new Exception("Clipping failed"); + float[] rotated=[0,0,1,0,1,0,-1,0,0,20,3,4];var result=Tracker.Project(new(10,3,4),rotated,MathF.PI/2,1000,1000);if(result is null||Vector3.Distance(result.Value,new(500,500,10))>.01)throw new Exception("Rotated projection failed"); + var maps=BridgeServer.ReadMaps(Environment.ProcessId);if(maps.Count==0||maps.Any(m=>m.Start>=m.End))throw new Exception("Memory-map parsing failed");if(Tracker.Project(new(0,0,-10),identity,float.NaN,100,100)!=null)throw new Exception("NaN FOV accepted"); + var settings=new Settings();var entity=new Entity("test",new(490,400,20,100),10,default,new(510,500)); + if(AimMath.Select([entity],Vector2.One,new(500,500),settings)!=entity)throw new Exception("Aim selection failed"); + settings.MaxDistance=5;if(AimMath.Select([entity],Vector2.One,new(500,500),settings)!=null)throw new Exception("Aim distance filter failed"); + settings.MaxDistance=100;settings.FovRadius=5;if(AimMath.Select([entity],Vector2.One,new(500,500),settings)!=null)throw new Exception("Aim FOV filter failed"); + var nearMouse=new Entity("same name",new(490,400,20,100),100,default,new(510,500),1,80); + var nearPlayer=new Entity("same name",new(540,400,20,100),200,default,new(550,500),2,10); + var ranking=new Settings();var crosshair=new Vector2(500,500); + if(AimMath.Select([nearMouse,nearPlayer],Vector2.One,crosshair,ranking)?.Id!=1)throw new Exception("Mouse priority failed"); + var left=nearMouse with{AimPoint=new(470,500),Id=3}; + var right=nearPlayer with{AimPoint=new(510,500),Id=4}; + if(AimMath.Select([left,right],Vector2.One,crosshair,ranking)?.Id!=4)throw new Exception("Crosshair selection biased left"); + if(AimMath.Select([left with{AimPoint=new(490,500)},right with{AimPoint=new(530,500)}],Vector2.One,crosshair,ranking)?.Id!=3)throw new Exception("Crosshair selection biased right"); + if(AimMath.Select([left,right],new(2,1.5f),new(1000,750),ranking)?.Id!=4)throw new Exception("Scaled crosshair selection failed"); + ranking.TargetPriority=TargetPriority.ClosestToPlayer; + if(AimMath.Select([nearMouse,nearPlayer],Vector2.One,crosshair,ranking)?.Id!=2)throw new Exception("Player priority used camera distance"); + if(AimMath.Select([nearPlayer with{PlayerDistance=null}],Vector2.One,crosshair,ranking)!=null)throw new Exception("Missing local position must not select a player"); + ranking.FovRadius=20;if(AimMath.Select([nearMouse,nearPlayer],Vector2.One,crosshair,ranking)?.Id!=1)throw new Exception("Player priority ignored FOV"); + ranking.FovRadius=140;ranking.TargetPriority=TargetPriority.ClosestToMouse;ranking.AimLock=true; + var selection=new AimSelection(); + if(selection.Update([nearMouse,nearPlayer],Vector2.One,crosshair,ranking,true)?.Id!=1)throw new Exception("Initial lock failed"); + var moved=nearMouse with{AimPoint=new(560,500)}; + var challenger=nearPlayer with{AimPoint=new(501,500)}; + if(selection.Update([moved,challenger],Vector2.One,crosshair,ranking,true)!=moved)throw new Exception("Lock hopped targets or kept stale coordinates"); + if(selection.Update([challenger],Vector2.One,crosshair,ranking,true)!=null)throw new Exception("Missing locked target caused a hop"); + if(selection.Update([moved with{AimPoint=new(900,500)},challenger],Vector2.One,crosshair,ranking,true)!=null)throw new Exception("Lock ignored FOV"); + if(selection.Update([moved with{Distance=9999},challenger],Vector2.One,crosshair,ranking,true)!=null)throw new Exception("Lock ignored range"); + selection.Update([moved,challenger],Vector2.One,crosshair,ranking,false); + if(selection.Update([moved,challenger],Vector2.One,crosshair,ranking,true)?.Id!=2)throw new Exception("Release did not unlock"); + ranking.AimLock=false; + if(selection.Update([nearMouse,nearPlayer],Vector2.One,crosshair,ranking,true)?.Id!=1)throw new Exception("Disabling lock did not resume ranking"); + // Default/missing player distance must remain serializable in --snapshot output. + _=JsonSerializer.Serialize(nearMouse with{PlayerDistance=null}); + var step=AimMath.Motion(new(100,0),1,8,1d/60);if(step.X<=0||step.X>=100||step.Y!=0)throw new Exception("Aim smoothing failed"); + if(AimMath.Motion(new(10000,0),3,1,1).Length()>40.01f)throw new Exception("Aim motion cap failed"); + var full=AimMath.Motion(new(10,0),1,8,1d/30); + var half=AimMath.Motion(new(10,0),1,8,1d/60); + var halfAgain=AimMath.Motion(new Vector2(10,0)-half,1,8,1d/60); + if(Vector2.Distance(full,half+halfAgain)>.001f)throw new Exception("Aim frame-rate independence failed"); + CameraTests();ExplorerTests.Run();CharacterTrackingTests.Run(); + string settingsPath=Path.Combine(Path.GetTempPath(),"sober-settings-"+Guid.NewGuid()+".json"); + try{var saved=new Settings{FovRadius=250,Smoothness=12,Names=false,Sensitivity=20,AimLock=true,TargetPriority=TargetPriority.ClosestToPlayer,AimMethod=AimMethod.Camera};saved.Save(settingsPath);var loaded=Settings.Load(settingsPath);if(loaded.FovRadius!=250||loaded.Smoothness!=12||loaded.Names||loaded.Sensitivity!=20||!loaded.AimLock||loaded.TargetPriority!=TargetPriority.ClosestToPlayer||loaded.AimMethod!=AimMethod.Camera)throw new Exception("Settings round-trip failed");File.WriteAllText(settingsPath,"invalid");if(Settings.Load(settingsPath).AimEnabled)throw new Exception("Invalid settings fallback failed");}finally{File.Delete(settingsPath);} + Console.WriteLine("Self-tests passed: fast movement, close/ragdoll projection, head failures, part replacement, nested characters, explorer hierarchy/pagination/cancellation, camera rotation/projection/smoothing, centered/scaled crosshair selection, target priorities, stable aim lock, release/reacquisition, settings persistence/fallback, frame-rate independence, aim selection, distance/FOV filters, smoothing, motion cap, NaN FOV, projection, axes, rotation, clipping and /proc map parsing."); + } + static void CameraTests() + { + float[] original=[1,0,0,0,1,0,0,0,1,20,3,4]; + foreach(var target in new Vector3[]{new(30,5,-6),new(10,1,-6),new(20,13,4),new(20,-7,4),new(20,3,14)}) + { + var rotation=CameraAim.Rotation(original,target,1);var aimed=(float[])original.Clone();Array.Copy(rotation,aimed,rotation.Length); + var projected=Tracker.Project(target,aimed,MathF.PI/2,1000,800); + if(projected is null||Vector2.Distance(new(projected.Value.X,projected.Value.Y),new(500,400))>.01f)throw new Exception("Camera rotation did not center target"); + if(aimed[9]!=20||aimed[10]!=3||aimed[11]!=4)throw new Exception("Camera aim changed position"); + // Also validate this result as the next input; covers handedness and pole rotations. + _=CameraAim.Rotation(aimed,new(30,5,-6),.1f); + } + var unchanged=CameraAim.Rotation(original,new(30,3,-6),0); + if(Enumerable.Range(0,9).Any(i=>Math.Abs(unchanged[i]-original[i])>.0001f))throw new Exception("Zero camera response changed orientation"); + var half=CameraAim.Rotation(original,new(30,3,-6),.5f);var halfway=(float[])original.Clone();Array.Copy(half,halfway,9); + var before=Tracker.Project(new(30,3,-6),original,MathF.PI/2,1000,800)!.Value; + var after=Tracker.Project(new(30,3,-6),halfway,MathF.PI/2,1000,800)!.Value; + if(!(after.X>500&&after.XHasPolygonMode = true; + bd->HasClipOrigin = major > 4 || (major == 4 && minor >= 5); + + bd->GlslVersion = (major, minor) switch + { + (4, 6) => 460, + (4, 5) => 450, + (4, 4) => 440, + (4, 3) => 430, + (4, 2) => 420, + (4, 1) => 410, + (4, 0) => 400, + (3, 3) => 330, + (3, 2) => 150, + (3, 1) => 140, + (3, 0) => 130, + (2, 1) => 120, + (2, 0) => 110, + _ => 110, + }; + + if (useKHRDebugIfAvailable) + bd->KHRDebugAvailable = (major == 4 && minor >= 3) || IsExtensionSupported("KHR_debug"); + else + bd->KHRDebugAvailable = false; + + io.BackendRendererUserData = (IntPtr)bd; + io.NativePtr->BackendRendererName = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference("opentk_impl_opengl3"u8)); + + io.BackendFlags |= ImGuiBackendFlags.RendererHasVtxOffset; + io.BackendFlags |= ImGuiBackendFlags.RendererHasViewports; + + InitMultiViewportSupport(); + + return true; + + static bool IsExtensionSupported(string name) + { + int n = GL.GetInteger(GetPName.NumExtensions); + for (int i = 0; i < n; i++) + { + string extension = GL.GetString(StringNameIndexed.Extensions, i); + if (extension == name) return true; + } + + return false; + } + } + + public static void Shutdown() + { + var io = ImGui.GetIO(); + + RendererData* bd = (RendererData*)io.NativePtr->BackendRendererUserData; + + ShutdownMultiViewportSupport(); + + io.NativePtr->BackendRendererName = null; + io.NativePtr->BackendRendererUserData = null; + + io.BackendFlags &= ~(ImGuiBackendFlags.RendererHasVtxOffset); + + NativeMemory.Free(bd); + } + + public static void NewFrame() + { + RendererData* bd = GetBackendData(); + + if (bd->ShaderHandle == 0) + { + CreateDeviceObjects(); + } + if (bd->FontTexture == 0) + { + CreateFontsTexture(); + } + } + + public static void SetupRenderState(ImDrawDataPtr drawData, int fbWidth, int fbHeight, int vao) + { + RendererData* bd = GetBackendData(); + + GL.Enable(EnableCap.Blend); + GL.BlendEquation(BlendEquationMode.FuncAdd); + GL.BlendFuncSeparate(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha, BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha); + GL.Disable(EnableCap.CullFace); + GL.Disable(EnableCap.DepthTest); + GL.Disable(EnableCap.StencilTest); + GL.Enable(EnableCap.ScissorTest); + // FIXME: check for 3.1 + GL.Disable(EnableCap.PrimitiveRestart); + + GL.PolygonMode(TriangleFace.FrontAndBack, PolygonMode.Fill); + + bool clip_origin_lower_left = true; + ClipOrigin clip_origin = (ClipOrigin)GL.GetInteger(GetPName.ClipOrigin); + if (clip_origin == ClipOrigin.UpperLeft) + clip_origin_lower_left = false; + + GL.Viewport(0, 0, fbWidth, fbHeight); + float L = drawData.DisplayPos.X; + float R = drawData.DisplayPos.X + drawData.DisplaySize.X; + float T = drawData.DisplayPos.Y; + float B = drawData.DisplayPos.Y + drawData.DisplaySize.Y; + if (clip_origin_lower_left == false) + (T, B) = (B, T); // Swap top and bottom if origin is upper left. + Matrix4 mvp = Matrix4.CreateOrthographicOffCenter(L, R, B, T, -1, 1); + GL.UseProgram(bd->ShaderHandle); + GL.Uniform1(bd->UniformLocationTex, 0); + GL.UniformMatrix4(bd->UniformLocationProjMtx, true, ref mvp); + + GL.BindSampler(0, 0); + + GL.BindVertexArray(vao); + GL.BindBuffer(BufferTarget.ArrayBuffer, bd->VboHandle); + GL.BindBuffer(BufferTarget.ElementArrayBuffer, bd->EboHandle); + GL.EnableVertexAttribArray(bd->AttribLocationVtxPos); + GL.EnableVertexAttribArray(bd->AttribLocationVtxUV); + GL.EnableVertexAttribArray(bd->AttribLocationVtxColor); + GL.VertexAttribPointer(bd->AttribLocationVtxPos, 2, VertexAttribPointerType.Float, false, sizeof(ImDrawVert), 0); + GL.VertexAttribPointer(bd->AttribLocationVtxUV, 2, VertexAttribPointerType.Float, false, sizeof(ImDrawVert), 8); + GL.VertexAttribPointer(bd->AttribLocationVtxColor, 4, VertexAttribPointerType.UnsignedByte, true, sizeof(ImDrawVert), 16); + + if (bd->KHRDebugAvailable) + { + GL.ObjectLabel(ObjectLabelIdentifier.VertexArray, vao, -1, "OpenTK_ImGui: VAO"); + } + } + + public static void RenderDrawData(ImDrawDataPtr drawData) + { + int fbWidth = (int)(drawData.DisplaySize.X * drawData.FramebufferScale.X); + int fbHeight = (int)(drawData.DisplaySize.Y * drawData.FramebufferScale.Y); + if (fbWidth <= 0 || fbHeight <= 0) + return; + + int last_active_texture = GL.GetInteger(GetPName.ActiveTexture); + GL.ActiveTexture(TextureUnit.Texture0); + int last_program = GL.GetInteger(GetPName.CurrentProgram); + int last_texture = GL.GetInteger(GetPName.TextureBinding2D); + int last_sampler = GL.GetInteger(GetPName.SamplerBinding); + int last_array_buffer = GL.GetInteger(GetPName.ArrayBufferBinding); + int last_vao = GL.GetInteger(GetPName.VertexArrayBinding); + // OpenGL 3.0 & 3.1 have separate polygon modes for front and back. + Span last_polygon_mode = stackalloc int[2]; + GL.GetInteger(GetPName.PolygonMode, out last_polygon_mode[0]); + Span last_viewport = stackalloc int[4]; + GL.GetInteger(GetPName.Viewport, out last_viewport[0]); + Span last_scissor_box = stackalloc int[4]; + GL.GetInteger(GetPName.ScissorBox, out last_scissor_box[0]); + int last_blend_src_rgb = GL.GetInteger(GetPName.BlendSrcRgb); + int last_blend_dst_rgb = GL.GetInteger(GetPName.BlendDstRgb); + int last_blend_src_alpha = GL.GetInteger(GetPName.BlendSrcAlpha); + int last_blend_dst_alpha = GL.GetInteger(GetPName.BlendDstAlpha); + int last_blend_equation_rgb = GL.GetInteger(GetPName.BlendEquationRgb); + int last_blend_equation_alpha = GL.GetInteger(GetPName.BlendEquationAlpha); + bool last_enable_blend = GL.IsEnabled(EnableCap.Blend); + bool last_enable_cull_face = GL.IsEnabled(EnableCap.CullFace); + bool last_enable_depth_test = GL.IsEnabled(EnableCap.DepthTest); + bool last_enable_stencil_test = GL.IsEnabled(EnableCap.StencilTest); + bool last_enable_scissor_test = GL.IsEnabled(EnableCap.ScissorTest); + // FIXME: Check for >= 3.1 + bool last_enable_primitive_restart = GL.IsEnabled(EnableCap.PrimitiveRestart); + + int vao = GL.GenVertexArray(); + SetupRenderState(drawData, fbWidth, fbHeight, vao); + + var clipOff = drawData.DisplayPos; + var clipScale = drawData.FramebufferScale; + for (int n = 0; n < drawData.CmdListsCount; n++) + { + ImDrawListPtr drawList = drawData.CmdLists[n]; + + nint vtx_buffer_size = drawList.VtxBuffer.Size * (int)sizeof(ImDrawVert); + nint idx_buffer_size = drawList.IdxBuffer.Size * (int)sizeof(ushort); + GL.BufferData(BufferTarget.ArrayBuffer, vtx_buffer_size, drawList.VtxBuffer.Data, BufferUsageHint.StreamDraw); + GL.BufferData(BufferTarget.ElementArrayBuffer, idx_buffer_size, drawList.IdxBuffer.Data, BufferUsageHint.StreamDraw); + + for (int cmd_i = 0; cmd_i < drawList.CmdBuffer.Size; cmd_i++) + { + // FIXME: This is a hack to make 32-bit builds work. See: https://github.com/ImGuiNET/ImGui.NET/issues/527 + ImDrawCmdPtr_fixed cmdPtr = new ImPtrVector(drawList.NativePtr->CmdBuffer, sizeof(ImDrawCmd_fixed))[cmd_i]; + ref ImDrawCmd_fixed cmd = ref Unsafe.AsRef(cmdPtr.NativePtr); + if (cmd.UserCallback != 0) + { + // FIXME: ... + nint ImDrawCallback_ResetRenderState = -8; + if (cmd.UserCallback == ImDrawCallback_ResetRenderState) + { + SetupRenderState(drawData, fbWidth, fbHeight, vao); + } + else + { + throw new NotImplementedException("User callbacks are not implemented yet..."); + } + } + else + { + Vector2 clip_min = new((cmd.ClipRect.X -clipOff.X) *clipScale.X, (cmd.ClipRect.Y - clipOff.Y) * clipScale.Y); + Vector2 clip_max = new((cmd.ClipRect.Z -clipOff.X) *clipScale.X, (cmd.ClipRect.W - clipOff.Y) * clipScale.Y); + if (clip_max.X <= clip_min.X || clip_max.Y <= clip_min.Y) + continue; + + GL.Scissor((int)clip_min.X, (int)((float)fbHeight - clip_max.Y), (int)(clip_max.X - clip_min.X), (int)(clip_max.Y - clip_min.Y)); + + GL.BindTexture(TextureTarget.Texture2D, (int)cmdPtr.GetTexID()); + + GL.DrawElementsBaseVertex(PrimitiveType.Triangles, (int)cmd.ElemCount, DrawElementsType.UnsignedShort, (int)(cmd.IdxOffset * sizeof(ushort)), (int)cmd.VtxOffset); + } + } + } + + GL.DeleteVertexArray(vao); + + if (last_program == 0 || GL.IsProgram(last_program)) GL.UseProgram(last_program); + GL.BindTexture(TextureTarget.Texture2D, last_texture); + GL.BindSampler(0, last_sampler); + GL.ActiveTexture((TextureUnit)last_active_texture); + GL.BindVertexArray(last_vao); + GL.BindBuffer(BufferTarget.ArrayBuffer, last_array_buffer); + GL.BlendEquationSeparate((BlendEquationMode)last_blend_equation_rgb, (BlendEquationMode)last_blend_equation_alpha); + GL.BlendFuncSeparate((BlendingFactorSrc)last_blend_src_rgb, (BlendingFactorDest)last_blend_dst_rgb, (BlendingFactorSrc)last_blend_src_alpha, (BlendingFactorDest)last_blend_dst_alpha); + if (last_enable_blend) GL.Enable(EnableCap.Blend); else GL.Disable(EnableCap.Blend); + if (last_enable_cull_face) GL.Enable(EnableCap.CullFace); else GL.Disable(EnableCap.CullFace); + if (last_enable_depth_test) GL.Enable(EnableCap.DepthTest); else GL.Disable(EnableCap.DepthTest); + if (last_enable_stencil_test) GL.Enable(EnableCap.StencilTest); else GL.Disable(EnableCap.StencilTest); + if (last_enable_scissor_test) GL.Enable(EnableCap.ScissorTest); else GL.Disable(EnableCap.ScissorTest); + if (last_enable_primitive_restart) GL.Enable(EnableCap.PrimitiveRestart); else GL.Disable(EnableCap.PrimitiveRestart); + + if (true) + { + // FIXME: + // if (bd->HasPolygonMode) { + // if (bd->GlVersion <= 310 || bd->GlProfileIsCompat) { + // glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); + // glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); + // } else { + // glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); + // } + // } + GL.PolygonMode(TriangleFace.FrontAndBack, (PolygonMode)last_polygon_mode[0]); + } + + GL.Viewport(last_viewport[0], last_viewport[1], last_viewport[2], last_viewport[3]); + GL.Scissor(last_scissor_box[0], last_scissor_box[1], last_scissor_box[2], last_scissor_box[3]); + } + + static void CreateFontsTexture() + { + var io = ImGui.GetIO(); + RendererData* bd = GetBackendData(); + + ImGuiNative.ImFontAtlas_AddFontDefault(io.Fonts.NativePtr, null); + //io.Fonts.AddFontDefault(); + io.Fonts.GetTexDataAsRGBA32(out byte* pixels, out int width, out int height); + + int last_texture = GL.GetInteger(GetPName.TextureBinding2D); + bd->FontTexture = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, bd->FontTexture); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); + GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, (IntPtr)pixels); + + io.Fonts.SetTexID(bd->FontTexture); + + GL.BindTexture(TextureTarget.Texture2D, last_texture); + + if (bd->KHRDebugAvailable) + { + GL.ObjectLabel(ObjectLabelIdentifier.Texture, bd->FontTexture, -1, "OpenTK_ImGui: Font Texture"); + } + } + + static void DestroyFontsTexture() + { + var io = ImGui.GetIO(); + RendererData* bd = GetBackendData(); + + if (bd->FontTexture != 0) + { + GL.DeleteTexture(bd->FontTexture); + io.Fonts.SetTexID(0); + bd->FontTexture = 0; + } + } + + static bool CheckShader(int handle, string desc) + { + GL.GetShader(handle, ShaderParameter.CompileStatus, out int status); + GL.GetShader(handle, ShaderParameter.InfoLogLength, out int logLength); + if (status == 0) + { + Console.Error.WriteLine($"ERROR: ImguiImplOpenGL3.CheckShader: Failed to compile {desc}!"); + } + if (logLength > 1) + { + string log = GL.GetShaderInfoLog(handle); + Console.Error.WriteLine(log); + } + return status == 1; + } + + static bool CheckProgram(int handle, string desc) + { + GL.GetProgram(handle, GetProgramParameterName.LinkStatus, out int status); + GL.GetProgram(handle, GetProgramParameterName.InfoLogLength, out int logLength); + if (status == 0) + { + Console.Error.WriteLine($"ERROR: ImguiImplOpenGL3.CheckProgram: Failed to link {desc}!"); + } + if (logLength > 1) + { + string log = GL.GetProgramInfoLog(handle); + Console.Error.WriteLine(log); + } + return status == 1; + } + + static void CreateDeviceObjects() + { + RendererData* bd = GetBackendData(); + + int last_texture = GL.GetInteger(GetPName.TextureBinding2D); + int last_array_buffer = GL.GetInteger(GetPName.ArrayBufferBinding); + int last_pixel_unpack_buffer = GL.GetInteger(GetPName.PixelUnpackBufferBinding); + int last_vertex_array = GL.GetInteger(GetPName.VertexArray); + + string vertex_shader_glsl_120 = + """ + uniform mat4 ProjMtx; + attribute vec2 Position; + attribute vec2 UV; + attribute vec4 Color; + varying vec2 Frag_UV; + varying vec4 Frag_Color; + void main() + { + Frag_UV = UV; + Frag_Color = Color; + gl_Position = vec4(Position.xy,0,1) * ProjMtx; + } + """; + + string vertex_shader_glsl_130 = + """ + uniform mat4 ProjMtx; + in vec2 Position; + in vec2 UV; + in vec4 Color; + out vec2 Frag_UV; + out vec4 Frag_Color; + void main() + { + Frag_UV = UV; + Frag_Color = Color; + gl_Position = vec4(Position.xy,0,1) * ProjMtx; + } + """; + + string vertex_shader_glsl_300_es = + """ + precision highp float; + layout(location = 0) in vec2 Position; + layout(location = 1) in vec2 UV; + layout(location = 2) in vec4 Color; + uniform mat4 ProjMtx; + out vec2 Frag_UV; + out vec4 Frag_Color; + void main() + { + Frag_UV = UV; + Frag_Color = Color; + gl_Position = vec4(Position.xy,0,1) * ProjMtx; + } + """; + + string vertex_shader_glsl_410_core = + """ + layout(location = 0) in vec2 Position; + layout(location = 1) in vec2 UV; + layout(location = 2) in vec4 Color; + uniform mat4 ProjMtx; + out vec2 Frag_UV; + out vec4 Frag_Color; + void main() + { + Frag_UV = UV; + Frag_Color = Color; + gl_Position = vec4(Position.xy,0,1) * ProjMtx; + } + """; + + string fragment_shader_glsl_120 = + """ + #ifdef GL_ES + precision mediump float; + #endif + uniform sampler2D Texture; + varying vec2 Frag_UV; + varying vec4 Frag_Color; + void main() + { + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); + } + """; + + string fragment_shader_glsl_130 = + """ + uniform sampler2D Texture; + in vec2 Frag_UV; + in vec4 Frag_Color; + out vec4 Out_Color; + void main() + { + Out_Color = Frag_Color * texture(Texture, Frag_UV.st); + } + """; + + string fragment_shader_glsl_300_es = + """ + precision mediump float; + uniform sampler2D Texture; + in vec2 Frag_UV; + in vec4 Frag_Color; + layout(location = 0) out vec4 Out_Color; + void main() + { + Out_Color = Frag_Color * texture(Texture, Frag_UV.st); + } + """; + + string fragment_shader_glsl_410_core = + """ + uniform sampler2D Texture; + in vec2 Frag_UV; + in vec4 Frag_Color; + layout(location = 0) out vec4 Out_Color; + void main() + { + Out_Color = Frag_Color * texture(Texture, Frag_UV.st); + } + """; + + string vertex_shader; + string fragment_shader; + if (bd->GlslVersion < 130) + { + vertex_shader = vertex_shader_glsl_120; + fragment_shader = fragment_shader_glsl_120; + } + else if (bd->GlslVersion >= 410) + { + vertex_shader = vertex_shader_glsl_410_core; + fragment_shader = fragment_shader_glsl_410_core; + } + else if (bd->GlslVersion == 300) + { + vertex_shader = vertex_shader_glsl_300_es; + fragment_shader = fragment_shader_glsl_300_es; + } + else + { + vertex_shader = vertex_shader_glsl_130; + fragment_shader = fragment_shader_glsl_130; + } + + vertex_shader = vertex_shader.Insert(0, $"#version {bd->GlslVersion}{Environment.NewLine}"); + fragment_shader = fragment_shader.Insert(0, $"#version {bd->GlslVersion}{Environment.NewLine}"); + + int vert = GL.CreateShader(ShaderType.VertexShader); + // FIXME: Version string... + GL.ShaderSource(vert, vertex_shader); + GL.CompileShader(vert); + CheckShader(vert, "vertex shader"); + + int frag = GL.CreateShader(ShaderType.FragmentShader); + // FIXME: Version string... + GL.ShaderSource(frag, fragment_shader); + GL.CompileShader(frag); + CheckShader(frag, "fragment shader"); + + bd->ShaderHandle = GL.CreateProgram(); + GL.AttachShader(bd->ShaderHandle, vert); + GL.AttachShader(bd->ShaderHandle, frag); + GL.LinkProgram(bd->ShaderHandle); + CheckProgram(bd->ShaderHandle, "shader program"); + + GL.DetachShader(bd->ShaderHandle, vert); + GL.DetachShader(bd->ShaderHandle, frag); + GL.DeleteShader(vert); + GL.DeleteShader(frag); + + bd->UniformLocationTex = GL.GetUniformLocation(bd->ShaderHandle, "Texture"); + bd->UniformLocationProjMtx = GL.GetUniformLocation(bd->ShaderHandle, "ProjMtx"); + bd->AttribLocationVtxPos = GL.GetAttribLocation(bd->ShaderHandle, "Position"); + bd->AttribLocationVtxUV = GL.GetAttribLocation(bd->ShaderHandle, "UV"); + bd->AttribLocationVtxColor = GL.GetAttribLocation(bd->ShaderHandle, "Color"); + + bd->VboHandle = GL.GenBuffer(); + bd->EboHandle = GL.GenBuffer(); + + CreateFontsTexture(); + + GL.BindTexture(TextureTarget.Texture2D, last_texture); + GL.BindBuffer(BufferTarget.ArrayBuffer, last_array_buffer); + GL.BindBuffer(BufferTarget.PixelUnpackBuffer, last_pixel_unpack_buffer); + GL.BindVertexArray(last_vertex_array); + + if (bd->KHRDebugAvailable) + { + GL.ObjectLabel(ObjectLabelIdentifier.Buffer, bd->VboHandle, -1, "OpenTK_ImGui: VBO"); + GL.ObjectLabel(ObjectLabelIdentifier.Buffer, bd->EboHandle, -1, "OpenTK_ImGui: EBO"); + GL.ObjectLabel(ObjectLabelIdentifier.Shader, bd->ShaderHandle, -1, "OpenTK_ImGui: Shader"); + } + } + + static void DestroyDeviceObjects() + { + RendererData* bd = GetBackendData(); + + if (bd->VboHandle != 0) + { + GL.DeleteBuffer(bd->VboHandle); + bd->VboHandle = 0; + } + + if (bd->EboHandle != 0) + { + GL.DeleteBuffer(bd->EboHandle); + bd->EboHandle = 0; + } + + if (bd->ShaderHandle != 0) + { + GL.DeleteProgram(bd->ShaderHandle); + bd->ShaderHandle = 0; + } + + DestroyFontsTexture(); + } + + static void InitMultiViewportSupport() + { + var platformIO = ImGui.GetPlatformIO(); + platformIO.Renderer_RenderWindow = (IntPtr)(delegate* unmanaged[Cdecl])&Renderer_RenderWindow; + } + + static void ShutdownMultiViewportSupport() + { + ImGui.DestroyPlatformWindows(); + } + + [UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)])] + static void Renderer_RenderWindow(ImGuiViewportPtr viewport) + { + if (viewport.Flags.HasFlag(ImGuiViewportFlags.NoRendererClear)) + { + GL.ClearColor(Color4.Black); + GL.Clear(ClearBufferMask.ColorBufferBit); + } + RenderDrawData(viewport.DrawData); + } + } +} diff --git a/Rendering/LICENSE.txt b/Rendering/LICENSE.txt new file mode 100644 index 0000000..13d3605 --- /dev/null +++ b/Rendering/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Julius Häger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Settings.cs b/Settings.cs new file mode 100644 index 0000000..0a2bd57 --- /dev/null +++ b/Settings.cs @@ -0,0 +1,87 @@ +using System.Numerics; +using System.Text.Json; +namespace SoberEsp; + +public enum AimMethod { Mouse, Camera } + +public enum TargetPriority { ClosestToMouse, ClosestToPlayer } + +public sealed class Settings +{ + public bool Boxes=true, Names=true, Distances=true, Status=true; + public bool AimEnabled=false, ShowFov=true, TargetMarker=true; + public float FovRadius=140, Sensitivity=1, Smoothness=8, MaxDistance=1500; + public bool AimAtHead=true, AimLock=false; + public AimMethod AimMethod=AimMethod.Mouse; + public TargetPriority TargetPriority=TargetPriority.ClosestToMouse; + static readonly JsonSerializerOptions Json=new(){IncludeFields=true,WriteIndented=true}; + public static Settings Load(string path) + { + try{var value=JsonSerializer.Deserialize(File.ReadAllText(path),Json)??new();value.Clamp();return value;} + catch{return new();} + } + public void Clamp() + { + FovRadius=Valid(FovRadius,140,20,600);Sensitivity=Valid(Sensitivity,1,.1f,20); + if(!Enum.IsDefined(AimMethod))AimMethod=AimMethod.Mouse; + if(!Enum.IsDefined(TargetPriority))TargetPriority=TargetPriority.ClosestToMouse; + Smoothness=Valid(Smoothness,8,1,30);MaxDistance=Valid(MaxDistance,1500,10,10000); + } + static float Valid(float value,float fallback,float min,float max)=>float.IsFinite(value)?Math.Clamp(value,min,max):fallback; + public void Save(string path){Clamp();File.WriteAllText(path+".tmp",JsonSerializer.Serialize(this,Json));File.Move(path+".tmp",path,true);} +} + +public static class AimMath +{ + // Frame-rate independent response; cap each motion to avoid a large jump after a stalled frame. + public static float Response(float sensitivity,float smoothness,double dt)=> + Math.Clamp((1-MathF.Exp(-(float)Math.Clamp(dt,0,.05)*60/Math.Max(1,smoothness)))*sensitivity,0,1); + public static Vector2 Motion(Vector2 error,float sensitivity,float smoothness,double dt) + { + var move=error*Response(sensitivity,smoothness,dt); + return move.Length()>40?Vector2.Normalize(move)*40:move; + } + public static Vector2 Point(Entity entity,Vector2 scale,Settings settings)=> + (settings.AimAtHead?entity.AimPoint:entity.TorsoAimPoint??new Vector2(entity.Rect.X+entity.Rect.Z/2,entity.Rect.Y+entity.Rect.W*.45f))*scale; + public static bool Eligible(Entity entity,Vector2 scale,Vector2 center,Settings settings) + { + if(!float.IsFinite(entity.Distance)||entity.Distance>settings.MaxDistance)return false; + var point=Point(entity,scale,settings); + if(point.X<0||point.Y<0||point.X>center.X*2||point.Y>center.Y*2)return false; + float distance=Vector2.DistanceSquared(point,center); + return float.IsFinite(distance)&&distance entities,Vector2 scale,Vector2 center,Settings settings) + { + Entity? best=null;float bestScore=float.PositiveInfinity; + foreach(var entity in entities) + { + if(!Eligible(entity,scale,center,settings))continue; + // The captured desktop cursor can be offset from the game reticle. Use the + // same overlay-space center as the FOV circle and aim movement. + float score=settings.TargetPriority==TargetPriority.ClosestToPlayer?(entity.PlayerDistance??float.PositiveInfinity): + Vector2.DistanceSquared(Point(entity,scale,settings),center); + if(float.IsFinite(score)&&scorelockedId=null; + public Entity? Update(IReadOnlyList entities,Vector2 scale,Vector2 center,Settings settings,bool active) + { + if(!active||!settings.AimLock)Reset(); + if(active&&settings.AimLock&&lockedId is {} id) + { + // Do not jump to somebody else when a locked target leaves FOV/range or disappears. + return entities.FirstOrDefault(e=>e.Id==id&&AimMath.Eligible(e,scale,center,settings)); + } + var target=AimMath.Select(entities,scale,center,settings); + if(active&&settings.AimLock&&target is {Id: not 0})lockedId=target.Id; + return target; + } +} diff --git a/Tracker.cs b/Tracker.cs new file mode 100644 index 0000000..785ae8f --- /dev/null +++ b/Tracker.cs @@ -0,0 +1,99 @@ +using System.Diagnostics; +using System.Numerics; +namespace SoberEsp; +public record Entity(string Name,Vector4 Rect,float Distance,Vector3 Position,Vector2 AimPoint,ulong Id=0,float? PlayerDistance=null,Vector2? TorsoAimPoint=null,bool BoxVisible=true,bool HeadAvailable=true); +public record Snapshot(string Status,int Pid=0,int Width=1,int Height=1,IReadOnlyList? Entities=null,int Tracked=0,double SampleMs=0,CameraContext? CameraContext=null); +public record Target(ulong Model,string Name,ulong Root,ulong Head,ulong Player=0); +public sealed class Tracker(MemoryBridge bridge,string home) +{ + public volatile Snapshot Latest=new("Connecting"); + Profile? profile;readonly Discovery discovery=new(bridge,home);List targets=[];long lastTargets;long lastPid;long lastDiscovery;ulong localRoot,localModel,localPlayer; + public static Vector3? Project(Vector3 world,float[] frame,float fov,int width,int height) + { + if(frame.Length<12||!float.IsFinite(fov)||fov<=.01||fov>=3.13||width<2||height<2||frame.Any(v=>!float.IsFinite(v))||!float.IsFinite(world.X+world.Y+world.Z))return null; + var d=world-new Vector3(frame[9],frame[10],frame[11]);float x=frame[0]*d.X+frame[3]*d.Y+frame[6]*d.Z,y=frame[1]*d.X+frame[4]*d.Y+frame[7]*d.Z,z=-(frame[2]*d.X+frame[5]*d.Y+frame[8]*d.Z);if(z<=.05)return null;float focal=height/(2*MathF.Tan(fov/2));return new(width/2f+x*focal/z,height/2f-y*focal/z,z); + } + void UpdateTargets(SceneMemory mem) + { + ulong workspace=profile!.Workspace;if(mem.Type(workspace)!="N3RBX9WorkspaceE")throw new IOException("Scene changed"); + ulong dataModel=mem.U64(workspace+Offsets.Instance.Parent); + ulong players=mem.ChildrenChecked(dataModel).FirstOrDefault(p=>mem.Type(p)=="N3RBX7PlayersE"); + if(players==0)throw new IOException("Players service not ready"); + ulong local=mem.U64(players+Offsets.Players.LocalPlayer); + if(local==0||mem.Type(local)!="N3RBX6PlayerE"||mem.U64(local+Offsets.Instance.Parent)!=players)throw new IOException("Local player not ready"); + ulong character=mem.U64(local+Offsets.Player.Character); + ulong ownRoot=0;try{if(character!=0)ownRoot=CharacterReader.Resolve(mem,character,"local").Root;}catch(IOException){} + var next=new List(); + foreach(ulong player in mem.ChildrenChecked(players)) + { + if(player==local||mem.Type(player)!="N3RBX6PlayerE")continue; + try + { + ulong model=mem.U64(player+Offsets.Player.Character); + if(model==0||!CharacterReader.IsInWorkspace(mem,model,workspace))continue; + var previous=targets.FirstOrDefault(t=>t.Player==player&&t.Model==model); + try{next.Add(CharacterReader.Resolve(mem,model,mem.Name(model),player));} + catch(IOException){next.Add(previous??new(model,mem.Name(model),0,0,player));} + } + catch(IOException){var previous=targets.FirstOrDefault(t=>t.Player==player);if(previous!=null)next.Add(previous);} + } + // Commit after enumeration succeeds, so a failed service/vector read does not + // replace all tracked characters with an empty list. + targets=next;localPlayer=local;localModel=character;localRoot=ownRoot;lastTargets=Stopwatch.GetTimestamp(); + foreach(var camera in mem.Children(workspace)) + if(mem.Type(camera)=="N3RBX6CameraE"&&mem.U64(camera+Offsets.Instance.Parent)==workspace) + {var v=mem.Read(camera+Offsets.Camera.Viewport,4);if(BitConverter.ToInt16(v)>1&&BitConverter.ToInt16(v,2)>1)profile=profile with{Camera=camera};} + } + public Snapshot Sample() + { + var timer=Stopwatch.StartNew();var mem=new SceneMemory(bridge);if(profile is null)throw new IOException("No scene"); + if(Stopwatch.GetElapsedTime(lastTargets).TotalMilliseconds>250) + { + if(mem.Type(profile.Workspace)!="N3RBX9WorkspaceE")throw new IOException("Scene changed"); + try{UpdateTargets(mem);}catch(IOException){/* Validate cached ownership per sample and retry enumeration next frame. */} + } + var camera=mem.Read(profile.Camera+Offsets.Camera.Frame,Offsets.Camera.SampleSize);var frame=new float[Offsets.Camera.FrameFloats];Buffer.BlockCopy(camera,0,frame,0,Offsets.Camera.FrameBytes);float fov=BitConverter.ToSingle(camera,Offsets.Camera.FovInSample);int w=BitConverter.ToInt16(camera,Offsets.Camera.WidthInSample),h=BitConverter.ToInt16(camera,Offsets.Camera.HeightInSample);if(w<=1||h<=1||w>20000||h>20000)throw new IOException("Camera not ready"); + Vector3? localPosition=null;try{if(localPlayer!=0&&mem.U64(localPlayer+Offsets.Player.Character)==localModel)localPosition=CharacterReader.Position(mem,localRoot,localModel);}catch(IOException){} + var result=new List(); + for(int i=0;i + ExplorerReader.Read(new SceneMemory(bridge),context,address,offset,token); + public void AimCamera(Snapshot state,Entity target,Settings settings,double dt) + { + if(state.CameraContext is not {} camera)throw new IOException("Camera context is unavailable"); + bridge.AimCamera(camera,target.Id,settings.AimAtHead&&target.HeadAvailable,AimMath.Response(settings.Sensitivity,settings.Smoothness,dt)); + } + public async Task Run(CancellationToken token) + { + while(!token.IsCancellationRequested) + { + var iteration=Stopwatch.StartNew();try + { + if(profile is null||Stopwatch.GetElapsedTime(lastPid).TotalSeconds>1) + { + var live=bridge.GetMaps();lastPid=Stopwatch.GetTimestamp();if(profile is null||profile.Pid!=live.Pid||(profile.Provisional&&Stopwatch.GetElapsedTime(lastDiscovery).TotalSeconds>2)){profile=discovery.Find(live,s=>Latest=new(s),token,profile is null);lastDiscovery=Stopwatch.GetTimestamp();targets=[];lastTargets=0;} + } + Latest=Sample(); + } + catch(OperationCanceledException){return;} + catch(Exception e){Latest=new("Waiting: "+e.Message);profile=null;try{await Task.Delay(200,token);}catch(OperationCanceledException){return;}} + int wait=Math.Max(0,(int)(1000/60d-iteration.Elapsed.TotalMilliseconds));if(wait>0)try{await Task.Delay(wait,token);}catch(OperationCanceledException){return;} + } + } +} diff --git a/X11.cs b/X11.cs new file mode 100644 index 0000000..6ac6172 --- /dev/null +++ b/X11.cs @@ -0,0 +1,98 @@ +using System.Runtime.InteropServices; +using System.Text; +namespace SoberEsp; +public sealed class X11 : IDisposable +{ + const string Lib="libX11.so.6"; + [DllImport(Lib)]static extern nint XOpenDisplay(nint name); + [DllImport(Lib)]static extern int XCloseDisplay(nint d); + [DllImport(Lib)]static extern nuint XDefaultRootWindow(nint d); + [DllImport(Lib)]static extern nuint XInternAtom(nint d,string name,bool onlyIfExists); + [DllImport(Lib)]static extern int XGetWindowProperty(nint d,nuint w,nuint property,nint offset,nint length,bool delete,nuint requested,out nuint type,out int format,out nuint count,out nuint remaining,out nint data); + [DllImport(Lib)]static extern int XFree(nint p); + [DllImport(Lib)]static extern int XQueryTree(nint d,nuint w,out nuint root,out nuint parent,out nint children,out uint count); + [DllImport(Lib)]static extern int XFetchName(nint d,nuint w,out nint name); + [DllImport(Lib)]static extern int XGetGeometry(nint d,nuint w,out nuint root,out int x,out int y,out uint width,out uint height,out uint border,out uint depth); + [DllImport(Lib)]static extern int XTranslateCoordinates(nint d,nuint src,nuint dest,int x,int y,out int dx,out int dy,out nuint child); + [DllImport(Lib)]static extern int XFlush(nint d); + [DllImport(Lib)]static extern int XChangeWindowAttributes(nint d,nuint w,nuint mask,ref Attributes attributes); + [StructLayout(LayoutKind.Sequential)]struct Attributes{public nuint BackgroundPixmap,BackgroundPixel,BorderPixmap,BorderPixel;public int BitGravity,WinGravity,BackingStore;public nuint BackingPlanes,BackingPixel;public int SaveUnder;public nint EventMask,DoNotPropagateMask;public int OverrideRedirect;public nuint Colormap,Cursor;} + public void Unmanaged(nuint window){var attributes=new Attributes{OverrideRedirect=1};XChangeWindowAttributes(display,window,1u<<9,ref attributes);XFlush(display);} + + [DllImport(Lib)]static extern int XGetInputFocus(nint d,out nuint focus,out int revert); + [DllImport(Lib)]static extern nint XGetWMHints(nint d,nuint w); + [DllImport(Lib)]static extern int XSetWMHints(nint d,nuint w,ref Hints hints); + [DllImport("libXfixes.so.3")]static extern nuint XFixesCreateRegion(nint d,nint rectangles,int count); + [DllImport("libXfixes.so.3")]static extern void XFixesSetWindowShapeRegion(nint d,nuint w,int kind,int x,int y,nuint region); + [DllImport("libXfixes.so.3")]static extern void XFixesDestroyRegion(nint d,nuint r); + [StructLayout(LayoutKind.Sequential)]struct Hints{public nint Flags;public int Input,InitialState;public nuint IconPixmap,IconWindow;public int IconX,IconY;public nuint IconMask,WindowGroup;} + [UnmanagedFunctionPointer(CallingConvention.Cdecl)]delegate int ErrorHandler(nint d,nint error); + [DllImport(Lib)]static extern nint XSetErrorHandler(ErrorHandler handler); + static readonly ErrorHandler IgnoreClosedWindow=(d,error)=>0; + readonly nint display;readonly nuint root; + public X11(){XSetErrorHandler(IgnoreClosedWindow);display=XOpenDisplay(0);if(display==0)throw new IOException("Xwayland display unavailable");root=XDefaultRootWindow(display);} + byte[] Property(nuint w,string property,out int format) + { + XGetWindowProperty(display,w,XInternAtom(display,property,false),0,1024,false,0,out _,out format,out var count,out _,out var data);if(data==0)return [];try{int bytes=checked((int)count*(format==32?IntPtr.Size:format/8));var result=new byte[bytes];Marshal.Copy(data,result,0,bytes);return result;}finally{XFree(data);} + } + public List Children(nuint w){if(XQueryTree(display,w,out _,out _,out var data,out var count)==0)return [];try{var children=new List();for(int i=0;is=="sober"||s=="org.vinegarhq.sober"); + if(!matches) + { + var pid=Property(w,"_NET_WM_PID",out _); + if(pid.Length>=8)try{matches=File.ReadAllLines($"/proc/{BitConverter.ToUInt64(pid)}/root/.flatpak-info").Contains("name=org.vinegarhq.Sober");}catch(IOException){}catch(UnauthorizedAccessException){} + } + if(matches)try{var g=Geometry(w);long candidate=(long)g.W*g.H;if(candidate>area){best=w;area=candidate;}}catch(IOException){} + } + return best; + } + // Read actual input focus: _NET_ACTIVE_WINDOW can still name Sober while the + // unmanaged settings window has keyboard focus. + public bool Focused(nuint window) + { + if(window==0)return false; + XGetInputFocus(display,out var focus,out _); + for(int i=0;i<8&&focus>1&&focus!=root;i++) + { + if(focus==window)return true; + if(XQueryTree(display,focus,out _,out var parent,out var children,out _)!=0) + {if(children!=0)XFree(children);focus=parent;}else break; + } + return false; + } + [DllImport(Lib)]static extern int XRaiseWindow(nint d,nuint window); + [DllImport(Lib)]static extern int XSetInputFocus(nint d,nuint window,int revert,nuint time); + public void Raise(nuint window){XRaiseWindow(display,window);XFlush(display);} + public void Focus(nuint window){XRaiseWindow(display,window);XSetInputFocus(display,window,2,0);XFlush(display);} + public (int X,int Y,int W,int H) Geometry(nuint window){if(XGetGeometry(display,window,out _,out _,out _,out var w,out var h,out _,out _)==0)throw new IOException("Game window closed");XTranslateCoordinates(display,window,root,0,0,out var x,out var y,out _);return(x,y,(int)w,(int)h);} + [DllImport(Lib)]static extern int XQueryKeymap(nint d,byte[] keys); + [DllImport(Lib)]static extern uint XKeysymToKeycode(nint d,nuint keysym); + [DllImport(Lib)]static extern int XQueryPointer(nint d,nuint w,out nuint root,out nuint child,out int rx,out int ry,out int x,out int y,out uint mask); + [DllImport("libXtst.so.6")]static extern int XTestFakeRelativeMotionEvent(nint d,int x,int y,nuint delay); + readonly byte[] keys=new byte[32]; + public bool InsertDown(){XQueryKeymap(display,keys);int key=(int)XKeysymToKeycode(display,0xff63);return key!=0&&(keys[key/8]&(1<<(key%8)))!=0;} + public (int X,int Y,bool Left,bool Right) Pointer(nuint window) + { + if(XQueryPointer(display,window,out _,out _,out _,out _,out int x,out int y,out uint mask)==0)return(0,0,false,false); + return(x,y,(mask&256)!=0,(mask&1024)!=0); + } + public void MovePointer(int x,int y){XTestFakeRelativeMotionEvent(display,x,y,0);XFlush(display);} + public void Interactive(nuint window,bool interactive) + { + if(!interactive){ClickThrough(window);return;} + XFixesSetWindowShapeRegion(display,window,2,0,0,0); + var p=XGetWMHints(display,window);var hints=p==0?new Hints():Marshal.PtrToStructure(p);if(p!=0)XFree(p); + hints.Flags|=1;hints.Input=1;XSetWMHints(display,window,ref hints);XFlush(display); + } + public void ClickThrough(nuint window){if(window==0)return;var region=XFixesCreateRegion(display,0,0);XFixesSetWindowShapeRegion(display,window,2,0,0,region);XFixesDestroyRegion(display,region);var p=XGetWMHints(display,window);var hints=p==0?new Hints():Marshal.PtrToStructure(p);if(p!=0)XFree(p);hints.Flags|=1;hints.Input=0;XSetWMHints(display,window,ref hints);XFlush(display);} + public void Dispose()=>XCloseDisplay(display); +} diff --git a/bin/Release/net10.0/ImGui.NET.dll b/bin/Release/net10.0/ImGui.NET.dll new file mode 100755 index 0000000..ef53609 Binary files /dev/null and b/bin/Release/net10.0/ImGui.NET.dll differ diff --git a/bin/Release/net10.0/OpenTK.Audio.OpenAL.dll b/bin/Release/net10.0/OpenTK.Audio.OpenAL.dll new file mode 100755 index 0000000..0718b2a Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Audio.OpenAL.dll differ diff --git a/bin/Release/net10.0/OpenTK.Compute.dll b/bin/Release/net10.0/OpenTK.Compute.dll new file mode 100755 index 0000000..c96c94b Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Compute.dll differ diff --git a/bin/Release/net10.0/OpenTK.Core.dll b/bin/Release/net10.0/OpenTK.Core.dll new file mode 100755 index 0000000..27db070 Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Core.dll differ diff --git a/bin/Release/net10.0/OpenTK.Graphics.dll b/bin/Release/net10.0/OpenTK.Graphics.dll new file mode 100755 index 0000000..88aa6d8 Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Graphics.dll differ diff --git a/bin/Release/net10.0/OpenTK.Input.dll b/bin/Release/net10.0/OpenTK.Input.dll new file mode 100755 index 0000000..8cf4cd7 Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Input.dll differ diff --git a/bin/Release/net10.0/OpenTK.Mathematics.dll b/bin/Release/net10.0/OpenTK.Mathematics.dll new file mode 100755 index 0000000..141d3ae Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Mathematics.dll differ diff --git a/bin/Release/net10.0/OpenTK.Windowing.Common.dll b/bin/Release/net10.0/OpenTK.Windowing.Common.dll new file mode 100755 index 0000000..23194bd Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Windowing.Common.dll differ diff --git a/bin/Release/net10.0/OpenTK.Windowing.Desktop.dll b/bin/Release/net10.0/OpenTK.Windowing.Desktop.dll new file mode 100755 index 0000000..762d707 Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Windowing.Desktop.dll differ diff --git a/bin/Release/net10.0/OpenTK.Windowing.GraphicsLibraryFramework.dll b/bin/Release/net10.0/OpenTK.Windowing.GraphicsLibraryFramework.dll new file mode 100755 index 0000000..114cfca Binary files /dev/null and b/bin/Release/net10.0/OpenTK.Windowing.GraphicsLibraryFramework.dll differ diff --git a/bin/Release/net10.0/SoberImGui b/bin/Release/net10.0/SoberImGui new file mode 100755 index 0000000..8b4daa4 Binary files /dev/null and b/bin/Release/net10.0/SoberImGui differ diff --git a/bin/Release/net10.0/SoberImGui.deps.json b/bin/Release/net10.0/SoberImGui.deps.json new file mode 100644 index 0000000..ff5c647 --- /dev/null +++ b/bin/Release/net10.0/SoberImGui.deps.json @@ -0,0 +1,282 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "SoberImGui/1.0.0": { + "dependencies": { + "ImGui.NET": "1.91.6.1", + "OpenTK": "4.9.4" + }, + "runtime": { + "SoberImGui.dll": {} + } + }, + "ImGui.NET/1.91.6.1": { + "runtime": { + "lib/net8.0/ImGui.NET.dll": { + "assemblyVersion": "1.91.6.1", + "fileVersion": "1.91.6.1" + } + }, + "runtimeTargets": { + "runtimes/linux-x64/native/libcimgui.so": { + "rid": "linux-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/osx/native/libcimgui.dylib": { + "rid": "osx", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-arm64/native/cimgui.dll": { + "rid": "win-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x64/native/cimgui.dll": { + "rid": "win-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x86/native/cimgui.dll": { + "rid": "win-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "OpenTK/4.9.4": { + "dependencies": { + "OpenTK.Audio.OpenAL": "4.9.4", + "OpenTK.Compute": "4.9.4", + "OpenTK.Core": "4.9.4", + "OpenTK.Graphics": "4.9.4", + "OpenTK.Input": "4.9.4", + "OpenTK.Mathematics": "4.9.4", + "OpenTK.Windowing.Common": "4.9.4", + "OpenTK.Windowing.Desktop": "4.9.4", + "OpenTK.Windowing.GraphicsLibraryFramework": "4.9.4" + } + }, + "OpenTK.Audio.OpenAL/4.9.4": { + "dependencies": { + "OpenTK.Core": "4.9.4", + "OpenTK.Mathematics": "4.9.4" + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Compute/4.9.4": { + "runtime": { + "lib/netcoreapp3.1/OpenTK.Compute.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Core/4.9.4": { + "runtime": { + "lib/netstandard2.1/OpenTK.Core.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Graphics/4.9.4": { + "dependencies": { + "OpenTK.Core": "4.9.4", + "OpenTK.Mathematics": "4.9.4" + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Graphics.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Input/4.9.4": { + "runtime": { + "lib/netstandard2.0/OpenTK.Input.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Mathematics/4.9.4": { + "runtime": { + "lib/netcoreapp3.1/OpenTK.Mathematics.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.redist.glfw/3.4.0.44": { + "runtimeTargets": { + "runtimes/linux-x64/native/libglfw.so.3": { + "rid": "linux-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/osx-arm64/native/libglfw.3.dylib": { + "rid": "osx-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/osx-x64/native/libglfw.3.dylib": { + "rid": "osx-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x64/native/glfw3.dll": { + "rid": "win-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x86/native/glfw3.dll": { + "rid": "win-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "OpenTK.Windowing.Common/4.9.4": { + "dependencies": { + "OpenTK.Core": "4.9.4", + "OpenTK.Mathematics": "4.9.4" + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.Common.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Windowing.Desktop/4.9.4": { + "dependencies": { + "OpenTK.Core": "4.9.4", + "OpenTK.Mathematics": "4.9.4", + "OpenTK.Windowing.Common": "4.9.4", + "OpenTK.Windowing.GraphicsLibraryFramework": "4.9.4" + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + }, + "OpenTK.Windowing.GraphicsLibraryFramework/4.9.4": { + "dependencies": { + "OpenTK.Core": "4.9.4", + "OpenTK.redist.glfw": "3.4.0.44" + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.dll": { + "assemblyVersion": "4.9.4.0", + "fileVersion": "4.9.4.0" + } + } + } + } + }, + "libraries": { + "SoberImGui/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "ImGui.NET/1.91.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Ph3j8pO6UM28PPJWP+5LEJSPVPkd8ivpVS8tRyY9b0IHn1HDIrMZ2o/FdiXaYW6YhNxMHmbevw6Jcfs+IDKi0Q==", + "path": "imgui.net/1.91.6.1", + "hashPath": "imgui.net.1.91.6.1.nupkg.sha512" + }, + "OpenTK/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fp9ZI6akO4ZuIGzuUE0QRU5zRJhXbSXa5racehFoTdvodhRDecXCOcH68mRsZaMwnxLO9ECnf2LGM9BmiJKvhw==", + "path": "opentk/4.9.4", + "hashPath": "opentk.4.9.4.nupkg.sha512" + }, + "OpenTK.Audio.OpenAL/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-N/SCeFrLJ3ckUbshyfsonbtjmDxh55urGiR+Fe1iPkTWyEW5OKfQRoIOZyjEva/4eRqOXdt3bV2ka4IJ2+JvZw==", + "path": "opentk.audio.openal/4.9.4", + "hashPath": "opentk.audio.openal.4.9.4.nupkg.sha512" + }, + "OpenTK.Compute/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-30G+/9mtrUJwX5xcRyz2qcujQ2s+wDm+C7qg6jDsLyGWUdND3j/vD+nlQ6tuKuAow51zWduFVujPkaS8VrBinQ==", + "path": "opentk.compute/4.9.4", + "hashPath": "opentk.compute.4.9.4.nupkg.sha512" + }, + "OpenTK.Core/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/4Mn3ABf1xNfHMzDFUapVY2K4PG3oP/oWTQJlK0JacT20HwsNe/HPIAhnAJWz27EM3ukOJDtqyQRukvQKqkcLw==", + "path": "opentk.core/4.9.4", + "hashPath": "opentk.core.4.9.4.nupkg.sha512" + }, + "OpenTK.Graphics/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yZeq5swIsRnNzifVA9fLtl+qMAQvmYiF1b7U/XQLARmmU4PYQ23lPNahqAdD22XzA21ew7eG3yDyPLkYw+hDBA==", + "path": "opentk.graphics/4.9.4", + "hashPath": "opentk.graphics.4.9.4.nupkg.sha512" + }, + "OpenTK.Input/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-njbC7fySQEK30rjOQ1uRjlycEkLw+UVoPT3nRQ8uBPNLotDgr47NEcPEjmJyX1ll+pm/wmtcvJIYHBRi1HbOqg==", + "path": "opentk.input/4.9.4", + "hashPath": "opentk.input.4.9.4.nupkg.sha512" + }, + "OpenTK.Mathematics/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2ucF25RVJzdSLXUHgjAgB058gVfSgerrR5pLCn9J+Bnyqi45NrBfPu9wyTT35ZCjYwLJCu/HJMnzKFLjq+uFIA==", + "path": "opentk.mathematics/4.9.4", + "hashPath": "opentk.mathematics.4.9.4.nupkg.sha512" + }, + "OpenTK.redist.glfw/3.4.0.44": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HEjbdk0wWxSRrXHl3DSmrA8trecndgJpAHHloJJ1vPseNfeu/ynmrH/LturU1KguRn4r3IzZ81UIp5xRjnyahg==", + "path": "opentk.redist.glfw/3.4.0.44", + "hashPath": "opentk.redist.glfw.3.4.0.44.nupkg.sha512" + }, + "OpenTK.Windowing.Common/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-xNjvKjoptAh6w5/YYIx/9sNv3/A2VVlTahlekTlLP+qfNyig+0jBuLHO4bWELWZ7Ta3Y1m/2Pvk0Z1KCG8VZOA==", + "path": "opentk.windowing.common/4.9.4", + "hashPath": "opentk.windowing.common.4.9.4.nupkg.sha512" + }, + "OpenTK.Windowing.Desktop/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LBX4jwCneISIBST2vWYLI8cdR8tLwHNcswK1decElbTAXMB+H6uFIoF41ld+af4q3TsHpjR5fyP2ilbTK3T0rA==", + "path": "opentk.windowing.desktop/4.9.4", + "hashPath": "opentk.windowing.desktop.4.9.4.nupkg.sha512" + }, + "OpenTK.Windowing.GraphicsLibraryFramework/4.9.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-wNlxnPrD7veMV8EGTTi/sCDeg5V8w/18vC0aw0Ao69eNneD7YSq9Ad+C389rVA957eHNR6Xieu/5qzHQeEOyxQ==", + "path": "opentk.windowing.graphicslibraryframework/4.9.4", + "hashPath": "opentk.windowing.graphicslibraryframework.4.9.4.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/bin/Release/net10.0/SoberImGui.dll b/bin/Release/net10.0/SoberImGui.dll new file mode 100644 index 0000000..d6b44dd Binary files /dev/null and b/bin/Release/net10.0/SoberImGui.dll differ diff --git a/bin/Release/net10.0/SoberImGui.pdb b/bin/Release/net10.0/SoberImGui.pdb new file mode 100644 index 0000000..32b6d6e Binary files /dev/null and b/bin/Release/net10.0/SoberImGui.pdb differ diff --git a/bin/Release/net10.0/SoberImGui.runtimeconfig.json b/bin/Release/net10.0/SoberImGui.runtimeconfig.json new file mode 100644 index 0000000..f730443 --- /dev/null +++ b/bin/Release/net10.0/SoberImGui.runtimeconfig.json @@ -0,0 +1,13 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/bin/Release/net10.0/runtimes/linux-x64/native/libcimgui.so b/bin/Release/net10.0/runtimes/linux-x64/native/libcimgui.so new file mode 100755 index 0000000..8832cb7 Binary files /dev/null and b/bin/Release/net10.0/runtimes/linux-x64/native/libcimgui.so differ diff --git a/bin/Release/net10.0/runtimes/linux-x64/native/libglfw.so.3 b/bin/Release/net10.0/runtimes/linux-x64/native/libglfw.so.3 new file mode 100755 index 0000000..7c26ab3 Binary files /dev/null and b/bin/Release/net10.0/runtimes/linux-x64/native/libglfw.so.3 differ diff --git a/bin/Release/net10.0/runtimes/osx-arm64/native/libglfw.3.dylib b/bin/Release/net10.0/runtimes/osx-arm64/native/libglfw.3.dylib new file mode 100755 index 0000000..fa65b76 Binary files /dev/null and b/bin/Release/net10.0/runtimes/osx-arm64/native/libglfw.3.dylib differ diff --git a/bin/Release/net10.0/runtimes/osx-x64/native/libglfw.3.dylib b/bin/Release/net10.0/runtimes/osx-x64/native/libglfw.3.dylib new file mode 100755 index 0000000..ebeabf8 Binary files /dev/null and b/bin/Release/net10.0/runtimes/osx-x64/native/libglfw.3.dylib differ diff --git a/bin/Release/net10.0/runtimes/osx/native/libcimgui.dylib b/bin/Release/net10.0/runtimes/osx/native/libcimgui.dylib new file mode 100755 index 0000000..bf82e7b Binary files /dev/null and b/bin/Release/net10.0/runtimes/osx/native/libcimgui.dylib differ diff --git a/bin/Release/net10.0/runtimes/win-arm64/native/cimgui.dll b/bin/Release/net10.0/runtimes/win-arm64/native/cimgui.dll new file mode 100755 index 0000000..bd36c84 Binary files /dev/null and b/bin/Release/net10.0/runtimes/win-arm64/native/cimgui.dll differ diff --git a/bin/Release/net10.0/runtimes/win-x64/native/cimgui.dll b/bin/Release/net10.0/runtimes/win-x64/native/cimgui.dll new file mode 100755 index 0000000..7c3c1b8 Binary files /dev/null and b/bin/Release/net10.0/runtimes/win-x64/native/cimgui.dll differ diff --git a/bin/Release/net10.0/runtimes/win-x64/native/glfw3.dll b/bin/Release/net10.0/runtimes/win-x64/native/glfw3.dll new file mode 100755 index 0000000..6107de5 Binary files /dev/null and b/bin/Release/net10.0/runtimes/win-x64/native/glfw3.dll differ diff --git a/bin/Release/net10.0/runtimes/win-x86/native/cimgui.dll b/bin/Release/net10.0/runtimes/win-x86/native/cimgui.dll new file mode 100755 index 0000000..2456eb7 Binary files /dev/null and b/bin/Release/net10.0/runtimes/win-x86/native/cimgui.dll differ diff --git a/bin/Release/net10.0/runtimes/win-x86/native/glfw3.dll b/bin/Release/net10.0/runtimes/win-x86/native/glfw3.dll new file mode 100755 index 0000000..92ade20 Binary files /dev/null and b/bin/Release/net10.0/runtimes/win-x86/native/glfw3.dll differ diff --git a/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/obj/Debug/net10.0/sober-imgui.AssemblyInfo.cs b/obj/Debug/net10.0/sober-imgui.AssemblyInfo.cs new file mode 100644 index 0000000..e8624aa --- /dev/null +++ b/obj/Debug/net10.0/sober-imgui.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+138b728f55dcf0feb77d007bd9688490be80b6fc")] +[assembly: System.Reflection.AssemblyProductAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyTitleAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/obj/Debug/net10.0/sober-imgui.AssemblyInfoInputs.cache b/obj/Debug/net10.0/sober-imgui.AssemblyInfoInputs.cache new file mode 100644 index 0000000..cb45876 --- /dev/null +++ b/obj/Debug/net10.0/sober-imgui.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0d04172f50064152d0641feaddff7fb25cc63fb867f875cee62fca330f09b67e diff --git a/obj/Debug/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..9c6e13d --- /dev/null +++ b/obj/Debug/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,18 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EntryPointFilePath = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = sober_imgui +build_property.ProjectDir = /home/i/sober-imgui/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/obj/Debug/net10.0/sober-imgui.GlobalUsings.g.cs b/obj/Debug/net10.0/sober-imgui.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/obj/Debug/net10.0/sober-imgui.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/obj/Debug/net10.0/sober-imgui.assets.cache b/obj/Debug/net10.0/sober-imgui.assets.cache new file mode 100644 index 0000000..ecc77a7 Binary files /dev/null and b/obj/Debug/net10.0/sober-imgui.assets.cache differ diff --git a/obj/Debug/net10.0/sober-imgui.csproj.AssemblyReference.cache b/obj/Debug/net10.0/sober-imgui.csproj.AssemblyReference.cache new file mode 100644 index 0000000..84e1375 Binary files /dev/null and b/obj/Debug/net10.0/sober-imgui.csproj.AssemblyReference.cache differ diff --git a/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/obj/Release/net10.0/SoberImGui.dll b/obj/Release/net10.0/SoberImGui.dll new file mode 100644 index 0000000..d6b44dd Binary files /dev/null and b/obj/Release/net10.0/SoberImGui.dll differ diff --git a/obj/Release/net10.0/SoberImGui.pdb b/obj/Release/net10.0/SoberImGui.pdb new file mode 100644 index 0000000..32b6d6e Binary files /dev/null and b/obj/Release/net10.0/SoberImGui.pdb differ diff --git a/obj/Release/net10.0/apphost b/obj/Release/net10.0/apphost new file mode 100755 index 0000000..8b4daa4 Binary files /dev/null and b/obj/Release/net10.0/apphost differ diff --git a/obj/Release/net10.0/ref/SoberImGui.dll b/obj/Release/net10.0/ref/SoberImGui.dll new file mode 100644 index 0000000..59d9ac0 Binary files /dev/null and b/obj/Release/net10.0/ref/SoberImGui.dll differ diff --git a/obj/Release/net10.0/refint/SoberImGui.dll b/obj/Release/net10.0/refint/SoberImGui.dll new file mode 100644 index 0000000..59d9ac0 Binary files /dev/null and b/obj/Release/net10.0/refint/SoberImGui.dll differ diff --git a/obj/Release/net10.0/sober-im.2498BDAA.Up2Date b/obj/Release/net10.0/sober-im.2498BDAA.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/obj/Release/net10.0/sober-imgui.AssemblyInfo.cs b/obj/Release/net10.0/sober-imgui.AssemblyInfo.cs new file mode 100644 index 0000000..a0970a1 --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyTitleAttribute("SoberImGui")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/obj/Release/net10.0/sober-imgui.AssemblyInfoInputs.cache b/obj/Release/net10.0/sober-imgui.AssemblyInfoInputs.cache new file mode 100644 index 0000000..cd9192f --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +944841e4e9ab5859814774181ad45a8f6b9f320eaf46646cf20543015a7e0202 diff --git a/obj/Release/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig b/obj/Release/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..9c6e13d --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,18 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EntryPointFilePath = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = sober_imgui +build_property.ProjectDir = /home/i/sober-imgui/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/obj/Release/net10.0/sober-imgui.GlobalUsings.g.cs b/obj/Release/net10.0/sober-imgui.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/obj/Release/net10.0/sober-imgui.assets.cache b/obj/Release/net10.0/sober-imgui.assets.cache new file mode 100644 index 0000000..9ceb2bd Binary files /dev/null and b/obj/Release/net10.0/sober-imgui.assets.cache differ diff --git a/obj/Release/net10.0/sober-imgui.csproj.AssemblyReference.cache b/obj/Release/net10.0/sober-imgui.csproj.AssemblyReference.cache new file mode 100644 index 0000000..84e1375 Binary files /dev/null and b/obj/Release/net10.0/sober-imgui.csproj.AssemblyReference.cache differ diff --git a/obj/Release/net10.0/sober-imgui.csproj.CoreCompileInputs.cache b/obj/Release/net10.0/sober-imgui.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..c0bf03f --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +361b29f50bf4d554fdb8bad2edc909979b63ea11d7aee7bdfbe2d499836f3390 diff --git a/obj/Release/net10.0/sober-imgui.csproj.FileListAbsolute.txt b/obj/Release/net10.0/sober-imgui.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..ed7bb1b --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.csproj.FileListAbsolute.txt @@ -0,0 +1,72 @@ +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.csproj.AssemblyReference.cache +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.AssemblyInfoInputs.cache +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.AssemblyInfo.cs +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.csproj.CoreCompileInputs.cache +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/SoberImGui +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/SoberImGui.deps.json +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/SoberImGui.runtimeconfig.json +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/SoberImGui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/SoberImGui.pdb +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/ImGui.NET.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Audio.OpenAL.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Compute.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Core.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Graphics.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Input.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Mathematics.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.Common.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.Desktop.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.GraphicsLibraryFramework.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/linux-x64/native/libcimgui.so +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/osx/native/libcimgui.dylib +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/win-arm64/native/cimgui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/win-x64/native/cimgui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/win-x86/native/cimgui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/linux-x64/native/libglfw.so.3 +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/osx-arm64/native/libglfw.3.dylib +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/osx-x64/native/libglfw.3.dylib +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/win-x64/native/glfw3.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/bin/Release/net10.0/runtimes/win-x86/native/glfw3.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-im.2498BDAA.Up2Date +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/SoberImGui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/refint/SoberImGui.dll +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/SoberImGui.pdb +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/sober-imgui.genruntimeconfig.cache +/home/i/Documents/Codex/2026-10-23/lowk/outputs/sober-imgui/obj/Release/net10.0/ref/SoberImGui.dll +/home/i/sober-imgui/bin/Release/net10.0/SoberImGui +/home/i/sober-imgui/bin/Release/net10.0/SoberImGui.deps.json +/home/i/sober-imgui/bin/Release/net10.0/SoberImGui.runtimeconfig.json +/home/i/sober-imgui/bin/Release/net10.0/SoberImGui.dll +/home/i/sober-imgui/bin/Release/net10.0/SoberImGui.pdb +/home/i/sober-imgui/bin/Release/net10.0/ImGui.NET.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Audio.OpenAL.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Compute.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Core.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Graphics.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Input.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Mathematics.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.Common.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.Desktop.dll +/home/i/sober-imgui/bin/Release/net10.0/OpenTK.Windowing.GraphicsLibraryFramework.dll +/home/i/sober-imgui/bin/Release/net10.0/runtimes/linux-x64/native/libcimgui.so +/home/i/sober-imgui/bin/Release/net10.0/runtimes/osx/native/libcimgui.dylib +/home/i/sober-imgui/bin/Release/net10.0/runtimes/win-arm64/native/cimgui.dll +/home/i/sober-imgui/bin/Release/net10.0/runtimes/win-x64/native/cimgui.dll +/home/i/sober-imgui/bin/Release/net10.0/runtimes/win-x86/native/cimgui.dll +/home/i/sober-imgui/bin/Release/net10.0/runtimes/linux-x64/native/libglfw.so.3 +/home/i/sober-imgui/bin/Release/net10.0/runtimes/osx-arm64/native/libglfw.3.dylib +/home/i/sober-imgui/bin/Release/net10.0/runtimes/osx-x64/native/libglfw.3.dylib +/home/i/sober-imgui/bin/Release/net10.0/runtimes/win-x64/native/glfw3.dll +/home/i/sober-imgui/bin/Release/net10.0/runtimes/win-x86/native/glfw3.dll +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.csproj.AssemblyReference.cache +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.GeneratedMSBuildEditorConfig.editorconfig +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.AssemblyInfoInputs.cache +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.AssemblyInfo.cs +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.csproj.CoreCompileInputs.cache +/home/i/sober-imgui/obj/Release/net10.0/sober-im.2498BDAA.Up2Date +/home/i/sober-imgui/obj/Release/net10.0/SoberImGui.dll +/home/i/sober-imgui/obj/Release/net10.0/refint/SoberImGui.dll +/home/i/sober-imgui/obj/Release/net10.0/SoberImGui.pdb +/home/i/sober-imgui/obj/Release/net10.0/sober-imgui.genruntimeconfig.cache +/home/i/sober-imgui/obj/Release/net10.0/ref/SoberImGui.dll diff --git a/obj/Release/net10.0/sober-imgui.genruntimeconfig.cache b/obj/Release/net10.0/sober-imgui.genruntimeconfig.cache new file mode 100644 index 0000000..addc3b0 --- /dev/null +++ b/obj/Release/net10.0/sober-imgui.genruntimeconfig.cache @@ -0,0 +1 @@ +e5c9ab94199bd9a629ee4db3b7132768a70f76b120dcca43e159019fc72b79b0 diff --git a/obj/project.assets.json b/obj/project.assets.json new file mode 100644 index 0000000..7de13a7 --- /dev/null +++ b/obj/project.assets.json @@ -0,0 +1,788 @@ +{ + "version": 4, + "targets": { + "net10.0": { + "ImGui.NET/1.91.6.1": { + "type": "package", + "compile": { + "lib/net8.0/ImGui.NET.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/ImGui.NET.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/linux-x64/native/libcimgui.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/osx/native/libcimgui.dylib": { + "assetType": "native", + "rid": "osx" + }, + "runtimes/win-arm64/native/cimgui.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/cimgui.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/cimgui.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "OpenTK/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Audio.OpenAL": "4.9.4", + "OpenTK.Compute": "4.9.4", + "OpenTK.Core": "4.9.4", + "OpenTK.Graphics": "4.9.4", + "OpenTK.Input": "4.9.4", + "OpenTK.Mathematics": "4.9.4", + "OpenTK.Windowing.Common": "4.9.4", + "OpenTK.Windowing.Desktop": "4.9.4", + "OpenTK.Windowing.GraphicsLibraryFramework": "4.9.4" + } + }, + "OpenTK.Audio.OpenAL/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Core": "[4.9.4, 4.10.0)", + "OpenTK.Mathematics": "[4.9.4, 4.10.0)" + }, + "compile": { + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Compute/4.9.4": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/OpenTK.Compute.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Compute.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Core/4.9.4": { + "type": "package", + "compile": { + "lib/netstandard2.1/OpenTK.Core.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.1/OpenTK.Core.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Graphics/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Core": "[4.9.4, 4.10.0)", + "OpenTK.Mathematics": "[4.9.4, 4.10.0)" + }, + "compile": { + "lib/netcoreapp3.1/OpenTK.Graphics.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Graphics.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Input/4.9.4": { + "type": "package", + "compile": { + "lib/netstandard2.0/OpenTK.Input.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/OpenTK.Input.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Mathematics/4.9.4": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/OpenTK.Mathematics.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Mathematics.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.redist.glfw/3.4.0.44": { + "type": "package", + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + }, + "runtimeTargets": { + "runtimes/linux-x64/native/libglfw.so.3": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/osx-arm64/native/libglfw.3.dylib": { + "assetType": "native", + "rid": "osx-arm64" + }, + "runtimes/osx-x64/native/libglfw.3.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/win-x64/native/glfw3.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/glfw3.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "OpenTK.Windowing.Common/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Core": "[4.9.4, 4.10.0)", + "OpenTK.Mathematics": "[4.9.4, 4.10.0)" + }, + "compile": { + "lib/netcoreapp3.1/OpenTK.Windowing.Common.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.Common.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Windowing.Desktop/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Core": "[4.9.4, 4.10.0)", + "OpenTK.Mathematics": "[4.9.4, 4.10.0)", + "OpenTK.Windowing.Common": "[4.9.4, 4.10.0)", + "OpenTK.Windowing.GraphicsLibraryFramework": "[4.9.4, 4.10.0)" + }, + "compile": { + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.dll": { + "related": ".pdb;.xml" + } + } + }, + "OpenTK.Windowing.GraphicsLibraryFramework/4.9.4": { + "type": "package", + "dependencies": { + "OpenTK.Core": "[4.9.4, 4.10.0)", + "OpenTK.redist.glfw": "3.4.0.44" + }, + "compile": { + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "libraries": { + "ImGui.NET/1.91.6.1": { + "sha512": "Ph3j8pO6UM28PPJWP+5LEJSPVPkd8ivpVS8tRyY9b0IHn1HDIrMZ2o/FdiXaYW6YhNxMHmbevw6Jcfs+IDKi0Q==", + "type": "package", + "path": "imgui.net/1.91.6.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/net40/ImGui.NET.targets", + "imgui.net.1.91.6.1.nupkg.sha512", + "imgui.net.nuspec", + "lib/net6.0/ImGui.NET.dll", + "lib/net6.0/ImGui.NET.xml", + "lib/net8.0/ImGui.NET.dll", + "lib/net8.0/ImGui.NET.xml", + "lib/netstandard2.0/ImGui.NET.dll", + "lib/netstandard2.0/ImGui.NET.xml", + "runtimes/linux-x64/native/libcimgui.so", + "runtimes/osx/native/libcimgui.dylib", + "runtimes/win-arm64/native/cimgui.dll", + "runtimes/win-x64/native/cimgui.dll", + "runtimes/win-x86/native/cimgui.dll" + ] + }, + "OpenTK/4.9.4": { + "sha512": "fp9ZI6akO4ZuIGzuUE0QRU5zRJhXbSXa5racehFoTdvodhRDecXCOcH68mRsZaMwnxLO9ECnf2LGM9BmiJKvhw==", + "type": "package", + "path": "opentk/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "opentk.4.9.4.nupkg.sha512", + "opentk.nuspec" + ] + }, + "OpenTK.Audio.OpenAL/4.9.4": { + "sha512": "N/SCeFrLJ3ckUbshyfsonbtjmDxh55urGiR+Fe1iPkTWyEW5OKfQRoIOZyjEva/4eRqOXdt3bV2ka4IJ2+JvZw==", + "type": "package", + "path": "opentk.audio.openal/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.dll", + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.pdb", + "lib/netcoreapp3.1/OpenTK.Audio.OpenAL.xml", + "opentk.audio.openal.4.9.4.nupkg.sha512", + "opentk.audio.openal.nuspec" + ] + }, + "OpenTK.Compute/4.9.4": { + "sha512": "30G+/9mtrUJwX5xcRyz2qcujQ2s+wDm+C7qg6jDsLyGWUdND3j/vD+nlQ6tuKuAow51zWduFVujPkaS8VrBinQ==", + "type": "package", + "path": "opentk.compute/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Compute.dll", + "lib/netcoreapp3.1/OpenTK.Compute.pdb", + "lib/netcoreapp3.1/OpenTK.Compute.xml", + "opentk.compute.4.9.4.nupkg.sha512", + "opentk.compute.nuspec" + ] + }, + "OpenTK.Core/4.9.4": { + "sha512": "/4Mn3ABf1xNfHMzDFUapVY2K4PG3oP/oWTQJlK0JacT20HwsNe/HPIAhnAJWz27EM3ukOJDtqyQRukvQKqkcLw==", + "type": "package", + "path": "opentk.core/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netstandard2.1/OpenTK.Core.dll", + "lib/netstandard2.1/OpenTK.Core.pdb", + "lib/netstandard2.1/OpenTK.Core.xml", + "opentk.core.4.9.4.nupkg.sha512", + "opentk.core.nuspec" + ] + }, + "OpenTK.Graphics/4.9.4": { + "sha512": "yZeq5swIsRnNzifVA9fLtl+qMAQvmYiF1b7U/XQLARmmU4PYQ23lPNahqAdD22XzA21ew7eG3yDyPLkYw+hDBA==", + "type": "package", + "path": "opentk.graphics/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Graphics.dll", + "lib/netcoreapp3.1/OpenTK.Graphics.pdb", + "lib/netcoreapp3.1/OpenTK.Graphics.xml", + "lib/netstandard2.1/OpenTK.Graphics.dll", + "lib/netstandard2.1/OpenTK.Graphics.pdb", + "lib/netstandard2.1/OpenTK.Graphics.xml", + "opentk.graphics.4.9.4.nupkg.sha512", + "opentk.graphics.nuspec" + ] + }, + "OpenTK.Input/4.9.4": { + "sha512": "njbC7fySQEK30rjOQ1uRjlycEkLw+UVoPT3nRQ8uBPNLotDgr47NEcPEjmJyX1ll+pm/wmtcvJIYHBRi1HbOqg==", + "type": "package", + "path": "opentk.input/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netstandard2.0/OpenTK.Input.dll", + "lib/netstandard2.0/OpenTK.Input.pdb", + "lib/netstandard2.0/OpenTK.Input.xml", + "opentk.input.4.9.4.nupkg.sha512", + "opentk.input.nuspec" + ] + }, + "OpenTK.Mathematics/4.9.4": { + "sha512": "2ucF25RVJzdSLXUHgjAgB058gVfSgerrR5pLCn9J+Bnyqi45NrBfPu9wyTT35ZCjYwLJCu/HJMnzKFLjq+uFIA==", + "type": "package", + "path": "opentk.mathematics/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Mathematics.dll", + "lib/netcoreapp3.1/OpenTK.Mathematics.pdb", + "lib/netcoreapp3.1/OpenTK.Mathematics.xml", + "lib/netstandard2.1/OpenTK.Mathematics.dll", + "lib/netstandard2.1/OpenTK.Mathematics.pdb", + "lib/netstandard2.1/OpenTK.Mathematics.xml", + "opentk.mathematics.4.9.4.nupkg.sha512", + "opentk.mathematics.nuspec" + ] + }, + "OpenTK.redist.glfw/3.4.0.44": { + "sha512": "HEjbdk0wWxSRrXHl3DSmrA8trecndgJpAHHloJJ1vPseNfeu/ynmrH/LturU1KguRn4r3IzZ81UIp5xRjnyahg==", + "type": "package", + "path": "opentk.redist.glfw/3.4.0.44", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "COPYING.md", + "lib/netstandard2.0/_._", + "opentk.png", + "opentk.redist.glfw.3.4.0.44.nupkg.sha512", + "opentk.redist.glfw.nuspec", + "runtimes/linux-x64/native/libglfw.so.3", + "runtimes/osx-arm64/native/libglfw.3.dylib", + "runtimes/osx-x64/native/libglfw.3.dylib", + "runtimes/win-x64/native/glfw3.dll", + "runtimes/win-x86/native/glfw3.dll" + ] + }, + "OpenTK.Windowing.Common/4.9.4": { + "sha512": "xNjvKjoptAh6w5/YYIx/9sNv3/A2VVlTahlekTlLP+qfNyig+0jBuLHO4bWELWZ7Ta3Y1m/2Pvk0Z1KCG8VZOA==", + "type": "package", + "path": "opentk.windowing.common/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Windowing.Common.dll", + "lib/netcoreapp3.1/OpenTK.Windowing.Common.pdb", + "lib/netcoreapp3.1/OpenTK.Windowing.Common.xml", + "lib/netstandard2.1/OpenTK.Windowing.Common.dll", + "lib/netstandard2.1/OpenTK.Windowing.Common.pdb", + "lib/netstandard2.1/OpenTK.Windowing.Common.xml", + "opentk.windowing.common.4.9.4.nupkg.sha512", + "opentk.windowing.common.nuspec" + ] + }, + "OpenTK.Windowing.Desktop/4.9.4": { + "sha512": "LBX4jwCneISIBST2vWYLI8cdR8tLwHNcswK1decElbTAXMB+H6uFIoF41ld+af4q3TsHpjR5fyP2ilbTK3T0rA==", + "type": "package", + "path": "opentk.windowing.desktop/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.dll", + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.pdb", + "lib/netcoreapp3.1/OpenTK.Windowing.Desktop.xml", + "opentk.windowing.desktop.4.9.4.nupkg.sha512", + "opentk.windowing.desktop.nuspec" + ] + }, + "OpenTK.Windowing.GraphicsLibraryFramework/4.9.4": { + "sha512": "wNlxnPrD7veMV8EGTTi/sCDeg5V8w/18vC0aw0Ao69eNneD7YSq9Ad+C389rVA957eHNR6Xieu/5qzHQeEOyxQ==", + "type": "package", + "path": "opentk.windowing.graphicslibraryframework/4.9.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "docs/README.md", + "images/opentk-blue-hexagon.png", + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.dll", + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.pdb", + "lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.xml", + "opentk.windowing.graphicslibraryframework.4.9.4.nupkg.sha512", + "opentk.windowing.graphicslibraryframework.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net10.0": [ + "ImGui.NET >= 1.91.6.1", + "OpenTK >= 4.9.4" + ] + }, + "packageFolders": { + "/home/i/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/i/sober-imgui/sober-imgui.csproj", + "projectName": "SoberImGui", + "projectPath": "/home/i/sober-imgui/sober-imgui.csproj", + "packagesPath": "/home/i/.nuget/packages/", + "outputPath": "/home/i/sober-imgui/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/i/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.400" + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "dependencies": { + "ImGui.NET": { + "target": "Package", + "version": "[1.91.6.1, )" + }, + "OpenTK": { + "target": "Package", + "version": "[4.9.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.402/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache new file mode 100644 index 0000000..4d41653 --- /dev/null +++ b/obj/project.nuget.cache @@ -0,0 +1,21 @@ +{ + "version": 2, + "dgSpecHash": "l/2Zxz5np+k=", + "success": true, + "projectFilePath": "/home/i/sober-imgui/sober-imgui.csproj", + "expectedPackageFiles": [ + "/home/i/.nuget/packages/imgui.net/1.91.6.1/imgui.net.1.91.6.1.nupkg.sha512", + "/home/i/.nuget/packages/opentk/4.9.4/opentk.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.audio.openal/4.9.4/opentk.audio.openal.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.compute/4.9.4/opentk.compute.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.core/4.9.4/opentk.core.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.graphics/4.9.4/opentk.graphics.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.input/4.9.4/opentk.input.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.mathematics/4.9.4/opentk.mathematics.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.redist.glfw/3.4.0.44/opentk.redist.glfw.3.4.0.44.nupkg.sha512", + "/home/i/.nuget/packages/opentk.windowing.common/4.9.4/opentk.windowing.common.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.windowing.desktop/4.9.4/opentk.windowing.desktop.4.9.4.nupkg.sha512", + "/home/i/.nuget/packages/opentk.windowing.graphicslibraryframework/4.9.4/opentk.windowing.graphicslibraryframework.4.9.4.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/obj/project.packagespec.json b/obj/project.packagespec.json new file mode 100644 index 0000000..bb46aee --- /dev/null +++ b/obj/project.packagespec.json @@ -0,0 +1 @@ +"restore":{"projectUniqueName":"/home/i/sober-imgui/sober-imgui.csproj","projectName":"SoberImGui","projectPath":"/home/i/sober-imgui/sober-imgui.csproj","packagesPath":"","outputPath":"/home/i/sober-imgui/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net10.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net10.0":{"framework":"net10.0","targetAlias":"net10.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"all"},"SdkAnalysisLevel":"10.0.400"}"frameworks":{"net10.0":{"framework":"net10.0","targetAlias":"net10.0","dependencies":{"ImGui.NET":{"target":"Package","version":"[1.91.6.1, )"},"OpenTK":{"target":"Package","version":"[4.9.4, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/share/dotnet/sdk/10.0.402/PortableRuntimeIdentifierGraph.json","packagesToPrune":{"Microsoft.CSharp":"(,4.7.32767]","Microsoft.VisualBasic":"(,10.4.32767]","Microsoft.Win32.Primitives":"(,4.3.32767]","Microsoft.Win32.Registry":"(,5.0.32767]","runtime.any.System.Collections":"(,4.3.32767]","runtime.any.System.Diagnostics.Tools":"(,4.3.32767]","runtime.any.System.Diagnostics.Tracing":"(,4.3.32767]","runtime.any.System.Globalization":"(,4.3.32767]","runtime.any.System.Globalization.Calendars":"(,4.3.32767]","runtime.any.System.IO":"(,4.3.32767]","runtime.any.System.Reflection":"(,4.3.32767]","runtime.any.System.Reflection.Extensions":"(,4.3.32767]","runtime.any.System.Reflection.Primitives":"(,4.3.32767]","runtime.any.System.Resources.ResourceManager":"(,4.3.32767]","runtime.any.System.Runtime":"(,4.3.32767]","runtime.any.System.Runtime.Handles":"(,4.3.32767]","runtime.any.System.Runtime.InteropServices":"(,4.3.32767]","runtime.any.System.Text.Encoding":"(,4.3.32767]","runtime.any.System.Text.Encoding.Extensions":"(,4.3.32767]","runtime.any.System.Threading.Tasks":"(,4.3.32767]","runtime.any.System.Threading.Timer":"(,4.3.32767]","runtime.aot.System.Collections":"(,4.3.32767]","runtime.aot.System.Diagnostics.Tools":"(,4.3.32767]","runtime.aot.System.Diagnostics.Tracing":"(,4.3.32767]","runtime.aot.System.Globalization":"(,4.3.32767]","runtime.aot.System.Globalization.Calendars":"(,4.3.32767]","runtime.aot.System.IO":"(,4.3.32767]","runtime.aot.System.Reflection":"(,4.3.32767]","runtime.aot.System.Reflection.Extensions":"(,4.3.32767]","runtime.aot.System.Reflection.Primitives":"(,4.3.32767]","runtime.aot.System.Resources.ResourceManager":"(,4.3.32767]","runtime.aot.System.Runtime":"(,4.3.32767]","runtime.aot.System.Runtime.Handles":"(,4.3.32767]","runtime.aot.System.Runtime.InteropServices":"(,4.3.32767]","runtime.aot.System.Text.Encoding":"(,4.3.32767]","runtime.aot.System.Text.Encoding.Extensions":"(,4.3.32767]","runtime.aot.System.Threading.Tasks":"(,4.3.32767]","runtime.aot.System.Threading.Timer":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.debian.9-x64.runtime.native.System":"(,4.3.32767]","runtime.debian.9-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.debian.9-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.debian.9-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.fedora.27-x64.runtime.native.System":"(,4.3.32767]","runtime.fedora.27-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.fedora.27-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.fedora.27-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.fedora.28-x64.runtime.native.System":"(,4.3.32767]","runtime.fedora.28-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.fedora.28-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.fedora.28-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.opensuse.42.3-x64.runtime.native.System":"(,4.3.32767]","runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.opensuse.42.3-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.opensuse.42.3-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple":"(,4.3.32767]","runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography":"(,4.3.32767]","runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl":"(,4.3.32767]","runtime.ubuntu.18.04-x64.runtime.native.System":"(,4.3.32767]","runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http":"(,4.3.32767]","runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security":"(,4.3.32767]","runtime.unix.Microsoft.Win32.Primitives":"(,4.3.32767]","runtime.unix.System.Console":"(,4.3.32767]","runtime.unix.System.Diagnostics.Debug":"(,4.3.32767]","runtime.unix.System.IO.FileSystem":"(,4.3.32767]","runtime.unix.System.Net.Primitives":"(,4.3.32767]","runtime.unix.System.Net.Sockets":"(,4.3.32767]","runtime.unix.System.Private.Uri":"(,4.3.32767]","runtime.unix.System.Runtime.Extensions":"(,4.3.32767]","runtime.win.Microsoft.Win32.Primitives":"(,4.3.32767]","runtime.win.System.Console":"(,4.3.32767]","runtime.win.System.Diagnostics.Debug":"(,4.3.32767]","runtime.win.System.IO.FileSystem":"(,4.3.32767]","runtime.win.System.Net.Primitives":"(,4.3.32767]","runtime.win.System.Net.Sockets":"(,4.3.32767]","runtime.win.System.Runtime.Extensions":"(,4.3.32767]","runtime.win10-arm-aot.runtime.native.System.IO.Compression":"(,4.0.32767]","runtime.win10-arm64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.win10-x64-aot.runtime.native.System.IO.Compression":"(,4.0.32767]","runtime.win10-x86-aot.runtime.native.System.IO.Compression":"(,4.0.32767]","runtime.win7-x64.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.win7-x86.runtime.native.System.IO.Compression":"(,4.3.32767]","runtime.win7.System.Private.Uri":"(,4.3.32767]","runtime.win8-arm.runtime.native.System.IO.Compression":"(,4.3.32767]","System.AppContext":"(,4.3.32767]","System.Buffers":"(,5.0.32767]","System.Collections":"(,4.3.32767]","System.Collections.Concurrent":"(,4.3.32767]","System.Collections.Immutable":"(,10.0.32767]","System.Collections.NonGeneric":"(,4.3.32767]","System.Collections.Specialized":"(,4.3.32767]","System.ComponentModel":"(,4.3.32767]","System.ComponentModel.Annotations":"(,4.3.32767]","System.ComponentModel.EventBasedAsync":"(,4.3.32767]","System.ComponentModel.Primitives":"(,4.3.32767]","System.ComponentModel.TypeConverter":"(,4.3.32767]","System.Console":"(,4.3.32767]","System.Data.Common":"(,4.3.32767]","System.Data.DataSetExtensions":"(,4.4.32767]","System.Diagnostics.Contracts":"(,4.3.32767]","System.Diagnostics.Debug":"(,4.3.32767]","System.Diagnostics.DiagnosticSource":"(,10.0.32767]","System.Diagnostics.FileVersionInfo":"(,4.3.32767]","System.Diagnostics.Process":"(,4.3.32767]","System.Diagnostics.StackTrace":"(,4.3.32767]","System.Diagnostics.TextWriterTraceListener":"(,4.3.32767]","System.Diagnostics.Tools":"(,4.3.32767]","System.Diagnostics.TraceSource":"(,4.3.32767]","System.Diagnostics.Tracing":"(,4.3.32767]","System.Drawing.Primitives":"(,4.3.32767]","System.Dynamic.Runtime":"(,4.3.32767]","System.Formats.Asn1":"(,10.0.32767]","System.Formats.Tar":"(,10.0.32767]","System.Globalization":"(,4.3.32767]","System.Globalization.Calendars":"(,4.3.32767]","System.Globalization.Extensions":"(,4.3.32767]","System.IO":"(,4.3.32767]","System.IO.Compression":"(,4.3.32767]","System.IO.Compression.ZipFile":"(,4.3.32767]","System.IO.FileSystem":"(,4.3.32767]","System.IO.FileSystem.AccessControl":"(,4.4.32767]","System.IO.FileSystem.DriveInfo":"(,4.3.32767]","System.IO.FileSystem.Primitives":"(,4.3.32767]","System.IO.FileSystem.Watcher":"(,4.3.32767]","System.IO.IsolatedStorage":"(,4.3.32767]","System.IO.MemoryMappedFiles":"(,4.3.32767]","System.IO.Pipelines":"(,10.0.32767]","System.IO.Pipes":"(,4.3.32767]","System.IO.Pipes.AccessControl":"(,5.0.32767]","System.IO.UnmanagedMemoryStream":"(,4.3.32767]","System.Linq":"(,4.3.32767]","System.Linq.AsyncEnumerable":"(,10.0.32767]","System.Linq.Expressions":"(,4.3.32767]","System.Linq.Parallel":"(,4.3.32767]","System.Linq.Queryable":"(,4.3.32767]","System.Memory":"(,5.0.32767]","System.Net.Http":"(,4.3.32767]","System.Net.Http.Json":"(,10.0.32767]","System.Net.NameResolution":"(,4.3.32767]","System.Net.NetworkInformation":"(,4.3.32767]","System.Net.Ping":"(,4.3.32767]","System.Net.Primitives":"(,4.3.32767]","System.Net.Requests":"(,4.3.32767]","System.Net.Security":"(,4.3.32767]","System.Net.ServerSentEvents":"(,10.0.32767]","System.Net.Sockets":"(,4.3.32767]","System.Net.WebHeaderCollection":"(,4.3.32767]","System.Net.WebSockets":"(,4.3.32767]","System.Net.WebSockets.Client":"(,4.3.32767]","System.Numerics.Vectors":"(,5.0.32767]","System.ObjectModel":"(,4.3.32767]","System.Private.DataContractSerialization":"(,4.3.32767]","System.Private.Uri":"(,4.3.32767]","System.Reflection":"(,4.3.32767]","System.Reflection.DispatchProxy":"(,6.0.32767]","System.Reflection.Emit":"(,4.7.32767]","System.Reflection.Emit.ILGeneration":"(,4.7.32767]","System.Reflection.Emit.Lightweight":"(,4.7.32767]","System.Reflection.Extensions":"(,4.3.32767]","System.Reflection.Metadata":"(,10.0.32767]","System.Reflection.Primitives":"(,4.3.32767]","System.Reflection.TypeExtensions":"(,4.3.32767]","System.Resources.Reader":"(,4.3.32767]","System.Resources.ResourceManager":"(,4.3.32767]","System.Resources.Writer":"(,4.3.32767]","System.Runtime":"(,4.3.32767]","System.Runtime.CompilerServices.Unsafe":"(,7.0.32767]","System.Runtime.CompilerServices.VisualC":"(,4.3.32767]","System.Runtime.Extensions":"(,4.3.32767]","System.Runtime.Handles":"(,4.3.32767]","System.Runtime.InteropServices":"(,4.3.32767]","System.Runtime.InteropServices.RuntimeInformation":"(,4.3.32767]","System.Runtime.Loader":"(,4.3.32767]","System.Runtime.Numerics":"(,4.3.32767]","System.Runtime.Serialization.Formatters":"(,4.3.32767]","System.Runtime.Serialization.Json":"(,4.3.32767]","System.Runtime.Serialization.Primitives":"(,4.3.32767]","System.Runtime.Serialization.Xml":"(,4.3.32767]","System.Security.AccessControl":"(,6.0.32767]","System.Security.Claims":"(,4.3.32767]","System.Security.Cryptography.Algorithms":"(,4.3.32767]","System.Security.Cryptography.Cng":"(,5.0.32767]","System.Security.Cryptography.Csp":"(,4.3.32767]","System.Security.Cryptography.Encoding":"(,4.3.32767]","System.Security.Cryptography.OpenSsl":"(,5.0.32767]","System.Security.Cryptography.Primitives":"(,4.3.32767]","System.Security.Cryptography.X509Certificates":"(,4.3.32767]","System.Security.Principal":"(,4.3.32767]","System.Security.Principal.Windows":"(,5.0.32767]","System.Security.SecureString":"(,4.3.32767]","System.Text.Encoding":"(,4.3.32767]","System.Text.Encoding.CodePages":"(,10.0.32767]","System.Text.Encoding.Extensions":"(,4.3.32767]","System.Text.Encodings.Web":"(,10.0.32767]","System.Text.Json":"(,10.0.32767]","System.Text.RegularExpressions":"(,4.3.32767]","System.Threading":"(,4.3.32767]","System.Threading.AccessControl":"(,10.0.32767]","System.Threading.Channels":"(,10.0.32767]","System.Threading.Overlapped":"(,4.3.32767]","System.Threading.Tasks":"(,4.3.32767]","System.Threading.Tasks.Dataflow":"(,10.0.32767]","System.Threading.Tasks.Extensions":"(,5.0.32767]","System.Threading.Tasks.Parallel":"(,4.3.32767]","System.Threading.Thread":"(,4.3.32767]","System.Threading.ThreadPool":"(,4.3.32767]","System.Threading.Timer":"(,4.3.32767]","System.ValueTuple":"(,4.5.32767]","System.Xml.ReaderWriter":"(,4.3.32767]","System.Xml.XDocument":"(,4.3.32767]","System.Xml.XmlDocument":"(,4.3.32767]","System.Xml.XmlSerializer":"(,4.3.32767]","System.Xml.XPath":"(,4.3.32767]","System.Xml.XPath.XDocument":"(,5.0.32767]"}}} \ No newline at end of file diff --git a/obj/rider.project.model.nuget.info b/obj/rider.project.model.nuget.info new file mode 100644 index 0000000..11f3091 --- /dev/null +++ b/obj/rider.project.model.nuget.info @@ -0,0 +1 @@ +17927776174388978 \ No newline at end of file diff --git a/obj/rider.project.restore.info b/obj/rider.project.restore.info new file mode 100644 index 0000000..2b212e2 --- /dev/null +++ b/obj/rider.project.restore.info @@ -0,0 +1 @@ +17927783043451162 \ No newline at end of file diff --git a/obj/sober-imgui.csproj.nuget.dgspec.json b/obj/sober-imgui.csproj.nuget.dgspec.json new file mode 100644 index 0000000..128b9a3 --- /dev/null +++ b/obj/sober-imgui.csproj.nuget.dgspec.json @@ -0,0 +1,353 @@ +{ + "format": 1, + "restore": { + "/home/i/sober-imgui/sober-imgui.csproj": {} + }, + "projects": { + "/home/i/sober-imgui/sober-imgui.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/i/sober-imgui/sober-imgui.csproj", + "projectName": "SoberImGui", + "projectPath": "/home/i/sober-imgui/sober-imgui.csproj", + "packagesPath": "/home/i/.nuget/packages/", + "outputPath": "/home/i/sober-imgui/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/i/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.400" + }, + "frameworks": { + "net10.0": { + "framework": "net10.0", + "targetAlias": "net10.0", + "dependencies": { + "ImGui.NET": { + "target": "Package", + "version": "[1.91.6.1, )" + }, + "OpenTK": { + "target": "Package", + "version": "[4.9.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.402/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/obj/sober-imgui.csproj.nuget.g.props b/obj/sober-imgui.csproj.nuget.g.props new file mode 100644 index 0000000..1fcc4c1 --- /dev/null +++ b/obj/sober-imgui.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/i/.nuget/packages/ + /home/i/.nuget/packages/ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/obj/sober-imgui.csproj.nuget.g.targets b/obj/sober-imgui.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/obj/sober-imgui.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/overlay.lock b/overlay.lock new file mode 100644 index 0000000..e69de29 diff --git a/profile.json b/profile.json new file mode 100644 index 0000000..d6f81e1 --- /dev/null +++ b/profile.json @@ -0,0 +1 @@ +{"Pid":38976,"Base":139891027787776,"Workspace":139699567201920,"Camera":139890956369024,"Provisional":false,"HeapSize":1073741824,"HeapOffset":387255936} \ No newline at end of file diff --git a/run-bridge.sh b/run-bridge.sh new file mode 100755 index 0000000..555e136 --- /dev/null +++ b/run-bridge.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu +dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +exec "$dir/run.sh" --bridge "$@" diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..29d6821 --- /dev/null +++ b/run.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu +dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +exec /usr/bin/dotnet "$dir/bin/Release/net10.0/SoberImGui.dll" --home "$dir" "$@" diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..77f7571 --- /dev/null +++ b/settings.json @@ -0,0 +1,17 @@ +{ + "Boxes": true, + "Names": true, + "Distances": true, + "Status": true, + "AimEnabled": true, + "ShowFov": true, + "TargetMarker": true, + "FovRadius": 283, + "Sensitivity": 20, + "Smoothness": 4.5, + "MaxDistance": 1500, + "AimAtHead": true, + "AimLock": true, + "AimMethod": 0, + "TargetPriority": 0 +} \ No newline at end of file diff --git a/sober-imgui.csproj b/sober-imgui.csproj new file mode 100644 index 0000000..cf0685d --- /dev/null +++ b/sober-imgui.csproj @@ -0,0 +1,18 @@ + + + + Exe + net10.0 + sober_imgui + enable + enable + true + SoberImGui + + + + + + + + diff --git a/start-sober.sh b/start-sober.sh new file mode 100755 index 0000000..4c02c20 --- /dev/null +++ b/start-sober.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +set -euo pipefail +# Starts this project's bridge, X11 Sober launch, and overlay as one managed session. +dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +if (( EUID == 0 )); then + echo 'Run this launcher as your normal user; it requests sudo only for the bridge.' >&2 + exit 1 +fi +if [[ ! -f "$dir/bin/Release/net10.0/SoberImGui.dll" ]]; then + dotnet build "$dir/sober-imgui.csproj" -c Release +fi +sudo -v +session=$(mktemp -d "$dir/.session.XXXXXX") +sober_pid= bridge_pid= overlay_pid= +cleanup() { + trap - EXIT INT TERM HUP + [[ -z "$overlay_pid" ]] || kill -TERM "$overlay_pid" 2>/dev/null || true + [[ -z "$sober_pid" ]] || kill -TERM "$sober_pid" 2>/dev/null || true + [[ -z "$overlay_pid" ]] || wait "$overlay_pid" 2>/dev/null || true + [[ -z "$sober_pid" ]] || wait "$sober_pid" 2>/dev/null || true + # The bridge observes Sober's process exit, cancels Accept, and removes its socket. + [[ -z "$bridge_pid" ]] || wait "$bridge_pid" 2>/dev/null || true + rm -f "$session/memory.sock" + rmdir "$session" 2>/dev/null || true +} +trap cleanup EXIT +trap 'exit 130' INT +trap 'exit 143' TERM HUP +# An already running instance could hand this launch off and exit immediately. +if flatpak ps --columns=application | grep -Fxq org.vinegarhq.Sober; then + echo 'Close the existing Sober instance before starting this session.' >&2 + exit 1 +fi +flatpak run --nosocket=wayland --socket=x11 --env=GDK_BACKEND=x11 org.vinegarhq.Sober "$@" & +sober_pid=$! +sudo -n "$dir/run-bridge.sh" --allow-camera-writes --socket "$session/memory.sock" --watch-pid "$sober_pid" & +bridge_pid=$! +ready=false +for ((attempt=0; attempt<100; attempt++)); do + if [[ -S "$session/memory.sock" ]]; then ready=true; break; fi + if ! kill -0 "$bridge_pid" 2>/dev/null || ! kill -0 "$sober_pid" 2>/dev/null; then break; fi + sleep .1 +done +if [[ "$ready" != true ]]; then echo 'Sober or the memory bridge failed to start.' >&2; exit 1; fi +"$dir/run.sh" --socket "$session/memory.sock" & +overlay_pid=$! +# Any component ending tears down this session, including Sober closing normally. +set +e +wait -n "$sober_pid" "$bridge_pid" "$overlay_pid" +result=$? +exit "$result" diff --git a/stop.sh b/stop.sh new file mode 100755 index 0000000..8610ebf --- /dev/null +++ b/stop.sh @@ -0,0 +1,10 @@ +#!/bin/sh +set -eu +dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +if [ ! -f "$dir/overlay.pid" ]; then echo "Overlay is not running."; exit 0; fi +pid=$(cat "$dir/overlay.pid") +case "$pid" in ''|*[!0-9]*) echo "Invalid overlay PID."; exit 1;; esac +if [ -r "/proc/$pid/cmdline" ] && tr '\000' '\n' < "/proc/$pid/cmdline" | /usr/bin/grep -Fxq "$dir/bin/Release/net10.0/SoberImGui.dll"; then + kill -TERM "$pid" + echo "Overlay stopped." +else echo "Overlay is not running."; fi