Attributes Officially Finished!

This commit is contained in:
2026-02-28 21:11:47 -05:00
parent 8c3803fcdf
commit 41dbab5ce3
31 changed files with 553 additions and 503 deletions

View File

@@ -10,7 +10,4 @@
<ItemGroup>
<PackageReference Include="OpenTK" Version="5.0.0-pre.15" />
</ItemGroup>
<ItemGroup>
<Folder Include="Kernel\ComponentDocker\Attributes\" />
</ItemGroup>
</Project>

View File

@@ -1,368 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace AwperativeKernel;
/// <summary>
/// Requires that the Docker owns the parameter
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerOwns : Attribute
{
/// <summary>
/// Verifies if the Component is actually owned by Docker. Throws an error if not.
/// </summary>
/// <param name="__docker">Docker we are checking ownership for</param>
/// <param name="__component">Component to check for</param>
public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) {
if (__docker.Contains(__component)) return true;
Debug.LogError("Docker does not own the Component!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the Docker does not own the parameter
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerDoesntOwn : Attribute
{
/// <summary>
/// Verifies if the Component is actually not owned by Docker. Throws an error if not.
/// </summary>
/// <param name="__docker">Docker we are checking ownership for</param>
/// <param name="__component">Component to check for</param>
public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) {
if (!__docker.Contains(__component)) return true;
Debug.LogError("Docker owns the Component!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the component is not attached to any Docker
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class OrphanComponent : Attribute
{
/// <summary>
/// Verifies if the Component is an orphan, not fully accurate, because it only checks if the docker is null, this means it is technically possible
/// to have a component already attached to a docker, and still verify it as false if Docker is null, but this should be impossible in practice.
/// </summary>
/// <param name="__component"></param>
/// <returns></returns>
public static bool VerifyOrThrow(Component __component) {
if (__component.ComponentDocker == null) return true;
Debug.LogError("Component is already owned!", ["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__component.ComponentDocker.GetType().Name,
__component.ComponentDocker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__component.ComponentDocker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the Component is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class ComponentNotNull : Attribute
{
/// <summary>
/// Verifies if the Component is not null! Throws an error otherwise.
/// </summary>
/// <param name="__component"></param>
/// <returns></returns>
public static bool VerifyOrThrow(Component __component) {
if (__component != null) return true;
Debug.LogError("Component is null!");
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the Docker is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerNotNull : Attribute
{
/// <summary>
/// Verifies if the Docker is not null! Throws an error otherwise.
/// </summary>
/// <param name="__componentDocker"></param>
/// <returns></returns>
public static bool VerifyOrThrow(ComponentDocker __componentDocker) {
if (__componentDocker != null) return true;
Debug.LogError("Docker is null!");
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the Scene is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class SceneNotNull : Attribute
{
/// <summary>
/// Verifies if the Scene is not null! Throws an error otherwise.
/// </summary>
/// <returns></returns>
public static bool VerifyOrThrow(Scene __scene) {
if (__scene != null) return true;
Debug.LogError("Scene is null!");
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that everything in the collection is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionNotNull : Attribute
{
/// <summary>
/// Verifies if the Scene is not null! Throws an error otherwise.
/// </summary>
/// <returns></returns>
public static bool VerifyOrThrow(Collection<object> __collection) {
for (var i = 0; i < __collection.Count; i++)
if (__collection[i] == null)
Debug.LogError("A Given Collection has null members!", ["Type"], [__collection.GetType().Name]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that everything in the collection is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class EnumeratorNotNull : Attribute
{
/// <summary>
/// Verifies if the Scene is not null! Throws an error otherwise.
/// </summary>
/// <returns></returns>
public static bool VerifyOrThrow(IEnumerable<object> __enumerator) {
foreach (object obj in __enumerator)
if (obj == null)
Debug.LogError("A Given Enumerator has null members!", ["Type"], [__enumerator.GetType().Name]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the object is not null
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class NotNull : Attribute
{
/// <summary>
/// Verifies if the Scene is not null! Throws an error otherwise.
/// </summary>
/// <returns></returns>
public static bool VerifyOrThrow(Object __object) {
if (__object != null) return true;
Debug.LogError("A Given parameter is null!", ["Type"],
[__object.GetType().Name
]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the Docker is a different docker than the one given
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class DifferentDocker : Attribute
{
/// <summary>
/// Verifies if the Dockers are different!
/// </summary>
/// <returns></returns>
public static bool VerifyOrThrow(ComponentDocker __docker, ComponentDocker __other) {
if (__docker != __other) return true;
Debug.LogError("The Dockers are the same!", ["DockerType, DockerName, DockerHash"], [
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the index fits a given collection
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class ValueFitsRange : Attribute
{
/// <summary>
/// Verifies if the value fits a range
/// </summary>
/// <param name="__componentDocker"></param>
/// <returns></returns>
public static bool VerifyOrThrow(int __index, int __min, int __max) {
if (__index >= __min && __index <= __max) return true;
Debug.LogError("Value does not fit range!", ["Index"], [__index.ToString("N0")]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the index fits a given collection
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionContains : Attribute
{
/// <summary>
/// Verifies if the value fits a range
/// </summary>
/// <param name="__componentDocker"></param>
/// <returns></returns>
public static bool VerifyOrThrow<__Type>(__Type __object, ICollection<__Type> __collection) {
if(__collection.Contains(__object)) return true;
Debug.LogError("Collection does not contain object!", ["ObjectType"],
[__object.GetType().Name]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Requires that the index fits a given collection
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionDoesntContain : Attribute
{
/// <summary>
/// Verifies if the value fits a range
/// </summary>
/// <param name="__componentDocker"></param>
/// <returns></returns>
public static bool VerifyOrThrow<__Type>(__Type __object, ICollection<__Type> __collection) {
if(!__collection.Contains(__object)) return true;
Debug.LogError("Collection already contains object!", ["ObjectType"],
[__object.GetType().Name]);
return Debug.IgnoreErrors;
}
}
/// <summary>
/// Shows that the given object is unsafe (ex. it doesn't check for null values and such, or it doesn't have guardrails based on cases).
/// This is just for internal/private methods to remind myself how to call it :) The reasoning is case by case, but most of the time,
/// it is because all of the exposing public methods already check, and double checks would only slow me down
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class UnsafeInternal : Attribute { }
/// <summary>
/// Shows that the given object (meant for external use) is calculated every time it is called! Good to know for performance heavy systems.
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CalculatedProperty() : Attribute { }
/// <summary>
/// Just a way to write how expensive a calculated property can be.
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CalculatedPropertyExpense(string Expense) : Attribute { }

View File

@@ -0,0 +1,295 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace AwperativeKernel;
/// <summary>
/// Holds a myriad of useful attributes which you are more than welcome to use! These attributes are not meant for reflection, but merely as a means of straightforward debugging.
/// Each attribute gives has a method called VerifyOrThrow() which can differ parameter wise. VerifyOrThrow() returns a bool based on if the condition is true or not.
/// If it is false it will try to throw an error, and returns false as well.The only time this behavior differs, is if Awperative is set to IgnoreErrors. In that case it will return true no matter what.
/// (However it will still debug unless that is disabled too).
/// </summary>
/// <usage>
/// The attributes have been designed to be used in methods like so : if(!Attribute.VerifyOrThrow()) return; This usage allows the attribute to control the flow of output, and halt any unsafe process.
/// However, nothing is stopping you from using them any other way, so go wild. Feel free to make more, or use these in your own code!
/// </usage>
/// <author> Avery Norris </author>
public static class DebugAttributes
{
#region Docker/Entity
/// <summary> Requires that any Component is owned by the Docker</summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerOwns : Attribute
{
/// <summary> Returns true or false based on the given condition from the attribute, unless Debug.IgnoreErrors is true, in which it will always return true, but still try to throw errors. </summary>
/// <usage> It is required to use VerifyOrThrow() to validate important conditions for methods within the kernel. You may also feel free to use this outside in any modules or games.
/// It is easiest to use VerifyOrThrow like : (In your method) if(!Attribute.VerifyOrThrow()) return; That way the attribute can exit the code if the condition is false.</usage>
public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) {
if (__docker.Contains(__component)) return true;
Debug.LogError("Docker does not own the Component!",
["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that the Docker does not own the given Component</summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerDoesntOwn : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(ComponentDocker __docker, Component __component) {
if (!__docker.Contains(__component)) return true;
Debug.LogError("Docker owns the Component!",
["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that the Component does not belong to a Docker</summary>
[AttributeUsage(AttributeTargets.All)]
public class OrphanComponent : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(Component __component) {
if (__component.ComponentDocker == null) return true;
Debug.LogError("Component is already owned!",
["ComponentType", "ComponentName", "ComponentHash", "DockerType", "DockerName", "DockerHash"], [
__component.GetType().Name,
__component.Name,
__component.GetHashCode().ToString("N0"),
__component.ComponentDocker.GetType().Name,
__component.ComponentDocker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__component.ComponentDocker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that a given Docker is not the same</summary>
[AttributeUsage(AttributeTargets.All)]
public class DifferentDocker : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(ComponentDocker __docker, ComponentDocker __other) {
if (!__docker.Equals(__other)) return true;
Debug.LogError("The dockers are the same!", ["DockerType", "DockerName", "DockerHash"], [
__docker.GetType().Name,
__docker switch { Scene scene => scene.Name, Component component => component.Name, _ => "unknown" },
__docker.GetHashCode().ToString("N0")
]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that the Component is not null</summary>
[AttributeUsage(AttributeTargets.All)]
public class ComponentNotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(Component __component) {
if (__component != null) return true;
Debug.LogError("Component is null!");
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that the Docker is not null</summary>
[AttributeUsage(AttributeTargets.All)]
public class DockerNotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(ComponentDocker __componentDocker) {
if (__componentDocker != null) return true;
Debug.LogError("Docker is null!");
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that a given Scene is not null</summary>
[AttributeUsage(AttributeTargets.All)]
public class SceneNotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(Scene __scene) {
if (__scene != null) return true;
Debug.LogError("Scene is null!");
return Debug.IgnoreErrors;
}
}
#endregion
#region Null/Collection
/// <summary> Requires all elements in a Collection are not null </summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionNotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(ICollection<object> __collection) {
foreach (object obj in __collection) {
if (obj == null) {
Debug.LogError("A given enumerator has null members!", ["Type"], [__collection.GetType().Name]);
return Debug.IgnoreErrors;
}
}
return true;
}
}
/// <summary> Requires all elements in an Enumerator are not null</summary>
[AttributeUsage(AttributeTargets.All)]
public class EnumeratorNotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(IEnumerable<object> __enumerator) {
foreach (object obj in __enumerator) {
if (obj == null) {
Debug.LogError("A given enumerator has null members!", ["Type"], [__enumerator.GetType().Name]);
return Debug.IgnoreErrors;
}
}
return true;
}
}
/// <summary> Requires a given object is not null </summary>
[AttributeUsage(AttributeTargets.All)]
public class NotNull : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(Object __object) {
if (__object != null) return true;
Debug.LogError("A given object is null!");
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that an integer fits a range</summary>
[AttributeUsage(AttributeTargets.All)]
public class ValueFitsRange : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow(int __index, int __min, int __max) {
if (__index >= __min && __index <= __max) return true;
Debug.LogError("Value does not fit range!", ["Index"], [__index.ToString("N0")]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that a collection contains the given item</summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionContains : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow<__Type>(__Type __object, ICollection<__Type> __collection) {
if (__collection.Contains(__object)) return true;
Debug.LogError("Collection does not contain object!", ["ObjectType"], [__object.GetType().Name]);
return Debug.IgnoreErrors;
}
}
/// <summary> Requires that a collection does not contain the given item</summary>
[AttributeUsage(AttributeTargets.All)]
public class CollectionDoesntContain : Attribute
{
/// <inheritdoc cref="DockerOwns.VerifyOrThrow"/>
public static bool VerifyOrThrow<__Type>(__Type __object, ICollection<__Type> __collection) {
if (!__collection.Contains(__object)) return true;
Debug.LogError("Collection already contains object!", ["ObjectType"], [__object.GetType().Name]);
return Debug.IgnoreErrors;
}
}
#endregion
}

View File

@@ -0,0 +1,33 @@
using System;
namespace AwperativeKernel;
public static class MarkerAttributes
{
/// <summary>
/// Shows that the given object is unsafe (ex. it doesn't check for null values and such, or it doesn't have guardrails based on cases).
/// This is just for internal/private methods to remind myself how to call it :) The reasoning is case by case, but most of the time,
/// it is because all of the exposing public methods already check, and double checks would only slow me down
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class UnsafeInternal : Attribute { }
/// <summary>
/// Shows that the given object (meant for external use) is calculated every time it is called! Good to know for performance heavy systems.
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CalculatedProperty() : Attribute { }
/// <summary>
/// Just a way to write how expensive a calculated property can be.
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class CalculatedPropertyExpense(string Expense) : Attribute { }
}

View File

@@ -13,14 +13,14 @@ namespace AwperativeKernel;
public abstract partial class Component : ComponentDocker, IDisposable
public abstract partial class Component : ComponentDocker
{
/// <summary> Current parent of the Component. Can be either Scene or another Component.</summary>
[UnsafeInternal]
internal ComponentDocker ComponentDocker { get; set; } = null;
[MarkerAttributes.UnsafeInternal]
public ComponentDocker ComponentDocker { get; set; } = null;
/// <summary>
@@ -29,28 +29,28 @@ public abstract partial class Component : ComponentDocker, IDisposable
[NotNull]
public string Name {
get => _name;
set { if (!NotNull.VerifyOrThrow(value)) return; _name = value; }
} [UnsafeInternal] private string _name;
set { if (!DebugAttributes.NotNull.VerifyOrThrow(value)) return; _name = value; }
} [MarkerAttributes.UnsafeInternal] private string _name;
/// <summary> Represents the state of this Component, The largest bit represents if the Component is enabled or not, while the
/// next 7 represent its priority </summary>
[UnsafeInternal]
[MarkerAttributes.UnsafeInternal]
private byte OrderProfile;
/// <summary> If the component receives time events or not. </summary>
[CalculatedProperty, CalculatedPropertyExpense("Very Low")]
[MarkerAttributes.CalculatedProperty, MarkerAttributes.CalculatedPropertyExpense("Very Low")]
public bool Enabled {
get => (OrderProfile & 128) > 0;
set => OrderProfile = (byte)((OrderProfile & 127) | (value ? 128 : 0));
}
/// <summary> Represents the Component's Update priority, can be set to any value ranging from -64 to 63; otherwise an error will throw! </summary>
[CalculatedProperty, CalculatedPropertyExpense("Very Low")]
[MarkerAttributes.CalculatedProperty, MarkerAttributes.CalculatedPropertyExpense("Very Low")]
public int Priority {
get => (sbyte)(OrderProfile << 1) >> 1;
set {
if(!ValueFitsRange.VerifyOrThrow(value, -64, 63)) return;
if(!DebugAttributes.ValueFitsRange.VerifyOrThrow(value, -64, 63)) return;
OrderProfile = (byte)((OrderProfile & 0x80) | (value & 0x7F));
ComponentDocker.UpdatePriority(this, value);
}
@@ -64,7 +64,7 @@ public abstract partial class Component : ComponentDocker, IDisposable
/// Attempts to send an Event to the Component, terminates if the Component does not have the given Event
/// </summary>
/// <param name="__timeEvent">Type of Event</param>
[UnsafeInternal]
[MarkerAttributes.UnsafeInternal]
internal void TryEvent(int __timeEvent) {
Awperative._TypeAssociatedTimeEvents[GetType()][__timeEvent]?.Invoke(this);
}
@@ -75,7 +75,7 @@ public abstract partial class Component : ComponentDocker, IDisposable
/// Identifiers for Components.
/// </summary>
public IReadOnlyList<string> Tags => [.._tags];
[UnsafeInternal] internal HashSet<string> _tags = [];
[MarkerAttributes.UnsafeInternal] internal HashSet<string> _tags = [];
@@ -85,10 +85,10 @@ public abstract partial class Component : ComponentDocker, IDisposable
/// Adds a new tag to the Component
/// </summary>
/// <param name="__tag"> The tag to add</param>
public void AddTag([NotNull, CollectionDoesntContain] string __tag)
public void AddTag([DebugAttributes.NotNull, DebugAttributes.CollectionDoesntContain] string __tag)
{
if(!NotNull.VerifyOrThrow(__tag)) return;
if(!CollectionDoesntContain.VerifyOrThrow(__tag, _tags)) return;
if(!DebugAttributes.NotNull.VerifyOrThrow(__tag)) return;
if(!DebugAttributes.CollectionDoesntContain.VerifyOrThrow(__tag, _tags)) return;
_tags.Add(__tag);
ComponentDocker.AddTagToComponent(__tag, this);
@@ -102,21 +102,15 @@ public abstract partial class Component : ComponentDocker, IDisposable
/// Adds a new tag to the Component
/// </summary>
/// <param name="__tag"> The tag to add</param>
public void RemoveTag([NotNull,CollectionContains] string __tag)
public void RemoveTag([DebugAttributes.NotNull,DebugAttributes.CollectionContains] string __tag)
{
if (!NotNull.VerifyOrThrow(__tag)) return;
if(!CollectionContains.VerifyOrThrow(__tag, _tags)) return;
if (!DebugAttributes.NotNull.VerifyOrThrow(__tag)) return;
if(!DebugAttributes.CollectionContains.VerifyOrThrow(__tag, _tags)) return;
_tags.Remove(__tag);
ComponentDocker.RemoveTagFromComponent(__tag, this);
}
public virtual void Dispose() { GC.SuppressFinalize(this); }
public override string ToString() {
return this.Name;
}

View File

@@ -25,4 +25,9 @@ public abstract partial class Component
/// <inheritdoc cref="ComponentDocker.Move"/>
public void Move(ComponentDocker __newDocker) => ComponentDocker.Move(this, __newDocker);
/// <summary> Makes the Component destroy itself </summary>
public void Destroy() => ComponentDocker.Destroy(this);
}

View File

@@ -9,7 +9,7 @@ using System.Reflection;
namespace AwperativeKernel;
/// <summary>
/// Base class for all Awperative Entities. Responsible for Managing hierarchy between Components and Scenes, has Extensive Component Manipulation Available.
/// Base class for all Awperative objects. Responsible for Managing hierarchy between Components and Scenes, has Extensive Component Manipulation Available.
/// Also transfers Time and Carries most of the responsibilities akin to the Component.
/// </summary>
/// <remarks> Please don't inherit this. I don't know why you would</remarks>
@@ -107,7 +107,7 @@ public abstract partial class ComponentDocker : IEnumerable, IEnumerable<Compone
_components.Add(__component);
if (!_componentTypeDictionary.TryAdd(Type, [__component])) _componentTypeDictionary[Type].Add(__component);
foreach (var tag in __component._tags) RemoveTagFromComponent(tag, __component);
foreach (var tag in __component._tags) AddTagToComponent(tag, __component);
}
/// <summary>
@@ -119,9 +119,9 @@ public abstract partial class ComponentDocker : IEnumerable, IEnumerable<Compone
var Type = __component.GetType();
_components.Remove(__component);
if(!_componentTypeDictionary.ContainsKey(Type)) _componentTypeDictionary[Type].Remove(__component);
if(_componentTypeDictionary.TryGetValue(Type, out var value)) value.Remove(__component);
foreach (var tag in __component._tags) AddTagToComponent(tag, __component);
foreach (var tag in __component._tags) RemoveTagFromComponent(tag, __component);
}
/// <summary>
@@ -165,5 +165,4 @@ public abstract partial class ComponentDocker : IEnumerable, IEnumerable<Compone
for (int i = 0; i < targets.Count; i++) targets.InsertRange(i + 1, targets[i]._components);
return [..targets];
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
@@ -37,17 +38,16 @@ public abstract partial class ComponentDocker
/// </summary>
/// <param name="__component"></param>
/// <returns></returns>
public bool Contains([ComponentNotNull,DockerOwns] Component __component)
=> NotNull.VerifyOrThrow(__component) && DockerOwns.VerifyOrThrow(this, __component) && _components.Contains(__component);
public bool Contains([ComponentNotNull] Component __component)
=> NotNull.VerifyOrThrow(__component) && _componentTypeDictionary.TryGetValue(__component.GetType(), out var components) && components.Contains(__component);
/// <summary>
/// Finds all Components that have all the given tags
/// </summary>
/// <param name="__tags"></param>
/// <returns></returns>
public bool Contains<__Type>(string __tag) {
return GetAll<__Type>(__tag).Any();
}
public bool Contains<__Type>([NotNull] string __tag)
=> NotNull.VerifyOrThrow(__tag) && GetAll<__Type>(__tag).Any();
/// <summary>
/// Finds all Components that have all the given tags
@@ -116,7 +116,7 @@ public abstract partial class ComponentDocker
/// <typeparam name="__Type"> The Type of Components to search for</typeparam>
/// <returns></returns>
public IReadOnlyList<__Type> GetAll<__Type>() where __Type : Component {
return (IReadOnlyList<__Type>)_componentTypeDictionary.GetValueOrDefault(typeof(__Type)).ToList();
return _componentTypeDictionary.TryGetValue(typeof(__Type), out var components) ? components.OfType<__Type>().ToList() : [];
}
/// <summary>

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
@@ -138,12 +139,13 @@ public abstract partial class ComponentDocker
public TimeSpan total;
/// <summary>
/// Destroys a Component attached to the Docker
/// </summary>
/// <param name="__component"></param>
public void Destroy([ComponentNotNull,DockerOwns] Component __component) {
Stopwatch timer = Stopwatch.StartNew();
if(!ComponentNotNull.VerifyOrThrow(__component)) return;
if(!DockerOwns.VerifyOrThrow(this, __component)) return;
@@ -152,8 +154,8 @@ public abstract partial class ComponentDocker
RemoveComponentFromLists(__component);
__component.ComponentDocker = null;
__component.Dispose();
timer.Stop();
total += timer.Elapsed;
}
@@ -162,7 +164,7 @@ public abstract partial class ComponentDocker
/// Destroys the first found Component of a given type
/// </summary>
/// <typeparam name="__Type"> Type of Component to destroy</typeparam>
public void Destroy<__Type>() where __Type : Component => Destroy(Get<__Type>());
public void Destroy<__Type>() where __Type : Component => DestroyAll(GetAll<__Type>());

View File

@@ -145,7 +145,7 @@ public static class Debug
/// Writes the current message to the log file.
/// </summary>
/// <param name="__message"> Message to debug</param>
public static void LogError(string __message) => LogGeneric(__message, "ERR", [], []);
public static void LogError(string __message) => LogGeneric(__message, "ERR", [], [], ThrowExceptions);
/// <summary>
/// Writes the current message to the log file. With any given call sign.

View File

@@ -46,6 +46,12 @@ public static partial class Awperative
public static bool IsRunning { get; private set; } = false;
/// <summary> Awperative's debugger of choice</summary>
public static IDebugger Debug { get; set; }
public static IModuleManager ModuleManager { get; set; }
/// <summary>
/// Creates a new Scene
/// </summary>
@@ -59,6 +65,14 @@ public static partial class Awperative
public static void AddScene(Scene __scene) {
if (!ContainsScene(__scene.Name)) {
_scenes.Add(__scene);
} else Debug.LogError("Awperative already has a Scene with that name!", ["Scene", "Name"], [GetScene(__scene.Name).GetHashCode().ToString(), __scene.Name]); return null;
}
/// <summary>
/// Finds a Scene from a given name
/// </summary>
@@ -99,15 +113,27 @@ public static partial class Awperative
/// Gets Awperative ready to begin! Compiles Component functions etc. Please call before doing anything Awperative
/// related!
/// </summary>
public static void Start() {
public static void Start(string moduleManagerPath) {
if (IsStarted) return;
IsStarted = true;
Debug.Initiate();
//SPAGHETTI CODE FIX LATER! maybe move to static method in IModuleManager
foreach (Type type in Assembly.LoadFrom(moduleManagerPath).GetTypes()) {
Console.WriteLine(type.Name);
if (type.GetInterfaces().Contains(typeof(IModuleManager))) {
ModuleManager = (IModuleManager)Activator.CreateInstance(type);
}
}
List<Assembly> targets = [Assembly.GetCallingAssembly()];
foreach (Assembly module in ModuleManager.GetDependencies()) {
targets.Add(module);
}
//Load in all Components nd find the associated types.
Debug.LogAction("Evaluating Components!");
foreach (Type type in Assembly.GetCallingAssembly().GetTypes()) {
foreach (var t in targets) {
Console.WriteLine(t.FullName);
foreach (Type type in t.GetTypes()) {
if (type.IsSubclassOf(typeof(Component))) {
@@ -121,8 +147,6 @@ public static partial class Awperative
if (eventMethod != null) {
debugProfile.Add(ComponentEvents[i]);
var ComponentInstanceParameter = Expression.Parameter(typeof(Component), "__component");
var Casting = Expression.Convert(ComponentInstanceParameter, type);
var Call = Expression.Call(Casting, eventMethod);
@@ -132,14 +156,27 @@ public static partial class Awperative
} else timeEvents[i] = null;
}
Debug.LogAction("Evaluated Component! ", ["Type", "Time Events", "Profile"], [type.Name, "[" + string.Join(", ", debugProfile.Select(x => x.ToString())) + "]", eventProfile.ToString()]);
_TypeAssociatedTimeEvents.Add(type, timeEvents);
}
if (type.GetInterfaces().Contains(typeof(IDebugger))) {
if (Debug == null) {
if (type.GetConstructor(Type.EmptyTypes) != null)
Debug = (IDebugger)Activator.CreateInstance(type);
else throw new Exception("Awperative doesn't support IDebugger constructor!");
} else {
throw new Exception("Awperative found multiple debuggers! There can only be one.");
}
}
}
}
if (Debug == null)
throw new Exception("Awperative doesn't have a Debugger!");
Debug.Start();
Debug.LogAction("Successfully Compiled Classes!");
}
internal static Comparer<Component> _prioritySorter = Comparer<Component>.Create((a, b) => {
@@ -164,13 +201,25 @@ public static partial class Awperative
//Update, 2
//Draw 3
//Create, 4
//Destroy, 5
//Remove, 5
// 0000 0000
//
public static void TestUpdate() {
foreach (Scene scene in Scenes) {
scene.ChainEvent(2);
}
}
internal static ReadOnlyCollection<string> ComponentEvents = new(["Load", "Unload", "Update", "Draw", "Create", "Destroy"]);
public static void TestDraw() {
foreach (Scene scene in Scenes) {
scene.ChainEvent(3);
}
}
internal static ReadOnlyCollection<string> ComponentEvents = new(["Load", "Unload", "Update", "Draw", "Create", "Remove"]);

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
namespace AwperativeKernel;
public interface IDebugger
{
public void Start();
public void Stop();
public void LogAction(string __message);
public void LogAction(string __message, IReadOnlyList<string> __values, IReadOnlyList<string> __args);
public void LogWarning(string __message);
public void LogWarning(string __message, IReadOnlyList<string> __values, IReadOnlyList<string> __args);
public void LogError(string __message);
public void LogError(string __message, IReadOnlyList<string> __values, IReadOnlyList<string> __args);
public bool ThrowExceptions { get; set; }
public bool IgnoreErrors { get; set; }
public bool DebugErrors { get; set; }
}

View File

@@ -0,0 +1,11 @@
using System.Collections.Generic;
using System.Reflection;
namespace AwperativeKernel;
public interface IModuleManager
{
public IReadOnlyList<Assembly> GetDependencies();
}

View File

@@ -1,20 +1,20 @@
{
"format": 1,
"restore": {
"/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj": {}
"/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj": {}
},
"projects": {
"/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj": {
"/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"projectUniqueName": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"projectName": "AwperativeKernel",
"projectPath": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"packagesPath": "/Users/averynorris/.nuget/packages/",
"outputPath": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/obj/",
"projectPath": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"packagesPath": "/home/avery/.nuget/packages/",
"outputPath": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/averynorris/.nuget/NuGet/NuGet.Config"
"/home/avery/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
@@ -38,7 +38,7 @@
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.100"
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
@@ -63,11 +63,11 @@
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[8.0.23, 8.0.23]"
"version": "[8.0.24, 8.0.24]"
},
{
"name": "Microsoft.NETCore.App.Ref",
"version": "[8.0.23, 8.0.23]"
"version": "[8.0.24, 8.0.24]"
}
],
"frameworkReferences": {
@@ -75,7 +75,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "/home/avery/.dotnet/sdk/9.0.311/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@@ -4,12 +4,12 @@
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/Users/averynorris/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/Users/averynorris/.nuget/packages/</NuGetPackageFolders>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/avery/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/avery/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/Users/averynorris/.nuget/packages/" />
<SourceRoot Include="/home/avery/.nuget/packages/" />
</ItemGroup>
</Project>

View File

@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AwperativeKernel")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4a9f3d4476aad85ea81cf5539e1cbe307a50bee5")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8c3803fcdf9411da13e462596847a88f1080bb39")]
[assembly: System.Reflection.AssemblyProductAttribute("AwperativeKernel")]
[assembly: System.Reflection.AssemblyTitleAttribute("AwperativeKernel")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
d26fbee268a2a19e12312d333a763a70899a64f6b3b49b30e13a2696cde111a2
1401ec548e06fa205cbd38d50de2d7971689c7694c0af3dc509c2945921d606a

View File

@@ -1,7 +1,5 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
@@ -10,7 +8,7 @@ build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Awperative
build_property.ProjectDir = /Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/
build_property.ProjectDir = /home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0

View File

@@ -1 +1 @@
d99749faea945604824f7022f457f0974d512ed438f5f0cc6813de62d37d1f41
22dd22d60e6c8fbd5110065c2450e37bceb89fe776160bf2e51e6a6a8825b2b1

View File

@@ -442,19 +442,19 @@
]
},
"packageFolders": {
"/Users/averynorris/.nuget/packages/": {}
"/home/avery/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"projectUniqueName": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"projectName": "AwperativeKernel",
"projectPath": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"packagesPath": "/Users/averynorris/.nuget/packages/",
"outputPath": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/obj/",
"projectPath": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"packagesPath": "/home/avery/.nuget/packages/",
"outputPath": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/averynorris/.nuget/NuGet/NuGet.Config"
"/home/avery/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
@@ -478,7 +478,7 @@
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.100"
"SdkAnalysisLevel": "9.0.300"
},
"frameworks": {
"net8.0": {
@@ -503,11 +503,11 @@
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[8.0.23, 8.0.23]"
"version": "[8.0.24, 8.0.24]"
},
{
"name": "Microsoft.NETCore.App.Ref",
"version": "[8.0.23, 8.0.23]"
"version": "[8.0.24, 8.0.24]"
}
],
"frameworkReferences": {
@@ -515,7 +515,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "/home/avery/.dotnet/sdk/9.0.311/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@@ -1,24 +1,24 @@
{
"version": 2,
"dgSpecHash": "LpP/nHq7BJc=",
"dgSpecHash": "nvLY3cNblzg=",
"success": true,
"projectFilePath": "/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"projectFilePath": "/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj",
"expectedPackageFiles": [
"/Users/averynorris/.nuget/packages/opentk/5.0.0-pre.15/opentk.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.audio/5.0.0-pre.15/opentk.audio.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.compute/5.0.0-pre.15/opentk.compute.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.core/5.0.0-pre.15/opentk.core.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.graphics/5.0.0-pre.15/opentk.graphics.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.input/5.0.0-pre.15/opentk.input.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.mathematics/5.0.0-pre.15/opentk.mathematics.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.platform/5.0.0-pre.15/opentk.platform.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.redist.glfw/3.4.0.44/opentk.redist.glfw.3.4.0.44.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.windowing.common/5.0.0-pre.15/opentk.windowing.common.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.windowing.desktop/5.0.0-pre.15/opentk.windowing.desktop.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/opentk.windowing.graphicslibraryframework/5.0.0-pre.15/opentk.windowing.graphicslibraryframework.5.0.0-pre.15.nupkg.sha512",
"/Users/averynorris/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"/Users/averynorris/.nuget/packages/microsoft.netcore.app.ref/8.0.23/microsoft.netcore.app.ref.8.0.23.nupkg.sha512",
"/Users/averynorris/.nuget/packages/microsoft.aspnetcore.app.ref/8.0.23/microsoft.aspnetcore.app.ref.8.0.23.nupkg.sha512"
"/home/avery/.nuget/packages/opentk/5.0.0-pre.15/opentk.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.audio/5.0.0-pre.15/opentk.audio.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.compute/5.0.0-pre.15/opentk.compute.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.core/5.0.0-pre.15/opentk.core.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.graphics/5.0.0-pre.15/opentk.graphics.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.input/5.0.0-pre.15/opentk.input.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.mathematics/5.0.0-pre.15/opentk.mathematics.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.platform/5.0.0-pre.15/opentk.platform.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.redist.glfw/3.4.0.44/opentk.redist.glfw.3.4.0.44.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.windowing.common/5.0.0-pre.15/opentk.windowing.common.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.windowing.desktop/5.0.0-pre.15/opentk.windowing.desktop.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/opentk.windowing.graphicslibraryframework/5.0.0-pre.15/opentk.windowing.graphicslibraryframework.5.0.0-pre.15.nupkg.sha512",
"/home/avery/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"/home/avery/.nuget/packages/microsoft.netcore.app.ref/8.0.24/microsoft.netcore.app.ref.8.0.24.nupkg.sha512",
"/home/avery/.nuget/packages/microsoft.aspnetcore.app.ref/8.0.24/microsoft.aspnetcore.app.ref.8.0.24.nupkg.sha512"
],
"logs": []
}

View File

@@ -1 +1 @@
"restore":{"projectUniqueName":"/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj","projectName":"AwperativeKernel","projectPath":"/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj","outputPath":"/Users/averynorris/RiderProjects/AwperativeKernel/AwperativeKernel/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"10.0.100"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"OpenTK":{"target":"Package","version":"[5.0.0-pre.15, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[8.0.23, 8.0.23]"},{"name":"Microsoft.NETCore.App.Ref","version":"[8.0.23, 8.0.23]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/10.0.102/PortableRuntimeIdentifierGraph.json"}}
"restore":{"projectUniqueName":"/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj","projectName":"AwperativeKernel","projectPath":"/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/AwperativeKernel.csproj","outputPath":"/home/avery/Projects/Awperative/AwperativeKernel/AwperativeKernel/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"OpenTK":{"target":"Package","version":"[5.0.0-pre.15, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[8.0.24, 8.0.24]"},{"name":"Microsoft.NETCore.App.Ref","version":"[8.0.24, 8.0.24]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/home/avery/.dotnet/sdk/9.0.311/PortableRuntimeIdentifierGraph.json"}}

View File

@@ -1 +1 @@
17722910163812180
17722975223225869

View File

@@ -1 +1 @@
17722910991366692
17722975227348769