public void Save(Uri uri, SchemaLoader schemaLoader) { if (Dirty || m_uriChanged) { string filePath = uri.LocalPath; FileMode fileMode = File.Exists(filePath) ? FileMode.Truncate : FileMode.OpenOrCreate; using (FileStream stream = new FileStream(filePath, fileMode)) { var writer = new CustomDomXmlWriter(Globals.ResourceRoot, schemaLoader.TypeCollection); writer.Write(DomNode, stream, uri); } m_uriChanged = false; } // save all the game-references foreach (var gameRef in GetChildList <GameReference>(Schema.gameType.gameReferenceChild)) { GameDocument subDoc = Adapters.As <GameDocument>(gameRef.Target); if (subDoc == null) { continue; } subDoc.Save(subDoc.Uri, schemaLoader); } Dirty = false; }
public void Save(Uri uri, SchemaLoader schemaLoader) { if (Dirty || m_uriChanged) { string filePath = uri.LocalPath; FileMode fileMode = File.Exists(filePath) ? FileMode.Truncate : FileMode.OpenOrCreate; using (FileStream stream = new FileStream(filePath, fileMode)) { var writer = new CustomDomXmlWriter(Globals.ResourceRoot, schemaLoader.TypeCollection); writer.Write(DomNode, stream, uri); } m_uriChanged = false; } // save all the game-references foreach (var gameRef in GetChildList<GameReference>(Schema.gameType.gameReferenceChild)) { GameDocument subDoc = Adapters.As<GameDocument>(gameRef.Target); if(subDoc == null) continue; subDoc.Save(subDoc.Uri, schemaLoader); } Dirty = false; }
/// <summary> /// Register DomNodeAdapters </summary> public static void Initialize(SchemaLoader schemaLoader) { // resource meta data Schema.resourceMetadataType.Type.Define(new ExtensionInfo <ResourceMetadataDocument>()); Schema.textureMetadataType.Type.Define(new ExtensionInfo <ResourceMetadataDocument>()); // game Schema.gameType.Type.Define(new ExtensionInfo <Game>()); Schema.gameType.Type.Define(new ExtensionInfo <GameDocument>()); Schema.gameType.Type.Define(new ExtensionInfo <IdToDomNode>()); Schema.gameType.Type.Define(new ExtensionInfo <GameContext>()); Schema.gameType.Type.Define(new ExtensionInfo <LayeringContext>()); Schema.gameType.Type.Define(new ExtensionInfo <BookmarkingContext>()); Schema.gameType.Type.Define(new ExtensionInfo <CustomLockingValidator>()); Schema.gameType.Type.Define(new ExtensionInfo <UniqueIdValidator>()); // grid Schema.gridType.Type.Define(new ExtensionInfo <Grid>()); // gob Schema.gameObjectType.Type.Define(new ExtensionInfo <GameObject>()); Schema.gameObjectType.Type.Define(new ExtensionInfo <GameObjectProperties>()); Schema.gameObjectType.Type.Define(new ExtensionInfo <TransformUpdater>()); // gob folder Schema.gameObjectFolderType.Type.Define(new ExtensionInfo <GameObjectFolder>()); // gob group Schema.gameObjectGroupType.Type.Define(new ExtensionInfo <GameObjectGroup>()); // prefab Schema.objectOverrideType.Type.Define(new ExtensionInfo <ObjectOverride>()); Schema.attributeOverrideType.Type.Define(new ExtensionInfo <AttributeOverride>()); Schema.prefabInstanceType.Type.Define(new ExtensionInfo <PrefabInstance>()); Schema.prefabType.Type.Define(new ExtensionInfo <Prefab>()); // locator Schema.locatorType.Type.Define(new ExtensionInfo <Locator>()); // curves Schema.curveType.Type.Define(new ExtensionInfo <Curve>()); Schema.controlPointType.Type.Define(new ExtensionInfo <ControlPoint>()); Schema.catmullRomType.Type.Define(new ExtensionInfo <CatmullRom>()); Schema.bezierType.Type.Define(new ExtensionInfo <BezierCurves>()); // lights Schema.PointLight.Type.Define(new ExtensionInfo <PointLight>()); Schema.DirLight.Type.Define(new ExtensionInfo <DirLight>()); Schema.BoxLight.Type.Define(new ExtensionInfo <BoxLight>()); // Billboard Schema.billboardTestType.Type.Define(new ExtensionInfo <Billboard>()); // terrain Schema.terrainGobType.Type.Define(new ExtensionInfo <TerrainGob>()); Schema.layerMapType.Type.Define(new ExtensionInfo <LayerMap>()); Schema.decorationMapType.Type.Define(new ExtensionInfo <DecorationMap>()); // references Schema.gameReferenceType.Type.Define(new ExtensionInfo <GameReference>()); Schema.resourceReferenceType.Type.Define(new ExtensionInfo <ResourceReference>()); Schema.gameObjectReferenceType.Type.Define(new ExtensionInfo <GameObjectReference>()); Schema.layerType.Type.Define(new ExtensionInfo <Layer>()); Schema.bookmarkType.Type.Define(new ExtensionInfo <Bookmark>()); string category = "Grid".Localize(); Schema.gameType.Type.SetTag( new PropertyDescriptorCollection( new PropertyDescriptor[] { new ChildAttributePropertyDescriptor( "Height".Localize(), Schema.gridType.heightAttribute, Schema.gameType.gridChild, category, "Grid's height (along the world's up vector)".Localize(), false), new ChildAttributePropertyDescriptor( "Size".Localize(), Schema.gridType.sizeAttribute, Schema.gameType.gridChild, category, "the size of grid step".Localize(), false), new ChildAttributePropertyDescriptor( "Subdivisions".Localize(), Schema.gridType.subdivisionsAttribute, Schema.gameType.gridChild, category, "Number of sub-divisions".Localize(), false), new ChildAttributePropertyDescriptor( "snap".Localize(), Schema.gridType.snapAttribute, Schema.gameType.gridChild, category, "Snap to grid vertex".Localize(), false), new ChildAttributePropertyDescriptor( "Visible".Localize(), Schema.gridType.visibleAttribute, Schema.gameType.gridChild, category, "Grid visibility".Localize(), false) })); }
/// <summary> /// Open or create new document. /// It opens if the file exist otherwise it will creates new document /// </summary> public static GameDocument OpenOrCreate(Uri uri, SchemaLoader schemaLoader) { if (!uri.IsAbsoluteUri) { return(null); } var docRegistry = Globals.MEFContainer.GetExportedValue <GameDocumentRegistry>(); GameDocument document = docRegistry.FindDocument(uri) as GameDocument; if (document != null) { return(document); } string filePath = uri.LocalPath; DomNode rootNode = null; if (File.Exists(filePath)) { // read existing document using custom dom XML reader using (FileStream stream = File.OpenRead(filePath)) { var reader = new CustomDomXmlReader(Globals.ResourceRoot, schemaLoader); rootNode = reader.Read(stream, uri); } } else { // create new document by creating a Dom node of the root type defined by the schema rootNode = new DomNode(Schema.gameType.Type, Schema.gameRootElement); rootNode.SetAttribute(Schema.gameType.nameAttribute, "Game".Localize()); } GameObjectFolder rootFolder = Adapters.As <GameObjectFolder>(rootNode.GetChild(Schema.gameType.gameObjectFolderChild)); if (rootFolder == null) { // create the game object folder rootFolder = (GameObjectFolder)GameObjectFolder.Create(); rootFolder.Name = "GameObjects".Localize("this is the name of a folder in the project lister"); rootNode.SetChild(Schema.gameType.gameObjectFolderChild, rootFolder.DomNode); } // create bookmarks DomNode bookmarks = rootNode.GetChild(Schema.gameType.bookmarksChild); if (bookmarks == null) { bookmarks = new DomNode(Schema.bookmarksType.Type); rootNode.SetChild(Schema.gameType.bookmarksChild, bookmarks); } DomNode layersNode = rootNode.GetChild(Schema.gameType.layersChild); if (layersNode == null) { layersNode = new DomNode(Schema.layersType.Type); rootNode.SetChild(Schema.gameType.layersChild, layersNode); } // Create the grid DomNode gridNode = rootNode.GetChild(Schema.gameType.gridChild); if (gridNode == null) { gridNode = new DomNode(Schema.gridType.Type); rootNode.SetChild(Schema.gameType.gridChild, gridNode); } document = rootNode.As <GameDocument>(); document.Uri = uri; // Initialize Dom extensions now that the data is complete rootNode.InitializeExtensions(); docRegistry.Add(document); UniqueNamer uniqueNamer = new UniqueNamer('_'); foreach (DomNode node in rootNode.Subtree) { if (node.Type.IdAttribute != null) { uniqueNamer.Name(node.GetId()); } } // sync all the prefab instances DomNode folderNode = document.RootGameObjectFolder.As <DomNode>(); foreach (DomNode node in folderNode.Subtree) { PrefabInstance prefab = node.As <PrefabInstance>(); if (prefab == null) { continue; } prefab.Resolve(uniqueNamer); } if (ResolveOnLoad) { // resovle all the game references. foreach (var subGame in document.GetChildList <GameReference>(Schema.gameType.gameReferenceChild)) { subGame.Resolve(); } } document.Dirty = false; return(document); }
/// <summary> /// Register DomNodeAdapters </summary> public static void Initialize(SchemaLoader schemaLoader) { // resource meta data Schema.resourceMetadataType.Type.Define(new ExtensionInfo<ResourceMetadataDocument>()); Schema.textureMetadataType.Type.Define(new ExtensionInfo<ResourceMetadataDocument>()); // game Schema.gameType.Type.Define(new ExtensionInfo<Game>()); Schema.gameType.Type.Define(new ExtensionInfo<GameDocument>()); Schema.gameType.Type.Define(new ExtensionInfo<IdToDomNode>()); Schema.gameType.Type.Define(new ExtensionInfo<GameContext>()); Schema.gameType.Type.Define(new ExtensionInfo<LayeringContext>()); Schema.gameType.Type.Define(new ExtensionInfo<BookmarkingContext>()); Schema.gameType.Type.Define(new ExtensionInfo<CustomLockingValidator>()); Schema.gameType.Type.Define(new ExtensionInfo<UniqueIdValidator>()); // grid Schema.gridType.Type.Define(new ExtensionInfo<Grid>()); // gob Schema.gameObjectType.Type.Define(new ExtensionInfo<GameObject>()); Schema.gameObjectType.Type.Define(new ExtensionInfo<GameObjectProperties>()); Schema.gameObjectType.Type.Define(new ExtensionInfo<TransformUpdater>()); // gob folder Schema.gameObjectFolderType.Type.Define(new ExtensionInfo<GameObjectFolder>()); // gob group Schema.gameObjectGroupType.Type.Define(new ExtensionInfo<GameObjectGroup>()); // prefab Schema.objectOverrideType.Type.Define(new ExtensionInfo<ObjectOverride>()); Schema.attributeOverrideType.Type.Define(new ExtensionInfo<AttributeOverride>()); Schema.prefabInstanceType.Type.Define(new ExtensionInfo<PrefabInstance>()); Schema.prefabType.Type.Define(new ExtensionInfo<Prefab>()); // locator Schema.locatorType.Type.Define(new ExtensionInfo<Locator>()); // curves Schema.curveType.Type.Define(new ExtensionInfo<Curve>()); Schema.controlPointType.Type.Define(new ExtensionInfo<ControlPoint>()); Schema.catmullRomType.Type.Define(new ExtensionInfo<CatmullRom>()); Schema.bezierType.Type.Define(new ExtensionInfo<BezierCurves>()); // lights Schema.PointLight.Type.Define(new ExtensionInfo<PointLight>()); Schema.DirLight.Type.Define(new ExtensionInfo<DirLight>()); Schema.BoxLight.Type.Define(new ExtensionInfo<BoxLight>()); // Billboard Schema.billboardTestType.Type.Define(new ExtensionInfo<Billboard>()); // terrain Schema.terrainGobType.Type.Define(new ExtensionInfo<TerrainGob>()); Schema.layerMapType.Type.Define(new ExtensionInfo<LayerMap>()); Schema.decorationMapType.Type.Define(new ExtensionInfo<DecorationMap>()); // references Schema.gameReferenceType.Type.Define(new ExtensionInfo<GameReference>()); Schema.resourceReferenceType.Type.Define(new ExtensionInfo<ResourceReference>()); Schema.gameObjectReferenceType.Type.Define(new ExtensionInfo<GameObjectReference>()); Schema.layerType.Type.Define(new ExtensionInfo<Layer>()); Schema.bookmarkType.Type.Define(new ExtensionInfo<Bookmark>()); string category = "Grid".Localize(); Schema.gameType.Type.SetTag( new PropertyDescriptorCollection( new PropertyDescriptor[] { new ChildAttributePropertyDescriptor( "Height".Localize(), Schema.gridType.heightAttribute, Schema.gameType.gridChild, category, "Grid's height (along the world's up vector)".Localize(), false), new ChildAttributePropertyDescriptor( "Size".Localize(), Schema.gridType.sizeAttribute, Schema.gameType.gridChild, category, "the size of grid step".Localize(), false), new ChildAttributePropertyDescriptor( "Subdivisions".Localize(), Schema.gridType.subdivisionsAttribute, Schema.gameType.gridChild, category, "Number of sub-divisions".Localize(), false), new ChildAttributePropertyDescriptor( "snap".Localize(), Schema.gridType.snapAttribute, Schema.gameType.gridChild, category, "Snap to grid vertex".Localize(), false), new ChildAttributePropertyDescriptor( "Visible".Localize(), Schema.gridType.visibleAttribute, Schema.gameType.gridChild, category, "Grid visibility".Localize(), false) })); }
/// <summary> /// Open or create new document. /// It opens if the file exist otherwise it will creates new document /// </summary> public static GameDocument OpenOrCreate(Uri uri, SchemaLoader schemaLoader) { if (!uri.IsAbsoluteUri) return null; var docRegistry = Globals.MEFContainer.GetExportedValue<GameDocumentRegistry>(); GameDocument document = docRegistry.FindDocument(uri) as GameDocument; if (document != null) { return document; } string filePath = uri.LocalPath; DomNode rootNode = null; if (File.Exists(filePath)) { // read existing document using custom dom XML reader using (FileStream stream = File.OpenRead(filePath)) { var reader = new CustomDomXmlReader(Globals.ResourceRoot, schemaLoader); rootNode = reader.Read(stream, uri); } } else { // create new document by creating a Dom node of the root type defined by the schema rootNode = new DomNode(Schema.gameType.Type, Schema.gameRootElement); rootNode.SetAttribute(Schema.gameType.nameAttribute, "Game".Localize()); } GameObjectFolder rootFolder = Adapters.As<GameObjectFolder>(rootNode.GetChild(Schema.gameType.gameObjectFolderChild)); if (rootFolder == null) { // create the game object folder rootFolder = (GameObjectFolder)GameObjectFolder.Create(); rootFolder.Name = "GameObjects".Localize("this is the name of a folder in the project lister"); rootNode.SetChild(Schema.gameType.gameObjectFolderChild, rootFolder.DomNode); } // create bookmarks DomNode bookmarks = rootNode.GetChild(Schema.gameType.bookmarksChild); if (bookmarks == null) { bookmarks = new DomNode(Schema.bookmarksType.Type); rootNode.SetChild(Schema.gameType.bookmarksChild, bookmarks); } DomNode layersNode = rootNode.GetChild(Schema.gameType.layersChild); if (layersNode == null) { layersNode = new DomNode(Schema.layersType.Type); rootNode.SetChild(Schema.gameType.layersChild, layersNode); } // Create the grid DomNode gridNode = rootNode.GetChild(Schema.gameType.gridChild); if (gridNode == null) { gridNode = new DomNode(Schema.gridType.Type); rootNode.SetChild(Schema.gameType.gridChild, gridNode); } document = rootNode.As<GameDocument>(); document.Uri = uri; // Initialize Dom extensions now that the data is complete rootNode.InitializeExtensions(); docRegistry.Add(document); UniqueNamer uniqueNamer = new UniqueNamer('_'); foreach (DomNode node in rootNode.Subtree) { if (node.Type.IdAttribute != null) { uniqueNamer.Name(node.GetId()); } } // sync all the prefab instances DomNode folderNode = document.RootGameObjectFolder.As<DomNode>(); foreach (DomNode node in folderNode.Subtree) { PrefabInstance prefab = node.As<PrefabInstance>(); if (prefab == null) continue; prefab.Resolve(uniqueNamer); } if (ResolveOnLoad) { // resovle all the game references. foreach (var subGame in document.GetChildList<GameReference>(Schema.gameType.gameReferenceChild)) { subGame.Resolve(); } } document.Dirty = false; return document; }