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)); }
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); }
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; }
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)); }
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); }
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()); }
public void OnFinalize(AtlasConfiguration configuration) { configuration.NewMaterials.Clear(); configuration.NewMaterials.AddRange(_materials); }
public void OnAwake(AtlasConfiguration configuration) { _layouts = configuration.MeshLayouts.ToList(); }
public void OnFinalize(AtlasConfiguration configuration) { configuration.MeshLayouts.Clear(); configuration.MeshLayouts.AddRange(_layouts); }
public void OnAwake(AtlasConfiguration configuration) { }
public void OnFinalize(AtlasConfiguration configuration) { configuration.Mode = _mode; }
public void OnFinalize(AtlasConfiguration configuration) { configuration.TextureLayouts.Clear(); configuration.TextureLayouts.AddRange(_textureLayouts); }
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(); }