@ -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); | |||||
} | |||||
} | |||||
} |