public UTinyProject CreateProject(UTinyId id, string name)
        {
            var project = new UTinyProject(this, m_VersionStorage)
            {
                Id   = id,
                Name = name,
            };

            m_VersionStorage.MarkAsChanged(project);

            Register(project);

            return(project);
        }
        private static bool UsesAdSupport(UTinyProject project)
        {
            var registry = project.Registry;
            var module   = project.Module.Dereference(registry);

            foreach (var m in module.EnumerateDependencies())
            {
                if (m.Namespace == "ut.AdSupport")
                {
                    return(true);
                }
            }

            return(false);
        }
        /// <summary>
        /// Sets up or migrates the initial state of the project
        /// * Includes required modules
        /// * Perfrorms any migration
        /// </summary>
        /// <param name="registry"></param>
        /// <param name="project"></param>
        private static void SetupProject(IRegistry registry, UTinyProject project)
        {
            var module = project.Module.Dereference(registry);

            // Make sure there's a dependency on the core modules
            module.AddExplicitModuleDependency((UTinyModule.Reference)registry.FindByName <UTinyModule>("UTiny.Core"));
            module.AddExplicitModuleDependency((UTinyModule.Reference)registry.FindByName <UTinyModule>("UTiny.Math"));
            module.AddExplicitModuleDependency((UTinyModule.Reference)registry.FindByName <UTinyModule>("UTiny.Core2D"));

            if (project.Configuration.Equals(UTinyEntity.Reference.None))
            {
                var configurationEntity = registry.CreateEntity(UTinyId.New(), "Configuration");
                project.Configuration = (UTinyEntity.Reference)configurationEntity;
            }
        }
        public static void SendBuildEvent(UTinyProject project, UTinyBuildResults buildResults, TimeSpan duration)
        {
            if (project?.Settings == null || buildResults == null)
            {
                return;
            }

            var buildReportRoot    = buildResults.BuildReport.Root;
            var buildReportRuntime = buildReportRoot.GetChild(UTinyBuildReport.RuntimeNode);
            var buildReportAssets  = buildReportRoot.GetChild(UTinyBuildReport.AssetsNode);
            var buildReportCode    = buildReportRoot.GetChild(UTinyBuildReport.CodeNode);

            var e = new BuildEvent()
            {
                package = TinyPackageUtility.Package,
                context = ContextInfo.Default,
                project = ProjectInfo.Create(project),

                duration = duration.Ticks,

                total_bytes   = buildReportRoot?.Item.CompressedSize ?? 0,
                runtime_bytes = buildReportRuntime?.Item.CompressedSize ?? 0,
                assets_bytes  = buildReportAssets?.Item.CompressedSize ?? 0,
                code_bytes    = buildReportCode?.Item.CompressedSize ?? 0,

                total_raw_bytes   = buildReportRoot?.Item.Size ?? 0,
                runtime_raw_bytes = buildReportRuntime?.Item.Size ?? 0,
                assets_raw_bytes  = buildReportAssets?.Item.Size ?? 0,
                code_raw_bytes    = buildReportCode?.Item.Size ?? 0,

                heap_size              = project.Settings.MemorySize,
                opt_auto_resize        = project.Settings.CanvasAutoResize,
                opt_ws_client          = project.Settings.IncludeWSClient,
                opt_webp_decompressor  = project.Settings.IncludeWebPDecompressor,
                opt_ecma5              = project.Settings.RunBabel,
                opt_single_file_output = project.Settings.SingleFileHtml,
                opt_embed_assets       = project.Settings.EmbedAssets,
                default_texture_format = project.Settings.DefaultTextureSettings.FormatType.ToString()
            };

            Send(EventName.tinyEditorBuild, e);
        }
예제 #5
0
        private void AddRegistryObjectDependency(UTinyProject project)
        {
            if (null == project)
            {
                return;
            }

            var path = UTinyPersistence.GetLocation(project);

            // Core or sample module/project don't need to be packaged, they will be included from the manifest.
            if (ShouldPackage(path))
            {
                AddFileElements(path, false);
            }

            foreach (var module in project.Module.Dereference(project.Registry).EnumerateDependencies())
            {
                AddRegistryObjectDependency(module);
            }
        }
예제 #6
0
        private void HandleProjectLoaded(UTinyProject project)
        {
            if (null == project)
            {
                Repaint();
                return;
            }

            EntityGroupManager.OnEntityGroupLoaded     += AddToTrees;
            EntityGroupManager.OnEntityGroupUnloaded   += RemoveFromTrees;
            EntityGroupManager.OnEntityGroupsReordered += ReorderTrees;
            m_TreeView = new HierarchyTree(EditorContext, m_TreeState);

            foreach (var entityGroup in LoadedEntityGroups)
            {
                AddToTrees(entityGroup);
            }
            Undo.OnUndoPerformed += () => HandleDataModelChange(ChangeSource.DataModel, null);
            Undo.OnRedoPerformed += () => HandleDataModelChange(ChangeSource.DataModel, null);
        }
            public static ProjectInfo Create(UTinyProject project)
            {
                var result = new ProjectInfo();

                if (project == null)
                {
                    return(result);
                }

                var main = project.Module.Dereference(project.Registry);

                if (main == null)
                {
                    return(result);
                }

                var deps = main.EnumerateDependencies().Select(d => d.Name);

                result.modules = deps.ToArray();

                return(result);
            }
        /// <summary>
        /// Generates the platform-agnostic IDL file from the given UTinyProject.
        /// </summary>
        public static void GenerateIDL(UTinyProject project, FileInfo destination)
        {
            var writer = new UTinyCodeWriter
            {
                CodeStyle = CodeStyle.CSharp
            };

            writer.Line("using UTiny;");
            writer.Line("using UTiny.Shared;");

            var mainModule = project.Module.Dereference(project.Registry);

            foreach (var dep in mainModule.EnumerateDependencies())
            {
                if (dep.Equals(mainModule))
                {
                    continue;
                }
                if (dep.Name == "UTiny.Core") // Hack: The Core module does not actually generate a Core namespace, but Core namespace is the UTiny/ut namespace.
                {
                    continue;
                }
                if (dep.IsRuntimeIncluded)
                {
                    writer.Line($"using {dep.Name};"); // Core namespaces are of form "UTiny.Core2D".
                }
                else
                {
                    writer.Line($"using {dep.Namespace.Replace("UTiny.", "ut.")};"); // Runtime generated namespaces are of form "ut.tween".
                }
            }

            project.Visit(new GenerateIDLVisitor {
                Writer = writer
            });
            File.WriteAllText(destination.FullName, writer.ToString(), Encoding.UTF8);
        }
 private static void HandleProjectUnloaded(UTinyProject project)
 {
     EntityGroupManager.OnWillUnloadEntityGroup -= HandleEntityGroupWillUnload;
     EntityGroupManager.OnEntityGroupUnloaded   -= HandleEntityGroupUnloaded;
 }
예제 #10
0
        public static IList <UTinyExportInfo> Export(UTinyProject project, DirectoryInfo assetsFolder)
        {
            var module = project.Module.Dereference(project.Registry);

            return(AssetIterator.EnumerateAssets(module).Select(asset => Export(project, assetsFolder.FullName, asset)).ToList());
        }
예제 #11
0
 public static string GetAssetName(UTinyProject project, Object @object)
 {
     return(GetAssetName(project.Module.Dereference(project.Registry), @object));
 }
예제 #12
0
        private static void CreateEntityForAsset(IRegistry registry, UTinyProject project, UTinyEntityGroup entityGroup, UTinyAssetInfo asset)
        {
            var @object = asset.Object;

            UTinyEntity entity = null;

            if (@object is Texture2D)
            {
                var texture  = @object as Texture2D;
                var path     = AssetDatabase.GetAssetPath(texture);
                var importer = (TextureImporter)AssetImporter.GetAtPath(path);

                entity = registry.CreateEntity(UTinyId.New(), $"{GetAssetEntityPath(typeof(Texture2D))}{asset.Name}");

                var image2d = entity.AddComponent(registry.GetImage2DType());
                image2d.Refresh();

                image2d["imageFile"] = $"ut-asset:{asset.Name}";

                var settings = UTinyUtility.GetAssetExportSettings(project, @object) as UTinyTextureSettings;
                if (settings != null && settings.FormatType == TextureFormatType.JPG && UTinyAssetExporter.TextureExporter.ReallyHasAlpha(texture))
                {
                    image2d["maskFile"] = $"ut-asset:{asset.Name}_a";
                }

                image2d["disableSmoothing"] = importer.filterMode == FilterMode.Point;

                var sprite = AssetDatabase.LoadAllAssetsAtPath(path).OfType <Sprite>().FirstOrDefault();

                // @NOTE The `importer.spritePixelsPerUnit` is currently NOT used in the editor...
                // We ALWAYS draw sprites at 1 pixel to world unit in the editor.
                // When we switch to using SpriteRenderer as our editor drawer we can just pass `sprite.pixelsPerUnit` directly here.
                var pixelsToWorldUnits = sprite ? sprite.pixelsPerUnit : 1;
                image2d["pixelsToWorldUnits"] = 1.0f / pixelsToWorldUnits;
            }
            else if (@object is Sprite)
            {
                var sprite = (Sprite)@object;

                entity = registry.CreateEntity(UTinyId.New(), $"{GetAssetEntityPath(typeof(Sprite))}{asset.Name}");

                var sprite2d = entity.AddComponent(registry.GetSprite2DType());
                sprite2d.Refresh();

                sprite2d["image"] = sprite.texture;
                var region = sprite2d["imageRegion"] as UTinyObject;
                if (null != region)
                {
                    region["x"]      = sprite.rect.x / sprite.texture.width;
                    region["y"]      = sprite.rect.y / sprite.texture.height;
                    region["width"]  = sprite.rect.width / sprite.texture.width;
                    region["height"] = sprite.rect.height / sprite.texture.height;
                }

                var pivot = sprite2d["pivot"] as UTinyObject;
                if (null != pivot)
                {
                    pivot["x"] = sprite.pivot.x / sprite.rect.width;
                    pivot["y"] = sprite.pivot.y / sprite.rect.height;
                }
            }
            else if (@object is AudioClip)
            {
                entity = registry.CreateEntity(UTinyId.New(), $"{GetAssetEntityPath(typeof(AudioClip))}{asset.Name}");

                var audioClip = entity.AddComponent(registry.GetAudioClipType());
                audioClip.Refresh();
                audioClip["file"] = $"ut-asset:{asset.Name}";
            }
            else if (@object is Font)
            {
                entity = registry.CreateEntity(UTinyId.New(), $"{GetAssetEntityPath(typeof(Font))}{asset.Name}");

                var fontAsset = entity.AddComponent(registry.GetFontType());
                fontAsset.Refresh();
                fontAsset["file"] = $"ut-asset:{asset.Name}";
            }

            if (null != entity)
            {
                entityGroup.AddEntityReference((UTinyEntity.Reference)entity);
            }

            foreach (var child in asset.Children)
            {
                CreateEntityForAsset(registry, project, entityGroup, child);
            }
        }
예제 #13
0
 private void HandleProjectClosed(UTinyProject project)
 {
     m_TreeView.ClearScenes();
     Repaint();
 }
예제 #14
0
 private void OnSaveProject(UTinyProject project)
 {
     SetDirtyAll();
 }
 public static string GetBuildDirectory(UTinyProject project, UTinyPlatform platform, UTinyBuildConfiguration configuration)
 {
     return(Path.Combine("UTinyExport", project.Name, platform.ToString(), configuration.ToString()));
 }
 public static bool IncludesModule(UTinyProject project, string moduleName)
 {
     return(project.Module.Dereference(project.Registry).EnumerateDependencies().WithName(moduleName).Any());
 }
예제 #17
0
        public static void WriteEntityGroupSetupFunction(UTinyCodeWriter writer, UTinyProject project, UTinyEntityGroup entityGroup, bool writeEntityGroupComponent = true, bool writeEntityLayer = true)
        {
            var entityIndex    = 0;
            var entityIndexMap = new Dictionary <UTinyEntity.Reference, int>();

            using (writer.Scope("function(w)"))
            {
                entityIndexMap.Clear();

                foreach (var reference in entityGroup.Entities)
                {
                    var entity = reference.Dereference(entityGroup.Registry);
                    ++entityIndex;
                    entityIndexMap[reference] = entityIndex;
                    writer.Line($"var e{entityIndex} = w.create({EscapeJsString(entity.Name)});");
                }

                if (writeEntityGroupComponent)
                {
                    foreach (var reference in entityGroup.Entities)
                    {
                        var index = entityIndexMap[reference];
                        writer.Line($"e{index}.addComponent(this.Component);");
                    }
                }

                if (writeEntityLayer)
                {
                    foreach (var reference in entityGroup.Entities)
                    {
                        var index  = entityIndexMap[reference];
                        var entity = reference.Dereference(entityGroup.Registry);
                        writer.Line($"e{index}.addComponent({GetFullyQualifiedLayerName(LayerMask.LayerToName(entity.Layer))});");
                    }
                }

                var context = new VisitorContext
                {
                    Project        = project,
                    Module         = project.Module.Dereference(project.Registry),
                    Registry       = project.Registry,
                    Writer         = writer,
                    EntityIndexMap = entityIndexMap
                };

                entityIndex = 0;
                foreach (var reference in entityGroup.Entities)
                {
                    var entity = reference.Dereference(entityGroup.Registry);
                    ++entityIndex;

                    foreach (var component in entity.Components)
                    {
                        var type = component.Type.Dereference(component.Registry);

                        if (null == type)
                        {
                            Debug.LogError($"{UTinyConstants.ApplicationName}: Missing component type, ComponentType=[{component.Type.Name}] Entity=[{entity.Name}] Group=[{entityGroup.Name}]");
                            continue;
                        }

                        var index = ++context.ComponentIndex;
                        writer.Line($"var c{index} = e{entityIndex}.addComponent({UTinyBuildPipeline.GetJsTypeName(type)});");
                        component.Properties.Visit(new ComponentVisitor
                        {
                            VisitorContext = context,
                            Path           = $"c{index}",
                            Entity         = $"e{entityIndex}"
                        });
                    }
                }

                writer.WriteIndent();
                writer.WriteRaw("return [");

                for (var i = 0; i < entityIndex; i++)
                {
                    writer.WriteRaw(i != 0 ? $", e{i + 1}" : $"e{i + 1}");
                }

                writer.WriteRaw("];\n");
            }

            writer.Line().Line();
        }