Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ScriptSceneSerialization.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8 
9 using SiliconStudio.Paradox;
10 using SiliconStudio.Paradox.DataModel;
11 using SiliconStudio.Paradox.Engine;
12 using SiliconStudio.Paradox.EntityModel;
13 using SiliconStudio.Paradox.Games.IO;
14 using SiliconStudio.Paradox.Games.MicroThreading;
15 using SiliconStudio.Paradox.Games.Serialization.Assets;
16 using SiliconStudio.Paradox.Games.Serialization.Contents;
17 
18 using ScriptTest2;
19 
20 namespace ScriptTest
21 {
22  [ParadoxScript]
24  {
25  public static string gitFolder;
26 
27  [ParadoxScript]
28  public static void SetupFolder1(EngineContext engineContext)
29  {
30  gitFolder = "..\\..\\hotei_data1\\";
31  VirtualFileSystem.MountFileSystem("/sync", gitFolder);
32  }
33 
34  [ParadoxScript]
35  public static void SetupFolder2(EngineContext engineContext)
36  {
37  gitFolder = "..\\..\\hotei_data2\\";
38  VirtualFileSystem.MountFileSystem("/sync", gitFolder);
39  }
40 
41  [ParadoxScript]
42  public static async Task SyncSceneRebase(EngineContext engineContext)
43  {
44  // Save
45  await SaveScene(engineContext);
46 
47  Process.Start(new ProcessStartInfo("git", "add package_scene.hotei") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
48  Process.Start(new ProcessStartInfo("git", "commit -m Message") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
49  Process.Start(new ProcessStartInfo("git", "fetch --all") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
50  Process.Start(new ProcessStartInfo("git", "rebase origin/master") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
51  Process.Start(new ProcessStartInfo("git", "push origin master") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
52 
53  // Load
54  LoadScene(engineContext);
55  }
56 
57  [ParadoxScript]
58  public static async Task SyncSceneMerge(EngineContext engineContext)
59  {
60  // Save
61  await SaveScene(engineContext);
62 
63  Process.Start(new ProcessStartInfo("git", "add package_scene.hotei") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
64  Process.Start(new ProcessStartInfo("git", "commit -m Message") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
65  Process.Start(new ProcessStartInfo("git", "fetch --all") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
66  Process.Start(new ProcessStartInfo("git", "merge origin/master") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
67  Process.Start(new ProcessStartInfo("git", "push origin master") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
68 
69  // Load
70  LoadScene(engineContext);
71  }
72 
73  [ParadoxScript]
74  public static async Task SyncSceneLoad(EngineContext engineContext)
75  {
76  Process.Start(new ProcessStartInfo("git", "fetch --all") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
77  Process.Start(new ProcessStartInfo("git", "pull") { WorkingDirectory = gitFolder, CreateNoWindow = true, UseShellExecute = false }).WaitForExit();
78 
79  // Load
80  LoadScene(engineContext);
81  }
82 
83  //[ParadoxScript(ScriptFlags.AssemblyStartup)]
84  public static async Task SaveScene2(EngineContext engineContext)
85  {
86  var assetManager = new AssetManager(new AssetSerializerContextGenerator(engineContext.PackageManager));
87 
88  var entity = new Entity();
89  var meshComponent = entity.GetOrCreate(ModelComponent.Key);
90  meshComponent.SubMeshes.Add(new EffectMeshData { MeshData = new SubMeshData { DrawCount = 321 } });
91  var entities = new[] { entity };
92 
93  throw new NotImplementedException();
94  //var convertedEntities = assetManager.Convert<EntityGroup, IList<Entity>>(entities, "/data/package_scene.hotei#");
95  //assetManager.Save(convertedEntities);
96 
97  //var contents = ParameterContainerExtensions.EnumerateContentData(convertedEntities).ToArray();
98  //var sceneText = ParameterContainerExtensions.ConvertToText(contents[0]);
99  //File.WriteAllText("current_scene.txt", sceneText);
100 
101  //ParameterContainerExtensions.ConvertFromText(engineContext, sceneText, "/data/package_scene_copy.hotei#/root");
102  //var convertedEntities2 = assetManager.Load<EntityGroup>("/data/package_scene_copy.hotei#");
103  }
104 
105  [ParadoxScript]
106  public static async Task SaveScene(EngineContext engineContext)
107  {
108  var oldState = engineContext.EntityManager.State;
109  engineContext.EntityManager.State = GameState.Saving;
110  await Scheduler.Current.NextFrame();
111  await Scheduler.Current.NextFrame();
112  await Scheduler.Current.NextFrame();
113 
114  var contentManager = new AssetManager(new AssetSerializerContextGenerator(engineContext.PackageManager, ParameterContainerExtensions.DefaultSceneSerializerSelector));
115 
116  var entities = engineContext.EntityManager.Entities.ToArray();
117  var sceneData = new EntityGroup { Entities = entities.ToList() };
118  contentManager.Url.Set(sceneData, "/sync/package_scene.hotei#");
119  contentManager.Save(sceneData);
120 
121  engineContext.EntityManager.State = GameState.Running;
122  }
123 
124  [ParadoxScript]
125  public static void ClearScene(EngineContext engineContext)
126  {
127  engineContext.EntityManager.GetSystem<HierarchicalProcessor>().RootEntities.Clear();
128  }
129 
130  [ParadoxScript]
131  public static async void LoadScene(EngineContext engineContext)
132  {
133  //var contentManager = new ContentManager(new ContentSerializerContextGenerator(VirtualFileStorage, engineContext.PackageManager, ParameterContainerExtensions.DefaultSceneSerializer));
134  var contentManager = engineContext.AssetManager;
135 
136  engineContext.EntityManager.GetSystem<HierarchicalProcessor>().RootEntities.Clear();
137 
138  var sceneData = contentManager.Load<EntityGroup>("/sync/package_scene.hotei#");
139 
140  foreach (var entity in sceneData.Entities)
141  {
142  engineContext.EntityManager.AddEntity(entity);
143  if (entity.ContainsKey(AnimationComponent.Key))
144  {
145  var entityCopy = entity;
146  Scheduler.Current.Add(() => AnimScript.AnimateFBXModel(engineContext, entityCopy));
147  }
148  }
149  }
150 
151  [ParadoxScript]
152  public static async Task MergeSceneTest(EngineContext engineContext)
153  {
154  VirtualFileSystem.MountFileSystem("/global_data", "..\\..\\deps\\data\\");
155  VirtualFileSystem.MountFileSystem("/global_data2", "..\\..\\data\\");
156  ParameterContainerExtensions.Merge(engineContext.PackageManager, "/data/package_scene_base.hotei", "/data/package_scene1.hotei", "/data/package_scene2.hotei", "/data/package_scene_copy.hotei");
157  }
158  }
159 }
Game entity. It usually aggregates multiple EntityComponent
Definition: Entity.cs:28
static async Task AnimateFBXModel(EngineContext engineContext, Entity characterEntity, float endAnimTime=0.0f, float loopTime=0.0f)
Definition: AnimScript.cs:69
static void SetupFolder1(EngineContext engineContext)
This processor will take care of adding/removing children of every Entity added/removed in the Entity...
Add animation capabilities to an Entity. It will usually apply to ModelComponent.ModelViewHierarchy ...
static async void LoadScene(EngineContext engineContext)
static async Task SyncSceneLoad(EngineContext engineContext)
A group of Entity that can refers to each others. They can be loaded together as a chunk...
Definition: EntityGroup.cs:18
static async Task MergeSceneTest(EngineContext engineContext)
static void SetupFolder2(EngineContext engineContext)
static async Task SaveScene(EngineContext engineContext)
static async Task SyncSceneRebase(EngineContext engineContext)
static PropertyKey< AnimationComponent > Key
static void ClearScene(EngineContext engineContext)
static async Task SyncSceneMerge(EngineContext engineContext)
static async Task SaveScene2(EngineContext engineContext)