@ -0,0 +1,427 @@ | |||
# Created by https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudiocode,visualstudio | |||
# Edit at https://www.toptal.com/developers/gitignore?templates=dotnetcore,visualstudiocode,visualstudio | |||
### DotnetCore ### | |||
# .NET Core build folders | |||
bin/ | |||
obj/ | |||
# Common node modules locations | |||
/node_modules | |||
/wwwroot/node_modules | |||
### VisualStudioCode ### | |||
.vscode/* | |||
!.vscode/settings.json | |||
!.vscode/tasks.json | |||
!.vscode/launch.json | |||
!.vscode/extensions.json | |||
!.vscode/*.code-snippets | |||
# Local History for Visual Studio Code | |||
.history/ | |||
# Built Visual Studio Code Extensions | |||
*.vsix | |||
### VisualStudioCode Patch ### | |||
# Ignore all local history of files | |||
.history | |||
.ionide | |||
### VisualStudio ### | |||
## Ignore Visual Studio temporary files, build results, and | |||
## files generated by popular Visual Studio add-ons. | |||
## | |||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore | |||
# User-specific files | |||
*.rsuser | |||
*.suo | |||
*.user | |||
*.userosscache | |||
*.sln.docstates | |||
# User-specific files (MonoDevelop/Xamarin Studio) | |||
*.userprefs | |||
# Mono auto generated files | |||
mono_crash.* | |||
# Build results | |||
[Dd]ebug/ | |||
[Dd]ebugPublic/ | |||
[Rr]elease/ | |||
[Rr]eleases/ | |||
x64/ | |||
x86/ | |||
[Ww][Ii][Nn]32/ | |||
[Aa][Rr][Mm]/ | |||
[Aa][Rr][Mm]64/ | |||
bld/ | |||
[Bb]in/ | |||
[Oo]bj/ | |||
[Ll]og/ | |||
[Ll]ogs/ | |||
# Visual Studio 2015/2017 cache/options directory | |||
.vs/ | |||
# Uncomment if you have tasks that create the project's static files in wwwroot | |||
#wwwroot/ | |||
# Visual Studio 2017 auto generated files | |||
Generated\ Files/ | |||
# MSTest test Results | |||
[Tt]est[Rr]esult*/ | |||
[Bb]uild[Ll]og.* | |||
# NUnit | |||
*.VisualState.xml | |||
TestResult.xml | |||
nunit-*.xml | |||
# Build Results of an ATL Project | |||
[Dd]ebugPS/ | |||
[Rr]eleasePS/ | |||
dlldata.c | |||
# Benchmark Results | |||
BenchmarkDotNet.Artifacts/ | |||
# .NET Core | |||
project.lock.json | |||
project.fragment.lock.json | |||
artifacts/ | |||
# ASP.NET Scaffolding | |||
ScaffoldingReadMe.txt | |||
# StyleCop | |||
StyleCopReport.xml | |||
# Files built by Visual Studio | |||
*_i.c | |||
*_p.c | |||
*_h.h | |||
*.ilk | |||
*.meta | |||
*.obj | |||
*.iobj | |||
*.pch | |||
*.pdb | |||
*.ipdb | |||
*.pgc | |||
*.pgd | |||
*.rsp | |||
*.sbr | |||
*.tlb | |||
*.tli | |||
*.tlh | |||
*.tmp | |||
*.tmp_proj | |||
*_wpftmp.csproj | |||
*.log | |||
*.tlog | |||
*.vspscc | |||
*.vssscc | |||
.builds | |||
*.pidb | |||
*.svclog | |||
*.scc | |||
# Chutzpah Test files | |||
_Chutzpah* | |||
# Visual C++ cache files | |||
ipch/ | |||
*.aps | |||
*.ncb | |||
*.opendb | |||
*.opensdf | |||
*.sdf | |||
*.cachefile | |||
*.VC.db | |||
*.VC.VC.opendb | |||
# Visual Studio profiler | |||
*.psess | |||
*.vsp | |||
*.vspx | |||
*.sap | |||
# Visual Studio Trace Files | |||
*.e2e | |||
# TFS 2012 Local Workspace | |||
$tf/ | |||
# Guidance Automation Toolkit | |||
*.gpState | |||
# ReSharper is a .NET coding add-in | |||
_ReSharper*/ | |||
*.[Rr]e[Ss]harper | |||
*.DotSettings.user | |||
# TeamCity is a build add-in | |||
_TeamCity* | |||
# DotCover is a Code Coverage Tool | |||
*.dotCover | |||
# AxoCover is a Code Coverage Tool | |||
.axoCover/* | |||
!.axoCover/settings.json | |||
# Coverlet is a free, cross platform Code Coverage Tool | |||
coverage*.json | |||
coverage*.xml | |||
coverage*.info | |||
# Visual Studio code coverage results | |||
*.coverage | |||
*.coveragexml | |||
# NCrunch | |||
_NCrunch_* | |||
.*crunch*.local.xml | |||
nCrunchTemp_* | |||
# MightyMoose | |||
*.mm.* | |||
AutoTest.Net/ | |||
# Web workbench (sass) | |||
.sass-cache/ | |||
# Installshield output folder | |||
[Ee]xpress/ | |||
# DocProject is a documentation generator add-in | |||
DocProject/buildhelp/ | |||
DocProject/Help/*.HxT | |||
DocProject/Help/*.HxC | |||
DocProject/Help/*.hhc | |||
DocProject/Help/*.hhk | |||
DocProject/Help/*.hhp | |||
DocProject/Help/Html2 | |||
DocProject/Help/html | |||
# Click-Once directory | |||
publish/ | |||
# Publish Web Output | |||
*.[Pp]ublish.xml | |||
*.azurePubxml | |||
# Note: Comment the next line if you want to checkin your web deploy settings, | |||
# but database connection strings (with potential passwords) will be unencrypted | |||
*.pubxml | |||
*.publishproj | |||
# Microsoft Azure Web App publish settings. Comment the next line if you want to | |||
# checkin your Azure Web App publish settings, but sensitive information contained | |||
# in these scripts will be unencrypted | |||
PublishScripts/ | |||
# NuGet Packages | |||
*.nupkg | |||
# NuGet Symbol Packages | |||
*.snupkg | |||
# The packages folder can be ignored because of Package Restore | |||
**/[Pp]ackages/* | |||
# except build/, which is used as an MSBuild target. | |||
!**/[Pp]ackages/build/ | |||
# Uncomment if necessary however generally it will be regenerated when needed | |||
#!**/[Pp]ackages/repositories.config | |||
# NuGet v3's project.json files produces more ignorable files | |||
*.nuget.props | |||
*.nuget.targets | |||
# Microsoft Azure Build Output | |||
csx/ | |||
*.build.csdef | |||
# Microsoft Azure Emulator | |||
ecf/ | |||
rcf/ | |||
# Windows Store app package directories and files | |||
AppPackages/ | |||
BundleArtifacts/ | |||
Package.StoreAssociation.xml | |||
_pkginfo.txt | |||
*.appx | |||
*.appxbundle | |||
*.appxupload | |||
# Visual Studio cache files | |||
# files ending in .cache can be ignored | |||
*.[Cc]ache | |||
# but keep track of directories ending in .cache | |||
!?*.[Cc]ache/ | |||
# Others | |||
ClientBin/ | |||
~$* | |||
*~ | |||
*.dbmdl | |||
*.dbproj.schemaview | |||
*.jfm | |||
*.pfx | |||
*.publishsettings | |||
orleans.codegen.cs | |||
# Including strong name files can present a security risk | |||
# (https://github.com/github/gitignore/pull/2483#issue-259490424) | |||
#*.snk | |||
# Since there are multiple workflows, uncomment next line to ignore bower_components | |||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | |||
#bower_components/ | |||
# RIA/Silverlight projects | |||
Generated_Code/ | |||
# Backup & report files from converting an old project file | |||
# to a newer Visual Studio version. Backup files are not needed, | |||
# because we have git ;-) | |||
_UpgradeReport_Files/ | |||
Backup*/ | |||
UpgradeLog*.XML | |||
UpgradeLog*.htm | |||
ServiceFabricBackup/ | |||
*.rptproj.bak | |||
# SQL Server files | |||
*.mdf | |||
*.ldf | |||
*.ndf | |||
# Business Intelligence projects | |||
*.rdl.data | |||
*.bim.layout | |||
*.bim_*.settings | |||
*.rptproj.rsuser | |||
*- [Bb]ackup.rdl | |||
*- [Bb]ackup ([0-9]).rdl | |||
*- [Bb]ackup ([0-9][0-9]).rdl | |||
# Microsoft Fakes | |||
FakesAssemblies/ | |||
# GhostDoc plugin setting file | |||
*.GhostDoc.xml | |||
# Node.js Tools for Visual Studio | |||
.ntvs_analysis.dat | |||
node_modules/ | |||
# Visual Studio 6 build log | |||
*.plg | |||
# Visual Studio 6 workspace options file | |||
*.opt | |||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | |||
*.vbw | |||
# Visual Studio 6 auto-generated project file (contains which files were open etc.) | |||
*.vbp | |||
# Visual Studio 6 workspace and project file (working project files containing files to include in project) | |||
*.dsw | |||
*.dsp | |||
# Visual Studio 6 technical files | |||
# Visual Studio LightSwitch build output | |||
**/*.HTMLClient/GeneratedArtifacts | |||
**/*.DesktopClient/GeneratedArtifacts | |||
**/*.DesktopClient/ModelManifest.xml | |||
**/*.Server/GeneratedArtifacts | |||
**/*.Server/ModelManifest.xml | |||
_Pvt_Extensions | |||
# Paket dependency manager | |||
.paket/paket.exe | |||
paket-files/ | |||
# FAKE - F# Make | |||
.fake/ | |||
# CodeRush personal settings | |||
.cr/personal | |||
# Python Tools for Visual Studio (PTVS) | |||
__pycache__/ | |||
*.pyc | |||
# Cake - Uncomment if you are using it | |||
# tools/** | |||
# !tools/packages.config | |||
# Tabs Studio | |||
*.tss | |||
# Telerik's JustMock configuration file | |||
*.jmconfig | |||
# BizTalk build output | |||
*.btp.cs | |||
*.btm.cs | |||
*.odx.cs | |||
*.xsd.cs | |||
# OpenCover UI analysis results | |||
OpenCover/ | |||
# Azure Stream Analytics local run output | |||
ASALocalRun/ | |||
# MSBuild Binary and Structured Log | |||
*.binlog | |||
# NVidia Nsight GPU debugger configuration file | |||
*.nvuser | |||
# MFractors (Xamarin productivity tool) working folder | |||
.mfractor/ | |||
# Local History for Visual Studio | |||
.localhistory/ | |||
# Visual Studio History (VSHistory) files | |||
.vshistory/ | |||
# BeatPulse healthcheck temp database | |||
healthchecksdb | |||
# Backup folder for Package Reference Convert tool in Visual Studio 2017 | |||
MigrationBackup/ | |||
# Ionide (cross platform F# VS Code tools) working folder | |||
.ionide/ | |||
# Fody - auto-generated XML schema | |||
FodyWeavers.xsd | |||
# VS Code files for those working on multiple tools | |||
*.code-workspace | |||
# Local History for Visual Studio Code | |||
# Windows Installer files from build outputs | |||
*.cab | |||
*.msi | |||
*.msix | |||
*.msm | |||
*.msp | |||
# JetBrains Rider | |||
*.sln.iml | |||
### VisualStudio Patch ### | |||
# Additional files built by Visual Studio | |||
# End of https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudiocode,visualstudio |
@ -0,0 +1,40 @@ | |||
using System.Numerics; | |||
using Raylib_cs; | |||
namespace Smoll.Ex1 { | |||
class RectangleGizmoComponent : Smoll.Component { | |||
Complex size; | |||
Color color; | |||
Transform2DComponent? ownerTransform; | |||
public RectangleGizmoComponent(int width, int height, Color color) | |||
{ | |||
this.size = width + Complex.ImaginaryOne*height; | |||
this.color = color; | |||
} | |||
public override void OnAttached() { | |||
ownerTransform = owner.GetComponent<Transform2DComponent>(); | |||
} | |||
public override void Draw(Smoll.Layer.DrawMode drawMode) { | |||
ownerTransform ??= owner.GetComponent<Transform2DComponent>(); | |||
ownerTransform ??= new Transform2DComponent(); | |||
var tr = ownerTransform.AbsoluteTransform(); | |||
Raylib.DrawRectanglePro( | |||
new Rectangle( | |||
(float)tr.position.Real, | |||
(float)tr.position.Imaginary, | |||
(float)(size.Real*tr.scale.Real), | |||
(float)(size.Imaginary*tr.scale.Imaginary) | |||
), | |||
new Vector2( | |||
(float)(tr.anchor.Real - tr.position.Real), | |||
(float)(tr.anchor.Imaginary - tr.position.Imaginary) | |||
), | |||
tr.angle, | |||
color | |||
); | |||
} | |||
} | |||
} |
@ -0,0 +1,20 @@ | |||
using Raylib_cs; | |||
using Smoll; | |||
using Smoll.Ex1; | |||
Layer layer = new Layer(); | |||
var entity = new Entity(layer); | |||
entity.Attach(new Transform2DComponent()); | |||
entity.Attach(new RectangleGizmoComponent(128, 64, Color.Red)); | |||
Raylib.InitWindow(800, 600, "Smoll"); | |||
while(!Raylib.WindowShouldClose()) { | |||
layer.Update(); | |||
Raylib.BeginDrawing(); | |||
Raylib.ClearBackground(Color.White); | |||
layer.Draw(); | |||
Raylib.DrawFPS(0,0); | |||
Raylib.EndDrawing(); | |||
} | |||
Raylib.CloseWindow(); |
@ -0,0 +1,14 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<OutputType>Exe</OutputType> | |||
<TargetFramework>net7.0</TargetFramework> | |||
<ImplicitUsings>enable</ImplicitUsings> | |||
<Nullable>enable</Nullable> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Raylib-cs" Version="6.0.0" /> | |||
</ItemGroup> | |||
</Project> |
@ -0,0 +1,25 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio Version 17 | |||
VisualStudioVersion = 17.5.002.0 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smoll", "Smoll.csproj", "{98F07394-391E-45DF-9A4B-B3295016443E}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Release|Any CPU = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{98F07394-391E-45DF-9A4B-B3295016443E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{98F07394-391E-45DF-9A4B-B3295016443E}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{98F07394-391E-45DF-9A4B-B3295016443E}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{98F07394-391E-45DF-9A4B-B3295016443E}.Release|Any CPU.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
SolutionGuid = {CE449111-5DC3-419F-9AC6-09A6E96504AE} | |||
EndGlobalSection | |||
EndGlobal |
@ -0,0 +1,18 @@ | |||
namespace Smoll | |||
{ | |||
public class Component : IActionable | |||
{ | |||
internal Entity? owner; | |||
private int zOrderImpl = 0; | |||
public int zOrder{get{ return zOrderImpl;} set{zOrderImpl = value; if(owner != null) owner.actionables.Sort();}} | |||
public Entity GetEntity() { | |||
return owner; | |||
} | |||
public virtual void OnAttached() {} | |||
public virtual void Update(float deltaTimeSeconds) {} | |||
public virtual void Draw(Layer.DrawMode drawMode) {} | |||
} | |||
} |
@ -0,0 +1,8 @@ | |||
using System.Collections.Generic; | |||
namespace Smoll { | |||
public class Engine { | |||
List<Layer> layers; | |||
} | |||
} |
@ -0,0 +1,85 @@ | |||
using System.Numerics; | |||
namespace Smoll { | |||
public class Entity : IActionable { | |||
private int zOrderImpl = 0; | |||
public int zOrder{ | |||
get{ return zOrderImpl;} | |||
set{ | |||
zOrderImpl = value; | |||
if(parent != null) { | |||
parent.actionables.Sort(); | |||
} else { | |||
foreach (var item in layers) | |||
{ | |||
item.actionables.Sort(); | |||
} | |||
} | |||
} | |||
} | |||
internal List<Component> components; | |||
internal List<Entity> children; | |||
internal List<IActionable> actionables; | |||
internal Entity? parent; | |||
internal List<Layer> layers; | |||
public string name{get;} | |||
public bool isEnabled = true; | |||
public bool isVisible = true; | |||
public Entity(Entity parent) { | |||
this.parent = parent; | |||
components = new List<Component>(); | |||
layers = new List<Layer>(); | |||
children = new List<Entity>(); | |||
actionables = new List<IActionable>(); | |||
name = "Unnamed Entity"; | |||
layers = parent.layers; | |||
if(parent != null) { | |||
parent.children.Add(this); | |||
parent.actionables.Add(this); | |||
parent.actionables.Sort(); | |||
} | |||
} | |||
public Entity(Layer parent) { | |||
this.parent = null; | |||
components = new List<Component>(); | |||
children = new List<Entity>(); | |||
actionables = new List<IActionable>(); | |||
name = "Unnamed Entity"; | |||
parent.actionables.Add(this); | |||
layers = new List<Layer>(); | |||
layers.Add(parent); | |||
} | |||
public void Attach(Component component) { | |||
component.owner = this; | |||
components.Add(component); | |||
actionables.Add(component); | |||
actionables.Sort(); | |||
component.OnAttached(); | |||
} | |||
public virtual void Update(float deltaTimeSeconds) | |||
{ | |||
if(!isEnabled) return; | |||
foreach (var elem in actionables) | |||
{ | |||
elem.Update(deltaTimeSeconds); | |||
} | |||
} | |||
public virtual void Draw(Layer.DrawMode drawMode) | |||
{ | |||
if(!isVisible) return; | |||
foreach (var elem in actionables) | |||
{ | |||
elem.Draw(drawMode); | |||
} | |||
} | |||
public T? GetComponent<T>() where T : Component { | |||
var component = components.Find((Component a) => a is T); | |||
if(component == null) return null; | |||
return component as T; | |||
} | |||
} | |||
} |
@ -0,0 +1,14 @@ | |||
namespace Smoll { | |||
public interface IActionable : IComparable<IActionable>{ | |||
public int zOrder{get; set;} | |||
public virtual void Update(float deltaTimeSeconds) {} | |||
public virtual void Draw(Layer.DrawMode drawMode) {} | |||
int IComparable<IActionable>.CompareTo(IActionable? other) | |||
{ | |||
return other.zOrder - zOrder; | |||
} | |||
} | |||
} |
@ -0,0 +1,47 @@ | |||
using System.Diagnostics; | |||
namespace Smoll { | |||
public class Layer | |||
{ | |||
public Layer() { | |||
actionables = new List<IActionable>(); | |||
watch = new Stopwatch(); | |||
} | |||
internal List<IActionable> actionables; | |||
public enum DrawMode { | |||
Normal, | |||
Debug, | |||
Tools | |||
} | |||
DrawMode drawMode = DrawMode.Normal; | |||
Stopwatch watch; | |||
public float Update() { | |||
float deltaTime; | |||
if(! watch.IsRunning) { | |||
watch.Start(); | |||
deltaTime = 0; | |||
} else { | |||
deltaTime = (float)(watch.Elapsed.TotalMicroseconds/1000000.0f); | |||
watch.Reset(); | |||
watch.Start(); | |||
} | |||
foreach (var elem in actionables) | |||
{ | |||
elem.Update(deltaTime); | |||
} | |||
actionables.Sort(); | |||
return deltaTime; | |||
} | |||
public void Draw() { | |||
foreach (var elem in actionables) | |||
{ | |||
elem.Draw(drawMode); | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,47 @@ | |||
using System.Numerics; | |||
namespace Smoll { | |||
struct Transform2D { | |||
public Complex position; | |||
public Complex anchor; | |||
public float angle; | |||
public Complex scale; | |||
} | |||
sealed class Transform2DComponent : Component { | |||
public Transform2D transform; | |||
public Transform2DComponent() { | |||
transform = new Transform2D(); | |||
transform.scale = Complex.ImaginaryOne + 1; | |||
} | |||
public Transform2D AbsoluteTransform() { | |||
var up = owner.parent; | |||
do { | |||
if(up == null) return transform; | |||
var component = up.GetComponent<Transform2DComponent>(); | |||
if(component != null) { | |||
Transform2D combined = component.AbsoluteTransform(); | |||
var unscaled_pos = | |||
(combined.position + transform.position - combined.anchor) | |||
/(Complex.Exp(Complex.ImaginaryOne * combined.angle) - combined.anchor); | |||
var normalized_pos = unscaled_pos/unscaled_pos.Magnitude; | |||
combined.position = unscaled_pos.Magnitude*(transform.scale.Real*normalized_pos.Real + transform.scale.Imaginary*normalized_pos.Imaginary*Complex.ImaginaryOne); | |||
var unscaled_anchor = | |||
(combined.position + transform.anchor - combined.anchor) | |||
/(Complex.Exp(Complex.ImaginaryOne * combined.angle) - combined.anchor); | |||
var normalized_anchor = unscaled_anchor/unscaled_anchor.Magnitude; | |||
combined.anchor = unscaled_anchor.Magnitude*(transform.scale.Real*normalized_anchor.Real + transform.scale.Imaginary*normalized_anchor.Imaginary*Complex.ImaginaryOne); | |||
combined.scale *= transform.scale; | |||
combined.angle += transform.angle; | |||
return combined; | |||
} | |||
up = up.parent; | |||
} while(true); | |||
} | |||
} | |||
} |