From 722ea9bc01a17d3de3314853ecc1858b604af94b Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Sat, 29 Feb 2020 22:28:58 -0500 Subject: [PATCH 1/7] 2.5D Demo Project for Mono C# Co-authored-by: Stephen Agbete (Steph155) --- mono/2.5d/2.5D Demo (Mono C#).csproj | 66 ++ mono/2.5d/2.5D Demo (Mono C#).sln | 19 + mono/2.5d/Properties/AssemblyInfo.cs | 25 + mono/2.5d/README.md | 19 + mono/2.5d/addons/node25d-cs/Basis25D.cs | 207 ++++++ mono/2.5d/addons/node25d-cs/Node25D.cs | 151 +++++ mono/2.5d/addons/node25d-cs/ShadowMath25D.cs | 54 ++ mono/2.5d/addons/node25d-cs/Transform25D.cs | 131 ++++ mono/2.5d/addons/node25d-cs/YSort25D.cs | 60 ++ .../node25d-cs/icons/kinematic_body_25d.png | Bin 0 -> 1682 bytes .../icons/kinematic_body_25d.png.import | 34 + .../2.5d/addons/node25d-cs/icons/node_25d.png | Bin 0 -> 1818 bytes .../node25d-cs/icons/node_25d.png.import | 34 + .../addons/node25d-cs/icons/node_25d_icon.png | Bin 0 -> 293 bytes .../node25d-cs/icons/node_25d_icon.png.import | 34 + .../node25d-cs/icons/shadow_math_25d.png | Bin 0 -> 2118 bytes .../icons/shadow_math_25d.png.import | 34 + .../node25d-cs/icons/shadow_math_25d_icon.png | Bin 0 -> 473 bytes .../icons/shadow_math_25d_icon.png.import | 34 + .../addons/node25d-cs/icons/y_sort_25d.png | Bin 0 -> 366 bytes .../node25d-cs/icons/y_sort_25d.png.import | 34 + .../node25d-cs/icons/y_sort_25d_icon.png | Bin 0 -> 241 bytes .../icons/y_sort_25d_icon.png.import | 34 + mono/2.5d/addons/node25d-cs/node25d_plugin.gd | 14 + mono/2.5d/addons/node25d-cs/plugin.cfg | 7 + mono/2.5d/assets/cube/CubeMath.cs | 72 ++ mono/2.5d/assets/cube/cube.tscn | 18 + mono/2.5d/assets/cube/cube_point.tscn | 17 + mono/2.5d/assets/cube/godot.png | Bin 0 -> 2135 bytes mono/2.5d/assets/cube/godot.png.import | 34 + mono/2.5d/assets/demo_scene.tscn | 614 ++++++++++++++++++ mono/2.5d/assets/platform/platform.tscn | 32 + mono/2.5d/assets/platform/platform_sprite.gd | 39 ++ .../assets/platform/textures/forty_five.png | Bin 0 -> 2276 bytes .../platform/textures/forty_five.png.import | 34 + .../assets/platform/textures/front_side.png | Bin 0 -> 441 bytes .../platform/textures/front_side.png.import | 34 + .../assets/platform/textures/isometric.png | Bin 0 -> 41122 bytes .../platform/textures/isometric.png.import | 34 + .../assets/platform/textures/oblique_y.png | Bin 0 -> 3148 bytes .../platform/textures/oblique_y.png.import | 34 + .../assets/platform/textures/oblique_z.png | Bin 0 -> 8917 bytes .../platform/textures/oblique_z.png.import | 34 + .../assets/platform/textures/top_down.png | Bin 0 -> 2686 bytes .../platform/textures/top_down.png.import | 34 + mono/2.5d/assets/player/PlayerMath25D.cs | 96 +++ mono/2.5d/assets/player/PlayerSprite.cs | 229 +++++++ mono/2.5d/assets/player/player_25d.tscn | 39 ++ mono/2.5d/assets/player/textures/jump.png | Bin 0 -> 3744 bytes .../assets/player/textures/jump.png.import | 34 + mono/2.5d/assets/player/textures/run.png | Bin 0 -> 8034 bytes .../assets/player/textures/run.png.import | 34 + mono/2.5d/assets/player/textures/stand.png | Bin 0 -> 1844 bytes .../assets/player/textures/stand.png.import | 34 + mono/2.5d/assets/shadow/shadow_25d.tscn | 39 ++ mono/2.5d/assets/shadow/shadow_sprite.gd | 39 ++ .../assets/shadow/textures/forty_five.png | Bin 0 -> 396 bytes .../shadow/textures/forty_five.png.import | 34 + .../assets/shadow/textures/front_side.png | Bin 0 -> 84 bytes .../shadow/textures/front_side.png.import | 34 + .../2.5d/assets/shadow/textures/isometric.png | Bin 0 -> 266 bytes .../shadow/textures/isometric.png.import | 34 + .../2.5d/assets/shadow/textures/oblique_y.png | Bin 0 -> 353 bytes .../shadow/textures/oblique_y.png.import | 34 + .../2.5d/assets/shadow/textures/oblique_z.png | Bin 0 -> 805 bytes .../shadow/textures/oblique_z.png.import | 34 + mono/2.5d/assets/shadow/textures/top_down.png | Bin 0 -> 87 bytes .../shadow/textures/top_down.png.import | 34 + mono/2.5d/assets/ui/control_hints.gd | 5 + mono/2.5d/assets/ui/overlay.tscn | 28 + mono/2.5d/assets/ui/overlay_cube.tscn | 28 + mono/2.5d/default_env.tres | 7 + mono/2.5d/icon.png | Bin 0 -> 262 bytes mono/2.5d/icon.png.import | 34 + mono/2.5d/project.godot | 169 +++++ 75 files changed, 3040 insertions(+) create mode 100644 mono/2.5d/2.5D Demo (Mono C#).csproj create mode 100644 mono/2.5d/2.5D Demo (Mono C#).sln create mode 100644 mono/2.5d/Properties/AssemblyInfo.cs create mode 100644 mono/2.5d/README.md create mode 100644 mono/2.5d/addons/node25d-cs/Basis25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/Node25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/ShadowMath25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/Transform25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/YSort25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/node25d_plugin.gd create mode 100644 mono/2.5d/addons/node25d-cs/plugin.cfg create mode 100644 mono/2.5d/assets/cube/CubeMath.cs create mode 100644 mono/2.5d/assets/cube/cube.tscn create mode 100644 mono/2.5d/assets/cube/cube_point.tscn create mode 100644 mono/2.5d/assets/cube/godot.png create mode 100644 mono/2.5d/assets/cube/godot.png.import create mode 100644 mono/2.5d/assets/demo_scene.tscn create mode 100644 mono/2.5d/assets/platform/platform.tscn create mode 100644 mono/2.5d/assets/platform/platform_sprite.gd create mode 100644 mono/2.5d/assets/platform/textures/forty_five.png create mode 100644 mono/2.5d/assets/platform/textures/forty_five.png.import create mode 100644 mono/2.5d/assets/platform/textures/front_side.png create mode 100644 mono/2.5d/assets/platform/textures/front_side.png.import create mode 100644 mono/2.5d/assets/platform/textures/isometric.png create mode 100644 mono/2.5d/assets/platform/textures/isometric.png.import create mode 100644 mono/2.5d/assets/platform/textures/oblique_y.png create mode 100644 mono/2.5d/assets/platform/textures/oblique_y.png.import create mode 100644 mono/2.5d/assets/platform/textures/oblique_z.png create mode 100644 mono/2.5d/assets/platform/textures/oblique_z.png.import create mode 100644 mono/2.5d/assets/platform/textures/top_down.png create mode 100644 mono/2.5d/assets/platform/textures/top_down.png.import create mode 100644 mono/2.5d/assets/player/PlayerMath25D.cs create mode 100644 mono/2.5d/assets/player/PlayerSprite.cs create mode 100644 mono/2.5d/assets/player/player_25d.tscn create mode 100755 mono/2.5d/assets/player/textures/jump.png create mode 100644 mono/2.5d/assets/player/textures/jump.png.import create mode 100644 mono/2.5d/assets/player/textures/run.png create mode 100644 mono/2.5d/assets/player/textures/run.png.import create mode 100644 mono/2.5d/assets/player/textures/stand.png create mode 100644 mono/2.5d/assets/player/textures/stand.png.import create mode 100644 mono/2.5d/assets/shadow/shadow_25d.tscn create mode 100644 mono/2.5d/assets/shadow/shadow_sprite.gd create mode 100644 mono/2.5d/assets/shadow/textures/forty_five.png create mode 100644 mono/2.5d/assets/shadow/textures/forty_five.png.import create mode 100644 mono/2.5d/assets/shadow/textures/front_side.png create mode 100644 mono/2.5d/assets/shadow/textures/front_side.png.import create mode 100644 mono/2.5d/assets/shadow/textures/isometric.png create mode 100644 mono/2.5d/assets/shadow/textures/isometric.png.import create mode 100644 mono/2.5d/assets/shadow/textures/oblique_y.png create mode 100644 mono/2.5d/assets/shadow/textures/oblique_y.png.import create mode 100644 mono/2.5d/assets/shadow/textures/oblique_z.png create mode 100644 mono/2.5d/assets/shadow/textures/oblique_z.png.import create mode 100644 mono/2.5d/assets/shadow/textures/top_down.png create mode 100644 mono/2.5d/assets/shadow/textures/top_down.png.import create mode 100644 mono/2.5d/assets/ui/control_hints.gd create mode 100644 mono/2.5d/assets/ui/overlay.tscn create mode 100644 mono/2.5d/assets/ui/overlay_cube.tscn create mode 100644 mono/2.5d/default_env.tres create mode 100644 mono/2.5d/icon.png create mode 100644 mono/2.5d/icon.png.import create mode 100644 mono/2.5d/project.godot diff --git a/mono/2.5d/2.5D Demo (Mono C#).csproj b/mono/2.5d/2.5D Demo (Mono C#).csproj new file mode 100644 index 0000000000..7282c23c2b --- /dev/null +++ b/mono/2.5d/2.5D Demo (Mono C#).csproj @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + {5CA791DB-5050-44D0-989B-41D559AB1D50} + Library + .mono/temp/bin/$(Configuration) + Empty.DMono + 2.5D Demo (Mono C#) + v4.5 + .mono/temp/obj + $(BaseIntermediateOutputPath)/$(Configuration) + Debug + Release + + + true + portable + false + $(GodotDefineConstants);GODOT;DEBUG; + prompt + 4 + false + + + portable + true + $(GodotDefineConstants);GODOT; + prompt + 4 + false + + + true + portable + false + $(GodotDefineConstants);GODOT;DEBUG;TOOLS; + prompt + 4 + false + + + + False + $(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/GodotSharp.dll + + + False + $(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/GodotSharpEditor.dll + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mono/2.5d/2.5D Demo (Mono C#).sln b/mono/2.5d/2.5D Demo (Mono C#).sln new file mode 100644 index 0000000000..d979d4573d --- /dev/null +++ b/mono/2.5d/2.5D Demo (Mono C#).sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "2.5D Demo (Mono C#)", "2.5D Demo (Mono C#).csproj", "{5CA791DB-5050-44D0-989B-41D559AB1D50}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Tools|Any CPU = Tools|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Release|Any CPU.Build.0 = Release|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Tools|Any CPU.ActiveCfg = Tools|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Tools|Any CPU.Build.0 = Tools|Any CPU + EndGlobalSection +EndGlobal diff --git a/mono/2.5d/Properties/AssemblyInfo.cs b/mono/2.5d/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..c562b72271 --- /dev/null +++ b/mono/2.5d/Properties/AssemblyInfo.cs @@ -0,0 +1,25 @@ +using System.Reflection; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("2.5D Demo (Mono C#)")] +[assembly: AssemblyDescription("2.5D demo project for Godot, Mono C# version.")] +[assembly: AssemblyConfiguration("Debug")] +[assembly: AssemblyCompany("Godot")] +[assembly: AssemblyProduct("Godot Demo Projects")] +[assembly: AssemblyCopyright("Copyright © 2020 Aaron Franke, Godot Engine contributors")] +[assembly: AssemblyTrademark("Godot Engine")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/mono/2.5d/README.md b/mono/2.5d/README.md new file mode 100644 index 0000000000..b7767f714b --- /dev/null +++ b/mono/2.5d/README.md @@ -0,0 +1,19 @@ +# 2.5D Demo Project (Mono C#) + +This demo project is an example of how a 2.5D game could be created in Godot. + +Controls: WASD to move, Space to jump, R to reset, and UIOPKL to change view modes. + +Note: There is a GDScript version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/misc/2.5d). + +## How does it work? + +Custom node types are added in a Godot plugin to allow 2.5D objects. Node25D serves as the base for all 2.5D objects; its first child must be a Spatial, which is used to calculate its position. It also adds YSort25D to sort Node25D nodes, and ShadowMath25D for calculating a shadow. + +It uses structs called Basis25D and Transform25D to calculate 2D positions from 3D ones. For getting a 3D position, this project uses KinematicBody and StaticBody (3D), but these only exist for math - the camera is 2D and all sprites are 2D. You are able to use any Spatial node for math. + +To display the objects, add a Sprite or any other Node2D-derived children to your Node25D objects. Some nodes are unsuitable, such as 2D physics nodes. Keep in mind that the first child must be Spatial-derived for math purposes. + +Several view modes are implemented, including top down, front side, 45 degree, isometric, and two oblique modes. To implement a different view angle, all you need to do is create a new Basis25D, use it in all your Node25D transforms, and of course create textures to display that object in 2D. + +## Screenshots diff --git a/mono/2.5d/addons/node25d-cs/Basis25D.cs b/mono/2.5d/addons/node25d-cs/Basis25D.cs new file mode 100644 index 0000000000..d5f82b0603 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Basis25D.cs @@ -0,0 +1,207 @@ +using Godot; +using System; +using System.Runtime.InteropServices; + +#if GODOT_REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Basis25D structure for performing 2.5D transform math. +/// Note: All code assumes that Y is UP in 3D, and DOWN in 2D. +/// A top-down view has a Y axis component of (0, 0), with a Z axis component of (0, 1). +/// For a front side view, Y is (0, -1) and Z is (0, 0). +/// Remember that Godot's 2D mode has the Y axis pointing DOWN on the screen. +/// +[Serializable] +[StructLayout(LayoutKind.Sequential)] +public struct Basis25D : IEquatable +{ + // Also matrix columns, the directions to move on screen for each unit change in 3D. + public Vector2 x; + public Vector2 y; + public Vector2 z; + + // Also matrix rows, the parts of each vector that contribute to moving in a screen direction. + // Setting a row to zero means no movement in that direction. + public Vector3 Row0 + { + get { return new Vector3(x.x, y.x, z.x); } + set + { + x.x = value.x; + y.x = value.y; + z.x = value.z; + } + } + + public Vector3 Row1 + { + get { return new Vector3(x.y, y.y, z.y); } + set + { + x.y = value.x; + y.y = value.y; + z.y = value.z; + } + } + + public Vector2 this[int columnIndex] + { + get + { + switch (columnIndex) + { + case 0: return x; + case 1: return y; + case 2: return z; + default: throw new IndexOutOfRangeException(); + } + } + set + { + switch (columnIndex) + { + case 0: x = value; return; + case 1: y = value; return; + case 2: z = value; return; + default: throw new IndexOutOfRangeException(); + } + } + } + + public real_t this[int columnIndex, int rowIndex] + { + get + { + return this[columnIndex][rowIndex]; + } + set + { + Vector2 v = this[columnIndex]; + v[rowIndex] = value; + this[columnIndex] = v; + } + } + + private static readonly Basis25D _topDown = new Basis25D(1, 0, 0, 0, 0, 1); + private static readonly Basis25D _frontSide = new Basis25D(1, 0, 0, -1, 0, 0); + private static readonly Basis25D _fortyFive = new Basis25D(1, 0, 0, -0.70710678118f, 0, 0.70710678118f); + private static readonly Basis25D _isometric = new Basis25D(0.86602540378f, 0.5f, 0, -1, -0.86602540378f, 0.5f); + private static readonly Basis25D _obliqueY = new Basis25D(1, 0, -0.70710678118f, -0.70710678118f, 0, 1); + private static readonly Basis25D _obliqueZ = new Basis25D(1, 0, 0, -1, -0.70710678118f, 0.70710678118f); + + public static Basis25D TopDown { get { return _topDown; } } + public static Basis25D FrontSide { get { return _frontSide; } } + public static Basis25D FortyFive { get { return _fortyFive; } } + public static Basis25D Isometric { get { return _isometric; } } + public static Basis25D ObliqueY { get { return _obliqueY; } } + public static Basis25D ObliqueZ { get { return _obliqueZ; } } + + /// + /// Creates a Dimetric Basis25D from the angle between the Y axis and the others. + /// Dimetric(Tau/3) or Dimetric(2.09439510239) is the same as Isometric. + /// Try to keep this number away from a multiple of Tau/4 (or Pi/2) radians. + /// + /// The angle, in radians, between the Y axis and the X/Z axes. + public static Basis25D Dimetric(real_t angle) + { + real_t sin = Mathf.Sin(angle); + real_t cos = Mathf.Cos(angle); + return new Basis25D(sin, -cos, 0, -1, -sin, -cos); + } + + // Constructors + public Basis25D(Basis25D b) + { + x = b.x; + y = b.y; + z = b.z; + } + public Basis25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis) + { + x = xAxis; + y = yAxis; + z = zAxis; + } + public Basis25D(real_t xx, real_t xy, real_t yx, real_t yy, real_t zx, real_t zy) + { + x = new Vector2(xx, xy); + y = new Vector2(yx, yy); + z = new Vector2(zx, zy); + } + + public static Basis25D operator *(Basis25D b, real_t s) + { + b.x *= s; + b.y *= s; + b.z *= s; + return b; + } + + public static Basis25D operator /(Basis25D b, real_t s) + { + b.x /= s; + b.y /= s; + b.z /= s; + return b; + } + + public static bool operator ==(Basis25D left, Basis25D right) + { + return left.Equals(right); + } + + public static bool operator !=(Basis25D left, Basis25D right) + { + return !left.Equals(right); + } + + public override bool Equals(object obj) + { + if (obj is Basis25D) + { + return Equals((Basis25D)obj); + } + return false; + } + + public bool Equals(Basis25D other) + { + return x.Equals(other.x) && y.Equals(other.y) && z.Equals(other.z); + } + + public bool IsEqualApprox(Basis25D other) + { + return x.IsEqualApprox(other.x) && y.IsEqualApprox(other.y) && z.IsEqualApprox(other.z); + } + + public override int GetHashCode() + { + return y.GetHashCode() ^ x.GetHashCode() ^ z.GetHashCode(); + } + + public override string ToString() + { + string s = String.Format("({0}, {1}, {2})", new object[] + { + x.ToString(), + y.ToString(), + z.ToString() + }); + return s; + } + + public string ToString(string format) + { + string s = String.Format("({0}, {1}, {2})", new object[] + { + x.ToString(format), + y.ToString(format), + z.ToString(format) + }); + return s; + } +} diff --git a/mono/2.5d/addons/node25d-cs/Node25D.cs b/mono/2.5d/addons/node25d-cs/Node25D.cs new file mode 100644 index 0000000000..99afb8b684 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Node25D.cs @@ -0,0 +1,151 @@ +using Godot; +using System; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// This node converts a 3D position to 2D using a 2.5D transformation matrix. +/// The transformation of its 2D form is controlled by its 3D child. +/// +[Tool] +public class Node25D : Node2D, IComparable +{ + /// + /// The number of 2D units in one 3D unit. Ideally, but not necessarily, an integer. + /// + public const int SCALE = 32; + + [Export] public Vector3 spatialPosition + { + get + { + if (spatialNode == null) + { + spatialNode = GetChild(0); + } + return spatialNode.Translation; + } + set + { + transform25D.spatialPosition = value; + if (spatialNode != null) + { + spatialNode.Translation = value; + } + else if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + } + } + + private Spatial spatialNode; + private Transform25D transform25D; + + public Basis25D Basis25D + { + get { return transform25D.basis; } + } + + public Transform25D Transform25D + { + get { return transform25D; } + } + + public override void _Ready() + { + Node25DReady(); + } + + public override void _Process(real_t delta) + { + Node25DProcess(); + } + + /// + /// Call this method in _Ready, or before Node25DProcess is run. + /// + protected void Node25DReady() + { + if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + // Changing the basis here will change the default for all Node25D instances. + transform25D = new Transform25D(Basis25D.FortyFive * SCALE); + } + + /// + /// Call this method in _Process, or whenever the position of this object changes. + /// + protected void Node25DProcess() + { + CheckViewMode(); + if (spatialNode != null) + { + transform25D.spatialPosition = spatialNode.Translation; + } + else if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + GlobalPosition = transform25D.FlatPosition; + } + + private void CheckViewMode() + { + if (Input.IsActionJustPressed("top_down_mode")) + { + transform25D.basis = Basis25D.TopDown * SCALE; + } + else if (Input.IsActionJustPressed("front_side_mode")) + { + transform25D.basis = Basis25D.FrontSide * SCALE; + } + else if (Input.IsActionJustPressed("forty_five_mode")) + { + transform25D.basis = Basis25D.FortyFive * SCALE; + } + else if (Input.IsActionJustPressed("isometric_mode")) + { + transform25D.basis = Basis25D.Isometric * SCALE; + } + else if (Input.IsActionJustPressed("oblique_y_mode")) + { + transform25D.basis = Basis25D.ObliqueY * SCALE; + } + else if (Input.IsActionJustPressed("oblique_z_mode")) + { + transform25D.basis = Basis25D.ObliqueZ * SCALE; + } + } + + public int CompareTo(object obj) + { + if (obj is Node25D) + { + return CompareTo((Node25D)obj); + } + return 1; + } + + public int CompareTo(Node25D other) + { + real_t thisIndex = transform25D.spatialPosition.y + 0.001f * (transform25D.spatialPosition.x + transform25D.spatialPosition.z); + real_t otherIndex = other.transform25D.spatialPosition.y + 0.001f * (other.transform25D.spatialPosition.x + other.transform25D.spatialPosition.z); + real_t diff = thisIndex - otherIndex; + if (diff > 0) + { + return 1; + } + if (diff < 0) + { + return -1; + } + return 0; + } + +} diff --git a/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs b/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs new file mode 100644 index 0000000000..64b8061f22 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs @@ -0,0 +1,54 @@ +using Godot; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Adds a simple shadow below an object. +/// Place this ShadowMath25D node as a child of a Shadow25D, which +/// is below the target object in the scene tree (not as a child). +/// +[Tool] +public class ShadowMath25D : KinematicBody +{ + /// + /// The maximum distance below objects that shadows will appear. + /// + public real_t shadowLength = 1000; + private Node25D shadowRoot; + private Spatial targetMath; + + public override void _Ready() + { + shadowRoot = GetParent(); + int index = shadowRoot.GetPositionInParent(); + targetMath = shadowRoot.GetParent().GetChild(index - 1).GetChild(0); + } + + public override void _Process(real_t delta) + { + if (targetMath == null) + { + if (shadowRoot != null) + { + shadowRoot.Visible = false; + } + return; // Shadow is not in a valid place. + } + + Translation = targetMath.Translation; + var k = MoveAndCollide(Vector3.Down * shadowLength); + if (k == null) + { + shadowRoot.Visible = false; + } + else + { + shadowRoot.Visible = true; + GlobalTransform = Transform; + } + } + +} diff --git a/mono/2.5d/addons/node25d-cs/Transform25D.cs b/mono/2.5d/addons/node25d-cs/Transform25D.cs new file mode 100644 index 0000000000..2c41e2c3e4 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Transform25D.cs @@ -0,0 +1,131 @@ +using Godot; +using System; +using System.Runtime.InteropServices; + +/// +/// Calculates the 2D transformation from a 3D position and a Basis25D. +/// +[Serializable] +[StructLayout(LayoutKind.Sequential)] +public struct Transform25D : IEquatable +{ + // Public fields store information that is used to calculate the properties. + + /// + /// Controls how the 3D position is transformed into 2D. + /// + public Basis25D basis; + + /// + /// The 3D position of the object. Should be updated on every frame before everything else. + /// + public Vector3 spatialPosition; + + // Public properties calculate on-the-fly. + + /// + /// The 2D transformation of this object. Slower than FlatPosition. + /// + public Transform2D FlatTransform + { + get + { + return new Transform2D(0, FlatPosition); + } + } + + /// + /// The 2D position of this object. + /// + public Vector2 FlatPosition + { + get + { + Vector2 pos = spatialPosition.x * basis.x; + pos += spatialPosition.y * basis.y; + pos += spatialPosition.z * basis.z; + return pos; + } + } + + // Constructors + public Transform25D(Transform25D transform25D) + { + basis = transform25D.basis; + spatialPosition = transform25D.spatialPosition; + } + public Transform25D(Basis25D basis25D) + { + basis = basis25D; + spatialPosition = Vector3.Zero; + } + public Transform25D(Basis25D basis25D, Vector3 position3D) + { + basis = basis25D; + spatialPosition = position3D; + } + public Transform25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis) + { + basis = new Basis25D(xAxis, yAxis, zAxis); + spatialPosition = Vector3.Zero; + } + public Transform25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis, Vector3 position3D) + { + basis = new Basis25D(xAxis, yAxis, zAxis); + spatialPosition = position3D; + } + + public static bool operator ==(Transform25D left, Transform25D right) + { + return left.Equals(right); + } + + public static bool operator !=(Transform25D left, Transform25D right) + { + return !left.Equals(right); + } + + public override bool Equals(object obj) + { + if (obj is Transform25D) + { + return Equals((Transform25D)obj); + } + return false; + } + + public bool Equals(Transform25D other) + { + return basis.Equals(other.basis) && spatialPosition.Equals(other.spatialPosition); + } + + public bool IsEqualApprox(Transform25D other) + { + return basis.IsEqualApprox(other.basis) && spatialPosition.IsEqualApprox(other.spatialPosition); + } + + public override int GetHashCode() + { + return basis.GetHashCode() ^ spatialPosition.GetHashCode(); + } + + public override string ToString() + { + string s = String.Format("({0}, {1})", new object[] + { + basis.ToString(), + spatialPosition.ToString() + }); + return s; + } + + public string ToString(string format) + { + string s = String.Format("({0}, {1})", new object[] + { + basis.ToString(format), + spatialPosition.ToString(format) + }); + return s; + } +} diff --git a/mono/2.5d/addons/node25d-cs/YSort25D.cs b/mono/2.5d/addons/node25d-cs/YSort25D.cs new file mode 100644 index 0000000000..9b1506c0be --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/YSort25D.cs @@ -0,0 +1,60 @@ +using Godot; +using System.Collections.Generic; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Assigns Z-index values to Node25D children. +/// +[Tool] // Commented out because it sometimes crashes the editor when running the game... +public class YSort25D : Node // Note: NOT Node2D, Node25D, or YSort +{ + /// + /// Whether or not to automatically call Sort() in _Process(). + /// + [Export] + public bool sortEnabled = true; + + public override void _Process(real_t delta) + { + if (sortEnabled) + { + Sort(); + } + } + + /// + /// Call this method in _Process, or whenever you want to sort children. + /// + public void Sort() + { + var children = GetParent().GetChildren(); + if (children.Count > 4000) + { + GD.PrintErr("Sorting failed: Max number of YSort25D nodes is 4000."); + } + List node25dChildren = new List(); + + foreach (Node n in children) + { + if (n is Node25D node25d) + { + node25dChildren.Add(node25d); + } + } + + node25dChildren.Sort(); + + int zIndex = -4000; + for (int i = 0; i < node25dChildren.Count; i++) + { + node25dChildren[i].ZIndex = zIndex; + // Increment by 2 each time, to allow for shadows in-between. + // This does mean that we have a limit of 4000 total sorted Node25Ds. + zIndex += 2; + } + } +} diff --git a/mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png b/mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png new file mode 100644 index 0000000000000000000000000000000000000000..2780a094fb5cbf7460f1ea14d47bcb2d666e2e1c GIT binary patch literal 1682 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 O!{F)a=d#Wzp$PyD`g{lg literal 0 HcmV?d00001 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import new file mode 100644 index 0000000000..53087b1af0 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d.png-d7ffa1c0d05a9139ab514ec27ad8da9d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d-cs/icons/y_sort_25d.png" +dest_files=[ "res://.import/y_sort_25d.png-d7ffa1c0d05a9139ab514ec27ad8da9d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e362220e25527cc9680522afcfc8cefd2c9a255 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE08`n;T;g2?SBg=(HKA} zG<3D&kDC6@CZJ}ak|4iehNfo5y8rckzb7y-^!C-(H8vS^AF%|=hI+a06| zlcBb|o2$Wqhq7zceeU;bJqpzHr)^Se><1Upifw9)&u+ z(AxZCE=%a5Y2WuJ9aGaSv-tF3&z~bt4)cCo!+81Dn?G$p3m80I{an^LB{Ts5F+pt! literal 0 HcmV?d00001 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import new file mode 100644 index 0000000000..db9724c066 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d_icon.png-852bb2b2c54661e1957a46372d9a6d8f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d-cs/icons/y_sort_25d_icon.png" +dest_files=[ "res://.import/y_sort_25d_icon.png-852bb2b2c54661e1957a46372d9a6d8f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/addons/node25d-cs/node25d_plugin.gd b/mono/2.5d/addons/node25d-cs/node25d_plugin.gd new file mode 100644 index 0000000000..7559cd6323 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/node25d_plugin.gd @@ -0,0 +1,14 @@ +tool +extends EditorPlugin + +func _enter_tree(): + # When this plugin node enters tree, add the custom types + add_custom_type("Node25D", "Node2D", preload("Node25D.cs"), preload("icons/node_25d_icon.png")) + add_custom_type("YSort25D", "Node", preload("YSort25D.cs"), preload("icons/y_sort_25d_icon.png")) + add_custom_type("ShadowMath25D", "KinematicBody", preload("ShadowMath25D.cs"), preload("icons/shadow_math_25d_icon.png")) + +func _exit_tree(): + # When the plugin node exits the tree, remove the custom types + remove_custom_type("ShadowMath25D") + remove_custom_type("YSort25D") + remove_custom_type("Node25D") diff --git a/mono/2.5d/addons/node25d-cs/plugin.cfg b/mono/2.5d/addons/node25d-cs/plugin.cfg new file mode 100644 index 0000000000..74b293d381 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Node25D (C#)" +description="Adds Node25D" +author="Aaron Franke" +version="1.0" +script="node25d_plugin.gd" diff --git a/mono/2.5d/assets/cube/CubeMath.cs b/mono/2.5d/assets/cube/CubeMath.cs new file mode 100644 index 0000000000..f6c1d1e259 --- /dev/null +++ b/mono/2.5d/assets/cube/CubeMath.cs @@ -0,0 +1,72 @@ +using Godot; + +public class CubeMath : Spatial +{ + private static PackedScene cubePointScene = ResourceLoader.Load("res://assets/cube/cube_point.tscn"); + + private bool _isParentReady = false; + private Node2D _parent; + private Spatial[] _cubePointsMath = new Spatial[27]; // The math node of each 2.5D cube point + private Spatial[] _cubeMathSpatials = new Spatial[27]; // The CubeMath children that find position. + + public override void _Ready() + { + _parent = GetParent(); + + // Initialize the cube + for (int i = 0; i < 27; i++) + { + int a = (i / 9) - 1; + int b = (i / 3) % 3 - 1; + int c = (i % 3) - 1; + Vector3 spatialPosition = 5 * (a * Vector3.Right + b * Vector3.Up + c * Vector3.Back); + + _cubeMathSpatials[i] = new Spatial(); + _cubeMathSpatials[i].Translation = spatialPosition; + _cubeMathSpatials[i].Name = "CubeMath #" + i + ", " + a + " " + b + " " + c; + AddChild(_cubeMathSpatials[i]); + } + } + + public override void _Process(float delta) + { + if (Input.IsActionPressed("exit")) + { + GetTree().Quit(); + } + + if (Input.IsActionJustPressed("view_cube_demo")) + { + GetTree().ChangeScene("res://assets/demo_scene.tscn"); + return; + } + + if (_isParentReady) + { + RotateX(delta * (Input.GetActionStrength("move_back") - Input.GetActionStrength("move_forward"))); + RotateY(delta * (Input.GetActionStrength("move_right") - Input.GetActionStrength("move_left"))); + RotateZ(delta * (Input.GetActionStrength("move_counterclockwise") - Input.GetActionStrength("move_clockwise"))); + if (Input.IsActionJustPressed("reset_position")) + { + Transform = Transform.Identity; + } + for (int i = 0; i < 27; i++) + { + _cubePointsMath[i].GlobalTransform = _cubeMathSpatials[i].GlobalTransform; + } + } + else + { + // This code block will be run only once. It's not in _Ready() because the parent isn't set up there. + for (int i = 0; i < 27; i++) + { + PackedScene myCubePointScene = cubePointScene.Duplicate(true) as PackedScene; + Node25D cubePoint = myCubePointScene.Instance() as Node25D; + cubePoint.Name = "CubePoint #" + i; + _cubePointsMath[i] = cubePoint.GetChild(0); + _parent.AddChild(cubePoint); + } + _isParentReady = true; + } + } +} diff --git a/mono/2.5d/assets/cube/cube.tscn b/mono/2.5d/assets/cube/cube.tscn new file mode 100644 index 0000000000..236e87c080 --- /dev/null +++ b/mono/2.5d/assets/cube/cube.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/node25d-cs/YSort25D.cs" type="Script" id=1] +[ext_resource path="res://assets/ui/overlay_cube.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/cube/CubeMath.cs" type="Script" id=4] + +[node name="Cube" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 3 )] + +[node name="Camera2D" type="Camera2D" parent="."] +current = true + +[node name="CubeMath" type="Spatial" parent="."] +script = ExtResource( 4 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 1 ) diff --git a/mono/2.5d/assets/cube/cube_point.tscn b/mono/2.5d/assets/cube/cube_point.tscn new file mode 100644 index 0000000000..f7087b7e80 --- /dev/null +++ b/mono/2.5d/assets/cube/cube_point.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/cube/godot.png" type="Texture" id=3] + +[node name="CubePoint" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 0, 0 ) + +[node name="CubePointMath" type="Spatial" parent="."] + +[node name="CubePointSprite" type="Sprite" parent="."] +texture = ExtResource( 3 ) diff --git a/mono/2.5d/assets/cube/godot.png b/mono/2.5d/assets/cube/godot.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc37bb0031ab4089337c1d62ed5b8ed2736e1a2 GIT binary patch literal 2135 zcmV-d2&ngoP)#|Wb?K9*8dOoo}O-pi9h`PRL6-oK1^J2!p)CtJnPn{3(vacsV*Zl!J~^>sEOJfR`}~# z*Ac%v{_2PQjf5c*f2A=*jnwKe@u%~yCw_az%}+%#$>^5Ozx!of{NUTV)b2RvhG)I$$ocoY!h}f?)Jo0N?l2AtjNo%JX&OMS)J*L(pwkHR3vW^cwNf*+ z(*O~k6ukANMVh~1haQ`;@?dj~IjfjUjz>M2b$hG%NiIB-BF-u*h- zWzKtF$H)XZqgI%waA$J#@n{Fqf4#b{R)n+(6jz=x_#XbKgNR_qtxCzps3{R z5xG$*Ico12Fy=)5JO>WA;Dj3u`!--zK$yT2TVpV989|XH0`DyI(c?2$iQpJ8<|+?P zfQD@wuyo@dffobgT^4e`ccgeVhl6vBxypkRpkdnvOk3e6Fm-PVrd`IO_cFBUn*uHW zB%9!vbED?K3DB@@172L{C9v2m#*G0dKx14RaP2d5_0ZJimSamc?iN`6d9K?V04G4h zN*hmj^JoJ;_$F2+B9pWA(3EB3{B_UH)o0;}0%eU|dUbn(+ZzBU+yE^!&BF0w0*@YP zz?OZV3haq3lYe-zy88z;FgU2)AAhgH@)`~Oe+|FeD;&d~2!lI9yA6G`(A@LM55fap z@Ps#jSGP7`-umrglk#0oz3%wgvh-zEtvKJ=JE#R=>6{;nKnqQ@@n9~yc*7&-@$8-k z-23Lg)YaXqoa#2+;}tQ&%#_{9dMPNL<1r01(H?dlk9fs1-jA*UmpwK^37G}z?sw`r zb602oz$>2dP7O!ifMq_x0$yL`Lp-4Z&wv_^xBJmC|g>Xsgv=y?*Z)r~jYq`U9BN1-91V&6V}Uy5bk z^8s;$z&_D~IJ?;&d6`U%No}MwnEU{wwN@Z8KjmQg(D3%G1hmDg%t|eziMuq^|usS z&F8s?-2igPh2!U(XrP6rZN3Dj?M;z$=zv;UTC`%tNKxJ;md7UQ;R zfEf>LjMU3P2frpraXX_+362joA5OSACT!IJ8-(W@aI66XgHC~t-T{?2bt$c)Mc?Jt zD=eu}e&NMh^=Xb?2=x55K{U`p6Ky=;1y6Vb9%;a!)2Wh%P9>Bysi?j~&0YN(27a)N zYJS%KR4!|e7R(uy1C8Op3!d;++R%wt&op3ve7WVthqsJx<&4T!4LFBJHP7085HM#{ z4m8k0)8Zlx9zD|lE--{8R=PCySw@Y3tABX!+7QnAt(c-lJ?R@`8H_Q9xvu_M257nR zfyW-htJ@n;*Vv+Oa_U?Pha^-8%n3=O7~Qdc>(98)_eB~GuFW@e^r^7EgAlOV7MsBsFz1sC$8ezKile5rN8yQ? z?r*?y-(Z26F21B5@Q&ni6!-Sg&{oCc2`up1;n^D`e1kt1U;}cu*Z4O94_rF{KKnl#n_FZy?)mt~HG6(o`nVO3 zHXgvn-5-zbJwj7g_^Gn4K_IrcQH$Qq7?Y0$8r)EYCa9=w(3EAq<8zbL)lbdV*8QKV zwY^h-Ws5a>q0tO;L*$Nt3r@Jv04;_lcY<7Hco_G)#IAgDmgcV8rs$L$Ih{iS?C4m_ zzsjo9wx|+*z-Y$4R5m$mYV_FF=pPH@m~)IVhq>gC3kO_)EiQMIqJ^d{?-gdbeCIzt z3JCjBiJ1jzXlc`tqM^Bsn;hgH`X!uj+y7>1tGLEkmmitFLQ|IeYO(h&t?&!c>cB7x zBRJ+9W6WVLIb(IZ{ILfn3Mca;Gdwc4ak4%%b^NvWZFHP?&7&9a2-(?_=&?C!rRI~a zf8czF@hB+~FxeiQq-F>B+d0<|zdiGoN%ZLKEl)>M^Rb7g!DN4Y{(m~~D#mf1ZleGI N002ovPDHLkV1g5yGWh@i literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/cube/godot.png.import b/mono/2.5d/assets/cube/godot.png.import new file mode 100644 index 0000000000..0cc11e6bc9 --- /dev/null +++ b/mono/2.5d/assets/cube/godot.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/cube/godot.png" +dest_files=[ "res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/demo_scene.tscn b/mono/2.5d/assets/demo_scene.tscn new file mode 100644 index 0000000000..aaba91032e --- /dev/null +++ b/mono/2.5d/assets/demo_scene.tscn @@ -0,0 +1,614 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://addons/node25d-cs/YSort25D.cs" type="Script" id=1] +[ext_resource path="res://assets/ui/overlay.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/player/player_25d.tscn" type="PackedScene" id=4] +[ext_resource path="res://assets/shadow/shadow_25d.tscn" type="PackedScene" id=5] +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=6] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=7] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=8] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=9] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=3] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=4] +extents = Vector3( 5, 0.5, 5 ) + +[node name="DemoScene" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 3 )] + +[node name="Player25D" parent="." instance=ExtResource( 4 )] +position = Vector2( 0, -226.274 ) +z_index = -3952 + +[node name="Shadow25D" parent="." instance=ExtResource( 5 )] +visible = true +position = Vector2( 1.00261e-06, 11.2685 ) +z_index = -3958 +spatialPosition = Vector3( 3.13315e-08, -0.498, 3.13315e-08 ) + +[node name="Platform0" type="Node2D" parent="."] +position = Vector2( -256, -113.137 ) +z_index = -3954 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -8, 5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform0"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform0/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform0"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform1" type="Node2D" parent="."] +position = Vector2( -256, -339.411 ) +z_index = -3956 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -8, 5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform1"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform1/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform1"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform2" type="Node2D" parent="."] +position = Vector2( 0, 22.6274 ) +z_index = -3962 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 0, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform2"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform2/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform2"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform3" type="Node2D" parent="."] +position = Vector2( 320, 22.6274 ) +z_index = -3960 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform3"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform3/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform3"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform4" type="Node2D" parent="."] +position = Vector2( 0, -203.647 ) +z_index = -3966 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 0, -1, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform4"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform4/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform4"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform5" type="Node2D" parent="."] +position = Vector2( 320, -113.137 ) +z_index = -3984 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform5"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform5/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform5"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform6" type="Node2D" parent="."] +position = Vector2( 320, 113.137 ) +z_index = -3980 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform6"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform6/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform6"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform7" type="Node2D" parent="."] +position = Vector2( 320, 339.411 ) +z_index = -3978 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform7"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform7/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform7"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform8" type="Node2D" parent="."] +position = Vector2( 320, 565.685 ) +z_index = -3976 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform8"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform8/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform8"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform21" type="Node2D" parent="."] +position = Vector2( 320, 791.96 ) +z_index = -3972 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 30 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform21"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 30 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform21/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform21"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform22" type="Node2D" parent="."] +position = Vector2( 320, 1018.23 ) +z_index = -3970 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 40 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform22"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 40 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform22/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform22"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform9" type="Node2D" parent="."] +position = Vector2( 640, 339.411 ) +z_index = -3974 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 20, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform9"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform9/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform9"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform10" type="Node2D" parent="."] +position = Vector2( 896, 294.156 ) +z_index = -3994 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 3 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform10"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 3 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform10/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform10"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform11" type="Node2D" parent="."] +position = Vector2( 896, 520.431 ) +z_index = -3990 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 13 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform11"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 13 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform11/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform11"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform12" type="Node2D" parent="."] +position = Vector2( 896, 746.705 ) +z_index = -3988 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform12"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform12/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform12"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform13" type="Node2D" parent="."] +position = Vector2( 576, 746.705 ) +z_index = -3992 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 18, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform13"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 18, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform13/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform13"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform14" type="Node2D" parent="."] +position = Vector2( 256, 746.705 ) +z_index = -3996 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 8, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform14"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 8, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform14/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform14"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform15" type="Node2D" parent="."] +position = Vector2( -64, 746.705 ) +z_index = -3998 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -2, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform15"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform15/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform15"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform23" type="Node2D" parent="."] +position = Vector2( -384, 746.705 ) +z_index = -4000 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -12, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform23"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform23/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform23"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform16" type="Node2D" parent="."] +position = Vector2( -320, 565.685 ) +z_index = -3982 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform16"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform16/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform16"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform19" type="Node2D" parent="."] +position = Vector2( -320, 339.411 ) +z_index = -3986 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform19"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform19/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform19"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform17" type="Node2D" parent="."] +position = Vector2( -480, 248.902 ) +z_index = -3964 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -15, -1, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform17"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform17/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform17"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform18" type="Node2D" parent="."] +position = Vector2( -480, 22.6274 ) +z_index = -3968 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -15, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform18"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform18/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform18"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 1 ) diff --git a/mono/2.5d/assets/platform/platform.tscn b/mono/2.5d/assets/platform/platform.tscn new file mode 100644 index 0000000000..e9bbaefffd --- /dev/null +++ b/mono/2.5d/assets/platform/platform.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=3] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=4] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[node name="Platform" type="Node2D"] +z_index = -3954 +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 0, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="."] +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="."] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 3 ) +script = ExtResource( 4 ) diff --git a/mono/2.5d/assets/platform/platform_sprite.gd b/mono/2.5d/assets/platform/platform_sprite.gd new file mode 100644 index 0000000000..4b6dcb43cf --- /dev/null +++ b/mono/2.5d/assets/platform/platform_sprite.gd @@ -0,0 +1,39 @@ +tool +extends Sprite + +onready var _forty_five = preload("res://assets/platform/textures/forty_five.png") +onready var _isometric = preload("res://assets/platform/textures/isometric.png") +onready var _top_down = preload("res://assets/platform/textures/top_down.png") +onready var _front_side = preload("res://assets/platform/textures/front_side.png") +onready var _oblique_y = preload("res://assets/platform/textures/oblique_y.png") +onready var _oblique_z = preload("res://assets/platform/textures/oblique_z.png") + +func _process(_delta): + if Input.is_action_pressed("forty_five_mode"): + set_view_mode(0) + elif Input.is_action_pressed("isometric_mode"): + set_view_mode(1) + elif Input.is_action_pressed("top_down_mode"): + set_view_mode(2) + elif Input.is_action_pressed("front_side_mode"): + set_view_mode(3) + elif Input.is_action_pressed("oblique_y_mode"): + set_view_mode(4) + elif Input.is_action_pressed("oblique_z_mode"): + set_view_mode(5) + + +func set_view_mode(view_mode_index): + match view_mode_index: + 0: # 45 Degrees + texture = _forty_five; + 1: # Isometric + texture = _isometric + 2: # Top Down + texture = _top_down + 3: # Front Side + texture = _front_side + 4: # Oblique Y + texture = _oblique_y + 5: # Oblique Z + texture = _oblique_z diff --git a/mono/2.5d/assets/platform/textures/forty_five.png b/mono/2.5d/assets/platform/textures/forty_five.png new file mode 100644 index 0000000000000000000000000000000000000000..e4422bb3d1a0973be7236aa00bbb6ba7bfbadb49 GIT binary patch literal 2276 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sVEn_u1{85TD#rq(*pj^6T^JG=<}f6#J9{Ss zD8gCb5n0T@z%2~Ij105pNB{-dOFVsD*`F}UaBwnq-k2o9z`#-H>EaktaqI0Z!z?C8 ziMEG6GZtv(v~Xx%suYiYKdE@x6)i@?1p)_;Ik}#!U|t8GO;=}N5NH6J<-oweq5yQB0ML0H3=Iq{3=RxT3Sb z`m$m}xWm-yskID!_wDwSE)bpl^->&T=)2Hwj5C5hU29ajp}io#hM5DG6?j~L$6-{} zg~u>FVMK;5!U2xWP=rB;2}e!=>3T2`m|OT9 ztC>5-?4w6Yl% zU!?28l6+x?;Yr4%>r!Bt%Yd(T!C@&5VFFba9$gLYU9q+nEf0P<2)+?jV36K)|L-nv zuH!h+Hm8sMIxVtDkzlxe{5l4P0Kxsh>UA*35k|$|u;(trgfOT5hnyvhfb9_mPgg&e IbxsLQ0NEf6_W%F@ literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/forty_five.png.import b/mono/2.5d/assets/platform/textures/forty_five.png.import new file mode 100644 index 0000000000..3fbd8972a6 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/forty_five.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/forty_five.png" +dest_files=[ "res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/front_side.png b/mono/2.5d/assets/platform/textures/front_side.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3bdd78588f8f7bb99891c2a8e0a64efbc038a8 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xeZ8+F~Fdh=gh_@|-P~t+$}|QBMmJ9v$B>F!Z*L#ub#M@H z2y_wV;|l0p9e3sB8wJQG!5Xuh$E`JYhEGtq!s{L8cx z7#dQLRq{k10IHgx%kVw75a`Ly9ZYNt0u2ld91aW&Ky?gE0zhYSz)e6zDVO1}dJGJ~h9pUXO@geCwGiCUxp literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/front_side.png.import b/mono/2.5d/assets/platform/textures/front_side.png.import new file mode 100644 index 0000000000..eb4230ffbe --- /dev/null +++ b/mono/2.5d/assets/platform/textures/front_side.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/front_side.png" +dest_files=[ "res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/isometric.png b/mono/2.5d/assets/platform/textures/isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..7045d86bf7d78bac2f791e12f0bc4b78431dfe8e GIT binary patch literal 41122 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/isometric.png.import b/mono/2.5d/assets/platform/textures/isometric.png.import new file mode 100644 index 0000000000..e722a8d6e2 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/oblique_y.png b/mono/2.5d/assets/platform/textures/oblique_y.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0b0d24bfdec9ff4b91f86463bf07ba64654cd4 GIT binary patch literal 3148 zcmeAS@N?(olHy`uVBq!ia0y~yU|I#j9Be?5PpvgsK#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJUmtIx{)azMG8o-U3d6}R5r*ywxML82kh z`jn8!6%E%i5BJl0XAbIZDY>cWI>pNM7>Bfj)SL4^_FkLzu0;Lsuad{FZ~v}kU`Pnv zXJ>!xmz?=JPKJcqxNq%$l9vXsG6<}85@lf6s1?G<5K*#*E0lp@5}4z0Y!y&eK@ue0 zkTQ5AUX`6YYiIlZj>HG`yz84QS=SWB=_-clFMs^w#Qr#-CuZ1$wQ4aiboYiXW7%pgdN(1!z7<9+~C<1{{cwjTTr15ywU=0G$jH$3}x3 z4iZPEv3UgML2Mp@d5~z2z&wV{BQOtQ^9V>iDIS4&Y|wfLTa3Uwh#Vs@kHBbBJ%lx8 zU`Y=-iNRt9Mq`bkRmu#b37({!i#Ir-IT}5|&p1|g?r8q?&C(2F2lp_|m?uuf+#j*= z?VN6VU7DB=F9gNim->O-doZ)(I5eCQrP=acFok_$d^vlqyru!0Vqre=9TRS#h; zC-B4!%wwc_h}41)Z`HK$6$gFl6Y3Vfc!HJG;KWy-P&IwP3cx>E*3Tbpe|?jep*tat z(dT?O&@(VObefuJ3OToLsCaC^bNKYXf^rcC2A`KjR(bCs+)d1BuAX!gWKbLh* G2~7Yy_G*s+ literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/oblique_y.png.import b/mono/2.5d/assets/platform/textures/oblique_y.png.import new file mode 100644 index 0000000000..d7c1330f26 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/oblique_y.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_y.png" +dest_files=[ "res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/oblique_z.png b/mono/2.5d/assets/platform/textures/oblique_z.png new file mode 100644 index 0000000000000000000000000000000000000000..a859ccb6e140b3dfd7da2d7ce6841139420b1553 GIT binary patch literal 8917 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/oblique_z.png.import b/mono/2.5d/assets/platform/textures/oblique_z.png.import new file mode 100644 index 0000000000..044a1c0f38 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/oblique_z.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_z.png" +dest_files=[ "res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/top_down.png b/mono/2.5d/assets/platform/textures/top_down.png new file mode 100644 index 0000000000000000000000000000000000000000..53f9b83ee7cbc98099c95f02d2be444d1fc3e8e8 GIT binary patch literal 2686 zcmeAS@N?(olHy`uVBq!ia0y~yU}^wi4mO|&&)Jj8K#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJT@)7+jtRSXPV+@3CuAr-gY-f-k?FyL_r zR4_is$f)tKOZRBh>i3)s*+xrw~wm=Ux-Hx1?i1#rbUD!N=r}W0-ef+xcI008p0kn&5y2!4TNOU3o zK*CjTlCFzofhbY6F +/// Handles Player-specific behavior like moving. We calculate such things with KinematicBody. +/// +public class PlayerMath25D : KinematicBody +{ + private Node25D _parent; + public real_t verticalSpeed = 0; + public bool isometricControls = true; + + public override void _Ready() + { + _parent = GetParent(); + } + + public override void _Process(real_t delta) + { + if (Input.IsActionPressed("exit")) + { + GetTree().Quit(); + } + + if (Input.IsActionJustPressed("view_cube_demo")) + { + GetTree().ChangeScene("res://assets/cube/cube.tscn"); + return; + } + + if (Input.IsActionJustPressed("toggle_isometric_controls")) + { + isometricControls = !isometricControls; + } + + if (Input.IsActionPressed("reset_position")) + { + Transform = new Transform(Basis.Identity, Vector3.Up * 10); + verticalSpeed = 0; + } + else + { + HorizontalMovement(delta); + VerticalMovement(delta); + } + } + + /// + /// Checks WASD and Shift for horizontal movement via MoveAndSlide. + /// + private void HorizontalMovement(real_t delta) + { + Vector3 localX = Vector3.Right; + Vector3 localZ = Vector3.Back; + + if (isometricControls && _parent.Basis25D.x.IsEqualApprox(Basis25D.Isometric.x * Node25D.SCALE)) + { + localX = new Vector3(0.70710678118f, 0, -0.70710678118f); + localZ = new Vector3(0.70710678118f, 0, 0.70710678118f); + } + + // Gather player input and add directional movement to force Vector3 variables + Vector3 moveDir = Vector3.Zero; + moveDir += localX * (Input.GetActionStrength("move_right") - Input.GetActionStrength("move_left")); + moveDir += localZ * (Input.GetActionStrength("move_back") - Input.GetActionStrength("move_forward")); + + moveDir = moveDir.Normalized() * delta * 600; + if (Input.IsActionPressed("movement_modifier")) + { + moveDir /= 2; + } + MoveAndSlide(moveDir); + } + + /// + /// Checks Jump and applies gravity and vertical speed via MoveAndCollide. + /// + /// Time delta since last call + private void VerticalMovement(real_t delta) + { + if (Input.IsActionJustPressed("jump")) + { + verticalSpeed = 1.25f; + } + verticalSpeed -= delta * 5; // Gravity + var k = MoveAndCollide(Vector3.Up * verticalSpeed); + if (k != null) + { + verticalSpeed = 0; + } + } +} diff --git a/mono/2.5d/assets/player/PlayerSprite.cs b/mono/2.5d/assets/player/PlayerSprite.cs new file mode 100644 index 0000000000..70e338adc9 --- /dev/null +++ b/mono/2.5d/assets/player/PlayerSprite.cs @@ -0,0 +1,229 @@ +using Godot; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +public class PlayerSprite : Sprite +{ + private static Texture _stand = ResourceLoader.Load("res://assets/player/textures/stand.png"); + private static Texture _jump = ResourceLoader.Load("res://assets/player/textures/jump.png"); + private static Texture _run = ResourceLoader.Load("res://assets/player/textures/run.png"); + private const int FRAMERATE = 15; + + private int _direction; + private float _progress; + private Node25D _parent; + private PlayerMath25D _parentMath; + + public override void _Ready() + { + _parent = GetParent(); + _parentMath = _parent.GetChild(0); + } + + public override void _Process(real_t delta) + { + SpriteBasis(); + bool movement = CheckMovement(); // Always run to get direction, but don't always use return bool. + + // Test-only move and collide, check if the player is on the ground. + var k = _parentMath.MoveAndCollide(Vector3.Down * 10 * delta, true, true, true); + if (k != null) + { + if (movement) + { + // TODO: https://github.com/godotengine/godot/issues/28748 + Hframes = 6; + Texture = _run; + if (Input.IsActionPressed("movement_modifier")) + { + delta /= 2; + } + _progress = (_progress + FRAMERATE * delta) % 6; + Frame = _direction * 6 + (int)_progress; + } + else + { + Hframes = 1; + Texture = _stand; + _progress = 0; + Frame = _direction; + } + } + else + { + Hframes = 2; + Texture = _jump; + _progress = 0; + int jumping = _parentMath.verticalSpeed < 0 ? 1 : 0; + Frame = _direction * 2 + jumping; + } + } + + public void SetViewMode(int viewModeIndex) + { + Transform2D t = Transform; + switch (viewModeIndex) + { + case 0: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 0.75f); + break; + case 1: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 1); + break; + case 2: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 0.5f); + break; + case 3: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 1); + break; + case 4: + t.x = new Vector2(1, 0); + t.y = new Vector2(0.75f, 0.75f); + break; + case 5: + t.x = new Vector2(1, 0.25f); + t.y = new Vector2(0, 1); + break; + } + Transform = t; + } + + /// + /// Change the basis of the sprite to try and make it fit multiple view modes. + /// + private void SpriteBasis() + { + if (Input.IsActionPressed("forty_five_mode")) + { + SetViewMode(0); + } + else if (Input.IsActionPressed("isometric_mode")) + { + SetViewMode(1); + } + else if (Input.IsActionPressed("top_down_mode")) + { + SetViewMode(2); + } + else if (Input.IsActionPressed("front_side_mode")) + { + SetViewMode(3); + } + else if (Input.IsActionPressed("oblique_y_mode")) + { + SetViewMode(4); + } + else if (Input.IsActionPressed("oblique_z_mode")) + { + SetViewMode(5); + } + } + + // There might be a more efficient way to do this, but I can't think of it. + private bool CheckMovement() + { + // Gather player input and store movement to these int variables. Note: These indeed have to be integers. + int x = 0; + int z = 0; + + if (Input.IsActionPressed("move_right")) + { + x++; + } + if (Input.IsActionPressed("move_left")) + { + x--; + } + if (Input.IsActionPressed("move_forward")) + { + z--; + } + if (Input.IsActionPressed("move_back")) + { + z++; + } + + // Check for isometric controls and add more to movement accordingly. + // For efficiency, only check the X axis since this X axis value isn't used anywhere else. + if (!_parentMath.isometricControls && _parent.Basis25D.x.IsEqualApprox(Basis25D.Isometric.x * Node25D.SCALE)) + { + if (Input.IsActionPressed("move_right")) + { + z++; + } + if (Input.IsActionPressed("move_left")) + { + z--; + } + if (Input.IsActionPressed("move_forward")) + { + x++; + } + if (Input.IsActionPressed("move_back")) + { + x--; + } + } + + // Set the direction based on which inputs were pressed. + if (x == 0) + { + if (z == 0) + { + return false; // No movement + } + else if (z > 0) + { + _direction = 0; + } + else + { + _direction = 4; + } + } + else if (x > 0) + { + if (z == 0) + { + _direction = 2; + FlipH = true; + } + else if (z > 0) + { + _direction = 1; + FlipH = true; + } + else + { + _direction = 3; + FlipH = true; + } + } + else + { + if (z == 0) + { + _direction = 2; + FlipH = false; + } + else if (z > 0) + { + _direction = 1; + FlipH = false; + } + else + { + _direction = 3; + FlipH = false; + } + } + return true; // There is movement + } +} diff --git a/mono/2.5d/assets/player/player_25d.tscn b/mono/2.5d/assets/player/player_25d.tscn new file mode 100644 index 0000000000..8827fa273d --- /dev/null +++ b/mono/2.5d/assets/player/player_25d.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/player/PlayerMath25D.cs" type="Script" id=3] +[ext_resource path="res://assets/player/textures/stand.png" type="Texture" id=4] +[ext_resource path="res://assets/player/PlayerSprite.cs" type="Script" id=5] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 0.5, 1, 0.5 ) + +[node name="Player25D" type="Node2D"] +position = Vector2( 0, -226.274 ) +z_index = 100 +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 10, 0 ) + +[node name="PlayerMath25D" type="KinematicBody" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0 ) +script = ExtResource( 3 ) + +[node name="CollisionShape" type="CollisionShape" parent="PlayerMath25D"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlayerSprite" type="Sprite" parent="."] +scale = Vector2( 1, 0.75 ) +z_index = 1 +texture = ExtResource( 4 ) +vframes = 5 +script = ExtResource( 5 ) + +[node name="PlayerCamera" type="Camera2D" parent="PlayerSprite"] +current = true diff --git a/mono/2.5d/assets/player/textures/jump.png b/mono/2.5d/assets/player/textures/jump.png new file mode 100755 index 0000000000000000000000000000000000000000..340d72b8ba12eecd862a95d1639746a58983c27e GIT binary patch literal 3744 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 S+Y?v5Mc};8-M(TEJ@J3yPrQc! literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/player/textures/jump.png.import b/mono/2.5d/assets/player/textures/jump.png.import new file mode 100644 index 0000000000..bdbb55e431 --- /dev/null +++ b/mono/2.5d/assets/player/textures/jump.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/jump.png-ee91d86ec39d8c1dde239a382e843e86.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/player/textures/jump.png" +dest_files=[ "res://.import/jump.png-ee91d86ec39d8c1dde239a382e843e86.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/player/textures/run.png b/mono/2.5d/assets/player/textures/run.png new file mode 100644 index 0000000000000000000000000000000000000000..900742aea3dbddd893d976d8779c737a2efb4ddf GIT binary patch literal 8034 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/player/textures/run.png.import b/mono/2.5d/assets/player/textures/run.png.import new file mode 100644 index 0000000000..90a63b5175 --- /dev/null +++ b/mono/2.5d/assets/player/textures/run.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/player/textures/run.png" +dest_files=[ "res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/player/textures/stand.png b/mono/2.5d/assets/player/textures/stand.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbc364fda0199448087c36b0ff09634035f95eb GIT binary patch literal 1844 zcmV-42g~@0P)oJPz48Z0p+QFMopxgIb!DOi7RSXH@;Y>aMaIa)E100001 zbW%=J06^y0W&i*NvPnciRCwCm+5v2xGWp}R}0vzH zo9@%=s2veNA~pdL+DMIdj(sT0!-N_I-G{Gz3Z700@cvy6pZx@q#gYOh$LBAQ2Dfv$ z_vqPPI=!dBFJud`n>OyLLzsx~BEAug_4a)od`~YHtTmgqRvL7vd8FIJQ*+ zV_QA}T-!P}=E}Ar5;PrS{5A($HWaKstbKP7vwGV0EBppVE>y!{OXXK zN8`VV0Bi<0w&im`1-2C{1|Zty#sF|r8Nm+V?{%QL0qy@D>?=$qDtag%6~j~>70*a8 zfKDn0;L!u=$Ege)a>bC~^n@7sK!GMeC`3k|#y&WS5V;T3Y2+%fg^;l#CsM@p;d^^& z{qVg*y%YH%c7V?hz5{%I_%Wy>77XJTBNjk0aCrd00qY>*L9?BMn+Uq{kH(l}2PqA@ zPxbj#zipGC$`2v9T?)uDKVT9e2}Bbx^5TF7{a*q=K1xWCfA%TB8~r^J{QCKi0N*T@ zB>2r&NBCDw1Nn#KWbc5^4B=J90>aFQ=6b{8sX zva?(ZlO`N;yTD{$bvfWBEvx}eZVs|401S}&^_T;)55+TJK&Bw(fb_w~t_o-nLx3km z5t0BEY6&o=XDHMnQ*Owdr4W4x(wcQK=7G=u!zMhim17NHZuxg8Kg6}~AD|{blz`6< zjtY7#_(oBTSkM{3PWhq!AO&Kg`THd~zhQwsH`gf#UYl3^X`<5yn*-oEs?C5e54->m zIWVdPm?`!c6efDf088(kEjS>uLd|~90_;xj`A74d2k)81YHc&%e6e2rvCV+T=GEBe zKr3=X;6M{%9<)$}5eG6n8Y2fT)x`}9es^YWu*-qD(JExX?dtAPG3J4eJRaO|K>lF0 zzR@WIlGS=H*n9G~3m)jR8lcAKD;C6kPuBpq%Y#g*lmS|0$N`PR9FPXGQv>=iQY^@D zsQN5WDvUTFwblVLpfbg%$AS~+@be`2E^?p`4i9qQ!6O#LL97LPvDl}k5;_(C5BcHi zJHLMjcFPZ=T7X!j9OxBARJZ!W&cHpf**FOavtG!PQ0r4Vd0S2Ii7{6>30e_k#|FDJ zKsQH>+9?U*pzlV|UQ!_MB~X@kPXT#)5tSghXO@#70!-FR1|Xt+OM>ZqRD$$7e_}ym zeTxAF;#iW;r*$#8)OtdL=EY=c%%wyUbS94%cdrg&65z|&nBf~7Qy@OUSoxomvlPT9 z5deH%5WsS~76Q1f5edS^HA3fSNC1gp!ysN<76iz9q&zSdpU+Y zIE~ZBdRczx^@Imi{YSvmfK&651(OWgHGs`oAD9~OxB_e#G&elxJE00VkVjrE7zSew zU{Vww3(8%1HOGJq&{%uC%DSu;g|&y>s~HoyT5&S zN8Uf|oF6KXa$pG1tIH3g+SPw|uv7oTRfw29`QP?G;L~el`yX7yi0gmIp{#`If5@wG zNSOYI49f~)FkMM=?F2Ni+nq1DSLKf0OMCfK<_LJl^dlM*2R7eMGF1jq`+5?~Qh;AjJe6p*SYQdtx#CBfz&NFcHeU_y*i iX|-{$AHI0|!#@EBKxsdV&|Pr=0000^ttsS|C1Qh#q*iUI9l3C)@oM_LPySm0~NHvE&!rc+^nr#5B&s@9nb1DxvA{wQ(gQ5f)}Gl}0w?F%E^moh6> z2_vnUI3}P_9 zBg>xlMqCXRRj0000$)mS!;JSYUV)S{{q9@d+)j4YUnDI zrWUsL4oy#4l!|#b$meMaz}G={Sp)JL|X`i-gARb|Rsj zyGkTf<$pl_FUVhn`P(r6Aj&$5^Dm?P>o|WP$sft`htmA9JpW;m|1^911eq0s%gEld Q?f?J)07*qoM6N<$g5P;`umAu6 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/shadow/textures/isometric.png.import b/mono/2.5d/assets/shadow/textures/isometric.png.import new file mode 100644 index 0000000000..9c56cf1f70 --- /dev/null +++ b/mono/2.5d/assets/shadow/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/shadow/textures/oblique_y.png b/mono/2.5d/assets/shadow/textures/oblique_y.png new file mode 100644 index 0000000000000000000000000000000000000000..f48cf507ec98a6085512de5b6f4976655022ab9c GIT binary patch literal 353 zcmV-n0iOPeP)wJy5m1AGqoIY28f6x4_C%dLxzT|-I(VrE z33Zlu@aGa5AWgjdievorn&-Hn!4~S_$Y`*Pqgp@{1S)wniRZ^6nj}`wZ+QnhnrP=+ z4o&9x(uyWqtp->bq6}1CfXPePkb#X-Kn4P(gbXA~Co*tS%E&;bbRh%RKl%XUUtm8% z`)Byko*fhb0Kgy!?BALg_hBKXf_+5(75gyqaqJ6;uVlQG@>=ePiJxYEocek00fk32 z9#VNs=Ru`MwH{V`Tj00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliruQ8)X#7@z0ZNE))_dSjwe>7%xR-wAFER#y{P+j`~9BbZluwQOiv%G+asu37hpr z%1|x=LiW7beeulm-E+?GTsBC$d>*6d4qf#sCkG3Ks!49E*I=guS&ExZ2q)Uw9SU`1nQOu4OJR*+nJOXA3y zUo5IeU11`FCd_zOStPuHge!ubGa+_h>H4s&+deX5RKIMOv51VR*o>~JwjmYwP0HUW z&q2XmgV8k(mQ>6dck2QXTpu@}99^lpd**y#pr;~fmr4F|*oaxPMnyfBeWIn+`I@|Y z9;hhx=+m*)z3v1nnDfwR*ShQES3|WEY}jYMFqD!{ZNJv-L>I_>+?PJqmm;cZ%cf>@ zPBl}$H7%baDi-_8>RDLEwC~LHI1SEcY{i0_Gol{%wW(A=WbB!@(|&zh77x6ilKxJb zLd`QP;&zKXwz98$BA+TMX!*muz2km-{QS_YKIvNQv7c<7H2=1ZnNv#Dr^JCj{b>E| zNdvchY9iHa1$%z?gIA}=8o{KBT#Bf?sz>HequQ{d_Y9_5SF0XdIE!k-223clm#tJp zvEh3gY8Pz>L0KskR90-$hM%pq>*_o#qhvUh@;&g6=bqZ{y!S{+8m~ODVEM8bMW~B! zJotmGLrsgG__y5wFN4LZ4sKY`SuI=s^P44gM^~?pY*}%?t6m?_61=o()w8QSIvvJe zjT-49a7_)no?Er$Wq035?kLMkB!VDF zBoY}}vDetKVN=zzJ)!&B45xmDCQO?&q=*p3t4lno}ET3|f ep}_{kV`yMjaA08Us+(U9;(5CIxvXiWR}k0J>)@%+m2K;1E;{LE z?Uax^$L;igDIG(Vz>@#}|Gz1+js_}XED7=pW^j0RBMr!z?CIhdQgQ3(IY&`vMIM)n zQ5~%t1-O$Lxg!oRi4{aITgWb=l7Dg16TN@W&-%UB6MoSUydbBbU;HU^xy{aS2HkuI zRt49FAF7`nv+w+Eytno#^ZkcQ%2{93_WZE Date: Sat, 29 Feb 2020 22:37:25 -0500 Subject: [PATCH 2/7] 2.5D Demo Project for GDScript Co-authored-by: Stephen Agbete (Steph155) --- misc/2.5d/README.md | 19 + .../node25d/.broken-gdscripts/Basis25D.gd | 52 ++ .../node25d/.broken-gdscripts/Transform25D.gd | 22 + misc/2.5d/addons/node25d/Node25D.gd | 131 ++++ misc/2.5d/addons/node25d/ShadowMath25D.gd | 33 + misc/2.5d/addons/node25d/YSort25D.gd | 46 ++ .../node25d/icons/kinematic_body_25d.png | Bin 0 -> 1682 bytes .../icons/kinematic_body_25d.png.import | 34 + misc/2.5d/addons/node25d/icons/node25d.png | Bin 0 -> 1818 bytes .../addons/node25d/icons/node25d.png.import | 34 + .../addons/node25d/icons/node25d_icon.png | Bin 0 -> 293 bytes .../node25d/icons/node25d_icon.png.import | 34 + .../addons/node25d/icons/shadowmath25d.png | Bin 0 -> 2118 bytes .../node25d/icons/shadowmath25d.png.import | 34 + .../node25d/icons/shadowmath25d_icon.png | Bin 0 -> 473 bytes .../icons/shadowmath25d_icon.png.import | 34 + misc/2.5d/addons/node25d/icons/ysort25d.png | Bin 0 -> 366 bytes .../addons/node25d/icons/ysort25d.png.import | 34 + .../addons/node25d/icons/ysort25d_icon.png | Bin 0 -> 241 bytes .../node25d/icons/ysort25d_icon.png.import | 34 + misc/2.5d/addons/node25d/node25d_plugin.gd | 16 + misc/2.5d/addons/node25d/plugin.cfg | 7 + misc/2.5d/assets/DemoScene.tscn | 592 ++++++++++++++++++ misc/2.5d/assets/cube/Cube.tscn | 22 + misc/2.5d/assets/cube/CubeMath.gd | 52 ++ misc/2.5d/assets/cube/CubePoint.tscn | 16 + misc/2.5d/assets/cube/godot.png | Bin 0 -> 2130 bytes misc/2.5d/assets/cube/godot.png.import | 34 + misc/2.5d/assets/platform/Platform.tscn | 31 + misc/2.5d/assets/platform/PlatformSprite.gd | 39 ++ .../41226408-platform-texture.jpg.import | 34 + .../assets/platform/textures/fortyfive.png | Bin 0 -> 2276 bytes .../platform/textures/fortyfive.png.import | 34 + .../assets/platform/textures/frontside.png | Bin 0 -> 441 bytes .../platform/textures/frontside.png.import | 34 + .../assets/platform/textures/isometric.png | Bin 0 -> 41122 bytes .../platform/textures/isometric.png.import | 34 + .../assets/platform/textures/obliqueY.png | Bin 0 -> 3148 bytes .../platform/textures/obliqueY.png.import | 34 + .../assets/platform/textures/obliqueZ.png | Bin 0 -> 8917 bytes .../platform/textures/obliqueZ.png.import | 34 + .../2.5d/assets/platform/textures/topdown.png | Bin 0 -> 2686 bytes .../platform/textures/topdown.png.import | 34 + misc/2.5d/assets/player/Player25D.tscn | 38 ++ misc/2.5d/assets/player/PlayerMath25D.gd | 58 ++ misc/2.5d/assets/player/PlayerSprite.gd | 143 +++++ misc/2.5d/assets/player/textures/jump.png | Bin 0 -> 3809 bytes .../assets/player/textures/jump.png.import | 34 + misc/2.5d/assets/player/textures/run.png | Bin 0 -> 8034 bytes .../assets/player/textures/run.png.import | 34 + misc/2.5d/assets/player/textures/stand.png | Bin 0 -> 1844 bytes .../assets/player/textures/stand.png.import | 34 + misc/2.5d/assets/shadow/Shadow25D.tscn | 37 ++ misc/2.5d/assets/shadow/ShadowSprite.gd | 39 ++ .../2.5d/assets/shadow/textures/fortyfive.png | Bin 0 -> 396 bytes .../shadow/textures/fortyfive.png.import | 34 + .../2.5d/assets/shadow/textures/frontside.png | Bin 0 -> 84 bytes .../shadow/textures/frontside.png.import | 34 + .../2.5d/assets/shadow/textures/isometric.png | Bin 0 -> 266 bytes .../shadow/textures/isometric.png.import | 34 + misc/2.5d/assets/shadow/textures/obliqueY.png | Bin 0 -> 353 bytes .../shadow/textures/obliqueY.png.import | 34 + misc/2.5d/assets/shadow/textures/obliqueZ.png | Bin 0 -> 597 bytes .../shadow/textures/obliqueZ.png.import | 34 + misc/2.5d/assets/shadow/textures/topdown.png | Bin 0 -> 87 bytes .../assets/shadow/textures/topdown.png.import | 34 + misc/2.5d/assets/ui/ControlHints.gd | 5 + misc/2.5d/assets/ui/Overlay.tscn | 28 + misc/2.5d/assets/ui/OverlayCube.tscn | 28 + misc/2.5d/default_env.tres | 7 + misc/2.5d/icon.png | Bin 0 -> 262 bytes misc/2.5d/icon.png.import | 34 + misc/2.5d/project.godot | 192 ++++++ 73 files changed, 2503 insertions(+) create mode 100644 misc/2.5d/README.md create mode 100644 misc/2.5d/addons/node25d/.broken-gdscripts/Basis25D.gd create mode 100644 misc/2.5d/addons/node25d/.broken-gdscripts/Transform25D.gd create mode 100644 misc/2.5d/addons/node25d/Node25D.gd create mode 100644 misc/2.5d/addons/node25d/ShadowMath25D.gd create mode 100644 misc/2.5d/addons/node25d/YSort25D.gd create mode 100644 misc/2.5d/addons/node25d/icons/kinematic_body_25d.png create mode 100644 misc/2.5d/addons/node25d/icons/kinematic_body_25d.png.import create mode 100644 misc/2.5d/addons/node25d/icons/node25d.png create mode 100644 misc/2.5d/addons/node25d/icons/node25d.png.import create mode 100644 misc/2.5d/addons/node25d/icons/node25d_icon.png create mode 100644 misc/2.5d/addons/node25d/icons/node25d_icon.png.import create mode 100644 misc/2.5d/addons/node25d/icons/shadowmath25d.png create mode 100644 misc/2.5d/addons/node25d/icons/shadowmath25d.png.import create mode 100644 misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png create mode 100644 misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png.import create mode 100644 misc/2.5d/addons/node25d/icons/ysort25d.png create mode 100644 misc/2.5d/addons/node25d/icons/ysort25d.png.import create mode 100644 misc/2.5d/addons/node25d/icons/ysort25d_icon.png create mode 100644 misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import create mode 100644 misc/2.5d/addons/node25d/node25d_plugin.gd create mode 100644 misc/2.5d/addons/node25d/plugin.cfg create mode 100644 misc/2.5d/assets/DemoScene.tscn create mode 100644 misc/2.5d/assets/cube/Cube.tscn create mode 100644 misc/2.5d/assets/cube/CubeMath.gd create mode 100644 misc/2.5d/assets/cube/CubePoint.tscn create mode 100644 misc/2.5d/assets/cube/godot.png create mode 100644 misc/2.5d/assets/cube/godot.png.import create mode 100644 misc/2.5d/assets/platform/Platform.tscn create mode 100644 misc/2.5d/assets/platform/PlatformSprite.gd create mode 100644 misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import create mode 100644 misc/2.5d/assets/platform/textures/fortyfive.png create mode 100644 misc/2.5d/assets/platform/textures/fortyfive.png.import create mode 100644 misc/2.5d/assets/platform/textures/frontside.png create mode 100644 misc/2.5d/assets/platform/textures/frontside.png.import create mode 100644 misc/2.5d/assets/platform/textures/isometric.png create mode 100644 misc/2.5d/assets/platform/textures/isometric.png.import create mode 100644 misc/2.5d/assets/platform/textures/obliqueY.png create mode 100644 misc/2.5d/assets/platform/textures/obliqueY.png.import create mode 100644 misc/2.5d/assets/platform/textures/obliqueZ.png create mode 100644 misc/2.5d/assets/platform/textures/obliqueZ.png.import create mode 100644 misc/2.5d/assets/platform/textures/topdown.png create mode 100644 misc/2.5d/assets/platform/textures/topdown.png.import create mode 100644 misc/2.5d/assets/player/Player25D.tscn create mode 100644 misc/2.5d/assets/player/PlayerMath25D.gd create mode 100644 misc/2.5d/assets/player/PlayerSprite.gd create mode 100755 misc/2.5d/assets/player/textures/jump.png create mode 100644 misc/2.5d/assets/player/textures/jump.png.import create mode 100644 misc/2.5d/assets/player/textures/run.png create mode 100644 misc/2.5d/assets/player/textures/run.png.import create mode 100644 misc/2.5d/assets/player/textures/stand.png create mode 100644 misc/2.5d/assets/player/textures/stand.png.import create mode 100644 misc/2.5d/assets/shadow/Shadow25D.tscn create mode 100644 misc/2.5d/assets/shadow/ShadowSprite.gd create mode 100644 misc/2.5d/assets/shadow/textures/fortyfive.png create mode 100644 misc/2.5d/assets/shadow/textures/fortyfive.png.import create mode 100644 misc/2.5d/assets/shadow/textures/frontside.png create mode 100644 misc/2.5d/assets/shadow/textures/frontside.png.import create mode 100644 misc/2.5d/assets/shadow/textures/isometric.png create mode 100644 misc/2.5d/assets/shadow/textures/isometric.png.import create mode 100644 misc/2.5d/assets/shadow/textures/obliqueY.png create mode 100644 misc/2.5d/assets/shadow/textures/obliqueY.png.import create mode 100644 misc/2.5d/assets/shadow/textures/obliqueZ.png create mode 100644 misc/2.5d/assets/shadow/textures/obliqueZ.png.import create mode 100644 misc/2.5d/assets/shadow/textures/topdown.png create mode 100644 misc/2.5d/assets/shadow/textures/topdown.png.import create mode 100644 misc/2.5d/assets/ui/ControlHints.gd create mode 100644 misc/2.5d/assets/ui/Overlay.tscn create mode 100644 misc/2.5d/assets/ui/OverlayCube.tscn create mode 100644 misc/2.5d/default_env.tres create mode 100644 misc/2.5d/icon.png create mode 100644 misc/2.5d/icon.png.import create mode 100644 misc/2.5d/project.godot diff --git a/misc/2.5d/README.md b/misc/2.5d/README.md new file mode 100644 index 0000000000..0b762b9d62 --- /dev/null +++ b/misc/2.5d/README.md @@ -0,0 +1,19 @@ +# 2.5D Demo Project (GDScript) + +This demo project is an example of how a 2.5D game could be created in Godot. + +Controls: WASD to move, Space to jump, R to reset, and UIOPKL to change view modes. + +Note: There is a Mono C# version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/mono/2.5d). + +## How does it work? + +Custom node types are added in a Godot plugin to allow 2.5D objects. Node25D serves as the base for all 2.5D objects; its first child must be a Spatial, which is used to calculate its position. It also adds YSort25D to sort Node25D nodes, and ShadowMath25D for calculating a shadow (a simple KinematicBody that tries to cast downward). + +It uses math inside of Node25D to calculate 2D positions from 3D ones. For getting a 3D position, this project uses KinematicBody and StaticBody (3D), but these only exist for math - the camera is 2D and all sprites are 2D. You are able to use any Spatial node for math. + +To display the objects, add a Sprite or any other Node2D-derived children to your Node25D objects. Some nodes are unsuitable, such as 2D physics nodes. Keep in mind that the first child must be Spatial-derived for math purposes. + +Several view modes are implemented, including top down, front side, 45 degree, isometric, and two oblique modes. To implement a different view angle, all you need to do is create a new set of basis vectors in Node25D, use it on all instances, and of course create textures to display that object in 2D. + +## Screenshots diff --git a/misc/2.5d/addons/node25d/.broken-gdscripts/Basis25D.gd b/misc/2.5d/addons/node25d/.broken-gdscripts/Basis25D.gd new file mode 100644 index 0000000000..6b7817fd09 --- /dev/null +++ b/misc/2.5d/addons/node25d/.broken-gdscripts/Basis25D.gd @@ -0,0 +1,52 @@ +# Currently broken unless Godot makes this kind of thing possible: +# https://github.com/godotengine/godot/issues/21461 +# https://github.com/godotengine/godot-proposals/issues/279 + +# Basis25D structure for performing 2.5D transform math. +# Note: All code assumes that Y is UP in 3D, and DOWN in 2D. +# Meaning, a top-down view has a Y axis component of (0, 0), with a Z axis component of (0, 1). +# For a front side view, Y is (0, -1) and Z is (0, 0). +# Remember that Godot's 2D mode has the Y axis pointing DOWN on the screen. + +class_name Basis25D + +var x: Vector2 = Vector2() +var y: Vector2 = Vector2() +var z: Vector2 = Vector2() + +static func top_down(): + return init(1, 0, 0, 0, 0, 1) + +static func front_side(): + return init(1, 0, 0, -1, 0, 0) + +static func forty_five(): + return init(1, 0, 0, -0.70710678118, 0, 0.70710678118) + +static func isometric(): + return init(0.86602540378, 0.5, 0, -1, -0.86602540378, 0.5) + +static func oblique_y(): + return init(1, 0, -1, -1, 0, 1) + +static func oblique_z(): + return init(1, 0, 0, -1, -1, 1) + +# Creates a Dimetric Basis25D from the angle between the Y axis and the others. +# Dimetric(2.09439510239) is the same as Isometric. +# Try to keep this number away from a multiple of Tau/4 (or Pi/2) radians. +static func dimetric(angle): + var sine = sin(angle) + var cosine = cos(angle) + return init(sine, -cosine, 0, -1, -sine, -cosine) + +static func init(xx, xy, yx, yy, zx, zy): + var xv = Vector2(xx, xy) + var yv = Vector2(yx, yy) + var zv = Vector2(zx, zy) + return Basis25D.new(xv, yv, zv) + +func _init(xAxis: Vector2, yAxis: Vector2, zAxis: Vector2): + x = xAxis + y = yAxis + z = zAxis diff --git a/misc/2.5d/addons/node25d/.broken-gdscripts/Transform25D.gd b/misc/2.5d/addons/node25d/.broken-gdscripts/Transform25D.gd new file mode 100644 index 0000000000..d4ed88102f --- /dev/null +++ b/misc/2.5d/addons/node25d/.broken-gdscripts/Transform25D.gd @@ -0,0 +1,22 @@ +# Currently broken unless Godot makes this kind of thing possible: +# https://github.com/godotengine/godot/issues/21461 +# https://github.com/godotengine/godot-proposals/issues/279 + +# Calculates the 2D transformation from a 3D position and a Basis25D. + +class_name Transform25D + +var spatial_position: Vector3 = Vector3() +var basis #: Basis25D + +func flat_transform(): + return Transform2D(0, flat_position()) + +func flat_position(): + var pos = spatial_position.x * basis.x + pos += spatial_position.y * basis.y + pos += spatial_position.z * basis.z + return pos + +func _init(basis25d): + basis = basis25d diff --git a/misc/2.5d/addons/node25d/Node25D.gd b/misc/2.5d/addons/node25d/Node25D.gd new file mode 100644 index 0000000000..100acc0e64 --- /dev/null +++ b/misc/2.5d/addons/node25d/Node25D.gd @@ -0,0 +1,131 @@ +# This node converts a 3D position to 2D using a 2.5D transformation matrix. +# The transformation of its 2D form is controlled by its 3D child. +tool +extends Node2D +class_name Node25D, "res://addons/node25d/icons/node25d_icon.png" + +# SCALE is the number of 2D units in one 3D unit. Ideally, but not necessarily, an integer. +const SCALE = 32 + +# Exported spatial position for editor usage. +export(Vector3) var spatial_position setget set_spatial_position, get_spatial_position + +# GDScript throws errors when Basis25D is its own structure. +# There is a broken implementation in a hidden folder. +# https://github.com/godotengine/godot/issues/21461 +# https://github.com/godotengine/godot-proposals/issues/279 +var _basisX: Vector2 +var _basisY: Vector2 +var _basisZ: Vector2 + +# Cache the spatial stuff for internal use. +var _spatial_position: Vector3 +var _spatial_node: Spatial + + +# These are separated in case anyone wishes to easily extend Node25D. +func _ready(): + Node25D_ready() + + +func _process(_delta): + Node25D_process() + + +# Call this method in _ready, or before Node25D_process is first ran. +func Node25D_ready(): + _spatial_node = get_child(0) + # Changing the values here will change the default for all Node25D instances. + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(0, -0.70710678118) + _basisZ = SCALE * Vector2(0, 0.70710678118) + + +# Call this method in _process, or whenever the position of this object changes. +func Node25D_process(): + _check_view_mode() + if _spatial_node == null: + return + _spatial_position = _spatial_node.translation + + var flat_pos = _spatial_position.x * _basisX + flat_pos += _spatial_position.y * _basisY + flat_pos += _spatial_position.z * _basisZ + + global_position = flat_pos + + +func get_basis(): + return [_basisX, _basisY, _basisZ] + + +func get_spatial_position(): + if !_spatial_node: + _spatial_node = get_child(0) + return _spatial_node.translation + + +func set_spatial_position(value): + _spatial_position = value + if _spatial_node: + _spatial_node.translation = value + elif get_child_count() > 0: + _spatial_node = get_child(0) + + +# Change the basis based on the view_mode_index argument. +# This can be changed or removed in actual games where you only need one view mode. +func set_view_mode(view_mode_index): + match view_mode_index: + 0: # 45 Degrees + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(0, -0.70710678118) + _basisZ = SCALE * Vector2(0, 0.70710678118) + 1: # Isometric + _basisX = SCALE * Vector2(0.86602540378, 0.5) + _basisY = SCALE * Vector2(0, -1) + _basisZ = SCALE * Vector2(-0.86602540378, 0.5) + 2: # Top Down + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(0, 0) + _basisZ = SCALE * Vector2(0, 1) + 3: # Front Side + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(0, -1) + _basisZ = SCALE * Vector2(0, 0) + 4: # Oblique Y + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(-0.70710678118, -0.70710678118) + _basisZ = SCALE * Vector2(0, 1) + 5: # Oblique Z + _basisX = SCALE * Vector2(1, 0) + _basisY = SCALE * Vector2(0, -1) + _basisZ = SCALE * Vector2(-0.70710678118, 0.70710678118) + + +# Check if anyone presses the view mode buttons and change the basis accordingly. +# This can be changed or removed in actual games where you only need one view mode. +func _check_view_mode(): + if Input.is_action_just_pressed("forty_five_mode"): + set_view_mode(0) + elif Input.is_action_just_pressed("isometric_mode"): + set_view_mode(1) + elif Input.is_action_just_pressed("top_down_mode"): + set_view_mode(2) + elif Input.is_action_just_pressed("front_side_mode"): + set_view_mode(3) + elif Input.is_action_just_pressed("oblique_y_mode"): + set_view_mode(4) + elif Input.is_action_just_pressed("oblique_z_mode"): + set_view_mode(5) + + +# Used by YSort25D +static func y_sort(a: Node25D, b: Node25D): + return a._spatial_position.y < b._spatial_position.y + + +static func y_sort_slight_xz(a: Node25D, b: Node25D): + var a_index = a._spatial_position.y + 0.001 * (a._spatial_position.x + a._spatial_position.z) + var b_index = b._spatial_position.y + 0.001 * (b._spatial_position.x + b._spatial_position.z) + return a_index < b_index diff --git a/misc/2.5d/addons/node25d/ShadowMath25D.gd b/misc/2.5d/addons/node25d/ShadowMath25D.gd new file mode 100644 index 0000000000..77e20cef8e --- /dev/null +++ b/misc/2.5d/addons/node25d/ShadowMath25D.gd @@ -0,0 +1,33 @@ +# Adds a simple shadow below an object. +# Place this ShadowMath25D node as a child of a Shadow25D, which +# is below the target object in the scene tree (not as a child). +tool +extends KinematicBody +class_name ShadowMath25D, "res://addons/node25d/icons/shadowmath25d_icon.png" + +# The maximum distance below objects that shadows will appear (in 3D units). +var shadow_length = 1000.0 +var _shadow_root: Node25D +var _target_math: Spatial + + +func _ready(): + _shadow_root = get_parent() + var index = _shadow_root.get_position_in_parent() + if (index > 0): # Else, Shadow is not in a valid place. + _target_math = _shadow_root.get_parent().get_child(index - 1).get_child(0) + + +func _process(_delta): + if _target_math == null: + if _shadow_root != null: + _shadow_root.visible = false + return # Shadow is not in a valid place or you're viewing the Shadow25D scene. + + translation = _target_math.translation + var k = move_and_collide(Vector3.DOWN * shadow_length) + if k == null: + _shadow_root.visible = false + else: + _shadow_root.visible = true + global_transform = transform diff --git a/misc/2.5d/addons/node25d/YSort25D.gd b/misc/2.5d/addons/node25d/YSort25D.gd new file mode 100644 index 0000000000..071fa206c0 --- /dev/null +++ b/misc/2.5d/addons/node25d/YSort25D.gd @@ -0,0 +1,46 @@ +# Sorts all Node25D children of its parent. +# This is different from the C# version of this project +# because the execution order is different and otherwise +# sorting is delayed by one frame. +tool +extends Node # Note: NOT Node2D, Node25D, or YSort +class_name YSort25D, "res://addons/node25d/icons/ysort25d_icon.png" + +# Whether or not to automatically call sort() in _process(). +export(bool) var sort_enabled := true +var _parent_node: Node2D # NOT Node25D + + +func _ready(): + _parent_node = get_parent() + + +func _process(_delta): + if sort_enabled: + sort() + + +# Call this method in _process, or whenever you want to sort children. +func sort(): + if _parent_node == null: + return # _ready() hasn't been run yet + var parent_children = _parent_node.get_children() + if parent_children.size() > 4000: + # The Z index only goes from -4096 to 4096, and we want room for objects having multiple layers. + printerr("Sorting failed: Max number of YSort25D nodes is 4000.") + return + + # We only want to get Node25D children. + # Currently, it also grabs Node2D children. + var node25d_nodes = [] + for n in parent_children: + if n.get_class() == "Node2D": + node25d_nodes.append(n) + node25d_nodes.sort_custom(Node25D, "y_sort_slight_xz") + + var z_index = -4000 + for i in range(0, node25d_nodes.size()): + node25d_nodes[i].z_index = z_index + # Increment by 2 each time, to allow for shadows in-between. + # This does mean that we have a limit of 4000 total sorted Node25Ds. + z_index += 2 diff --git a/misc/2.5d/addons/node25d/icons/kinematic_body_25d.png b/misc/2.5d/addons/node25d/icons/kinematic_body_25d.png new file mode 100644 index 0000000000000000000000000000000000000000..2780a094fb5cbf7460f1ea14d47bcb2d666e2e1c GIT binary patch literal 1682 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 O!{F)a=d#Wzp$PyD`g{lg literal 0 HcmV?d00001 diff --git a/misc/2.5d/addons/node25d/icons/ysort25d.png.import b/misc/2.5d/addons/node25d/icons/ysort25d.png.import new file mode 100644 index 0000000000..b187da888f --- /dev/null +++ b/misc/2.5d/addons/node25d/icons/ysort25d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ysort25d.png-d31f6d31844267009448064818383c0d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d/icons/ysort25d.png" +dest_files=[ "res://.import/ysort25d.png-d31f6d31844267009448064818383c0d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/addons/node25d/icons/ysort25d_icon.png b/misc/2.5d/addons/node25d/icons/ysort25d_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e362220e25527cc9680522afcfc8cefd2c9a255 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE08`n;T;g2?SBg=(HKA} zG<3D&kDC6@CZJ}ak|4iehNfo5y8rckzb7y-^!C-(H8vS^AF%|=hI+a06| zlcBb|o2$Wqhq7zceeU;bJqpzHr)^Se><1Upifw9)&u+ z(AxZCE=%a5Y2WuJ9aGaSv-tF3&z~bt4)cCo!+81Dn?G$p3m80I{an^LB{Ts5F+pt! literal 0 HcmV?d00001 diff --git a/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import b/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import new file mode 100644 index 0000000000..a781fa62ae --- /dev/null +++ b/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ysort25d_icon.png-7203736c3c997b4f31f7b878b0530dfd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d/icons/ysort25d_icon.png" +dest_files=[ "res://.import/ysort25d_icon.png-7203736c3c997b4f31f7b878b0530dfd.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/addons/node25d/node25d_plugin.gd b/misc/2.5d/addons/node25d/node25d_plugin.gd new file mode 100644 index 0000000000..ad1790258d --- /dev/null +++ b/misc/2.5d/addons/node25d/node25d_plugin.gd @@ -0,0 +1,16 @@ +tool +extends EditorPlugin + + +func _enter_tree(): + # When this plugin node enters tree, add the custom types + add_custom_type("Node25D", "Node2D", preload("Node25D.gd"), preload("icons/node25d_icon.png")) + add_custom_type("YSort25D", "Node", preload("YSort25D.gd"), preload("icons/ysort25d_icon.png")) + add_custom_type("ShadowMath25D", "KinematicBody", preload("ShadowMath25D.gd"), preload("icons/shadowmath25d_icon.png")) + + +func _exit_tree(): + # When the plugin node exits the tree, remove the custom types + remove_custom_type("ShadowMath25D") + remove_custom_type("YSort25D") + remove_custom_type("Node25D") diff --git a/misc/2.5d/addons/node25d/plugin.cfg b/misc/2.5d/addons/node25d/plugin.cfg new file mode 100644 index 0000000000..3336dfa810 --- /dev/null +++ b/misc/2.5d/addons/node25d/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Node25D" +description="Adds Node25D" +author="Aaron Franke" +version="1.0" +script="node25d_plugin.gd" diff --git a/misc/2.5d/assets/DemoScene.tscn b/misc/2.5d/assets/DemoScene.tscn new file mode 100644 index 0000000000..d635671c97 --- /dev/null +++ b/misc/2.5d/assets/DemoScene.tscn @@ -0,0 +1,592 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://assets/ui/Overlay.tscn" type="PackedScene" id=1] +[ext_resource path="res://assets/player/Player25D.tscn" type="PackedScene" id=2] +[ext_resource path="res://assets/shadow/Shadow25D.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=4] +[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=5] +[ext_resource path="res://assets/platform/textures/fortyfive.png" type="Texture" id=6] +[ext_resource path="res://assets/platform/PlatformSprite.gd" type="Script" id=7] +[ext_resource path="res://addons/node25d/YSort25D.gd" type="Script" id=8] +[ext_resource path="res://addons/node25d/icons/ysort25d_icon.png" type="Texture" id=9] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=3] +extents = Vector3( 5, 0.5, 5 ) + +[node name="DemoScene" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 1 )] + +[node name="Player25D" parent="." instance=ExtResource( 2 )] +position = Vector2( 0, 0 ) +z_index = -3952 + +[node name="Shadow25D" parent="." instance=ExtResource( 3 )] +visible = true +position = Vector2( 0, 0 ) +z_index = -3958 +spatial_position = Vector3( 3.13315e-08, -0.498, 3.13315e-08 ) + +[node name="Platform0" type="Node2D" parent="."] +z_index = -3954 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -8, 5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform0"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform0/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform0"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform1" type="Node2D" parent="."] +z_index = -3956 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -8, 5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform1"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform1/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform1"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform2" type="Node2D" parent="."] +z_index = -3962 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 0, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform2"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform2/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform2"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform3" type="Node2D" parent="."] +z_index = -3960 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform3"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform3/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform3"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform4" type="Node2D" parent="."] +z_index = -3966 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 0, -1, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform4"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform4/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform4"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform5" type="Node2D" parent="."] +z_index = -3984 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform5"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform5/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform5"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform6" type="Node2D" parent="."] +z_index = -3982 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform6"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform6/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform6"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform7" type="Node2D" parent="."] +z_index = -3978 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform7"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform7/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform7"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform20" type="Node2D" parent="."] +z_index = -3976 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform20"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform20/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform20"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform21" type="Node2D" parent="."] +z_index = -3972 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, 30 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform21"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 30 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform21/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform21"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform22" type="Node2D" parent="."] +z_index = -3970 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 10, -5, 40 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform22"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 40 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform22/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform22"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform9" type="Node2D" parent="."] +z_index = -3974 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 20, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform9"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform9/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform9"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform10" type="Node2D" parent="."] +z_index = -3994 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 28, -10, 3 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform10"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 3 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform10/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform10"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform11" type="Node2D" parent="."] +z_index = -3992 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 28, -10, 13 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform11"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 13 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform11/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform11"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform12" type="Node2D" parent="."] +z_index = -3988 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 28, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform12"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform12/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform12"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform13" type="Node2D" parent="."] +z_index = -3990 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 18, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform13"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 18, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform13/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform13"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform14" type="Node2D" parent="."] +z_index = -3996 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( 8, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform14"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 8, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform14/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform14"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform15" type="Node2D" parent="."] +z_index = -3998 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -2, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform15"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform15/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform15"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform23" type="Node2D" parent="."] +z_index = -4000 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -12, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform23"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform23/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform23"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform16" type="Node2D" parent="."] +z_index = -3980 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform16"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform16/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform16"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform19" type="Node2D" parent="."] +z_index = -3986 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform19"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform19/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform19"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform17" type="Node2D" parent="."] +z_index = -3964 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -15, -1, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform17"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform17/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform17"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="Platform18" type="Node2D" parent="."] +z_index = -3968 +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 5 ) +} +spatial_position = Vector3( -15, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform18"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform18/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform18"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 6 ) +script = ExtResource( 7 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 8 ) +__meta__ = { +"_editor_icon": ExtResource( 9 ) +} diff --git a/misc/2.5d/assets/cube/Cube.tscn b/misc/2.5d/assets/cube/Cube.tscn new file mode 100644 index 0000000000..a11e6e233f --- /dev/null +++ b/misc/2.5d/assets/cube/Cube.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/node25d/icons/ysort25d_icon.png" type="Texture" id=1] +[ext_resource path="res://assets/ui/OverlayCube.tscn" type="PackedScene" id=2] +[ext_resource path="res://assets/cube/CubeMath.gd" type="Script" id=3] +[ext_resource path="res://addons/node25d/YSort25D.gd" type="Script" id=4] + +[node name="Cube" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 2 )] + +[node name="Camera2D" type="Camera2D" parent="."] +current = true + +[node name="CubeMath" type="Spatial" parent="."] +script = ExtResource( 3 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 4 ) +__meta__ = { +"_editor_icon": ExtResource( 1 ) +} diff --git a/misc/2.5d/assets/cube/CubeMath.gd b/misc/2.5d/assets/cube/CubeMath.gd new file mode 100644 index 0000000000..b191d11584 --- /dev/null +++ b/misc/2.5d/assets/cube/CubeMath.gd @@ -0,0 +1,52 @@ +extends Spatial + +onready var _cube_point_scene: PackedScene = preload("res://assets/cube/CubePoint.tscn") + +onready var _parent = get_parent() +var _is_parent_ready := false +var _cube_points_math = [] +var _cube_math_spatials = [] + +func _ready(): + _parent = get_parent() + + for i in range(27): + # warning-ignore:integer_division + var a: int = (i / 9) - 1 + # warning-ignore:integer_division + var b: int = (i / 3) % 3 - 1 + var c: int = (i % 3) - 1 + var spatial_position: Vector3 = 5 * (a * Vector3.RIGHT + b * Vector3.UP + c * Vector3.BACK) + _cube_math_spatials.append(Spatial.new()) + _cube_math_spatials[i].translation = spatial_position + _cube_math_spatials[i].name = "CubeMath #" + str(i) + ", " + str(a) + " " + str(b) + " " + str(c) + add_child(_cube_math_spatials[i]) + + +func _process(delta): + if Input.is_action_pressed("exit"): + get_tree().quit() + + if Input.is_action_just_pressed("view_cube_demo"): + # warning-ignore:return_value_discarded + get_tree().change_scene("res://assets/DemoScene.tscn") + return + + if _is_parent_ready: + if Input.is_action_just_pressed("reset_position"): + transform = Transform.IDENTITY + else: + rotate_x(delta * (Input.get_action_strength("move_back") - Input.get_action_strength("move_forward"))) + rotate_y(delta * (Input.get_action_strength("move_right") - Input.get_action_strength("move_left"))) + rotate_z(delta * (Input.get_action_strength("move_counterclockwise") - Input.get_action_strength("move_clockwise"))) + for i in range(27): + _cube_points_math[i].global_transform = _cube_math_spatials[i].global_transform + else: + # This code block will be run only once. It's not in _ready() because the parent isn't set up there. + for i in range(27): + var my_cube_point_scene = _cube_point_scene.duplicate(true) + var cube_point = my_cube_point_scene.instance() + cube_point.name = "CubePoint #" + str(i) + _cube_points_math.append(cube_point.get_child(0)) + _parent.add_child(cube_point) + _is_parent_ready = true diff --git a/misc/2.5d/assets/cube/CubePoint.tscn b/misc/2.5d/assets/cube/CubePoint.tscn new file mode 100644 index 0000000000..921818f6f1 --- /dev/null +++ b/misc/2.5d/assets/cube/CubePoint.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/cube/godot.png" type="Texture" id=3] + +[node name="CubePoint" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} + +[node name="CubePointMath" type="Spatial" parent="."] + +[node name="CubePointSprite" type="Sprite" parent="."] +texture = ExtResource( 3 ) diff --git a/misc/2.5d/assets/cube/godot.png b/misc/2.5d/assets/cube/godot.png new file mode 100644 index 0000000000000000000000000000000000000000..b66446484ed283779f867fbc0f1a6ea33ed7ffa7 GIT binary patch literal 2130 zcmV-Y2(9;tP)mQ2$%eD8NbNNGWhA_zJmacp1Bi;1ESGxJ-F}mfIvBNs3fm*1E z+NhCQsoBHCd3V3Eo(oq!`i^dT@oN&#$e=cAq*iM702kl$)^)r!=#E|SXKWLwm71yD zIl+s3R3oFpqJL9x7yigSO_T(k~^4>Adag8yI zC5K!%;5uS(!tK@#c-VN`Hny~>vAtV9QN?;^L!=&Ca`e}DVMVB#J9`uwm)0*gG(KI; z9X-aFkl*LP0T-Nbqv5^{Sg_Gw;Po}(n0FYPL-GZ_p0if3jb9*wW56}5JU9UwZrgy_ zD|QKduqn#2kmr_%h*#4Noa35h9-IITw{5_fdFus6?~cc`Wy}an*2;s~n)_oK!7=9s z%z+c2;kFIoK>&K(Q177fiH-J~C zHekxqtzwaKIK4`b|882^ms%mtw|4ewntu}K2P4oz6Ky=0(=Oid$ay?FrvcA=@o%-Y zcPhQCNl$wQ_cJqUXPiFV9L4dV2AXKwpT{F!@r?J=YQU|pj#G3>w%WUGde>alxqsjl z&v>VXQ*XeWwLSu#`?DY(R)J?g4X4}ypFP1Ut#5~LSO(sy;glP&Y}>a2bACu0cE#fv zP{S!V;P%(YD>bJ`{DOO9ZTN609~5rSP-ML$uqt&Kz9P*rCwu8cp_1Jne$u zfD2Bz(Ll>;yias7t3y0HcPZT6(<`4S#|?OWZMe!BI%J}?rIpo~5z^Msf>SP@TsYu@ z(*#;*S~LK!cy@XNAa^Jlky|T}mz$@LKl(%u-2b4Sdh%)c`TB`<`&ci>`vdQ7j3gXh zBZpjHg99!&;YI_X=@t!mc~zJ|S67!_f9(y7{vkp`!}McPxudr>1riQFD&&M2x%PZ$ zpasw#@&-)sNf1a%O2%Nnm^XL6(#o3pGv`gYlDHhuot7k@DN(1Q;vBRxZl_GFxF z1IQs4jz4gsffkx>^CdWDcf4$U$JEf!pn3D=>y6jn)TpmVDJD8bafRjr>f{I6DYvRc^=;j<2R~Q_GC#pP zfo<&pgE0efpkWWZ;0bR9hDW@*qygShMGiL~zBIm-lS>-aW9u8xJahN)z?gwJ&_D}K zN1HTwbV&o)VDOJAu{8E`a=C!jKfF&a3u69Ocy6uUSQqXvxW*X9TK%&O(6aJ@#}31* z(;HA(+n|H#m6pQ3(ZvFjd=n`~k1y@Nj}LYau&2N^VE;b@TyVk-(6ZtCWe@h|Yg)RLQ`JHUI9e8)!8KrxCl?NTpk>8T-q@j_m=xzXVD35} zf$kXfVbxmK<{7fD2Bz z(Ll>lKHk6_!>iL9z+cY|O|8nTXx0-;gWPWZ#}nS_n_6_wTa%pM0Ajl5c7X$Fl?b|3 z@puB$Jh!>_28ne(djwd3Jmop`O~3SfIfTRcM0ZiW-fYvu#& zqo*6qFc(D52)N*c8x7E4XmTgWorZ@Yzf0_nHzsKEk}V30PnXTsC%}r1xqN?WrM86T z^8-fXyb@UCu&B|iYr=jlkYmnqjWLWRhg>+|0xWU4qZBPP-SS>xrpvGYyH*?h_bDbN zTQv<$I#txvH*u4LHu&v>6K;3DSJ*o4Hs1uk!%L z|x>`SKock6%UV~M`s^?D}t<807*qo IM6N<$f_nit@&Et; literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/cube/godot.png.import b/misc/2.5d/assets/cube/godot.png.import new file mode 100644 index 0000000000..0cc11e6bc9 --- /dev/null +++ b/misc/2.5d/assets/cube/godot.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/cube/godot.png" +dest_files=[ "res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/Platform.tscn b/misc/2.5d/assets/platform/Platform.tscn new file mode 100644 index 0000000000..153bdca246 --- /dev/null +++ b/misc/2.5d/assets/platform/Platform.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/platform/textures/fortyfive.png" type="Texture" id=3] +[ext_resource path="res://assets/platform/PlatformSprite.gd" type="Script" id=4] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[node name="Platform" type="Node2D"] +z_index = -3996 +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} + +[node name="PlatformMath" type="StaticBody" parent="."] +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="."] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 3 ) +script = ExtResource( 4 ) diff --git a/misc/2.5d/assets/platform/PlatformSprite.gd b/misc/2.5d/assets/platform/PlatformSprite.gd new file mode 100644 index 0000000000..e817ef5e2b --- /dev/null +++ b/misc/2.5d/assets/platform/PlatformSprite.gd @@ -0,0 +1,39 @@ +tool +extends Sprite + +onready var _fortyFive = preload("res://assets/platform/textures/fortyfive.png") +onready var _isometric = preload("res://assets/platform/textures/isometric.png") +onready var _topDown = preload("res://assets/platform/textures/topdown.png") +onready var _frontSide = preload("res://assets/platform/textures/frontside.png") +onready var _obliqueY = preload("res://assets/platform/textures/obliqueY.png") +onready var _obliqueZ = preload("res://assets/platform/textures/obliqueZ.png") + +func _process(_delta): + if Input.is_action_pressed("forty_five_mode"): + set_view_mode(0) + elif Input.is_action_pressed("isometric_mode"): + set_view_mode(1) + elif Input.is_action_pressed("top_down_mode"): + set_view_mode(2) + elif Input.is_action_pressed("front_side_mode"): + set_view_mode(3) + elif Input.is_action_pressed("oblique_y_mode"): + set_view_mode(4) + elif Input.is_action_pressed("oblique_z_mode"): + set_view_mode(5) + + +func set_view_mode(view_mode_index): + match view_mode_index: + 0: # 45 Degrees + texture = _fortyFive; + 1: # Isometric + texture = _isometric + 2: # Top Down + texture = _topDown + 3: # Front Side + texture = _frontSide + 4: # Oblique Y + texture = _obliqueY + 5: # Oblique Z + texture = _obliqueZ diff --git a/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import b/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import new file mode 100644 index 0000000000..0349bce759 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/41226408-platform-texture.jpg-baf3b2df9182218f8ceff003f894b1db.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/41226408-platform-texture.jpg" +dest_files=[ "res://.import/41226408-platform-texture.jpg-baf3b2df9182218f8ceff003f894b1db.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/fortyfive.png b/misc/2.5d/assets/platform/textures/fortyfive.png new file mode 100644 index 0000000000000000000000000000000000000000..e4422bb3d1a0973be7236aa00bbb6ba7bfbadb49 GIT binary patch literal 2276 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sVEn_u1{85TD#rq(*pj^6T^JG=<}f6#J9{Ss zD8gCb5n0T@z%2~Ij105pNB{-dOFVsD*`F}UaBwnq-k2o9z`#-H>EaktaqI0Z!z?C8 ziMEG6GZtv(v~Xx%suYiYKdE@x6)i@?1p)_;Ik}#!U|t8GO;=}N5NH6J<-oweq5yQB0ML0H3=Iq{3=RxT3Sb z`m$m}xWm-yskID!_wDwSE)bpl^->&T=)2Hwj5C5hU29ajp}io#hM5DG6?j~L$6-{} zg~u>FVMK;5!U2xWP=rB;2}e!=>3T2`m|OT9 ztC>5-?4w6Yl% zU!?28l6+x?;Yr4%>r!Bt%Yd(T!C@&5VFFba9$gLYU9q+nEf0P<2)+?jV36K)|L-nv zuH!h+Hm8sMIxVtDkzlxe{5l4P0Kxsh>UA*35k|$|u;(trgfOT5hnyvhfb9_mPgg&e IbxsLQ0NEf6_W%F@ literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/platform/textures/fortyfive.png.import b/misc/2.5d/assets/platform/textures/fortyfive.png.import new file mode 100644 index 0000000000..f2b0448b5b --- /dev/null +++ b/misc/2.5d/assets/platform/textures/fortyfive.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fortyfive.png-ed5c66b01afe0b53153c3d09ee5b6584.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/fortyfive.png" +dest_files=[ "res://.import/fortyfive.png-ed5c66b01afe0b53153c3d09ee5b6584.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/frontside.png b/misc/2.5d/assets/platform/textures/frontside.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3bdd78588f8f7bb99891c2a8e0a64efbc038a8 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xeZ8+F~Fdh=gh_@|-P~t+$}|QBMmJ9v$B>F!Z*L#ub#M@H z2y_wV;|l0p9e3sB8wJQG!5Xuh$E`JYhEGtq!s{L8cx z7#dQLRq{k10IHgx%kVw75a`Ly9ZYNt0u2ld91aW&Ky?gE0zhYSz)e6zDVO1}dJGJ~h9pUXO@geCwGiCUxp literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/platform/textures/frontside.png.import b/misc/2.5d/assets/platform/textures/frontside.png.import new file mode 100644 index 0000000000..00089ecae2 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/frontside.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/frontside.png-59d804a7bfdefb2229c160b22085f140.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/frontside.png" +dest_files=[ "res://.import/frontside.png-59d804a7bfdefb2229c160b22085f140.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/isometric.png b/misc/2.5d/assets/platform/textures/isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..7045d86bf7d78bac2f791e12f0bc4b78431dfe8e GIT binary patch literal 41122 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 literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/platform/textures/isometric.png.import b/misc/2.5d/assets/platform/textures/isometric.png.import new file mode 100644 index 0000000000..e722a8d6e2 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/obliqueY.png b/misc/2.5d/assets/platform/textures/obliqueY.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0b0d24bfdec9ff4b91f86463bf07ba64654cd4 GIT binary patch literal 3148 zcmeAS@N?(olHy`uVBq!ia0y~yU|I#j9Be?5PpvgsK#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJUmtIx{)azMG8o-U3d6}R5r*ywxML82kh z`jn8!6%E%i5BJl0XAbIZDY>cWI>pNM7>Bfj)SL4^_FkLzu0;Lsuad{FZ~v}kU`Pnv zXJ>!xmz?=JPKJcqxNq%$l9vXsG6<}85@lf6s1?G<5K*#*E0lp@5}4z0Y!y&eK@ue0 zkTQ5AUX`6YYiIlZj>HG`yz84QS=SWB=_-clFMs^w#Qr#-CuZ1$wQ4aiboYiXW7%pgdN(1!z7<9+~C<1{{cwjTTr15ywU=0G$jH$3}x3 z4iZPEv3UgML2Mp@d5~z2z&wV{BQOtQ^9V>iDIS4&Y|wfLTa3Uwh#Vs@kHBbBJ%lx8 zU`Y=-iNRt9Mq`bkRmu#b37({!i#Ir-IT}5|&p1|g?r8q?&C(2F2lp_|m?uuf+#j*= z?VN6VU7DB=F9gNim->O-doZ)(I5eCQrP=acFok_$d^vlqyru!0Vqre=9TRS#h; zC-B4!%wwc_h}41)Z`HK$6$gFl6Y3Vfc!HJG;KWy-P&IwP3cx>E*3Tbpe|?jep*tat z(dT?O&@(VObefuJ3OToLsCaC^bNKYXf^rcC2A`KjR(bCs+)d1BuAX!gWKbLh* G2~7Yy_G*s+ literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/platform/textures/obliqueY.png.import b/misc/2.5d/assets/platform/textures/obliqueY.png.import new file mode 100644 index 0000000000..9ef359977a --- /dev/null +++ b/misc/2.5d/assets/platform/textures/obliqueY.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/obliqueY.png-835238e1a682fa9039cff7ef5cfcacd4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/obliqueY.png" +dest_files=[ "res://.import/obliqueY.png-835238e1a682fa9039cff7ef5cfcacd4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/obliqueZ.png b/misc/2.5d/assets/platform/textures/obliqueZ.png new file mode 100644 index 0000000000000000000000000000000000000000..a859ccb6e140b3dfd7da2d7ce6841139420b1553 GIT binary patch literal 8917 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 literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/platform/textures/obliqueZ.png.import b/misc/2.5d/assets/platform/textures/obliqueZ.png.import new file mode 100644 index 0000000000..ac8ea96549 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/obliqueZ.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/obliqueZ.png-ccf2b8e0c4fa1369940c3976d1e9a334.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/obliqueZ.png" +dest_files=[ "res://.import/obliqueZ.png-ccf2b8e0c4fa1369940c3976d1e9a334.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/topdown.png b/misc/2.5d/assets/platform/textures/topdown.png new file mode 100644 index 0000000000000000000000000000000000000000..53f9b83ee7cbc98099c95f02d2be444d1fc3e8e8 GIT binary patch literal 2686 zcmeAS@N?(olHy`uVBq!ia0y~yU}^wi4mO|&&)Jj8K#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJT@)7+jtRSXPV+@3CuAr-gY-f-k?FyL_r zR4_is$f)tKOZRBh>i3)s*+xrw~wm=Ux-Hx1?i1#rbUD!N=r}W0-ef+xcI008p0kn&5y2!4TNOU3o zK*CjTlCFzofhbY6F bool: + # Gather player input and store movement to these int variables. Note: These indeed have to be integers. + var x := 0 + var z := 0 + + if Input.is_action_pressed("move_right"): + x += 1 + if Input.is_action_pressed("move_left"): + x -= 1 + if Input.is_action_pressed("move_forward"): + z -= 1 + if Input.is_action_pressed("move_back"): + z += 1 + + # Check for isometric controls and add more to movement accordingly. + # For efficiency, only check the X axis since this X axis value isn't used anywhere else. + if !_parent_math.isometric_controls && is_equal_approx(Node25D.SCALE * 0.86602540378, _parent_node25d.get_basis()[0].x): + if Input.is_action_pressed("move_right"): + z += 1 + if Input.is_action_pressed("move_left"): + z -= 1 + if Input.is_action_pressed("move_forward"): + x += 1 + if Input.is_action_pressed("move_back"): + x -= 1 + + # Set the direction based on which inputs were pressed. + if x == 0: + if z == 0: + return false # No movement. + elif z > 0: + _direction = 0 + else: + _direction = 4 + elif x > 0: + if z == 0: + _direction = 2 + flip_h = true + elif z > 0: + _direction = 1 + flip_h = true + else: + _direction = 3 + flip_h = true + else: + if z == 0: + _direction = 2 + flip_h = false + elif z > 0: + _direction = 1 + flip_h = false + else: + _direction = 3 + flip_h = false + return true # There is movement. diff --git a/misc/2.5d/assets/player/textures/jump.png b/misc/2.5d/assets/player/textures/jump.png new file mode 100755 index 0000000000000000000000000000000000000000..809467dadda7a82c87f8f2e0bfed0eed407b472b GIT binary patch literal 3809 zcmW+(X*iVs_x{W?4>R_$6xp{-e8t#_7)v6%5=EJ^CfWCO2HE#yEhed?g~~Egj3s5K zlq}VVY?0mA{r&zg&UN4SIrnwmob%$GBun$NY|Q-3001^)BLnM0Bm#iIqmhS9KRRyf z5L7KqFPy1Q@w78O*W9@p8edsZ+F_`vN4Ry*u7o>s+i_1{M9k9gL(O-;2W#l(ZXnLXylz9C6UNWEWuZ=EGq)(xx5w?*el0+FnX3B zVkK|^Zf2?p&CqHGXZSXrnznL9hT`@%2AE(9{n8btlW@Mj#YDx+e0b;b%2QLgMM#^? z3%TxSt`B}*D%=Ak>O1ay4tT>cOis`Gw@uq>{xq)gVU9T<=Zr?2=Twe1AsjrK2A{S3 zpJn+?ZJf`a4uJ681MNF*P+ODVb?f;0Z5++7WJC#EN`fKP7El(>oQL-Z$@9@{@BR#=-+o->Sl(Ra@OkF-nsfe^wqv;O>V zC9X0jY|p6UO&+SY%Di8QT<&zE|Sn)T_Lq|GF1SK#jVGcDsdFlws9M*EMH2ZW=jPVExrf400& zi^TQ8S3RXNqK6)}`fqP}@9jpK5S-86A5AEpZN%dIDr%U;qZF8gA=$1Yx&|B@&22KK zcsS`^1$OO%bc2--hWy<^nfBBgj`qQv@UP`IYkQn^jzr|9+&$IxQ=<ji*e&FmYb^ z!qglfaudKep9AiCK`aU(Pb6Tk-vbscZ$Fhp;CF+e%!vX3x^@uGTXHZtFFQaQ6d;?C zq9bxGu}sK(EfAoj6w0M_x<5&@%jjIiOO|q7x?%wmRz#aMxfJokqD%l{s_yYT;3klt z;pLP#kyUg;%LRk59`XFcWgGjf^=Ie?3im>7Qy<|O-cegD1TfGd1IYQMs-*FyZ3Y5& z583B~C6L&E>bvTj1szMEpg^MN=?~FkI*_7CT6{yi-u@q1<<*Iq5|S(;;e-`d1e!)E zFdJYZq6;){@P1$iX5tc5x(((uAkfU*jQRzmSYo~f5_tEc7Pnrmi=caUqmGc&C>)#U z0I+OLM`Wx=`Pnb7TgKTh-iOPef#v4w{U)@ajB}!zVN`ul_$SB2X$u@u1W~Me{ZDuL zM1BVFZfRI95=8+KL~_q&4}K+dk;L|Fjb=z=v?RanmUQFH-UtF{^!w&b@? zJr1}R%H$kleV>xwn8t8dD1$YPgsO0`n^|f2{T+Y z@(AaUtWd?DUB-iY`vOJqo z?y{nYTmP=?pl$k~GwLeZrQi0Ns_v;%DIo%^&)6Cj@ZPGwspN!YE8r(qDuc!`Y7&nr zHWrDvNv9}$TGEsC@PR#l4f5b*JU~TvN{wI@&kNLF2s{8X)}OZLYjz{QUj*BBohKm>kUrCTxRpr{ZS_tJIl zNhrK$)g{F(9Wwv;Wy{>GdC`#r2+SERLNxu# _v(2T>v>+omF5`hw6G0)89wnvy* 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 literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/player/textures/run.png.import b/misc/2.5d/assets/player/textures/run.png.import new file mode 100644 index 0000000000..90a63b5175 --- /dev/null +++ b/misc/2.5d/assets/player/textures/run.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/player/textures/run.png" +dest_files=[ "res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/player/textures/stand.png b/misc/2.5d/assets/player/textures/stand.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbc364fda0199448087c36b0ff09634035f95eb GIT binary patch literal 1844 zcmV-42g~@0P)oJPz48Z0p+QFMopxgIb!DOi7RSXH@;Y>aMaIa)E100001 zbW%=J06^y0W&i*NvPnciRCwCm+5v2xGWp}R}0vzH zo9@%=s2veNA~pdL+DMIdj(sT0!-N_I-G{Gz3Z700@cvy6pZx@q#gYOh$LBAQ2Dfv$ z_vqPPI=!dBFJud`n>OyLLzsx~BEAug_4a)od`~YHtTmgqRvL7vd8FIJQ*+ zV_QA}T-!P}=E}Ar5;PrS{5A($HWaKstbKP7vwGV0EBppVE>y!{OXXK zN8`VV0Bi<0w&im`1-2C{1|Zty#sF|r8Nm+V?{%QL0qy@D>?=$qDtag%6~j~>70*a8 zfKDn0;L!u=$Ege)a>bC~^n@7sK!GMeC`3k|#y&WS5V;T3Y2+%fg^;l#CsM@p;d^^& z{qVg*y%YH%c7V?hz5{%I_%Wy>77XJTBNjk0aCrd00qY>*L9?BMn+Uq{kH(l}2PqA@ zPxbj#zipGC$`2v9T?)uDKVT9e2}Bbx^5TF7{a*q=K1xWCfA%TB8~r^J{QCKi0N*T@ zB>2r&NBCDw1Nn#KWbc5^4B=J90>aFQ=6b{8sX zva?(ZlO`N;yTD{$bvfWBEvx}eZVs|401S}&^_T;)55+TJK&Bw(fb_w~t_o-nLx3km z5t0BEY6&o=XDHMnQ*Owdr4W4x(wcQK=7G=u!zMhim17NHZuxg8Kg6}~AD|{blz`6< zjtY7#_(oBTSkM{3PWhq!AO&Kg`THd~zhQwsH`gf#UYl3^X`<5yn*-oEs?C5e54->m zIWVdPm?`!c6efDf088(kEjS>uLd|~90_;xj`A74d2k)81YHc&%e6e2rvCV+T=GEBe zKr3=X;6M{%9<)$}5eG6n8Y2fT)x`}9es^YWu*-qD(JExX?dtAPG3J4eJRaO|K>lF0 zzR@WIlGS=H*n9G~3m)jR8lcAKD;C6kPuBpq%Y#g*lmS|0$N`PR9FPXGQv>=iQY^@D zsQN5WDvUTFwblVLpfbg%$AS~+@be`2E^?p`4i9qQ!6O#LL97LPvDl}k5;_(C5BcHi zJHLMjcFPZ=T7X!j9OxBARJZ!W&cHpf**FOavtG!PQ0r4Vd0S2Ii7{6>30e_k#|FDJ zKsQH>+9?U*pzlV|UQ!_MB~X@kPXT#)5tSghXO@#70!-FR1|Xt+OM>ZqRD$$7e_}ym zeTxAF;#iW;r*$#8)OtdL=EY=c%%wyUbS94%cdrg&65z|&nBf~7Qy@OUSoxomvlPT9 z5deH%5WsS~76Q1f5edS^HA3fSNC1gp!ysN<76iz9q&zSdpU+Y zIE~ZBdRczx^@Imi{YSvmfK&651(OWgHGs`oAD9~OxB_e#G&elxJE00VkVjrE7zSew zU{Vww3(8%1HOGJq&{%uC%DSu;g|&y>s~HoyT5&S zN8Uf|oF6KXa$pG1tIH3g+SPw|uv7oTRfw29`QP?G;L~el`yX7yi0gmIp{#`If5@wG zNSOYI49f~)FkMM=?F2Ni+nq1DSLKf0OMCfK<_LJl^dlM*2R7eMGF1jq`+5?~Qh;AjJe6p*SYQdtx#CBfz&NFcHeU_y*i iX|-{$AHI0|!#@EBKxsdV&|Pr=0000^ttsS|C1Qh#q*iUI9l3C)@oM_LPySm0~NHvE&!rc+^nr#5B&s@9nb1DxvA{wQ(gQ5f)}Gl}0w?F%E^moh6> z2_vnUI3}P_9 zBg>xlMqCXRRj0000$)mS!;JSYUV)S{{q9@d+)j4YUnDI zrWUsL4oy#4l!|#b$meMaz}G={Sp)JL|X`i-gARb|Rsj zyGkTf<$pl_FUVhn`P(r6Aj&$5^Dm?P>o|WP$sft`htmA9JpW;m|1^911eq0s%gEld Q?f?J)07*qoM6N<$g5P;`umAu6 literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/shadow/textures/isometric.png.import b/misc/2.5d/assets/shadow/textures/isometric.png.import new file mode 100644 index 0000000000..9c56cf1f70 --- /dev/null +++ b/misc/2.5d/assets/shadow/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/shadow/textures/obliqueY.png b/misc/2.5d/assets/shadow/textures/obliqueY.png new file mode 100644 index 0000000000000000000000000000000000000000..f48cf507ec98a6085512de5b6f4976655022ab9c GIT binary patch literal 353 zcmV-n0iOPeP)wJy5m1AGqoIY28f6x4_C%dLxzT|-I(VrE z33Zlu@aGa5AWgjdievorn&-Hn!4~S_$Y`*Pqgp@{1S)wniRZ^6nj}`wZ+QnhnrP=+ z4o&9x(uyWqtp->bq6}1CfXPePkb#X-Kn4P(gbXA~Co*tS%E&;bbRh%RKl%XUUtm8% z`)Byko*fhb0Kgy!?BALg_hBKXf_+5(75gyqaqJ6;uVlQG@>=ePiJxYEocek00fk32 z9#VNs=Ru`MwH{V`TIqP)001%w1ONa4zH07h0006UNkl@Y7{}qqBTb7{Y)@TTK{1LABG?3}#ibh&M60MqM6oXFAr^@wwl+=PTmP;=KAkh8 z8=v0|49p9E|4`{zb45?zJp;F0vtdQ$FIl$fp*P<8_}s?}5f#wCc#VY$|s&7NT|ET$jaJR}Dp`8np~IJaQ~DweVC&YXe^` zM7BsM+qEPRwN^;r0DAa*VlJtBLg&ONhGB6Q^I&oK$T?FglUE_{Q zHrtLwtL7RHoR`&(W6`3|?pv4Lwuwlr(YLCIZqn@hu&-}fF>ChBe)G5=yJbmHl^Z@d z{iO#@J<(IEC~ryE(9~S~q^Yr?n=YvQL6utHD<6$a%*@Svcj%M1-gs!!vcIIVV#77J j4cyb$bH$pD%0K@BGCfYB{nl?n00000NkvXXu0mjfp|=~7 literal 0 HcmV?d00001 diff --git a/misc/2.5d/assets/shadow/textures/obliqueZ.png.import b/misc/2.5d/assets/shadow/textures/obliqueZ.png.import new file mode 100644 index 0000000000..5daf1a2967 --- /dev/null +++ b/misc/2.5d/assets/shadow/textures/obliqueZ.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/obliqueZ.png-95b7e7a176541fda8f2db67045ba0ad7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/obliqueZ.png" +dest_files=[ "res://.import/obliqueZ.png-95b7e7a176541fda8f2db67045ba0ad7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/shadow/textures/topdown.png b/misc/2.5d/assets/shadow/textures/topdown.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf9a46f485987c714612ba9a45f923823704abe GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;IZqeIkcwMx4>p3t4lno}ET3|f ep}_{kV`yMjaA08Us+(U9;(5CIxvXiWR}k0J>)@%+m2K;1E;{LE z?Uax^$L;igDIG(Vz>@#}|Gz1+js_}XED7=pW^j0RBMr!z?CIhdQgQ3(IY&`vMIM)n zQ5~%t1-O$Lxg!oRi4{aITgWb=l7Dg16TN@W&-%UB6MoSUydbBbU;HU^xy{aS2HkuI zRt49FAF7`nv+w+Eytno#^ZkcQ%2{93_WZE Date: Sun, 1 Mar 2020 01:06:39 -0500 Subject: [PATCH 3/7] 2.5D Editor Viewport for GDScript --- .github/CODEOWNERS | 6 + .../icons/{node25d.png => node_25d.png} | Bin ...sort25d.png.import => node_25d.png.import} | 6 +- .../{node25d_icon.png => node_25d_icon.png} | Bin ...on.png.import => node_25d_icon.png.import} | 6 +- ...{shadowmath25d.png => shadow_math_25d.png} | Bin ....png.import => shadow_math_25d.png.import} | 6 +- ...h25d_icon.png => shadow_math_25d_icon.png} | Bin ...import => shadow_math_25d_icon.png.import} | 6 +- .../icons/{ysort25d.png => y_sort_25d.png} | Bin .../node25d/icons/y_sort_25d.png.import | 34 ++++ ...{ysort25d_icon.png => y_sort_25d_icon.png} | Bin .../node25d/icons/y_sort_25d_icon.png.import | 34 ++++ .../node25d/icons/ysort25d_icon.png.import | 34 ---- .../addons/node25d/main_screen/gizmo_25d.gd | 105 +++++++++++ .../addons/node25d/main_screen/gizmo_25d.tscn | 23 +++ .../node25d/main_screen/main_screen_25d.tscn | 173 ++++++++++++++++++ .../main_screen/view_mode_button_group.tres | 3 + .../node25d/main_screen/viewport_25d.gd | 147 +++++++++++++++ misc/2.5d/addons/node25d/node25d_plugin.gd | 37 +++- .../node25d/{Node25D.gd => node_25d.gd} | 2 +- .../{ShadowMath25D.gd => shadow_math_25d.gd} | 2 +- .../node25d/{YSort25D.gd => y_sort_25d.gd} | 2 +- .../2.5d/assets/cube/{Cube.tscn => cube.tscn} | 8 +- .../assets/cube/{CubeMath.gd => cube_math.gd} | 4 +- .../cube/{CubePoint.tscn => cube_point.tscn} | 4 +- .../{DemoScene.tscn => demo_scene.tscn} | 45 +++-- .../platform/{Platform.tscn => platform.tscn} | 8 +- .../{PlatformSprite.gd => platform_sprite.gd} | 20 +- .../41226408-platform-texture.jpg.import | 34 ---- .../{fortyfive.png => forty_five.png} | Bin .../platform/textures/forty_five.png.import | 34 ++++ .../{frontside.png => front_side.png} | Bin .../platform/textures/front_side.png.import | 34 ++++ .../textures/{obliqueY.png => oblique_y.png} | Bin .../platform/textures/oblique_y.png.import | 34 ++++ .../textures/{obliqueZ.png => oblique_z.png} | Bin .../platform/textures/oblique_z.png.import | 34 ++++ .../textures/{topdown.png => top_down.png} | Bin .../textures/top_down.png.import} | 6 +- .../{Player25D.tscn => player_25d.tscn} | 11 +- .../{PlayerMath25D.gd => player_math_25d.gd} | 2 +- .../{PlayerSprite.gd => player_sprite.gd} | 0 .../{Shadow25D.tscn => shadow_25d.tscn} | 15 +- .../{ShadowSprite.gd => shadow_sprite.gd} | 20 +- .../{fortyfive.png => forty_five.png} | Bin .../shadow/textures/forty_five.png.import | 34 ++++ .../{frontside.png => front_side.png} | Bin .../shadow/textures/front_side.png.import | 34 ++++ misc/2.5d/assets/shadow/textures/obliqueZ.png | Bin 597 -> 0 bytes .../textures/{obliqueY.png => oblique_y.png} | Bin .../shadow/textures/oblique_y.png.import} | 6 +- .../2.5d/assets/shadow/textures/oblique_z.png | Bin 0 -> 805 bytes .../shadow/textures/oblique_z.png.import | 34 ++++ .../textures/{topdown.png => top_down.png} | Bin ...bliqueZ.png.import => top_down.png.import} | 6 +- .../ui/{ControlHints.gd => control_hints.gd} | 0 .../assets/ui/{Overlay.tscn => overlay.tscn} | 4 +- .../{OverlayCube.tscn => overlay_cube.tscn} | 4 +- misc/2.5d/project.godot | 16 +- 60 files changed, 914 insertions(+), 163 deletions(-) create mode 100644 .github/CODEOWNERS rename misc/2.5d/addons/node25d/icons/{node25d.png => node_25d.png} (100%) rename misc/2.5d/addons/node25d/icons/{ysort25d.png.import => node_25d.png.import} (69%) rename misc/2.5d/addons/node25d/icons/{node25d_icon.png => node_25d_icon.png} (100%) rename misc/2.5d/addons/node25d/icons/{node25d_icon.png.import => node_25d_icon.png.import} (67%) rename misc/2.5d/addons/node25d/icons/{shadowmath25d.png => shadow_math_25d.png} (100%) rename misc/2.5d/addons/node25d/icons/{shadowmath25d.png.import => shadow_math_25d.png.import} (67%) rename misc/2.5d/addons/node25d/icons/{shadowmath25d_icon.png => shadow_math_25d_icon.png} (100%) rename misc/2.5d/addons/node25d/icons/{shadowmath25d_icon.png.import => shadow_math_25d_icon.png.import} (65%) rename misc/2.5d/addons/node25d/icons/{ysort25d.png => y_sort_25d.png} (100%) create mode 100644 misc/2.5d/addons/node25d/icons/y_sort_25d.png.import rename misc/2.5d/addons/node25d/icons/{ysort25d_icon.png => y_sort_25d_icon.png} (100%) create mode 100644 misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png.import delete mode 100644 misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import create mode 100644 misc/2.5d/addons/node25d/main_screen/gizmo_25d.gd create mode 100644 misc/2.5d/addons/node25d/main_screen/gizmo_25d.tscn create mode 100644 misc/2.5d/addons/node25d/main_screen/main_screen_25d.tscn create mode 100644 misc/2.5d/addons/node25d/main_screen/view_mode_button_group.tres create mode 100644 misc/2.5d/addons/node25d/main_screen/viewport_25d.gd rename misc/2.5d/addons/node25d/{Node25D.gd => node_25d.gd} (98%) rename misc/2.5d/addons/node25d/{ShadowMath25D.gd => shadow_math_25d.gd} (92%) rename misc/2.5d/addons/node25d/{YSort25D.gd => y_sort_25d.gd} (95%) rename misc/2.5d/assets/cube/{Cube.tscn => cube.tscn} (55%) rename misc/2.5d/assets/cube/{CubeMath.gd => cube_math.gd} (95%) rename misc/2.5d/assets/cube/{CubePoint.tscn => cube_point.tscn} (68%) rename misc/2.5d/assets/{DemoScene.tscn => demo_scene.tscn} (90%) rename misc/2.5d/assets/platform/{Platform.tscn => platform.tscn} (64%) rename misc/2.5d/assets/platform/{PlatformSprite.gd => platform_sprite.gd} (57%) delete mode 100644 misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import rename misc/2.5d/assets/platform/textures/{fortyfive.png => forty_five.png} (100%) create mode 100644 misc/2.5d/assets/platform/textures/forty_five.png.import rename misc/2.5d/assets/platform/textures/{frontside.png => front_side.png} (100%) create mode 100644 misc/2.5d/assets/platform/textures/front_side.png.import rename misc/2.5d/assets/platform/textures/{obliqueY.png => oblique_y.png} (100%) create mode 100644 misc/2.5d/assets/platform/textures/oblique_y.png.import rename misc/2.5d/assets/platform/textures/{obliqueZ.png => oblique_z.png} (100%) create mode 100644 misc/2.5d/assets/platform/textures/oblique_z.png.import rename misc/2.5d/assets/platform/textures/{topdown.png => top_down.png} (100%) rename misc/2.5d/assets/{shadow/textures/obliqueY.png.import => platform/textures/top_down.png.import} (68%) rename misc/2.5d/assets/player/{Player25D.tscn => player_25d.tscn} (71%) rename misc/2.5d/assets/player/{PlayerMath25D.gd => player_math_25d.gd} (97%) rename misc/2.5d/assets/player/{PlayerSprite.gd => player_sprite.gd} (100%) rename misc/2.5d/assets/shadow/{Shadow25D.tscn => shadow_25d.tscn} (59%) rename misc/2.5d/assets/shadow/{ShadowSprite.gd => shadow_sprite.gd} (58%) rename misc/2.5d/assets/shadow/textures/{fortyfive.png => forty_five.png} (100%) create mode 100644 misc/2.5d/assets/shadow/textures/forty_five.png.import rename misc/2.5d/assets/shadow/textures/{frontside.png => front_side.png} (100%) create mode 100644 misc/2.5d/assets/shadow/textures/front_side.png.import delete mode 100644 misc/2.5d/assets/shadow/textures/obliqueZ.png rename misc/2.5d/assets/shadow/textures/{obliqueY.png => oblique_y.png} (100%) rename misc/2.5d/{addons/node25d/icons/node25d.png.import => assets/shadow/textures/oblique_y.png.import} (68%) create mode 100644 misc/2.5d/assets/shadow/textures/oblique_z.png create mode 100644 misc/2.5d/assets/shadow/textures/oblique_z.png.import rename misc/2.5d/assets/shadow/textures/{topdown.png => top_down.png} (100%) rename misc/2.5d/assets/shadow/textures/{obliqueZ.png.import => top_down.png.import} (68%) rename misc/2.5d/assets/ui/{ControlHints.gd => control_hints.gd} (100%) rename misc/2.5d/assets/ui/{Overlay.tscn => overlay.tscn} (85%) rename misc/2.5d/assets/ui/{OverlayCube.tscn => overlay_cube.tscn} (84%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..c04eb75f2a --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,6 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. +# Owners can be @users, @org/teams or emails + +/misc/2.5d @aaronfranke +/mono/2.5d @aaronfranke diff --git a/misc/2.5d/addons/node25d/icons/node25d.png b/misc/2.5d/addons/node25d/icons/node_25d.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/node25d.png rename to misc/2.5d/addons/node25d/icons/node_25d.png diff --git a/misc/2.5d/addons/node25d/icons/ysort25d.png.import b/misc/2.5d/addons/node25d/icons/node_25d.png.import similarity index 69% rename from misc/2.5d/addons/node25d/icons/ysort25d.png.import rename to misc/2.5d/addons/node25d/icons/node_25d.png.import index b187da888f..1eba533ef1 100644 --- a/misc/2.5d/addons/node25d/icons/ysort25d.png.import +++ b/misc/2.5d/addons/node25d/icons/node_25d.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/ysort25d.png-d31f6d31844267009448064818383c0d.stex" +path="res://.import/node_25d.png-72e45d8600ccbde01c6d9ad51f5fc530.stex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/node25d/icons/ysort25d.png" -dest_files=[ "res://.import/ysort25d.png-d31f6d31844267009448064818383c0d.stex" ] +source_file="res://addons/node25d/icons/node_25d.png" +dest_files=[ "res://.import/node_25d.png-72e45d8600ccbde01c6d9ad51f5fc530.stex" ] [params] diff --git a/misc/2.5d/addons/node25d/icons/node25d_icon.png b/misc/2.5d/addons/node25d/icons/node_25d_icon.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/node25d_icon.png rename to misc/2.5d/addons/node25d/icons/node_25d_icon.png diff --git a/misc/2.5d/addons/node25d/icons/node25d_icon.png.import b/misc/2.5d/addons/node25d/icons/node_25d_icon.png.import similarity index 67% rename from misc/2.5d/addons/node25d/icons/node25d_icon.png.import rename to misc/2.5d/addons/node25d/icons/node_25d_icon.png.import index bac3b6734c..29f4dda834 100644 --- a/misc/2.5d/addons/node25d/icons/node25d_icon.png.import +++ b/misc/2.5d/addons/node25d/icons/node_25d_icon.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/node25d_icon.png-075c4b266c832f0f269670bad017ac93.stex" +path="res://.import/node_25d_icon.png-2ad780313818706789bbb15408797db2.stex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/node25d/icons/node25d_icon.png" -dest_files=[ "res://.import/node25d_icon.png-075c4b266c832f0f269670bad017ac93.stex" ] +source_file="res://addons/node25d/icons/node_25d_icon.png" +dest_files=[ "res://.import/node_25d_icon.png-2ad780313818706789bbb15408797db2.stex" ] [params] diff --git a/misc/2.5d/addons/node25d/icons/shadowmath25d.png b/misc/2.5d/addons/node25d/icons/shadow_math_25d.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/shadowmath25d.png rename to misc/2.5d/addons/node25d/icons/shadow_math_25d.png diff --git a/misc/2.5d/addons/node25d/icons/shadowmath25d.png.import b/misc/2.5d/addons/node25d/icons/shadow_math_25d.png.import similarity index 67% rename from misc/2.5d/addons/node25d/icons/shadowmath25d.png.import rename to misc/2.5d/addons/node25d/icons/shadow_math_25d.png.import index 42ef89f7d0..54046259e2 100644 --- a/misc/2.5d/addons/node25d/icons/shadowmath25d.png.import +++ b/misc/2.5d/addons/node25d/icons/shadow_math_25d.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/shadowmath25d.png-829bb9aabf7e847ec9c9f29f41353471.stex" +path="res://.import/shadow_math_25d.png-333790a3285ee4c26792088985815eba.stex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/node25d/icons/shadowmath25d.png" -dest_files=[ "res://.import/shadowmath25d.png-829bb9aabf7e847ec9c9f29f41353471.stex" ] +source_file="res://addons/node25d/icons/shadow_math_25d.png" +dest_files=[ "res://.import/shadow_math_25d.png-333790a3285ee4c26792088985815eba.stex" ] [params] diff --git a/misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png b/misc/2.5d/addons/node25d/icons/shadow_math_25d_icon.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png rename to misc/2.5d/addons/node25d/icons/shadow_math_25d_icon.png diff --git a/misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png.import b/misc/2.5d/addons/node25d/icons/shadow_math_25d_icon.png.import similarity index 65% rename from misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png.import rename to misc/2.5d/addons/node25d/icons/shadow_math_25d_icon.png.import index 107f5cf731..3c8a11d040 100644 --- a/misc/2.5d/addons/node25d/icons/shadowmath25d_icon.png.import +++ b/misc/2.5d/addons/node25d/icons/shadow_math_25d_icon.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/shadowmath25d_icon.png-2b9af3adf31a4021b98dae0a81fb9294.stex" +path="res://.import/shadow_math_25d_icon.png-f286bd905218b9a04121a430c1fdd042.stex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/node25d/icons/shadowmath25d_icon.png" -dest_files=[ "res://.import/shadowmath25d_icon.png-2b9af3adf31a4021b98dae0a81fb9294.stex" ] +source_file="res://addons/node25d/icons/shadow_math_25d_icon.png" +dest_files=[ "res://.import/shadow_math_25d_icon.png-f286bd905218b9a04121a430c1fdd042.stex" ] [params] diff --git a/misc/2.5d/addons/node25d/icons/ysort25d.png b/misc/2.5d/addons/node25d/icons/y_sort_25d.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/ysort25d.png rename to misc/2.5d/addons/node25d/icons/y_sort_25d.png diff --git a/misc/2.5d/addons/node25d/icons/y_sort_25d.png.import b/misc/2.5d/addons/node25d/icons/y_sort_25d.png.import new file mode 100644 index 0000000000..64a7c359da --- /dev/null +++ b/misc/2.5d/addons/node25d/icons/y_sort_25d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d.png-2e15f3765afd8b0136201cb9dea4049b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d/icons/y_sort_25d.png" +dest_files=[ "res://.import/y_sort_25d.png-2e15f3765afd8b0136201cb9dea4049b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/addons/node25d/icons/ysort25d_icon.png b/misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png similarity index 100% rename from misc/2.5d/addons/node25d/icons/ysort25d_icon.png rename to misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png diff --git a/misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png.import b/misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png.import new file mode 100644 index 0000000000..f1dab61a48 --- /dev/null +++ b/misc/2.5d/addons/node25d/icons/y_sort_25d_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d_icon.png-48050bfa8b299992a68b4f1e12bd5d44.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d/icons/y_sort_25d_icon.png" +dest_files=[ "res://.import/y_sort_25d_icon.png-48050bfa8b299992a68b4f1e12bd5d44.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import b/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import deleted file mode 100644 index a781fa62ae..0000000000 --- a/misc/2.5d/addons/node25d/icons/ysort25d_icon.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/ysort25d_icon.png-7203736c3c997b4f31f7b878b0530dfd.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/node25d/icons/ysort25d_icon.png" -dest_files=[ "res://.import/ysort25d_icon.png-7203736c3c997b4f31f7b878b0530dfd.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/misc/2.5d/addons/node25d/main_screen/gizmo_25d.gd b/misc/2.5d/addons/node25d/main_screen/gizmo_25d.gd new file mode 100644 index 0000000000..54a386c144 --- /dev/null +++ b/misc/2.5d/addons/node25d/main_screen/gizmo_25d.gd @@ -0,0 +1,105 @@ +tool +extends Node2D + +# Not pixel perfect for all axes in all modes, but works well enough. +# Rounding is not done until after the movement is finished. +const ROUGHLY_ROUND_TO_PIXELS = true + +# Set when the node is created. +var node_25d: Node25D +var spatial_node + +# Input from Viewport25D, represents if the mouse is clicked. +var wants_to_move = false + +# Used to control the state of movement. +var _moving = false +var _start_position = Vector2() + +# Stores state of closest or currently used axis. +var dominant_axis + +onready var lines_root = $Lines +onready var lines = [$Lines/X, $Lines/Y, $Lines/Z] + +func _process(_delta): + if !lines: + return # Somehow this node hasn't been set up yet. + if !node_25d: + return # We're most likely viewing the Gizmo25D scene. + # While getting the mouse position works in any viewport, it doesn't do + # anything significant unless the mouse is in the 2.5D viewport. + var mouse_position = get_local_mouse_position() + if !_moving: + # If the mouse is farther than this many pixels, it won't grab anything. + var closest_distance = 20.0 + dominant_axis = -1 + for i in range(3): + lines[i].modulate.a = 0.8 # Unrelated, but needs a loop too. + var distance = _distance_to_segment_at_index(i, mouse_position) + if distance < closest_distance: + closest_distance = distance + dominant_axis = i + if dominant_axis == -1: + # If we're not hovering over a line, ensure they are placed correctly. + lines_root.global_position = node_25d.global_position + return + + lines[dominant_axis].modulate.a = 1 + if !wants_to_move: + _moving = false + elif wants_to_move and !_moving: + _moving = true + _start_position = mouse_position + + if _moving: + # Change modulate of unselected axes. + lines[(dominant_axis + 1) % 3].modulate.a = 0.5 + lines[(dominant_axis + 2) % 3].modulate.a = 0.5 + # Calculate mouse movement and reset for next frame. + var mouse_diff = mouse_position - _start_position + _start_position = mouse_position + # Calculate movement. + var projected_diff = mouse_diff.project(lines[dominant_axis].points[1]) + var movement = projected_diff.length() / Node25D.SCALE + if is_equal_approx(PI, projected_diff.angle_to(lines[dominant_axis].points[1])): + movement *= -1 + # Apply movement. + spatial_node.transform.origin += spatial_node.transform.basis[dominant_axis] * movement + else: + # Make sure the gizmo is located at the object. + global_position = node_25d.global_position + if ROUGHLY_ROUND_TO_PIXELS: + spatial_node.transform.origin = (spatial_node.transform.origin * Node25D.SCALE).round() / Node25D.SCALE + # Move the gizmo lines appropriately. + lines_root.global_position = node_25d.global_position + node_25d.property_list_changed_notify() + + +# Initializes after _ready due to the onready vars, called manually in Viewport25D.gd. +# Sets up the points based on the basis values of the Node25D. +func initialize(): + var basis = node_25d.get_basis() + for i in range(3): + lines[i].points[1] = basis[i] * 3 + global_position = node_25d.global_position + spatial_node = node_25d.get_child(0) + + +# Figures out if the mouse is very close to a segment. This method is +# specialized for this script, it assumes that each segment starts at +# (0, 0) and it provides a deadzone around the origin. +func _distance_to_segment_at_index(index, point): + if !lines: + return INF + if point.length_squared() < 400: + return INF + + var segment_end = lines[index].points[1] + var length_squared = segment_end.length_squared() + if length_squared < 400: + return INF + + var t = clamp(point.dot(segment_end) / length_squared, 0, 1) + var projection = t * segment_end + return point.distance_to(projection) diff --git a/misc/2.5d/addons/node25d/main_screen/gizmo_25d.tscn b/misc/2.5d/addons/node25d/main_screen/gizmo_25d.tscn new file mode 100644 index 0000000000..5a565dc62b --- /dev/null +++ b/misc/2.5d/addons/node25d/main_screen/gizmo_25d.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/node25d/main_screen/gizmo_25d.gd" type="Script" id=1] + +[node name="Gizmo25D" type="Node2D"] +script = ExtResource( 1 ) + +[node name="Lines" type="Node2D" parent="."] + +[node name="X" type="Line2D" parent="Lines"] +modulate = Color( 1, 1, 1, 0.8 ) +points = PoolVector2Array( 0, 0, 100, 0 ) +default_color = Color( 0.91, 0.273, 0, 1 ) + +[node name="Y" type="Line2D" parent="Lines"] +modulate = Color( 1, 1, 1, 0.8 ) +points = PoolVector2Array( 0, 0, 0, -100 ) +default_color = Color( 0, 0.91, 0.273, 1 ) + +[node name="Z" type="Line2D" parent="Lines"] +modulate = Color( 1, 1, 1, 0.8 ) +points = PoolVector2Array( 0, 0, 0, 100 ) +default_color = Color( 0.3, 0, 1, 1 ) diff --git a/misc/2.5d/addons/node25d/main_screen/main_screen_25d.tscn b/misc/2.5d/addons/node25d/main_screen/main_screen_25d.tscn new file mode 100644 index 0000000000..a4ea542096 --- /dev/null +++ b/misc/2.5d/addons/node25d/main_screen/main_screen_25d.tscn @@ -0,0 +1,173 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/node25d/main_screen/viewport_25d.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/main_screen/view_mode_button_group.tres" type="ButtonGroup" id=2] + +[sub_resource type="ViewportTexture" id=1] +viewport_path = NodePath("Viewport25D/Viewport2D") + +[sub_resource type="ViewportTexture" id=2] +viewport_path = NodePath("Viewport25D/ViewportOverlay") + +[node name="MainScreen25D" type="VBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TopBar" type="HBoxContainer" parent="."] +margin_right = 1600.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 0, 32 ) +size_flags_horizontal = 3 + +[node name="ViewModeButtons" type="HBoxContainer" parent="TopBar"] +margin_right = 798.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 + +[node name="45Degree" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_right = 94.0 +margin_bottom = 32.0 +pressed = true +group = ExtResource( 2 ) +text = "45 Degree" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Isometric" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_left = 98.0 +margin_right = 188.0 +margin_bottom = 32.0 +group = ExtResource( 2 ) +text = "Isometric" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TopDown" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_left = 192.0 +margin_right = 283.0 +margin_bottom = 32.0 +group = ExtResource( 2 ) +text = "Top Down" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FrontSide" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_left = 287.0 +margin_right = 379.0 +margin_bottom = 32.0 +group = ExtResource( 2 ) +text = "Front Side" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ObliqueY" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_left = 383.0 +margin_right = 473.0 +margin_bottom = 32.0 +group = ExtResource( 2 ) +text = "Oblique Y" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ObliqueZ" type="CheckBox" parent="TopBar/ViewModeButtons"] +margin_left = 477.0 +margin_right = 568.0 +margin_bottom = 32.0 +group = ExtResource( 2 ) +text = "Oblique Z" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Zoom" type="HBoxContainer" parent="TopBar"] +margin_left = 802.0 +margin_right = 1600.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 +alignment = 2 + +[node name="ZoomOut" type="Button" parent="TopBar/Zoom"] +margin_left = 680.0 +margin_right = 710.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 30, 0 ) +text = "-" + +[node name="ZoomPercent" type="Label" parent="TopBar/Zoom"] +margin_left = 714.0 +margin_top = 9.0 +margin_right = 764.0 +margin_bottom = 23.0 +rect_min_size = Vector2( 50, 0 ) +text = "100%" +align = 1 +clip_text = true + +[node name="ZoomReset" type="Button" parent="TopBar/Zoom/ZoomPercent"] +modulate = Color( 1, 1, 1, 0 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ZoomIn" type="Button" parent="TopBar/Zoom"] +margin_left = 768.0 +margin_right = 798.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 30, 0 ) +text = "+" + +[node name="Viewport25D" type="ColorRect" parent="."] +margin_top = 36.0 +margin_right = 1600.0 +margin_bottom = 900.0 +rect_clip_content = true +size_flags_horizontal = 3 +size_flags_vertical = 3 +color = Color( 0.301961, 0.301961, 0.301961, 1 ) +script = ExtResource( 1 ) + +[node name="Viewport2D" type="Viewport" parent="Viewport25D"] +size = Vector2( 1600, 864 ) +transparent_bg = true +disable_3d = true +usage = 1 +render_target_v_flip = true + +[node name="ViewportOverlay" type="Viewport" parent="Viewport25D"] +size = Vector2( 1600, 864 ) +transparent_bg = true +disable_3d = true +usage = 1 +render_target_v_flip = true + +[node name="ViewportTexture" type="TextureRect" parent="Viewport25D"] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = SubResource( 1 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Overlay" type="TextureRect" parent="Viewport25D/ViewportTexture"] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = SubResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +[connection signal="pressed" from="TopBar/Zoom/ZoomOut" to="Viewport25D" method="_on_ZoomOut_pressed"] +[connection signal="pressed" from="TopBar/Zoom/ZoomPercent/ZoomReset" to="Viewport25D" method="_on_ZoomReset_pressed"] +[connection signal="pressed" from="TopBar/Zoom/ZoomIn" to="Viewport25D" method="_on_ZoomIn_pressed"] diff --git a/misc/2.5d/addons/node25d/main_screen/view_mode_button_group.tres b/misc/2.5d/addons/node25d/main_screen/view_mode_button_group.tres new file mode 100644 index 0000000000..0e55d74023 --- /dev/null +++ b/misc/2.5d/addons/node25d/main_screen/view_mode_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/misc/2.5d/addons/node25d/main_screen/viewport_25d.gd b/misc/2.5d/addons/node25d/main_screen/viewport_25d.gd new file mode 100644 index 0000000000..c6d83d6690 --- /dev/null +++ b/misc/2.5d/addons/node25d/main_screen/viewport_25d.gd @@ -0,0 +1,147 @@ +tool +extends Control + +var zoom_level := 0 +var is_panning = false +var pan_center: Vector2 +var viewport_center: Vector2 +var view_mode_index := 0 + +var editor_interface: EditorInterface # Set in node25d_plugin.gd +var moving = false + +onready var viewport_2d = $Viewport2D +onready var viewport_overlay = $ViewportOverlay +onready var view_mode_button_group: ButtonGroup = $"../TopBar/ViewModeButtons/45Degree".group +onready var zoom_label: Label = $"../TopBar/Zoom/ZoomPercent" +onready var gizmo_25d_scene = preload("res://addons/node25d/main_screen/gizmo_25d.tscn") + +func _ready(): + # Give Godot a chance to fully load the scene. Should take two frames. + yield(get_tree(), "idle_frame") + yield(get_tree(), "idle_frame") + var edited_scene_root = get_tree().edited_scene_root + if !edited_scene_root: + # Godot hasn't finished loading yet, so try loading the plugin again. + editor_interface.set_plugin_enabled("node25d", false) + editor_interface.set_plugin_enabled("node25d", true) + return + # Alright, we're loaded up. Now check if we have a valid world and assign it. + var world_2d = edited_scene_root.get_viewport().world_2d + if world_2d == get_viewport().world_2d: + return # This is the MainScreen25D scene opened in the editor! + viewport_2d.world_2d = world_2d + + +func _process(delta): + if !editor_interface: # Something's not right... bail! + return + + # View mode polling. + var view_mode_changed_this_frame = false + var new_view_mode = view_mode_button_group.get_pressed_button().get_index() + if view_mode_index != new_view_mode: + view_mode_index = new_view_mode + view_mode_changed_this_frame = true + _recursive_change_view_mode(get_tree().edited_scene_root) + + # Zooming. + if Input.is_mouse_button_pressed(BUTTON_WHEEL_UP): + zoom_level += 1 + elif Input.is_mouse_button_pressed(BUTTON_WHEEL_DOWN): + zoom_level -= 1 + var zoom = _get_zoom_amount() + + # Viewport size. + var size = get_global_rect().size + viewport_2d.size = size + + # Viewport transform. + var viewport_trans = Transform2D.IDENTITY + viewport_trans.x *= zoom + viewport_trans.y *= zoom + viewport_trans.origin = viewport_trans.basis_xform(viewport_center) + size / 2 + viewport_2d.canvas_transform = viewport_trans + viewport_overlay.canvas_transform = viewport_trans + + # Delete unused gizmos. + var selection = editor_interface.get_selection().get_selected_nodes() + var overlay_children = viewport_overlay.get_children() + for overlay_child in overlay_children: + var contains = false + for selected in selection: + if selected == overlay_child.node_25d and !view_mode_changed_this_frame: + contains = true + if !contains: + overlay_child.queue_free() + + # Add new gizmos. + for selected in selection: + if selected is Node25D: + var new = true + for overlay_child in overlay_children: + if selected == overlay_child.node_25d: + new = false + if new: + var gizmo = gizmo_25d_scene.instance() + viewport_overlay.add_child(gizmo) + gizmo.node_25d = selected + gizmo.initialize() + + +# This only accepts input when the mouse is inside of the 2.5D viewport. +func _gui_input(event): + if event is InputEventMouseButton: + if event.is_pressed(): + if event.button_index == BUTTON_WHEEL_UP: + zoom_level += 1 + accept_event() + elif event.button_index == BUTTON_WHEEL_DOWN: + zoom_level -= 1 + accept_event() + elif event.button_index == BUTTON_MIDDLE: + is_panning = true + pan_center = viewport_center - event.position + accept_event() + elif event.button_index == BUTTON_LEFT: + var overlay_children = viewport_overlay.get_children() + for overlay_child in overlay_children: + overlay_child.wants_to_move = true + accept_event() + elif event.button_index == BUTTON_MIDDLE: + is_panning = false + accept_event() + elif event.button_index == BUTTON_LEFT: + var overlay_children = viewport_overlay.get_children() + for overlay_child in overlay_children: + overlay_child.wants_to_move = false + accept_event() + elif event is InputEventMouseMotion: + if is_panning: + viewport_center = pan_center + event.position + accept_event() + + +func _recursive_change_view_mode(current_node): + if current_node.has_method("set_view_mode"): + current_node.set_view_mode(view_mode_index) + for child in current_node.get_children(): + _recursive_change_view_mode(child) + + +func _get_zoom_amount(): + var zoom_amount = pow(1.05476607648, zoom_level) # 13th root of 2 + zoom_label.text = str(round(zoom_amount * 1000) / 10) + "%" + return zoom_amount + + +func _on_ZoomOut_pressed(): + zoom_level -= 1 + + +func _on_ZoomIn_pressed(): + zoom_level += 1 + + +func _on_ZoomReset_pressed(): + zoom_level = 0 diff --git a/misc/2.5d/addons/node25d/node25d_plugin.gd b/misc/2.5d/addons/node25d/node25d_plugin.gd index ad1790258d..eb60610153 100644 --- a/misc/2.5d/addons/node25d/node25d_plugin.gd +++ b/misc/2.5d/addons/node25d/node25d_plugin.gd @@ -1,16 +1,43 @@ tool extends EditorPlugin +const MainPanel = preload("res://addons/node25d/main_screen/main_screen_25d.tscn") + +var main_panel_instance func _enter_tree(): - # When this plugin node enters tree, add the custom types - add_custom_type("Node25D", "Node2D", preload("Node25D.gd"), preload("icons/node25d_icon.png")) - add_custom_type("YSort25D", "Node", preload("YSort25D.gd"), preload("icons/ysort25d_icon.png")) - add_custom_type("ShadowMath25D", "KinematicBody", preload("ShadowMath25D.gd"), preload("icons/shadowmath25d_icon.png")) + main_panel_instance = MainPanel.instance() + main_panel_instance.get_child(1).editor_interface = get_editor_interface() + + # Add the main panel to the editor's main viewport. + get_editor_interface().get_editor_viewport().add_child(main_panel_instance) + + # Hide the main panel. + make_visible(false) + # When this plugin node enters tree, add the custom types. + add_custom_type("Node25D", "Node2D", preload("node_25d.gd"), preload("icons/node_25d_icon.png")) + add_custom_type("YSort25D", "Node", preload("y_sort_25d.gd"), preload("icons/y_sort_25d_icon.png")) + add_custom_type("ShadowMath25D", "KinematicBody", preload("shadow_math_25d.gd"), preload("icons/shadow_math_25d_icon.png")) func _exit_tree(): - # When the plugin node exits the tree, remove the custom types + main_panel_instance.queue_free() + # When the plugin node exits the tree, remove the custom types. remove_custom_type("ShadowMath25D") remove_custom_type("YSort25D") remove_custom_type("Node25D") + + +func has_main_screen(): + return true + + +func make_visible(visible): + if visible: + main_panel_instance.show() + else: + main_panel_instance.hide() + + +func get_plugin_name(): + return "2.5D" diff --git a/misc/2.5d/addons/node25d/Node25D.gd b/misc/2.5d/addons/node25d/node_25d.gd similarity index 98% rename from misc/2.5d/addons/node25d/Node25D.gd rename to misc/2.5d/addons/node25d/node_25d.gd index 100acc0e64..be8b00b67f 100644 --- a/misc/2.5d/addons/node25d/Node25D.gd +++ b/misc/2.5d/addons/node25d/node_25d.gd @@ -2,7 +2,7 @@ # The transformation of its 2D form is controlled by its 3D child. tool extends Node2D -class_name Node25D, "res://addons/node25d/icons/node25d_icon.png" +class_name Node25D, "res://addons/node25d/icons/node_25d_icon.png" # SCALE is the number of 2D units in one 3D unit. Ideally, but not necessarily, an integer. const SCALE = 32 diff --git a/misc/2.5d/addons/node25d/ShadowMath25D.gd b/misc/2.5d/addons/node25d/shadow_math_25d.gd similarity index 92% rename from misc/2.5d/addons/node25d/ShadowMath25D.gd rename to misc/2.5d/addons/node25d/shadow_math_25d.gd index 77e20cef8e..8df0182abb 100644 --- a/misc/2.5d/addons/node25d/ShadowMath25D.gd +++ b/misc/2.5d/addons/node25d/shadow_math_25d.gd @@ -3,7 +3,7 @@ # is below the target object in the scene tree (not as a child). tool extends KinematicBody -class_name ShadowMath25D, "res://addons/node25d/icons/shadowmath25d_icon.png" +class_name ShadowMath25D, "res://addons/node25d/icons/shadow_math_25d_icon.png" # The maximum distance below objects that shadows will appear (in 3D units). var shadow_length = 1000.0 diff --git a/misc/2.5d/addons/node25d/YSort25D.gd b/misc/2.5d/addons/node25d/y_sort_25d.gd similarity index 95% rename from misc/2.5d/addons/node25d/YSort25D.gd rename to misc/2.5d/addons/node25d/y_sort_25d.gd index 071fa206c0..1f289820c4 100644 --- a/misc/2.5d/addons/node25d/YSort25D.gd +++ b/misc/2.5d/addons/node25d/y_sort_25d.gd @@ -4,7 +4,7 @@ # sorting is delayed by one frame. tool extends Node # Note: NOT Node2D, Node25D, or YSort -class_name YSort25D, "res://addons/node25d/icons/ysort25d_icon.png" +class_name YSort25D, "res://addons/node25d/icons/y_sort_25d_icon.png" # Whether or not to automatically call sort() in _process(). export(bool) var sort_enabled := true diff --git a/misc/2.5d/assets/cube/Cube.tscn b/misc/2.5d/assets/cube/cube.tscn similarity index 55% rename from misc/2.5d/assets/cube/Cube.tscn rename to misc/2.5d/assets/cube/cube.tscn index a11e6e233f..6034f1c8bc 100644 --- a/misc/2.5d/assets/cube/Cube.tscn +++ b/misc/2.5d/assets/cube/cube.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=5 format=2] -[ext_resource path="res://addons/node25d/icons/ysort25d_icon.png" type="Texture" id=1] -[ext_resource path="res://assets/ui/OverlayCube.tscn" type="PackedScene" id=2] -[ext_resource path="res://assets/cube/CubeMath.gd" type="Script" id=3] -[ext_resource path="res://addons/node25d/YSort25D.gd" type="Script" id=4] +[ext_resource path="res://addons/node25d/icons/y_sort_25d_icon.png" type="Texture" id=1] +[ext_resource path="res://assets/ui/overlay_cube.tscn" type="PackedScene" id=2] +[ext_resource path="res://assets/cube/cube_math.gd" type="Script" id=3] +[ext_resource path="res://addons/node25d/y_sort_25d.gd" type="Script" id=4] [node name="Cube" type="Node2D"] diff --git a/misc/2.5d/assets/cube/CubeMath.gd b/misc/2.5d/assets/cube/cube_math.gd similarity index 95% rename from misc/2.5d/assets/cube/CubeMath.gd rename to misc/2.5d/assets/cube/cube_math.gd index b191d11584..bde261fbb0 100644 --- a/misc/2.5d/assets/cube/CubeMath.gd +++ b/misc/2.5d/assets/cube/cube_math.gd @@ -1,6 +1,6 @@ extends Spatial -onready var _cube_point_scene: PackedScene = preload("res://assets/cube/CubePoint.tscn") +onready var _cube_point_scene: PackedScene = preload("res://assets/cube/cube_point.tscn") onready var _parent = get_parent() var _is_parent_ready := false @@ -29,7 +29,7 @@ func _process(delta): if Input.is_action_just_pressed("view_cube_demo"): # warning-ignore:return_value_discarded - get_tree().change_scene("res://assets/DemoScene.tscn") + get_tree().change_scene("res://assets/demo_scene.tscn") return if _is_parent_ready: diff --git a/misc/2.5d/assets/cube/CubePoint.tscn b/misc/2.5d/assets/cube/cube_point.tscn similarity index 68% rename from misc/2.5d/assets/cube/CubePoint.tscn rename to misc/2.5d/assets/cube/cube_point.tscn index 921818f6f1..d880e9fb02 100644 --- a/misc/2.5d/assets/cube/CubePoint.tscn +++ b/misc/2.5d/assets/cube/cube_point.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=2] -[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] -[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] +[ext_resource path="res://addons/node25d/node_25d.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node_25d_icon.png" type="Texture" id=2] [ext_resource path="res://assets/cube/godot.png" type="Texture" id=3] [node name="CubePoint" type="Node2D"] diff --git a/misc/2.5d/assets/DemoScene.tscn b/misc/2.5d/assets/demo_scene.tscn similarity index 90% rename from misc/2.5d/assets/DemoScene.tscn rename to misc/2.5d/assets/demo_scene.tscn index d635671c97..049814775e 100644 --- a/misc/2.5d/assets/DemoScene.tscn +++ b/misc/2.5d/assets/demo_scene.tscn @@ -1,14 +1,14 @@ [gd_scene load_steps=13 format=2] -[ext_resource path="res://assets/ui/Overlay.tscn" type="PackedScene" id=1] -[ext_resource path="res://assets/player/Player25D.tscn" type="PackedScene" id=2] -[ext_resource path="res://assets/shadow/Shadow25D.tscn" type="PackedScene" id=3] -[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=4] -[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=5] -[ext_resource path="res://assets/platform/textures/fortyfive.png" type="Texture" id=6] -[ext_resource path="res://assets/platform/PlatformSprite.gd" type="Script" id=7] -[ext_resource path="res://addons/node25d/YSort25D.gd" type="Script" id=8] -[ext_resource path="res://addons/node25d/icons/ysort25d_icon.png" type="Texture" id=9] +[ext_resource path="res://assets/ui/overlay.tscn" type="PackedScene" id=1] +[ext_resource path="res://assets/player/player_25d.tscn" type="PackedScene" id=2] +[ext_resource path="res://assets/shadow/shadow_25d.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/node25d/node_25d.gd" type="Script" id=4] +[ext_resource path="res://addons/node25d/icons/node_25d_icon.png" type="Texture" id=5] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=6] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=7] +[ext_resource path="res://addons/node25d/y_sort_25d.gd" type="Script" id=8] +[ext_resource path="res://addons/node25d/icons/y_sort_25d_icon.png" type="Texture" id=9] [sub_resource type="BoxShape" id=1] extents = Vector3( 5, 0.5, 5 ) @@ -24,16 +24,17 @@ extents = Vector3( 5, 0.5, 5 ) [node name="Overlay" parent="." instance=ExtResource( 1 )] [node name="Player25D" parent="." instance=ExtResource( 2 )] -position = Vector2( 0, 0 ) +position = Vector2( 0, -226.274 ) z_index = -3952 [node name="Shadow25D" parent="." instance=ExtResource( 3 )] visible = true -position = Vector2( 0, 0 ) +position = Vector2( 1.00261e-06, 11.2685 ) z_index = -3958 spatial_position = Vector3( 3.13315e-08, -0.498, 3.13315e-08 ) [node name="Platform0" type="Node2D" parent="."] +position = Vector2( -256, -113.137 ) z_index = -3954 script = ExtResource( 4 ) __meta__ = { @@ -58,6 +59,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform1" type="Node2D" parent="."] +position = Vector2( -256, -339.411 ) z_index = -3956 script = ExtResource( 4 ) __meta__ = { @@ -82,6 +84,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform2" type="Node2D" parent="."] +position = Vector2( 0, 22.6274 ) z_index = -3962 script = ExtResource( 4 ) __meta__ = { @@ -106,6 +109,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform3" type="Node2D" parent="."] +position = Vector2( 320, 22.6274 ) z_index = -3960 script = ExtResource( 4 ) __meta__ = { @@ -130,6 +134,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform4" type="Node2D" parent="."] +position = Vector2( 0, -203.647 ) z_index = -3966 script = ExtResource( 4 ) __meta__ = { @@ -154,6 +159,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform5" type="Node2D" parent="."] +position = Vector2( 320, -113.137 ) z_index = -3984 script = ExtResource( 4 ) __meta__ = { @@ -178,6 +184,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform6" type="Node2D" parent="."] +position = Vector2( 320, 113.137 ) z_index = -3982 script = ExtResource( 4 ) __meta__ = { @@ -202,6 +209,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform7" type="Node2D" parent="."] +position = Vector2( 320, 339.411 ) z_index = -3978 script = ExtResource( 4 ) __meta__ = { @@ -226,6 +234,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform20" type="Node2D" parent="."] +position = Vector2( 320, 565.685 ) z_index = -3976 script = ExtResource( 4 ) __meta__ = { @@ -250,6 +259,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform21" type="Node2D" parent="."] +position = Vector2( 320, 791.96 ) z_index = -3972 script = ExtResource( 4 ) __meta__ = { @@ -274,6 +284,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform22" type="Node2D" parent="."] +position = Vector2( 320, 1018.23 ) z_index = -3970 script = ExtResource( 4 ) __meta__ = { @@ -298,6 +309,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform9" type="Node2D" parent="."] +position = Vector2( 640, 339.411 ) z_index = -3974 script = ExtResource( 4 ) __meta__ = { @@ -322,6 +334,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform10" type="Node2D" parent="."] +position = Vector2( 896, 294.156 ) z_index = -3994 script = ExtResource( 4 ) __meta__ = { @@ -346,6 +359,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform11" type="Node2D" parent="."] +position = Vector2( 896, 520.431 ) z_index = -3992 script = ExtResource( 4 ) __meta__ = { @@ -370,6 +384,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform12" type="Node2D" parent="."] +position = Vector2( 896, 746.705 ) z_index = -3988 script = ExtResource( 4 ) __meta__ = { @@ -394,6 +409,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform13" type="Node2D" parent="."] +position = Vector2( 576, 746.705 ) z_index = -3990 script = ExtResource( 4 ) __meta__ = { @@ -418,6 +434,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform14" type="Node2D" parent="."] +position = Vector2( 256, 746.705 ) z_index = -3996 script = ExtResource( 4 ) __meta__ = { @@ -442,6 +459,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform15" type="Node2D" parent="."] +position = Vector2( -64, 746.705 ) z_index = -3998 script = ExtResource( 4 ) __meta__ = { @@ -466,6 +484,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform23" type="Node2D" parent="."] +position = Vector2( -384, 746.705 ) z_index = -4000 script = ExtResource( 4 ) __meta__ = { @@ -490,6 +509,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform16" type="Node2D" parent="."] +position = Vector2( -320, 565.685 ) z_index = -3980 script = ExtResource( 4 ) __meta__ = { @@ -514,6 +534,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform19" type="Node2D" parent="."] +position = Vector2( -320, 339.411 ) z_index = -3986 script = ExtResource( 4 ) __meta__ = { @@ -538,6 +559,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform17" type="Node2D" parent="."] +position = Vector2( -480, 248.902 ) z_index = -3964 script = ExtResource( 4 ) __meta__ = { @@ -562,6 +584,7 @@ texture = ExtResource( 6 ) script = ExtResource( 7 ) [node name="Platform18" type="Node2D" parent="."] +position = Vector2( -480, 22.6274 ) z_index = -3968 script = ExtResource( 4 ) __meta__ = { diff --git a/misc/2.5d/assets/platform/Platform.tscn b/misc/2.5d/assets/platform/platform.tscn similarity index 64% rename from misc/2.5d/assets/platform/Platform.tscn rename to misc/2.5d/assets/platform/platform.tscn index 153bdca246..5885e6bbbe 100644 --- a/misc/2.5d/assets/platform/Platform.tscn +++ b/misc/2.5d/assets/platform/platform.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=6 format=2] -[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] -[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] -[ext_resource path="res://assets/platform/textures/fortyfive.png" type="Texture" id=3] -[ext_resource path="res://assets/platform/PlatformSprite.gd" type="Script" id=4] +[ext_resource path="res://addons/node25d/node_25d.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=3] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=4] [sub_resource type="BoxShape" id=1] extents = Vector3( 5, 0.5, 5 ) diff --git a/misc/2.5d/assets/platform/PlatformSprite.gd b/misc/2.5d/assets/platform/platform_sprite.gd similarity index 57% rename from misc/2.5d/assets/platform/PlatformSprite.gd rename to misc/2.5d/assets/platform/platform_sprite.gd index e817ef5e2b..4b6dcb43cf 100644 --- a/misc/2.5d/assets/platform/PlatformSprite.gd +++ b/misc/2.5d/assets/platform/platform_sprite.gd @@ -1,12 +1,12 @@ tool extends Sprite -onready var _fortyFive = preload("res://assets/platform/textures/fortyfive.png") +onready var _forty_five = preload("res://assets/platform/textures/forty_five.png") onready var _isometric = preload("res://assets/platform/textures/isometric.png") -onready var _topDown = preload("res://assets/platform/textures/topdown.png") -onready var _frontSide = preload("res://assets/platform/textures/frontside.png") -onready var _obliqueY = preload("res://assets/platform/textures/obliqueY.png") -onready var _obliqueZ = preload("res://assets/platform/textures/obliqueZ.png") +onready var _top_down = preload("res://assets/platform/textures/top_down.png") +onready var _front_side = preload("res://assets/platform/textures/front_side.png") +onready var _oblique_y = preload("res://assets/platform/textures/oblique_y.png") +onready var _oblique_z = preload("res://assets/platform/textures/oblique_z.png") func _process(_delta): if Input.is_action_pressed("forty_five_mode"): @@ -26,14 +26,14 @@ func _process(_delta): func set_view_mode(view_mode_index): match view_mode_index: 0: # 45 Degrees - texture = _fortyFive; + texture = _forty_five; 1: # Isometric texture = _isometric 2: # Top Down - texture = _topDown + texture = _top_down 3: # Front Side - texture = _frontSide + texture = _front_side 4: # Oblique Y - texture = _obliqueY + texture = _oblique_y 5: # Oblique Z - texture = _obliqueZ + texture = _oblique_z diff --git a/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import b/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import deleted file mode 100644 index 0349bce759..0000000000 --- a/misc/2.5d/assets/platform/textures/41226408-platform-texture.jpg.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/41226408-platform-texture.jpg-baf3b2df9182218f8ceff003f894b1db.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/platform/textures/41226408-platform-texture.jpg" -dest_files=[ "res://.import/41226408-platform-texture.jpg-baf3b2df9182218f8ceff003f894b1db.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/fortyfive.png b/misc/2.5d/assets/platform/textures/forty_five.png similarity index 100% rename from misc/2.5d/assets/platform/textures/fortyfive.png rename to misc/2.5d/assets/platform/textures/forty_five.png diff --git a/misc/2.5d/assets/platform/textures/forty_five.png.import b/misc/2.5d/assets/platform/textures/forty_five.png.import new file mode 100644 index 0000000000..3fbd8972a6 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/forty_five.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/forty_five.png" +dest_files=[ "res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/frontside.png b/misc/2.5d/assets/platform/textures/front_side.png similarity index 100% rename from misc/2.5d/assets/platform/textures/frontside.png rename to misc/2.5d/assets/platform/textures/front_side.png diff --git a/misc/2.5d/assets/platform/textures/front_side.png.import b/misc/2.5d/assets/platform/textures/front_side.png.import new file mode 100644 index 0000000000..eb4230ffbe --- /dev/null +++ b/misc/2.5d/assets/platform/textures/front_side.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/front_side.png" +dest_files=[ "res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/obliqueY.png b/misc/2.5d/assets/platform/textures/oblique_y.png similarity index 100% rename from misc/2.5d/assets/platform/textures/obliqueY.png rename to misc/2.5d/assets/platform/textures/oblique_y.png diff --git a/misc/2.5d/assets/platform/textures/oblique_y.png.import b/misc/2.5d/assets/platform/textures/oblique_y.png.import new file mode 100644 index 0000000000..d7c1330f26 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/oblique_y.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_y.png" +dest_files=[ "res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/obliqueZ.png b/misc/2.5d/assets/platform/textures/oblique_z.png similarity index 100% rename from misc/2.5d/assets/platform/textures/obliqueZ.png rename to misc/2.5d/assets/platform/textures/oblique_z.png diff --git a/misc/2.5d/assets/platform/textures/oblique_z.png.import b/misc/2.5d/assets/platform/textures/oblique_z.png.import new file mode 100644 index 0000000000..044a1c0f38 --- /dev/null +++ b/misc/2.5d/assets/platform/textures/oblique_z.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_z.png" +dest_files=[ "res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/platform/textures/topdown.png b/misc/2.5d/assets/platform/textures/top_down.png similarity index 100% rename from misc/2.5d/assets/platform/textures/topdown.png rename to misc/2.5d/assets/platform/textures/top_down.png diff --git a/misc/2.5d/assets/shadow/textures/obliqueY.png.import b/misc/2.5d/assets/platform/textures/top_down.png.import similarity index 68% rename from misc/2.5d/assets/shadow/textures/obliqueY.png.import rename to misc/2.5d/assets/platform/textures/top_down.png.import index fba37a4848..fccd60c82a 100644 --- a/misc/2.5d/assets/shadow/textures/obliqueY.png.import +++ b/misc/2.5d/assets/platform/textures/top_down.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/obliqueY.png-676e0b47cedb4b1159610d662414d70c.stex" +path="res://.import/top_down.png-3df3f4c204d6337fdc9aa208196ed940.stex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/shadow/textures/obliqueY.png" -dest_files=[ "res://.import/obliqueY.png-676e0b47cedb4b1159610d662414d70c.stex" ] +source_file="res://assets/platform/textures/top_down.png" +dest_files=[ "res://.import/top_down.png-3df3f4c204d6337fdc9aa208196ed940.stex" ] [params] diff --git a/misc/2.5d/assets/player/Player25D.tscn b/misc/2.5d/assets/player/player_25d.tscn similarity index 71% rename from misc/2.5d/assets/player/Player25D.tscn rename to misc/2.5d/assets/player/player_25d.tscn index eb30e45538..eec8f300fb 100644 --- a/misc/2.5d/assets/player/Player25D.tscn +++ b/misc/2.5d/assets/player/player_25d.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=7 format=2] -[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] -[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] -[ext_resource path="res://assets/player/PlayerMath25D.gd" type="Script" id=3] +[ext_resource path="res://addons/node25d/node_25d.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/player/player_math_25d.gd" type="Script" id=3] [ext_resource path="res://assets/player/textures/jump.png" type="Texture" id=4] -[ext_resource path="res://assets/player/PlayerSprite.gd" type="Script" id=5] +[ext_resource path="res://assets/player/player_sprite.gd" type="Script" id=5] [sub_resource type="BoxShape" id=1] extents = Vector3( 0.5, 1, 0.5 ) @@ -24,6 +24,9 @@ script = ExtResource( 3 ) [node name="CollisionShape" type="CollisionShape" parent="PlayerMath25D"] shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} [node name="PlayerSprite" type="Sprite" parent="."] scale = Vector2( 1, 0.75 ) diff --git a/misc/2.5d/assets/player/PlayerMath25D.gd b/misc/2.5d/assets/player/player_math_25d.gd similarity index 97% rename from misc/2.5d/assets/player/PlayerMath25D.gd rename to misc/2.5d/assets/player/player_math_25d.gd index e49ae85559..adf0e6fce4 100644 --- a/misc/2.5d/assets/player/PlayerMath25D.gd +++ b/misc/2.5d/assets/player/player_math_25d.gd @@ -12,7 +12,7 @@ func _process(delta): if Input.is_action_just_pressed("view_cube_demo"): #warning-ignore:return_value_discarded - get_tree().change_scene("res://assets/cube/Cube.tscn") + get_tree().change_scene("res://assets/cube/cube.tscn") return if Input.is_action_just_pressed("toggle_isometric_controls"): diff --git a/misc/2.5d/assets/player/PlayerSprite.gd b/misc/2.5d/assets/player/player_sprite.gd similarity index 100% rename from misc/2.5d/assets/player/PlayerSprite.gd rename to misc/2.5d/assets/player/player_sprite.gd diff --git a/misc/2.5d/assets/shadow/Shadow25D.tscn b/misc/2.5d/assets/shadow/shadow_25d.tscn similarity index 59% rename from misc/2.5d/assets/shadow/Shadow25D.tscn rename to misc/2.5d/assets/shadow/shadow_25d.tscn index cb7e9e816a..ea6164851a 100644 --- a/misc/2.5d/assets/shadow/Shadow25D.tscn +++ b/misc/2.5d/assets/shadow/shadow_25d.tscn @@ -1,11 +1,11 @@ [gd_scene load_steps=8 format=2] -[ext_resource path="res://addons/node25d/Node25D.gd" type="Script" id=1] -[ext_resource path="res://addons/node25d/icons/node25d_icon.png" type="Texture" id=2] -[ext_resource path="res://addons/node25d/ShadowMath25D.gd" type="Script" id=3] -[ext_resource path="res://addons/node25d/icons/shadowmath25d_icon.png" type="Texture" id=4] -[ext_resource path="res://assets/shadow/textures/fortyfive.png" type="Texture" id=5] -[ext_resource path="res://assets/shadow/ShadowSprite.gd" type="Script" id=6] +[ext_resource path="res://addons/node25d/node_25d.gd" type="Script" id=1] +[ext_resource path="res://addons/node25d/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://addons/node25d/shadow_math_25d.gd" type="Script" id=3] +[ext_resource path="res://addons/node25d/icons/shadow_math_25d_icon.png" type="Texture" id=4] +[ext_resource path="res://assets/shadow/textures/forty_five.png" type="Texture" id=5] +[ext_resource path="res://assets/shadow/shadow_sprite.gd" type="Script" id=6] [sub_resource type="BoxShape" id=1] extents = Vector3( 0.5, 0.001, 0.5 ) @@ -30,6 +30,9 @@ __meta__ = { [node name="CollisionShape" type="CollisionShape" parent="ShadowMath25D"] shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} [node name="ShadowSprite" type="Sprite" parent="."] scale = Vector2( 0.5, 0.5 ) diff --git a/misc/2.5d/assets/shadow/ShadowSprite.gd b/misc/2.5d/assets/shadow/shadow_sprite.gd similarity index 58% rename from misc/2.5d/assets/shadow/ShadowSprite.gd rename to misc/2.5d/assets/shadow/shadow_sprite.gd index 6cced5acdc..f3e4b55270 100644 --- a/misc/2.5d/assets/shadow/ShadowSprite.gd +++ b/misc/2.5d/assets/shadow/shadow_sprite.gd @@ -1,12 +1,12 @@ tool extends Sprite -onready var _fortyFive = preload("res://assets/shadow/textures/fortyfive.png") +onready var _forty_five = preload("res://assets/shadow/textures/forty_five.png") onready var _isometric = preload("res://assets/shadow/textures/isometric.png") -onready var _topDown = preload("res://assets/shadow/textures/topdown.png") -onready var _frontSide = preload("res://assets/shadow/textures/frontside.png") -onready var _obliqueY = preload("res://assets/shadow/textures/obliqueY.png") -onready var _obliqueZ = preload("res://assets/shadow/textures/obliqueZ.png") +onready var _top_down = preload("res://assets/shadow/textures/top_down.png") +onready var _front_side = preload("res://assets/shadow/textures/front_side.png") +onready var _oblique_y = preload("res://assets/shadow/textures/oblique_y.png") +onready var _oblique_z = preload("res://assets/shadow/textures/oblique_z.png") func _process(_delta): if Input.is_action_pressed("forty_five_mode"): @@ -26,14 +26,14 @@ func _process(_delta): func set_view_mode(view_mode_index): match view_mode_index: 0: # 45 Degrees - texture = _fortyFive; + texture = _forty_five; 1: # Isometric texture = _isometric 2: # Top Down - texture = _topDown + texture = _top_down 3: # Front Side - texture = _frontSide + texture = _front_side 4: # Oblique Y - texture = _obliqueY + texture = _oblique_y 5: # Oblique Z - texture = _obliqueZ + texture = _oblique_z diff --git a/misc/2.5d/assets/shadow/textures/fortyfive.png b/misc/2.5d/assets/shadow/textures/forty_five.png similarity index 100% rename from misc/2.5d/assets/shadow/textures/fortyfive.png rename to misc/2.5d/assets/shadow/textures/forty_five.png diff --git a/misc/2.5d/assets/shadow/textures/forty_five.png.import b/misc/2.5d/assets/shadow/textures/forty_five.png.import new file mode 100644 index 0000000000..cd931cd007 --- /dev/null +++ b/misc/2.5d/assets/shadow/textures/forty_five.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/forty_five.png-22dcfa54db51531b3612f686997a3fbe.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/forty_five.png" +dest_files=[ "res://.import/forty_five.png-22dcfa54db51531b3612f686997a3fbe.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/shadow/textures/frontside.png b/misc/2.5d/assets/shadow/textures/front_side.png similarity index 100% rename from misc/2.5d/assets/shadow/textures/frontside.png rename to misc/2.5d/assets/shadow/textures/front_side.png diff --git a/misc/2.5d/assets/shadow/textures/front_side.png.import b/misc/2.5d/assets/shadow/textures/front_side.png.import new file mode 100644 index 0000000000..d43de4b075 --- /dev/null +++ b/misc/2.5d/assets/shadow/textures/front_side.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/front_side.png-1470842d27848ecf4de63924b0b98f42.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/front_side.png" +dest_files=[ "res://.import/front_side.png-1470842d27848ecf4de63924b0b98f42.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/2.5d/assets/shadow/textures/obliqueZ.png b/misc/2.5d/assets/shadow/textures/obliqueZ.png deleted file mode 100644 index 446e9e027c892ae170890f6b2ef3656c9b88f325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmV-b0;>IqP)001%w1ONa4zH07h0006UNkl@Y7{}qqBTb7{Y)@TTK{1LABG?3}#ibh&M60MqM6oXFAr^@wwl+=PTmP;=KAkh8 z8=v0|49p9E|4`{zb45?zJp;F0vtdQ$FIl$fp*P<8_}s?}5f#wCc#VY$|s&7NT|ET$jaJR}Dp`8np~IJaQ~DweVC&YXe^` zM7BsM+qEPRwN^;r0DAa*VlJtBLg&ONhGB6Q^I&oK$T?FglUE_{Q zHrtLwtL7RHoR`&(W6`3|?pv4Lwuwlr(YLCIZqn@hu&-}fF>ChBe)G5=yJbmHl^Z@d z{iO#@J<(IEC~ryE(9~S~q^Yr?n=YvQL6utHD<6$a%*@Svcj%M1-gs!!vcIIVV#77J j4cyb$bH$pD%0K@BGCfYB{nl?n00000NkvXXu0mjfp|=~7 diff --git a/misc/2.5d/assets/shadow/textures/obliqueY.png b/misc/2.5d/assets/shadow/textures/oblique_y.png similarity index 100% rename from misc/2.5d/assets/shadow/textures/obliqueY.png rename to misc/2.5d/assets/shadow/textures/oblique_y.png diff --git a/misc/2.5d/addons/node25d/icons/node25d.png.import b/misc/2.5d/assets/shadow/textures/oblique_y.png.import similarity index 68% rename from misc/2.5d/addons/node25d/icons/node25d.png.import rename to misc/2.5d/assets/shadow/textures/oblique_y.png.import index c5811b6aee..eccac431d8 100644 --- a/misc/2.5d/addons/node25d/icons/node25d.png.import +++ b/misc/2.5d/assets/shadow/textures/oblique_y.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/node25d.png-deca325dc1330ad07256305d79ddc3ba.stex" +path="res://.import/oblique_y.png-47d60a179a2cdeff15364f0e389e6008.stex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/node25d/icons/node25d.png" -dest_files=[ "res://.import/node25d.png-deca325dc1330ad07256305d79ddc3ba.stex" ] +source_file="res://assets/shadow/textures/oblique_y.png" +dest_files=[ "res://.import/oblique_y.png-47d60a179a2cdeff15364f0e389e6008.stex" ] [params] diff --git a/misc/2.5d/assets/shadow/textures/oblique_z.png b/misc/2.5d/assets/shadow/textures/oblique_z.png new file mode 100644 index 0000000000000000000000000000000000000000..0df5de9db0ac68e5bd1917e112941b699a0ff80c GIT binary patch literal 805 zcmV+=1KRwFP)j00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliruQ8)X#7@z0ZNE))_dSjwe>7%xR-wAFER#y{P+j`~9BbZluwQOiv%G+asu37hpr z%1|x=LiW7beeulm-E+?GTsBC$d>*6d4qf#sCkG3Ks!49E*I=guS&ExZ2q)Uw9SU`1nQOu4OJR*+nJOXA3y zUo5IeU11`FCd_zOStPuHge!ubGa+_h>H4s&+deX5RKIMOv51VR*o>~JwjmYwP0HUW z&q2XmgV8k(mQ>6dck2QXTpu@}99^lpd**y#pr;~fmr4F|*oaxPMnyfBeWIn+`I@|Y z9;hhx=+m*)z3v1nnDfwR*ShQES3|WEY}jYMFqD!{ZNJv-L>I_>+?PJqmm;cZ%cf>@ zPBl}$H7%baDi-_8>RDLEwC~LHI1SEcY{i0_Gol{%wW(A=WbB!@(|&zh77x6ilKxJb zLd`QP;&zKXwz98$BA+TMX!*muz2km-{QS_YKIvNQv7c<7H2=1ZnNv#Dr^JCj{b>E| zNdvchY9iHa1$%z?gIA}=8o{KBT#Bf?sz>HequQ{d_Y9_5SF0XdIE!k-223clm#tJp zvEh3gY8Pz>L0KskR90-$hM%pq>*_o#qhvUh@;&g6=bqZ{y!S{+8m~ODVEM8bMW~B! zJotmGLrsgG__y5wFN4LZ4sKY`SuI=s^P44gM^~?pY*}%?t6m?_61=o()w8QSIvvJe zjT-49a7_)no?Er$Wq035?kLMkB!VDF zBoY}}vDetKVN=zzJ)!&B45xmDCQO?&q=* Date: Sun, 1 Mar 2020 03:08:12 -0500 Subject: [PATCH 4/7] 2.5D Editor Viewport for Mono C# --- mono/2.5d/2.5D Demo (Mono C#).csproj | 5 +- mono/2.5d/addons/node25d-cs/Node25D.cs | 50 +++- .../.broken-cs-files/Viewport25D.cs | 230 ++++++++++++++++++ .../addons/node25d-cs/main_screen/Gizmo25D.cs | 168 +++++++++++++ .../node25d-cs/main_screen/gizmo_25d.tscn | 23 ++ .../main_screen/main_screen_25d.tscn | 173 +++++++++++++ .../main_screen/view_mode_button_group.tres | 3 + .../node25d-cs/main_screen/viewport_25d.gd | 149 ++++++++++++ mono/2.5d/addons/node25d-cs/node25d_plugin.gd | 36 ++- mono/2.5d/assets/demo_scene.tscn | 10 +- mono/2.5d/assets/player/PlayerSprite.cs | 5 + 11 files changed, 832 insertions(+), 20 deletions(-) create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/.broken-cs-files/Viewport25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/Gizmo25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/gizmo_25d.tscn create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/main_screen_25d.tscn create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/view_mode_button_group.tres create mode 100644 mono/2.5d/addons/node25d-cs/main_screen/viewport_25d.gd diff --git a/mono/2.5d/2.5D Demo (Mono C#).csproj b/mono/2.5d/2.5D Demo (Mono C#).csproj index 7282c23c2b..0dbfc3d109 100644 --- a/mono/2.5d/2.5D Demo (Mono C#).csproj +++ b/mono/2.5d/2.5D Demo (Mono C#).csproj @@ -1,4 +1,4 @@ - + Debug @@ -53,6 +53,7 @@ + @@ -63,4 +64,4 @@ - \ No newline at end of file + diff --git a/mono/2.5d/addons/node25d-cs/Node25D.cs b/mono/2.5d/addons/node25d-cs/Node25D.cs index 99afb8b684..bdfc9d9029 100644 --- a/mono/2.5d/addons/node25d-cs/Node25D.cs +++ b/mono/2.5d/addons/node25d-cs/Node25D.cs @@ -83,6 +83,10 @@ protected void Node25DReady() /// protected void Node25DProcess() { + if (transform25D.basis == new Basis25D()) + { + SetViewMode(0); + } CheckViewMode(); if (spatialNode != null) { @@ -92,34 +96,60 @@ protected void Node25DProcess() { spatialNode = GetChild(0); } + GlobalPosition = transform25D.FlatPosition; } + public void SetViewMode(int viewModeIndex) + { + switch (viewModeIndex) + { + case 0: + transform25D.basis = Basis25D.FortyFive * SCALE; + break; + case 1: + transform25D.basis = Basis25D.Isometric * SCALE; + break; + case 2: + transform25D.basis = Basis25D.TopDown * SCALE; + break; + case 3: + transform25D.basis = Basis25D.FrontSide * SCALE; + break; + case 4: + transform25D.basis = Basis25D.ObliqueY * SCALE; + break; + case 5: + transform25D.basis = Basis25D.ObliqueZ * SCALE; + break; + } + } + private void CheckViewMode() { - if (Input.IsActionJustPressed("top_down_mode")) + if (Input.IsActionJustPressed("forty_five_mode")) { - transform25D.basis = Basis25D.TopDown * SCALE; + SetViewMode(0); } - else if (Input.IsActionJustPressed("front_side_mode")) + else if (Input.IsActionJustPressed("isometric_mode")) { - transform25D.basis = Basis25D.FrontSide * SCALE; + SetViewMode(1); } - else if (Input.IsActionJustPressed("forty_five_mode")) + else if (Input.IsActionJustPressed("top_down_mode")) { - transform25D.basis = Basis25D.FortyFive * SCALE; + SetViewMode(2); } - else if (Input.IsActionJustPressed("isometric_mode")) + else if (Input.IsActionJustPressed("front_side_mode")) { - transform25D.basis = Basis25D.Isometric * SCALE; + SetViewMode(3); } else if (Input.IsActionJustPressed("oblique_y_mode")) { - transform25D.basis = Basis25D.ObliqueY * SCALE; + SetViewMode(4); } else if (Input.IsActionJustPressed("oblique_z_mode")) { - transform25D.basis = Basis25D.ObliqueZ * SCALE; + SetViewMode(5); } } diff --git a/mono/2.5d/addons/node25d-cs/main_screen/.broken-cs-files/Viewport25D.cs b/mono/2.5d/addons/node25d-cs/main_screen/.broken-cs-files/Viewport25D.cs new file mode 100644 index 0000000000..f1ead376f7 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/main_screen/.broken-cs-files/Viewport25D.cs @@ -0,0 +1,230 @@ +using Godot; + +// This is identical to the GDScript version, yet it doesn't work. +[Tool] +public class Viewport25D : Control +{ + private int zoomLevel = 0; + private bool isPanning = false; + private Vector2 panCenter; + private Vector2 viewportCenter; + private int viewModeIndex = 0; + + // The type or namespace name 'EditorInterface' could not be found (are you missing a using directive or an assembly reference?) + // No idea why this error shows up in VS Code. It builds fine... + public EditorInterface editorInterface; // Set in node25d_plugin.gd + private bool moving = false; + + private Viewport viewport2d; + private Viewport viewportOverlay; + private ButtonGroup viewModeButtonGroup; + private Label zoomLabel; + private PackedScene gizmo25dScene; + + public async override void _Ready() + { + // Give Godot a chance to fully load the scene. Should take two frames. + //yield(get_tree(), "idle_frame"); + //yield(get_tree(), "idle_frame"); + await ToSignal(GetTree(), "idle_frame"); + await ToSignal(GetTree(), "idle_frame"); + var editedSceneRoot = GetTree().EditedSceneRoot; + if (editedSceneRoot == null) + { + // Godot hasn't finished loading yet, so try loading the plugin again. + //editorInterface.SetPluginEnabled("node25d", false); + //editorInterface.SetPluginEnabled("node25d", true); + return; + } + // Alright, we're loaded up. Now check if we have a valid world and assign it. + var world2d = editedSceneRoot.GetViewport().World2d; + if (world2d == GetViewport().World2d) + { + return; // This is the MainScreen25D scene opened in the editor! + } + viewport2d.World2d = world2d; + + // Onready vars. + viewport2d = GetNode("Viewport2D"); + viewportOverlay = GetNode("ViewportOverlay"); + viewModeButtonGroup = GetParent().GetNode("TopBar").GetNode("ViewModeButtons").GetNode