Browse Source

Merge pull request #1039 from AtomicGameEngine/JME-ATOMIC-EXAMPLES

Work on Atomic Examples and Project Templates
JoshEngebretson 9 years ago
parent
commit
8469334bd1

+ 3 - 1
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/MainActivity.cs

@@ -5,6 +5,8 @@ using Android.OS;
 using Android.Views;
 using AtomicEngine;
 
+$$APPLICATION_NAMESPACE$$
+
 namespace AtomicPlayer
 {
     [Activity(Label = "AtomicPlayer", MainLauncher = true,
@@ -17,7 +19,7 @@ namespace AtomicPlayer
         {
             base.OnCreate(bundle);
             var mLayout = new AbsoluteLayout(this);
-            var surface = AndroidSDLSurface.CreateSurface(this, false, typeof(AtomicMain));
+            var surface = AndroidSDLSurface.CreateSurface(this, false, typeof($$APPLICATION_APPDELEGATECLASS$$));
             mLayout.AddView(surface);
             SetContentView(mLayout);
         }

+ 2 - 1
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Desktop/Program.cs

@@ -4,6 +4,7 @@ using System.Reflection;
 using System.Linq;
 
 using AtomicEngine;
+$$APPLICATION_NAMESPACE$$
 
 namespace AtomicPlayer
 {
@@ -11,7 +12,7 @@ namespace AtomicPlayer
     {
         public static void Main(string[] args)
         {
-            Application.Run<AtomicMain>(args);
+            Application.Run<$$APPLICATION_APPDELEGATECLASS$$>(args);
         }
     }
 }

+ 2 - 1
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/iOS/AppUIDelegate.cs

@@ -3,6 +3,7 @@ using UIKit;
 using System.Threading.Tasks;
 
 using AtomicEngine;
+$$APPLICATION_NAMESPACE$$
 
 namespace AtomicPlayer
 {
@@ -18,7 +19,7 @@ namespace AtomicPlayer
         async void LaunchGame()
         {
             await Task.Yield();
-            Application.Run<AtomicMain>(new string[0]);
+            Application.Run<$$APPLICATION_APPDELEGATECLASS$$>(new string[0]);
         }
     }
 }

+ 155 - 530
Data/AtomicEditor/ExampleInfo/Examples.json

@@ -1,532 +1,157 @@
 {
-	"examples" : [
-			{
-				"name": "C# Basic2D",
-				"desc" : "The C# Basic2D example project",
-				"screenshot" : "Basic2D.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/Basic2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "C# Basic3D",
-				"desc" : "The C# Basic3D example project",
-				"screenshot" : "Basic3D.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/Basic3D"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "C# Physics2D",
-				"desc" : "Moving platforms, vines, and neat 2D lighting",
-				"screenshot" : "PhysicsPlatformer2D.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/Physics2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "C# Butterflies",
-				"desc" : "An example of particles driven by C#",
-				"screenshot" : "Butterflies.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/Butterflies"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "C# Atomic Mutant",
-				"desc" : "A 3D physics example featuring a terrifying mutant",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/AtomicMutant"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "C# Atomic Blaster",
-				"desc" : "An example of a ported XNA C# program",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "C#",
-						"folder" : "AtomicNET/AtomicBlaster"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Javascript Basic 2D",
-				"desc" : "A Javascript example of a 2D sprite in a scene",
-				"screenshot" : "Basic2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Basic2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Javascript Basic 3D",
-				"desc" : "A Javascript example of a 3D object in a scene",
-				"screenshot" : "Basic3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Basic3D"
-					}
-				],
-				"module" : "3D"
-			},			{
-				"name": "Physics Platformer 2D",
-				"desc" : "Moving platforms, vines, and neat 2D lighting in Javascript",
-				"screenshot" : "PhysicsPlatformer2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "PhysicsPlatformer"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "ToonTown",
-				"desc" : "Town, Terrain, Day/Night Cycles in Javascript",
-				"screenshot" : "ToonTown.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "ToonTown"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "SpaceGame",
-				"desc" : "A 2D Arcade Space Game in Javascript",
-				"screenshot" : "SpaceGame.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "SpaceGame"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Roboman 3D",
-				"desc" : "A 3D physics example featuring Roboman!",
-				"screenshot" : "Roboman3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "RoboMan3D"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Web Browser",
-				"desc" : "A multi-tab browser using UIWebView",
-				"screenshot" : "UIWebView.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "AtomicWebView"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Cube Map Example",
-				"desc" : "Example of Atomic’s built-in cube map generator",
-				"screenshot" : "CubeMapExample.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "CubeMapExample"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Water Shader",
-				"desc" : "A simple water shader example",
-				"screenshot" : "WaterShip.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WaterShip"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Light 2D",
-				"desc" : "An example of realtime 2D lights with shadows",
-				"screenshot" : "Light2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Light2DExample"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Atomic Drive-in",
-				"desc" : "3D WebView scene example",
-				"screenshot" : "WebView3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebView3D"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "ParticleEmitter3D",
-				"desc" : "An example of 3d particles driven by script",
-				"screenshot" : "ParticleEmitter3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "ParticleEmitter3D"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "3D Web Texture",
-				"desc" : "Simple 3D web texture with raycasting",
-				"screenshot" : "WebTexture3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebTexture"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Character Animation 2D",
-				"desc" : "Example of controlling a Spriter animated character",
-				"screenshot" : "CharacterAnimation2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "CharacterAnimation2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Character Animation 3D",
-				"desc" : "Example of controlling a skeletally animated character",
-				"screenshot" : "CharacterAnimation3D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "CharacterAnimation3D"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Butterflies",
-				"desc" : "An example of particles driven by script",
-				"screenshot" : "Butterflies.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Butterflies"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "BunnyMark",
-				"desc" : "A benchmark test using sprite bunnies",
-				"screenshot" : "BunnyMark.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "BunnyMark"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Breakout",
-				"desc" : "2D Breakout game with touch controls",
-				"screenshot" : "Breakout.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Breakout"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Render to Texture",
-				"desc" : "An example of a scene rendered onto a 3D object",
-				"screenshot" : "RenderToTexture.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "RenderToTexture"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "UI Scene View",
-				"desc" : "UI example showing a scene playing inside a UI frame",
-				"screenshot" : "UISceneView2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "UISceneView2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Chickens",
-				"desc" : "Chickens!",
-				"screenshot" : "Chickens.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Chickens"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Particles 2D",
-				"desc" : "An example of the 2D particle system",
-				"screenshot" : "Particles2D.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "Particles2D"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Event Loop",
-				"desc" : "An example using the JavaScript event loop",
-				"screenshot" : "EventLoop.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "EventLoop"
-					}
-				],
-				"module" : "2D"
-			},
-            
-			{
-				"name": "PBR Scene",
-				"desc" : "An example of PBR scene",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "PBRSceneExample"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Custom Geometry",
-				"desc" : "An example of custom geometry",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "CustomGeometry"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Editor Plugin",
-				"desc" : "An example of an Editor Plugin",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "Typescript",
-						"folder" : "EditorPluginExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "File Access",
-				"desc" : "An example of using files in Atomic",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "FileExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "Http Request",
-				"desc" : "An example of a HttpRequest",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "HttpRequestExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "MultiScript",
-				"desc" : "An example of a MultiScript program",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "MultiScript"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "Native Plugin",
-				"desc" : "An example of a Native Plugin",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "NativePluginExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "TypeScript Roboman3D",
-				"desc" : "An example of Roboman3D in TypeScript",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "TypeScript",
-						"folder" : "Roboman3DTypeScript"
-					}
-				],
-				"module" : "3D"
-			},
-			{
-				"name": "Multiplayer SpaceGame",
-				"desc" : "An example of a Multiplayer SpaceGame",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "SpaceGameMultiplayer"
-					}
-				],
-				"module" : "2D"
-			},
-			{
-				"name": "Test Inspector Fields",
-				"desc" : "A Test of Inspector Fields",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "TestInspectorFields"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "WebRequest Headers",
-				"desc" : "An example of WebRequest Headers",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebRequestHeadersExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "Simple WebRequest",
-				"desc" : "An example of a simple WebRequest",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebRequestSimpleExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "WebSocket",
-				"desc" : "An example of a WebSocket",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebSocketExample"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "Web Texture",
-				"desc" : "An example of a Web Texture",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebTexture"
-					}
-				],
-				"module" : "1D"
-			},
-			{
-				"name": "WebView Properties",
-				"desc" : "An example of WebView Properties",
-				"screenshot" : "Example.png",
-				"templates" : [
-					{
-						"language" : "JavaScript",
-						"folder" : "WebViewProperties"
-					}
-				],
-				"module" : "1D"
-			}
-	]
+    "examples" : [
+
+        {
+            "name": "Basic2D",
+            "desc" : "Basic2D Scene Example",
+            "screenshot" : "Basic2D.png",
+            "folder" : "Basic2D"
+        },
+        {
+            "name": "Basic3D",
+            "desc" : "Basic3D Scene Example",
+            "screenshot" : "Basic3D.png",
+            "folder" : "Basic3D"
+        },
+        {
+            "name": "2D Physics Platformer",
+            "desc" : "Moving platforms, vines, bats, oh my!",
+            "screenshot" : "PhysicsPlatformer2D.png",
+            "folder" : "PhysicsPlatformer"
+        },
+        {
+            "name": "ToonTown",
+            "desc" : "A cartoony scene with 3D character and physics",
+            "screenshot" : "ToonTown.png",
+            "folder" : "ToonTown"
+        },
+        {
+            "name": "AtomicBlaster",
+            "desc" : "Port of ShapeBlaster for XNA by Michael Hoffman",
+            "screenshot" : "Example.png",
+            "namespace" : "AtomicBlaster",
+            "appDelegateClass" : "GameRoot",
+            "folder" : "AtomicBlaster"
+        },
+        {
+            "name": "Roboman3D",
+            "desc" : "Character Controller with Physics",
+            "screenshot" : "Roboman3D.png",
+            "folder" : "RoboMan3D"
+        },
+        {
+            "name": "AtomicMutant",
+            "desc" : "Character Controller with Physics",
+            "screenshot" : "Example.png",
+            "folder" : "AtomicMutant"
+        },
+        {
+            "name": "Butterflies",
+            "desc" : "Beautiful Butterflies!",
+            "screenshot" : "Butterflies.png",
+            "folder" : "Butterflies"
+        },
+        {
+            "name": "Space Game",
+            "desc" : "Example of simple game loop, UI, post process effects",
+            "screenshot" : "SpaceGame.png",
+            "folder" : "SpaceGame"
+        },
+        {
+            "name": "UIWebView",
+            "desc" : "Example Chromium WebView Widget",
+            "screenshot" : "UIWebView.png",
+            "folder" : "AtomicWebView"
+        },
+        {
+            "name": "WebView3D",
+            "desc" : "Example rendering a Chromium WebView in a 3D scene",
+            "screenshot" : "WebView3D.png",
+            "folder" : "WebView3D"
+        },
+        {
+            "name": "ParticleEmitter3D",
+            "desc" : "3D Particle Emitters",
+            "screenshot" : "ParticleEmitter3D.png",
+            "folder" : "ParticleEmitter3D"
+        },
+        {
+            "name": "Particles2D",
+            "desc" : "2D Particle Emitters",
+            "screenshot" : "Particles2D.png",
+            "folder" : "Particles2D"
+        },
+        {
+            "name": "Physics2D",
+            "desc" : "Simple 2D physics example",
+            "screenshot" : "Example.png",
+            "folder" : "Physics2D"
+        },
+        {
+            "name": "Breakout",
+            "desc" : "Simple version of the arcade classic",
+            "screenshot" : "Breakout.png",
+            "folder" : "Breakout"
+        },
+        {
+            "name": "CharacterAnimation2D",
+            "desc" : "2D Character Animation using Spriter",
+            "screenshot" : "CharacterAnimation2D.png",
+            "folder" : "CharacterAnimation2D"
+        },
+        {
+            "name": "CharacterAnimation3D",
+            "desc" : "3D Character Controller example",
+            "screenshot" : "CharacterAnimation3D.png",
+            "folder" : "CharacterAnimation3D"
+        },
+        {
+            "name": "Chickens",
+            "desc" : "Animated chickens, wandering about, cluck!",
+            "screenshot" : "Chickens.png",
+            "folder" : "Chickens"
+        },
+        {
+            "name": "CubeMapExample",
+            "desc" : "Cubemap rendering and generator example",
+            "screenshot" : "CubeMapExample.png",
+            "folder" : "CubeMapExample"
+        },
+        {
+            "name": "Light2D",
+            "desc" : "2D Lighting with shadows",
+            "screenshot" : "Light2D.png",
+            "folder" : "Light2DExample"
+        },
+        {
+            "name": "Render to Texture",
+            "desc" : "Example of rendering a scene on a 3d object",
+            "screenshot" : "RenderToTexture.png",
+            "folder" : "RenderToTexture"
+        },
+        {
+            "name": "Multiplayer Space Game",
+            "desc" : "Space Game varient with master server and NAT punchthru",
+            "screenshot" : "SpaceGame.png",
+            "folder" : "SpaceGameMultiplayer"
+        },
+        {
+            "name": "UISceneView2D",
+            "desc" : "Example of rendering a scene to a UISceneView widget",
+            "screenshot" : "UISceneView2D.png",
+            "folder" : "UISceneView2D"
+        },
+        {
+            "name": "WebTexture3D",
+            "desc" : "Example rendering a Chromium WebView on a 3D surface",
+            "screenshot" : "WebTexture3D.png",
+            "folder" : "WebTexture"
+        },
+        {
+            "name": "WaterShip",
+            "desc" : "Example water shader",
+            "screenshot" : "WaterShip.png",
+            "folder" : "WaterShip"
+        }
+    ]
 }

+ 6 - 48
Data/AtomicEditor/ProjectTemplates/ProjectTemplates.json

@@ -1,62 +1,20 @@
 {
     "project_2d": {
         "desc": "",
-        "module": "2D",
         "name": "2D Project",
-        "screenshot": "",
-        "templates": [
-            {
-                "folder": "Project2D/JavaScript",
-                "language": "JavaScript"
-            },
-            {
-                "folder": "Project2D/TypeScript",
-                "language": "TypeScript"
-            },
-            {
-                "folder": "Project2D/CSharp",
-                "language": "CSharp"
-            }
-        ]
+        "screenshot" : "Basic2D.png",
+        "folder" : "Project2D"
     },
     "project_3d": {
         "desc": "",
-        "module": "3D",
         "name": "3D Project",
-        "screenshot": "",
-        "templates": [
-            {
-                "folder": "Project3D/JavaScript",
-                "language": "JavaScript"
-            },
-            {
-                "folder": "Project3D/TypeScript",
-                "language": "TypeScript"
-            },
-            {
-                "folder": "Project3D/CSharp",
-                "language": "CSharp"
-            }
-        ]
+        "screenshot" : "Basic3D.png",
+        "folder" : "Project3D"
     },
     "project_empty": {
         "desc": "",
-        "module": "",
         "name": "Empty Project",
-        "screenshot": "",
-        "templates": [
-            {
-                "folder": "EmptyProject/JavaScript",
-                "language": "JavaScript"
-            },
-            {
-                "folder": "EmptyProject/TypeScript",
-                "language": "TypeScript"
-            },
-            {
-                "folder": "EmptyProject/CSharp",
-                "language": "CSharp"
-            }
-        ]
+        "screenshot": "Example.png",
+        "folder" : "EmptyProject"
     }
 }

+ 15 - 5
Resources/EditorData/AtomicEditor/editor/ui/welcomeframe.tb.txt

@@ -32,9 +32,19 @@ TBLayout: distribution: gravity, size: available, axis: y, id: welcomelayout, po
         TBLayout: distribution: gravity, axis: y, spacing: 12
             TBLayout: distribution: gravity, size: available
                 TBContainer: gravity: left right
-                    TBLayout: distribution: gravity
-                        TBEditField: text: "More Examples:", styling: 1, readonly: 1, adapt-to-content: 1, skin: AccentColor2
-                        TBButton: id: 'examples_github' text: "https://github.com/AtomicGameEngine/AtomicExamples", skin: TBButton.link
-                        TBWidget: gravity: left right
-            TBScrollContainer: scroll-mode: auto
+                    TBLayout: axis: y, spacing: 12
+                        TBLayout: distribution: gravity
+                            TBEditField: text: "Filter Examples:", styling: 1, readonly: 1, adapt-to-content: 1, skin: AccentColor2
+                            TBButton: id: 'examples_csharp', text: "CSharp", value: 0, toggle-mode: 1
+                                lp: width: 92
+                            TBButton: id: 'examples_javascript', text: "JavaScript", value: 0, toggle-mode: 1
+                                lp: width: 92
+                            TBButton: id: 'examples_typescript', text: "TypeScript", value: 0, toggle-mode: 1
+                                lp: width: 92
+                            TBWidget: gravity: left right
+                        TBLayout: distribution: gravity
+                            TBEditField: text: "More Examples:", styling: 1, readonly: 1, adapt-to-content: 1, skin: AccentColor2
+                            TBButton: id: 'examples_github' text: "https://github.com/AtomicGameEngine/AtomicExamples", skin: TBButton.link
+                            TBWidget: gravity: left right
+            TBScrollContainer: id: examples_scroll, scroll-mode: auto
                 TBLayout: id: examples_layout, axis: y, spacing: 12

+ 55 - 17
Script/AtomicEditor/resources/ProjectTemplates.ts

@@ -28,18 +28,14 @@ export interface ProjectTemplateDefinition {
     name: string;
     desc: string;
     screenshot: string;
-    templates: [ProjectTemplateDetail];
     folder: string;
-    module: string;
+    languages: string[];
+    appDelegateClass: string;
+    namespace: string[];
 }
 
-/**
- * Inner details of the project template.
- */
-export interface ProjectTemplateDetail {
-    language: string;
-    folder: string;
-}
+// Supported project languages
+var projectLanguages = ["CSharp", "JavaScript", "TypeScript"];
 
 /**
  * Returns the structured template definition for the provided project type.
@@ -48,7 +44,10 @@ export interface ProjectTemplateDetail {
  * @return {ProjectTemplateDefinition}              the template definition for the proved project type
  */
 export function getNewProjectTemplateDefinition(projectType: string): ProjectTemplateDefinition {
+
     var env = ToolCore.toolEnvironment;
+    let fileSystem = Atomic.fileSystem;
+    let exampleInfoDir = env.toolDataDir + "ExampleInfo/";
     var projectTemplateFolder = env.toolDataDir + "ProjectTemplates/";
     var projectTemplateJsonFile = projectTemplateFolder + "ProjectTemplates.json";
     let jsonFile = new Atomic.File(projectTemplateJsonFile, Atomic.FILE_READ);
@@ -59,10 +58,22 @@ export function getNewProjectTemplateDefinition(projectType: string): ProjectTem
     // Update all the paths to a more fully qualified path
     let json = JSON.parse(jsonFile.readText());
     let projectTemplate = <ProjectTemplateDefinition>json[projectType];
+
     if (projectTemplate) {
-        projectTemplate.templates.forEach(template => {
-            template.folder = projectTemplateFolder + template.folder + "/";
-        });
+
+        projectTemplate.screenshot = exampleInfoDir + projectTemplate.screenshot;
+        projectTemplate.folder = projectTemplateFolder + projectTemplate.folder + "/";
+
+        projectTemplate.languages = [];
+
+        for (var i = 0; i < projectLanguages.length; i++) {
+
+            if (fileSystem.dirExists(projectTemplate.folder + projectLanguages[i])) {
+                projectTemplate.languages.push(projectLanguages[i]);
+            }
+
+        }
+
     }
 
     return projectTemplate;
@@ -74,7 +85,9 @@ export function getNewProjectTemplateDefinition(projectType: string): ProjectTem
  * @return {[ProjectTemplateDefinition]} Array of example project definitions.
  */
 export function getExampleProjectTemplateDefinitions(): [ProjectTemplateDefinition] {
+
     let env = ToolCore.toolEnvironment;
+    let fileSystem = Atomic.fileSystem;
     let exampleInfoDir = env.toolDataDir + "ExampleInfo/";
     let exampleJsonFile = exampleInfoDir + "Examples.json";
     let jsonFile = new Atomic.File(exampleJsonFile, Atomic.FILE_READ);
@@ -88,11 +101,23 @@ export function getExampleProjectTemplateDefinitions(): [ProjectTemplateDefiniti
 
     // Update all the paths to a more fully qualified path
     examples.forEach(example => {
+
+        example.folder = env.toolDataDir + "AtomicExamples/" + example.folder + "/";
+
+        example.languages = [];
+
+        for (var i = 0; i < projectLanguages.length; i++) {
+
+            if (fileSystem.dirExists(example.folder + projectLanguages[i])) {
+                example.languages.push(projectLanguages[i]);
+            }
+
+        }
+
         example.screenshot = exampleInfoDir + example.screenshot;
-        example.templates.forEach(template => {
-            template.folder = env.toolDataDir + "AtomicExamples/" + template.folder + "/";
-        });
+
     });
+
     return exampleJson.examples;
 }
 
@@ -120,6 +145,7 @@ export interface AtomicNETProjectInfo {
     appID: string;
     platforms: string[];
     projectFolder: string;
+    projectTemplate: ProjectTemplateDefinition;
 }
 
 var atomicNETProjectInfo:AtomicNETProjectInfo;
@@ -141,8 +167,20 @@ function processAtomicNETTemplate(filename:string, templateFilename:string) : bo
 
     let text = file.readText();
 
+    let _namespace = "";
+    if (atomicNETProjectInfo.projectTemplate.namespace) {
+        _namespace = "using " + atomicNETProjectInfo.projectTemplate.namespace + ";";
+    }
+
+    let appDelegateClass = "AtomicMain";
+    if (atomicNETProjectInfo.projectTemplate.appDelegateClass) {
+        appDelegateClass = atomicNETProjectInfo.projectTemplate.appDelegateClass;
+    }
+
     text = text.split("$$APPLICATION_NAME$$").join(atomicNETProjectInfo.name);
     text = text.split("$$APPLICATION_ID$$").join(atomicNETProjectInfo.appID);
+    text = text.split("$$APPLICATION_APPDELEGATECLASS$$").join(appDelegateClass);
+    text = text.split("$$APPLICATION_NAMESPACE$$").join(_namespace);
 
     let fileOut = new Atomic.File(filename, Atomic.FILE_WRITE);
 
@@ -294,10 +332,10 @@ function generateAtomicNETDesktopProject():boolean {
             return false;
     }
 
-    if (!fileSystem.copy(templateFolder + "Platforms/Desktop/Program.cs", desktopFolder + "Program.cs")) {
+    if (!processAtomicNETTemplate(desktopFolder + "Program.cs", templateFolder + "Platforms/Desktop/Program.cs")) {
         return false;
     }
-
+    
     return true;
 }
 

+ 11 - 0
Script/AtomicEditor/ui/MainToolbar.ts

@@ -76,10 +76,21 @@ class MainToolbar extends Atomic.UIWidget {
             var skin = <Atomic.UISkinImage> this.pauseButton.getWidget("skin_image");
             skin.setSkinBg("PlayButton");
         });
+
         this.subscribeToEvent(EditorEvents.PlayerResumed, (data) => {
             var skin = <Atomic.UISkinImage> this.pauseButton.getWidget("skin_image");
             skin.setSkinBg("PauseButton");
         });
+
+        // TODO: We need better control over playmode during NET compiles
+        this.subscribeToEvent("NETBuildBegin", (data) => {
+            this.playButton.disable();
+        });
+
+        this.subscribeToEvent("NETBuildResult", (data) => {
+            this.playButton.enable();
+        });
+
     }
 
     handleGizmoAxisModeChanged(ev: Editor.GizmoAxisModeChangedEvent) {

+ 50 - 7
Script/AtomicEditor/ui/frames/WelcomeFrame.ts

@@ -35,6 +35,16 @@ class WelcomeFrame extends ScriptWidget {
         this.load("AtomicEditor/editor/ui/welcomeframe.tb.txt");
 
         var recentProjects = <Atomic.UILayout>this.getWidget("recentprojects");
+
+        this.examplesLayout = <Atomic.UILayout>this.getWidget("examples_layout");
+        this.examplesCSharp = <Atomic.UIButton>this.getWidget("examples_csharp");
+        this.examplesJavaScript = <Atomic.UIButton>this.getWidget("examples_javascript");
+        this.examplesTypeScript = <Atomic.UIButton>this.getWidget("examples_typescript");
+
+        this.examplesCSharp.onClick = () => { this.handleExampleFilter(); }
+        this.examplesJavaScript.onClick = () => { this.handleExampleFilter(); }
+        this.examplesTypeScript.onClick = () => { this.handleExampleFilter(); }
+
         this.gravity = Atomic.UI_GRAVITY_ALL;
 
         this.recentList = new Atomic.UIListView();
@@ -67,24 +77,40 @@ class WelcomeFrame extends ScriptWidget {
 
         var fileSystem = Atomic.getFileSystem();
 
-        // Verify that at least one of the projects for this example exists, otherwise bounce out
+        let languages = [];
+        if (this.examplesCSharp.value) {
+            languages.push("CSharp");
+        }
+        if (this.examplesJavaScript.value) {
+            languages.push("JavaScript");
+        }
+        if (this.examplesTypeScript.value) {
+            languages.push("TypeScript");
+        }
+
+        // If user doesn't select any languages, show 'em all'
+        if (!languages.length) {
+            languages = ["CSharp", "JavaScript", "TypeScript"];
+        }
+
         let exists = false;
-        example.templates.forEach(template => {
-            if (fileSystem.dirExists(template.folder)) {
+
+        for (var i = 0; i < languages.length; i++) {
+
+            if (example.languages.indexOf(languages[i]) != -1) {
                 exists = true;
+                break;
             }
-        });
+        }
 
         if (!exists) {
             return;
         }
 
-        var exlayout = <Atomic.UILayout>this.getWidget("examples_layout");
-
         if (!this.currentExampleLayout) {
             this.currentExampleLayout = new Atomic.UILayout();
             this.currentExampleLayout.spacing = 8;
-            exlayout.addChild(this.currentExampleLayout);
+            this.examplesLayout.addChild(this.currentExampleLayout);
         }
 
         // 200x150
@@ -172,7 +198,18 @@ class WelcomeFrame extends ScriptWidget {
 
     }
 
+    handleExampleFilter() {
+
+        this.initExampleBrowser();
+
+    }
+
     initExampleBrowser() {
+
+        this.exampleCount = 0;
+        this.examplesLayout.deleteAllChildren();
+        this.currentExampleLayout = null;
+
         let examples = ProjectTemplates.getExampleProjectTemplateDefinitions();
         for (var i = 0; i < examples.length; i++) {
             this.addExample(examples[i]);
@@ -254,7 +291,13 @@ class WelcomeFrame extends ScriptWidget {
 
     // examples
     exampleCount = 0;
+
     currentExampleLayout: Atomic.UILayout;
+    examplesLayout:Atomic.UILayout;
+
+    examplesCSharp: Atomic.UIButton;
+    examplesJavaScript: Atomic.UIButton;
+    examplesTypeScript: Atomic.UIButton;
 
     recent: string[] = [];
     recentList: Atomic.UIListView;

+ 14 - 12
Script/AtomicEditor/ui/modal/CreateProject.ts

@@ -150,12 +150,10 @@ class CreateProject extends ModalWindow {
 
         }
 
-
         folder = Atomic.addTrailingSlash(folder);
         if (!fileSystem.dirExists(folder)) {
 
             // Determine if we have a language template for the selected language.
-            let templateDetail: ProjectTemplates.ProjectTemplateDetail;
             let selectedLanguage = this.projectLanguageField.text;
 
             // Check whether we have a required IDE installed for C# projects
@@ -170,18 +168,19 @@ class CreateProject extends ModalWindow {
                 }
             }
 
-            for (let i = 0; i < this.projectTemplate.templates.length; i++) {
-                if (this.projectTemplate.templates[i].language === selectedLanguage) {
-                    templateDetail = this.projectTemplate.templates[i];
+            let templateFolder = "";
+            for (let i = 0; i < this.projectTemplate.languages.length; i++) {
+                if (this.projectTemplate.languages[i] === selectedLanguage) {
+                    templateFolder = this.projectTemplate.folder + selectedLanguage + "/";
                     break;
                 }
             }
 
             // Do the creation!
-            if (templateDetail && fileSystem.dirExists(templateDetail.folder)) {
+            if (templateFolder != "" && fileSystem.dirExists(templateFolder)) {
 
-                if (!fileSystem.copyDir(templateDetail.folder, folder)) {
-                  var message = "Unable to copy folder: " + templateDetail.folder + " to " + folder;
+                if (!fileSystem.copyDir(templateFolder, folder)) {
+                  var message = "Unable to copy folder: " + templateFolder + " to " + folder;
                   EditorUI.showModalError("New Project Editor Error", message);
                   return false;
                 }
@@ -243,7 +242,8 @@ class CreateProject extends ModalWindow {
                         name: name,
                         appID : this.appIDField.text,
                         platforms : platforms,
-                        projectFolder : folder
+                        projectFolder : folder,
+                        projectTemplate : this.projectTemplate
                     })) {
                         var message = "Unable to generate AtomicNET project: " + folder;
                         EditorUI.showModalError("New Project Editor Error", message);
@@ -260,7 +260,7 @@ class CreateProject extends ModalWindow {
                     "Unable to create project for:",
                     "",
                     `language: ${selectedLanguage}`,
-                    `template: ${templateDetail.folder}`,
+                    `template: ${templateFolder}`,
                     "",
                     "Please choose a different language."
                 ].join("\n");
@@ -269,6 +269,7 @@ class CreateProject extends ModalWindow {
                 return false;
             }
         }
+
         return false;
     }
 
@@ -340,10 +341,11 @@ class CreateProject extends ModalWindow {
      * list.
      */
     populateLanguageSelectionList() {
+
         this.projectLanguageFieldSource.clear();
 
-        this.projectTemplate.templates.forEach(templateDetail => {
-            this.projectLanguageFieldSource.addItem(new Atomic.UISelectItem(templateDetail.language));
+        this.projectTemplate.languages.forEach(language => {
+            this.projectLanguageFieldSource.addItem(new Atomic.UISelectItem(language));
         });
 
         this.projectLanguageField.source = this.projectLanguageFieldSource;

+ 2 - 0
Script/AtomicEditor/ui/modal/info/NewBuildWindow.ts

@@ -90,6 +90,8 @@ class NewBuildWindow extends ModalWindow {
 
 • <color #D4FB79>Visual Studio</color> and <color #D4FB79>Xamarin Studio</color> integration (with VSCode support coming soon!)
 
+• Updated to TypeScript 2.0
+
 • Physically Based Rendering (PBR) - Thanks to @dragonCASTjosh
 
 • New examples and project templates

+ 4 - 0
Source/ToolCore/NETTools/NETBuildSystem.cpp

@@ -356,6 +356,10 @@ namespace ToolCore
                 return;
             }
 
+            VariantMap buildBeginEventData;
+            buildBeginEventData[NETBuildBegin::P_BUILD] = curBuild_;
+            SendEvent(E_NETBUILDBEGIN, buildBeginEventData);
+
             SubscribeToEvent(subprocess, E_SUBPROCESSCOMPLETE, ATOMIC_HANDLER(NETBuildSystem, HandleCompileProcessComplete));
             SubscribeToEvent(subprocess, E_SUBPROCESSOUTPUT, ATOMIC_HANDLER(NETBuildSystem, HandleSubprocessOutput));
 

+ 4 - 0
Source/ToolCore/NETTools/NETBuildSystem.h

@@ -28,6 +28,10 @@ using namespace Atomic;
 
 namespace ToolCore
 {
+    ATOMIC_EVENT(E_NETBUILDBEGIN, NETBuildBegin)
+    {
+        ATOMIC_PARAM(P_BUILD, Build); // NETBuild*
+    }
 
     ATOMIC_EVENT(E_NETBUILDRESULT, NETBuildResult)
     {