Esempio n. 1
0
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
SubMesh の設定を行います。
SubMesh を適切に設定することで、例えば表情に関する部分だけは他の Material (Transparent など) を適用する、といったこと等が可能になります。
※現時点では設定されてる Material ベースで SubMesh の分割を決定しています。そのため、場合によっては意図しない動作になることがあります。
 その場合、それぞれを別の Material (Ctrl+D でコピーしたものなど) に設定することによって修正できます。
".Trim());
            }

            foreach (var(layout, i) in _layouts.Select((w, i) => (w, i)))
            {
                using (new EditorGUILayout.VerticalScope())
                {
                    using (new EditorGUI.DisabledGroupScope(true))
                        CustomField.ObjectPicker("Material", layout.Material);
                    _layouts[i].Channel = EditorGUILayout.IntField("LayerID", layout.Channel);
                }

                EditorGUILayout.Space();
            }

            EditorGUILayout.Space();

            return(true);
        }
 public void OnFinalize(AtlasConfiguration configuration)
 {
     configuration.AtlasTextureSize = _size;
     configuration.BaseName         = _name;
     configuration.DestinationPath  = AssetDatabase.GetAssetPath(_destination);
     configuration.IsUseMaterialKey = _isSplitByMaterialKey;
 }
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
シェーダーに関する設定を行います。
なお、シェーダーは SubMesh 毎に全て同じものが設定され、前の設定を引き継ぎたい場合は、全てのシェーダーを揃えておく必要があります。
また、引き継がれる設定は、 Atlasization が一番最初に検出した Material の設定になります。
".Trim());
            }

            EditorGUILayout.Space();

            EditorGUI.BeginChangeCheck();

            var materials = _materials.Select(w => w.name).ToArray();

            _index = EditorGUILayout.Popup("Material for Shader", _index, materials);

            if (EditorGUI.EndChangeCheck())
            {
                var material = _materials[_index];
                material.GetTexturePropertyNames();

                // TODO: Generate NormalMaps, Masks and other sub-textures as atlas
            }

            var shader = _shaders[EditorGUILayout.Popup("Shader", _shaders.FindIndex(w => w == _materials[_index].shader.name), _shaders.ToArray())];

            _materials[_index].shader = Shader.Find(shader);

            return(true);
        }
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
アトラス化されたテクスチャおよび Prefab の出力設定を行います。
アトラス化作業によって変更された Prefab は同名で設定したディレクトリに出力されます。
".Trim());
            }

            EditorGUILayout.LabelField("グローバル設定");
            using (new EditorGUI.IndentLevelScope())
            {
                CustomField.PropertyField(this, nameof(_destination), "出力先ディレクトリ");
                _name = EditorGUILayout.TextField("出力ファイル名", _name ?? configuration.GameObject.name);
            }

            EditorGUILayout.LabelField("メッシュ設定");
            using (new EditorGUI.IndentLevelScope())
                _isSplitByMaterialKey = EditorGUILayout.Toggle("Material Key を使用する", _isSplitByMaterialKey);

            EditorGUILayout.LabelField("テクスチャ設定");
            using (new EditorGUI.IndentLevelScope())
                _size = CustomField.EnumField("出力サイズ", _size);

            return(_destination != null && !string.IsNullOrWhiteSpace(_name));
        }
Esempio n. 5
0
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
Material から検出されたテクスチャーの配置を確認します。
メインテクスチャー (_MainTex / Texture2D) のみが対象、またテクスチャーが設定できない (色指定のみなど) 場合はメインカラー (_Color) が代わりに設定されます。
".Trim());
            }

            EditorGUILayout.Space();

            CustomField.PreviewReadableTexture2Ds(configuration.Textures, configuration.TextureDivision);

            EditorGUILayout.Space();

            EditorGUILayout.LabelField($"Texture2D References ({configuration.Textures.Count} Textures, {configuration.Materials.Count} Materials) : ");

            foreach (var(texture, i) in configuration.Textures.Select((w, i) => (w, i)))
            {
                using (new EditorGUI.DisabledGroupScope(true))
                {
                    if (string.IsNullOrWhiteSpace(texture.Original?.name))
                    {
                        CustomField.ObjectPicker("Auto Generated", texture.Texture);
                    }
                    else
                    {
                        CustomField.ObjectPicker(texture.Original.name, texture.Original);
                    }
                }
            }

            return(true);
        }
        public void OnFinalize(AtlasConfiguration configuration)
        {
            var texture = new AtlasTexture(configuration.AtlasTextureSize.ToTextureSize(), configuration.AtlasTextureSize.ToTextureSize());

            texture.Create(configuration.Textures, configuration.TextureDivision);
            texture.SaveAsAsset($"{configuration.DestPath}.png");

            var materials = new List <AtlasMaterial>();

            foreach (var(material, idx) in configuration.NewMaterials.Select((w, i) => (w, i)))
            {
                var mat = texture.CreateMaterial(material);
                mat.SaveAsAsset($"{configuration.DestPath}_{idx}.mat");

                materials.Add(mat);
            }

            var meshes  = new Dictionary <string, AtlasMesh>();
            var counter = 0;

            foreach (var renderer in configuration.Renderers)
            {
                var mesh = new AtlasMesh(renderer, configuration.IsUseMaterialKey);
                if (meshes.ContainsKey(mesh.CalcMaterialKey()))
                {
                    var m = meshes[mesh.CalcMaterialKey()];
                    m.ApplyTo(renderer);
                    renderer.sharedMaterials = Enumerable.Range(0, m.Channels).Select(w => materials[w]).Select(w => w.Actual).ToArray();
                    continue;
                }

                mesh.WriteNewUVs(0, texture);

                var reduceTo = 0;
                foreach (var group in configuration.MeshLayouts.GroupBy(w => w.Channel))
                {
                    var materialSlots = mesh.GetChannels(group.ToList());
                    if (group.Key >= mesh.Channels)
                    {
                        continue;
                    }

                    mesh.CombineChannels(group.Key, materialSlots);
                    reduceTo++;
                }

                mesh.ReduceSubMeshTo(reduceTo);
                mesh.SaveAsAsset($"{configuration.DestPath}_{counter++}.asset");
                mesh.Apply();

                meshes.Add(mesh.CalcMaterialKey(), mesh);
                renderer.sharedMaterials = Enumerable.Range(0, reduceTo).Select(w => materials[w]).Select(w => w.Actual).ToArray();
            }

            PrefabUtility.SaveAsPrefabAsset(configuration.GameObject, $"{configuration.DestPath}.prefab");
            Object.DestroyImmediate(configuration.Workspace);
        }
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
設定内容を確認し、問題なければ「生成」をクリックしてください。
なお、元の Prefab / Material / Texture が変更されることはありません。
".Trim());
            }

            using (new EditorGUI.DisabledGroupScope(true))
            {
                CustomField.ObjectPicker("Prefab / GameObject", configuration.GameObject);

                EditorGUILayout.LabelField("Stats:");
                using (new EditorGUI.IndentLevelScope())
                {
                    EditorGUILayout.LabelField($"Materials : {configuration.Materials.Count}");
                    EditorGUILayout.LabelField($"Textures  : {configuration.Textures.Count}");
                }

                EditorGUILayout.LabelField("SubMesh Mapping");
                using (new EditorGUI.IndentLevelScope())
                {
                    foreach (var layout in configuration.MeshLayouts)
                    {
                        CustomField.ObjectPicker("Material Key", layout.Material);
                        EditorGUILayout.IntField("Layer ID", layout.Channel);
                    }
                }

                EditorGUILayout.LabelField("Texture Mapping");
                CustomField.PreviewReadableTexture2Ds(configuration.Textures, configuration.TextureDivision);

                EditorGUILayout.LabelField("グローバル設定");
                using (new EditorGUI.IndentLevelScope())
                {
                    EditorGUILayout.TextField("出力先ディレクトリ", configuration.DestinationPath);
                    EditorGUILayout.TextField("出力ファイル名", configuration.BaseName);
                }

                EditorGUILayout.LabelField("メッシュ設定");
                using (new EditorGUI.IndentLevelScope())
                    EditorGUILayout.Toggle("Material Key を使用する", configuration.IsUseMaterialKey);

                EditorGUILayout.LabelField("テクスチャ設定");
                using (new EditorGUI.IndentLevelScope())
                    CustomField.EnumField("出力サイズ", configuration.AtlasTextureSize);
            }

            return(true);
        }
Esempio n. 8
0
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
Unity 上でアトラス化作業を行えるエディター拡張です。
ウィザードに従って操作することで、 Prefab などから簡単にアトラス化された Texture / Material を作成できます。
".Trim());
            }

            _mode = CustomField.EnumField("起動モード", _mode);

            return(true);
        }
        public void OnAwake(AtlasConfiguration configuration)
        {
            _index     = 0;
            _layouts   = configuration.MeshLayouts;
            _materials = new List <Material>();
            _shaders   = ShaderUtil.GetAllShaderInfo().Where(w => w.supported).Select(w => w.name).ToList();

            foreach (var group in _layouts.GroupBy(w => w.Channel))
            {
                var value = group.First().Material.shader.name;
                var isAllMaterialEquals = group.All(w => w.Material.shader.name == value);

                var material = !isAllMaterialEquals ? new Material(Shader.Find("Standard")) : Object.Instantiate(group.First().Material);
                material.name = $"Material (Layer {group.Key})";
                _materials.Add(material);
            }
        }
        public Writer(Uri dependencyServiceUri, AtlasConfiguration atlasConfiguration, DataFormat dataFormat,
                      string group, IOutputTopic topic, bool enableCache = true)
        {
            var httpDependencyClient =
                new HttpDependencyClient(dependencyServiceUri, group,
                                         enableCache); // DependencyClient stores the Data format, Atlas Configuration
            var dataFormatClient         = new DataFormatClient(httpDependencyClient);
            var atlasConfigurationClient = new AtlasConfigurationClient(httpDependencyClient);
            var atlasConfigurationId     =
                atlasConfigurationClient
                .PutAndIdentifyAtlasConfiguration(atlasConfiguration); // Uniq ID created for the AtlasConfiguration
            var dataFormatId =
                dataFormatClient.PutAndIdentifyDataFormat(dataFormat); // Uniq ID created for the Data Format

            TopicName = topic.TopicName;

            //Init Session
            session = new SessionTelemetryDataOutput(topic, dataFormatId, dataFormatClient);
            session.SessionOutput.AddSessionDependency(DependencyTypes.DataFormat, dataFormatId);
            session.SessionOutput.AddSessionDependency(DependencyTypes.AtlasConfiguration, atlasConfigurationId);
            SessionOutput = session.SessionOutput;
        }
Esempio n. 11
0
        public void OnFinalize(AtlasConfiguration configuration)
        {
            if (_workspace == null)
            {
                _workspace = new GameObject("Mochizuki.Workspace (DO NOT EDIT THIS)");
                configuration.GameObject = Object.Instantiate(_gameObject, _workspace.transform);
                configuration.Workspace  = _workspace;
            }

            configuration.Renderers.Clear();
            configuration.Renderers.AddRange(configuration.GameObject.GetComponentsInChildren <Renderer>().Where(w => w is SkinnedMeshRenderer || w is MeshRenderer));

            configuration.Materials.Clear();
            configuration.Materials.AddRange(configuration.Renderers.SelectMany(w => w.sharedMaterials).Distinct());

            configuration.MeshLayouts.Clear();
            configuration.MeshLayouts.AddRange(configuration.Materials.Select(w => new AtlasMeshLayout(w)));

            configuration.Textures.Clear();
            configuration.Textures.AddRange(CollectTexturesFromMaterial(configuration.Materials));
            configuration.Textures.AddRange(CollectColorsFromMaterial(configuration.Materials));
        }
Esempio n. 12
0
        public bool OnGui(AtlasConfiguration configuration)
        {
            using (new EditorGUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.LabelField(@"
アトラス化処理を行いたい Prefab もしくは GameObject を設定します。
設定した Prefab もしくは GameObject は、 Mochizuki.Workspace GameObject の子としてシーンに追加されます。
シーンに追加された GameObject は絶対にいじらないでください (処理終了後、自動削除されます)。
".Trim());
            }

            EditorGUILayout.Space();
            EditorGUI.BeginChangeCheck();

            _gameObject = CustomField.ObjectPicker("Prefab / GameObject", _gameObject);

            if (EditorGUI.EndChangeCheck())
            {
                if (_workspace != null)
                {
                    Object.DestroyImmediate(_workspace);
                }

                if (_gameObject == null)
                {
                    return(false);
                }
            }

            var error = ValidateGameObject();

            if (!string.IsNullOrWhiteSpace(error))
            {
                CustomField.ErrorField(error);
                return(false);
            }

            return(_gameObject != null);
        }
Esempio n. 13
0
        private void OnEnable()
        {
            if (_configuration == null)
            {
                _configuration = new AtlasConfiguration();
            }
            if (_wizardPages == null)
            {
                _wizardPages = new List <IWizardPage>();
            }

            _wizardPages.Clear();
            _wizardPages.Add(new StartPage());
            _wizardPages.Add(new InitialPage());
            _wizardPages.Add(new MeshMappingPage());
            _wizardPages.Add(new TextureMappingPage());
            _wizardPages.Add(new ShaderSettings());
            _wizardPages.Add(new ConfigurationPage());
            _wizardPages.Add(new ConfirmationPage());

            _wizardPages.ForEach(w => w.OnInitialize());
        }
Esempio n. 14
0
 public void OnFinalize(AtlasConfiguration configuration)
 {
     configuration.NewMaterials.Clear();
     configuration.NewMaterials.AddRange(_materials);
 }
Esempio n. 15
0
 public void OnAwake(AtlasConfiguration configuration)
 {
     _layouts = configuration.MeshLayouts.ToList();
 }
Esempio n. 16
0
 public void OnFinalize(AtlasConfiguration configuration)
 {
     configuration.MeshLayouts.Clear();
     configuration.MeshLayouts.AddRange(_layouts);
 }
 public void OnAwake(AtlasConfiguration configuration)
 {
 }
Esempio n. 18
0
 public void OnFinalize(AtlasConfiguration configuration)
 {
     configuration.Mode = _mode;
 }
Esempio n. 19
0
 public void OnFinalize(AtlasConfiguration configuration)
 {
     configuration.TextureLayouts.Clear();
     configuration.TextureLayouts.AddRange(_textureLayouts);
 }
Esempio n. 20
0
        public void ReadEvents()
        {
            const string brokerList           = "localhost:9092";                                                                   // The host and port where the Kafka broker is running
            const string groupName            = "dev";                                                                              // The dependency group name
            const string topicName            = "events_sample";                                                                    // The existing topic's name in the Kafka broker. The *_announce topic name must exist too. In this case the data_in_announce
            var          dependencyServiceUri = new Uri("http://localhost:8180/api/dependencies/");                                 // The URI where the dependency services are running

            var client                   = new KafkaStreamClient(brokerList);                                                       // Create a new KafkaStreamClient for connecting to Kafka broker
            var dataFormatClient         = new DataFormatClient(new HttpDependencyClient(dependencyServiceUri, groupName));         // Create a new DataFormatClient
            var atlasConfigurationClient = new AtlasConfigurationClient(new HttpDependencyClient(dependencyServiceUri, groupName)); // Create a new AtlasConfigurationClient

            var pipeline = client.StreamTopic(topicName).Into(streamId =>                                                           // Stream Kafka topic into the handler method
            {
                var input = new SessionTelemetryDataInput(streamId, dataFormatClient);

                AtlasConfiguration atlasConfiguration = null;

                input.SessionInput.SessionDependenciesChanged += (s, a) =>
                {
                    if (!a.Session.Dependencies.TryGetValue("atlasConfiguration", out var atlasConfigIds))
                    {
                        return;
                    }

                    atlasConfiguration = atlasConfigurationClient.GetAtlasConfiguration(atlasConfigIds[0]); // Taking first atlas configuration for this example
                };

                input.EventsInput.EventsBuffered += (sender, e) => // Subscribe to incoming events
                {
                    if (atlasConfiguration == null)
                    {
                        return;
                    }

                    var events = e.Buffer.GetData(); // read incoming events from buffer

                    // In this sample we consume the incoming events and print it
                    foreach (var ev in events)
                    {
                        var eventDefinition = atlasConfiguration.AppGroups?.First().Value?.Events.GetValueOrDefault(ev.Id);
                        if (eventDefinition == null)
                        {
                            continue;
                        }

                        Console.WriteLine($"- Event: {ev.Id} - {eventDefinition.Description} - Priority: {eventDefinition.Priority.ToString()} - Value: {ev.Values?.First()}");
                    }
                };

                input.StreamFinished += (sender, e) => Trace.WriteLine("Finished"); // Handle the steam finished event
                return(input);
            });

            if (!pipeline.WaitUntilConnected(TimeSpan.FromSeconds(30), CancellationToken.None)) // Wait until the connection is established
            {
                throw new Exception("Couldn't connect");
            }
            pipeline.WaitUntilFirstStream(TimeSpan.FromMinutes(1), CancellationToken.None); // Wait until the first stream is ready to read.
            pipeline.WaitUntilIdle(TimeSpan.FromMinutes(5), CancellationToken.None);        // Wait for 5 minutes of the pipeline being idle before exit.

            pipeline.Dispose();
        }