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