From 1d127f3ef2386532dcc2a3c289ae5be25c5f4706 Mon Sep 17 00:00:00 2001 From: DeltaDesigns <50308149+DeltaDesigns@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:47:06 -0500 Subject: [PATCH] =?UTF-8?q?The=20Big=20Merge=E2=84=A2=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New Map Resources tab in Activity View (map and activity resources (entities, lights, skybox elements) ) - Moved Terrain to Map Resources tab - Map background entities (Skybox stuff) (WQ+) - Map decals (textures) - Basic map lights (point lights) - Fix terrain UVs - Fix Shadowkeep terrain - Fix Shadowkeep entity external materials - Source 2 shader updates - Fixed Vertex Color for Statics (WQ+) - Names for Activity Entities - Fixed vertex weights - Various fixes and smaller changes Huge thanks to @nblockbuster @cohaereo and @MontagueM for help and discoveries --- AtlasSharp/AtlasView.xaml.cs | 3 + Charm/ActivityMapEntityView.xaml | 204 + Charm/ActivityMapEntityView.xaml.cs | 729 + Charm/ActivityMapView.xaml | 138 +- Charm/ActivityMapView.xaml.cs | 96 +- Charm/ActivityView.xaml | 37 +- Charm/ActivityView.xaml.cs | 8 +- Charm/DevView.xaml.cs | 23 + Charm/EntityView.xaml.cs | 9 +- Charm/ExportControl.xaml.cs | 4 +- Charm/MainMenuView.xaml.cs | 9 +- Charm/MainViewModel.cs | 9 +- Charm/MapView.xaml.cs | 166 +- Charm/TagListView.xaml.cs | 30 +- Tiger/Exporters/Exporter.cs | 112 +- Tiger/Exporters/FbxExporter.cs | 13 +- Tiger/Exporters/MaterialExporter.cs | 2 + Tiger/Exporters/MetadataExporter.cs | 165 +- Tiger/Exporters/Source2Handler.cs | 185 +- Tiger/Exporters/blender_api_template.py | 11679 ++++++----------- Tiger/Helpers.cs | 18 + Tiger/Schema/Activity/Activity.cs | 215 +- Tiger/Schema/Activity/ActivityStructsSK.cs | 46 +- Tiger/Schema/Activity/ActivityStructsWQ.cs | 93 +- Tiger/Schema/Entity/Entity.cs | 43 + Tiger/Schema/Entity/EntityModel.cs | 39 +- Tiger/Schema/Entity/EntityStructs.cs | 194 +- Tiger/Schema/Investment/InvestmentHandler.cs | 2 +- Tiger/Schema/Model/VertexBuffer.cs | 65 +- Tiger/Schema/Shaders/DirectXTexUtil.cs | 6 +- Tiger/Schema/Shaders/Material.cs | 17 +- Tiger/Schema/Shaders/S2ShaderConverter.cs | 444 +- Tiger/Schema/Shaders/Texture.cs | 7 +- Tiger/Schema/Shaders/TextureExtractor.cs | 10 +- Tiger/Schema/Static/StaticMapData.cs | 324 +- Tiger/Schema/Static/Terrain.cs | 286 +- Tiger/Schema/Test.cs | 60 +- Tiger/Schema/Vector.cs | 6 + Tiger/SchemaTypes.cs | 4 + 39 files changed, 6687 insertions(+), 8813 deletions(-) create mode 100644 Charm/ActivityMapEntityView.xaml create mode 100644 Charm/ActivityMapEntityView.xaml.cs diff --git a/AtlasSharp/AtlasView.xaml.cs b/AtlasSharp/AtlasView.xaml.cs index 7f846e1e..49ad2fe4 100644 --- a/AtlasSharp/AtlasView.xaml.cs +++ b/AtlasSharp/AtlasView.xaml.cs @@ -50,6 +50,9 @@ public partial class AtlasView : UserControl public AtlasView() { + if (!ConfigSubsystem.Get().GetUseCustomRenderer()) + return; + InitializeComponent(); ImageHost.Loaded += ImageHost_Loaded; diff --git a/Charm/ActivityMapEntityView.xaml b/Charm/ActivityMapEntityView.xaml new file mode 100644 index 00000000..2ad3c493 --- /dev/null +++ b/Charm/ActivityMapEntityView.xaml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Charm/ActivityMapEntityView.xaml.cs b/Charm/ActivityMapEntityView.xaml.cs new file mode 100644 index 00000000..93e91f64 --- /dev/null +++ b/Charm/ActivityMapEntityView.xaml.cs @@ -0,0 +1,729 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Data; +using System.IO; +using System.Linq; +using System.Numerics; +using System.Security.Policy; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Arithmic; +using NVorbis.Contracts; +using Tiger; +using Tiger.Exporters; +using Tiger.Schema; +using Tiger.Schema.Activity; +using Tiger.Schema.Activity.DESTINY2_SHADOWKEEP_2601; +using Tiger.Schema.Activity.DESTINY2_WITCHQUEEN_6307; +using Tiger.Schema.Entity; +using Tiger.Schema.Static; + +namespace Charm; + +public partial class ActivityMapEntityView : UserControl +{ + private FbxHandler _globalFbxHandler = null; + private static ConfigSubsystem _config = CharmInstance.GetSubsystem(); + + public ActivityMapEntityView() + { + InitializeComponent(); + _globalFbxHandler = new FbxHandler(false); + } + + public void LoadUI(IActivity activity) + { + MapList.ItemsSource = GetMapList(activity); + ExportControl.SetExportFunction(Export, (int)ExportTypeFlag.Full, true); + ExportControl.SetExportInfo(activity.FileHash); + } + + private ObservableCollection GetMapList(IActivity activity) + { + var maps = new ObservableCollection(); + foreach (var bubble in activity.EnumerateBubbles()) + { + DisplayEntBubble displayMap = new(); + displayMap.Name = $"{bubble.Name}"; + displayMap.Hash = bubble.MapReference.TagData.ChildMapReference.Hash; + displayMap.LoadType = DisplayEntBubble.Type.Bubble; + displayMap.Data = displayMap; + maps.Add(displayMap); + } + + if (Strategy.CurrentStrategy >= TigerStrategy.DESTINY2_BEYONDLIGHT_3402) + { + DisplayEntBubble displayActivity = new(); + displayActivity.Name = $"{PackageResourcer.Get().GetActivityName(activity.FileHash)}"; + displayActivity.Hash = $"{activity.FileHash}"; + displayActivity.LoadType = DisplayEntBubble.Type.Activity; + displayActivity.Data = displayActivity; + maps.Add(displayActivity); + } + else + { + var vals = PackageResourcer.Get().GetAllHashes(); + foreach(var val in vals) + { + Tag tag = FileResourcer.Get().GetSchemaTag(val); + string activityName = PackageResourcer.Get().GetActivityName(activity.FileHash).Split(':')[1]; + + if (tag.TagData.ActivityDevName.Value.Contains(activityName)) //This is probably really bad... + { + DisplayEntBubble displayActivity = new(); + displayActivity.Name = $"{PackageResourcer.Get().GetActivityName(val)}"; + displayActivity.Hash = $"{tag.Hash}"; + displayActivity.ParentHash = $"{activity.FileHash}"; + displayActivity.LoadType = DisplayEntBubble.Type.Activity; + displayActivity.Data = displayActivity; + maps.Add(displayActivity); + } + } + } + + return maps; + } + + private void GetBubbleContentsButton_OnClick(object sender, RoutedEventArgs e) + { + DisplayEntBubble tagData = (sender as Button).Tag as DisplayEntBubble; //apparently this works..? + if(tagData.LoadType == DisplayEntBubble.Type.Bubble) + { + FileHash hash = new FileHash(tagData.Hash); + Tag bubbleMaps = FileResourcer.Get().GetSchemaTag(hash); + PopulateEntityContainerList(bubbleMaps); + } + else + { + FileHash hash = new FileHash(tagData.Hash); + if(Strategy.CurrentStrategy <= TigerStrategy.DESTINY2_SHADOWKEEP_2999) + { + FileHash parentHash = new FileHash(tagData.ParentHash); + IActivity activity = FileResourcer.Get().GetFileInterface(parentHash); + PopulateActivityEntityContainerList(activity, hash); + } + else + { + IActivity activity = FileResourcer.Get().GetFileInterface(hash); + PopulateActivityEntityContainerList(activity); + } + + } + } + + private void EntityMapPart_OnCheck(object sender, RoutedEventArgs e) + { + if ((sender as CheckBox).Tag is null) + return; + + DisplayEntityMap tagData = (sender as CheckBox).Tag as DisplayEntityMap; //apparently this works..? + + foreach (DisplayEntityMap item in EntityContainerList.Items) + { + if (item.Name == "Select all") + continue; + + if (item.Selected) + { + if (tagData.EntityType == DisplayEntityMap.Type.Map) + { + Tag map = FileResourcer.Get().GetSchemaTag(tagData.Hash); + if (map == null) + continue; + + ConcurrentBag sMapDataTables = new ConcurrentBag(map.TagData.MapDataTables.Select(entry => entry.MapDataTable.Hash)); + PopulateEntityList(sMapDataTables.ToList(), null); + } + else + { + PopulateEntityList(tagData.DataTables, tagData.WorldIDs); + } + } + } + } + + private void PopulateEntityContainerList(Tag bubbleMaps) + { + ConcurrentBag items = new ConcurrentBag(); + Parallel.ForEach(bubbleMaps.TagData.MapResources, m => + { + if (m.MapContainer.TagData.MapDataTables.Count > 0) + { + DisplayEntityMap entityMap = new(); + entityMap.Name = $"{m.MapContainer.Hash}"; + entityMap.Hash = m.MapContainer.Hash; + entityMap.Count = m.MapContainer.TagData.MapDataTables.Count; + entityMap.EntityType = DisplayEntityMap.Type.Map; + entityMap.DataTables = m.MapContainer.TagData.MapDataTables.Select(entry => entry.MapDataTable.Hash).ToList(); + entityMap.Data = entityMap; + + items.Add(entityMap); + } + }); + var sortedItems = new List(items); + sortedItems.Sort((a, b) => b.Count.CompareTo(a.Count)); + sortedItems.Insert(0, new DisplayEntityMap + { + Name = "Select all" + }); + EntityContainerList.ItemsSource = sortedItems; + } + + private void PopulateActivityEntityContainerList(IActivity activity, FileHash UnkActivity = null) + { + ConcurrentBag items = new ConcurrentBag(); + + foreach (var entry in activity.EnumerateActivityEntities(UnkActivity)) + { + if(entry.DataTables.Count > 0) + { + DisplayEntityMap entityMap = new(); + entityMap.Name = $"{entry.BubbleName} {entry.ActivityPhaseName2}: {entry.DataTables.Count} Entries"; + entityMap.Hash = entry.Hash; + entityMap.Count = entry.DataTables.Count; + entityMap.EntityType = DisplayEntityMap.Type.Activity; + entityMap.DataTables = entry.DataTables; + entityMap.WorldIDs = entry.WorldIDs; + entityMap.Data = entityMap; + + items.Add(entityMap); + } + } + + var sortedItems = new List(items); + sortedItems.Sort((a, b) => a.Name.CompareTo(b.Name)); + sortedItems.Insert(0, new DisplayEntityMap + { + Name = "Select all" + }); + EntityContainerList.ItemsSource = sortedItems; + } + + private void PopulateEntityList(List dataTables, Dictionary>? worldIDs) + { + ConcurrentBag items = new ConcurrentBag(); + ConcurrentDictionary> entities = new(); + + Parallel.ForEach(dataTables, data => + { + Tag entries = FileResourcer.Get().GetSchemaTag(data); + entries.TagData.DataEntries.ForEach(entry => + { + if (entry is SMapDataEntry dynamicResource) + { + if (!entities.ContainsKey(dynamicResource.GetEntityHash())) + { + entities[dynamicResource.GetEntityHash()] = new ConcurrentBag(); + } + entities[dynamicResource.GetEntityHash()].Add(dynamicResource.WorldID); + } + }); + }); + + entities.AsParallel().ForAll(entityHash => + { + Entity entity = FileResourcer.Get().GetFile(typeof(Entity), entityHash.Key); + if (entity.HasGeometry()) + { + foreach(var namedEnt in entityHash.Value) + { + if(worldIDs is not null && worldIDs.ContainsKey(namedEnt)) + { + //This is gross + if (!items.Any(item => item.CompareByName(new DisplayEntityList { Name = $"{worldIDs[namedEnt].Keys.ElementAt(0)}:{worldIDs[namedEnt].Values.ElementAt(0)}" }))) + { + var Name = worldIDs[namedEnt].Keys.ElementAt(0); + var SubName = worldIDs[namedEnt].Values.ElementAt(0); + items.Add(new DisplayEntityList + { + DisplayName = $"{Name}: {worldIDs.Count(kvp => kvp.Value == worldIDs[namedEnt])} Instances", + SubName = $"{SubName}", + Name = $"{Name}:{SubName}", + Hash = entity.Hash, + Instances = worldIDs.Count(kvp => kvp.Value == worldIDs[namedEnt]) + }); + } + } + } + if (!items.Any(item => item.CompareByHash(new DisplayEntityList { Hash = entity.Hash }))) //Dont want duplicate entries if a named entity was already added + { + items.Add(new DisplayEntityList + { + DisplayName = $"{entity.Hash}: {entityHash.Value.Count} Instances", + Name = entity.Hash, + Hash = entity.Hash, + Instances = entityHash.Value.Count + }); + } + } + }); + + var sortedItems = new List(items); + sortedItems.Sort((a, b) => b.Instances.CompareTo(a.Instances)); + sortedItems.Insert(0, new DisplayEntityList + { + DisplayName = "All Entities", + Parent = dataTables + }); + EntitiesList.ItemsSource = sortedItems; + } + + public async void Export(ExportInfo info) + { + IActivity activity = FileResourcer.Get().GetFileInterface(info.Hash); + Log.Info($"Exporting activity data name: {PackageResourcer.Get().GetActivityName(activity.FileHash)}, hash: {activity.FileHash}, export type {info.ExportType.ToString()}"); + Dispatcher.Invoke(() => + { + MapControl.Visibility = Visibility.Hidden; + }); + var maps = new ConcurrentDictionary, string>(); + bool bSelectAll = false; + foreach (DisplayEntityMap item in EntityContainerList.Items) + { + if (item.Selected && item.Name == "Select all") + { + bSelectAll = true; + Log.Info($"Selected all maps"); + } + else + { + if (item.Selected || bSelectAll) + { + if (item.DataTables is null) + continue; + maps.TryAdd(item.DataTables, item.Hash); + Log.Info($"Selected map: {item.Hash}"); + } + } + } + + if (maps.Count == 0) + { + Log.Error("No maps selected for export."); + MessageBox.Show("No maps selected for export."); + return; + } + + List mapStages = maps.Select((x, i) => $"Exporting {i + 1}/{maps.Count}").ToList(); + mapStages.Add("Finishing Export"); + MainWindow.Progress.SetProgressStages(mapStages); + + Parallel.ForEach(maps, map => + { + ExportFull(map.Key, map.Value); + MainWindow.Progress.CompleteStage(); + }); + + Tiger.Exporters.Exporter.Get().Export(); + + MainWindow.Progress.CompleteStage(); + + Dispatcher.Invoke(() => + { + MapControl.Visibility = Visibility.Visible; + }); + Log.Info($"Exported activity data name: {PackageResourcer.Get().GetActivityName(activity.FileHash)}, hash: {activity.FileHash}"); + MessageBox.Show("Activity map data exported completed."); + } + + public static void ExportFull(List dataTables, string hash) + { + string savePath = _config.GetExportSavePath() + $"/{hash}"; + if (_config.GetSingleFolderMapsEnabled()) + { + savePath = _config.GetExportSavePath() + "/Maps"; + } + + Directory.CreateDirectory(savePath); + ExtractDataTables(dataTables, hash, savePath); + if (_config.GetIndvidualStaticsEnabled()) + { + Directory.CreateDirectory(savePath + "/Entities"); + ExportIndividual(dataTables, hash, savePath); + } + + if (_config.GetUnrealInteropEnabled()) + { + AutomatedExporter.SaveInteropUnrealPythonFile(savePath, hash, AutomatedExporter.ImportType.Map, _config.GetOutputTextureFormat(), _config.GetSingleFolderMapsEnabled()); + } + } + + private static void ExtractDataTables(List dataTables, string hash, string savePath) + { + // todo these scenes can be combined + ExporterScene dynamicPointScene = Exporter.Get().CreateScene($"{hash}_EntityPoints", ExportType.EntityPoints); + ExporterScene dynamicScene = Exporter.Get().CreateScene($"{hash}_Entities", ExportType.Map); + ExporterScene skyScene = Exporter.Get().CreateScene($"{hash}_SkyEnts", ExportType.Map); + ExporterScene terrainScene = Exporter.Get().CreateScene($"{hash}_Terrain", ExportType.Terrain); + + Parallel.ForEach(dataTables, data => + { + var dataTable = FileResourcer.Get().GetSchemaTag(data); + dataTable.TagData.DataEntries.ForEach(entry => + { + Entity entity = FileResourcer.Get().GetFile(entry.GetEntityHash()); + if (entity.HasGeometry()) + { + dynamicScene.AddMapEntity(entry, entity); + entity.SaveMaterialsFromParts(dynamicScene, entity.Load(ExportDetailLevel.MostDetailed)); + } + else + dynamicPointScene.AddEntityPoints(entry); + + switch (entry.DataResource.GetValue(dataTable.GetReader())) + { + case SMapSkyEntResource skyResource: + foreach (var element in skyResource.Unk10.TagData.Unk08) + { + if (element.Unk60.TagData.Unk08 is null) + continue; + + Matrix4x4 matrix = new Matrix4x4( + element.Unk00.X, element.Unk00.Y, element.Unk00.Z, element.Unk00.W, + element.Unk10.X, element.Unk10.Y, element.Unk10.Z, element.Unk10.W, + element.Unk20.X, element.Unk20.Y, element.Unk20.Z, element.Unk20.W, + element.Unk30.X, element.Unk30.Y, element.Unk30.Z, element.Unk30.W + ); + + System.Numerics.Vector3 scale = new(); + System.Numerics.Vector3 trans = new(); + Quaternion quat = new(); + Matrix4x4.Decompose(matrix, out scale, out quat, out trans); + + skyScene.AddMapModel(element.Unk60.TagData.Unk08, + new Tiger.Schema.Vector4(trans.X, trans.Y, trans.Z, 1.0f), + new Tiger.Schema.Vector4(quat.X, quat.Y, quat.Z, quat.W), + new Tiger.Schema.Vector3(scale.X, scale.Y, scale.Z)); + + foreach (DynamicMeshPart part in element.Unk60.TagData.Unk08.Load(ExportDetailLevel.MostDetailed, null)) + { + if (part.Material == null) continue; + skyScene.Materials.Add(new ExportMaterial(part.Material)); + } + } + break; + case CubemapResource cubemap: + dynamicScene.AddCubemap(cubemap); + break; + case SMapLightResource mapLight: + dynamicScene.AddMapLight(mapLight); + break; + case SMapSpotLightResource spotLight: + if (spotLight.Unk10 is not null) + dynamicScene.AddMapSpotLight(entry, spotLight); + break; + case SMapDecalsResource decals: + if (decals.MapDecals is null || decals.MapDecals.TagData.DecalResources is null) + return; + + dynamicScene.AddDecals(decals); + foreach (var item in decals.MapDecals.TagData.DecalResources) + { + if (item.StartIndex >= 0 && item.StartIndex < decals.MapDecals.TagData.Locations.Count) + { + for (int i = item.StartIndex; i < item.StartIndex + item.Count && i < decals.MapDecals.TagData.Locations.Count; i++) + { + dynamicScene.Materials.Add(new ExportMaterial(item.Material)); + } + } + } + break; + case SMapTerrainResource terrain: + terrain.Terrain.LoadIntoExporter(terrainScene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled()); + break; + default: + break; + } + }); + }); + } + + private static void ExportIndividual(List dataTables, string hash, string savePath) + { + Parallel.ForEach(dataTables, data => + { + var dataTable = FileResourcer.Get().GetSchemaTag(data); + dataTable.TagData.DataEntries.ForEach(entry => + { + Entity entity = FileResourcer.Get().GetFile(entry.GetEntityHash()); + if (entity.HasGeometry()) + { + ExporterScene dynamicScene = Exporter.Get().CreateScene(entity.Hash, ExportType.EntityInMap); + dynamicScene.AddEntity(entry.GetEntityHash(), entity.Load(ExportDetailLevel.MostDetailed), entity.Skeleton?.GetBoneNodes()); + entity.SaveMaterialsFromParts(dynamicScene, entity.Load(ExportDetailLevel.MostDetailed)); + + if (_config.GetS2VMDLExportEnabled()) + { + Source2Handler.SaveEntityVMDL($"{savePath}/Entities", entity); + } + } + if (entry.DataResource.GetValue(dataTable.GetReader()) is SMapSkyEntResource skyResource) + { + foreach (var element in skyResource.Unk10.TagData.Unk08) + { + if (element.Unk60.TagData.Unk08 is null) + continue; + + ExporterScene skyScene = Exporter.Get().CreateScene(element.Unk60.TagData.Unk08.Hash, ExportType.EntityInMap); + skyScene.AddModel(element.Unk60.TagData.Unk08); + + if (_config.GetS2VMDLExportEnabled()) + { + Source2Handler.SaveEntityVMDL($"{savePath}/Entities", element.Unk60.TagData.Unk08.Hash, element.Unk60.TagData.Unk08.Load(ExportDetailLevel.MostDetailed, null)); + } + } + } + if (entry.DataResource.GetValue(dataTable.GetReader()) is SMapTerrainResource terrainArrangement) + { + ExporterScene staticScene = Exporter.Get().CreateScene($"{terrainArrangement.Terrain.Hash}_Terrain", ExportType.StaticInMap); + terrainArrangement.Terrain.LoadIntoExporter(staticScene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled(), true); + } + }); + }); + } + + private async void EntityMapView_OnClick(object sender, RoutedEventArgs e) + { + var s = sender as Button; + var dc = s.DataContext as DisplayEntityMap; + Log.Info($"Loading UI for static map hash: {dc.Name}"); + MapControl.Clear(); + MapControl.Visibility = Visibility.Hidden; + var lod = MapControl.ModelView.GetSelectedLod(); + if (dc.Name == "Select all") + { + var items = EntityContainerList.Items.Cast().Where(x => x.Name != "Select all"); + List mapStages = items.Select(x => $"loading to ui: {x.Hash}").ToList(); + if (mapStages.Count == 0) + { + Log.Error("No entries available for viewing."); + MessageBox.Show("No entries available for viewing."); + return; + } + MainWindow.Progress.SetProgressStages(mapStages); + await Task.Run(() => + { + foreach (DisplayEntityMap item in items) + { + if(item.EntityType == DisplayEntityMap.Type.Map) + { + Tag tag = FileResourcer.Get().GetSchemaTag(new FileHash(item.Hash)); + foreach (var datatable in tag.TagData.MapDataTables) + { + MapControl.LoadMap(datatable.MapDataTable.Hash, lod, true); + } + MainWindow.Progress.CompleteStage(); + } + else + { + foreach (var datatable in item.DataTables) + { + MapControl.LoadMap(datatable, lod, true); + } + MainWindow.Progress.CompleteStage(); + } + } + }); + } + else + { + MainWindow.Progress.SetProgressStages(new List { dc.Hash }); + await Task.Run(() => + { + if (dc.EntityType == DisplayEntityMap.Type.Map) + { + Tag tag = FileResourcer.Get().GetSchemaTag(new FileHash(dc.Hash)); + foreach (var datatable in tag.TagData.MapDataTables) + { + MapControl.LoadMap(datatable.MapDataTable.Hash, lod, true); + } + MainWindow.Progress.CompleteStage(); + } + else + { + foreach (var datatable in dc.DataTables) + { + MapControl.LoadMap(datatable, lod, true); + } + MainWindow.Progress.CompleteStage(); + } + }); + } + MapControl.Visibility = Visibility.Visible; + } + + private async void EntityView_OnClick(object sender, RoutedEventArgs e) + { + var s = sender as Button; + var dc = s.DataContext as DisplayEntityList; + MapControl.Clear(); + Log.Info($"Loading UI for entity: {dc.Name}"); + MapControl.Visibility = Visibility.Hidden; + var lod = MapControl.ModelView.GetSelectedLod(); + if (dc.DisplayName == "All Entities") + { + var items = dc.Parent; + List mapStages = items.Select(x => $"Loading to UI: {x}").ToList(); + if (mapStages.Count == 0) + { + Log.Error("No entities available for view."); + MessageBox.Show("No entities available for view."); + return; + } + + MainWindow.Progress.SetProgressStages(mapStages); + await Task.Run(() => + { + foreach (var datatable in items) + { + var mapDataTable = FileResourcer.Get().GetSchemaTag(datatable); + MapControl.LoadMap(mapDataTable.Hash, lod, true); + MainWindow.Progress.CompleteStage(); + } + }); + } + else + { + Entity entity = FileResourcer.Get().GetFile(dc.Hash); + MainWindow.Progress.SetProgressStages(new List { $"Loading Entity to UI: {entity.Hash}" }); + List entities = new List { entity }; + entities.AddRange(entity.GetEntityChildren()); + await Task.Run(() => + { + MapControl.LoadEntity(entities, _globalFbxHandler); + MainWindow.Progress.CompleteStage(); + }); + } + MapControl.Visibility = Visibility.Visible; + } + + private async void EntityExport_OnClick(object sender, RoutedEventArgs e) + { + var s = sender as Button; + var dc = s.DataContext as DisplayEntityList; + Log.Info($"Exporting entity: {dc.Name}"); + MapControl.Visibility = Visibility.Hidden; + + if (dc.DisplayName == "All Entities") + { + var items = dc.Parent; + List mapStages = items.Select(x => $"Exporting Entities: {x}").ToList(); + if (mapStages.Count == 0) + { + Log.Error("No entries available for export."); + MessageBox.Show("No entries available for export."); + return; + } + + MainWindow.Progress.SetProgressStages(mapStages); + await Task.Run(() => + { + foreach (var datatable in items) + { + var mapDataTable = FileResourcer.Get().GetSchemaTag(datatable); + foreach (var entry in mapDataTable.TagData.DataEntries) + { + Entity entity = FileResourcer.Get().GetFile(entry.GetEntityHash()); + if(entity.HasGeometry()) + { + List entities = new List { entity }; + entities.AddRange(entity.GetEntityChildren()); + EntityView.Export(entities, entity.Hash, ExportTypeFlag.Full); + } + } + MainWindow.Progress.CompleteStage(); + } + }); + } + else + { + FileHash tagHash = new FileHash(dc.Hash); + MainWindow.Progress.SetProgressStages(new List { $"Exporting Entity: {tagHash}" }); + await Task.Run(() => + { + Entity entity = FileResourcer.Get().GetFile(tagHash); + List entities = new List { entity }; + entities.AddRange(entity.GetEntityChildren()); + EntityView.Export(entities, entity.Hash, ExportTypeFlag.Full); + MainWindow.Progress.CompleteStage(); + }); + } + MapControl.Visibility = Visibility.Visible; + } + + public void Dispose() + { + MapControl.Dispose(); + } +} + +public class DisplayEntBubble +{ + public string Name { get; set; } + public string Hash { get; set; } + public string ParentHash { get; set; } + public Type LoadType { get; set; } //this kinda sucks but dont want to have 2 seperate tabs for map and activity entities + public DisplayEntBubble Data { get; set; } + + public enum Type + { + Bubble, + Activity + } +} + +public class DisplayEntityMap +{ + public string Name { get; set; } + public string Hash { get; set; } + public int Count { get; set; } + + public bool Selected { get; set; } + public Type EntityType { get; set; } + public List DataTables { get; set; } + public Dictionary> WorldIDs { get; set; } + public DisplayEntityMap Data { get; set; } + + public enum Type + { + Map, + Activity + } +} + +public class DisplayEntityList +{ + public string DisplayName { get; set; } + public string SubName { get; set; } + public string Name { get; set; } + public string Hash { get; set; } + public List Parent { get; set; } + public int Instances { get; set; } + + public bool Selected { get; set; } + + //public override bool Equals(object obj) + //{ + // var other = obj as DisplayEntityList; + // return other != null && Hash == other.Hash; + //} + + public bool CompareByHash(DisplayEntityList other) + { + return Hash == other.Hash; + } + + public bool CompareByName(DisplayEntityList other) + { + return Name == other.Name; + } + + public override int GetHashCode() + { + return Hash?.GetHashCode() ?? 0; + } +} diff --git a/Charm/ActivityMapView.xaml b/Charm/ActivityMapView.xaml index 97232468..ea92cc37 100644 --- a/Charm/ActivityMapView.xaml +++ b/Charm/ActivityMapView.xaml @@ -1,11 +1,13 @@ - + @@ -14,24 +16,47 @@ - - @@ -42,13 +67,25 @@ - - - + + + - @@ -69,48 +106,57 @@ - + - + - + - - - - - - - - - - - - + + + + + + + + + + - + diff --git a/Charm/ActivityMapView.xaml.cs b/Charm/ActivityMapView.xaml.cs index c3986ed6..42b2330f 100644 --- a/Charm/ActivityMapView.xaml.cs +++ b/Charm/ActivityMapView.xaml.cs @@ -28,7 +28,7 @@ public ActivityMapView() public void LoadUI(IActivity activity) { MapList.ItemsSource = GetMapList(activity); - ExportControl.SetExportFunction(ExportFull, (int)ExportTypeFlag.Full | (int)ExportTypeFlag.Minimal | (int)ExportTypeFlag.ArrangedMap | (int)ExportTypeFlag.TerrainOnly, true); + ExportControl.SetExportFunction(ExportFull, (int)ExportTypeFlag.Full | (int)ExportTypeFlag.ArrangedMap, true); ExportControl.SetExportInfo(activity.FileHash); } @@ -66,23 +66,6 @@ private void GetBubbleContentsButton_OnClick(object sender, RoutedEventArgs e) PopulateStaticList(bubbleMaps); } - private void StaticMapPart_OnCheck(object sender, RoutedEventArgs e) - { - FileHash hash = new FileHash((sender as CheckBox).Tag as string); - Tag map = FileResourcer.Get().GetSchemaTag(hash); - - foreach (DisplayStaticMap item in StaticList.Items) - { - if (item.Name == "Select all") - continue; - - // if (item.Selected) - // { - // PopulateDynamicsList(map); - // } - } - } - private void PopulateStaticList(Tag bubbleMaps) { ConcurrentBag items = new ConcurrentBag(); @@ -95,9 +78,8 @@ private void PopulateStaticList(Tag bubbleMaps) { StaticMapData? tag = mapDataTable.TagData.DataEntries[0].DataResource.GetValue(mapDataTable.GetReader())?.StaticMapParent.TagData.StaticMap; if (tag == null) - { return; // todo sk broke this - } + items.Add(new DisplayStaticMap { Hash = m.MapContainer.Hash, @@ -116,48 +98,6 @@ private void PopulateStaticList(Tag bubbleMaps) StaticList.ItemsSource = sortedItems; } - private void PopulateDynamicsList(Tag map)//(Tag bubbleMaps) - { - - ConcurrentBag items = new ConcurrentBag(); - Parallel.ForEach(map.TagData.MapDataTables, data => - { - data.MapDataTable.TagData.DataEntries.ForEach(entry => - { - if (entry is SMapDataEntry dynamicResource) - { - Entity entity = FileResourcer.Get().GetFile(typeof(Entity), dynamicResource.GetEntityHash()); - - if (entity.Model != null) - { - items.Add(new DisplayDynamicMap - { - Hash = dynamicResource.GetEntityHash(), - Name = $"{dynamicResource.GetEntityHash()}: {entity.Model.TagData.Meshes.Count} meshes", - Models = entity.Model.TagData.Meshes.Count - }); - } - else - { - items.Add(new DisplayDynamicMap - { - Hash = dynamicResource.GetEntityHash(), - Name = $"{dynamicResource.GetEntityHash()}: 0 meshes", - Models = 0 - }); - } - } - }); - }); - var sortedItems = new List(items); - sortedItems.Sort((a, b) => b.Models.CompareTo(a.Models)); - sortedItems.Insert(0, new DisplayDynamicMap - { - Name = "Select all" - }); - DynamicsList.ItemsSource = sortedItems; - } - public async void ExportFull(ExportInfo info) { // todo figure out how to make this work @@ -199,24 +139,7 @@ public async void ExportFull(ExportInfo info) // MainWindow.Progress.SetProgressStages(new List { "exporting activity map data parallel" }); Parallel.ForEach(maps, map => { - if (info.ExportType == ExportTypeFlag.Full) - { - MapView.ExportFullMap(map); - MapView.ExportTerrainMap(map); - } - else if (info.ExportType == ExportTypeFlag.TerrainOnly) - { - MapView.ExportTerrainMap(map); - } - else if (info.ExportType == ExportTypeFlag.Minimal) - { - MapView.ExportMinimalMap(map, info.ExportType); - } - else - { - MapView.ExportMinimalMap(map, info.ExportType); - } - + MapView.ExportFullMap(map, info.ExportType); MainWindow.Progress.CompleteStage(); }); // MapView.ExportFullMap(staticMapData); @@ -248,8 +171,8 @@ private async void StaticMap_OnClick(object sender, RoutedEventArgs e) List mapStages = items.Select(x => $"loading to ui: {x.Hash}").ToList(); if (mapStages.Count == 0) { - Log.Error("No maps selected for export."); - MessageBox.Show("No maps selected for export."); + Log.Error("No maps available for viewing."); + MessageBox.Show("No maps available for viewing."); return; } MainWindow.Progress.SetProgressStages(mapStages); @@ -297,12 +220,3 @@ public class DisplayStaticMap public bool Selected { get; set; } } - -public class DisplayDynamicMap -{ - public string Name { get; set; } - public string Hash { get; set; } - public int Models { get; set; } - - public bool Selected { get; set; } -} diff --git a/Charm/ActivityView.xaml b/Charm/ActivityView.xaml index e8326f32..3991e867 100644 --- a/Charm/ActivityView.xaml +++ b/Charm/ActivityView.xaml @@ -1,24 +1,29 @@ - + - - + + - - + + - - + + - - + + + + + diff --git a/Charm/ActivityView.xaml.cs b/Charm/ActivityView.xaml.cs index c117c541..ebaeae67 100644 --- a/Charm/ActivityView.xaml.cs +++ b/Charm/ActivityView.xaml.cs @@ -22,7 +22,8 @@ public async void LoadActivity(FileHash hash) MainWindow.Progress.SetProgressStages(new List { "loading activity tag", - "loading map ui", + "loading static map ui", + "loading map resources ui", "loading dialogue ui", "loading directive ui", "loading music ui", @@ -42,6 +43,11 @@ await Task.Run(() => }); MainWindow.Progress.CompleteStage(); Dispatcher.Invoke(() => + { + MapEntityControl.LoadUI(_activity); + }); + MainWindow.Progress.CompleteStage(); + Dispatcher.Invoke(() => { DialogueControl.LoadUI(_activity.FileHash); }); diff --git a/Charm/DevView.xaml.cs b/Charm/DevView.xaml.cs index 011053d7..f8c59201 100644 --- a/Charm/DevView.xaml.cs +++ b/Charm/DevView.xaml.cs @@ -4,15 +4,18 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Numerics; using System.Text; using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using Tiger; +using Tiger.Exporters; using Tiger.Schema; using Tiger.Schema.Audio; using Tiger.Schema.Entity; +using Tiger.Schema.Static; namespace Charm; @@ -206,6 +209,26 @@ private void AddWindow(FileHash hash) _mainWindow.MakeNewTab(hash, dialogueView); _mainWindow.SetNewestTabSelected(); break; + case 0x808073A5: + case 0x80806F07: //Entity model + EntityModel entityModel = FileResourcer.Get().GetFile(hash); + ExporterScene scene = Exporter.Get().CreateScene(hash, ExportType.Entity); + scene.AddModel(entityModel); + var parts = entityModel.Load(ExportDetailLevel.MostDetailed, null); + foreach (DynamicMeshPart part in parts) + { + if (part.Material == null) continue; + scene.Materials.Add(new ExportMaterial(part.Material)); + } + Exporter.Get().Export(); + break; + case 0x8080714F: + case 0x80806C81: + Terrain terrain = FileResourcer.Get().GetFile(hash); + ExporterScene terrainScene = Exporter.Get().CreateScene(hash, ExportType.Terrain); + terrain.LoadIntoExporter(terrainScene, ConfigSubsystem.Get().GetExportSavePath(), false); + Exporter.Get().Export(); + break; default: MessageBox.Show("Unknown reference: " + Endian.U32ToString(reference)); break; diff --git a/Charm/EntityView.xaml.cs b/Charm/EntityView.xaml.cs index 29200857..608d21a8 100644 --- a/Charm/EntityView.xaml.cs +++ b/Charm/EntityView.xaml.cs @@ -100,6 +100,10 @@ public static void Export(List entities, string name, ExportTypeFlag exp entity.SaveMaterialsFromParts(scene, dynamicParts); entity.SaveTexturePlates(savePath); } + if (ConfigSubsystem.Get().GetS2VMDLExportEnabled()) + { + Source2Handler.SaveEntityVMDL($"{savePath}", entity); + } } if (exportType == ExportTypeFlag.Full) @@ -163,10 +167,11 @@ public static void ExportInventoryItem(ApiItem item) ConfigSubsystem config = CharmInstance.GetSubsystem(); string savePath = config.GetExportSavePath(); - string meshName = name; + string meshName = Regex.Replace(name, @"[^\u0000-\u007F]", "_"); + string itemName = Regex.Replace(string.Join("_", item.ItemName.Split(Path.GetInvalidFileNameChars())), @"[^\u0000-\u007F]", "_"); savePath += $"/{meshName}"; Directory.CreateDirectory(savePath); - AutomatedExporter.SaveBlenderApiFile(savePath, string.Join("_", item.ItemName.Split(Path.GetInvalidFileNameChars())), + AutomatedExporter.SaveBlenderApiFile(savePath, itemName, config.GetOutputTextureFormat(), dyes.Values.ToList()); } } diff --git a/Charm/ExportControl.xaml.cs b/Charm/ExportControl.xaml.cs index 86659d14..1f798cf0 100644 --- a/Charm/ExportControl.xaml.cs +++ b/Charm/ExportControl.xaml.cs @@ -16,8 +16,8 @@ public enum ExportTypeFlag Full = 1, [Description("Minimal (no terrain)")] Minimal = 2, - [Description("Terrain only")] - TerrainOnly = 4, + //[Description("Terrain only")] + //TerrainOnly = 4, [Description("Pre-arranged map")] ArrangedMap = 8, } diff --git a/Charm/MainMenuView.xaml.cs b/Charm/MainMenuView.xaml.cs index 0ca9c7af..b01a47cb 100644 --- a/Charm/MainMenuView.xaml.cs +++ b/Charm/MainMenuView.xaml.cs @@ -23,7 +23,7 @@ public MainMenuView() ApiButton.IsEnabled = ShowWQButtons(Strategy.CurrentStrategy); BagsButton.IsEnabled = ShowWQButtons(Strategy.CurrentStrategy); - WeaponAudioButton.IsEnabled = ShowWQButtons(Strategy.CurrentStrategy); + WeaponAudioButton.IsEnabled = ShowIfLatest(Strategy.CurrentStrategy); Strategy.OnStrategyChangedEvent += delegate (StrategyEventArgs args) { @@ -31,7 +31,7 @@ public MainMenuView() { ApiButton.IsEnabled = ShowWQButtons(args.Strategy); BagsButton.IsEnabled = ShowWQButtons(args.Strategy); - WeaponAudioButton.IsEnabled = ShowWQButtons(args.Strategy); + WeaponAudioButton.IsEnabled = ShowIfLatest(args.Strategy); }); }; } @@ -41,6 +41,11 @@ private bool ShowWQButtons(TigerStrategy strategy) return strategy > TigerStrategy.DESTINY2_BEYONDLIGHT_3402; } + private bool ShowIfLatest(TigerStrategy strategy) + { + return strategy == TigerStrategy.DESTINY2_LATEST; + } + private void OnControlLoaded(object sender, RoutedEventArgs routedEventArgs) { _mainWindow = Window.GetWindow(this) as MainWindow; diff --git a/Charm/MainViewModel.cs b/Charm/MainViewModel.cs index b64b8312..f822e681 100644 --- a/Charm/MainViewModel.cs +++ b/Charm/MainViewModel.cs @@ -265,9 +265,12 @@ public void SetChildren(List parts) var v3ne = ConsiderQuatToEulerConvert(v4n); SharpDX.Vector3 n = new SharpDX.Vector3(v3ne.X, v3ne.Y, v3ne.Z); normals.Add(n); - var v2t = part.BasePart.VertexTexcoords0[lookup[(int)vertexIndex]]; - SharpDX.Vector2 t = new SharpDX.Vector2(v2t.X, v2t.Y); - textureCoordinates.Add(t); + if(part.BasePart.VertexTexcoords0.Count > 0) + { + var v2t = part.BasePart.VertexTexcoords0[lookup[(int)vertexIndex]]; + SharpDX.Vector2 t = new SharpDX.Vector2(v2t.X, v2t.Y); + textureCoordinates.Add(t); + } } foreach (UIntVector3 face in part.BasePart.Indices) { diff --git a/Charm/MapView.xaml.cs b/Charm/MapView.xaml.cs index 4ac3d003..3fa534ab 100644 --- a/Charm/MapView.xaml.cs +++ b/Charm/MapView.xaml.cs @@ -4,11 +4,15 @@ using System.ComponentModel; using System.IO; using System.Linq; +using System.Media; +using System.Numerics; +using System.Security.Policy; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using Arithmic; using Tiger; using Tiger.Exporters; using Tiger.Schema; @@ -40,10 +44,18 @@ public MapView() InitializeComponent(); } - public void LoadMap(FileHash fileHash, ExportDetailLevel detailLevel) + public void LoadMap(FileHash fileHash, ExportDetailLevel detailLevel, bool isEntities = false) { - GetStaticMapData(fileHash, detailLevel); - // _mainWindow.SetNewestTabSelected(); + if (isEntities) + GetEntityMapData(fileHash, detailLevel); + else + GetStaticMapData(fileHash, detailLevel); + } + + private void GetEntityMapData(FileHash tagHash, ExportDetailLevel detailLevel) + { + Tag dataentry = FileResourcer.Get().GetSchemaTag(tagHash); + SetEntityMapUI(dataentry, detailLevel); } private void GetStaticMapData(FileHash fileHash, ExportDetailLevel detailLevel) @@ -66,6 +78,45 @@ private void SetMapUI(StaticMapData staticMapData, ExportDetailLevel detailLevel displayParts.Clear(); } + private void SetEntityMapUI(Tag dataentry, ExportDetailLevel detailLevel) + { + var displayParts = MakeEntityDisplayParts(dataentry, detailLevel); + Dispatcher.Invoke(() => + { + MainViewModel MVM = (MainViewModel)ModelView.UCModelView.Resources["MVM"]; + MVM.SetChildren(displayParts); + }); + displayParts.Clear(); + } + + public bool LoadEntity(List entities, FbxHandler fbxHandler) + { + fbxHandler.Clear(); + foreach(var entity in entities) + AddEntity(entity, ExportDetailLevel.MostDetailed, fbxHandler); + return LoadUI(fbxHandler); + } + + private void AddEntity(Entity entity, ExportDetailLevel detailLevel, FbxHandler fbxHandler) + { + var dynamicParts = entity.Load(detailLevel); + //ModelView.SetGroupIndices(new HashSet(dynamicParts.Select(x => x.GroupIndex))); + //dynamicParts = dynamicParts.Where(x => x.GroupIndex == ModelView.GetSelectedGroupIndex()).ToList(); + fbxHandler.AddEntityToScene(entity, dynamicParts, detailLevel); + Log.Verbose($"Adding entity {entity.Hash}/{entity.Model?.Hash} with {dynamicParts.Sum(p => p.Indices.Count)} vertices to fbx"); + } + + private bool LoadUI(FbxHandler fbxHandler) + { + MainViewModel MVM = (MainViewModel)ModelView.UCModelView.Resources["MVM"]; + ConfigSubsystem config = CharmInstance.GetSubsystem(); + string filePath = $"{config.GetExportSavePath()}/temp.fbx"; + fbxHandler.ExportScene(filePath); + bool loaded = MVM.LoadEntityFromFbx(filePath); + fbxHandler.Clear(); + return loaded; + } + public void Clear() { MainViewModel MVM = (MainViewModel)ModelView.UCModelView.Resources["MVM"]; @@ -78,7 +129,7 @@ public void Dispose() MVM.Dispose(); } - public static void ExportFullMap(Tag map) + public static void ExportFullMap(Tag map, ExportTypeFlag exportTypeFlag) { ExporterScene scene = Exporter.Get().CreateScene(map.Hash.ToString(), ExportType.Map); @@ -93,7 +144,6 @@ public static void ExportFullMap(Tag map) if(exportStatics) { Directory.CreateDirectory(savePath + "/Statics"); - Directory.CreateDirectory(savePath + "/Entities"); ExportStatics(savePath, map); } @@ -105,31 +155,6 @@ public static void ExportFullMap(Tag map) } } - public static void ExportMinimalMap(Tag map, ExportTypeFlag exportTypeFlag) - { - ExporterScene scene = Exporter.Get().CreateScene(map.Hash.ToString(), ExportType.Map); - string meshName = map.Hash.ToString(); - string savePath = _config.GetExportSavePath() + $"/{meshName}"; - if (_config.GetSingleFolderMapsEnabled()) - { - savePath = _config.GetExportSavePath() + "/Maps"; - } - Directory.CreateDirectory(savePath); - if (exportStatics) - { - Directory.CreateDirectory(savePath + "/Statics"); - Directory.CreateDirectory(savePath + "/Entities"); - ExportStatics(savePath, map); - } - - ExtractDataTables(map, savePath, scene, exportTypeFlag); - - if (_config.GetUnrealInteropEnabled()) - { - AutomatedExporter.SaveInteropUnrealPythonFile(savePath, meshName, AutomatedExporter.ImportType.Map, _config.GetOutputTextureFormat(), _config.GetSingleFolderMapsEnabled()); - } - } - public static void ExportTerrainMap(Tag map) { ExporterScene scene = Exporter.Get().CreateScene($"{map.Hash}_Terrain", ExportType.Terrain); @@ -147,41 +172,28 @@ public static void ExportTerrainMap(Tag map) { data.MapDataTable.TagData.DataEntries.ForEach(entry => { - if (entry.DataResource.GetValue(data.MapDataTable.GetReader()) is D2Class_7D6C8080 terrainArrangement) // Terrain + if (entry.DataResource.GetValue(data.MapDataTable.GetReader()) is SMapTerrainResource terrainArrangement) // Terrain { - export = true; - terrainArrangement.Terrain.LoadIntoExporter(scene, savePath, _config.GetUnrealInteropEnabled(), terrainArrangement); + terrainArrangement.Terrain.LoadIntoExporter(scene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled()); if (exportStatics) { - if (source2Models) - { - File.Copy("Exporters/template.vmdl", $"{savePath}/Statics/{terrainArrangement.Terrain.Hash}_Terrain.vmdl", true); - } ExporterScene staticScene = Exporter.Get().CreateScene($"{terrainArrangement.Terrain.Hash}_Terrain", ExportType.StaticInMap); - terrainArrangement.Terrain.LoadIntoExporter(staticScene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled(), terrainArrangement, true); + terrainArrangement.Terrain.LoadIntoExporter(staticScene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled(), true); } } }); }); - if (export) + if (_config.GetUnrealInteropEnabled()) { - if (_config.GetUnrealInteropEnabled()) - { - AutomatedExporter.SaveInteropUnrealPythonFile(savePath, meshName + "_Terrain", AutomatedExporter.ImportType.Map, _config.GetOutputTextureFormat(), _config.GetSingleFolderMapsEnabled()); - } + AutomatedExporter.SaveInteropUnrealPythonFile(savePath, meshName + "_Terrain", AutomatedExporter.ImportType.Map, _config.GetOutputTextureFormat(), _config.GetSingleFolderMapsEnabled()); } } private static void ExtractDataTables(Tag map, string savePath, ExporterScene scene, ExportTypeFlag exportTypeFlag) { - // todo these scenes can be combined - ExporterScene dynamicPointScene = Exporter.Get().CreateScene($"{map.Hash}_EntityPoints", ExportType.EntityPoints); - ExporterScene dynamicScene = Exporter.Get().CreateScene($"{map.Hash}_Entities", ExportType.Map); - Parallel.ForEach(map.TagData.MapDataTables, data => { - //Console.WriteLine($"{data.MapDataTable.Hash}"); data.MapDataTable.TagData.DataEntries.ForEach(entry => { if (entry.DataResource.GetValue(data.MapDataTable.GetReader()) is SMapDataResource staticMapResource) // Static map @@ -190,24 +202,11 @@ private static void ExtractDataTables(Tag map, string savePath, E { staticMapResource.StaticMapParent.TagData.StaticMap.LoadArrangedIntoExporterScene(); //Arranged because...arranged } - else if (exportTypeFlag == ExportTypeFlag.Full || exportTypeFlag == ExportTypeFlag.Minimal) //No terrain on a minimal rip makes sense right? + else if (exportTypeFlag == ExportTypeFlag.Full) { staticMapResource.StaticMapParent.TagData.StaticMap.LoadIntoExporterScene(scene, savePath, _config.GetUnrealInteropEnabled() || _config.GetS2ShaderExportEnabled()); } } - if (entry is SMapDataEntry dynamicResource) - { - Entity entity = FileResourcer.Get().GetFile(entry.GetEntityHash()); - if(entity.HasGeometry()) - { - dynamicScene.AddMapEntity(dynamicResource, entity); - } - dynamicPointScene.AddEntityPoints(dynamicResource); - } - if (entry.DataResource.GetValue(data.MapDataTable.GetReader()) is CubemapResource cubemap) - { - scene.AddCubemap(cubemap); - } }); }); } @@ -236,20 +235,6 @@ private static void ExportStatics(string savePath, Tag map) } } } - if (entry is SMapDataEntry dynamicResource) - { - Entity entity = FileResourcer.Get().GetFile(entry.GetEntityHash()); - if (entity.HasGeometry()) - { - ExporterScene dynamicScene = Exporter.Get().CreateScene(entity.Hash, ExportType.EntityInMap); - dynamicScene.AddEntity(dynamicResource.GetEntityHash(), entity.Model.Load(ExportDetailLevel.MostDetailed, entity.ModelParentResource), entity.Skeleton?.GetBoneNodes()); - entity.SaveMaterialsFromParts(dynamicScene, entity.Model.Load(ExportDetailLevel.MostDetailed, entity.ModelParentResource)); - if (source2Models) - { - Source2Handler.SaveEntityVMDL($"{savePath}/Entities", entity); - } - } - } }); }); } @@ -278,4 +263,33 @@ private static void ExportStatics(string savePath, Tag map) }); return displayParts.ToList(); } + + private List MakeEntityDisplayParts(Tag dataentry, ExportDetailLevel detailLevel) + { + ConcurrentBag displayParts = new ConcurrentBag(); + Parallel.ForEach(dataentry.TagData.DataEntries, entry => + { + Entity entity = FileResourcer.Get().GetFile(typeof(Entity), entry.GetEntityHash()); + List entities = new List { entity }; + entities.AddRange(entity.GetEntityChildren()); + foreach(var ent in entities) + { + if (ent.HasGeometry()) + { + var parts = ent.Load(ExportDetailLevel.MostDetailed); + + foreach (var part in parts) + { + MainViewModel.DisplayPart displayPart = new MainViewModel.DisplayPart(); + displayPart.BasePart = part; + displayPart.Translations.Add(entry.Translation.ToVec3()); + displayPart.Rotations.Add(entry.Rotation); + displayPart.Scales.Add(new Tiger.Schema.Vector3(entry.Translation.W, entry.Translation.W, entry.Translation.W)); + displayParts.Add(displayPart); + } + } + } + }); + return displayParts.ToList(); + } } diff --git a/Charm/TagListView.xaml.cs b/Charm/TagListView.xaml.cs index 92a9b95d..21a0bb90 100644 --- a/Charm/TagListView.xaml.cs +++ b/Charm/TagListView.xaml.cs @@ -1125,7 +1125,7 @@ await Task.Run(() => // PackageHandler.CacheHashDataList(tex3d.Select(x => x.Hash).ToArray()); // MainWindow.Progress.CompleteStage(); - Parallel.ForEach(tex, val => + tex.ToList().ForEach(val => //Doesnt really need to be parrellizedm, loads quick enough without it and fixes(?) missing entries { _allTagItems.Add(new TagItem { @@ -1219,8 +1219,9 @@ private void LoadDialogueList(FileHash fileHash) else if (Strategy.CurrentStrategy == TigerStrategy.DESTINY2_BEYONDLIGHT_3402) { var resource = activity.TagData.Unk18.GetValue(activity.GetReader()); - if (resource is D2Class_D5908080 || resource is D2Class_44938080 || resource is D2Class_45938080 || - resource is D2Class_18978080 || resource is D2Class_19978080) + //if (resource is D2Class_D5908080 || resource is D2Class_44938080 || resource is D2Class_45938080 || + // resource is D2Class_18978080 || resource is D2Class_19978080) + if (resource is D2Class_19978080) { if (resource.DialogueTableBL != null) dialogueTables.Add(resource.DialogueTableBL.Hash); @@ -1635,10 +1636,15 @@ private void LoadWeaponAudioList(TigerHash apiHash) return; } _weaponItemName = Investment.Get().GetItemNameSanitized(Investment.Get().GetInventoryItem(apiHash)); - var resourceUnnamed = (D2Class_F42C8080)val.PatternAudioUnnamed.TagData.Unk18.GetValue(val.PatternAudioUnnamed.GetReader()); + + var resourceUnnamedReader = val.PatternAudioUnnamed.GetReader(); + var resourceUnnamed = (D2Class_F42C8080)val.PatternAudioUnnamed.TagData.Unk18.GetValue(resourceUnnamedReader); var resource = (D2Class_6E358080)val.PatternAudio.TagData.Unk18.GetValue(val.PatternAudio.GetReader()); var item = Investment.Get().GetInventoryItem(apiHash); var weaponContentGroupHash = Investment.Get().GetWeaponContentGroupHash(item); + + Log.Verbose($"Loading weapon entity audio {val.Hash}, ContentGroupHash {weaponContentGroupHash}"); + // Named foreach (var entry in resource.PatternAudioGroups) { @@ -1664,7 +1670,7 @@ private void LoadWeaponAudioList(TigerHash apiHash) } } // Unnamed - var sounds = GetWeaponUnnamedSounds(resourceUnnamed, weaponContentGroupHash); + var sounds = GetWeaponUnnamedSounds(resourceUnnamed, weaponContentGroupHash, resourceUnnamedReader); foreach (var s in sounds) { if (s == null) @@ -1681,9 +1687,10 @@ private void LoadWeaponAudioList(TigerHash apiHash) RefreshItemList(); } - public List GetWeaponUnnamedSounds(D2Class_F42C8080 resource, TigerHash weaponContentGroupHash) + public List GetWeaponUnnamedSounds(D2Class_F42C8080 resource, TigerHash weaponContentGroupHash, TigerReader reader) { List sounds = new List(); + resource.PatternAudioGroups.ForEach(entry => { if (!entry.WeaponContentGroupHash.Equals(weaponContentGroupHash)) @@ -1691,6 +1698,17 @@ public List GetWeaponUnnamedSounds(D2Class_F42C8080 resource, TigerH List entitiesParents = new() { entry.Unk60, entry.Unk78, entry.Unk90, entry.UnkA8, entry.UnkC0, entry.UnkD8, entry.AudioEntityParent, entry.Unk130, entry.Unk148, entry.Unk1C0, entry.Unk1D8, entry.Unk248 }; List entities = new(); + + if (entry.Unk118.GetValue(reader) is D2Class_0A2D8080 resourceUnk118) + { + if (resourceUnk118.Unk08 != null) + entities.Add(resourceUnk118.Unk08); + if (resourceUnk118.Unk20 != null) + entities.Add(resourceUnk118.Unk20); + if (resourceUnk118.Unk38 != null) + entities.Add(resourceUnk118.Unk38); + } + foreach (var tag in entitiesParents) { if (tag == null) diff --git a/Tiger/Exporters/Exporter.cs b/Tiger/Exporters/Exporter.cs index 2ff5b3a4..53b71a1d 100644 --- a/Tiger/Exporters/Exporter.cs +++ b/Tiger/Exporters/Exporter.cs @@ -91,9 +91,13 @@ public class ExporterScene public ConcurrentBag ExternalMaterialTextures = new(); public ConcurrentBag EntityPoints = new(); public ConcurrentBag Cubemaps = new(); + public ConcurrentBag MapLights = new(); + public ConcurrentDictionary> MapSpotLights = new(); + public ConcurrentBag Decals = new(); private ConcurrentBag _addedEntities = new(); public ConcurrentHashSet Textures = new(); public ConcurrentHashSet Materials = new(); + public ConcurrentDictionary> TerrainDyemaps = new(); public void AddStatic(FileHash meshHash, List parts) { @@ -141,7 +145,7 @@ private static List InstancesToTransforms(IEnumerable parts, List parts, List 0) // Only export if theres actually something to export + exporter.Export(fbxScene); exporter.Destroy(); fbxScene.Clear(); } @@ -124,7 +125,7 @@ private void AddEntity(FbxScene fbxScene, ExporterEntity entity) if (dynamicMeshPart.VertexColourSlots.Count > 0 || dynamicMeshPart.GearDyeChangeColorIndex != 0xFF) { fbxMesh.AddSlotColours(dynamicMeshPart); - fbxMesh.AddTexcoords1(dynamicMeshPart); + fbxMesh.AddTexcoords1(part); } if (dynamicMeshPart.VertexWeights.Count > 0) @@ -308,9 +309,9 @@ public static void AddTexcoords0(this FbxMesh fbxMesh, ExporterPart part) fbxMesh.GetLayer(0).SetUVs(uvLayer); } - public static void AddTexcoords1(this FbxMesh fbxMesh, DynamicMeshPart meshPart) + public static void AddTexcoords1(this FbxMesh fbxMesh, ExporterPart part) { - if (!meshPart.VertexTexcoords1.Any()) + if (!part.MeshPart.VertexTexcoords1.Any()) { return; } @@ -318,7 +319,7 @@ public static void AddTexcoords1(this FbxMesh fbxMesh, DynamicMeshPart meshPart) FbxLayerElementUV uvLayer = FbxLayerElementUV.Create(fbxMesh, "uv1"); uvLayer.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint); uvLayer.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect); - foreach (var tx in meshPart.VertexTexcoords1) + foreach (var tx in part.MeshPart.VertexTexcoords1) { uvLayer.GetDirectArray().Add(new FbxVector2(tx.X, tx.Y)); } diff --git a/Tiger/Exporters/MaterialExporter.cs b/Tiger/Exporters/MaterialExporter.cs index e4f86358..d1886ebb 100644 --- a/Tiger/Exporters/MaterialExporter.cs +++ b/Tiger/Exporters/MaterialExporter.cs @@ -79,6 +79,8 @@ public override void Export(Exporter.ExportEventArgs args) Directory.CreateDirectory(textureSaveDirectory); foreach (Texture texture in mapTextures) { + if (texture is null) + continue; texture.SavetoFile($"{textureSaveDirectory}/{texture.Hash}"); } diff --git a/Tiger/Exporters/MetadataExporter.cs b/Tiger/Exporters/MetadataExporter.cs index c52c64f8..61d40fb0 100644 --- a/Tiger/Exporters/MetadataExporter.cs +++ b/Tiger/Exporters/MetadataExporter.cs @@ -34,6 +34,12 @@ public MetadataScene(ExporterScene scene) _config.TryAdd("Instances", instances); ConcurrentDictionary> cubemaps = new(); _config.TryAdd("Cubemaps", cubemaps); + ConcurrentDictionary> pointLights = new(); + _config.TryAdd("Lights", pointLights); + ConcurrentDictionary> decals = new ConcurrentDictionary>(); + _config.TryAdd("Decals", decals); + ConcurrentDictionary> terrainDyemaps = new ConcurrentDictionary>(); + _config.TryAdd("TerrainDyemaps", terrainDyemaps); if (ConfigSubsystem.Get().GetUnrealInteropEnabled()) { @@ -84,7 +90,69 @@ public MetadataScene(ExporterScene scene) foreach (CubemapResource cubemap in scene.Cubemaps) { - AddCubemap(cubemap.CubemapName, cubemap.CubemapSize.ToVec3(), cubemap.CubemapRotation, cubemap.CubemapPosition.ToVec3()); + AddCubemap(cubemap.CubemapName, + cubemap.CubemapSize.ToVec3(), + cubemap.CubemapRotation, + cubemap.CubemapPosition.ToVec3(), + cubemap.CubemapTexture != null ? cubemap.CubemapTexture.Hash : ""); + } + foreach (var mapLight in scene.MapLights) + { + for (int i = 0; i < mapLight.Unk10.TagData.Unk30.Count; i++) + { + var data = Strategy.CurrentStrategy == TigerStrategy.DESTINY2_SHADOWKEEP_2601 ? mapLight.Unk10.TagData.Unk30[i].UnkCC : mapLight.Unk10.TagData.Unk30[i].UnkD0; + if (data is null) + continue; + AddLight( + data.Hash, + "Point", + mapLight.Unk10.TagData.Unk40[i].Translation, + mapLight.Unk10.TagData.Unk40[i].Rotation, + new Vector2(1,1), //new Vector2(mapLight.Unk10.TagData.Unk30[i].UnkA0.W, mapLight.Unk10.TagData.Unk30[i].UnkB0.W), //Not right + (data.TagData.Unk40.Count > 0 ? data.TagData.Unk40[0].Vec : data.TagData.Unk60[0].Vec)); + } + } + foreach(SMapDecalsResource decal in scene.Decals) + { + if (decal.MapDecals is not null) + { + foreach (var item in decal.MapDecals.TagData.DecalResources) + { + // Check if the index is within the bounds of the second list + if (item.StartIndex >= 0 && item.StartIndex < decal.MapDecals.TagData.Locations.Count) + { + // Loop through the second list based on the given parameters + for (int i = item.StartIndex; i < item.StartIndex + item.Count && i < decal.MapDecals.TagData.Locations.Count; i++) + { + var location = decal.MapDecals.TagData.Locations[i].Location; + var boxCorners = decal.MapDecals.TagData.DecalProjectionBounds.TagData.InstanceBounds[i]; + + AddDecal(boxCorners.Unk24.ToString(), item.Material.FileHash, location, boxCorners.Corner1, boxCorners.Corner2); + AddMaterial(item.Material); + } + } + } + } + + } + foreach (var mapLight in scene.MapSpotLights) + { + foreach(var entry in mapLight.Value) + { + AddLight( + mapLight.Key, + "Spot", + new Vector4(entry.Position.X, entry.Position.Y, entry.Position.Z, 1), + entry.Quaternion, + new Vector2(1.0, 1.0), + new Vector4(1.0,1.0,1.0,1.0)); + } + } + + foreach(var dyemaps in scene.TerrainDyemaps) + { + foreach(var dyemap in dyemaps.Value) + AddTerrainDyemap(dyemaps.Key, dyemap); } } @@ -155,7 +223,7 @@ public void AddInstanced(FileHash meshHash, List transforms) { Translation = new[] { transform.Position.X, transform.Position.Y, transform.Position.Z }, Rotation = new[] { transform.Quaternion.X, transform.Quaternion.Y, transform.Quaternion.Z, transform.Quaternion.W }, - Scale = transform.Scale.X + Scale = new[] { transform.Scale.X, transform.Scale.Y, transform.Scale.Z } }); } } @@ -171,7 +239,7 @@ public void AddTextureToMaterial(string material, int index, Texture texture) _config["Materials"][material]["PS"].TryAdd(index, new TexInfo { Hash = texture.Hash, SRGB = texture.IsSrgb() }); } - public void AddCubemap(string name, Vector3 scale, Vector4 quatRotation, Vector3 translation) + public void AddCubemap(string name, Vector3 scale, Vector4 quatRotation, Vector3 translation, string texHash) { if (!_config["Cubemaps"].ContainsKey(name)) { @@ -181,12 +249,68 @@ public void AddCubemap(string name, Vector3 scale, Vector4 quatRotation, Vector3 { Translation = new[] { translation.X, translation.Y, translation.Z }, Rotation = new[] { quatRotation.X, quatRotation.Y, quatRotation.Z, quatRotation.W }, - Scale = new[] { scale.X, scale.Y, scale.Z } + Scale = new[] { scale.X, scale.Y, scale.Z }, + Texture = texHash + }); + } + + public void AddLight(string name, string type, Vector4 translation, Vector4 quatRotation, Vector2 size, Vector4 color) + { + //Idk how color/intensity is handled, so if its above 1 just bring it down + float R = color.X > 1 ? color.X / 100 : color.X; + float G = color.Y > 1 ? color.Y / 100 : color.Y; + float B = color.Z > 1 ? color.Z / 100 : color.Z; + + if (!_config["Lights"].ContainsKey(name)) + { + _config["Lights"][name] = new ConcurrentBag(); + } + _config["Lights"][name].Add(new JsonLight + { + Type = type, + Translation = new[] { translation.X, translation.Y, translation.Z }, + Rotation = new[] { quatRotation.X, quatRotation.Y, quatRotation.Z, quatRotation.W }, + Size = new[] { size.X, size.Y }, + Color = new[] { R, G, B } }); } + public void AddDecal(string boxhash, string materialName, Vector4 origin, Vector4 corner1, Vector4 corner2) + { + if (!_config["Decals"].ContainsKey(boxhash)) + { + _config["Decals"][boxhash] = new ConcurrentBag(); + } + _config["Decals"][boxhash].Add(new JsonDecal + { + Material = materialName, + Origin = new[] { origin.X, origin.Y, origin.Z }, + Scale = origin.W, + Corner1 = new[] { corner1.X, corner1.Y, corner1.Z }, + Corner2 = new[] { corner2.X, corner2.Y, corner2.Z } + }); + } + + public void AddTerrainDyemap(string modelHash, FileHash dyemapHash) + { + if (!_config["TerrainDyemaps"].ContainsKey(modelHash)) + { + _config["TerrainDyemaps"][modelHash] = new ConcurrentBag(); + } + _config["TerrainDyemaps"][modelHash].Add(dyemapHash); + } + public void WriteToFile(string path) { + if (_config["Lights"].Count == 0 + && _config["Materials"].Count == 0 + && _config["Cubemaps"].Count == 0 + && _config["Instances"].Count == 0 + && _config["Parts"].Count == 0 + && _config["Decals"].Count == 0 + && _exportType is not ExportType.EntityPoints) + return; //Dont export if theres nothing in the cfg (this is kind of a mess though) + if (_exportType is ExportType.Static or ExportType.Entity) { path = Path.Join(path, _config["MeshName"]); @@ -216,31 +340,20 @@ public void WriteToFile(string path) } - //im not smart enough to have done this, so i made an ai do it lol //this just sorts the "instances" part of the cfg so its ordered by scale //makes it easier for instancing models in Hammer/S&Box - var sortedDict = new ConcurrentDictionary>(); - // Use LINQ's OrderBy method to sort the values in each array - // based on the "Scale" key. The lambda expression specifies that - // the "Scale" property should be used as the key for the order. foreach (var keyValuePair in (ConcurrentDictionary>)_config["Instances"]) { var array = keyValuePair.Value; - var sortedArray = array.OrderBy(x => x.Scale); + var sortedArray = array.OrderBy(x => x.Scale[0]); - // Convert the sorted array to a ConcurrentBag var sortedBag = new ConcurrentBag(sortedArray); - - // Add the sorted bag to the dictionary sortedDict.TryAdd(keyValuePair.Key, sortedBag); } - - // Finally, update the _config["Instances"] object with the sorted values _config["Instances"] = sortedDict; - string s = JsonConvert.SerializeObject(_config, Formatting.Indented); if (_config.ContainsKey("MeshName")) { @@ -256,7 +369,7 @@ private struct JsonInstance { public float[] Translation; public float[] Rotation; // Quaternion - public float Scale; + public float[] Scale; } private struct JsonCubemap @@ -264,6 +377,24 @@ private struct JsonCubemap public float[] Translation; public float[] Rotation; public float[] Scale; + public string Texture; + } + + private struct JsonLight + { + public string Type; + public float[] Translation; + public float[] Rotation; + public float[] Size; + public float[] Color; + } + private struct JsonDecal + { + public string Material; + public float[] Origin; + public float Scale; + public float[] Corner1; + public float[] Corner2; } } diff --git a/Tiger/Exporters/Source2Handler.cs b/Tiger/Exporters/Source2Handler.cs index fe234628..a7a20ca8 100644 --- a/Tiger/Exporters/Source2Handler.cs +++ b/Tiger/Exporters/Source2Handler.cs @@ -51,39 +51,54 @@ public static void SaveStaticVMDL(string savePath, string staticMeshName, List parts) + { + try { - File.Copy("Exporters/template.vmdl", $"{savePath}/{entity.Hash}.vmdl", true); - string text = File.ReadAllText($"{savePath}/{entity.Hash}.vmdl"); + if (!File.Exists($"{savePath}/{hash}.vmdl")) + { + File.Copy("Exporters/template.vmdl", $"{savePath}/{hash}.vmdl", true); + string text = File.ReadAllText($"{savePath}/{hash}.vmdl"); - StringBuilder mats = new StringBuilder(); + StringBuilder mats = new StringBuilder(); - int i = 0; - foreach (var part in entity.Load(ExportDetailLevel.MostDetailed)) - { - if (part.Material == null) - continue; + int i = 0; + foreach (var part in parts) + { + if (part.Material == null) + continue; - if (!part.Material.EnumeratePSTextures().Any()) - continue; + if (!part.Material.EnumeratePSTextures().Any()) + continue; - mats.AppendLine("{"); - mats.AppendLine($" from = \"{part.Material.FileHash}.vmat\""); - mats.AppendLine($" to = \"materials/{part.Material.FileHash}.vmat\""); - mats.AppendLine("},\n"); - i++; - } + mats.AppendLine("{"); + mats.AppendLine($" from = \"{part.Material.FileHash}.vmat\""); + mats.AppendLine($" to = \"materials/{part.Material.FileHash}.vmat\""); + mats.AppendLine("},\n"); + i++; + } - text = text.Replace("%MATERIALS%", mats.ToString()); - text = text.Replace("%FILENAME%", $"models/{entity.Hash}.fbx"); - text = text.Replace("%MESHNAME%", entity.Hash); + text = text.Replace("%MATERIALS%", mats.ToString()); + text = text.Replace("%FILENAME%", $"models/{hash}.fbx"); + text = text.Replace("%MESHNAME%", hash); + + File.WriteAllText($"{savePath}/{hash}.vmdl", text); + } + } + catch(Exception e) + { - File.WriteAllText($"{savePath}/{entity.Hash}.vmdl", text); } } - public static void SaveTerrainVMDL(string savePath, string hash, List parts, STerrain terrainHeader) + public static void SaveTerrainVMDL(string savePath, string hash, List parts, STerrain terrainHeader) { + Directory.CreateDirectory($"{savePath}/Statics/"); + File.Copy("Exporters/template.vmdl", $"{savePath}/Statics/{hash}_Terrain.vmdl", true); if (File.Exists($"{savePath}/Statics/{hash}_Terrain.vmdl")) { string text = File.ReadAllText($"{savePath}/Statics/{hash}_Terrain.vmdl"); @@ -108,7 +123,6 @@ public static void SaveTerrainVMDL(string savePath, string hash, List text = text.Replace("%MESHNAME%", hash); File.WriteAllText($"{savePath}/Statics/{hash}_Terrain.vmdl", text); - } } @@ -118,7 +132,7 @@ public static void SaveVMAT(string savePath, string hash, IMaterial materialHead vmat.AppendLine("Layer0 \n{"); //If the shader doesnt exist, just use the default complex.shader - if (!File.Exists($"{savePath}/Source2/PS_{hash}.shader")) + if (!File.Exists($"{savePath}/Source2/PS_{materialHeader.PixelShader?.Hash}.shader")) { vmat.AppendLine($" shader \"complex.shader\""); @@ -131,21 +145,26 @@ public static void SaveVMAT(string savePath, string hash, IMaterial materialHead } else { - vmat.AppendLine($" shader \"ps_{hash}.shader\""); - vmat.AppendLine(" F_ALPHA_TEST 1"); + vmat.AppendLine($"\tshader \"ps_{materialHeader.PixelShader.Hash}.shader\""); + vmat.AppendLine($"\tF_ALPHA_TEST 1"); + vmat.AppendLine($"\tF_ADDITIVE_BLEND 1"); + + if(materialHeader.Unk0C != 0) + { + vmat.AppendLine($"\tF_RENDER_BACKFACES 1"); + } } foreach (var e in materialHeader.EnumeratePSTextures()) { if (e.Texture == null) - { continue; - } - vmat.AppendLine($" TextureT{e.TextureIndex} \"materials/Textures/{e.Texture.Hash}.png\""); + vmat.AppendLine($"\tTextureT{e.TextureIndex} \"materials/Textures/{e.Texture.Hash}.png\""); } - vmat.AppendLine($"Attributes\r\n\t{{\r\n\t\tDebug_Diffuse \"false\"\r\n\t\tDebug_Rough \"false\"\r\n\t\tDebug_Metal \"false\"\r\n\t\tDebug_Normal \"false\"\r\n\t\tDebug_AO \"false\"\r\n\t\tDebug_Emit \"false\"\r\n\t\tDebug_Alpha \"false\"\r\n\t}}"); + //vmat.AppendLine(PopulateCBuffers(materialHeader.Decompile(materialHeader.VertexShader.GetBytecode(), $"vs{materialHeader.VertexShader.Hash}"), materialHeader, true).ToString()); + vmat.AppendLine(PopulateCBuffers(materialHeader.Decompile(materialHeader.PixelShader.GetBytecode(), $"ps{materialHeader.PixelShader.Hash}"), materialHeader).ToString()); vmat.AppendLine("}"); string terrainDir = isTerrain ? "/Terrain/" : ""; @@ -169,7 +188,6 @@ public static void SaveDecalVMAT(string savePath, string hash, IMaterial materia StringBuilder vmat = new StringBuilder(); vmat.AppendLine("Layer0 \n{"); - vmat.AppendLine($" shader \"projected_decals.shader\""); //Use just the first texture for the diffuse @@ -179,7 +197,6 @@ public static void SaveDecalVMAT(string savePath, string hash, IMaterial materia vmat.AppendLine($" TextureColor \"materials/Textures/{materialHeader.EnumeratePSTextures().ElementAt(0).Texture.Hash}.png\""); } - foreach (var e in materialHeader.EnumeratePSTextures()) { if (e.Texture == null) @@ -204,4 +221,108 @@ public static void SaveDecalVMAT(string savePath, string hash, IMaterial materia } } } + + public static StringBuilder PopulateCBuffers(string hlsl, IMaterial materialHeader, bool isVertexShader = false) + { + StringReader reader = new(hlsl); + + List cbuffers = new List(); + StringBuilder buffers = new StringBuilder(); + + string line = string.Empty; + do + { + line = reader.ReadLine(); + if (line != null) + { + if (line.Contains("cbuffer")) + { + reader.ReadLine(); + line = reader.ReadLine(); + Cbuffer cbuffer = new Cbuffer(); + cbuffer.Variable = "cb" + line.Split("cb")[1].Split("[")[0]; + cbuffer.Index = Int32.TryParse(new string(cbuffer.Variable.Skip(2).ToArray()), out int index) ? index : -1; + cbuffer.Count = Int32.TryParse(new string(line.Split("[")[1].Split("]")[0]), out int count) ? count : -1; + cbuffer.Type = line.Split("cb")[0].Trim(); + cbuffers.Add(cbuffer); + } + } + + } while (line != null); + + foreach (var cbuffer in cbuffers) + { + dynamic data = null; + string cbType = isVertexShader ? "vs_cb" : "cb"; + + if(isVertexShader) + { + if (cbuffer.Count == materialHeader.UnkA0.Count) + { + data = materialHeader.UnkA0; + } + else if (cbuffer.Count == materialHeader.UnkC0.Count) + { + data = materialHeader.UnkC0; + } + } + else + { + if (cbuffer.Count == materialHeader.Unk2E0.Count) + { + data = materialHeader.Unk2E0; + } + else if (cbuffer.Count == materialHeader.Unk300.Count) + { + data = materialHeader.Unk300; + } + else + { + if (materialHeader.PSVector4Container.IsValid()) + { + // Try the Vector4 storage file + TigerFile container = new(materialHeader.PSVector4Container.GetReferenceHash()); + byte[] containerData = container.GetData(); + int num = containerData.Length / 16; + if (cbuffer.Count == num) + { + List float4s = new(); + for (int i = 0; i < containerData.Length / 16; i++) + { + float4s.Add(containerData.Skip(i * 16).Take(16).ToArray().ToType()); + } + + data = float4s; + } + } + } + } + + for (int i = 0; i < cbuffer.Count; i++) + { + if (data == null) + buffers.AppendLine($"\t{cbType}{cbuffer.Index}_{i} \"[0.000 0.000 0.000 0.000]\""); + else + { + try + { + if (data[i] is Vec4) + { + buffers.AppendLine($"\t{cbType}{cbuffer.Index}_{i} \"[{data[i].Vec.X} {data[i].Vec.Y} {data[i].Vec.Z} {data[i].Vec.W}]\""); + } + else if (data[i] is Vector4) + { + buffers.AppendLine($"\t{cbType}{cbuffer.Index}_{i} \"[{data[i].X} {data[i].Y} {data[i].Z} {data[i].W}]\""); + } + } + catch (Exception e) + { + buffers.AppendLine($"\t{cbType}{cbuffer.Index}_{i} \"[0.000 0.000 0.000 0.000]\""); + } + } + } + } + + return buffers; + } } diff --git a/Tiger/Exporters/blender_api_template.py b/Tiger/Exporters/blender_api_template.py index 73b28092..53dd688a 100644 --- a/Tiger/Exporters/blender_api_template.py +++ b/Tiger/Exporters/blender_api_template.py @@ -2,10 +2,198 @@ import os RIP_LOCATION = None - -class NODE_PT_MAINPANEL(bpy.types.Panel): - bl_label = "Custom Node Group" - bl_idname = "NODE_PT_MAINPANEL" +#Detail Texture Position and Scale +armordetaildiffuseposition = (DiffTrans1.Z, DiffTrans1.W, 0.000) +armordetaildiffusescale = (DiffTrans1.X, DiffTrans1.Y, 0.000) +armordetailnormalposition = (NormTrans1.Z, NormTrans1.W, 0.000) +armordetailnormalscale = (NormTrans1.X, NormTrans1.Y, 0.000) +clothdetaildiffuseposition = (DiffTrans2.Z, DiffTrans2.W, 0.000) +clothdetaildiffusescale = (DiffTrans2.X, DiffTrans2.Y, 0.000) +clothdetailnormalposition = (NormTrans2.Z, NormTrans2.W, 0.000) +clothdetailnormalscale = (NormTrans2.X, NormTrans2.Y, 0.000) +suitdetaildiffuseposition = (DiffTrans3.Z, DiffTrans3.W, 0.000) +suitdetaildiffusescale = (DiffTrans3.X, DiffTrans3.Y, 0.000) +suitdetailnormalposition = (NormTrans3.Z, NormTrans3.W, 0.000) +suitdetailnormalscale = (NormTrans3.X, NormTrans3.Y, 0.000) + +#Armor Primary Slot +armorprimarydyecolor = (CPrime1.X, CPrime1.Y, CPrime1.Z, 1.0) +armorprimaryroughnessremapX = PrimeRoughMap1.X +armorprimaryroughnessremapY = PrimeRoughMap1.Y +armorprimaryroughnessremapZ = PrimeRoughMap1.Z +armorprimaryroughnessremapW = PrimeRoughMap1.W +armorprimarywearremapX = PrimeWearMap1.X +armorprimarywearremapY = PrimeWearMap1.Y +armorprimarywearremapZ = PrimeWearMap1.Z +armorprimarywearremapW = PrimeWearMap1.W +armorprimarydetaildiffuseblend = PrimeMatParams1.X +armorprimarydetailnormalblend = PrimeMatParams1.Y +armorprimarydetailroughnessblend = PrimeMatParams1.Z +armorprimarymetalness = PrimeMatParams1.W +armorprimaryiridescence = PrimeAdvMatParams1.X +armorprimaryfuzz = PrimeAdvMatParams1.Y +armorprimarytransmission = PrimeAdvMatParams1.Z +armorprimaryemissioncolor = (CPrimeEmit1.X, CPrimeEmit1.Y, CPrimeEmit1.Z, 1.0) +#Worn Armor Primary Slot +wornarmorprimarydyecolor = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z, 1.0) +wornarmorprimaryroughnessremapX = PrimeWornRoughMap1.X +wornarmorprimaryroughnessremapY = PrimeWornRoughMap1.Y +wornarmorprimaryroughnessremapZ = PrimeWornRoughMap1.Z +wornarmorprimaryroughnessremapW = PrimeWornRoughMap1.W +wornarmorprimarydetaildiffuseblend = PrimeWornMatParams1.X +wornarmorprimarydetailnormalblend = PrimeWornMatParams1.Y +wornarmorprimarydetailroughnessblend = PrimeWornMatParams1.Z +wornarmorprimarymetalness = PrimeWornMatParams1.W + +#Armor Secondary Slot +armorsecondarydyecolor = (CSecon1.X, CSecon1.Y, CSecon1.Z, 1.0) +armorsecondaryroughnessremapX = SeconRoughMap1.X +armorsecondaryroughnessremapY = SeconRoughMap1.Y +armorsecondaryroughnessremapZ = SeconRoughMap1.Z +armorsecondaryroughnessremapW = SeconRoughMap1.W +armorsecondarywearremapX = SeconWearMap1.X +armorsecondarywearremapY = SeconWearMap1.Y +armorsecondarywearremapZ = SeconWearMap1.Z +armorsecondarywearremapW = SeconWearMap1.W +armorsecondarydetaildiffuseblend = SeconMatParams1.X +armorsecondarydetailnormalblend = SeconMatParams1.Y +armorsecondarydetailroughnessblend = SeconMatParams1.Z +armorsecondarymetalness = SeconMatParams1.W +armorsecondaryiridescence = SeconAdvMatParams1.X +armorsecondaryfuzz = SeconAdvMatParams1.Y +armorsecondarytransmission = SeconAdvMatParams1.Z +armorsecondaryemissioncolor = (CSeconEmit1.X, CSeconEmit1.Y, CSeconEmit1.Z, 1.0) +#Worn Armor Secondary Slot +wornarmorsecondarydyecolor = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z, 1.0) +wornarmorsecondaryroughnessremapX = SeconWornRoughMap1.X +wornarmorsecondaryroughnessremapY = SeconWornRoughMap1.Y +wornarmorsecondaryroughnessremapZ = SeconWornRoughMap1.Z +wornarmorsecondaryroughnessremapW = SeconWornRoughMap1.W +wornarmorsecondarydetaildiffuseblend = SeconWornMatParams1.X +wornarmorsecondarydetailnormalblend = SeconWornMatParams1.Y +wornarmorsecondarydetailroughnessblend = SeconWornMatParams1.Z +wornarmorsecondarymetalness = SeconWornMatParams1.W + +#Cloth Primary Slot +clothprimarydyecolor = (CPrime2.X, CPrime2.Y, CPrime2.Z, 1.0) +clothprimaryroughnessremapX = PrimeRoughMap2.X +clothprimaryroughnessremapY = PrimeRoughMap2.Y +clothprimaryroughnessremapZ = PrimeRoughMap2.Z +clothprimaryroughnessremapW = PrimeRoughMap2.W +clothprimarywearremapX = PrimeWearMap2.X +clothprimarywearremapY = PrimeWearMap2.Y +clothprimarywearremapZ = PrimeWearMap2.Z +clothprimarywearremapW = PrimeWearMap2.W +clothprimarydetaildiffuseblend = PrimeMatParams2.X +clothprimarydetailnormalblend = PrimeMatParams2.Y +clothprimarydetailroughnessblend = PrimeMatParams2.Z +clothprimarymetalness = PrimeMatParams2.W +clothprimaryiridescence = PrimeAdvMatParams2.X +clothprimaryfuzz = PrimeAdvMatParams2.Y +clothprimarytransmission = PrimeAdvMatParams2.Z +clothprimaryemissioncolor = (CPrimeEmit2.X, CPrimeEmit2.Y, CPrimeEmit2.Z, 1.0) +#Worn Cloth Primary Slot +wornclothprimarydyecolor = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z, 1.0) +wornclothprimaryroughnessremapX = PrimeWornRoughMap2.X +wornclothprimaryroughnessremapY = PrimeWornRoughMap2.Y +wornclothprimaryroughnessremapZ = PrimeWornRoughMap2.Z +wornclothprimaryroughnessremapW = PrimeWornRoughMap2.W +wornclothprimarydetaildiffuseblend = PrimeWornMatParams1.X +wornclothprimarydetailnormalblend = PrimeWornMatParams1.Y +wornclothprimarydetailroughnessblend = PrimeWornMatParams1.Z +wornclothprimarymetalness = PrimeWornMatParams1.W + +#Cloth secondary Slot +clothsecondarydyecolor = (CSecon2.X, CSecon2.Y, CSecon2.Z, 1.0) +clothsecondaryroughnessremapX = SeconRoughMap2.X +clothsecondaryroughnessremapY = SeconRoughMap2.Y +clothsecondaryroughnessremapZ = SeconRoughMap2.Z +clothsecondaryroughnessremapW = SeconRoughMap2.W +clothsecondarywearremapX = SeconWearMap2.X +clothsecondarywearremapY = SeconWearMap2.Y +clothsecondarywearremapZ = SeconWearMap2.Z +clothsecondarywearremapW = SeconWearMap2.W +clothsecondarydetaildiffuseblend = SeconMatParams2.X +clothsecondarydetailnormalblend = SeconMatParams2.Y +clothsecondarydetailroughnessblend = SeconMatParams2.Z +clothsecondarymetalness = SeconMatParams2.W +clothsecondaryiridescence = SeconAdvMatParams2.X +clothsecondaryfuzz = SeconAdvMatParams2.Y +clothsecondarytransmission = SeconAdvMatParams2.Z +clothsecondaryemissioncolor = (CSeconEmit2.X, CSeconEmit2.Y, CSeconEmit2.Z, 1.0) +#Worn Cloth secondary Slot +wornclothsecondarydyecolor = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z, 1.0) +wornclothsecondaryroughnessremapX = SeconWornRoughMap2.X +wornclothsecondaryroughnessremapY = SeconWornRoughMap2.Y +wornclothsecondaryroughnessremapZ = SeconWornRoughMap2.Z +wornclothsecondaryroughnessremapW = SeconWornRoughMap2.W +wornclothsecondarydetaildiffuseblend = SeconWornMatParams2.X +wornclothsecondarydetailnormalblend = SeconWornMatParams2.Y +wornclothsecondarydetailroughnessblend = SeconWornMatParams2.Z +wornclothsecondarymetalness = SeconWornMatParams2.W + +#Suit Primary Slot +suitprimarydyecolor = (CPrime3.X, CPrime3.Y, CPrime3.Z, 1.0) +suitprimaryroughnessremapX = PrimeRoughMap3.X +suitprimaryroughnessremapY = PrimeRoughMap3.Y +suitprimaryroughnessremapZ = PrimeRoughMap3.Z +suitprimaryroughnessremapW = PrimeRoughMap3.W +suitprimarywearremapX = PrimeWearMap3.X +suitprimarywearremapY = PrimeWearMap3.Y +suitprimarywearremapZ = PrimeWearMap3.Z +suitprimarywearremapW = PrimeWearMap3.W +suitprimarydetaildiffuseblend = PrimeMatParams3.X +suitprimarydetailnormalblend = PrimeMatParams3.Y +suitprimarydetailroughnessblend = PrimeMatParams3.Z +suitprimarymetalness = PrimeMatParams3.W +suitprimaryiridescence = PrimeAdvMatParams3.X +suitprimaryfuzz = PrimeAdvMatParams3.Y +suitprimarytransmission = PrimeAdvMatParams3.Z +suitprimaryemissioncolor = (CPrimeEmit3.X, CPrimeEmit3.Y, CPrimeEmit3.Z, 1.0) +#Worn Suit Primary Slot +wornsuitprimarydyecolor = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z, 1.0) +wornsuitprimaryroughnessremapX = PrimeWornRoughMap3.X +wornsuitprimaryroughnessremapY = PrimeWornRoughMap3.Y +wornsuitprimaryroughnessremapZ = PrimeWornRoughMap3.Z +wornsuitprimaryroughnessremapW = PrimeWornRoughMap3.W +wornsuitprimarydetaildiffuseblend = PrimeWornMatParams3.X +wornsuitprimarydetailnormalblend = PrimeWornMatParams3.Y +wornsuitprimarydetailroughnessblend = PrimeWornMatParams3.Z +wornsuitprimarymetalness = PrimeWornMatParams3.W + +#Suit Secondary Slot +suitsecondarydyecolor = (CSecon3.X, CSecon3.Y, CSecon3.Z, 1.0) +suitsecondaryroughnessremapX = SeconRoughMap3.X +suitsecondaryroughnessremapY = SeconRoughMap3.Y +suitsecondaryroughnessremapZ = SeconRoughMap3.Z +suitsecondaryroughnessremapW = SeconRoughMap3.W +suitsecondarywearremapX = SeconWearMap3.X +suitsecondarywearremapY = SeconWearMap3.Y +suitsecondarywearremapZ = SeconWearMap3.Z +suitsecondarywearremapW = SeconWearMap3.W +suitsecondarydetaildiffuseblend = SeconMatParams3.X +suitsecondarydetailnormalblend = SeconMatParams3.Y +suitsecondarydetailroughnessblend = SeconMatParams3.Z +suitsecondarymetalness = SeconMatParams3.W +suitsecondaryiridescence = SeconAdvMatParams3.X +suitsecondaryfuzz = SeconAdvMatParams3.Y +suitsecondarytransmission = SeconAdvMatParams3.Z +suitsecondaryemissioncolor = (CSeconEmit3.X, CSeconEmit3.Y, CSeconEmit3.Z, 1.0) +#Worn Suit Secondary Slot +wornsuitsecondarydyecolor = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z, 1.0) +wornsuitsecondaryroughnessremapX = SeconWornRoughMap3.X +wornsuitsecondaryroughnessremapY = SeconWornRoughMap3.Y +wornsuitsecondaryroughnessremapZ = SeconWornRoughMap3.Z +wornsuitsecondaryroughnessremapW = SeconWornRoughMap3.W +wornsuitsecondarydetaildiffuseblend = SeconWornMatParams3.X +wornsuitsecondarydetailnormalblend = SeconWornMatParams3.Y +wornsuitsecondarydetailroughnessblend = SeconWornMatParams3.Z +wornsuitsecondarymetalness = SeconWornMatParams3.W +######################################################### + +class MAINPANEL(bpy.types.Panel): + bl_label = "D2 Shader Preset" + bl_idname = "MAINPANEL" bl_space_type = 'NODE_EDITOR' bl_region_type = 'UI' bl_category = 'D2 Shader' @@ -16,8053 +204,3676 @@ def draw(self, context): row = layout.row() row.operator('node.test_operator') +def create_Shader_Preset(context, operator, group_name, riplocation): -def create_test_group(context, operator, group_name, riplocation): - # Enable nodes bpy.context.scene.use_nodes = True + + Shader_Preset = bpy.data.node_groups.new(group_name, 'ShaderNodeTree') +#Nodegroup Inputs + Shader_Preset.inputs.new('NodeSocketColor', 'Dyemap Color') + Shader_Preset.inputs.new('NodeSocketFloat', 'Dyemap Alpha') + Shader_Preset.inputs.new('NodeSocketFloat', 'Slot Override [1-6]') +#Nodegroup Outputs + Shader_Preset.outputs.new('NodeSocketColor', 'Dye Color A') + Shader_Preset.outputs.new('NodeSocketColor', 'Dye Color B') + Shader_Preset.outputs.new('NodeSocketColor', 'Wear Remap_A') + Shader_Preset.outputs.new('NodeSocketColor', 'Wear Remap_B') + Shader_Preset.outputs.new('NodeSocketColor', 'Roughness Remap_A') + Shader_Preset.outputs.new('NodeSocketColor', 'Roughness Remap_B') + Shader_Preset.outputs.new('NodeSocketColor', 'Roughness Remap_C') + Shader_Preset.outputs.new('NodeSocketColor', 'Detail Diffuse') + Shader_Preset.outputs.new('NodeSocketColor', 'Detail Normal') + Shader_Preset.outputs.new('NodeSocketColor', 'Detail Blends') + Shader_Preset.outputs.new('NodeSocketColor', 'Worn Detail Blends') + Shader_Preset.outputs.new('NodeSocketColor', 'Iridescence, Fuzz, Transmission') + Shader_Preset.outputs.new('NodeSocketColor', 'Emission') +#Frames + ArmorPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + ArmorPrimaryFrame.label = "Armor Primary" + ArmorPrimaryFrame.use_custom_color = True + ArmorPrimaryFrame.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + + WornArmorPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornArmorPrimaryFrame.label = "Worn Armor Primary" + WornArmorPrimaryFrame.use_custom_color = True + WornArmorPrimaryFrame.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + + ArmorSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + ArmorSecondaryFrame.label = "Armor Secondary" + ArmorSecondaryFrame.use_custom_color = True + ArmorSecondaryFrame.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + + WornArmorSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornArmorSecondaryFrame.label = "Worn Armor Secondary" + WornArmorSecondaryFrame.use_custom_color = True + WornArmorSecondaryFrame.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + + ClothPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + ClothPrimaryFrame.label = "Cloth Primary" + ClothPrimaryFrame.use_custom_color = True + ClothPrimaryFrame.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + + WornClothPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornClothPrimaryFrame.label = "Worn Cloth Primary" + WornClothPrimaryFrame.use_custom_color = True + WornClothPrimaryFrame.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + + ClothSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + ClothSecondaryFrame.label = "Cloth Secondary" + ClothSecondaryFrame.use_custom_color = True + ClothSecondaryFrame.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + + WornClothSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornClothSecondaryFrame.label = "Worn Cloth Secondary" + WornClothSecondaryFrame.use_custom_color = True + WornClothSecondaryFrame.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + + SuitPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + SuitPrimaryFrame.label = "Suit Primary" + SuitPrimaryFrame.use_custom_color = True + SuitPrimaryFrame.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + + WornSuitPrimaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornSuitPrimaryFrame.label = "Worn Suit Primary" + WornSuitPrimaryFrame.use_custom_color = True + WornSuitPrimaryFrame.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + + SuitSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + SuitSecondaryFrame.label = "Suit Secondary" + SuitSecondaryFrame.use_custom_color = True + SuitSecondaryFrame.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + + WornSuitSecondaryFrame = Shader_Preset.nodes.new("NodeFrame") + WornSuitSecondaryFrame.label = "Worn Suit Secondary" + WornSuitSecondaryFrame.use_custom_color = True + WornSuitSecondaryFrame.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + + DoNotTouchFrame = Shader_Preset.nodes.new("NodeFrame") + DoNotTouchFrame.label = "DO NOT TOUCH!" + DoNotTouchFrame.use_custom_color = True + DoNotTouchFrame.color = (0.0, 0.0, 0.0) +#Texture nodes + armor_primary_detail_diffuse_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + armor_primary_detail_diffuse_map.label = "Detail Diffuse Map" + armor_primary_detail_diffuse_map.use_custom_color = True + armor_primary_detail_diffuse_map.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_detail_diffuse_map.interpolation = 'Linear' + armor_primary_detail_diffuse_map.projection = 'FLAT' + armor_primary_detail_diffuse_map.extension = 'REPEAT' + armor_primary_detail_diffuse_map.hide = True - test_group = bpy.data.node_groups.new(group_name, 'ShaderNodeTree') - - # Activate Node Connection usage - link = test_group.links.new - - # Nodegroup Outputs - test_group.inputs.new('NodeSocketFloat', 'Slot Override [1-6]') - - test_group.outputs.new('NodeSocketColor', 'Dye Color A') - test_group.outputs.new('NodeSocketColor', 'Dye Color B') - test_group.outputs.new('NodeSocketColor', 'Wear Remap_A') - test_group.outputs.new('NodeSocketColor', 'Wear Remap_B') - test_group.outputs.new('NodeSocketColor', 'Roughness Remap_A') - test_group.outputs.new('NodeSocketColor', 'Roughness Remap_B') - test_group.outputs.new('NodeSocketColor', 'Roughness Remap_C') - test_group.outputs.new('NodeSocketColor', 'Detail Diffuse') - test_group.outputs.new('NodeSocketColor', 'Detail Normal') - test_group.outputs.new('NodeSocketColor', 'Detail Blends') - test_group.outputs.new('NodeSocketColor', 'Worn Detail Blends') - test_group.outputs.new('NodeSocketColor', 'Iridescence, Fuzz, Transmission') - test_group.outputs.new('NodeSocketColor', 'Emission') - - # -------------------------------------------------------------------------------------------- - frame_007_1 = test_group.nodes.new('NodeFrame') - frame_007_1.color = (0.0, 0.25, 0.25) - frame_007_1.label = 'Worn Cloth Secondary' - frame_007_1.location = (-680.0, -3440.0) - frame_007_1.name = 'Frame.007' - frame_007_1.use_custom_color = True - - frame_008_1 = test_group.nodes.new('NodeFrame') - frame_008_1.color = (0.0, 0.0, 1.0) - frame_008_1.label = 'Suit Primary' - frame_008_1.location = (-680.0, -3860.0) - frame_008_1.name = 'Frame.008' - frame_008_1.use_custom_color = True - - frame_011_1 = test_group.nodes.new('NodeFrame') - frame_011_1.color = (0.25, 0.25, 0.25) - frame_011_1.label = 'Worn Suit Secondary' - frame_011_1.location = (-700.0, -5900.0) - frame_011_1.name = 'Frame.011' - frame_011_1.use_custom_color = True - - frame_005_1 = test_group.nodes.new('NodeFrame') - frame_005_1.color = (0.0, 0.25, 0.0) - frame_005_1.label = 'Worn Cloth Primary' - frame_005_1.location = (-680.0, -2280.0) - frame_005_1.name = 'Frame.005' - frame_005_1.use_custom_color = True - - frame_002_1 = test_group.nodes.new('NodeFrame') - frame_002_1.color = (1.0, 1.0, 0.0) - frame_002_1.label = 'Armor Secondary' - frame_002_1.location = (-680.0, -120.0) - frame_002_1.name = 'Frame.002' - frame_002_1.use_custom_color = True - - frame_1 = test_group.nodes.new('NodeFrame') - frame_1.color = (1.0, 0.0, 0.0) - frame_1.label = 'Armor Primary' - frame_1.location = (-660.0, 720.0) - frame_1.name = 'Frame' - frame_1.use_custom_color = True - - frame_009_1 = test_group.nodes.new('NodeFrame') - frame_009_1.color = (0.0, 0.0, 0.25) - frame_009_1.label = 'Worn Suit Primary' - frame_009_1.location = (-680.0, -4660.0) - frame_009_1.name = 'Frame.009' - frame_009_1.use_custom_color = True - - frame_003_1 = test_group.nodes.new('NodeFrame') - frame_003_1.color = (0.25, 0.25, 0.0) - frame_003_1.label = 'Worn Armor Secondary' - frame_003_1.location = (920.0, -1380.0) - frame_003_1.name = 'Frame.003' - frame_003_1.use_custom_color = True - - frame_006_1 = test_group.nodes.new('NodeFrame') - frame_006_1.color = (0.0, 1.0, 1.0) - frame_006_1.label = 'Cloth Secondary' - frame_006_1.location = (-680.0, -2620.0) - frame_006_1.name = 'Frame.006' - frame_006_1.use_custom_color = True - - frame_010_1 = test_group.nodes.new('NodeFrame') - frame_010_1.color = (1.0, 1.0, 1.0) - frame_010_1.label = 'Suit Secondary' - frame_010_1.location = (-700.0, -5080.0) - frame_010_1.name = 'Frame.010' - frame_010_1.use_custom_color = True - - frame_001_1 = test_group.nodes.new('NodeFrame') - frame_001_1.color = (0.25, 0.0, 0.0) - frame_001_1.label = 'Worn Armor Primary' - frame_001_1.location = (-660.0, 300.0) - frame_001_1.name = 'Frame.001' - frame_001_1.use_custom_color = True - - frame_004_1 = test_group.nodes.new('NodeFrame') - frame_004_1.color = (0.0, 1.0, 0.0) - frame_004_1.label = 'Cloth Primary' - frame_004_1.location = (-680.0, -1400.0) - frame_004_1.name = 'Frame.004' - frame_004_1.use_custom_color = True - - frame_012_1 = test_group.nodes.new('NodeFrame') - frame_012_1.color = (0.0, 0.0, 0.0) - frame_012_1.label = 'DO NOT TOUCH! DO NOT TOUCH! DO NOT TOUCH! DO NOT TOUCH!' - frame_012_1.location = (2800.0, -1140.0) - frame_012_1.name = 'Frame.012' - frame_012_1.use_custom_color = True - - reroute_114_1 = test_group.nodes.new('NodeReroute') - reroute_114_1.parent = test_group.nodes.get('Frame.008') - reroute_114_1.location = (300.0, -100.0) - - reroute_116_1 = test_group.nodes.new('NodeReroute') - reroute_116_1.parent = test_group.nodes.get('Frame.008') - reroute_116_1.location = (300.0, -180.0) - - reroute_113_1 = test_group.nodes.new('NodeReroute') - reroute_113_1.parent = test_group.nodes.get('Frame.008') - reroute_113_1.location = (300.0, -60.0) - - reroute_115_1 = test_group.nodes.new('NodeReroute') - reroute_115_1.parent = test_group.nodes.get('Frame.008') - reroute_115_1.location = (300.0, -140.0) - - reroute_118_1 = test_group.nodes.new('NodeReroute') - reroute_118_1.parent = test_group.nodes.get('Frame.008') - reroute_118_1.location = (300.0, -240.0) - - reroute_112_1 = test_group.nodes.new('NodeReroute') - reroute_112_1.parent = test_group.nodes.get('Frame.008') - reroute_112_1.location = (300.0, -20.0) - - reroute_104_1 = test_group.nodes.new('NodeReroute') - reroute_104_1.parent = test_group.nodes.get('Frame.007') - reroute_104_1.location = (300.0, -60.0) - - reroute_105_1 = test_group.nodes.new('NodeReroute') - reroute_105_1.parent = test_group.nodes.get('Frame.007') - reroute_105_1.location = (300.0, -100.0) - - reroute_106_1 = test_group.nodes.new('NodeReroute') - reroute_106_1.parent = test_group.nodes.get('Frame.007') - reroute_106_1.location = (300.0, -140.0) - - reroute_107_1 = test_group.nodes.new('NodeReroute') - reroute_107_1.parent = test_group.nodes.get('Frame.007') - reroute_107_1.location = (300.0, -180.0) - - reroute_197_1 = test_group.nodes.new('NodeReroute') - reroute_197_1.parent = test_group.nodes.get('Frame.011') - reroute_197_1.location = (320.0, -120.0) + bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap1"), check_existing=False) + DetailDiffuse01 = bpy.data.images.get("DiffMap1") + DetailDiffuse01.colorspace_settings.name = "sRGB" + DetailDiffuse01.alpha_mode = "CHANNEL_PACKED" + armor_primary_detail_diffuse_map.image = DetailDiffuse01 + + armor_primary_detail_normal_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + armor_primary_detail_normal_map.label = "Detail Normal Map" + armor_primary_detail_normal_map.use_custom_color = True + armor_primary_detail_normal_map.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_detail_normal_map.interpolation = 'Linear' + armor_primary_detail_normal_map.projection = 'FLAT' + armor_primary_detail_normal_map.extension = 'REPEAT' + armor_primary_detail_normal_map.hide = True + + bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap1"), check_existing=False) + DetailNormal01 = bpy.data.images.get("NormMap1") + DetailNormal01.colorspace_settings.name = "Non-Color" + DetailNormal01.alpha_mode = "CHANNEL_PACKED" + armor_primary_detail_normal_map.image = DetailNormal01 - reroute_196_1 = test_group.nodes.new('NodeReroute') - reroute_196_1.parent = test_group.nodes.get('Frame.011') - reroute_196_1.location = (320.0, -80.0) + cloth_primary_detail_diffuse_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + cloth_primary_detail_diffuse_map.label = "Detail Diffuse Map" + cloth_primary_detail_diffuse_map.use_custom_color = True + cloth_primary_detail_diffuse_map.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_detail_diffuse_map.interpolation = 'Linear' + cloth_primary_detail_diffuse_map.projection = 'FLAT' + cloth_primary_detail_diffuse_map.extension = 'REPEAT' + cloth_primary_detail_diffuse_map.hide = True - reroute_198_1 = test_group.nodes.new('NodeReroute') - reroute_198_1.parent = test_group.nodes.get('Frame.011') - reroute_198_1.location = (320.0, -160.0) + bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/DiffMap2"), check_existing=False) + DetailDiffuse02 = bpy.data.images.get("DiffMap2") + DetailDiffuse02.colorspace_settings.name = "sRGB" + DetailDiffuse02.alpha_mode = "CHANNEL_PACKED" + cloth_primary_detail_diffuse_map.image = DetailDiffuse02 - reroute_199_1 = test_group.nodes.new('NodeReroute') - reroute_199_1.parent = test_group.nodes.get('Frame.011') - reroute_199_1.location = (320.0, -200.0) + cloth_primary_detail_normal_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + cloth_primary_detail_normal_map.label = "Detail Normal Map" + cloth_primary_detail_normal_map.use_custom_color = True + cloth_primary_detail_normal_map.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_detail_normal_map.interpolation = 'Linear' + cloth_primary_detail_normal_map.projection = 'FLAT' + cloth_primary_detail_normal_map.extension = 'REPEAT' + cloth_primary_detail_normal_map.hide = True - reroute_290_1 = test_group.nodes.new('NodeReroute') - reroute_290_1.location = (-980.0, -360.0) + bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/NormMap2"), check_existing=False) + DetailNormal02 = bpy.data.images.get("NormMap2") + DetailNormal02.colorspace_settings.name = "Non-Color" + DetailNormal02.alpha_mode = "CHANNEL_PACKED" + cloth_primary_detail_normal_map.image = DetailNormal02 + + suit_primary_detail_diffuse_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + suit_primary_detail_diffuse_map.label = "Detail Diffuse Map" + suit_primary_detail_diffuse_map.use_custom_color = True + suit_primary_detail_diffuse_map.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_detail_diffuse_map.interpolation = 'Linear' + suit_primary_detail_diffuse_map.projection = 'FLAT' + suit_primary_detail_diffuse_map.extension = 'REPEAT' + suit_primary_detail_diffuse_map.hide = True - reroute_288_1 = test_group.nodes.new('NodeReroute') - reroute_288_1.location = (-980.0, 200.0) + bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap3"), check_existing=False) + DetailDiffuse03 = bpy.data.images.get("DiffMap3") + DetailDiffuse03.colorspace_settings.name = "sRGB" + DetailDiffuse03.alpha_mode = "CHANNEL_PACKED" + suit_primary_detail_diffuse_map.image = DetailDiffuse03 - reroute_291_1 = test_group.nodes.new('NodeReroute') - reroute_291_1.location = (-920.0, -160.0) + suit_primary_detail_normal_map = Shader_Preset.nodes.new("ShaderNodeTexImage") + suit_primary_detail_normal_map.label = "Detail Normal Map" + suit_primary_detail_normal_map.use_custom_color = True + suit_primary_detail_normal_map.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_detail_normal_map.interpolation = 'Linear' + suit_primary_detail_normal_map.projection = 'FLAT' + suit_primary_detail_normal_map.extension = 'REPEAT' + suit_primary_detail_normal_map.hide = True - reroute_289_1 = test_group.nodes.new('NodeReroute') - reroute_289_1.location = (-980.0, 860.0) + bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap3"), check_existing=False) + DetailNormal03 = bpy.data.images.get("NormMap3") + DetailNormal03.colorspace_settings.name = "Non-Color" + DetailNormal03.alpha_mode = "CHANNEL_PACKED" + suit_primary_detail_normal_map.image = DetailNormal03 - reroute_292_1 = test_group.nodes.new('NodeReroute') - reroute_292_1.location = (-920.0, 660.0) +#nodes + worn_suit_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_suit_secondary_detail_diffuse_blend.use_custom_color = True + worn_suit_secondary_detail_diffuse_blend.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_detail_diffuse_blend.hide = True + worn_suit_secondary_detail_diffuse_blend.outputs[0].default_value = wornsuitsecondarydetaildiffuseblend - reroute_293_1 = test_group.nodes.new('NodeReroute') - reroute_293_1.location = (-920.0, -560.0) + math_017 = Shader_Preset.nodes.new("ShaderNodeMath") + math_017.operation = 'MULTIPLY_ADD' + math_017.use_clamp = True - reroute_295_1 = test_group.nodes.new('NodeReroute') - reroute_295_1.location = (-1720.0, -200.0) + math_017.inputs[1].default_value = 100000.0 - reroute_296_1 = test_group.nodes.new('NodeReroute') - reroute_296_1.location = (-1720.0, 140.0) + math_017.inputs[2].default_value = -99999.0 - reroute_300_1 = test_group.nodes.new('NodeReroute') - reroute_300_1.location = (-1720.0, -2500.0) + suit_detail_diffuse_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + suit_detail_diffuse_transform.label = "Detail Diffuse Transform" + suit_detail_diffuse_transform.use_custom_color = True + suit_detail_diffuse_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + suit_detail_diffuse_transform.vector_type = 'POINT' + suit_detail_diffuse_transform.inputs[2].hide = True + suit_detail_diffuse_transform.inputs[1].default_value = suitdetaildiffuseposition + suit_detail_diffuse_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + suit_detail_diffuse_transform.inputs[3].default_value = suitdetaildiffusescale - reroute_299_1 = test_group.nodes.new('NodeReroute') - reroute_299_1.location = (-1720.0, -2340.0) + reroute_004 = Shader_Preset.nodes.new("NodeReroute") + reroute_057 = Shader_Preset.nodes.new("NodeReroute") - reroute_298_1 = test_group.nodes.new('NodeReroute') - reroute_298_1.location = (-1720.0, -2680.0) + mix_047 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_301_1 = test_group.nodes.new('NodeReroute') - reroute_301_1.location = (-1720.0, -4820.0) + suit_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_roughness_remap_w.label = "Roughness Remap W" + suit_primary_roughness_remap_w.use_custom_color = True + suit_primary_roughness_remap_w.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_roughness_remap_w.hide = True + suit_primary_roughness_remap_w.outputs[0].default_value = suitprimaryroughnessremapW - reroute_302_1 = test_group.nodes.new('NodeReroute') - reroute_302_1.location = (-1720.0, -5160.0) + reroute_003 = Shader_Preset.nodes.new("NodeReroute") - uv_map_1 = test_group.nodes.new('ShaderNodeUVMap') - uv_map_1.label = 'Detail UVs' - uv_map_1.location = (-2320.0, -2460.0) - uv_map_1.use_custom_color = False - uv_map_1.uv_map = 'uv1' + armor_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + armor_secondary_detail_roughness_blend.use_custom_color = True + armor_secondary_detail_roughness_blend.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_detail_roughness_blend.hide = True + armor_secondary_detail_roughness_blend.outputs[0].default_value = armorsecondarydetailroughnessblend - reroute_103_1 = test_group.nodes.new('NodeReroute') - reroute_103_1.parent = test_group.nodes.get('Frame.007') - reroute_103_1.location = (300.0, -20.0) + reroute_152 = Shader_Preset.nodes.new("NodeReroute") - reroute_195_1 = test_group.nodes.new('NodeReroute') - reroute_195_1.parent = test_group.nodes.get('Frame.011') - reroute_195_1.location = (320.0, -40.0) + reroute_053 = Shader_Preset.nodes.new("NodeReroute") - reroute_320_1 = test_group.nodes.new('NodeReroute') - reroute_320_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_320_1.location = (-920.0, -2640.0) + worn_suit_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_roughness_remap_z.label = "Roughness Remap Z" + worn_suit_primary_roughness_remap_z.use_custom_color = True + worn_suit_primary_roughness_remap_z.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_roughness_remap_z.hide = True + worn_suit_primary_roughness_remap_z.outputs[0].default_value = wornsuitprimaryroughnessremapZ - reroute_322_1 = test_group.nodes.new('NodeReroute') - reroute_322_1.location = (-920.0, -3040.0) + math_008 = Shader_Preset.nodes.new("ShaderNodeMath") + math_008.operation = 'MULTIPLY_ADD' - reroute_323_1 = test_group.nodes.new('NodeReroute') - reroute_323_1.location = (-980.0, -1620.0) + math_008.inputs[1].default_value = 1000.0 - reroute_319_1 = test_group.nodes.new('NodeReroute') - reroute_319_1.location = (-980.0, -2280.0) + math_008.inputs[2].default_value = -666.0 - reroute_324_1 = test_group.nodes.new('NodeReroute') - reroute_324_1.location = (-980.0, -2840.0) + reroute_190 = Shader_Preset.nodes.new("NodeReroute") - reroute_321_1 = test_group.nodes.new('NodeReroute') - reroute_321_1.location = (-920.0, -1820.0) + combine_xyz_016 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") - reroute_325_1 = test_group.nodes.new('NodeReroute') - reroute_325_1.location = (-920.0, -5120.0) + reroute_032 = Shader_Preset.nodes.new("NodeReroute") - reroute_328_1 = test_group.nodes.new('NodeReroute') - reroute_328_1.location = (-980.0, -4760.0) + mix_023 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_330_1 = test_group.nodes.new('NodeReroute') - reroute_330_1.location = (-920.0, -4300.0) + #node Suit Primary Wear Remap Z + suit_primary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_wear_remap_z.label = "Wear Remap Z" + suit_primary_wear_remap_z.use_custom_color = True + suit_primary_wear_remap_z.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_wear_remap_z.hide = True + suit_primary_wear_remap_z.outputs[0].default_value = suitprimarywearremapZ - reroute_326_1 = test_group.nodes.new('NodeReroute') - reroute_326_1.location = (-920.0, -5520.0) + worn_armor_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_roughness_remap_w.label = "Roughness Remap W" + worn_armor_secondary_roughness_remap_w.use_custom_color = True + worn_armor_secondary_roughness_remap_w.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_roughness_remap_w.hide = True + worn_armor_secondary_roughness_remap_w.outputs[0].default_value = wornarmorsecondaryroughnessremapW - reroute_329_1 = test_group.nodes.new('NodeReroute') - reroute_329_1.location = (-980.0, -5320.0) + reroute_162 = Shader_Preset.nodes.new("NodeReroute") - reroute_327_1 = test_group.nodes.new('NodeReroute') - reroute_327_1.location = (-980.0, -4100.0) + worn_cloth_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_cloth_primary_dye_color.label = "Dye Color" + worn_cloth_primary_dye_color.use_custom_color = True + worn_cloth_primary_dye_color.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_dye_color.hide = True + worn_cloth_primary_dye_color.outputs[0].default_value = wornclothprimarydyecolor - reroute_119_1 = test_group.nodes.new('NodeReroute') - reroute_119_1.parent = test_group.nodes.get('Frame.008') - reroute_119_1.location = (300.0, -260.0) + group_input = Shader_Preset.nodes.new("NodeGroupInput") - reroute_120_1 = test_group.nodes.new('NodeReroute') - reroute_120_1.parent = test_group.nodes.get('Frame.008') - reroute_120_1.location = (300.0, -300.0) + mix_065 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_121_1 = test_group.nodes.new('NodeReroute') - reroute_121_1.parent = test_group.nodes.get('Frame.008') - reroute_121_1.location = (300.0, -340.0) + mix_065.inputs[2].default_value = (4.0, 4.0, 4.0, 1.0) - reroute_122_1 = test_group.nodes.new('NodeReroute') - reroute_122_1.parent = test_group.nodes.get('Frame.008') - reroute_122_1.location = (300.0, -380.0) + reroute_023 = Shader_Preset.nodes.new("NodeReroute") - reroute_111_1 = test_group.nodes.new('NodeReroute') - reroute_111_1.parent = test_group.nodes.get('Frame.007') - reroute_111_1.location = (300.0, -340.0) + combine_xyz_017 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") - reroute_127_1 = test_group.nodes.new('NodeReroute') - reroute_127_1.parent = test_group.nodes.get('Frame.008') - reroute_127_1.location = (300.0, -580.0) + worn_suit_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_roughness_remap_w.label = "Roughness Remap W" + worn_suit_secondary_roughness_remap_w.use_custom_color = True + worn_suit_secondary_roughness_remap_w.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_roughness_remap_w.hide = True + worn_suit_secondary_roughness_remap_w.outputs[0].default_value = wornsuitsecondaryroughnessremapW - reroute_203_1 = test_group.nodes.new('NodeReroute') - reroute_203_1.parent = test_group.nodes.get('Frame.011') - reroute_203_1.location = (320.0, -360.0) + reroute_158 = Shader_Preset.nodes.new("NodeReroute") - reroute_123_1 = test_group.nodes.new('NodeReroute') - reroute_123_1.parent = test_group.nodes.get('Frame.008') - reroute_123_1.location = (300.0, -460.0) + suit_primary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_iridescence.label = "Iridescence" + suit_primary_iridescence.use_custom_color = True + suit_primary_iridescence.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_iridescence.hide = True + suit_primary_iridescence.outputs[0].default_value = suitprimaryiridescence - reroute_125_1 = test_group.nodes.new('NodeReroute') - reroute_125_1.parent = test_group.nodes.get('Frame.008') - reroute_125_1.location = (300.0, -500.0) + mix_005 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_126_1 = test_group.nodes.new('NodeReroute') - reroute_126_1.parent = test_group.nodes.get('Frame.008') - reroute_126_1.location = (300.0, -540.0) + math_010 = Shader_Preset.nodes.new("ShaderNodeMath") + math_010.operation = 'MULTIPLY' + math_010.inputs[2].default_value = -500.0 - reroute_117_1 = test_group.nodes.new('NodeReroute') - reroute_117_1.parent = test_group.nodes.get('Frame.008') - reroute_117_1.location = (300.0, -220.0) + reroute_196 = Shader_Preset.nodes.new("NodeReroute") - reroute_124_1 = test_group.nodes.new('NodeReroute') - reroute_124_1.parent = test_group.nodes.get('Frame.008') - reroute_124_1.location = (300.0, -420.0) + reroute_026 = Shader_Preset.nodes.new("NodeReroute") - reroute_128_1 = test_group.nodes.new('NodeReroute') - reroute_128_1.parent = test_group.nodes.get('Frame.008') - reroute_128_1.location = (300.0, -620.0) + mix_049 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_367_1 = test_group.nodes.new('NodeReroute') - reroute_367_1.parent = test_group.nodes.get('Frame.008') - reroute_367_1.location = (300.0, -660.0) + math_024 = Shader_Preset.nodes.new("ShaderNodeMath") + math_024.operation = 'MULTIPLY' + math_024.inputs[1].default_value = 0.3330000042915344 + math_024.inputs[2].default_value = 0.5 - reroute_129_1 = test_group.nodes.new('NodeReroute') - reroute_129_1.parent = test_group.nodes.get('Frame.008') - reroute_129_1.location = (300.0, -700.0) + reroute_168 = Shader_Preset.nodes.new("NodeReroute") - reroute_082_1 = test_group.nodes.new('NodeReroute') - reroute_082_1.parent = test_group.nodes.get('Frame.005') - reroute_082_1.location = (300.0, -220.0) + mix_028 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_078_1 = test_group.nodes.new('NodeReroute') - reroute_078_1.parent = test_group.nodes.get('Frame.005') - reroute_078_1.location = (300.0, -60.0) + math_015 = Shader_Preset.nodes.new("ShaderNodeMath") + math_015.operation = 'MULTIPLY_ADD' + math_015.use_clamp = True - reroute_079_1 = test_group.nodes.new('NodeReroute') - reroute_079_1.parent = test_group.nodes.get('Frame.005') - reroute_079_1.location = (300.0, -100.0) + math_015.inputs[1].default_value = 1000000.0 - reroute_077_1 = test_group.nodes.new('NodeReroute') - reroute_077_1.parent = test_group.nodes.get('Frame.005') - reroute_077_1.location = (300.0, -20.0) + math_015.inputs[2].default_value = -500000.0 - reroute_076_1 = test_group.nodes.new('NodeReroute') - reroute_076_1.parent = test_group.nodes.get('Frame.005') - reroute_076_1.location = (300.0, 20.0) + reroute_192 = Shader_Preset.nodes.new("NodeReroute") - reroute_075_1 = test_group.nodes.new('NodeReroute') - reroute_075_1.parent = test_group.nodes.get('Frame.005') - reroute_075_1.location = (300.0, 60.0) + reroute_076 = Shader_Preset.nodes.new("NodeReroute") - reroute_083_1 = test_group.nodes.new('NodeReroute') - reroute_083_1.parent = test_group.nodes.get('Frame.005') - reroute_083_1.location = (300.0, -260.0) + cloth_primary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_fuzz.label = "Fuzz" + cloth_primary_fuzz.use_custom_color = True + cloth_primary_fuzz.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_fuzz.hide = True + cloth_primary_fuzz.outputs[0].default_value = clothprimaryfuzz - reroute_080_1 = test_group.nodes.new('NodeReroute') - reroute_080_1.parent = test_group.nodes.get('Frame.005') - reroute_080_1.location = (300.0, -140.0) + armor_primary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_wear_remap_w.label = "Wear Remap W" + armor_primary_wear_remap_w.use_custom_color = True + armor_primary_wear_remap_w.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_wear_remap_w.hide = True + armor_primary_wear_remap_w.outputs[0].default_value = armorprimarywearremapW - reroute_081_1 = test_group.nodes.new('NodeReroute') - reroute_081_1.parent = test_group.nodes.get('Frame.005') - reroute_081_1.location = (300.0, -180.0) + mix = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_108_1 = test_group.nodes.new('NodeReroute') - reroute_108_1.parent = test_group.nodes.get('Frame.007') - reroute_108_1.location = (300.0, -220.0) + reroute_187 = Shader_Preset.nodes.new("NodeReroute") - reroute_109_1 = test_group.nodes.new('NodeReroute') - reroute_109_1.parent = test_group.nodes.get('Frame.007') - reroute_109_1.location = (300.0, -260.0) + reroute_169 = Shader_Preset.nodes.new("NodeReroute") - reroute_110_1 = test_group.nodes.new('NodeReroute') - reroute_110_1.parent = test_group.nodes.get('Frame.007') - reroute_110_1.location = (300.0, -300.0) + reroute_138 = Shader_Preset.nodes.new("NodeReroute") - reroute_200_1 = test_group.nodes.new('NodeReroute') - reroute_200_1.parent = test_group.nodes.get('Frame.011') - reroute_200_1.location = (320.0, -240.0) + reroute_071 = Shader_Preset.nodes.new("NodeReroute") - reroute_201_1 = test_group.nodes.new('NodeReroute') - reroute_201_1.parent = test_group.nodes.get('Frame.011') - reroute_201_1.location = (320.0, -280.0) + reroute_033 = Shader_Preset.nodes.new("NodeReroute") - reroute_202_1 = test_group.nodes.new('NodeReroute') - reroute_202_1.parent = test_group.nodes.get('Frame.011') - reroute_202_1.location = (320.0, -320.0) + reroute_157 = Shader_Preset.nodes.new("NodeReroute") - reroute_045_1 = test_group.nodes.new('NodeReroute') - reroute_045_1.parent = test_group.nodes.get('Frame.002') - reroute_045_1.location = (300.0, -720.0) + reroute_054 = Shader_Preset.nodes.new("NodeReroute") - reroute_364_1 = test_group.nodes.new('NodeReroute') - reroute_364_1.parent = test_group.nodes.get('Frame.002') - reroute_364_1.location = (300.0, -680.0) + mix_059 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_044_1 = test_group.nodes.new('NodeReroute') - reroute_044_1.parent = test_group.nodes.get('Frame.002') - reroute_044_1.location = (300.0, -640.0) + worn_armor_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_roughness_remap_z.label = "Roughness Remap Z" + worn_armor_secondary_roughness_remap_z.use_custom_color = True + worn_armor_secondary_roughness_remap_z.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_roughness_remap_z.hide = True + worn_armor_secondary_roughness_remap_z.outputs[0].default_value = wornarmorsecondaryroughnessremapZ - reroute_039_1 = test_group.nodes.new('NodeReroute') - reroute_039_1.parent = test_group.nodes.get('Frame.002') - reroute_039_1.location = (300.0, -440.0) + armor_secondary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_transmission.label = "Transmission" + armor_secondary_transmission.use_custom_color = True + armor_secondary_transmission.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_transmission.hide = True + armor_secondary_transmission.outputs[0].default_value = armorsecondarytransmission - reroute_033_1 = test_group.nodes.new('NodeReroute') - reroute_033_1.parent = test_group.nodes.get('Frame.002') - reroute_033_1.location = (300.0, -240.0) + reroute_141 = Shader_Preset.nodes.new("NodeReroute") - reroute_042_1 = test_group.nodes.new('NodeReroute') - reroute_042_1.parent = test_group.nodes.get('Frame.002') - reroute_042_1.location = (300.0, -560.0) + reroute_142 = Shader_Preset.nodes.new("NodeReroute") - reroute_041_1 = test_group.nodes.new('NodeReroute') - reroute_041_1.parent = test_group.nodes.get('Frame.002') - reroute_041_1.location = (300.0, -520.0) + combine_xyz_043 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") - reroute_040_1 = test_group.nodes.new('NodeReroute') - reroute_040_1.parent = test_group.nodes.get('Frame.002') - reroute_040_1.location = (300.0, -480.0) + math_001 = Shader_Preset.nodes.new("ShaderNodeMath") + math_001.operation = 'MULTIPLY_ADD' + math_001.use_clamp = True - reroute_043_1 = test_group.nodes.new('NodeReroute') - reroute_043_1.parent = test_group.nodes.get('Frame.002') - reroute_043_1.location = (300.0, -600.0) + math_001.inputs[1].default_value = 1000.0 - reroute_038_1 = test_group.nodes.new('NodeReroute') - reroute_038_1.parent = test_group.nodes.get('Frame.002') - reroute_038_1.location = (300.0, -400.0) + math_001.inputs[2].default_value = -666.0 - reroute_037_1 = test_group.nodes.new('NodeReroute') - reroute_037_1.parent = test_group.nodes.get('Frame.002') - reroute_037_1.location = (300.0, -360.0) + cloth_secondary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_fuzz.label = "Fuzz" + cloth_secondary_fuzz.use_custom_color = True + cloth_secondary_fuzz.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_fuzz.hide = True + cloth_secondary_fuzz.outputs[0].default_value = clothsecondaryfuzz - reroute_036_1 = test_group.nodes.new('NodeReroute') - reroute_036_1.parent = test_group.nodes.get('Frame.002') - reroute_036_1.location = (300.0, -320.0) + reroute_107 = Shader_Preset.nodes.new("NodeReroute") - reroute_035_1 = test_group.nodes.new('NodeReroute') - reroute_035_1.parent = test_group.nodes.get('Frame.002') - reroute_035_1.location = (300.0, -280.0) + reroute_365 = Shader_Preset.nodes.new("NodeReroute") - reroute_028_1 = test_group.nodes.new('NodeReroute') - reroute_028_1.parent = test_group.nodes.get('Frame.002') - reroute_028_1.location = (300.0, -40.0) + armor_detail_normal_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + armor_detail_normal_transform.label = "Detail Normal Transform" + armor_detail_normal_transform.use_custom_color = True + armor_detail_normal_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + armor_detail_normal_transform.vector_type = 'POINT' + armor_detail_normal_transform.inputs[2].hide = True + armor_detail_normal_transform.inputs[1].default_value = armordetailnormalposition + armor_detail_normal_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + armor_detail_normal_transform.inputs[3].default_value = armordetailnormalscale - reroute_034_1 = test_group.nodes.new('NodeReroute') - reroute_034_1.parent = test_group.nodes.get('Frame.002') - reroute_034_1.location = (300.0, -260.0) + reroute_181 = Shader_Preset.nodes.new("NodeReroute") - reroute_032_1 = test_group.nodes.new('NodeReroute') - reroute_032_1.parent = test_group.nodes.get('Frame.002') - reroute_032_1.location = (300.0, -200.0) + reroute_137 = Shader_Preset.nodes.new("NodeReroute") - reroute_031_1 = test_group.nodes.new('NodeReroute') - reroute_031_1.parent = test_group.nodes.get('Frame.002') - reroute_031_1.location = (300.0, -160.0) + reroute_020 = Shader_Preset.nodes.new("NodeReroute") - reroute_030_1 = test_group.nodes.new('NodeReroute') - reroute_030_1.parent = test_group.nodes.get('Frame.002') - reroute_030_1.location = (300.0, -120.0) + mix_056 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - reroute_029_1 = test_group.nodes.new('NodeReroute') - reroute_029_1.parent = test_group.nodes.get('Frame.002') - reroute_029_1.location = (300.0, -80.0) + reroute_102 = Shader_Preset.nodes.new("NodeReroute") - reroute_046_1 = test_group.nodes.new('NodeReroute') - reroute_046_1.parent = test_group.nodes.get('Frame.002') - reroute_046_1.location = (300.0, -760.0) + cloth_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_metalness.label = "Metalness" + cloth_secondary_metalness.use_custom_color = True + cloth_secondary_metalness.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_metalness.hide = True + cloth_secondary_metalness.outputs[0].default_value = clothsecondarymetalness - reroute_130_1 = test_group.nodes.new('NodeReroute') - reroute_130_1.parent = test_group.nodes.get('Frame.008') - reroute_130_1.location = (300.0, -740.0) + worn_armor_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_metalness.label = "Metalness" + worn_armor_secondary_metalness.use_custom_color = True + worn_armor_secondary_metalness.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_metalness.hide = True + worn_armor_secondary_metalness.outputs[0].default_value = wornarmorsecondarymetalness - reroute_010_1 = test_group.nodes.new('NodeReroute') - reroute_010_1.parent = test_group.nodes.get('Frame') - reroute_010_1.location = (280.0, 0.0) + math_012 = Shader_Preset.nodes.new("ShaderNodeMath") + math_012.operation = 'MULTIPLY' + math_012.inputs[2].default_value = -500.0 - reroute_004_1 = test_group.nodes.new('NodeReroute') - reroute_004_1.parent = test_group.nodes.get('Frame') - reroute_004_1.location = (280.0, 200.0) + separate_xyz_002 = Shader_Preset.nodes.new("ShaderNodeSeparateXYZ") - reroute_003_1 = test_group.nodes.new('NodeReroute') - reroute_003_1.parent = test_group.nodes.get('Frame') - reroute_003_1.location = (280.0, 240.0) + math_003 = Shader_Preset.nodes.new("ShaderNodeMath") + math_003.operation = 'MULTIPLY' + math_003.inputs[2].default_value = 0.5 - reroute_002_1 = test_group.nodes.new('NodeReroute') - reroute_002_1.parent = test_group.nodes.get('Frame') - reroute_002_1.location = (280.0, 280.0) + suit_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + suit_secondary_detail_roughness_blend.use_custom_color = True + suit_secondary_detail_roughness_blend.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_detail_roughness_blend.hide = True + suit_secondary_detail_roughness_blend.outputs[0].default_value = suitsecondarydetailroughnessblend - reroute_001_1 = test_group.nodes.new('NodeReroute') - reroute_001_1.parent = test_group.nodes.get('Frame') - reroute_001_1.location = (280.0, 320.0) + cloth_secondary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_wear_remap_z.label = "Wear Remap Z" + cloth_secondary_wear_remap_z.use_custom_color = True + cloth_secondary_wear_remap_z.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_wear_remap_z.hide = True + cloth_secondary_wear_remap_z.outputs[0].default_value = clothsecondarywearremapZ - reroute_006_1 = test_group.nodes.new('NodeReroute') - reroute_006_1.parent = test_group.nodes.get('Frame') - reroute_006_1.location = (280.0, 140.0) + armor_primary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_fuzz.label = "Fuzz" + armor_primary_fuzz.use_custom_color = True + armor_primary_fuzz.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_fuzz.hide = True + armor_primary_fuzz.outputs[0].default_value = armorprimaryfuzz - reroute_007_1 = test_group.nodes.new('NodeReroute') - reroute_007_1.parent = test_group.nodes.get('Frame') - reroute_007_1.location = (280.0, 120.0) - - reroute_008_1 = test_group.nodes.new('NodeReroute') - reroute_008_1.parent = test_group.nodes.get('Frame') - reroute_008_1.location = (280.0, 80.0) - - reroute_009_1 = test_group.nodes.new('NodeReroute') - reroute_009_1.parent = test_group.nodes.get('Frame') - reroute_009_1.location = (280.0, 40.0) - - reroute_012_1 = test_group.nodes.new('NodeReroute') - reroute_012_1.parent = test_group.nodes.get('Frame') - reroute_012_1.location = (280.0, -80.0) - - reroute_013_1 = test_group.nodes.new('NodeReroute') - reroute_013_1.parent = test_group.nodes.get('Frame') - reroute_013_1.location = (280.0, -120.0) - - reroute_014_1 = test_group.nodes.new('NodeReroute') - reroute_014_1.parent = test_group.nodes.get('Frame') - reroute_014_1.location = (280.0, -160.0) - - reroute_005_1 = test_group.nodes.new('NodeReroute') - reroute_005_1.parent = test_group.nodes.get('Frame') - reroute_005_1.location = (280.0, 160.0) - - reroute_011_1 = test_group.nodes.new('NodeReroute') - reroute_011_1.parent = test_group.nodes.get('Frame') - reroute_011_1.location = (280.0, -40.0) - - reroute_015_1 = test_group.nodes.new('NodeReroute') - reroute_015_1.parent = test_group.nodes.get('Frame') - reroute_015_1.location = (280.0, -200.0) - - reroute_016_1 = test_group.nodes.new('NodeReroute') - reroute_016_1.parent = test_group.nodes.get('Frame') - reroute_016_1.location = (280.0, -240.0) - - reroute_363_1 = test_group.nodes.new('NodeReroute') - reroute_363_1.parent = test_group.nodes.get('Frame') - reroute_363_1.location = (280.0, -280.0) - - reroute_017_1 = test_group.nodes.new('NodeReroute') - reroute_017_1.parent = test_group.nodes.get('Frame') - reroute_017_1.location = (280.0, -320.0) - - reroute_018_1 = test_group.nodes.new('NodeReroute') - reroute_018_1.parent = test_group.nodes.get('Frame') - reroute_018_1.location = (280.0, -360.0) - - reroute_132_1 = test_group.nodes.new('NodeReroute') - reroute_132_1.parent = test_group.nodes.get('Frame.009') - reroute_132_1.location = (300.0, -80.0) - - reroute_133_1 = test_group.nodes.new('NodeReroute') - reroute_133_1.parent = test_group.nodes.get('Frame.009') - reroute_133_1.location = (300.0, -120.0) - - reroute_134_1 = test_group.nodes.new('NodeReroute') - reroute_134_1.parent = test_group.nodes.get('Frame.009') - reroute_134_1.location = (300.0, -160.0) - - reroute_135_1 = test_group.nodes.new('NodeReroute') - reroute_135_1.parent = test_group.nodes.get('Frame.009') - reroute_135_1.location = (300.0, -200.0) - - reroute_131_1 = test_group.nodes.new('NodeReroute') - reroute_131_1.parent = test_group.nodes.get('Frame.009') - reroute_131_1.location = (300.0, -40.0) - - reroute_139_1 = test_group.nodes.new('NodeReroute') - reroute_139_1.parent = test_group.nodes.get('Frame.009') - reroute_139_1.location = (300.0, -360.0) - - reroute_136_1 = test_group.nodes.new('NodeReroute') - reroute_136_1.parent = test_group.nodes.get('Frame.009') - reroute_136_1.location = (300.0, -240.0) - - reroute_137_1 = test_group.nodes.new('NodeReroute') - reroute_137_1.parent = test_group.nodes.get('Frame.009') - reroute_137_1.location = (300.0, -280.0) - - reroute_138_1 = test_group.nodes.new('NodeReroute') - reroute_138_1.parent = test_group.nodes.get('Frame.009') - reroute_138_1.location = (300.0, -320.0) - - armor_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - armor_primary_dye_color_1.parent = test_group.nodes.get('Frame') - armor_primary_dye_color_1.label = 'Dye Color' - armor_primary_dye_color_1.location = (0.0, 360.0) - armor_primary_dye_color_1.hide = True - - armor_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame') - armor_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - armor_primary_detail_diffuse_blend_1.location = (0.0, -80.0) - armor_primary_detail_diffuse_blend_1.hide = True - - armor_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame') - armor_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - armor_primary_detail_normal_blend_1.location = (0.0, -120.0) - armor_primary_detail_normal_blend_1.hide = True - - armor_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame') - armor_primary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - armor_primary_detail_roughness_blend_1.location = (0.0, -160.0) - armor_primary_detail_roughness_blend_1.hide = True - - armor_secondary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - armor_secondary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - armor_secondary_detail_diffuse_map_1.location = (20.0, -240.0) - armor_secondary_detail_diffuse_map_1.hide = True - - armor_secondary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - armor_secondary_detail_normal_map_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_detail_normal_map_1.label = 'Detail Normal Map' - armor_secondary_detail_normal_map_1.location = (20.0, -440.0) - armor_secondary_detail_normal_map_1.hide = True - - armor_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - armor_secondary_detail_diffuse_blend_1.location = (20.0, -480.0) - armor_secondary_detail_diffuse_blend_1.hide = True - - armor_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - armor_secondary_detail_normal_blend_1.location = (20.0, -520.0) - armor_secondary_detail_normal_blend_1.hide = True - - armor_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - armor_secondary_detail_roughness_blend_1.location = (20.0, -560.0) - armor_secondary_detail_roughness_blend_1.hide = True - - armor_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_metalness_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_metalness_1.label = 'Metalness' - armor_secondary_metalness_1.location = (20.0, -600.0) - armor_secondary_metalness_1.hide = True - - armor_secondary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_iridescence_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_iridescence_1.label = 'Iridescence' - armor_secondary_iridescence_1.location = (20.0, -640.0) - armor_secondary_iridescence_1.hide = True - - armor_secondary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_fuzz_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_fuzz_1.label = 'Fuzz' - armor_secondary_fuzz_1.location = (20.0, -680.0) - armor_secondary_fuzz_1.hide = True - - armor_secondary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_transmission_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_transmission_1.label = 'Transmission' - armor_secondary_transmission_1.location = (20.0, -720.0) - armor_secondary_transmission_1.hide = True - - armor_secondary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - armor_secondary_emission_color_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_emission_color_1.label = 'Emission Color' - armor_secondary_emission_color_1.location = (20.0, -760.0) - armor_secondary_emission_color_1.hide = True - - reroute_048_1 = test_group.nodes.new('NodeReroute') - reroute_048_1.parent = test_group.nodes.get('Frame.003') - reroute_048_1.location = (-1300.0, 360.0) - - reroute_049_1 = test_group.nodes.new('NodeReroute') - reroute_049_1.parent = test_group.nodes.get('Frame.003') - reroute_049_1.location = (-1300.0, 320.0) - - reroute_050_1 = test_group.nodes.new('NodeReroute') - reroute_050_1.parent = test_group.nodes.get('Frame.003') - reroute_050_1.location = (-1300.0, 280.0) - - reroute_051_1 = test_group.nodes.new('NodeReroute') - reroute_051_1.parent = test_group.nodes.get('Frame.003') - reroute_051_1.location = (-1300.0, 240.0) - - reroute_047_1 = test_group.nodes.new('NodeReroute') - reroute_047_1.parent = test_group.nodes.get('Frame.003') - reroute_047_1.location = (-1300.0, 400.0) - - reroute_055_1 = test_group.nodes.new('NodeReroute') - reroute_055_1.parent = test_group.nodes.get('Frame.003') - reroute_055_1.location = (-1300.0, 80.0) - - reroute_052_1 = test_group.nodes.new('NodeReroute') - reroute_052_1.parent = test_group.nodes.get('Frame.003') - reroute_052_1.location = (-1300.0, 200.0) - - reroute_053_1 = test_group.nodes.new('NodeReroute') - reroute_053_1.parent = test_group.nodes.get('Frame.003') - reroute_053_1.location = (-1300.0, 160.0) - - reroute_054_1 = test_group.nodes.new('NodeReroute') - reroute_054_1.parent = test_group.nodes.get('Frame.003') - reroute_054_1.location = (-1300.0, 120.0) - - worn_armor_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_armor_secondary_detail_diffuse_blend_1.location = (-1580.0, 200.0) - worn_armor_secondary_detail_diffuse_blend_1.hide = True - - worn_armor_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_armor_secondary_detail_normal_blend_1.location = (-1580.0, 160.0) - worn_armor_secondary_detail_normal_blend_1.hide = True - - worn_armor_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - worn_armor_secondary_detail_roughness_blend_1.location = (-1580.0, 120.0) - worn_armor_secondary_detail_roughness_blend_1.hide = True - - armor_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - armor_secondary_dye_color_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_dye_color_1.label = 'Dye Color' - armor_secondary_dye_color_1.location = (20.0, -40.0) - armor_secondary_dye_color_1.hide = True - - worn_armor_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_metalness_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_metalness_1.label = 'Metalness' - worn_armor_secondary_metalness_1.location = (-1580.0, 80.0) - worn_armor_secondary_metalness_1.hide = True - - worn_armor_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_armor_secondary_dye_color_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_dye_color_1.label = 'Dye Color' - worn_armor_secondary_dye_color_1.location = (-1580.0, 400.0) - worn_armor_secondary_dye_color_1.hide = True - - worn_cloth_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_cloth_primary_dye_color_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_dye_color_1.label = 'Dye Color' - worn_cloth_primary_dye_color_1.location = (20.0, 60.0) - worn_cloth_primary_dye_color_1.hide = True - - worn_cloth_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_cloth_primary_detail_diffuse_blend_1.location = (20.0, -140.0) - worn_cloth_primary_detail_diffuse_blend_1.hide = True - - worn_cloth_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_cloth_primary_detail_normal_blend_1.location = (20.0, -180.0) - worn_cloth_primary_detail_normal_blend_1.hide = True - - worn_cloth_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - worn_cloth_primary_detail_roughness_blend_1.location = (20.0, -220.0) - worn_cloth_primary_detail_roughness_blend_1.hide = True - - worn_cloth_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_metalness_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_metalness_1.label = 'Metalness' - worn_cloth_primary_metalness_1.location = (20.0, -260.0) - worn_cloth_primary_metalness_1.hide = True - - armor_detail_normal_transform_1 = test_group.nodes.new('ShaderNodeMapping') - armor_detail_normal_transform_1.label = 'Detail Normal Transform' - armor_detail_normal_transform_1.location = (-1200.0, -120.0) - armor_detail_normal_transform_1.vector_type = 'POINT' - - cloth_detail_diffuse_transform_1 = test_group.nodes.new('ShaderNodeMapping') - cloth_detail_diffuse_transform_1.label = 'Detail Diffuse Transform' - cloth_detail_diffuse_transform_1.location = (-1200.0, -2240.0) - cloth_detail_diffuse_transform_1.vector_type = 'POINT' - - suit_detail_diffuse_transform_1 = test_group.nodes.new('ShaderNodeMapping') - suit_detail_diffuse_transform_1.label = 'Detail Diffuse Transform' - suit_detail_diffuse_transform_1.location = (-1200.0, -4720.0) - suit_detail_diffuse_transform_1.vector_type = 'POINT' - - suit_detail_normal_transform_1 = test_group.nodes.new('ShaderNodeMapping') - suit_detail_normal_transform_1.label = 'Detail Normal Transform' - suit_detail_normal_transform_1.location = (-1200.0, -5080.0) - suit_detail_normal_transform_1.vector_type = 'POINT' - - cloth_detail_normal_transform_1 = test_group.nodes.new('ShaderNodeMapping') - cloth_detail_normal_transform_1.label = 'Detail Normal Transform' - cloth_detail_normal_transform_1.location = (-1200.0, -2600.0) - cloth_detail_normal_transform_1.vector_type = 'POINT' - - reroute_086_1 = test_group.nodes.new('NodeReroute') - reroute_086_1.parent = test_group.nodes.get('Frame.006') - reroute_086_1.location = (300.0, -100.0) - - reroute_088_1 = test_group.nodes.new('NodeReroute') - reroute_088_1.parent = test_group.nodes.get('Frame.006') - reroute_088_1.location = (300.0, -180.0) - - reroute_085_1 = test_group.nodes.new('NodeReroute') - reroute_085_1.parent = test_group.nodes.get('Frame.006') - reroute_085_1.location = (300.0, -60.0) - - reroute_087_1 = test_group.nodes.new('NodeReroute') - reroute_087_1.parent = test_group.nodes.get('Frame.006') - reroute_087_1.location = (300.0, -140.0) - - reroute_090_1 = test_group.nodes.new('NodeReroute') - reroute_090_1.parent = test_group.nodes.get('Frame.006') - reroute_090_1.location = (300.0, -240.0) - - reroute_084_1 = test_group.nodes.new('NodeReroute') - reroute_084_1.parent = test_group.nodes.get('Frame.006') - reroute_084_1.location = (300.0, -20.0) - - reroute_091_1 = test_group.nodes.new('NodeReroute') - reroute_091_1.parent = test_group.nodes.get('Frame.006') - reroute_091_1.location = (300.0, -260.0) - - reroute_092_1 = test_group.nodes.new('NodeReroute') - reroute_092_1.parent = test_group.nodes.get('Frame.006') - reroute_092_1.location = (300.0, -300.0) - - reroute_093_1 = test_group.nodes.new('NodeReroute') - reroute_093_1.parent = test_group.nodes.get('Frame.006') - reroute_093_1.location = (300.0, -340.0) - - reroute_094_1 = test_group.nodes.new('NodeReroute') - reroute_094_1.parent = test_group.nodes.get('Frame.006') - reroute_094_1.location = (300.0, -380.0) - - reroute_099_1 = test_group.nodes.new('NodeReroute') - reroute_099_1.parent = test_group.nodes.get('Frame.006') - reroute_099_1.location = (300.0, -580.0) - - reroute_095_1 = test_group.nodes.new('NodeReroute') - reroute_095_1.parent = test_group.nodes.get('Frame.006') - reroute_095_1.location = (300.0, -460.0) - - reroute_097_1 = test_group.nodes.new('NodeReroute') - reroute_097_1.parent = test_group.nodes.get('Frame.006') - reroute_097_1.location = (300.0, -500.0) - - reroute_098_1 = test_group.nodes.new('NodeReroute') - reroute_098_1.parent = test_group.nodes.get('Frame.006') - reroute_098_1.location = (300.0, -540.0) - - reroute_089_1 = test_group.nodes.new('NodeReroute') - reroute_089_1.parent = test_group.nodes.get('Frame.006') - reroute_089_1.location = (300.0, -220.0) - - reroute_096_1 = test_group.nodes.new('NodeReroute') - reroute_096_1.parent = test_group.nodes.get('Frame.006') - reroute_096_1.location = (300.0, -420.0) - - reroute_100_1 = test_group.nodes.new('NodeReroute') - reroute_100_1.parent = test_group.nodes.get('Frame.006') - reroute_100_1.location = (300.0, -620.0) - - reroute_366_1 = test_group.nodes.new('NodeReroute') - reroute_366_1.parent = test_group.nodes.get('Frame.006') - reroute_366_1.location = (300.0, -660.0) - - reroute_101_1 = test_group.nodes.new('NodeReroute') - reroute_101_1.parent = test_group.nodes.get('Frame.006') - reroute_101_1.location = (300.0, -700.0) - - reroute_102_1 = test_group.nodes.new('NodeReroute') - reroute_102_1.parent = test_group.nodes.get('Frame.006') - reroute_102_1.location = (300.0, -740.0) - - cloth_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - cloth_secondary_dye_color_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_dye_color_1.label = 'Dye Color' - cloth_secondary_dye_color_1.location = (20.0, -20.0) - cloth_secondary_dye_color_1.hide = True - - cloth_secondary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - cloth_secondary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - cloth_secondary_detail_diffuse_map_1.location = (20.0, -220.0) - cloth_secondary_detail_diffuse_map_1.hide = True - - cloth_secondary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - cloth_secondary_detail_normal_map_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_detail_normal_map_1.label = 'Detail Normal Map' - cloth_secondary_detail_normal_map_1.location = (20.0, -420.0) - cloth_secondary_detail_normal_map_1.hide = True - - cloth_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - cloth_secondary_detail_diffuse_blend_1.location = (20.0, -460.0) - cloth_secondary_detail_diffuse_blend_1.hide = True - - cloth_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - cloth_secondary_detail_normal_blend_1.location = (20.0, -500.0) - cloth_secondary_detail_normal_blend_1.hide = True - - cloth_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - cloth_secondary_detail_roughness_blend_1.location = (20.0, -540.0) - cloth_secondary_detail_roughness_blend_1.hide = True - - cloth_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_metalness_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_metalness_1.label = 'Metalness' - cloth_secondary_metalness_1.location = (20.0, -580.0) - cloth_secondary_metalness_1.hide = True - - cloth_secondary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_iridescence_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_iridescence_1.label = 'Iridescence' - cloth_secondary_iridescence_1.location = (20.0, -620.0) - cloth_secondary_iridescence_1.hide = True - - cloth_secondary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_fuzz_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_fuzz_1.label = 'Fuzz' - cloth_secondary_fuzz_1.location = (20.0, -660.0) - cloth_secondary_fuzz_1.hide = True - - cloth_secondary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_transmission_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_transmission_1.label = 'Transmission' - cloth_secondary_transmission_1.location = (20.0, -700.0) - cloth_secondary_transmission_1.hide = True - - cloth_secondary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - cloth_secondary_emission_color_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_emission_color_1.label = 'Emission Color' - cloth_secondary_emission_color_1.location = (20.0, -740.0) - cloth_secondary_emission_color_1.hide = True - - worn_cloth_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_cloth_secondary_dye_color_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_dye_color_1.label = 'Dye Color' - worn_cloth_secondary_dye_color_1.location = (20.0, -20.0) - worn_cloth_secondary_dye_color_1.hide = True - - worn_cloth_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_cloth_secondary_detail_diffuse_blend_1.location = (20.0, -220.0) - worn_cloth_secondary_detail_diffuse_blend_1.hide = True - - worn_cloth_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_cloth_secondary_detail_normal_blend_1.location = (20.0, -260.0) - worn_cloth_secondary_detail_normal_blend_1.hide = True - - worn_cloth_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - worn_cloth_secondary_detail_roughness_blend_1.location = (20.0, -300.0) - worn_cloth_secondary_detail_roughness_blend_1.hide = True - - worn_cloth_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_metalness_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_metalness_1.label = 'Metalness' - worn_cloth_secondary_metalness_1.location = (20.0, -340.0) - worn_cloth_secondary_metalness_1.hide = True - - suit_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - suit_primary_dye_color_1.parent = test_group.nodes.get('Frame.008') - suit_primary_dye_color_1.label = 'Dye Color' - suit_primary_dye_color_1.location = (20.0, -20.0) - suit_primary_dye_color_1.hide = True - - suit_primary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - suit_primary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame.008') - suit_primary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - suit_primary_detail_diffuse_map_1.location = (20.0, -220.0) - suit_primary_detail_diffuse_map_1.hide = True - - suit_primary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - suit_primary_detail_normal_map_1.parent = test_group.nodes.get('Frame.008') - suit_primary_detail_normal_map_1.label = 'Detail Normal Map' - suit_primary_detail_normal_map_1.location = (20.0, -420.0) - suit_primary_detail_normal_map_1.hide = True - - suit_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.008') - suit_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - suit_primary_detail_diffuse_blend_1.location = (20.0, -460.0) - suit_primary_detail_diffuse_blend_1.hide = True - - suit_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.008') - suit_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - suit_primary_detail_normal_blend_1.location = (20.0, -500.0) - suit_primary_detail_normal_blend_1.hide = True - - suit_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.008') - suit_primary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - suit_primary_detail_roughness_blend_1.location = (20.0, -540.0) - suit_primary_detail_roughness_blend_1.hide = True - - suit_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_metalness_1.parent = test_group.nodes.get('Frame.008') - suit_primary_metalness_1.label = 'Metalness' - suit_primary_metalness_1.location = (20.0, -580.0) - suit_primary_metalness_1.hide = True - - suit_primary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_iridescence_1.parent = test_group.nodes.get('Frame.008') - suit_primary_iridescence_1.label = 'Iridescence' - suit_primary_iridescence_1.location = (20.0, -620.0) - suit_primary_iridescence_1.hide = True - - suit_primary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_fuzz_1.parent = test_group.nodes.get('Frame.008') - suit_primary_fuzz_1.label = 'Fuzz' - suit_primary_fuzz_1.location = (20.0, -660.0) - suit_primary_fuzz_1.hide = True - - suit_primary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_transmission_1.parent = test_group.nodes.get('Frame.008') - suit_primary_transmission_1.label = 'Transmission' - suit_primary_transmission_1.location = (20.0, -700.0) - suit_primary_transmission_1.hide = True - - suit_primary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - suit_primary_emission_color_1.parent = test_group.nodes.get('Frame.008') - suit_primary_emission_color_1.label = 'Emission Color' - suit_primary_emission_color_1.location = (20.0, -740.0) - suit_primary_emission_color_1.hide = True - - worn_suit_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_suit_primary_dye_color_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_dye_color_1.label = 'Dye Color' - worn_suit_primary_dye_color_1.location = (20.0, -40.0) - worn_suit_primary_dye_color_1.hide = True - - worn_suit_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_suit_primary_detail_diffuse_blend_1.location = (20.0, -240.0) - worn_suit_primary_detail_diffuse_blend_1.hide = True - - worn_suit_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_suit_primary_detail_normal_blend_1.location = (20.0, -280.0) - worn_suit_primary_detail_normal_blend_1.hide = True - - worn_suit_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - worn_suit_primary_detail_roughness_blend_1.location = (20.0, -320.0) - worn_suit_primary_detail_roughness_blend_1.hide = True - - worn_suit_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_metalness_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_metalness_1.label = 'Metalness' - worn_suit_primary_metalness_1.location = (20.0, -360.0) - worn_suit_primary_metalness_1.hide = True - - reroute_180_1 = test_group.nodes.new('NodeReroute') - reroute_180_1.parent = test_group.nodes.get('Frame.010') - reroute_180_1.location = (320.0, -200.0) - - reroute_181_1 = test_group.nodes.new('NodeReroute') - reroute_181_1.parent = test_group.nodes.get('Frame.010') - reroute_181_1.location = (320.0, -160.0) - - reroute_177_1 = test_group.nodes.new('NodeReroute') - reroute_177_1.parent = test_group.nodes.get('Frame.010') - reroute_177_1.location = (320.0, -80.0) - - reroute_182_1 = test_group.nodes.new('NodeReroute') - reroute_182_1.parent = test_group.nodes.get('Frame.010') - reroute_182_1.location = (320.0, -120.0) - - reroute_178_1 = test_group.nodes.new('NodeReroute') - reroute_178_1.parent = test_group.nodes.get('Frame.010') - reroute_178_1.location = (320.0, -260.0) - - reroute_176_1 = test_group.nodes.new('NodeReroute') - reroute_176_1.parent = test_group.nodes.get('Frame.010') - reroute_176_1.location = (320.0, -40.0) - - reroute_183_1 = test_group.nodes.new('NodeReroute') - reroute_183_1.parent = test_group.nodes.get('Frame.010') - reroute_183_1.location = (320.0, -280.0) - - reroute_184_1 = test_group.nodes.new('NodeReroute') - reroute_184_1.parent = test_group.nodes.get('Frame.010') - reroute_184_1.location = (320.0, -320.0) - - reroute_185_1 = test_group.nodes.new('NodeReroute') - reroute_185_1.parent = test_group.nodes.get('Frame.010') - reroute_185_1.location = (320.0, -360.0) - - reroute_186_1 = test_group.nodes.new('NodeReroute') - reroute_186_1.parent = test_group.nodes.get('Frame.010') - reroute_186_1.location = (320.0, -400.0) - - reroute_190_1 = test_group.nodes.new('NodeReroute') - reroute_190_1.parent = test_group.nodes.get('Frame.010') - reroute_190_1.location = (320.0, -600.0) - - reroute_187_1 = test_group.nodes.new('NodeReroute') - reroute_187_1.parent = test_group.nodes.get('Frame.010') - reroute_187_1.location = (320.0, -480.0) - - reroute_188_1 = test_group.nodes.new('NodeReroute') - reroute_188_1.parent = test_group.nodes.get('Frame.010') - reroute_188_1.location = (320.0, -520.0) - - reroute_189_1 = test_group.nodes.new('NodeReroute') - reroute_189_1.parent = test_group.nodes.get('Frame.010') - reroute_189_1.location = (320.0, -560.0) - - reroute_179_1 = test_group.nodes.new('NodeReroute') - reroute_179_1.parent = test_group.nodes.get('Frame.010') - reroute_179_1.location = (320.0, -240.0) - - reroute_194_1 = test_group.nodes.new('NodeReroute') - reroute_194_1.parent = test_group.nodes.get('Frame.010') - reroute_194_1.location = (320.0, -440.0) - - reroute_191_1 = test_group.nodes.new('NodeReroute') - reroute_191_1.parent = test_group.nodes.get('Frame.010') - reroute_191_1.location = (320.0, -640.0) - - reroute_368_1 = test_group.nodes.new('NodeReroute') - reroute_368_1.parent = test_group.nodes.get('Frame.010') - reroute_368_1.location = (320.0, -680.0) - - reroute_192_1 = test_group.nodes.new('NodeReroute') - reroute_192_1.parent = test_group.nodes.get('Frame.010') - reroute_192_1.location = (320.0, -720.0) - - reroute_193_1 = test_group.nodes.new('NodeReroute') - reroute_193_1.parent = test_group.nodes.get('Frame.010') - reroute_193_1.location = (320.0, -760.0) - - suit_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - suit_secondary_dye_color_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_dye_color_1.hide = True - suit_secondary_dye_color_1.label = 'Dye Color' - suit_secondary_dye_color_1.location = (40.0, -40.0) - suit_secondary_dye_color_1.name = 'Suit Secondary Dye Color' - suit_secondary_dye_color_1.width = 140.0 - - suit_secondary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - suit_secondary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_detail_diffuse_map_1.hide = True - suit_secondary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - suit_secondary_detail_diffuse_map_1.location = (40.0, -240.0) - suit_secondary_detail_diffuse_map_1.name = 'Suit Secondary Detail Diffuse Map' - - suit_secondary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - suit_secondary_detail_normal_map_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_detail_normal_map_1.hide = True - suit_secondary_detail_normal_map_1.label = 'Detail Normal Map' - suit_secondary_detail_normal_map_1.location = (40.0, -440.0) - suit_secondary_detail_normal_map_1.name = 'Suit Secondary Detail Normal Map' - - suit_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_detail_diffuse_blend_1.hide = True - suit_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - suit_secondary_detail_diffuse_blend_1.location = (40.0, -480.0) - suit_secondary_detail_diffuse_blend_1.name = 'Suit Secondary Detail Diffuse Blend' - suit_secondary_detail_diffuse_blend_1.width = 140.0 - - suit_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_detail_normal_blend_1.hide = True - suit_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - suit_secondary_detail_normal_blend_1.location = (40.0, -520.0) - suit_secondary_detail_normal_blend_1.name = 'Suit Secondary Detail Normal Blend' - suit_secondary_detail_normal_blend_1.width = 140.0 - - suit_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_detail_roughness_blend_1.hide = True - suit_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - suit_secondary_detail_roughness_blend_1.location = (40.0, -560.0) - suit_secondary_detail_roughness_blend_1.name = 'Suit Secondary Detail Roughness Blend' - suit_secondary_detail_roughness_blend_1.width = 140.0 - - suit_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_metalness_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_metalness_1.hide = True - suit_secondary_metalness_1.label = 'Metalness' - suit_secondary_metalness_1.location = (40.0, -600.0) - suit_secondary_metalness_1.name = 'Suit Secondary Metalness' - suit_secondary_metalness_1.width = 140.0 - - suit_secondary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_iridescence_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_iridescence_1.hide = True - suit_secondary_iridescence_1.label = 'Iridescence' - suit_secondary_iridescence_1.location = (40.0, -640.0) - suit_secondary_iridescence_1.name = 'Suit Secondary Iridescence' - suit_secondary_iridescence_1.width = 140.0 - - suit_secondary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_fuzz_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_fuzz_1.hide = True - suit_secondary_fuzz_1.label = 'Fuzz' - suit_secondary_fuzz_1.location = (40.0, -680.0) - suit_secondary_fuzz_1.name = 'Suit Secondary Fuzz' - suit_secondary_fuzz_1.width = 140.0 - - suit_secondary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_transmission_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_transmission_1.hide = True - suit_secondary_transmission_1.label = 'Transmission' - suit_secondary_transmission_1.location = (40.0, -720.0) - suit_secondary_transmission_1.name = 'Suit Secondary Transmission' - suit_secondary_transmission_1.width = 140.0 - - suit_secondary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - suit_secondary_emission_color_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_emission_color_1.hide = True - suit_secondary_emission_color_1.label = 'Emission Color' - suit_secondary_emission_color_1.location = (40.0, -760.0) - suit_secondary_emission_color_1.name = 'Suit Secondary Emission Color' - suit_secondary_emission_color_1.width = 140.0 - - worn_suit_secondary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_suit_secondary_dye_color_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_dye_color_1.hide = True - worn_suit_secondary_dye_color_1.label = 'Dye Color' - worn_suit_secondary_dye_color_1.location = (40.0, -40.0) - worn_suit_secondary_dye_color_1.name = 'Worn Suit Secondary Dye Color' - worn_suit_secondary_dye_color_1.width = 140.0 - - worn_suit_secondary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_detail_diffuse_blend_1.hide = True - worn_suit_secondary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_suit_secondary_detail_diffuse_blend_1.location = (40.0, -240.0) - worn_suit_secondary_detail_diffuse_blend_1.name = 'Worn Suit Secondary Detail Diffuse Blend' - worn_suit_secondary_detail_diffuse_blend_1.width = 140.0 - - worn_suit_secondary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_detail_normal_blend_1.hide = True - worn_suit_secondary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_suit_secondary_detail_normal_blend_1.location = (40.0, -280.0) - worn_suit_secondary_detail_normal_blend_1.name = 'Worn Suit Secondary Detail Normal Blend' - worn_suit_secondary_detail_normal_blend_1.width = 140.0 - - worn_suit_secondary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_detail_roughness_blend_1.hide = True - worn_suit_secondary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - worn_suit_secondary_detail_roughness_blend_1.location = (40.0, -320.0) - worn_suit_secondary_detail_roughness_blend_1.name = 'Worn Suit Secondary Detail Roughness Blend' - worn_suit_secondary_detail_roughness_blend_1.width = 140.0 - - worn_suit_secondary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_metalness_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_metalness_1.hide = True - worn_suit_secondary_metalness_1.label = 'Metalness' - worn_suit_secondary_metalness_1.location = (40.0, -360.0) - worn_suit_secondary_metalness_1.name = 'Worn Suit Secondary Metalness' - worn_suit_secondary_metalness_1.width = 140.0 - - reroute_358_1 = test_group.nodes.new('NodeReroute') - reroute_358_1.location = (5525.58154296875, -4880.0) - reroute_358_1.name = 'Reroute.358' - - reroute_361_1 = test_group.nodes.new('NodeReroute') - reroute_361_1.location = (5505.58154296875, -4900.0) - reroute_361_1.name = 'Reroute.361' - - reroute_350_1 = test_group.nodes.new('NodeReroute') - reroute_350_1.location = (5705.58154296875, -4687.86279296875) - reroute_350_1.name = 'Reroute.350' - - reroute_351_1 = test_group.nodes.new('NodeReroute') - reroute_351_1.location = (5685.58154296875, -4710.0302734375) - reroute_351_1.name = 'Reroute.351' - - reroute_362_1 = test_group.nodes.new('NodeReroute') - reroute_362_1.location = (5565.58154296875, -4838.69970703125) - reroute_362_1.name = 'Reroute.362' - - reroute_357_1 = test_group.nodes.new('NodeReroute') - reroute_357_1.location = (5545.58154296875, -4858.69970703125) - reroute_357_1.name = 'Reroute.357' - - reroute_352_1 = test_group.nodes.new('NodeReroute') - reroute_352_1.location = (5665.58154296875, -4731.76416015625) - reroute_352_1.name = 'Reroute.352' - - reroute_353_1 = test_group.nodes.new('NodeReroute') - reroute_353_1.location = (5645.58154296875, -4753.064453125) - reroute_353_1.name = 'Reroute.353' - - reroute_354_1 = test_group.nodes.new('NodeReroute') - reroute_354_1.location = (5625.58154296875, -4774.36474609375) - reroute_354_1.name = 'Reroute.354' - - reroute_355_1 = test_group.nodes.new('NodeReroute') - reroute_355_1.location = (5605.58154296875, -4795.6650390625) - reroute_355_1.name = 'Reroute.355' - - reroute_356_1 = test_group.nodes.new('NodeReroute') - reroute_356_1.location = (5585.58154296875, -4817.39892578125) - reroute_356_1.name = 'Reroute.356' - - reroute_359_1 = test_group.nodes.new('NodeReroute') - reroute_359_1.location = (5485.58154296875, -4921.09521484375) - reroute_359_1.name = 'Reroute.359' - - reroute_1 = test_group.nodes.new('NodeReroute') - reroute_1.parent = test_group.nodes.get('Frame') - reroute_1.location = (280.0, 360.0) - reroute_1.name = 'Reroute' - - armor_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame') - armor_primary_roughness_remap_x_1.hide = True - armor_primary_roughness_remap_x_1.label = 'Roughness Remap_X' - armor_primary_roughness_remap_x_1.location = (0.0, 320.0) - armor_primary_roughness_remap_x_1.name = 'Armor Primary Roughness Remap X' - armor_primary_roughness_remap_x_1.width = 155.72564697265625 - - armor_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame') - armor_primary_roughness_remap_y_1.hide = True - armor_primary_roughness_remap_y_1.label = 'Roughness Remap_Y' - armor_primary_roughness_remap_y_1.location = (0.0, 280.0) - armor_primary_roughness_remap_y_1.name = 'Armor Primary Roughness Remap Y' - armor_primary_roughness_remap_y_1.width = 156.39605712890625 - - armor_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame') - armor_primary_roughness_remap_z_1.hide = True - armor_primary_roughness_remap_z_1.label = 'Roughness Remap_Z' - armor_primary_roughness_remap_z_1.location = (0.0, 240.0) - armor_primary_roughness_remap_z_1.name = 'Armor Primary Roughness Remap Z' - armor_primary_roughness_remap_z_1.width = 156.48974609375 - - armor_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame') - armor_primary_roughness_remap_w_1.hide = True - armor_primary_roughness_remap_w_1.label = 'Roughness Remap_W' - armor_primary_roughness_remap_w_1.location = (0.0, 200.0) - armor_primary_roughness_remap_w_1.name = 'Armor Primary Roughness Remap W' - armor_primary_roughness_remap_w_1.width = 156.45462036132812 - - reroute_338_1 = test_group.nodes.new('NodeReroute') - reroute_338_1.location = (5685.58154296875, -529.1972045898438) - reroute_338_1.name = 'Reroute.338' - - reroute_339_1 = test_group.nodes.new('NodeReroute') - reroute_339_1.location = (5665.58154296875, -729.1972045898438) - reroute_339_1.name = 'Reroute.339' - - reroute_340_1 = test_group.nodes.new('NodeReroute') - reroute_340_1.location = (5645.58154296875, -883.0657348632812) - reroute_340_1.name = 'Reroute.340' - - reroute_341_1 = test_group.nodes.new('NodeReroute') - reroute_341_1.location = (5625.58154296875, -1087.1534423828125) - reroute_341_1.name = 'Reroute.341' - - reroute_342_1 = test_group.nodes.new('NodeReroute') - reroute_342_1.location = (5605.58154296875, -1243.0657958984375) - reroute_342_1.name = 'Reroute.342' - - reroute_343_1 = test_group.nodes.new('NodeReroute') - reroute_343_1.location = (5585.58154296875, -1397.3006591796875) - reroute_343_1.name = 'Reroute.343' - - reroute_349_1 = test_group.nodes.new('NodeReroute') - reroute_349_1.location = (5565.58154296875, -2085.12109375) - reroute_349_1.name = 'Reroute.349' - - reroute_344_1 = test_group.nodes.new('NodeReroute') - reroute_344_1.location = (5545.58154296875, -2238.7197265625) - reroute_344_1.name = 'Reroute.344' - - reroute_345_1 = test_group.nodes.new('NodeReroute') - reroute_345_1.location = (5525.58154296875, -2531.7158203125) - reroute_345_1.name = 'Reroute.345' - - reroute_346_1 = test_group.nodes.new('NodeReroute') - reroute_346_1.location = (5485.58154296875, -3417.283447265625) - reroute_346_1.name = 'Reroute.346' - - reroute_348_1 = test_group.nodes.new('NodeReroute') - reroute_348_1.location = (5505.58154296875, -5003.7490234375) - reroute_348_1.name = 'Reroute.348' - - reroute_360_1 = test_group.nodes.new('NodeReroute') - reroute_360_1.location = (5465.58154296875, -4942.73828125) - reroute_360_1.name = 'Reroute.360' - - reroute_347_1 = test_group.nodes.new('NodeReroute') - reroute_347_1.location = (5465.58154296875, -6454.30517578125) - reroute_347_1.name = 'Reroute.347' - - armor_primary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_wear_remap_x_1.parent = test_group.nodes.get('Frame') - armor_primary_wear_remap_x_1.hide = True - armor_primary_wear_remap_x_1.label = 'Wear Remap X' - armor_primary_wear_remap_x_1.location = (0.888427734375, 121.0198974609375) - armor_primary_wear_remap_x_1.name = 'Armor Primary Wear Remap X' - armor_primary_wear_remap_x_1.width = 154.7330322265625 - - armor_primary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_wear_remap_y_1.parent = test_group.nodes.get('Frame') - armor_primary_wear_remap_y_1.hide = True - armor_primary_wear_remap_y_1.label = 'Wear Remap Y' - armor_primary_wear_remap_y_1.location = (0.888427734375, 81.0198974609375) - armor_primary_wear_remap_y_1.name = 'Armor Primary Wear Remap Y' - armor_primary_wear_remap_y_1.width = 154.73309326171875 - - armor_primary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_wear_remap_z_1.parent = test_group.nodes.get('Frame') - armor_primary_wear_remap_z_1.hide = True - armor_primary_wear_remap_z_1.label = 'Wear Remap Z' - armor_primary_wear_remap_z_1.location = (0.888427734375, 41.0198974609375) - armor_primary_wear_remap_z_1.name = 'Armor Primary Wear Remap Z' - armor_primary_wear_remap_z_1.width = 155.59967041015625 - - armor_primary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_wear_remap_w_1.parent = test_group.nodes.get('Frame') - armor_primary_wear_remap_w_1.hide = True - armor_primary_wear_remap_w_1.label = 'Wear Remap W' - armor_primary_wear_remap_w_1.location = (0.888427734375, 1.0198974609375) - armor_primary_wear_remap_w_1.name = 'Armor Primary Wear Remap W' - armor_primary_wear_remap_w_1.width = 155.1663818359375 - - armor_detail_diffuse_transform_1 = test_group.nodes.new('ShaderNodeMapping') - armor_detail_diffuse_transform_1.label = 'Detail Diffuse Transform' - armor_detail_diffuse_transform_1.location = (-1200.0, 240.0) - armor_detail_diffuse_transform_1.name = 'Armor Detail Diffuse Transform' - - armor_primary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - armor_primary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame') - armor_primary_detail_diffuse_map_1.hide = True - armor_primary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - armor_primary_detail_diffuse_map_1.location = (0.0, 160.0) - armor_primary_detail_diffuse_map_1.name = 'Armor Primary Detail Diffuse Map' - - reroute_337_1 = test_group.nodes.new('NodeReroute') - reroute_337_1.location = (5705.58154296875, -346.1314697265625) - reroute_337_1.name = 'Reroute.337' - - armor_primary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - armor_primary_detail_normal_map_1.parent = test_group.nodes.get('Frame') - armor_primary_detail_normal_map_1.hide = True - armor_primary_detail_normal_map_1.label = 'Detail Normal Map' - armor_primary_detail_normal_map_1.location = (0.0, -40.0) - armor_primary_detail_normal_map_1.name = 'Armor Primary Detail Normal Map' - - group_output_1 = test_group.nodes.new('NodeGroupOutput') - group_output_1.is_active_output = True - group_output_1.location = (5805.58154296875, -4656.068359375) - group_output_1.name = 'Group Output' - - armor_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_metalness_1.parent = test_group.nodes.get('Frame') - armor_primary_metalness_1.hide = True - armor_primary_metalness_1.label = 'Metalness' - armor_primary_metalness_1.location = (0.0, -200.0) - armor_primary_metalness_1.name = 'Armor Primary Metalness' - armor_primary_metalness_1.width = 140.0 - - armor_primary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_iridescence_1.parent = test_group.nodes.get('Frame') - armor_primary_iridescence_1.hide = True - armor_primary_iridescence_1.label = 'Iridescence' - armor_primary_iridescence_1.location = (0.0, -240.0) - armor_primary_iridescence_1.name = 'Armor Primary Iridescence' - armor_primary_iridescence_1.width = 140.0 - - armor_primary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_fuzz_1.parent = test_group.nodes.get('Frame') - armor_primary_fuzz_1.hide = True - armor_primary_fuzz_1.label = 'Fuzz' - armor_primary_fuzz_1.location = (0.0, -280.0) - armor_primary_fuzz_1.name = 'Armor Primary Fuzz' - armor_primary_fuzz_1.width = 140.0 - - armor_primary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - armor_primary_transmission_1.parent = test_group.nodes.get('Frame') - armor_primary_transmission_1.hide = True - armor_primary_transmission_1.label = 'Transmission' - armor_primary_transmission_1.location = (0.0, -320.0) - armor_primary_transmission_1.name = 'Armor Primary Transmission' - armor_primary_transmission_1.width = 140.0 - - armor_primary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - armor_primary_emission_color_1.parent = test_group.nodes.get('Frame') - armor_primary_emission_color_1.hide = True - armor_primary_emission_color_1.label = 'Emission Color' - armor_primary_emission_color_1.location = (0.0, -360.0) - armor_primary_emission_color_1.name = 'Armor Primary Emission Color' - armor_primary_emission_color_1.width = 140.0 - - reroute_022_1 = test_group.nodes.new('NodeReroute') - reroute_022_1.parent = test_group.nodes.get('Frame.001') - reroute_022_1.location = (280.0, -160.0) - reroute_022_1.name = 'Reroute.022' - - reroute_021_1 = test_group.nodes.new('NodeReroute') - reroute_021_1.parent = test_group.nodes.get('Frame.001') - reroute_021_1.location = (280.0, -120.0) - reroute_021_1.name = 'Reroute.021' - - reroute_020_1 = test_group.nodes.new('NodeReroute') - reroute_020_1.parent = test_group.nodes.get('Frame.001') - reroute_020_1.location = (280.0, -80.0) - reroute_020_1.name = 'Reroute.020' - - reroute_023_1 = test_group.nodes.new('NodeReroute') - reroute_023_1.parent = test_group.nodes.get('Frame.001') - reroute_023_1.location = (280.0, -200.0) - reroute_023_1.name = 'Reroute.023' - - reroute_019_1 = test_group.nodes.new('NodeReroute') - reroute_019_1.parent = test_group.nodes.get('Frame.001') - reroute_019_1.location = (280.0, -40.0) - reroute_019_1.name = 'Reroute.019' - - reroute_024_1 = test_group.nodes.new('NodeReroute') - reroute_024_1.parent = test_group.nodes.get('Frame.001') - reroute_024_1.location = (280.0, -240.0) - reroute_024_1.name = 'Reroute.024' - - reroute_025_1 = test_group.nodes.new('NodeReroute') - reroute_025_1.parent = test_group.nodes.get('Frame.001') - reroute_025_1.location = (280.0, -280.0) - reroute_025_1.name = 'Reroute.025' - - reroute_026_1 = test_group.nodes.new('NodeReroute') - reroute_026_1.parent = test_group.nodes.get('Frame.001') - reroute_026_1.location = (280.0, -320.0) - reroute_026_1.name = 'Reroute.026' - - reroute_027_1 = test_group.nodes.new('NodeReroute') - reroute_027_1.parent = test_group.nodes.get('Frame.001') - reroute_027_1.location = (280.0, -360.0) - reroute_027_1.name = 'Reroute.027' - - worn_armor_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_detail_diffuse_blend_1.hide = True - worn_armor_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - worn_armor_primary_detail_diffuse_blend_1.location = (0.0, -240.0) - worn_armor_primary_detail_diffuse_blend_1.name = 'Worn Armor Primary Detail Diffuse Blend' - worn_armor_primary_detail_diffuse_blend_1.width = 140.0 - - worn_armor_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_detail_normal_blend_1.hide = True - worn_armor_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - worn_armor_primary_detail_normal_blend_1.location = (0.0, -280.0) - worn_armor_primary_detail_normal_blend_1.name = 'Worn Armor Primary Detail Normal Blend' - worn_armor_primary_detail_normal_blend_1.width = 140.0 - - worn_armor_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_detail_roughness_blend_1.hide = True - worn_armor_primary_detail_roughness_blend_1.label = 'Worn Armor Primary Detail Roughness Blend' - worn_armor_primary_detail_roughness_blend_1.location = (0.0, -320.0) - worn_armor_primary_detail_roughness_blend_1.name = 'Value.097' - worn_armor_primary_detail_roughness_blend_1.width = 140.0 - - worn_armor_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_metalness_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_metalness_1.hide = True - worn_armor_primary_metalness_1.label = 'Metalness' - worn_armor_primary_metalness_1.location = (0.0, -360.0) - worn_armor_primary_metalness_1.name = 'Worn Armor Primary Metalness' - worn_armor_primary_metalness_1.width = 140.0 - - worn_armor_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - worn_armor_primary_dye_color_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_dye_color_1.hide = True - worn_armor_primary_dye_color_1.label = 'Dye Color' - worn_armor_primary_dye_color_1.location = (0.0, -40.0) - worn_armor_primary_dye_color_1.name = 'Worn Armor Primary Dye Color' - worn_armor_primary_dye_color_1.width = 140.0 - - worn_armor_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_roughness_remap_x_1.hide = True - worn_armor_primary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_armor_primary_roughness_remap_x_1.location = (0.0, -80.0) - worn_armor_primary_roughness_remap_x_1.name = 'Worn Armor Primary Roughness Remap X' - worn_armor_primary_roughness_remap_x_1.width = 155.01483154296875 - - worn_armor_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_roughness_remap_y_1.hide = True - worn_armor_primary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_armor_primary_roughness_remap_y_1.location = (0.0, -120.0) - worn_armor_primary_roughness_remap_y_1.name = 'Worn Armor Primary Roughness Remap Y' - worn_armor_primary_roughness_remap_y_1.width = 155.46978759765625 - - worn_armor_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_roughness_remap_z_1.hide = True - worn_armor_primary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_armor_primary_roughness_remap_z_1.location = (0.0, -160.0) - worn_armor_primary_roughness_remap_z_1.name = 'Worn Armor Primary Roughness Remap Z' - worn_armor_primary_roughness_remap_z_1.width = 155.92486572265625 - - worn_armor_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.001') - worn_armor_primary_roughness_remap_w_1.hide = True - worn_armor_primary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_armor_primary_roughness_remap_w_1.location = (0.0, -200.0) - worn_armor_primary_roughness_remap_w_1.name = 'Worn Armor Primary Roughness Remap W' - worn_armor_primary_roughness_remap_w_1.width = 156.83477783203125 - - armor_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_roughness_remap_x_1.hide = True - armor_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - armor_secondary_roughness_remap_x_1.location = (20.0, -80.0) - armor_secondary_roughness_remap_x_1.name = 'Armor Secondary Roughness Remap X' - armor_secondary_roughness_remap_x_1.width = 156.03314208984375 - - armor_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_roughness_remap_y_1.hide = True - armor_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - armor_secondary_roughness_remap_y_1.location = (20.0, -120.0) - armor_secondary_roughness_remap_y_1.name = 'Armor Secondary Roughness Remap Y' - armor_secondary_roughness_remap_y_1.width = 155.599853515625 - - armor_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_roughness_remap_z_1.hide = True - armor_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - armor_secondary_roughness_remap_z_1.location = (20.0, -160.0) - armor_secondary_roughness_remap_z_1.name = 'Armor Secondary Roughness Remap Z' - armor_secondary_roughness_remap_z_1.width = 156.8997802734375 - - armor_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_roughness_remap_w_1.hide = True - armor_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - armor_secondary_roughness_remap_w_1.location = (20.0, -200.0) - armor_secondary_roughness_remap_w_1.name = 'Armor Secondary Roughness Remap W' - armor_secondary_roughness_remap_w_1.width = 155.599853515625 - - armor_secondary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_wear_remap_x_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_wear_remap_x_1.hide = True - armor_secondary_wear_remap_x_1.label = 'Wear Remap X' - armor_secondary_wear_remap_x_1.location = (20.0, -280.0) - armor_secondary_wear_remap_x_1.name = 'Armor Secondary Wear Remap X' - armor_secondary_wear_remap_x_1.width = 156.46649169921875 - - armor_secondary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_wear_remap_y_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_wear_remap_y_1.hide = True - armor_secondary_wear_remap_y_1.label = 'Wear Remap Y' - armor_secondary_wear_remap_y_1.location = (20.0, -320.0) - armor_secondary_wear_remap_y_1.name = 'Armor Secondary Wear Remap Y' - armor_secondary_wear_remap_y_1.width = 156.03314208984375 - - armor_secondary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_wear_remap_z_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_wear_remap_z_1.hide = True - armor_secondary_wear_remap_z_1.label = 'Wear Remap Z' - armor_secondary_wear_remap_z_1.location = (20.0, -360.0) - armor_secondary_wear_remap_z_1.name = 'Armor Secondary Wear Remap Z' - armor_secondary_wear_remap_z_1.width = 156.03314208984375 - - armor_secondary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - armor_secondary_wear_remap_w_1.parent = test_group.nodes.get('Frame.002') - armor_secondary_wear_remap_w_1.hide = True - armor_secondary_wear_remap_w_1.label = 'Wear Remap W' - armor_secondary_wear_remap_w_1.location = (20.0, -400.0) - armor_secondary_wear_remap_w_1.name = 'Armor Secondary Wear Remap W' - armor_secondary_wear_remap_w_1.width = 156.033203125 - - worn_armor_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_roughness_remap_x_1.hide = True - worn_armor_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_armor_secondary_roughness_remap_x_1.location = (-1580.0, 360.0) - worn_armor_secondary_roughness_remap_x_1.name = 'Worn Armor Secondary Roughness Remap X' - worn_armor_secondary_roughness_remap_x_1.width = 155.16650390625 - - worn_armor_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_roughness_remap_y_1.hide = True - worn_armor_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_armor_secondary_roughness_remap_y_1.location = (-1580.0, 320.0) - worn_armor_secondary_roughness_remap_y_1.name = 'Worn Armor Secondary Roughness Remap Y' - worn_armor_secondary_roughness_remap_y_1.width = 155.599853515625 - - worn_armor_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_roughness_remap_z_1.hide = True - worn_armor_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_armor_secondary_roughness_remap_z_1.location = (-1580.0, 280.0) - worn_armor_secondary_roughness_remap_z_1.name = 'Worn Armor Secondary Roughness Remap Z' - worn_armor_secondary_roughness_remap_z_1.width = 156.03314208984375 - - worn_armor_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_armor_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.003') - worn_armor_secondary_roughness_remap_w_1.hide = True - worn_armor_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_armor_secondary_roughness_remap_w_1.location = (-1580.0, 240.0) - worn_armor_secondary_roughness_remap_w_1.name = 'Worn Armor Secondary Roughness Remap W' - worn_armor_secondary_roughness_remap_w_1.width = 156.46646118164062 - - reroute_067_1 = test_group.nodes.new('NodeReroute') - reroute_067_1.parent = test_group.nodes.get('Frame.004') - reroute_067_1.location = (300.0, -400.0) - reroute_067_1.name = 'Reroute.067' - - reroute_058_1 = test_group.nodes.new('NodeReroute') - reroute_058_1.parent = test_group.nodes.get('Frame.004') - reroute_058_1.location = (300.0, -80.0) - reroute_058_1.name = 'Reroute.058' - - reroute_060_1 = test_group.nodes.new('NodeReroute') - reroute_060_1.parent = test_group.nodes.get('Frame.004') - reroute_060_1.location = (300.0, -160.0) - reroute_060_1.name = 'Reroute.060' - - reroute_057_1 = test_group.nodes.new('NodeReroute') - reroute_057_1.parent = test_group.nodes.get('Frame.004') - reroute_057_1.location = (300.0, -40.0) - reroute_057_1.name = 'Reroute.057' - - reroute_059_1 = test_group.nodes.new('NodeReroute') - reroute_059_1.parent = test_group.nodes.get('Frame.004') - reroute_059_1.location = (300.0, -120.0) - reroute_059_1.name = 'Reroute.059' - - reroute_062_1 = test_group.nodes.new('NodeReroute') - reroute_062_1.parent = test_group.nodes.get('Frame.004') - reroute_062_1.location = (300.0, -220.0) - reroute_062_1.name = 'Reroute.062' - - reroute_056_1 = test_group.nodes.new('NodeReroute') - reroute_056_1.parent = test_group.nodes.get('Frame.004') - reroute_056_1.location = (300.0, 0.0) - reroute_056_1.name = 'Reroute.056' - - reroute_063_1 = test_group.nodes.new('NodeReroute') - reroute_063_1.parent = test_group.nodes.get('Frame.004') - reroute_063_1.location = (300.0, -240.0) - reroute_063_1.name = 'Reroute.063' - - reroute_064_1 = test_group.nodes.new('NodeReroute') - reroute_064_1.parent = test_group.nodes.get('Frame.004') - reroute_064_1.location = (300.0, -280.0) - reroute_064_1.name = 'Reroute.064' - - reroute_065_1 = test_group.nodes.new('NodeReroute') - reroute_065_1.parent = test_group.nodes.get('Frame.004') - reroute_065_1.location = (300.0, -320.0) - reroute_065_1.name = 'Reroute.065' - - reroute_066_1 = test_group.nodes.new('NodeReroute') - reroute_066_1.parent = test_group.nodes.get('Frame.004') - reroute_066_1.location = (300.0, -360.0) - reroute_066_1.name = 'Reroute.066' - - reroute_071_1 = test_group.nodes.new('NodeReroute') - reroute_071_1.parent = test_group.nodes.get('Frame.004') - reroute_071_1.location = (300.0, -560.0) - reroute_071_1.name = 'Reroute.071' - - reroute_068_1 = test_group.nodes.new('NodeReroute') - reroute_068_1.parent = test_group.nodes.get('Frame.004') - reroute_068_1.location = (300.0, -440.0) - reroute_068_1.name = 'Reroute.068' - - reroute_069_1 = test_group.nodes.new('NodeReroute') - reroute_069_1.parent = test_group.nodes.get('Frame.004') - reroute_069_1.location = (300.0, -480.0) - reroute_069_1.name = 'Reroute.069' - - reroute_070_1 = test_group.nodes.new('NodeReroute') - reroute_070_1.parent = test_group.nodes.get('Frame.004') - reroute_070_1.location = (300.0, -520.0) - reroute_070_1.name = 'Reroute.070' - - reroute_061_1 = test_group.nodes.new('NodeReroute') - reroute_061_1.parent = test_group.nodes.get('Frame.004') - reroute_061_1.location = (300.0, -200.0) - reroute_061_1.name = 'Reroute.061' - - reroute_072_1 = test_group.nodes.new('NodeReroute') - reroute_072_1.parent = test_group.nodes.get('Frame.004') - reroute_072_1.location = (300.0, -600.0) - reroute_072_1.name = 'Reroute.072' - - reroute_365_1 = test_group.nodes.new('NodeReroute') - reroute_365_1.parent = test_group.nodes.get('Frame.004') - reroute_365_1.location = (300.0, -640.0) - reroute_365_1.name = 'Reroute.365' - - reroute_073_1 = test_group.nodes.new('NodeReroute') - reroute_073_1.parent = test_group.nodes.get('Frame.004') - reroute_073_1.location = (300.0, -680.0) - reroute_073_1.name = 'Reroute.073' - - reroute_074_1 = test_group.nodes.new('NodeReroute') - reroute_074_1.parent = test_group.nodes.get('Frame.004') - reroute_074_1.location = (300.0, -720.0) - reroute_074_1.name = 'Reroute.074' - - cloth_primary_dye_color_1 = test_group.nodes.new('ShaderNodeRGB') - cloth_primary_dye_color_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_dye_color_1.hide = True - cloth_primary_dye_color_1.label = 'Dye Color' - cloth_primary_dye_color_1.location = (20.0, 0.0) - cloth_primary_dye_color_1.name = 'Cloth Primary Dye Color' - cloth_primary_dye_color_1.width = 140.0 - - cloth_primary_detail_diffuse_map_1 = test_group.nodes.new('ShaderNodeTexImage') - cloth_primary_detail_diffuse_map_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_detail_diffuse_map_1.hide = True - cloth_primary_detail_diffuse_map_1.label = 'Detail Diffuse Map' - cloth_primary_detail_diffuse_map_1.location = (20.0, -200.0) - cloth_primary_detail_diffuse_map_1.name = 'Cloth Primary Detail Diffuse Map' - - cloth_primary_detail_normal_map_1 = test_group.nodes.new('ShaderNodeTexImage') - cloth_primary_detail_normal_map_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_detail_normal_map_1.hide = True - cloth_primary_detail_normal_map_1.label = 'Detail Normal Map' - cloth_primary_detail_normal_map_1.location = (20.0, -400.0) - cloth_primary_detail_normal_map_1.name = 'Cloth Primary Detail Normal Map' - - cloth_primary_detail_diffuse_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_detail_diffuse_blend_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_detail_diffuse_blend_1.hide = True - cloth_primary_detail_diffuse_blend_1.label = 'Detail Diffuse Blend' - cloth_primary_detail_diffuse_blend_1.location = (20.0, -440.0) - cloth_primary_detail_diffuse_blend_1.name = 'Cloth Primary Detail Diffuse Blend' - cloth_primary_detail_diffuse_blend_1.width = 140.0 - - cloth_primary_detail_normal_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_detail_normal_blend_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_detail_normal_blend_1.hide = True - cloth_primary_detail_normal_blend_1.label = 'Detail Normal Blend' - cloth_primary_detail_normal_blend_1.location = (20.0, -480.0) - cloth_primary_detail_normal_blend_1.name = 'Cloth Primary Detail Normal Blend' - cloth_primary_detail_normal_blend_1.width = 140.0 - - cloth_primary_detail_roughness_blend_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_detail_roughness_blend_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_detail_roughness_blend_1.hide = True - cloth_primary_detail_roughness_blend_1.label = 'Detail Roughness Blend' - cloth_primary_detail_roughness_blend_1.location = (20.0, -520.0) - cloth_primary_detail_roughness_blend_1.name = 'Cloth Primary Detail Roughness Blend' - cloth_primary_detail_roughness_blend_1.width = 140.0 - - cloth_primary_metalness_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_metalness_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_metalness_1.hide = True - cloth_primary_metalness_1.label = 'Metalness' - cloth_primary_metalness_1.location = (20.0, -560.0) - cloth_primary_metalness_1.name = 'Cloth Primary Metalness' - cloth_primary_metalness_1.width = 140.0 - - cloth_primary_iridescence_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_iridescence_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_iridescence_1.hide = True - cloth_primary_iridescence_1.label = 'Iridescence' - cloth_primary_iridescence_1.location = (20.0, -600.0) - cloth_primary_iridescence_1.name = 'Cloth Primary Iridescence' - cloth_primary_iridescence_1.width = 140.0 - - cloth_primary_fuzz_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_fuzz_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_fuzz_1.hide = True - cloth_primary_fuzz_1.label = 'Fuzz' - cloth_primary_fuzz_1.location = (20.0, -640.0) - cloth_primary_fuzz_1.name = 'Cloth Primary Fuzz' - cloth_primary_fuzz_1.width = 140.0 - - cloth_primary_transmission_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_transmission_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_transmission_1.hide = True - cloth_primary_transmission_1.label = 'Transmission' - cloth_primary_transmission_1.location = (20.0, -680.0) - cloth_primary_transmission_1.name = 'Cloth Primary Transmission' - cloth_primary_transmission_1.width = 140.0 - - cloth_primary_emission_color_1 = test_group.nodes.new('ShaderNodeRGB') - cloth_primary_emission_color_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_emission_color_1.hide = True - cloth_primary_emission_color_1.label = 'Emission Color' - cloth_primary_emission_color_1.location = (20.0, -720.0) - cloth_primary_emission_color_1.name = 'Cloth Primary Emission Color' - cloth_primary_emission_color_1.width = 140.0 - - cloth_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_roughness_remap_x_1.hide = True - cloth_primary_roughness_remap_x_1.label = 'Roughness Remap X' - cloth_primary_roughness_remap_x_1.location = (20.0, -40.0) - cloth_primary_roughness_remap_x_1.name = 'Cloth Primary Roughness Remap X' - cloth_primary_roughness_remap_x_1.width = 155.92779541015625 - - cloth_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_roughness_remap_y_1.hide = True - cloth_primary_roughness_remap_y_1.label = 'Roughness Remap Y' - cloth_primary_roughness_remap_y_1.location = (20.0, -80.0) - cloth_primary_roughness_remap_y_1.name = 'Cloth Primary Roughness Remap Y' - cloth_primary_roughness_remap_y_1.width = 156.39620971679688 - - cloth_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_roughness_remap_z_1.hide = True - cloth_primary_roughness_remap_z_1.label = 'Roughness Remap Z' - cloth_primary_roughness_remap_z_1.location = (20.0, -120.0) - cloth_primary_roughness_remap_z_1.name = 'Cloth Primary Roughness Remap Z' - cloth_primary_roughness_remap_z_1.width = 156.86474609375 - - cloth_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_roughness_remap_w_1.hide = True - cloth_primary_roughness_remap_w_1.label = 'Roughness Remap W' - cloth_primary_roughness_remap_w_1.location = (20.0, -160.0) - cloth_primary_roughness_remap_w_1.name = 'Cloth Primary Roughness Remap W' - cloth_primary_roughness_remap_w_1.width = 155.45928955078125 - - cloth_primary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_wear_remap_x_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_wear_remap_x_1.hide = True - cloth_primary_wear_remap_x_1.label = 'Wear Remap X' - cloth_primary_wear_remap_x_1.location = (20.0, -240.0) - cloth_primary_wear_remap_x_1.name = 'Cloth Primary Wear Remap X' - cloth_primary_wear_remap_x_1.width = 156.4664306640625 - - cloth_primary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_wear_remap_y_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_wear_remap_y_1.hide = True - cloth_primary_wear_remap_y_1.label = 'Wear Remap Y' - cloth_primary_wear_remap_y_1.location = (20.0, -280.0) - cloth_primary_wear_remap_y_1.name = 'Cloth Primary Wear Remap Y' - cloth_primary_wear_remap_y_1.width = 155.59979248046875 - - cloth_primary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_wear_remap_z_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_wear_remap_z_1.hide = True - cloth_primary_wear_remap_z_1.label = 'Wear Remap Z' - cloth_primary_wear_remap_z_1.location = (20.0, -320.0) - cloth_primary_wear_remap_z_1.name = 'Cloth Primary Wear Remap Z' - cloth_primary_wear_remap_z_1.width = 156.4664306640625 - - cloth_primary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - cloth_primary_wear_remap_w_1.parent = test_group.nodes.get('Frame.004') - cloth_primary_wear_remap_w_1.hide = True - cloth_primary_wear_remap_w_1.label = 'Wear Remap W' - cloth_primary_wear_remap_w_1.location = (20.0, -360.0) - cloth_primary_wear_remap_w_1.name = 'Cloth Primary Wear Remap W' - cloth_primary_wear_remap_w_1.width = 155.16650390625 - - worn_cloth_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_roughness_remap_x_1.hide = True - worn_cloth_primary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_cloth_primary_roughness_remap_x_1.location = (20.0, 20.0) - worn_cloth_primary_roughness_remap_x_1.name = 'Worn Cloth Primary Roughness Remap X' - worn_cloth_primary_roughness_remap_x_1.width = 156.39630126953125 - - worn_cloth_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_roughness_remap_y_1.hide = True - worn_cloth_primary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_cloth_primary_roughness_remap_y_1.location = (20.0, -20.0) - worn_cloth_primary_roughness_remap_y_1.name = 'Worn Cloth Primary Roughness Remap Y' - worn_cloth_primary_roughness_remap_y_1.width = 156.86471557617188 - - worn_cloth_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_roughness_remap_z_1.hide = True - worn_cloth_primary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_cloth_primary_roughness_remap_z_1.location = (20.0, -60.0) - worn_cloth_primary_roughness_remap_z_1.name = 'Worn Cloth Primary Roughness Remap Z' - worn_cloth_primary_roughness_remap_z_1.width = 156.86474609375 - - worn_cloth_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.005') - worn_cloth_primary_roughness_remap_w_1.hide = True - worn_cloth_primary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_cloth_primary_roughness_remap_w_1.location = (20.0, -100.0) - worn_cloth_primary_roughness_remap_w_1.name = 'Worn Cloth Primary Roughness Remap W' - worn_cloth_primary_roughness_remap_w_1.width = 156.39630126953125 - - cloth_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_roughness_remap_x_1.hide = True - cloth_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - cloth_secondary_roughness_remap_x_1.location = (20.0, -60.0) - cloth_secondary_roughness_remap_x_1.name = 'Cloth Secondary Roughness Remap X' - cloth_secondary_roughness_remap_x_1.width = 156.86474609375 - - cloth_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_roughness_remap_y_1.hide = True - cloth_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - cloth_secondary_roughness_remap_y_1.location = (20.0, -100.0) - cloth_secondary_roughness_remap_y_1.name = 'Cloth Secondary Roughness Remap Y' - cloth_secondary_roughness_remap_y_1.width = 155.92782592773438 - - cloth_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_roughness_remap_z_1.hide = True - cloth_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - cloth_secondary_roughness_remap_z_1.location = (20.0, -140.0) - cloth_secondary_roughness_remap_z_1.name = 'Cloth Secondary Roughness Remap Z' - cloth_secondary_roughness_remap_z_1.width = 156.39630126953125 - - cloth_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_roughness_remap_w_1.hide = True - cloth_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - cloth_secondary_roughness_remap_w_1.location = (20.0, -180.0) - cloth_secondary_roughness_remap_w_1.name = 'Cloth Secondary Roughness Remap W' - cloth_secondary_roughness_remap_w_1.width = 156.39627075195312 - - cloth_secondary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_wear_remap_x_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_wear_remap_x_1.hide = True - cloth_secondary_wear_remap_x_1.label = 'Wear Remap X' - cloth_secondary_wear_remap_x_1.location = (20.0, -260.0) - cloth_secondary_wear_remap_x_1.name = 'Cloth Secondary Wear Remap X' - cloth_secondary_wear_remap_x_1.width = 156.3963623046875 - - cloth_secondary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_wear_remap_y_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_wear_remap_y_1.hide = True - cloth_secondary_wear_remap_y_1.label = 'Wear Remap Y' - cloth_secondary_wear_remap_y_1.location = (20.0, -300.0) - cloth_secondary_wear_remap_y_1.name = 'Cloth Secondary Wear Remap Y' - cloth_secondary_wear_remap_y_1.width = 155.92794799804688 - - cloth_secondary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_wear_remap_z_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_wear_remap_z_1.hide = True - cloth_secondary_wear_remap_z_1.label = 'Wear Remap Z' - cloth_secondary_wear_remap_z_1.location = (20.0, -340.0) - cloth_secondary_wear_remap_z_1.name = 'Cloth Secondary Wear Remap Z' - cloth_secondary_wear_remap_z_1.width = 155.92791748046875 - - cloth_secondary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - cloth_secondary_wear_remap_w_1.parent = test_group.nodes.get('Frame.006') - cloth_secondary_wear_remap_w_1.hide = True - cloth_secondary_wear_remap_w_1.label = 'Wear Remap W' - cloth_secondary_wear_remap_w_1.location = (20.0, -380.0) - cloth_secondary_wear_remap_w_1.name = 'Cloth Secondary Wear Remap W' - cloth_secondary_wear_remap_w_1.width = 156.39642333984375 - - worn_cloth_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_roughness_remap_x_1.hide = True - worn_cloth_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_cloth_secondary_roughness_remap_x_1.location = (20.0, -60.0) - worn_cloth_secondary_roughness_remap_x_1.name = 'Worn Cloth Secondary Roughness Remap X' - worn_cloth_secondary_roughness_remap_x_1.width = 155.599853515625 - - worn_cloth_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_roughness_remap_y_1.hide = True - worn_cloth_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_cloth_secondary_roughness_remap_y_1.location = (20.0, -100.0) - worn_cloth_secondary_roughness_remap_y_1.name = 'Worn Cloth Secondary Roughness Remap Y' - worn_cloth_secondary_roughness_remap_y_1.width = 156.46652221679688 - - worn_cloth_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_roughness_remap_z_1.hide = True - worn_cloth_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_cloth_secondary_roughness_remap_z_1.location = (20.0, -140.0) - worn_cloth_secondary_roughness_remap_z_1.name = 'Worn Cloth Secondary Roughness Remap Z' - worn_cloth_secondary_roughness_remap_z_1.width = 156.03317260742188 - - worn_cloth_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_cloth_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.007') - worn_cloth_secondary_roughness_remap_w_1.hide = True - worn_cloth_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_cloth_secondary_roughness_remap_w_1.location = (20.0, -180.0) - worn_cloth_secondary_roughness_remap_w_1.name = 'Worn Cloth Secondary Roughness Remap W' - worn_cloth_secondary_roughness_remap_w_1.width = 155.599853515625 - - suit_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.008') - suit_primary_roughness_remap_x_1.hide = True - suit_primary_roughness_remap_x_1.label = 'Roughness Remap X' - suit_primary_roughness_remap_x_1.location = (20.0, -60.0) - suit_primary_roughness_remap_x_1.name = 'Suit Primary Roughness Remap X' - suit_primary_roughness_remap_x_1.width = 156.206298828125 - - suit_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.008') - suit_primary_roughness_remap_y_1.hide = True - suit_primary_roughness_remap_y_1.label = 'Roughness Remap Y' - suit_primary_roughness_remap_y_1.location = (20.0, -100.0) - suit_primary_roughness_remap_y_1.name = 'Suit Primary Roughness Remap Y' - suit_primary_roughness_remap_y_1.width = 156.4664306640625 - - suit_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.008') - suit_primary_roughness_remap_z_1.hide = True - suit_primary_roughness_remap_z_1.label = 'Roughness Remap Z' - suit_primary_roughness_remap_z_1.location = (20.0, -140.0) - suit_primary_roughness_remap_z_1.name = 'Suit Primary Roughness Remap Z' - suit_primary_roughness_remap_z_1.width = 156.03314208984375 - - suit_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.008') - suit_primary_roughness_remap_w_1.hide = True - suit_primary_roughness_remap_w_1.label = 'Roughness Remap W' - suit_primary_roughness_remap_w_1.location = (20.0, -180.0) - suit_primary_roughness_remap_w_1.name = 'Suit Primary Roughness Remap W' - suit_primary_roughness_remap_w_1.width = 156.03314208984375 - - suit_primary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_wear_remap_x_1.parent = test_group.nodes.get('Frame.008') - suit_primary_wear_remap_x_1.hide = True - suit_primary_wear_remap_x_1.label = 'Wear Remap X' - suit_primary_wear_remap_x_1.location = (20.0, -260.0) - suit_primary_wear_remap_x_1.name = 'Suit Primary Wear Remap X' - suit_primary_wear_remap_x_1.width = 156.46649169921875 - - suit_primary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_wear_remap_y_1.parent = test_group.nodes.get('Frame.008') - suit_primary_wear_remap_y_1.hide = True - suit_primary_wear_remap_y_1.label = 'Wear Remap Y' - suit_primary_wear_remap_y_1.location = (20.0, -300.0) - suit_primary_wear_remap_y_1.name = 'Suit Primary Wear Remap Y' - suit_primary_wear_remap_y_1.width = 155.599853515625 - - suit_primary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_wear_remap_z_1.parent = test_group.nodes.get('Frame.008') - suit_primary_wear_remap_z_1.hide = True - suit_primary_wear_remap_z_1.label = 'Wear Remap Z' - suit_primary_wear_remap_z_1.location = (20.0, -340.0) - suit_primary_wear_remap_z_1.name = 'Suit Primary Wear Remap Z' - suit_primary_wear_remap_z_1.width = 156.03314208984375 - - suit_primary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - suit_primary_wear_remap_w_1.parent = test_group.nodes.get('Frame.008') - suit_primary_wear_remap_w_1.hide = True - suit_primary_wear_remap_w_1.label = 'Wear Remap W' - suit_primary_wear_remap_w_1.location = (20.0, -380.0) - suit_primary_wear_remap_w_1.name = 'Suit Primary Wear Remap W' - suit_primary_wear_remap_w_1.width = 155.59979248046875 - - worn_suit_primary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_roughness_remap_x_1.hide = True - worn_suit_primary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_suit_primary_roughness_remap_x_1.location = (20.0, -80.0) - worn_suit_primary_roughness_remap_x_1.name = 'Worn Suit Primary Roughness Remap X' - worn_suit_primary_roughness_remap_x_1.width = 156.03314208984375 - - worn_suit_primary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_roughness_remap_y_1.hide = True - worn_suit_primary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_suit_primary_roughness_remap_y_1.location = (20.0, -120.0) - worn_suit_primary_roughness_remap_y_1.name = 'Worn Suit Primary Roughness Remap Y' - worn_suit_primary_roughness_remap_y_1.width = 156.03314208984375 - - worn_suit_primary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_roughness_remap_z_1.hide = True - worn_suit_primary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_suit_primary_roughness_remap_z_1.location = (20.0, -160.0) - worn_suit_primary_roughness_remap_z_1.name = 'Worn Suit Primary Roughness Remap Z' - worn_suit_primary_roughness_remap_z_1.width = 156.03317260742188 - - worn_suit_primary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_primary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.009') - worn_suit_primary_roughness_remap_w_1.hide = True - worn_suit_primary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_suit_primary_roughness_remap_w_1.location = (20.0, -200.0) - worn_suit_primary_roughness_remap_w_1.name = 'Worn Suit Primary Roughness Remap W' - worn_suit_primary_roughness_remap_w_1.width = 155.599853515625 - - suit_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_roughness_remap_x_1.hide = True - suit_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - suit_secondary_roughness_remap_x_1.location = (40.0, -80.0) - suit_secondary_roughness_remap_x_1.name = 'Suit Secondary Roughness Remap X' - suit_secondary_roughness_remap_x_1.width = 156.46649169921875 - - suit_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_roughness_remap_y_1.hide = True - suit_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - suit_secondary_roughness_remap_y_1.location = (40.0, -120.0) - suit_secondary_roughness_remap_y_1.name = 'Suit Secondary Roughness Remap Y' - suit_secondary_roughness_remap_y_1.width = 156.89984130859375 - - suit_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_roughness_remap_z_1.hide = True - suit_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - suit_secondary_roughness_remap_z_1.location = (40.0, -160.0) - suit_secondary_roughness_remap_z_1.name = 'Suit Secondary Roughness Remap Z' - suit_secondary_roughness_remap_z_1.width = 156.89984130859375 - - suit_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_roughness_remap_w_1.hide = True - suit_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - suit_secondary_roughness_remap_w_1.location = (40.0, -200.0) - suit_secondary_roughness_remap_w_1.name = 'Suit Secondary Roughness Remap W' - suit_secondary_roughness_remap_w_1.width = 155.599853515625 - - suit_secondary_wear_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_wear_remap_x_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_wear_remap_x_1.hide = True - suit_secondary_wear_remap_x_1.label = 'Wear Remap X' - suit_secondary_wear_remap_x_1.location = (40.0, -280.0) - suit_secondary_wear_remap_x_1.name = 'Suit Secondary Wear Remap X' - suit_secondary_wear_remap_x_1.width = 156.46649169921875 - - suit_secondary_wear_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_wear_remap_y_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_wear_remap_y_1.hide = True - suit_secondary_wear_remap_y_1.label = 'Wear Remap Y' - suit_secondary_wear_remap_y_1.location = (40.0, -320.0) - suit_secondary_wear_remap_y_1.name = 'Suit Secondary Wear Remap Y' - suit_secondary_wear_remap_y_1.width = 156.46649169921875 - - suit_secondary_wear_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_wear_remap_z_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_wear_remap_z_1.hide = True - suit_secondary_wear_remap_z_1.label = 'Wear Remap Z' - suit_secondary_wear_remap_z_1.location = (40.0, -360.0) - suit_secondary_wear_remap_z_1.name = 'Suit Secondary Wear Remap Z' - suit_secondary_wear_remap_z_1.width = 156.46646118164062 - - suit_secondary_wear_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - suit_secondary_wear_remap_w_1.parent = test_group.nodes.get('Frame.010') - suit_secondary_wear_remap_w_1.hide = True - suit_secondary_wear_remap_w_1.label = 'Wear Remap W' - suit_secondary_wear_remap_w_1.location = (40.0, -400.0) - suit_secondary_wear_remap_w_1.name = 'Suit Secondary Wear Remap W' - suit_secondary_wear_remap_w_1.width = 156.8997802734375 - - worn_suit_secondary_roughness_remap_x_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_roughness_remap_x_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_roughness_remap_x_1.hide = True - worn_suit_secondary_roughness_remap_x_1.label = 'Roughness Remap X' - worn_suit_secondary_roughness_remap_x_1.location = (40.0, -80.0) - worn_suit_secondary_roughness_remap_x_1.name = 'Worn Suit Secondary Roughness Remap X' - worn_suit_secondary_roughness_remap_x_1.width = 156.466552734375 - - worn_suit_secondary_roughness_remap_y_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_roughness_remap_y_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_roughness_remap_y_1.hide = True - worn_suit_secondary_roughness_remap_y_1.label = 'Roughness Remap Y' - worn_suit_secondary_roughness_remap_y_1.location = (40.0, -120.0) - worn_suit_secondary_roughness_remap_y_1.name = 'Worn Suit Secondary Roughness Remap Y' - worn_suit_secondary_roughness_remap_y_1.width = 156.46649169921875 - - worn_suit_secondary_roughness_remap_z_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_roughness_remap_z_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_roughness_remap_z_1.hide = True - worn_suit_secondary_roughness_remap_z_1.label = 'Roughness Remap Z' - worn_suit_secondary_roughness_remap_z_1.location = (40.0, -160.0) - worn_suit_secondary_roughness_remap_z_1.name = 'Worn Suit Secondary Roughness Remap Z' - worn_suit_secondary_roughness_remap_z_1.width = 156.46649169921875 - - worn_suit_secondary_roughness_remap_w_1 = test_group.nodes.new('ShaderNodeValue') - worn_suit_secondary_roughness_remap_w_1.parent = test_group.nodes.get('Frame.011') - worn_suit_secondary_roughness_remap_w_1.hide = True - worn_suit_secondary_roughness_remap_w_1.label = 'Roughness Remap W' - worn_suit_secondary_roughness_remap_w_1.location = (40.0, -200.0) - worn_suit_secondary_roughness_remap_w_1.name = 'Worn Suit Secondary Roughness Remap W' - worn_suit_secondary_roughness_remap_w_1.width = 156.46649169921875 - - group_input_1 = test_group.nodes.new('NodeGroupInput') - group_input_1.parent = test_group.nodes.get('Frame.012') - group_input_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - group_input_1.location = (-240.0, 2840.0) - group_input_1.name = 'Group Input' - group_input_1.width = 140.0 - - math_023_1 = test_group.nodes.new('ShaderNodeMath') - math_023_1.parent = test_group.nodes.get('Frame.012') - math_023_1.label = 'DO NOT TOUCH' - math_023_1.location = (740.0, 3600.0) - math_023_1.name = 'Math.023' - math_023_1.operation = 'SUBTRACT' - math_023_1.inputs[1].default_value = 3.0 - - math_024_1 = test_group.nodes.new('ShaderNodeMath') - math_024_1.parent = test_group.nodes.get('Frame.012') - math_024_1.label = 'DO NOT TOUCH' - math_024_1.location = (960.0, 3600.0) - math_024_1.name = 'Math.024' - math_024_1.operation = 'MULTIPLY' - math_024_1.inputs[1].default_value = 0.333 - - math_022_1 = test_group.nodes.new('ShaderNodeMath') - math_022_1.parent = test_group.nodes.get('Frame.012') - math_022_1.label = 'DO NOT TOUCH' - math_022_1.location = (800.0, 3840.0) - math_022_1.name = 'Math.022' - math_022_1.operation = 'MULTIPLY' - math_022_1.inputs[1].default_value = 0.333 - - combine_rgb_1 = test_group.nodes.new('ShaderNodeCombineRGB') - combine_rgb_1.parent = test_group.nodes.get('Frame.012') - combine_rgb_1.label = 'DO NOT TOUCH' - combine_rgb_1.location = (1300.0, 3700.0) - - math_021_1 = test_group.nodes.new('ShaderNodeMath') - math_021_1.parent = test_group.nodes.get('Frame.012') - math_021_1.label = 'DO NOT TOUCH' - math_021_1.location = (500.0, 3700.0) - math_021_1.name = 'Math.021' - math_021_1.operation = 'FLOOR' - - mix_071_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_071_1.parent = test_group.nodes.get('Frame.012') - mix_071_1.label = 'DO NOT TOUCH' - mix_071_1.location = (2320.0, 2500.0) - mix_071_1.name = 'Mix.071' - - mix_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_1.parent = test_group.nodes.get('Frame.012') - mix_1.blend_type = 'MIX' - mix_1.hide = True - mix_1.label = 'DyeColorA' - mix_1.location = (2453.43701171875, 919.050048828125) - mix_1.name = 'Mix' - - mix_001_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_001_1.parent = test_group.nodes.get('Frame.012') - mix_001_1.blend_type = 'MIX' - mix_001_1.hide = True - mix_001_1.label = 'DyeColorA' - mix_001_1.location = (2453.43701171875, 889.050048828125) - mix_001_1.name = 'Mix.001' - - mix_002_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_002_1.parent = test_group.nodes.get('Frame.012') - mix_002_1.blend_type = 'MIX' - mix_002_1.hide = True - mix_002_1.label = 'DyeColorA' - mix_002_1.location = (2453.43701171875, 859.050048828125) - mix_002_1.name = 'Mix.002' - - mix_003_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_003_1.parent = test_group.nodes.get('Frame.012') - mix_003_1.blend_type = 'MIX' - mix_003_1.hide = True - mix_003_1.label = 'DyeColorA' - mix_003_1.location = (2453.43701171875, 829.050048828125) - mix_003_1.name = 'Mix.003' - - mix_004_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_004_1.parent = test_group.nodes.get('Frame.012') - mix_004_1.blend_type = 'MIX' - mix_004_1.hide = True - mix_004_1.label = 'DyeColorA' - mix_004_1.location = (2452.10791015625, 799.050048828125) - mix_004_1.name = 'Mix.004' - - reroute_154_1 = test_group.nodes.new('NodeReroute') - reroute_154_1.parent = test_group.nodes.get('Frame.012') - reroute_154_1.location = (2412.10791015625, 899.050048828125) - reroute_154_1.name = 'Reroute.154' - - reroute_153_1 = test_group.nodes.new('NodeReroute') - reroute_153_1.parent = test_group.nodes.get('Frame.012') - reroute_153_1.location = (2412.10791015625, 879.050048828125) - reroute_153_1.name = 'Reroute.153' - - reroute_155_1 = test_group.nodes.new('NodeReroute') - reroute_155_1.parent = test_group.nodes.get('Frame.012') - reroute_155_1.location = (2412.10791015625, 859.050048828125) - reroute_155_1.name = 'Reroute.155' - - reroute_156_1 = test_group.nodes.new('NodeReroute') - reroute_156_1.parent = test_group.nodes.get('Frame.012') - reroute_156_1.location = (2412.10791015625, 839.050048828125) - reroute_156_1.name = 'Reroute.156' - - reroute_157_1 = test_group.nodes.new('NodeReroute') - reroute_157_1.parent = test_group.nodes.get('Frame.012') - reroute_157_1.location = (2412.10791015625, 819.050048828125) - reroute_157_1.name = 'Reroute.157' - - reroute_152_1 = test_group.nodes.new('NodeReroute') - reroute_152_1.parent = test_group.nodes.get('Frame.012') - reroute_152_1.location = (2412.10791015625, 799.050048828125) - reroute_152_1.name = 'Reroute.152' - - reroute_206_1 = test_group.nodes.new('NodeReroute') - reroute_206_1.parent = test_group.nodes.get('Frame.012') - reroute_206_1.location = (2412.10791015625, 119.050048828125) - reroute_206_1.name = 'Reroute.206' - - reroute_211_1 = test_group.nodes.new('NodeReroute') - reroute_211_1.parent = test_group.nodes.get('Frame.012') - reroute_211_1.location = (2412.10791015625, 99.050048828125) - reroute_211_1.name = 'Reroute.211' - - reroute_207_1 = test_group.nodes.new('NodeReroute') - reroute_207_1.parent = test_group.nodes.get('Frame.012') - reroute_207_1.location = (2412.10791015625, 79.050048828125) - reroute_207_1.name = 'Reroute.207' - - reroute_208_1 = test_group.nodes.new('NodeReroute') - reroute_208_1.parent = test_group.nodes.get('Frame.012') - reroute_208_1.location = (2412.10791015625, 59.050048828125) - reroute_208_1.name = 'Reroute.208' - - reroute_209_1 = test_group.nodes.new('NodeReroute') - reroute_209_1.parent = test_group.nodes.get('Frame.012') - reroute_209_1.location = (2412.10791015625, 39.050048828125) - reroute_209_1.name = 'Reroute.209' - - reroute_210_1 = test_group.nodes.new('NodeReroute') - reroute_210_1.parent = test_group.nodes.get('Frame.012') - reroute_210_1.location = (2412.10791015625, 19.050048828125) - reroute_210_1.name = 'Reroute.210' - - reroute_229_1 = test_group.nodes.new('NodeReroute') - reroute_229_1.parent = test_group.nodes.get('Frame.012') - reroute_229_1.location = (2412.10791015625, -0.949951171875) - reroute_229_1.name = 'Reroute.229' - - reroute_225_1 = test_group.nodes.new('NodeReroute') - reroute_225_1.parent = test_group.nodes.get('Frame.012') - reroute_225_1.location = (2412.10791015625, -20.949951171875) - reroute_225_1.name = 'Reroute.225' - - reroute_226_1 = test_group.nodes.new('NodeReroute') - reroute_226_1.parent = test_group.nodes.get('Frame.012') - reroute_226_1.location = (2412.10791015625, -40.949951171875) - reroute_226_1.name = 'Reroute.226' - - reroute_227_1 = test_group.nodes.new('NodeReroute') - reroute_227_1.parent = test_group.nodes.get('Frame.012') - reroute_227_1.location = (2412.10791015625, -60.949951171875) - reroute_227_1.name = 'Reroute.227' - - reroute_224_1 = test_group.nodes.new('NodeReroute') - reroute_224_1.parent = test_group.nodes.get('Frame.012') - reroute_224_1.location = (2412.10791015625, -80.949951171875) - reroute_224_1.name = 'Reroute.224' - - reroute_228_1 = test_group.nodes.new('NodeReroute') - reroute_228_1.parent = test_group.nodes.get('Frame.012') - reroute_228_1.location = (2412.10791015625, -100.949951171875) - reroute_228_1.name = 'Reroute.228' - - reroute_245_1 = test_group.nodes.new('NodeReroute') - reroute_245_1.parent = test_group.nodes.get('Frame.012') - reroute_245_1.location = (2412.10791015625, -120.949951171875) - reroute_245_1.name = 'Reroute.245' - - reroute_244_1 = test_group.nodes.new('NodeReroute') - reroute_244_1.parent = test_group.nodes.get('Frame.012') - reroute_244_1.location = (2412.10791015625, -140.949951171875) - reroute_244_1.name = 'Reroute.244' - - reroute_243_1 = test_group.nodes.new('NodeReroute') - reroute_243_1.parent = test_group.nodes.get('Frame.012') - reroute_243_1.location = (2412.10791015625, -160.949951171875) - reroute_243_1.name = 'Reroute.243' - - reroute_242_1 = test_group.nodes.new('NodeReroute') - reroute_242_1.parent = test_group.nodes.get('Frame.012') - reroute_242_1.location = (2412.10791015625, -180.949951171875) - reroute_242_1.name = 'Reroute.242' - - reroute_246_1 = test_group.nodes.new('NodeReroute') - reroute_246_1.parent = test_group.nodes.get('Frame.012') - reroute_246_1.location = (2412.10791015625, -200.949951171875) - reroute_246_1.name = 'Reroute.246' - - reroute_247_1 = test_group.nodes.new('NodeReroute') - reroute_247_1.parent = test_group.nodes.get('Frame.012') - reroute_247_1.location = (2412.10791015625, -220.949951171875) - reroute_247_1.name = 'Reroute.247' - - reroute_307_1 = test_group.nodes.new('NodeReroute') - reroute_307_1.parent = test_group.nodes.get('Frame.012') - reroute_307_1.location = (2411.4072265625, 719.050048828125) - reroute_307_1.name = 'Reroute.307' - - reroute_308_1 = test_group.nodes.new('NodeReroute') - reroute_308_1.parent = test_group.nodes.get('Frame.012') - reroute_308_1.location = (2411.4072265625, 699.050048828125) - reroute_308_1.name = 'Reroute.308' - - mix_005_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_005_1.parent = test_group.nodes.get('Frame.012') - mix_005_1.blend_type = 'MIX' - mix_005_1.hide = True - mix_005_1.label = 'DyeColorB' - mix_005_1.location = (2453.43701171875, 739.050048828125) - mix_005_1.name = 'Mix.005' - - reroute_309_1 = test_group.nodes.new('NodeReroute') - reroute_309_1.parent = test_group.nodes.get('Frame.012') - reroute_309_1.location = (2411.4072265625, 679.050048828125) - reroute_309_1.name = 'Reroute.309' - - mix_006_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_006_1.parent = test_group.nodes.get('Frame.012') - mix_006_1.blend_type = 'MIX' - mix_006_1.hide = True - mix_006_1.label = 'DyeColorB' - mix_006_1.location = (2453.43701171875, 709.050048828125) - mix_006_1.name = 'Mix.006' - - reroute_310_1 = test_group.nodes.new('NodeReroute') - reroute_310_1.parent = test_group.nodes.get('Frame.012') - reroute_310_1.location = (2411.4072265625, 659.050048828125) - reroute_310_1.name = 'Reroute.310' - - mix_007_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_007_1.parent = test_group.nodes.get('Frame.012') - mix_007_1.blend_type = 'MIX' - mix_007_1.hide = True - mix_007_1.label = 'DyeColorB' - mix_007_1.location = (2453.43701171875, 679.050048828125) - mix_007_1.name = 'Mix.007' - - reroute_311_1 = test_group.nodes.new('NodeReroute') - reroute_311_1.parent = test_group.nodes.get('Frame.012') - reroute_311_1.location = (2411.4072265625, 639.050048828125) - reroute_311_1.name = 'Reroute.311' - - mix_008_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_008_1.parent = test_group.nodes.get('Frame.012') - mix_008_1.blend_type = 'MIX' - mix_008_1.hide = True - mix_008_1.label = 'DyeColorB' - mix_008_1.location = (2453.43701171875, 649.050048828125) - mix_008_1.name = 'Mix.008' - - reroute_312_1 = test_group.nodes.new('NodeReroute') - reroute_312_1.parent = test_group.nodes.get('Frame.012') - reroute_312_1.location = (2411.4072265625, 619.050048828125) - reroute_312_1.name = 'Reroute.312' - - mix_009_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_009_1.parent = test_group.nodes.get('Frame.012') - mix_009_1.blend_type = 'MIX' - mix_009_1.hide = True - mix_009_1.label = 'DyeColorB' - mix_009_1.location = (2453.43701171875, 619.050048828125) - mix_009_1.name = 'Mix.009' - - reroute_335_1 = test_group.nodes.new('NodeReroute') - reroute_335_1.parent = test_group.nodes.get('Frame.012') - reroute_335_1.location = (2411.4072265625, 499.050048828125) - reroute_335_1.name = 'Reroute.335' - - reroute_336_1 = test_group.nodes.new('NodeReroute') - reroute_336_1.parent = test_group.nodes.get('Frame.012') - reroute_336_1.location = (2411.4072265625, 359.050048828125) - reroute_336_1.name = 'Reroute.336' - - mix_034_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_034_1.parent = test_group.nodes.get('Frame.012') - mix_034_1.blend_type = 'MIX' - mix_034_1.hide = True - mix_034_1.label = 'GlossRemap_C' - mix_034_1.location = (2453.43701171875, -248.7454833984375) - mix_034_1.name = 'Mix.034' - - mix_032_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_032_1.parent = test_group.nodes.get('Frame.012') - mix_032_1.blend_type = 'MIX' - mix_032_1.hide = True - mix_032_1.label = 'GlossRemap_C' - mix_032_1.location = (2453.43701171875, -188.7454833984375) - mix_032_1.name = 'Mix.032' - - mix_033_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_033_1.parent = test_group.nodes.get('Frame.012') - mix_033_1.blend_type = 'MIX' - mix_033_1.hide = True - mix_033_1.label = 'GlossRemap_C' - mix_033_1.location = (2453.43701171875, -218.7454833984375) - mix_033_1.name = 'Mix.033' - - mix_025_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_025_1.parent = test_group.nodes.get('Frame.012') - mix_025_1.blend_type = 'MIX' - mix_025_1.hide = True - mix_025_1.label = 'GlossRemap_B' - mix_025_1.location = (2449.39697265625, 26.30078125) - mix_025_1.name = 'Mix.025' - - mix_026_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_026_1.parent = test_group.nodes.get('Frame.012') - mix_026_1.blend_type = 'MIX' - mix_026_1.hide = True - mix_026_1.label = 'GlossRemap_B' - mix_026_1.location = (2449.39697265625, -3.69921875) - mix_026_1.name = 'Mix.026' - - mix_027_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_027_1.parent = test_group.nodes.get('Frame.012') - mix_027_1.blend_type = 'MIX' - mix_027_1.hide = True - mix_027_1.label = 'GlossRemap_B' - mix_027_1.location = (2449.39697265625, -33.69921875) - mix_027_1.name = 'Mix.027' - - mix_028_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_028_1.parent = test_group.nodes.get('Frame.012') - mix_028_1.blend_type = 'MIX' - mix_028_1.hide = True - mix_028_1.label = 'GlossRemap_B' - mix_028_1.location = (2449.39697265625, -63.69921875) - mix_028_1.name = 'Mix.028' - - mix_029_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_029_1.parent = test_group.nodes.get('Frame.012') - mix_029_1.blend_type = 'MIX' - mix_029_1.hide = True - mix_029_1.label = 'GlossRemap_B' - mix_029_1.location = (2449.39697265625, -93.69921875) - mix_029_1.name = 'Mix.029' - - mix_021_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_021_1.parent = test_group.nodes.get('Frame.012') - mix_021_1.blend_type = 'MIX' - mix_021_1.hide = True - mix_021_1.label = 'GlossRemap_A' - mix_021_1.location = (2449.39697265625, 151.0975341796875) - mix_021_1.name = 'Mix.021' - - mix_022_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_022_1.parent = test_group.nodes.get('Frame.012') - mix_022_1.blend_type = 'MIX' - mix_022_1.hide = True - mix_022_1.label = 'GlossRemap_A' - mix_022_1.location = (2449.39697265625, 121.0975341796875) - mix_022_1.name = 'Mix.022' - - mix_023_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_023_1.parent = test_group.nodes.get('Frame.012') - mix_023_1.blend_type = 'MIX' - mix_023_1.hide = True - mix_023_1.label = 'GlossRemap_A' - mix_023_1.location = (2449.39697265625, 91.0975341796875) - mix_023_1.name = 'Mix.023' - - mix_024_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_024_1.parent = test_group.nodes.get('Frame.012') - mix_024_1.blend_type = 'MIX' - mix_024_1.hide = True - mix_024_1.label = 'GlossRemap_A' - mix_024_1.location = (2449.39697265625, 61.0975341796875) - mix_024_1.name = 'Mix.024' - - mix_030_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_030_1.parent = test_group.nodes.get('Frame.012') - mix_030_1.blend_type = 'MIX' - mix_030_1.hide = True - mix_030_1.label = 'GlossRemap_C' - mix_030_1.location = (2453.43701171875, -128.7454833984375) - mix_030_1.name = 'Mix.030' - - mix_031_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_031_1.parent = test_group.nodes.get('Frame.012') - mix_031_1.blend_type = 'MIX' - mix_031_1.hide = True - mix_031_1.label = 'GlossRemap_C' - mix_031_1.location = (2453.43701171875, -158.7454833984375) - mix_031_1.name = 'Mix.031' - - mix_020_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_020_1.parent = test_group.nodes.get('Frame.012') - mix_020_1.blend_type = 'MIX' - mix_020_1.hide = True - mix_020_1.label = 'GlossRemap_A' - mix_020_1.location = (2449.39697265625, 181.0975341796875) - mix_020_1.name = 'Mix.020' - - reroute_381_1 = test_group.nodes.new('NodeReroute') - reroute_381_1.parent = test_group.nodes.get('Frame.012') - reroute_381_1.location = (2411.4072265625, 479.050048828125) - reroute_381_1.name = 'Reroute.381' - - mix_010_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_010_1.parent = test_group.nodes.get('Frame.012') - mix_010_1.blend_type = 'MIX' - mix_010_1.hide = True - mix_010_1.label = 'Wear Remap_A' - mix_010_1.location = (2448.38623046875, 540.4315185546875) - mix_010_1.name = 'Mix.010' - - reroute_382_1 = test_group.nodes.new('NodeReroute') - reroute_382_1.parent = test_group.nodes.get('Frame.012') - reroute_382_1.location = (2411.4072265625, 459.050048828125) - reroute_382_1.name = 'Reroute.382' - - mix_011_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_011_1.parent = test_group.nodes.get('Frame.012') - mix_011_1.blend_type = 'MIX' - mix_011_1.hide = True - mix_011_1.label = 'Wear Remap_A' - mix_011_1.location = (2448.38623046875, 510.4315185546875) - mix_011_1.name = 'Mix.011' - - reroute_383_1 = test_group.nodes.new('NodeReroute') - reroute_383_1.parent = test_group.nodes.get('Frame.012') - reroute_383_1.location = (2411.4072265625, 439.050048828125) - reroute_383_1.name = 'Reroute.383' - - mix_012_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_012_1.parent = test_group.nodes.get('Frame.012') - mix_012_1.blend_type = 'MIX' - mix_012_1.hide = True - mix_012_1.label = 'Wear Remap_A' - mix_012_1.location = (2448.38623046875, 480.4315185546875) - mix_012_1.name = 'Mix.012' - - reroute_384_1 = test_group.nodes.new('NodeReroute') - reroute_384_1.parent = test_group.nodes.get('Frame.012') - reroute_384_1.location = (2411.4072265625, 419.050048828125) - reroute_384_1.name = 'Reroute.384' - - mix_013_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_013_1.parent = test_group.nodes.get('Frame.012') - mix_013_1.blend_type = 'MIX' - mix_013_1.hide = True - mix_013_1.label = 'Wear Remap_A' - mix_013_1.location = (2448.38623046875, 450.4315185546875) - mix_013_1.name = 'Mix.013' - - reroute_385_1 = test_group.nodes.new('NodeReroute') - reroute_385_1.parent = test_group.nodes.get('Frame.012') - reroute_385_1.location = (2411.4072265625, 399.050048828125) - reroute_385_1.name = 'Reroute.385' - - mix_014_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_014_1.parent = test_group.nodes.get('Frame.012') - mix_014_1.blend_type = 'MIX' - mix_014_1.hide = True - mix_014_1.label = 'Wear Remap_A' - mix_014_1.location = (2448.38623046875, 420.4315185546875) - mix_014_1.name = 'Mix.014' - - reroute_415_1 = test_group.nodes.new('NodeReroute') - reroute_415_1.parent = test_group.nodes.get('Frame.012') - reroute_415_1.location = (2411.4072265625, 339.050048828125) - reroute_415_1.name = 'Reroute.415' - - mix_015_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_015_1.parent = test_group.nodes.get('Frame.012') - mix_015_1.blend_type = 'MIX' - mix_015_1.hide = True - mix_015_1.label = 'Wear Remap_B' - mix_015_1.location = (2448.38623046875, 384.36602783203125) - mix_015_1.name = 'Mix.015' - - reroute_416_1 = test_group.nodes.new('NodeReroute') - reroute_416_1.parent = test_group.nodes.get('Frame.012') - reroute_416_1.location = (2411.4072265625, 319.050048828125) - reroute_416_1.name = 'Reroute.416' - - mix_016_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_016_1.parent = test_group.nodes.get('Frame.012') - mix_016_1.blend_type = 'MIX' - mix_016_1.hide = True - mix_016_1.label = 'Wear Remap_B' - mix_016_1.location = (2448.38623046875, 354.36602783203125) - mix_016_1.name = 'Mix.016' - - reroute_417_1 = test_group.nodes.new('NodeReroute') - reroute_417_1.parent = test_group.nodes.get('Frame.012') - reroute_417_1.location = (2411.4072265625, 299.050048828125) - reroute_417_1.name = 'Reroute.417' - - mix_017_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_017_1.parent = test_group.nodes.get('Frame.012') - mix_017_1.blend_type = 'MIX' - mix_017_1.hide = True - mix_017_1.label = 'Wear Remap_B' - mix_017_1.location = (2448.38623046875, 324.36602783203125) - mix_017_1.name = 'Mix.017' - - reroute_418_1 = test_group.nodes.new('NodeReroute') - reroute_418_1.parent = test_group.nodes.get('Frame.012') - reroute_418_1.location = (2411.4072265625, 279.050048828125) - reroute_418_1.name = 'Reroute.418' - - mix_018_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_018_1.parent = test_group.nodes.get('Frame.012') - mix_018_1.blend_type = 'MIX' - mix_018_1.hide = True - mix_018_1.label = 'Wear Remap_B' - mix_018_1.location = (2448.38623046875, 294.36602783203125) - mix_018_1.name = 'Mix.018' - - reroute_419_1 = test_group.nodes.new('NodeReroute') - reroute_419_1.parent = test_group.nodes.get('Frame.012') - reroute_419_1.location = (2411.4072265625, 259.050048828125) - reroute_419_1.name = 'Reroute.419' - - mix_019_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_019_1.parent = test_group.nodes.get('Frame.012') - mix_019_1.blend_type = 'MIX' - mix_019_1.hide = True - mix_019_1.label = 'Wear Remap_B' - mix_019_1.location = (2448.38623046875, 264.36602783203125) - mix_019_1.name = 'Mix.019' - - reroute_432_1 = test_group.nodes.new('NodeReroute') - reroute_432_1.parent = test_group.nodes.get('Frame.012') - reroute_432_1.location = (2431.4072265625, -1273.06005859375) - reroute_432_1.name = 'Reroute.432' - - reroute_433_1 = test_group.nodes.new('NodeReroute') - reroute_433_1.parent = test_group.nodes.get('Frame.012') - reroute_433_1.location = (2431.4072265625, -1293.06005859375) - reroute_433_1.name = 'Reroute.433' - - mix_040_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_040_1.parent = test_group.nodes.get('Frame.012') - mix_040_1.blend_type = 'MIX' - mix_040_1.hide = True - mix_040_1.label = 'Detail Blends' - mix_040_1.location = (2453.43701171875, -1263.19775390625) - mix_040_1.name = 'Mix.040' - - reroute_434_1 = test_group.nodes.new('NodeReroute') - reroute_434_1.parent = test_group.nodes.get('Frame.012') - reroute_434_1.location = (2431.4072265625, -1313.06005859375) - reroute_434_1.name = 'Reroute.434' - - mix_041_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_041_1.parent = test_group.nodes.get('Frame.012') - mix_041_1.blend_type = 'MIX' - mix_041_1.hide = True - mix_041_1.label = 'Detail Blends' - mix_041_1.location = (2453.43701171875, -1293.19775390625) - mix_041_1.name = 'Mix.041' - - reroute_435_1 = test_group.nodes.new('NodeReroute') - reroute_435_1.parent = test_group.nodes.get('Frame.012') - reroute_435_1.location = (2431.4072265625, -1333.06005859375) - reroute_435_1.name = 'Reroute.435' - - mix_042_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_042_1.parent = test_group.nodes.get('Frame.012') - mix_042_1.blend_type = 'MIX' - mix_042_1.hide = True - mix_042_1.label = 'Detail Blends' - mix_042_1.location = (2453.43701171875, -1323.19775390625) - mix_042_1.name = 'Mix.042' - - reroute_436_1 = test_group.nodes.new('NodeReroute') - reroute_436_1.parent = test_group.nodes.get('Frame.012') - reroute_436_1.location = (2431.4072265625, -1353.06005859375) - reroute_436_1.name = 'Reroute.436' - - mix_043_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_043_1.parent = test_group.nodes.get('Frame.012') - mix_043_1.blend_type = 'MIX' - mix_043_1.hide = True - mix_043_1.label = 'Detail Blends' - mix_043_1.location = (2453.43701171875, -1353.19775390625) - mix_043_1.name = 'Mix.043' - - reroute_437_1 = test_group.nodes.new('NodeReroute') - reroute_437_1.parent = test_group.nodes.get('Frame.012') - reroute_437_1.location = (2431.4072265625, -1373.06005859375) - reroute_437_1.name = 'Reroute.437' - - mix_044_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_044_1.parent = test_group.nodes.get('Frame.012') - mix_044_1.blend_type = 'MIX' - mix_044_1.hide = True - mix_044_1.label = 'Detail Blends' - mix_044_1.location = (2453.43701171875, -1383.19775390625) - mix_044_1.name = 'Mix.044' - - reroute_466_1 = test_group.nodes.new('NodeReroute') - reroute_466_1.parent = test_group.nodes.get('Frame.012') - reroute_466_1.location = (2411.4072265625, -840.949951171875) - reroute_466_1.name = 'Reroute.466' - - reroute_461_1 = test_group.nodes.new('NodeReroute') - reroute_461_1.parent = test_group.nodes.get('Frame.012') - reroute_461_1.location = (2411.4072265625, -860.949951171875) - reroute_461_1.name = 'Reroute.461' - - mix_064_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_064_1.parent = test_group.nodes.get('Frame.012') - mix_064_1.blend_type = 'MIX' - mix_064_1.hide = True - mix_064_1.label = 'Detail Diffuse' - mix_064_1.location = (2451.31884765625, -816.6573486328125) - mix_064_1.name = 'Mix.064' - - reroute_462_1 = test_group.nodes.new('NodeReroute') - reroute_462_1.parent = test_group.nodes.get('Frame.012') - reroute_462_1.location = (2411.4072265625, -880.949951171875) - reroute_462_1.name = 'Reroute.462' - - mix_060_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_060_1.parent = test_group.nodes.get('Frame.012') - mix_060_1.blend_type = 'MIX' - mix_060_1.hide = True - mix_060_1.label = 'Detail Diffuse' - mix_060_1.location = (2451.31884765625, -846.6573486328125) - mix_060_1.name = 'Mix.060' - - reroute_463_1 = test_group.nodes.new('NodeReroute') - reroute_463_1.parent = test_group.nodes.get('Frame.012') - reroute_463_1.location = (2411.4072265625, -900.949951171875) - reroute_463_1.name = 'Reroute.463' - - mix_061_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_061_1.parent = test_group.nodes.get('Frame.012') - mix_061_1.blend_type = 'MIX' - mix_061_1.hide = True - mix_061_1.label = 'Detail Diffuse' - mix_061_1.location = (2451.31884765625, -876.6573486328125) - mix_061_1.name = 'Mix.061' - - reroute_464_1 = test_group.nodes.new('NodeReroute') - reroute_464_1.parent = test_group.nodes.get('Frame.012') - reroute_464_1.location = (2411.4072265625, -920.949951171875) - reroute_464_1.name = 'Reroute.464' - - mix_062_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_062_1.parent = test_group.nodes.get('Frame.012') - mix_062_1.blend_type = 'MIX' - mix_062_1.hide = True - mix_062_1.label = 'Detail Diffuse' - mix_062_1.location = (2451.31884765625, -906.6573486328125) - mix_062_1.name = 'Mix.062' - - reroute_478_1 = test_group.nodes.new('NodeReroute') - reroute_478_1.parent = test_group.nodes.get('Frame.012') - reroute_478_1.location = (2411.4072265625, -960.949951171875) - reroute_478_1.name = 'Reroute.478' - - reroute_473_1 = test_group.nodes.new('NodeReroute') - reroute_473_1.parent = test_group.nodes.get('Frame.012') - reroute_473_1.location = (2411.4072265625, -980.949951171875) - reroute_473_1.name = 'Reroute.473' - - mix_035_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_035_1.parent = test_group.nodes.get('Frame.012') - mix_035_1.blend_type = 'MIX' - mix_035_1.hide = True - mix_035_1.label = 'TiledNormal' - mix_035_1.location = (2453.43701171875, -969.553955078125) - mix_035_1.name = 'Mix.035' - - reroute_474_1 = test_group.nodes.new('NodeReroute') - reroute_474_1.parent = test_group.nodes.get('Frame.012') - reroute_474_1.location = (2411.4072265625, -1000.949951171875) - reroute_474_1.name = 'Reroute.474' - - mix_036_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_036_1.parent = test_group.nodes.get('Frame.012') - mix_036_1.blend_type = 'MIX' - mix_036_1.hide = True - mix_036_1.label = 'TiledNormal' - mix_036_1.location = (2453.43701171875, -999.553955078125) - mix_036_1.name = 'Mix.036' - - reroute_475_1 = test_group.nodes.new('NodeReroute') - reroute_475_1.parent = test_group.nodes.get('Frame.012') - reroute_475_1.location = (2411.4072265625, -1020.949951171875) - reroute_475_1.name = 'Reroute.475' - - mix_037_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_037_1.parent = test_group.nodes.get('Frame.012') - mix_037_1.blend_type = 'MIX' - mix_037_1.hide = True - mix_037_1.label = 'TiledNormal' - mix_037_1.location = (2453.43701171875, -1029.553955078125) - mix_037_1.name = 'Mix.037' - - reroute_476_1 = test_group.nodes.new('NodeReroute') - reroute_476_1.parent = test_group.nodes.get('Frame.012') - reroute_476_1.location = (2411.4072265625, -1040.949951171875) - reroute_476_1.name = 'Reroute.476' - - mix_038_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_038_1.parent = test_group.nodes.get('Frame.012') - mix_038_1.blend_type = 'MIX' - mix_038_1.hide = True - mix_038_1.label = 'TiledNormal' - mix_038_1.location = (2453.43701171875, -1059.553955078125) - mix_038_1.name = 'Mix.038' - - reroute_477_1 = test_group.nodes.new('NodeReroute') - reroute_477_1.parent = test_group.nodes.get('Frame.012') - reroute_477_1.location = (2411.4072265625, -1060.949951171875) - reroute_477_1.name = 'Reroute.477' - - mix_039_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_039_1.parent = test_group.nodes.get('Frame.012') - mix_039_1.blend_type = 'MIX' - mix_039_1.hide = True - mix_039_1.label = 'TiledNormal' - mix_039_1.location = (2453.43701171875, -1089.553955078125) - mix_039_1.name = 'Mix.039' - - reroute_479_1 = test_group.nodes.new('NodeReroute') - reroute_479_1.parent = test_group.nodes.get('Frame.012') - reroute_479_1.location = (2411.4072265625, -2160.949951171875) - reroute_479_1.name = 'Reroute.479' - - reroute_490_1 = test_group.nodes.new('NodeReroute') - reroute_490_1.parent = test_group.nodes.get('Frame.012') - reroute_490_1.location = (2411.4072265625, -2180.949951171875) - reroute_490_1.name = 'Reroute.490' - - mix_045_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_045_1.parent = test_group.nodes.get('Frame.012') - mix_045_1.blend_type = 'MIX' - mix_045_1.hide = True - mix_045_1.label = 'Iridescence, Fuzz,. Transmission' - mix_045_1.location = (2453.43701171875, -2149.204833984375) - mix_045_1.name = 'Mix.045' - - reroute_491_1 = test_group.nodes.new('NodeReroute') - reroute_491_1.parent = test_group.nodes.get('Frame.012') - reroute_491_1.location = (2411.4072265625, -2200.949951171875) - reroute_491_1.name = 'Reroute.491' - - mix_046_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_046_1.parent = test_group.nodes.get('Frame.012') - mix_046_1.blend_type = 'MIX' - mix_046_1.hide = True - mix_046_1.label = 'Iridescence, Fuzz,. Transmission' - mix_046_1.location = (2453.43701171875, -2179.204833984375) - mix_046_1.name = 'Mix.046' - - reroute_492_1 = test_group.nodes.new('NodeReroute') - reroute_492_1.parent = test_group.nodes.get('Frame.012') - reroute_492_1.location = (2411.4072265625, -2220.949951171875) - reroute_492_1.name = 'Reroute.492' - - mix_047_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_047_1.parent = test_group.nodes.get('Frame.012') - mix_047_1.blend_type = 'MIX' - mix_047_1.hide = True - mix_047_1.label = 'Iridescence, Fuzz,. Transmission' - mix_047_1.location = (2453.43701171875, -2209.204833984375) - mix_047_1.name = 'Mix.047' - - reroute_493_1 = test_group.nodes.new('NodeReroute') - reroute_493_1.parent = test_group.nodes.get('Frame.012') - reroute_493_1.location = (2411.4072265625, -2240.949951171875) - reroute_493_1.name = 'Reroute.493' - - mix_048_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_048_1.parent = test_group.nodes.get('Frame.012') - mix_048_1.blend_type = 'MIX' - mix_048_1.hide = True - mix_048_1.label = 'Iridescence, Fuzz,. Transmission' - mix_048_1.location = (2453.43701171875, -2239.204833984375) - mix_048_1.name = 'Mix.048' - - reroute_494_1 = test_group.nodes.new('NodeReroute') - reroute_494_1.parent = test_group.nodes.get('Frame.012') - reroute_494_1.location = (2411.4072265625, -2260.949951171875) - reroute_494_1.name = 'Reroute.494' - - mix_049_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_049_1.parent = test_group.nodes.get('Frame.012') - mix_049_1.blend_type = 'MIX' - mix_049_1.hide = True - mix_049_1.label = 'Iridescence, Fuzz,. Transmission' - mix_049_1.location = (2453.43701171875, -2269.204833984375) - mix_049_1.name = 'Mix.049' - - reroute_509_1 = test_group.nodes.new('NodeReroute') - reroute_509_1.parent = test_group.nodes.get('Frame.012') - reroute_509_1.location = (2411.4072265625, -3760.949951171875) - reroute_509_1.name = 'Reroute.509' - - reroute_508_1 = test_group.nodes.new('NodeReroute') - reroute_508_1.parent = test_group.nodes.get('Frame.012') - reroute_508_1.location = (2411.4072265625, -3780.949951171875) - reroute_508_1.name = 'Reroute.508' - - mix_055_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_055_1.parent = test_group.nodes.get('Frame.012') - mix_055_1.blend_type = 'MIX' - mix_055_1.hide = True - mix_055_1.label = 'Worn Detail Blends' - mix_055_1.location = (2454.43798828125, -3734.325927734375) - mix_055_1.name = 'Mix.055' - - reroute_510_1 = test_group.nodes.new('NodeReroute') - reroute_510_1.parent = test_group.nodes.get('Frame.012') - reroute_510_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_510_1.hide = False - reroute_510_1.location = (2411.4072265625, -3800.949951171875) - reroute_510_1.mute = False - reroute_510_1.name = 'Reroute.510' - reroute_510_1.use_custom_color = False - reroute_510_1.width = 16.0 - - mix_056_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_056_1.parent = test_group.nodes.get('Frame.012') - mix_056_1.blend_type = 'MIX' - mix_056_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_056_1.hide = True - mix_056_1.label = 'Worn Detail Blends' - mix_056_1.location = (2454.43798828125, -3764.325927734375) - mix_056_1.mute = False - mix_056_1.name = 'Mix.056' - mix_056_1.use_alpha = False - mix_056_1.use_clamp = False - mix_056_1.use_custom_color = False - mix_056_1.width = 140.0 - mix_056_1.inputs[0].default_value = 0.5 - mix_056_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_056_1.inputs[2].default_value = (0.42800000309944153, 1.0, 0.890175998210907, 1.0) - mix_056_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_511_1 = test_group.nodes.new('NodeReroute') - reroute_511_1.parent = test_group.nodes.get('Frame.012') - reroute_511_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_511_1.hide = False - reroute_511_1.location = (2411.4072265625, -3820.949951171875) - reroute_511_1.mute = False - reroute_511_1.name = 'Reroute.511' - reroute_511_1.use_custom_color = False - reroute_511_1.width = 16.0 - - mix_057_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_057_1.parent = test_group.nodes.get('Frame.012') - mix_057_1.blend_type = 'MIX' - mix_057_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_057_1.hide = True - mix_057_1.label = 'Worn Detail Blends' - mix_057_1.location = (2454.43798828125, -3794.325927734375) - mix_057_1.mute = False - mix_057_1.name = 'Mix.057' - mix_057_1.use_alpha = False - mix_057_1.use_clamp = False - mix_057_1.use_custom_color = False - mix_057_1.width = 140.0 - mix_057_1.inputs[0].default_value = 0.5 - mix_057_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_057_1.inputs[2].default_value = (0.0, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_057_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_512_1 = test_group.nodes.new('NodeReroute') - reroute_512_1.parent = test_group.nodes.get('Frame.012') - reroute_512_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_512_1.hide = False - reroute_512_1.location = (2411.4072265625, -3840.949951171875) - reroute_512_1.mute = False - reroute_512_1.name = 'Reroute.512' - reroute_512_1.use_custom_color = False - reroute_512_1.width = 16.0 - - mix_058_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_058_1.parent = test_group.nodes.get('Frame.012') - mix_058_1.blend_type = 'MIX' - mix_058_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_058_1.hide = True - mix_058_1.label = 'Worn Detail Blends' - mix_058_1.location = (2454.43798828125, -3824.325927734375) - mix_058_1.mute = False - mix_058_1.name = 'Mix.058' - mix_058_1.use_alpha = False - mix_058_1.use_clamp = False - mix_058_1.use_custom_color = False - mix_058_1.width = 140.0 - mix_058_1.inputs[0].default_value = 0.5 - mix_058_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_058_1.inputs[2].default_value = (0.42800000309944153, 1.0, 0.890175998210907, 1.0) - mix_058_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_513_1 = test_group.nodes.new('NodeReroute') - reroute_513_1.parent = test_group.nodes.get('Frame.012') - reroute_513_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_513_1.hide = False - reroute_513_1.location = (2411.4072265625, -3860.949951171875) - reroute_513_1.mute = False - reroute_513_1.name = 'Reroute.513' - reroute_513_1.use_custom_color = False - reroute_513_1.width = 16.0 - - mix_059_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_059_1.parent = test_group.nodes.get('Frame.012') - mix_059_1.blend_type = 'MIX' - mix_059_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_059_1.hide = True - mix_059_1.label = 'Worn Detail Blends' - mix_059_1.location = (2454.43798828125, -3854.325927734375) - mix_059_1.mute = False - mix_059_1.name = 'Mix.059' - mix_059_1.use_alpha = False - mix_059_1.use_clamp = False - mix_059_1.use_custom_color = False - mix_059_1.width = 140.0 - mix_059_1.inputs[0].default_value = 0.5 - mix_059_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_059_1.inputs[2].default_value = (0.0, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_059_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_530_1 = test_group.nodes.new('NodeReroute') - reroute_530_1.parent = test_group.nodes.get('Frame.012') - reroute_530_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_530_1.hide = False - reroute_530_1.location = (2411.4072265625, -5200.9501953125) - reroute_530_1.mute = False - reroute_530_1.name = 'Reroute.530' - reroute_530_1.use_custom_color = False - reroute_530_1.width = 16.0 - - reroute_529_1 = test_group.nodes.new('NodeReroute') - reroute_529_1.parent = test_group.nodes.get('Frame.012') - reroute_529_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_529_1.hide = False - reroute_529_1.location = (2411.4072265625, -5220.9501953125) - reroute_529_1.mute = False - reroute_529_1.name = 'Reroute.529' - reroute_529_1.use_custom_color = False - reroute_529_1.width = 16.0 - - mix_050_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_050_1.parent = test_group.nodes.get('Frame.012') - mix_050_1.blend_type = 'MIX' - mix_050_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_050_1.hide = True - mix_050_1.label = 'Emission' - mix_050_1.location = (2453.43701171875, -5186.62109375) - mix_050_1.mute = False - mix_050_1.name = 'Mix.050' - mix_050_1.use_alpha = False - mix_050_1.use_clamp = False - mix_050_1.use_custom_color = False - mix_050_1.width = 140.0 - mix_050_1.inputs[0].default_value = 0.5 - mix_050_1.inputs[1].default_value = (0.07869499921798706, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_050_1.inputs[2].default_value = (0.42800000309944153, 1.0, 0.890175998210907, 1.0) - mix_050_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_528_1 = test_group.nodes.new('NodeReroute') - reroute_528_1.parent = test_group.nodes.get('Frame.012') - reroute_528_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_528_1.hide = False - reroute_528_1.location = (2411.4072265625, -5240.9501953125) - reroute_528_1.mute = False - reroute_528_1.name = 'Reroute.528' - reroute_528_1.use_custom_color = False - reroute_528_1.width = 16.0 - - mix_051_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_051_1.parent = test_group.nodes.get('Frame.012') - mix_051_1.blend_type = 'MIX' - mix_051_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_051_1.hide = True - mix_051_1.label = 'Emission' - mix_051_1.location = (2453.43701171875, -5216.62109375) - mix_051_1.mute = False - mix_051_1.name = 'Mix.051' - mix_051_1.use_alpha = False - mix_051_1.use_clamp = False - mix_051_1.use_custom_color = False - mix_051_1.width = 140.0 - mix_051_1.inputs[0].default_value = 0.5 - mix_051_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_051_1.inputs[2].default_value = (0.42800000309944153, 1.0, 0.890175998210907, 1.0) - mix_051_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_527_1 = test_group.nodes.new('NodeReroute') - reroute_527_1.parent = test_group.nodes.get('Frame.012') - reroute_527_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_527_1.hide = False - reroute_527_1.location = (2411.4072265625, -5260.9501953125) - reroute_527_1.mute = False - reroute_527_1.name = 'Reroute.527' - reroute_527_1.use_custom_color = False - reroute_527_1.width = 16.0 - - mix_052_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_052_1.parent = test_group.nodes.get('Frame.012') - mix_052_1.blend_type = 'MIX' - mix_052_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_052_1.hide = True - mix_052_1.label = 'Emission' - mix_052_1.location = (2453.43701171875, -5246.62109375) - mix_052_1.mute = False - mix_052_1.name = 'Mix.052' - mix_052_1.use_alpha = False - mix_052_1.use_clamp = False - mix_052_1.use_custom_color = False - mix_052_1.width = 140.0 - mix_052_1.inputs[0].default_value = 0.5 - mix_052_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_052_1.inputs[2].default_value = (0.0, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_052_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_526_1 = test_group.nodes.new('NodeReroute') - reroute_526_1.parent = test_group.nodes.get('Frame.012') - reroute_526_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_526_1.hide = False - reroute_526_1.location = (2411.4072265625, -5280.9501953125) - reroute_526_1.mute = False - reroute_526_1.name = 'Reroute.526' - reroute_526_1.use_custom_color = False - reroute_526_1.width = 16.0 - - mix_053_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_053_1.parent = test_group.nodes.get('Frame.012') - mix_053_1.blend_type = 'MIX' - mix_053_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_053_1.hide = True - mix_053_1.label = 'Emission' - mix_053_1.location = (2453.43701171875, -5276.62109375) - mix_053_1.mute = False - mix_053_1.name = 'Mix.053' - mix_053_1.use_alpha = False - mix_053_1.use_clamp = False - mix_053_1.use_custom_color = False - mix_053_1.width = 140.0 - mix_053_1.inputs[0].default_value = 0.5 - mix_053_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_053_1.inputs[2].default_value = (0.42800000309944153, 1.0, 0.890175998210907, 1.0) - mix_053_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_525_1 = test_group.nodes.new('NodeReroute') - reroute_525_1.parent = test_group.nodes.get('Frame.012') - reroute_525_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_525_1.hide = False - reroute_525_1.location = (2411.4072265625, -5300.9501953125) - reroute_525_1.mute = False - reroute_525_1.name = 'Reroute.525' - reroute_525_1.use_custom_color = False - reroute_525_1.width = 16.0 - - mix_054_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_054_1.parent = test_group.nodes.get('Frame.012') - mix_054_1.blend_type = 'MIX' - mix_054_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_054_1.hide = True - mix_054_1.label = 'Emission' - mix_054_1.location = (2453.43701171875, -5306.62109375) - mix_054_1.mute = False - mix_054_1.name = 'Mix.054' - mix_054_1.use_alpha = False - mix_054_1.use_clamp = False - mix_054_1.use_custom_color = False - mix_054_1.width = 140.0 - mix_054_1.inputs[0].default_value = 0.5 - mix_054_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_054_1.inputs[2].default_value = (0.0, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_054_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - mix_063_1 = test_group.nodes.new('ShaderNodeMixRGB') - mix_063_1.parent = test_group.nodes.get('Frame.012') - mix_063_1.blend_type = 'MIX' - mix_063_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - mix_063_1.hide = True - mix_063_1.label = 'Detail Diffuse' - mix_063_1.location = (2451.31884765625, -936.657470703125) - mix_063_1.mute = False - mix_063_1.name = 'Mix.063' - mix_063_1.use_alpha = False - mix_063_1.use_clamp = False - mix_063_1.use_custom_color = False - mix_063_1.width = 140.0 - mix_063_1.inputs[0].default_value = 0.5 - mix_063_1.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) - mix_063_1.inputs[2].default_value = (0.0, 0.07869499921798706, 0.8942620158195496, 1.0) - mix_063_1.outputs[0].default_value = (0.0, 0.0, 0.0, 0.0) - - reroute_465_1 = test_group.nodes.new('NodeReroute') - reroute_465_1.parent = test_group.nodes.get('Frame.012') - reroute_465_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_465_1.hide = False - reroute_465_1.location = (2411.4072265625, -940.949951171875) - reroute_465_1.mute = False - reroute_465_1.name = 'Reroute.465' - reroute_465_1.use_custom_color = False - reroute_465_1.width = 16.0 - - reroute_518_1 = test_group.nodes.new('NodeReroute') - reroute_518_1.parent = test_group.nodes.get('Frame.012') - reroute_518_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_518_1.hide = False - reroute_518_1.label = 'DO NOT TOUCH' - reroute_518_1.location = (-1148.5927734375, -5300.9501953125) - reroute_518_1.mute = False - reroute_518_1.name = 'Reroute.518' - reroute_518_1.use_custom_color = False - reroute_518_1.width = 16.0 - - reroute_523_1 = test_group.nodes.new('NodeReroute') - reroute_523_1.parent = test_group.nodes.get('Frame.012') - reroute_523_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_523_1.hide = False - reroute_523_1.label = 'DO NOT TOUCH' - reroute_523_1.location = (-1148.5927734375, -4700.9501953125) - reroute_523_1.mute = False - reroute_523_1.name = 'Reroute.523' - reroute_523_1.use_custom_color = False - reroute_523_1.width = 16.0 - - reroute_148_1 = test_group.nodes.new('NodeReroute') - reroute_148_1.parent = test_group.nodes.get('Frame.012') - reroute_148_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_148_1.hide = False - reroute_148_1.label = 'DO NOT TOUCH' - reroute_148_1.location = (1852.10791015625, -2740.949951171875) - reroute_148_1.mute = False - reroute_148_1.name = 'Reroute.148' - reroute_148_1.use_custom_color = False - reroute_148_1.width = 16.0 - - reroute_150_1 = test_group.nodes.new('NodeReroute') - reroute_150_1.parent = test_group.nodes.get('Frame.012') - reroute_150_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_150_1.hide = False - reroute_150_1.label = 'DO NOT TOUCH' - reroute_150_1.location = (1832.10791015625, -3980.949951171875) - reroute_150_1.mute = False - reroute_150_1.name = 'Reroute.150' - reroute_150_1.use_custom_color = False - reroute_150_1.width = 16.0 - - reroute_146_1 = test_group.nodes.new('NodeReroute') - reroute_146_1.parent = test_group.nodes.get('Frame.012') - reroute_146_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_146_1.hide = False - reroute_146_1.label = 'DO NOT TOUCH' - reroute_146_1.location = (1872.10791015625, -1480.949951171875) - reroute_146_1.mute = False - reroute_146_1.name = 'Reroute.146' - reroute_146_1.use_custom_color = False - reroute_146_1.width = 16.0 - - reroute_144_1 = test_group.nodes.new('NodeReroute') - reroute_144_1.parent = test_group.nodes.get('Frame.012') - reroute_144_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_144_1.hide = False - reroute_144_1.label = 'DO NOT TOUCH' - reroute_144_1.location = (1892.10791015625, -260.949951171875) - reroute_144_1.mute = False - reroute_144_1.name = 'Reroute.144' - reroute_144_1.use_custom_color = False - reroute_144_1.width = 16.0 - - reroute_140_1 = test_group.nodes.new('NodeReroute') - reroute_140_1.parent = test_group.nodes.get('Frame.012') - reroute_140_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_140_1.hide = False - reroute_140_1.label = 'DO NOT TOUCH' - reroute_140_1.location = (1932.10791015625, 2219.050048828125) - reroute_140_1.mute = False - reroute_140_1.name = 'Reroute.140' - reroute_140_1.use_custom_color = False - reroute_140_1.width = 16.0 - - reroute_143_1 = test_group.nodes.new('NodeReroute') - reroute_143_1.parent = test_group.nodes.get('Frame.012') - reroute_143_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_143_1.hide = False - reroute_143_1.label = 'DO NOT TOUCH' - reroute_143_1.location = (1912.10791015625, 979.050048828125) - reroute_143_1.mute = False - reroute_143_1.name = 'Reroute.143' - reroute_143_1.use_custom_color = False - reroute_143_1.width = 16.0 - - reroute_141_1 = test_group.nodes.new('NodeReroute') - reroute_141_1.parent = test_group.nodes.get('Frame.012') - reroute_141_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_141_1.hide = False - reroute_141_1.label = 'DO NOT TOUCH' - reroute_141_1.location = (1932.10791015625, 899.050048828125) - reroute_141_1.mute = False - reroute_141_1.name = 'Reroute.141' - reroute_141_1.use_custom_color = False - reroute_141_1.width = 16.0 - - reroute_142_1 = test_group.nodes.new('NodeReroute') - reroute_142_1.parent = test_group.nodes.get('Frame.012') - reroute_142_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_142_1.hide = False - reroute_142_1.label = 'DO NOT TOUCH' - reroute_142_1.location = (1912.10791015625, 879.050048828125) - reroute_142_1.mute = False - reroute_142_1.name = 'Reroute.142' - reroute_142_1.use_custom_color = False - reroute_142_1.width = 16.0 - - reroute_145_1 = test_group.nodes.new('NodeReroute') - reroute_145_1.parent = test_group.nodes.get('Frame.012') - reroute_145_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_145_1.hide = False - reroute_145_1.label = 'DO NOT TOUCH' - reroute_145_1.location = (1892.10791015625, 859.050048828125) - reroute_145_1.mute = False - reroute_145_1.name = 'Reroute.145' - reroute_145_1.use_custom_color = False - reroute_145_1.width = 16.0 - - reroute_147_1 = test_group.nodes.new('NodeReroute') - reroute_147_1.parent = test_group.nodes.get('Frame.012') - reroute_147_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_147_1.hide = False - reroute_147_1.label = 'DO NOT TOUCH' - reroute_147_1.location = (1872.10791015625, 839.050048828125) - reroute_147_1.mute = False - reroute_147_1.name = 'Reroute.147' - reroute_147_1.use_custom_color = False - reroute_147_1.width = 16.0 - - reroute_149_1 = test_group.nodes.new('NodeReroute') - reroute_149_1.parent = test_group.nodes.get('Frame.012') - reroute_149_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_149_1.hide = False - reroute_149_1.label = 'DO NOT TOUCH' - reroute_149_1.location = (1852.10791015625, 819.050048828125) - reroute_149_1.mute = False - reroute_149_1.name = 'Reroute.149' - reroute_149_1.use_custom_color = False - reroute_149_1.width = 16.0 - - reroute_151_1 = test_group.nodes.new('NodeReroute') - reroute_151_1.parent = test_group.nodes.get('Frame.012') - reroute_151_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_151_1.hide = False - reroute_151_1.label = 'DO NOT TOUCH' - reroute_151_1.location = (1832.10791015625, 799.050048828125) - reroute_151_1.mute = False - reroute_151_1.name = 'Reroute.151' - reroute_151_1.use_custom_color = False - reroute_151_1.width = 16.0 - - reroute_294_1 = test_group.nodes.new('NodeReroute') - reroute_294_1.parent = test_group.nodes.get('Frame.012') - reroute_294_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_294_1.hide = False - reroute_294_1.label = 'DO NOT TOUCH' - reroute_294_1.location = (1811.4072265625, 719.050048828125) - reroute_294_1.mute = False - reroute_294_1.name = 'Reroute.294' - reroute_294_1.use_custom_color = False - reroute_294_1.width = 16.0 - - reroute_303_1 = test_group.nodes.new('NodeReroute') - reroute_303_1.parent = test_group.nodes.get('Frame.012') - reroute_303_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_303_1.hide = False - reroute_303_1.label = 'DO NOT TOUCH' - reroute_303_1.location = (1771.4072265625, 679.050048828125) - reroute_303_1.mute = False - reroute_303_1.name = 'Reroute.303' - reroute_303_1.use_custom_color = False - reroute_303_1.width = 16.0 - - reroute_304_1 = test_group.nodes.new('NodeReroute') - reroute_304_1.parent = test_group.nodes.get('Frame.012') - reroute_304_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_304_1.hide = False - reroute_304_1.label = 'DO NOT TOUCH' - reroute_304_1.location = (1751.4072265625, 659.050048828125) - reroute_304_1.mute = False - reroute_304_1.name = 'Reroute.304' - reroute_304_1.use_custom_color = False - reroute_304_1.width = 16.0 - - reroute_305_1 = test_group.nodes.new('NodeReroute') - reroute_305_1.parent = test_group.nodes.get('Frame.012') - reroute_305_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_305_1.hide = False - reroute_305_1.label = 'DO NOT TOUCH' - reroute_305_1.location = (1731.4072265625, 639.050048828125) - reroute_305_1.mute = False - reroute_305_1.name = 'Reroute.305' - reroute_305_1.use_custom_color = False - reroute_305_1.width = 16.0 - - reroute_306_1 = test_group.nodes.new('NodeReroute') - reroute_306_1.parent = test_group.nodes.get('Frame.012') - reroute_306_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_306_1.hide = False - reroute_306_1.label = 'DO NOT TOUCH' - reroute_306_1.location = (1711.4072265625, 619.050048828125) - reroute_306_1.mute = False - reroute_306_1.name = 'Reroute.306' - reroute_306_1.use_custom_color = False - reroute_306_1.width = 16.0 - - reroute_313_1 = test_group.nodes.new('NodeReroute') - reroute_313_1.parent = test_group.nodes.get('Frame.012') - reroute_313_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_313_1.hide = False - reroute_313_1.label = 'DO NOT TOUCH' - reroute_313_1.location = (1811.4072265625, 1399.050048828125) - reroute_313_1.mute = False - reroute_313_1.name = 'Reroute.313' - reroute_313_1.use_custom_color = False - reroute_313_1.width = 16.0 - - reroute_314_1 = test_group.nodes.new('NodeReroute') - reroute_314_1.parent = test_group.nodes.get('Frame.012') - reroute_314_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_314_1.hide = False - reroute_314_1.label = 'DO NOT TOUCH' - reroute_314_1.location = (1791.4072265625, 159.050048828125) - reroute_314_1.mute = False - reroute_314_1.name = 'Reroute.314' - reroute_314_1.use_custom_color = False - reroute_314_1.width = 16.0 - - reroute_297_1 = test_group.nodes.new('NodeReroute') - reroute_297_1.parent = test_group.nodes.get('Frame.012') - reroute_297_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_297_1.hide = False - reroute_297_1.label = 'DO NOT TOUCH' - reroute_297_1.location = (1791.4072265625, 699.050048828125) - reroute_297_1.mute = False - reroute_297_1.name = 'Reroute.297' - reroute_297_1.use_custom_color = False - reroute_297_1.width = 16.0 - - reroute_315_1 = test_group.nodes.new('NodeReroute') - reroute_315_1.parent = test_group.nodes.get('Frame.012') - reroute_315_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_315_1.hide = False - reroute_315_1.label = 'DO NOT TOUCH' - reroute_315_1.location = (1771.4072265625, -1080.949951171875) - reroute_315_1.mute = False - reroute_315_1.name = 'Reroute.315' - reroute_315_1.use_custom_color = False - reroute_315_1.width = 16.0 - - reroute_316_1 = test_group.nodes.new('NodeReroute') - reroute_316_1.parent = test_group.nodes.get('Frame.012') - reroute_316_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_316_1.hide = False - reroute_316_1.label = 'DO NOT TOUCH' - reroute_316_1.location = (1751.4072265625, -2320.949951171875) - reroute_316_1.mute = False - reroute_316_1.name = 'Reroute.316' - reroute_316_1.use_custom_color = False - reroute_316_1.width = 16.0 - - reroute_317_1 = test_group.nodes.new('NodeReroute') - reroute_317_1.parent = test_group.nodes.get('Frame.012') - reroute_317_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_317_1.hide = False - reroute_317_1.label = 'DO NOT TOUCH' - reroute_317_1.location = (1731.4072265625, -3560.949951171875) - reroute_317_1.mute = False - reroute_317_1.name = 'Reroute.317' - reroute_317_1.use_custom_color = False - reroute_317_1.width = 16.0 - - reroute_280_1 = test_group.nodes.new('NodeReroute') - reroute_280_1.parent = test_group.nodes.get('Frame.012') - reroute_280_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_280_1.hide = False - reroute_280_1.label = 'DO NOT TOUCH' - reroute_280_1.location = (1091.4072265625, -4840.9501953125) - reroute_280_1.mute = False - reroute_280_1.name = 'Reroute.280' - reroute_280_1.use_custom_color = False - reroute_280_1.width = 16.0 - - reroute_281_1 = test_group.nodes.new('NodeReroute') - reroute_281_1.parent = test_group.nodes.get('Frame.012') - reroute_281_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_281_1.hide = False - reroute_281_1.label = 'DO NOT TOUCH' - reroute_281_1.location = (1111.4072265625, -4880.9501953125) - reroute_281_1.mute = False - reroute_281_1.name = 'Reroute.281' - reroute_281_1.use_custom_color = False - reroute_281_1.width = 16.0 - - reroute_282_1 = test_group.nodes.new('NodeReroute') - reroute_282_1.parent = test_group.nodes.get('Frame.012') - reroute_282_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_282_1.hide = False - reroute_282_1.label = 'DO NOT TOUCH' - reroute_282_1.location = (1131.4072265625, -4920.9501953125) - reroute_282_1.mute = False - reroute_282_1.name = 'Reroute.282' - reroute_282_1.use_custom_color = False - reroute_282_1.width = 16.0 - - reroute_283_1 = test_group.nodes.new('NodeReroute') - reroute_283_1.parent = test_group.nodes.get('Frame.012') - reroute_283_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_283_1.hide = False - reroute_283_1.label = 'DO NOT TOUCH' - reroute_283_1.location = (1151.4072265625, -4960.9501953125) - reroute_283_1.mute = False - reroute_283_1.name = 'Reroute.283' - reroute_283_1.use_custom_color = False - reroute_283_1.width = 16.0 - - reroute_204_1 = test_group.nodes.new('NodeReroute') - reroute_204_1.parent = test_group.nodes.get('Frame.012') - reroute_204_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_204_1.hide = False - reroute_204_1.label = 'DO NOT TOUCH' - reroute_204_1.location = (1611.4072265625, -2800.949951171875) - reroute_204_1.mute = False - reroute_204_1.name = 'Reroute.204' - reroute_204_1.use_custom_color = False - reroute_204_1.width = 16.0 - - reroute_218_1 = test_group.nodes.new('NodeReroute') - reroute_218_1.parent = test_group.nodes.get('Frame.012') - reroute_218_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_218_1.hide = False - reroute_218_1.label = 'DO NOT TOUCH' - reroute_218_1.location = (1491.4072265625, -2920.949951171875) - reroute_218_1.mute = False - reroute_218_1.name = 'Reroute.218' - reroute_218_1.use_custom_color = False - reroute_218_1.width = 16.0 - - reroute_237_1 = test_group.nodes.new('NodeReroute') - reroute_237_1.parent = test_group.nodes.get('Frame.012') - reroute_237_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_237_1.hide = False - reroute_237_1.label = 'DO NOT TOUCH' - reroute_237_1.location = (1371.4072265625, -3040.949951171875) - reroute_237_1.mute = False - reroute_237_1.name = 'Reroute.237' - reroute_237_1.use_custom_color = False - reroute_237_1.width = 16.0 - - reroute_205_1 = test_group.nodes.new('NodeReroute') - reroute_205_1.parent = test_group.nodes.get('Frame.012') - reroute_205_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_205_1.hide = False - reroute_205_1.label = 'DO NOT TOUCH' - reroute_205_1.location = (1591.4072265625, -4040.949951171875) - reroute_205_1.mute = False - reroute_205_1.name = 'Reroute.205' - reroute_205_1.use_custom_color = False - reroute_205_1.width = 16.0 - - reroute_223_1 = test_group.nodes.new('NodeReroute') - reroute_223_1.parent = test_group.nodes.get('Frame.012') - reroute_223_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_223_1.hide = False - reroute_223_1.label = 'DO NOT TOUCH' - reroute_223_1.location = (1471.4072265625, -4160.9501953125) - reroute_223_1.mute = False - reroute_223_1.name = 'Reroute.223' - reroute_223_1.use_custom_color = False - reroute_223_1.width = 16.0 - - reroute_236_1 = test_group.nodes.new('NodeReroute') - reroute_236_1.parent = test_group.nodes.get('Frame.012') - reroute_236_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_236_1.hide = False - reroute_236_1.label = 'DO NOT TOUCH' - reroute_236_1.location = (1351.4072265625, -4280.9501953125) - reroute_236_1.mute = False - reroute_236_1.name = 'Reroute.236' - reroute_236_1.use_custom_color = False - reroute_236_1.width = 16.0 - - reroute_273_1 = test_group.nodes.new('NodeReroute') - reroute_273_1.parent = test_group.nodes.get('Frame.012') - reroute_273_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_273_1.hide = False - reroute_273_1.label = 'DO NOT TOUCH' - reroute_273_1.location = (1091.4072265625, -3600.949951171875) - reroute_273_1.mute = False - reroute_273_1.name = 'Reroute.273' - reroute_273_1.use_custom_color = False - reroute_273_1.width = 16.0 - - reroute_274_1 = test_group.nodes.new('NodeReroute') - reroute_274_1.parent = test_group.nodes.get('Frame.012') - reroute_274_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_274_1.hide = False - reroute_274_1.label = 'DO NOT TOUCH' - reroute_274_1.location = (1111.4072265625, -3640.949951171875) - reroute_274_1.mute = False - reroute_274_1.name = 'Reroute.274' - reroute_274_1.use_custom_color = False - reroute_274_1.width = 16.0 - - reroute_275_1 = test_group.nodes.new('NodeReroute') - reroute_275_1.parent = test_group.nodes.get('Frame.012') - reroute_275_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_275_1.hide = False - reroute_275_1.label = 'DO NOT TOUCH' - reroute_275_1.location = (1131.4072265625, -3680.949951171875) - reroute_275_1.mute = False - reroute_275_1.name = 'Reroute.275' - reroute_275_1.use_custom_color = False - reroute_275_1.width = 16.0 - - reroute_276_1 = test_group.nodes.new('NodeReroute') - reroute_276_1.parent = test_group.nodes.get('Frame.012') - reroute_276_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_276_1.hide = False - reroute_276_1.label = 'DO NOT TOUCH' - reroute_276_1.location = (1151.4072265625, -3720.949951171875) - reroute_276_1.mute = False - reroute_276_1.name = 'Reroute.276' - reroute_276_1.use_custom_color = False - reroute_276_1.width = 16.0 - - reroute_284_1 = test_group.nodes.new('NodeReroute') - reroute_284_1.parent = test_group.nodes.get('Frame.012') - reroute_284_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_284_1.hide = False - reroute_284_1.label = 'DO NOT TOUCH' - reroute_284_1.location = (1151.4072265625, -4340.9501953125) - reroute_284_1.mute = False - reroute_284_1.name = 'Reroute.284' - reroute_284_1.use_custom_color = False - reroute_284_1.width = 16.0 - - reroute_285_1 = test_group.nodes.new('NodeReroute') - reroute_285_1.parent = test_group.nodes.get('Frame.012') - reroute_285_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_285_1.hide = False - reroute_285_1.label = 'DO NOT TOUCH' - reroute_285_1.location = (1131.4072265625, -4320.9501953125) - reroute_285_1.mute = False - reroute_285_1.name = 'Reroute.285' - reroute_285_1.use_custom_color = False - reroute_285_1.width = 16.0 - - reroute_286_1 = test_group.nodes.new('NodeReroute') - reroute_286_1.parent = test_group.nodes.get('Frame.012') - reroute_286_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_286_1.hide = False - reroute_286_1.label = 'DO NOT TOUCH' - reroute_286_1.location = (1111.4072265625, -4300.9501953125) - reroute_286_1.mute = False - reroute_286_1.name = 'Reroute.286' - reroute_286_1.use_custom_color = False - reroute_286_1.width = 16.0 - - reroute_287_1 = test_group.nodes.new('NodeReroute') - reroute_287_1.parent = test_group.nodes.get('Frame.012') - reroute_287_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_287_1.hide = False - reroute_287_1.label = 'DO NOT TOUCH' - reroute_287_1.location = (1091.4072265625, -4220.9501953125) - reroute_287_1.mute = False - reroute_287_1.name = 'Reroute.287' - reroute_287_1.use_custom_color = False - reroute_287_1.width = 16.0 - - reroute_269_1 = test_group.nodes.new('NodeReroute') - reroute_269_1.parent = test_group.nodes.get('Frame.012') - reroute_269_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_269_1.hide = False - reroute_269_1.label = 'DO NOT TOUCH' - reroute_269_1.location = (1111.4072265625, -2380.949951171875) - reroute_269_1.mute = False - reroute_269_1.name = 'Reroute.269' - reroute_269_1.use_custom_color = False - reroute_269_1.width = 16.0 - - reroute_270_1 = test_group.nodes.new('NodeReroute') - reroute_270_1.parent = test_group.nodes.get('Frame.012') - reroute_270_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_270_1.hide = False - reroute_270_1.label = 'DO NOT TOUCH' - reroute_270_1.location = (1131.4072265625, -2420.949951171875) - reroute_270_1.mute = False - reroute_270_1.name = 'Reroute.270' - reroute_270_1.use_custom_color = False - reroute_270_1.width = 16.0 - - reroute_271_1 = test_group.nodes.new('NodeReroute') - reroute_271_1.parent = test_group.nodes.get('Frame.012') - reroute_271_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_271_1.hide = False - reroute_271_1.label = 'DO NOT TOUCH' - reroute_271_1.location = (1151.4072265625, -2460.949951171875) - reroute_271_1.mute = False - reroute_271_1.name = 'Reroute.271' - reroute_271_1.use_custom_color = False - reroute_271_1.width = 16.0 - - reroute_272_1 = test_group.nodes.new('NodeReroute') - reroute_272_1.parent = test_group.nodes.get('Frame.012') - reroute_272_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_272_1.hide = False - reroute_272_1.label = 'DO NOT TOUCH' - reroute_272_1.location = (1151.4072265625, -3100.949951171875) - reroute_272_1.mute = False - reroute_272_1.name = 'Reroute.272' - reroute_272_1.use_custom_color = False - reroute_272_1.width = 16.0 - - reroute_277_1 = test_group.nodes.new('NodeReroute') - reroute_277_1.parent = test_group.nodes.get('Frame.012') - reroute_277_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_277_1.hide = False - reroute_277_1.label = 'DO NOT TOUCH' - reroute_277_1.location = (1131.4072265625, -3080.949951171875) - reroute_277_1.mute = False - reroute_277_1.name = 'Reroute.277' - reroute_277_1.use_custom_color = False - reroute_277_1.width = 16.0 - - reroute_278_1 = test_group.nodes.new('NodeReroute') - reroute_278_1.parent = test_group.nodes.get('Frame.012') - reroute_278_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_278_1.hide = False - reroute_278_1.label = 'DO NOT TOUCH' - reroute_278_1.location = (1111.4072265625, -3060.949951171875) - reroute_278_1.mute = False - reroute_278_1.name = 'Reroute.278' - reroute_278_1.use_custom_color = False - reroute_278_1.width = 16.0 - - reroute_279_1 = test_group.nodes.new('NodeReroute') - reroute_279_1.parent = test_group.nodes.get('Frame.012') - reroute_279_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_279_1.hide = False - reroute_279_1.label = 'DO NOT TOUCH' - reroute_279_1.location = (1091.4072265625, -2980.949951171875) - reroute_279_1.mute = False - reroute_279_1.name = 'Reroute.279' - reroute_279_1.use_custom_color = False - reroute_279_1.width = 16.0 - - reroute_238_1 = test_group.nodes.new('NodeReroute') - reroute_238_1.parent = test_group.nodes.get('Frame.012') - reroute_238_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_238_1.hide = False - reroute_238_1.label = 'DO NOT TOUCH' - reroute_238_1.location = (1391.4072265625, -1780.949951171875) - reroute_238_1.mute = False - reroute_238_1.name = 'Reroute.238' - reroute_238_1.use_custom_color = False - reroute_238_1.width = 16.0 - - reroute_266_1 = test_group.nodes.new('NodeReroute') - reroute_266_1.parent = test_group.nodes.get('Frame.012') - reroute_266_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_266_1.hide = False - reroute_266_1.label = 'DO NOT TOUCH' - reroute_266_1.location = (1151.4072265625, -1840.949951171875) - reroute_266_1.mute = False - reroute_266_1.name = 'Reroute.266' - reroute_266_1.use_custom_color = False - reroute_266_1.width = 16.0 - - reroute_268_1 = test_group.nodes.new('NodeReroute') - reroute_268_1.parent = test_group.nodes.get('Frame.012') - reroute_268_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_268_1.hide = False - reroute_268_1.label = 'DO NOT TOUCH' - reroute_268_1.location = (1091.4072265625, -2340.949951171875) - reroute_268_1.mute = False - reroute_268_1.name = 'Reroute.268' - reroute_268_1.use_custom_color = False - reroute_268_1.width = 16.0 - - reroute_264_1 = test_group.nodes.new('NodeReroute') - reroute_264_1.parent = test_group.nodes.get('Frame.012') - reroute_264_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_264_1.hide = False - reroute_264_1.label = 'DO NOT TOUCH' - reroute_264_1.location = (1131.4072265625, -1820.949951171875) - reroute_264_1.mute = False - reroute_264_1.name = 'Reroute.264' - reroute_264_1.use_custom_color = False - reroute_264_1.width = 16.0 - - reroute_265_1 = test_group.nodes.new('NodeReroute') - reroute_265_1.parent = test_group.nodes.get('Frame.012') - reroute_265_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_265_1.hide = False - reroute_265_1.label = 'DO NOT TOUCH' - reroute_265_1.location = (1111.4072265625, -1800.949951171875) - reroute_265_1.mute = False - reroute_265_1.name = 'Reroute.265' - reroute_265_1.use_custom_color = False - reroute_265_1.width = 16.0 - - reroute_175_1 = test_group.nodes.new('NodeReroute') - reroute_175_1.parent = test_group.nodes.get('Frame.012') - reroute_175_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_175_1.hide = False - reroute_175_1.label = 'DO NOT TOUCH' - reroute_175_1.location = (1631.4072265625, -1540.949951171875) - reroute_175_1.mute = False - reroute_175_1.name = 'Reroute.175' - reroute_175_1.use_custom_color = False - reroute_175_1.width = 16.0 - - reroute_222_1 = test_group.nodes.new('NodeReroute') - reroute_222_1.parent = test_group.nodes.get('Frame.012') - reroute_222_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_222_1.hide = False - reroute_222_1.label = 'DO NOT TOUCH' - reroute_222_1.location = (1511.4072265625, -1660.949951171875) - reroute_222_1.mute = False - reroute_222_1.name = 'Reroute.222' - reroute_222_1.use_custom_color = False - reroute_222_1.width = 16.0 - - reroute_256_1 = test_group.nodes.new('NodeReroute') - reroute_256_1.parent = test_group.nodes.get('Frame.012') - reroute_256_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_256_1.hide = False - reroute_256_1.label = 'DO NOT TOUCH' - reroute_256_1.location = (1091.4072265625, -1120.949951171875) - reroute_256_1.mute = False - reroute_256_1.name = 'Reroute.256' - reroute_256_1.use_custom_color = False - reroute_256_1.width = 16.0 - - reroute_257_1 = test_group.nodes.new('NodeReroute') - reroute_257_1.parent = test_group.nodes.get('Frame.012') - reroute_257_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_257_1.hide = False - reroute_257_1.label = 'DO NOT TOUCH' - reroute_257_1.location = (1111.4072265625, -1160.949951171875) - reroute_257_1.mute = False - reroute_257_1.name = 'Reroute.257' - reroute_257_1.use_custom_color = False - reroute_257_1.width = 16.0 - - reroute_258_1 = test_group.nodes.new('NodeReroute') - reroute_258_1.parent = test_group.nodes.get('Frame.012') - reroute_258_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_258_1.hide = False - reroute_258_1.label = 'DO NOT TOUCH' - reroute_258_1.location = (1131.4072265625, -1200.949951171875) - reroute_258_1.mute = False - reroute_258_1.name = 'Reroute.258' - reroute_258_1.use_custom_color = False - reroute_258_1.width = 16.0 - - reroute_259_1 = test_group.nodes.new('NodeReroute') - reroute_259_1.parent = test_group.nodes.get('Frame.012') - reroute_259_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_259_1.hide = False - reroute_259_1.label = 'DO NOT TOUCH' - reroute_259_1.location = (1151.4072265625, -1240.949951171875) - reroute_259_1.mute = False - reroute_259_1.name = 'Reroute.259' - reroute_259_1.use_custom_color = False - reroute_259_1.width = 16.0 - - reroute_267_1 = test_group.nodes.new('NodeReroute') - reroute_267_1.parent = test_group.nodes.get('Frame.012') - reroute_267_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_267_1.hide = False - reroute_267_1.label = 'DO NOT TOUCH' - reroute_267_1.location = (1091.4072265625, -1720.949951171875) - reroute_267_1.mute = False - reroute_267_1.name = 'Reroute.267' - reroute_267_1.use_custom_color = False - reroute_267_1.width = 16.0 - - reroute_172_1 = test_group.nodes.new('NodeReroute') - reroute_172_1.parent = test_group.nodes.get('Frame.012') - reroute_172_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_172_1.hide = False - reroute_172_1.label = 'DO NOT TOUCH' - reroute_172_1.location = (1691.4072265625, 2159.050048828125) - reroute_172_1.mute = False - reroute_172_1.name = 'Reroute.172' - reroute_172_1.use_custom_color = False - reroute_172_1.width = 16.0 - - reroute_219_1 = test_group.nodes.new('NodeReroute') - reroute_219_1.parent = test_group.nodes.get('Frame.012') - reroute_219_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_219_1.hide = False - reroute_219_1.label = 'DO NOT TOUCH' - reroute_219_1.location = (1571.4072265625, 2039.050048828125) - reroute_219_1.mute = False - reroute_219_1.name = 'Reroute.219' - reroute_219_1.use_custom_color = False - reroute_219_1.width = 16.0 - - reroute_241_1 = test_group.nodes.new('NodeReroute') - reroute_241_1.parent = test_group.nodes.get('Frame.012') - reroute_241_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_241_1.hide = False - reroute_241_1.label = 'DO NOT TOUCH' - reroute_241_1.location = (1451.4072265625, 1919.050048828125) - reroute_241_1.mute = False - reroute_241_1.name = 'Reroute.241' - reroute_241_1.use_custom_color = False - reroute_241_1.width = 16.0 - - reroute_174_1 = test_group.nodes.new('NodeReroute') - reroute_174_1.parent = test_group.nodes.get('Frame.012') - reroute_174_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_174_1.hide = False - reroute_174_1.label = 'DO NOT TOUCH' - reroute_174_1.location = (1651.4072265625, -320.949951171875) - reroute_174_1.mute = False - reroute_174_1.name = 'Reroute.174' - reroute_174_1.use_custom_color = False - reroute_174_1.width = 16.0 - - reroute_221_1 = test_group.nodes.new('NodeReroute') - reroute_221_1.parent = test_group.nodes.get('Frame.012') - reroute_221_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_221_1.hide = False - reroute_221_1.label = 'DO NOT TOUCH' - reroute_221_1.location = (1531.4072265625, -440.949951171875) - reroute_221_1.mute = False - reroute_221_1.name = 'Reroute.221' - reroute_221_1.use_custom_color = False - reroute_221_1.width = 16.0 - - reroute_239_1 = test_group.nodes.new('NodeReroute') - reroute_239_1.parent = test_group.nodes.get('Frame.012') - reroute_239_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_239_1.hide = False - reroute_239_1.label = 'DO NOT TOUCH' - reroute_239_1.location = (1411.4072265625, -560.949951171875) - reroute_239_1.mute = False - reroute_239_1.name = 'Reroute.239' - reroute_239_1.use_custom_color = False - reroute_239_1.width = 16.0 - - reroute_170_1 = test_group.nodes.new('NodeReroute') - reroute_170_1.parent = test_group.nodes.get('Frame.012') - reroute_170_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_170_1.hide = False - reroute_170_1.label = 'DO NOT TOUCH' - reroute_170_1.location = (1611.4072265625, 39.050048828125) - reroute_170_1.mute = False - reroute_170_1.name = 'Reroute.170' - reroute_170_1.use_custom_color = False - reroute_170_1.width = 16.0 - - reroute_166_1 = test_group.nodes.new('NodeReroute') - reroute_166_1.parent = test_group.nodes.get('Frame.012') - reroute_166_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_166_1.hide = False - reroute_166_1.label = 'DO NOT TOUCH' - reroute_166_1.location = (1691.4072265625, 119.050048828125) - reroute_166_1.mute = False - reroute_166_1.name = 'Reroute.166' - reroute_166_1.use_custom_color = False - reroute_166_1.width = 16.0 - - reroute_167_1 = test_group.nodes.new('NodeReroute') - reroute_167_1.parent = test_group.nodes.get('Frame.012') - reroute_167_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_167_1.hide = False - reroute_167_1.label = 'DO NOT TOUCH' - reroute_167_1.location = (1671.4072265625, 99.050048828125) - reroute_167_1.mute = False - reroute_167_1.name = 'Reroute.167' - reroute_167_1.use_custom_color = False - reroute_167_1.width = 16.0 - - reroute_168_1 = test_group.nodes.new('NodeReroute') - reroute_168_1.parent = test_group.nodes.get('Frame.012') - reroute_168_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_168_1.hide = False - reroute_168_1.label = 'DO NOT TOUCH' - reroute_168_1.location = (1651.4072265625, 79.050048828125) - reroute_168_1.mute = False - reroute_168_1.name = 'Reroute.168' - reroute_168_1.use_custom_color = False - reroute_168_1.width = 16.0 - - reroute_169_1 = test_group.nodes.new('NodeReroute') - reroute_169_1.parent = test_group.nodes.get('Frame.012') - reroute_169_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_169_1.hide = False - reroute_169_1.label = 'DO NOT TOUCH' - reroute_169_1.location = (1631.4072265625, 59.050048828125) - reroute_169_1.mute = False - reroute_169_1.name = 'Reroute.169' - reroute_169_1.use_custom_color = False - reroute_169_1.width = 16.0 - - reroute_171_1 = test_group.nodes.new('NodeReroute') - reroute_171_1.parent = test_group.nodes.get('Frame.012') - reroute_171_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_171_1.hide = False - reroute_171_1.label = 'DO NOT TOUCH' - reroute_171_1.location = (1591.4072265625, 19.050048828125) - reroute_171_1.mute = False - reroute_171_1.name = 'Reroute.171' - reroute_171_1.use_custom_color = False - reroute_171_1.width = 16.0 - - reroute_212_1 = test_group.nodes.new('NodeReroute') - reroute_212_1.parent = test_group.nodes.get('Frame.012') - reroute_212_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_212_1.hide = False - reroute_212_1.label = 'DO NOT TOUCH' - reroute_212_1.location = (1491.4072265625, -80.949951171875) - reroute_212_1.mute = False - reroute_212_1.name = 'Reroute.212' - reroute_212_1.use_custom_color = False - reroute_212_1.width = 16.0 - - reroute_216_1 = test_group.nodes.new('NodeReroute') - reroute_216_1.parent = test_group.nodes.get('Frame.012') - reroute_216_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_216_1.hide = False - reroute_216_1.label = 'DO NOT TOUCH' - reroute_216_1.location = (1511.4072265625, -60.949951171875) - reroute_216_1.mute = False - reroute_216_1.name = 'Reroute.216' - reroute_216_1.use_custom_color = False - reroute_216_1.width = 16.0 - - reroute_215_1 = test_group.nodes.new('NodeReroute') - reroute_215_1.parent = test_group.nodes.get('Frame.012') - reroute_215_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_215_1.hide = False - reroute_215_1.label = 'DO NOT TOUCH' - reroute_215_1.location = (1531.4072265625, -40.949951171875) - reroute_215_1.mute = False - reroute_215_1.name = 'Reroute.215' - reroute_215_1.use_custom_color = False - reroute_215_1.width = 16.0 - - reroute_214_1 = test_group.nodes.new('NodeReroute') - reroute_214_1.parent = test_group.nodes.get('Frame.012') - reroute_214_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_214_1.hide = False - reroute_214_1.label = 'DO NOT TOUCH' - reroute_214_1.location = (1551.4072265625, -20.949951171875) - reroute_214_1.mute = False - reroute_214_1.name = 'Reroute.214' - reroute_214_1.use_custom_color = False - reroute_214_1.width = 16.0 - - reroute_213_1 = test_group.nodes.new('NodeReroute') - reroute_213_1.parent = test_group.nodes.get('Frame.012') - reroute_213_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_213_1.hide = False - reroute_213_1.label = 'DO NOT TOUCH' - reroute_213_1.location = (1571.4072265625, -0.949951171875) - reroute_213_1.mute = False - reroute_213_1.name = 'Reroute.213' - reroute_213_1.use_custom_color = False - reroute_213_1.width = 16.0 - - reroute_217_1 = test_group.nodes.new('NodeReroute') - reroute_217_1.parent = test_group.nodes.get('Frame.012') - reroute_217_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_217_1.hide = False - reroute_217_1.label = 'DO NOT TOUCH' - reroute_217_1.location = (1471.4072265625, -100.949951171875) - reroute_217_1.mute = False - reroute_217_1.name = 'Reroute.217' - reroute_217_1.use_custom_color = False - reroute_217_1.width = 16.0 - - reroute_235_1 = test_group.nodes.new('NodeReroute') - reroute_235_1.parent = test_group.nodes.get('Frame.012') - reroute_235_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_235_1.hide = False - reroute_235_1.label = 'DO NOT TOUCH' - reroute_235_1.location = (1451.4072265625, -120.949951171875) - reroute_235_1.mute = False - reroute_235_1.name = 'Reroute.235' - reroute_235_1.use_custom_color = False - reroute_235_1.width = 16.0 - - reroute_234_1 = test_group.nodes.new('NodeReroute') - reroute_234_1.parent = test_group.nodes.get('Frame.012') - reroute_234_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_234_1.hide = False - reroute_234_1.label = 'DO NOT TOUCH' - reroute_234_1.location = (1431.4072265625, -140.949951171875) - reroute_234_1.mute = False - reroute_234_1.name = 'Reroute.234' - reroute_234_1.use_custom_color = False - reroute_234_1.width = 16.0 - - reroute_233_1 = test_group.nodes.new('NodeReroute') - reroute_233_1.parent = test_group.nodes.get('Frame.012') - reroute_233_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_233_1.hide = False - reroute_233_1.label = 'DO NOT TOUCH' - reroute_233_1.location = (1411.4072265625, -160.949951171875) - reroute_233_1.mute = False - reroute_233_1.name = 'Reroute.233' - reroute_233_1.use_custom_color = False - reroute_233_1.width = 16.0 - - reroute_232_1 = test_group.nodes.new('NodeReroute') - reroute_232_1.parent = test_group.nodes.get('Frame.012') - reroute_232_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_232_1.hide = False - reroute_232_1.label = 'DO NOT TOUCH' - reroute_232_1.location = (1391.4072265625, -180.949951171875) - reroute_232_1.mute = False - reroute_232_1.name = 'Reroute.232' - reroute_232_1.use_custom_color = False - reroute_232_1.width = 16.0 - - reroute_231_1 = test_group.nodes.new('NodeReroute') - reroute_231_1.parent = test_group.nodes.get('Frame.012') - reroute_231_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_231_1.hide = False - reroute_231_1.label = 'DO NOT TOUCH' - reroute_231_1.location = (1371.4072265625, -200.949951171875) - reroute_231_1.mute = False - reroute_231_1.name = 'Reroute.231' - reroute_231_1.use_custom_color = False - reroute_231_1.width = 16.0 - - reroute_230_1 = test_group.nodes.new('NodeReroute') - reroute_230_1.parent = test_group.nodes.get('Frame.012') - reroute_230_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_230_1.hide = False - reroute_230_1.label = 'DO NOT TOUCH' - reroute_230_1.location = (1351.4072265625, -220.949951171875) - reroute_230_1.mute = False - reroute_230_1.name = 'Reroute.230' - reroute_230_1.use_custom_color = False - reroute_230_1.width = 16.0 - - reroute_162_1 = test_group.nodes.new('NodeReroute') - reroute_162_1.parent = test_group.nodes.get('Frame.012') - reroute_162_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_162_1.hide = False - reroute_162_1.label = 'DO NOT TOUCH' - reroute_162_1.location = (1151.4072265625, 1239.050048828125) - reroute_162_1.mute = False - reroute_162_1.name = 'Reroute.162' - reroute_162_1.use_custom_color = False - reroute_162_1.width = 16.0 - - reroute_158_1 = test_group.nodes.new('NodeReroute') - reroute_158_1.parent = test_group.nodes.get('Frame.012') - reroute_158_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_158_1.hide = False - reroute_158_1.label = 'DO NOT TOUCH' - reroute_158_1.location = (1091.4072265625, 1359.050048828125) - reroute_158_1.mute = False - reroute_158_1.name = 'Reroute.158' - reroute_158_1.use_custom_color = False - reroute_158_1.width = 16.0 - - reroute_160_1 = test_group.nodes.new('NodeReroute') - reroute_160_1.parent = test_group.nodes.get('Frame.012') - reroute_160_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_160_1.hide = False - reroute_160_1.label = 'DO NOT TOUCH' - reroute_160_1.location = (1111.4072265625, 1319.050048828125) - reroute_160_1.mute = False - reroute_160_1.name = 'Reroute.160' - reroute_160_1.use_custom_color = False - reroute_160_1.width = 16.0 - - reroute_159_1 = test_group.nodes.new('NodeReroute') - reroute_159_1.parent = test_group.nodes.get('Frame.012') - reroute_159_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_159_1.hide = False - reroute_159_1.label = 'DO NOT TOUCH' - reroute_159_1.location = (1091.4072265625, 1979.050048828125) - reroute_159_1.mute = False - reroute_159_1.name = 'Reroute.159' - reroute_159_1.use_custom_color = False - reroute_159_1.width = 16.0 - - reroute_165_1 = test_group.nodes.new('NodeReroute') - reroute_165_1.parent = test_group.nodes.get('Frame.012') - reroute_165_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_165_1.hide = False - reroute_165_1.label = 'DO NOT TOUCH' - reroute_165_1.location = (1151.4072265625, 1859.050048828125) - reroute_165_1.mute = False - reroute_165_1.name = 'Reroute.165' - reroute_165_1.use_custom_color = False - reroute_165_1.width = 16.0 - - reroute_164_1 = test_group.nodes.new('NodeReroute') - reroute_164_1.parent = test_group.nodes.get('Frame.012') - reroute_164_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_164_1.hide = False - reroute_164_1.label = 'DO NOT TOUCH' - reroute_164_1.location = (1131.4072265625, 1879.050048828125) - reroute_164_1.mute = False - reroute_164_1.name = 'Reroute.164' - reroute_164_1.use_custom_color = False - reroute_164_1.width = 16.0 - - reroute_163_1 = test_group.nodes.new('NodeReroute') - reroute_163_1.parent = test_group.nodes.get('Frame.012') - reroute_163_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_163_1.hide = False - reroute_163_1.label = 'DO NOT TOUCH' - reroute_163_1.location = (1111.4072265625, 1899.050048828125) - reroute_163_1.mute = False - reroute_163_1.name = 'Reroute.163' - reroute_163_1.use_custom_color = False - reroute_163_1.width = 16.0 - - reroute_161_1 = test_group.nodes.new('NodeReroute') - reroute_161_1.parent = test_group.nodes.get('Frame.012') - reroute_161_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_161_1.hide = False - reroute_161_1.label = 'DO NOT TOUCH' - reroute_161_1.location = (1131.4072265625, 1279.050048828125) - reroute_161_1.mute = False - reroute_161_1.name = 'Reroute.161' - reroute_161_1.use_custom_color = False - reroute_161_1.width = 16.0 - - reroute_249_1 = test_group.nodes.new('NodeReroute') - reroute_249_1.parent = test_group.nodes.get('Frame.012') - reroute_249_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_249_1.hide = False - reroute_249_1.label = 'DO NOT TOUCH' - reroute_249_1.location = (1091.4072265625, 739.050048828125) - reroute_249_1.mute = False - reroute_249_1.name = 'Reroute.249' - reroute_249_1.use_custom_color = False - reroute_249_1.width = 16.0 - - reroute_248_1 = test_group.nodes.new('NodeReroute') - reroute_248_1.parent = test_group.nodes.get('Frame.012') - reroute_248_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_248_1.hide = False - reroute_248_1.label = 'DO NOT TOUCH' - reroute_248_1.location = (1091.4072265625, 119.050048828125) - reroute_248_1.mute = False - reroute_248_1.name = 'Reroute.248' - reroute_248_1.use_custom_color = False - reroute_248_1.width = 16.0 - - reroute_250_1 = test_group.nodes.new('NodeReroute') - reroute_250_1.parent = test_group.nodes.get('Frame.012') - reroute_250_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_250_1.hide = False - reroute_250_1.label = 'DO NOT TOUCH' - reroute_250_1.location = (1111.4072265625, 79.050048828125) - reroute_250_1.mute = False - reroute_250_1.name = 'Reroute.250' - reroute_250_1.use_custom_color = False - reroute_250_1.width = 16.0 - - reroute_251_1 = test_group.nodes.new('NodeReroute') - reroute_251_1.parent = test_group.nodes.get('Frame.012') - reroute_251_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_251_1.hide = False - reroute_251_1.label = 'DO NOT TOUCH' - reroute_251_1.location = (1131.4072265625, 39.050048828125) - reroute_251_1.mute = False - reroute_251_1.name = 'Reroute.251' - reroute_251_1.use_custom_color = False - reroute_251_1.width = 16.0 - - reroute_252_1 = test_group.nodes.new('NodeReroute') - reroute_252_1.parent = test_group.nodes.get('Frame.012') - reroute_252_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_252_1.hide = False - reroute_252_1.label = 'DO NOT TOUCH' - reroute_252_1.location = (1151.4072265625, -0.949951171875) - reroute_252_1.mute = False - reroute_252_1.name = 'Reroute.252' - reroute_252_1.use_custom_color = False - reroute_252_1.width = 16.0 - - reroute_253_1 = test_group.nodes.new('NodeReroute') - reroute_253_1.parent = test_group.nodes.get('Frame.012') - reroute_253_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_253_1.hide = False - reroute_253_1.label = 'DO NOT TOUCH' - reroute_253_1.location = (1111.4072265625, 659.050048828125) - reroute_253_1.mute = False - reroute_253_1.name = 'Reroute.253' - reroute_253_1.use_custom_color = False - reroute_253_1.width = 16.0 - - reroute_254_1 = test_group.nodes.new('NodeReroute') - reroute_254_1.parent = test_group.nodes.get('Frame.012') - reroute_254_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_254_1.hide = False - reroute_254_1.label = 'DO NOT TOUCH' - reroute_254_1.location = (1131.4072265625, 639.050048828125) - reroute_254_1.mute = False - reroute_254_1.name = 'Reroute.254' - reroute_254_1.use_custom_color = False - reroute_254_1.width = 16.0 - - reroute_255_1 = test_group.nodes.new('NodeReroute') - reroute_255_1.parent = test_group.nodes.get('Frame.012') - reroute_255_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_255_1.hide = False - reroute_255_1.label = 'DO NOT TOUCH' - reroute_255_1.location = (1151.4072265625, 619.050048828125) - reroute_255_1.mute = False - reroute_255_1.name = 'Reroute.255' - reroute_255_1.use_custom_color = False - reroute_255_1.width = 16.0 - - reroute_261_1 = test_group.nodes.new('NodeReroute') - reroute_261_1.parent = test_group.nodes.get('Frame.012') - reroute_261_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_261_1.hide = False - reroute_261_1.label = 'DO NOT TOUCH' - reroute_261_1.location = (1131.4072265625, -600.949951171875) - reroute_261_1.mute = False - reroute_261_1.name = 'Reroute.261' - reroute_261_1.use_custom_color = False - reroute_261_1.width = 16.0 - - reroute_262_1 = test_group.nodes.new('NodeReroute') - reroute_262_1.parent = test_group.nodes.get('Frame.012') - reroute_262_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_262_1.hide = False - reroute_262_1.label = 'DO NOT TOUCH' - reroute_262_1.location = (1111.4072265625, -580.949951171875) - reroute_262_1.mute = False - reroute_262_1.name = 'Reroute.262' - reroute_262_1.use_custom_color = False - reroute_262_1.width = 16.0 - - reroute_260_1 = test_group.nodes.new('NodeReroute') - reroute_260_1.parent = test_group.nodes.get('Frame.012') - reroute_260_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_260_1.hide = False - reroute_260_1.label = 'DO NOT TOUCH' - reroute_260_1.location = (1151.4072265625, -620.949951171875) - reroute_260_1.mute = False - reroute_260_1.name = 'Reroute.260' - reroute_260_1.use_custom_color = False - reroute_260_1.width = 16.0 - - reroute_263_1 = test_group.nodes.new('NodeReroute') - reroute_263_1.parent = test_group.nodes.get('Frame.012') - reroute_263_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_263_1.hide = False - reroute_263_1.label = 'DO NOT TOUCH' - reroute_263_1.location = (1091.4072265625, -500.949951171875) - reroute_263_1.mute = False - reroute_263_1.name = 'Reroute.263' - reroute_263_1.use_custom_color = False - reroute_263_1.width = 16.0 - - reroute_318_1 = test_group.nodes.new('NodeReroute') - reroute_318_1.parent = test_group.nodes.get('Frame.012') - reroute_318_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_318_1.hide = False - reroute_318_1.label = 'DO NOT TOUCH' - reroute_318_1.location = (1711.4072265625, -4800.9501953125) - reroute_318_1.mute = False - reroute_318_1.name = 'Reroute.318' - reroute_318_1.use_custom_color = False - reroute_318_1.width = 16.0 - - reroute_331_1 = test_group.nodes.new('NodeReroute') - reroute_331_1.parent = test_group.nodes.get('Frame.012') - reroute_331_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_331_1.hide = False - reroute_331_1.label = 'DO NOT TOUCH' - reroute_331_1.location = (851.4072265625, 1939.050048828125) - reroute_331_1.mute = False - reroute_331_1.name = 'Reroute.331' - reroute_331_1.use_custom_color = False - reroute_331_1.width = 16.0 - - reroute_333_1 = test_group.nodes.new('NodeReroute') - reroute_333_1.parent = test_group.nodes.get('Frame.012') - reroute_333_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_333_1.hide = False - reroute_333_1.label = 'DO NOT TOUCH' - reroute_333_1.location = (851.4072265625, 499.050048828125) - reroute_333_1.mute = False - reroute_333_1.name = 'Reroute.333' - reroute_333_1.use_custom_color = False - reroute_333_1.width = 16.0 - - reroute_332_1 = test_group.nodes.new('NodeReroute') - reroute_332_1.parent = test_group.nodes.get('Frame.012') - reroute_332_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_332_1.hide = False - reroute_332_1.label = 'DO NOT TOUCH' - reroute_332_1.location = (711.4072265625, 1819.050048828125) - reroute_332_1.mute = False - reroute_332_1.name = 'Reroute.332' - reroute_332_1.use_custom_color = False - reroute_332_1.width = 16.0 - - reroute_380_1 = test_group.nodes.new('NodeReroute') - reroute_380_1.parent = test_group.nodes.get('Frame.012') - reroute_380_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_380_1.hide = False - reroute_380_1.label = 'DO NOT TOUCH' - reroute_380_1.location = (831.4072265625, 699.050048828125) - reroute_380_1.mute = False - reroute_380_1.name = 'Reroute.380' - reroute_380_1.use_custom_color = False - reroute_380_1.width = 16.0 - - reroute_375_1 = test_group.nodes.new('NodeReroute') - reroute_375_1.parent = test_group.nodes.get('Frame.012') - reroute_375_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_375_1.hide = False - reroute_375_1.label = 'DO NOT TOUCH' - reroute_375_1.location = (831.4072265625, 479.050048828125) - reroute_375_1.mute = False - reroute_375_1.name = 'Reroute.375' - reroute_375_1.use_custom_color = False - reroute_375_1.width = 16.0 - - reroute_376_1 = test_group.nodes.new('NodeReroute') - reroute_376_1.parent = test_group.nodes.get('Frame.012') - reroute_376_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_376_1.hide = False - reroute_376_1.label = 'DO NOT TOUCH' - reroute_376_1.location = (811.4072265625, 459.050048828125) - reroute_376_1.mute = False - reroute_376_1.name = 'Reroute.376' - reroute_376_1.use_custom_color = False - reroute_376_1.width = 16.0 - - reroute_377_1 = test_group.nodes.new('NodeReroute') - reroute_377_1.parent = test_group.nodes.get('Frame.012') - reroute_377_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_377_1.hide = False - reroute_377_1.label = 'DO NOT TOUCH' - reroute_377_1.location = (791.4072265625, 439.050048828125) - reroute_377_1.mute = False - reroute_377_1.name = 'Reroute.377' - reroute_377_1.use_custom_color = False - reroute_377_1.width = 16.0 - - reroute_378_1 = test_group.nodes.new('NodeReroute') - reroute_378_1.parent = test_group.nodes.get('Frame.012') - reroute_378_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_378_1.hide = False - reroute_378_1.label = 'DO NOT TOUCH' - reroute_378_1.location = (771.4072265625, 419.050048828125) - reroute_378_1.mute = False - reroute_378_1.name = 'Reroute.378' - reroute_378_1.use_custom_color = False - reroute_378_1.width = 16.0 - - reroute_379_1 = test_group.nodes.new('NodeReroute') - reroute_379_1.parent = test_group.nodes.get('Frame.012') - reroute_379_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_379_1.hide = False - reroute_379_1.label = 'DO NOT TOUCH' - reroute_379_1.location = (751.4072265625, 399.050048828125) - reroute_379_1.mute = False - reroute_379_1.name = 'Reroute.379' - reroute_379_1.use_custom_color = False - reroute_379_1.width = 16.0 - - reroute_406_1 = test_group.nodes.new('NodeReroute') - reroute_406_1.parent = test_group.nodes.get('Frame.012') - reroute_406_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_406_1.hide = False - reroute_406_1.label = 'DO NOT TOUCH' - reroute_406_1.location = (811.4072265625, -540.949951171875) - reroute_406_1.mute = False - reroute_406_1.name = 'Reroute.406' - reroute_406_1.use_custom_color = False - reroute_406_1.width = 16.0 - - reroute_407_1 = test_group.nodes.new('NodeReroute') - reroute_407_1.parent = test_group.nodes.get('Frame.012') - reroute_407_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_407_1.hide = False - reroute_407_1.label = 'DO NOT TOUCH' - reroute_407_1.location = (791.4072265625, -1780.949951171875) - reroute_407_1.mute = False - reroute_407_1.name = 'Reroute.407' - reroute_407_1.use_custom_color = False - reroute_407_1.width = 16.0 - - reroute_408_1 = test_group.nodes.new('NodeReroute') - reroute_408_1.parent = test_group.nodes.get('Frame.012') - reroute_408_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_408_1.hide = False - reroute_408_1.label = 'DO NOT TOUCH' - reroute_408_1.location = (771.4072265625, -3020.949951171875) - reroute_408_1.mute = False - reroute_408_1.name = 'Reroute.408' - reroute_408_1.use_custom_color = False - reroute_408_1.width = 16.0 - - reroute_409_1 = test_group.nodes.new('NodeReroute') - reroute_409_1.parent = test_group.nodes.get('Frame.012') - reroute_409_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_409_1.hide = False - reroute_409_1.label = 'DO NOT TOUCH' - reroute_409_1.location = (751.4072265625, -4260.9501953125) - reroute_409_1.mute = False - reroute_409_1.name = 'Reroute.409' - reroute_409_1.use_custom_color = False - reroute_409_1.width = 16.0 - - reroute_240_1 = test_group.nodes.new('NodeReroute') - reroute_240_1.parent = test_group.nodes.get('Frame.012') - reroute_240_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_240_1.hide = False - reroute_240_1.label = 'DO NOT TOUCH' - reroute_240_1.location = (1431.4072265625, 679.050048828125) - reroute_240_1.mute = False - reroute_240_1.name = 'Reroute.240' - reroute_240_1.use_custom_color = False - reroute_240_1.width = 16.0 - - reroute_220_1 = test_group.nodes.new('NodeReroute') - reroute_220_1.parent = test_group.nodes.get('Frame.012') - reroute_220_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_220_1.hide = False - reroute_220_1.label = 'DO NOT TOUCH' - reroute_220_1.location = (1551.4072265625, 799.050048828125) - reroute_220_1.mute = False - reroute_220_1.name = 'Reroute.220' - reroute_220_1.use_custom_color = False - reroute_220_1.width = 16.0 - - reroute_173_1 = test_group.nodes.new('NodeReroute') - reroute_173_1.parent = test_group.nodes.get('Frame.012') - reroute_173_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_173_1.hide = False - reroute_173_1.label = 'DO NOT TOUCH' - reroute_173_1.location = (1671.4072265625, 919.050048828125) - reroute_173_1.mute = False - reroute_173_1.name = 'Reroute.173' - reroute_173_1.use_custom_color = False - reroute_173_1.width = 16.0 - - reroute_420_1 = test_group.nodes.new('NodeReroute') - reroute_420_1.parent = test_group.nodes.get('Frame.012') - reroute_420_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_420_1.hide = False - reroute_420_1.label = 'DO NOT TOUCH' - reroute_420_1.location = (691.4072265625, 579.050048828125) - reroute_420_1.mute = False - reroute_420_1.name = 'Reroute.420' - reroute_420_1.use_custom_color = False - reroute_420_1.width = 16.0 - - reroute_421_1 = test_group.nodes.new('NodeReroute') - reroute_421_1.parent = test_group.nodes.get('Frame.012') - reroute_421_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_421_1.hide = False - reroute_421_1.label = 'DO NOT TOUCH' - reroute_421_1.location = (671.4072265625, -660.949951171875) - reroute_421_1.mute = False - reroute_421_1.name = 'Reroute.421' - reroute_421_1.use_custom_color = False - reroute_421_1.width = 16.0 - - reroute_422_1 = test_group.nodes.new('NodeReroute') - reroute_422_1.parent = test_group.nodes.get('Frame.012') - reroute_422_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_422_1.hide = False - reroute_422_1.label = 'DO NOT TOUCH' - reroute_422_1.location = (651.4072265625, -1900.949951171875) - reroute_422_1.mute = False - reroute_422_1.name = 'Reroute.422' - reroute_422_1.use_custom_color = False - reroute_422_1.width = 16.0 - - reroute_423_1 = test_group.nodes.new('NodeReroute') - reroute_423_1.parent = test_group.nodes.get('Frame.012') - reroute_423_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_423_1.hide = False - reroute_423_1.label = 'DO NOT TOUCH' - reroute_423_1.location = (631.4072265625, -3140.949951171875) - reroute_423_1.mute = False - reroute_423_1.name = 'Reroute.423' - reroute_423_1.use_custom_color = False - reroute_423_1.width = 16.0 - - reroute_393_1 = test_group.nodes.new('NodeReroute') - reroute_393_1.parent = test_group.nodes.get('Frame.012') - reroute_393_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_393_1.hide = False - reroute_393_1.label = 'DO NOT TOUCH' - reroute_393_1.location = (411.4072265625, -1400.949951171875) - reroute_393_1.mute = False - reroute_393_1.name = 'Reroute.393' - reroute_393_1.use_custom_color = False - reroute_393_1.width = 16.0 - - reroute_397_1 = test_group.nodes.new('NodeReroute') - reroute_397_1.parent = test_group.nodes.get('Frame.012') - reroute_397_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_397_1.hide = False - reroute_397_1.label = 'DO NOT TOUCH' - reroute_397_1.location = (411.4072265625, -2640.949951171875) - reroute_397_1.mute = False - reroute_397_1.name = 'Reroute.397' - reroute_397_1.use_custom_color = False - reroute_397_1.width = 16.0 - - reroute_396_1 = test_group.nodes.new('NodeReroute') - reroute_396_1.parent = test_group.nodes.get('Frame.012') - reroute_396_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_396_1.hide = False - reroute_396_1.label = 'DO NOT TOUCH' - reroute_396_1.location = (411.4072265625, -1960.949951171875) - reroute_396_1.mute = False - reroute_396_1.name = 'Reroute.396' - reroute_396_1.use_custom_color = False - reroute_396_1.width = 16.0 - - reroute_395_1 = test_group.nodes.new('NodeReroute') - reroute_395_1.parent = test_group.nodes.get('Frame.012') - reroute_395_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_395_1.hide = False - reroute_395_1.label = 'DO NOT TOUCH' - reroute_395_1.location = (391.4072265625, -1940.949951171875) - reroute_395_1.mute = False - reroute_395_1.name = 'Reroute.395' - reroute_395_1.use_custom_color = False - reroute_395_1.width = 16.0 - - reroute_394_1 = test_group.nodes.new('NodeReroute') - reroute_394_1.parent = test_group.nodes.get('Frame.012') - reroute_394_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_394_1.hide = False - reroute_394_1.label = 'DO NOT TOUCH' - reroute_394_1.location = (391.4072265625, -2060.949951171875) - reroute_394_1.mute = False - reroute_394_1.name = 'Reroute.394' - reroute_394_1.use_custom_color = False - reroute_394_1.width = 16.0 - - reroute_401_1 = test_group.nodes.new('NodeReroute') - reroute_401_1.parent = test_group.nodes.get('Frame.012') - reroute_401_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_401_1.hide = False - reroute_401_1.label = 'DO NOT TOUCH' - reroute_401_1.location = (411.4072265625, -3880.949951171875) - reroute_401_1.mute = False - reroute_401_1.name = 'Reroute.401' - reroute_401_1.use_custom_color = False - reroute_401_1.width = 16.0 - - reroute_400_1 = test_group.nodes.new('NodeReroute') - reroute_400_1.parent = test_group.nodes.get('Frame.012') - reroute_400_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_400_1.hide = False - reroute_400_1.label = 'DO NOT TOUCH' - reroute_400_1.location = (411.4072265625, -3200.949951171875) - reroute_400_1.mute = False - reroute_400_1.name = 'Reroute.400' - reroute_400_1.use_custom_color = False - reroute_400_1.width = 16.0 - - reroute_399_1 = test_group.nodes.new('NodeReroute') - reroute_399_1.parent = test_group.nodes.get('Frame.012') - reroute_399_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_399_1.hide = False - reroute_399_1.label = 'DO NOT TOUCH' - reroute_399_1.location = (391.4072265625, -3180.949951171875) - reroute_399_1.mute = False - reroute_399_1.name = 'Reroute.399' - reroute_399_1.use_custom_color = False - reroute_399_1.width = 16.0 - - reroute_398_1 = test_group.nodes.new('NodeReroute') - reroute_398_1.parent = test_group.nodes.get('Frame.012') - reroute_398_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_398_1.hide = False - reroute_398_1.label = 'DO NOT TOUCH' - reroute_398_1.location = (391.4072265625, -3300.949951171875) - reroute_398_1.mute = False - reroute_398_1.name = 'Reroute.398' - reroute_398_1.use_custom_color = False - reroute_398_1.width = 16.0 - - reroute_403_1 = test_group.nodes.new('NodeReroute') - reroute_403_1.parent = test_group.nodes.get('Frame.012') - reroute_403_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_403_1.hide = False - reroute_403_1.label = 'DO NOT TOUCH' - reroute_403_1.location = (391.4072265625, -4420.9501953125) - reroute_403_1.mute = False - reroute_403_1.name = 'Reroute.403' - reroute_403_1.use_custom_color = False - reroute_403_1.width = 16.0 - - reroute_402_1 = test_group.nodes.new('NodeReroute') - reroute_402_1.parent = test_group.nodes.get('Frame.012') - reroute_402_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_402_1.hide = False - reroute_402_1.label = 'DO NOT TOUCH' - reroute_402_1.location = (391.4072265625, -4540.9501953125) - reroute_402_1.mute = False - reroute_402_1.name = 'Reroute.402' - reroute_402_1.use_custom_color = False - reroute_402_1.width = 16.0 - - reroute_404_1 = test_group.nodes.new('NodeReroute') - reroute_404_1.parent = test_group.nodes.get('Frame.012') - reroute_404_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_404_1.hide = False - reroute_404_1.label = 'DO NOT TOUCH' - reroute_404_1.location = (411.4072265625, -4440.9501953125) - reroute_404_1.mute = False - reroute_404_1.name = 'Reroute.404' - reroute_404_1.use_custom_color = False - reroute_404_1.width = 16.0 - - reroute_405_1 = test_group.nodes.new('NodeReroute') - reroute_405_1.parent = test_group.nodes.get('Frame.012') - reroute_405_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_405_1.hide = False - reroute_405_1.label = 'DO NOT TOUCH' - reroute_405_1.location = (411.4072265625, -5120.9501953125) - reroute_405_1.mute = False - reroute_405_1.name = 'Reroute.405' - reroute_405_1.use_custom_color = False - reroute_405_1.width = 16.0 - - reroute_371_1 = test_group.nodes.new('NodeReroute') - reroute_371_1.parent = test_group.nodes.get('Frame.012') - reroute_371_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_371_1.hide = False - reroute_371_1.label = 'DO NOT TOUCH' - reroute_371_1.location = (411.4072265625, 1079.050048828125) - reroute_371_1.mute = False - reroute_371_1.name = 'Reroute.371' - reroute_371_1.use_custom_color = False - reroute_371_1.width = 16.0 - - reroute_372_1 = test_group.nodes.new('NodeReroute') - reroute_372_1.parent = test_group.nodes.get('Frame.012') - reroute_372_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_372_1.hide = False - reroute_372_1.label = 'DO NOT TOUCH' - reroute_372_1.location = (391.4072265625, 1659.050048828125) - reroute_372_1.mute = False - reroute_372_1.name = 'Reroute.372' - reroute_372_1.use_custom_color = False - reroute_372_1.width = 16.0 - - reroute_373_1 = test_group.nodes.new('NodeReroute') - reroute_373_1.parent = test_group.nodes.get('Frame.012') - reroute_373_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_373_1.hide = False - reroute_373_1.label = 'DO NOT TOUCH' - reroute_373_1.location = (411.4072265625, 1759.050048828125) - reroute_373_1.mute = False - reroute_373_1.name = 'Reroute.373' - reroute_373_1.use_custom_color = False - reroute_373_1.width = 16.0 - - reroute_374_1 = test_group.nodes.new('NodeReroute') - reroute_374_1.parent = test_group.nodes.get('Frame.012') - reroute_374_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_374_1.hide = False - reroute_374_1.label = 'DO NOT TOUCH' - reroute_374_1.location = (391.4072265625, 1779.050048828125) - reroute_374_1.mute = False - reroute_374_1.name = 'Reroute.374' - reroute_374_1.use_custom_color = False - reroute_374_1.width = 16.0 - - reroute_387_1 = test_group.nodes.new('NodeReroute') - reroute_387_1.parent = test_group.nodes.get('Frame.012') - reroute_387_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_387_1.hide = False - reroute_387_1.label = 'DO NOT TOUCH' - reroute_387_1.location = (391.4072265625, 539.050048828125) - reroute_387_1.mute = False - reroute_387_1.name = 'Reroute.387' - reroute_387_1.use_custom_color = False - reroute_387_1.width = 16.0 - - reroute_386_1 = test_group.nodes.new('NodeReroute') - reroute_386_1.parent = test_group.nodes.get('Frame.012') - reroute_386_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_386_1.hide = False - reroute_386_1.label = 'DO NOT TOUCH' - reroute_386_1.location = (391.4072265625, 419.050048828125) - reroute_386_1.mute = False - reroute_386_1.name = 'Reroute.386' - reroute_386_1.use_custom_color = False - reroute_386_1.width = 16.0 - - reroute_388_1 = test_group.nodes.new('NodeReroute') - reroute_388_1.parent = test_group.nodes.get('Frame.012') - reroute_388_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_388_1.hide = False - reroute_388_1.label = 'DO NOT TOUCH' - reroute_388_1.location = (411.4072265625, 519.050048828125) - reroute_388_1.mute = False - reroute_388_1.name = 'Reroute.388' - reroute_388_1.use_custom_color = False - reroute_388_1.width = 16.0 - - reroute_389_1 = test_group.nodes.new('NodeReroute') - reroute_389_1.parent = test_group.nodes.get('Frame.012') - reroute_389_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_389_1.hide = False - reroute_389_1.label = 'DO NOT TOUCH' - reroute_389_1.location = (411.4072265625, -160.949951171875) - reroute_389_1.mute = False - reroute_389_1.name = 'Reroute.389' - reroute_389_1.use_custom_color = False - reroute_389_1.width = 16.0 - - reroute_392_1 = test_group.nodes.new('NodeReroute') - reroute_392_1.parent = test_group.nodes.get('Frame.012') - reroute_392_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_392_1.hide = False - reroute_392_1.label = 'DO NOT TOUCH' - reroute_392_1.location = (411.4072265625, -720.949951171875) - reroute_392_1.mute = False - reroute_392_1.name = 'Reroute.392' - reroute_392_1.use_custom_color = False - reroute_392_1.width = 16.0 - - reroute_390_1 = test_group.nodes.new('NodeReroute') - reroute_390_1.parent = test_group.nodes.get('Frame.012') - reroute_390_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_390_1.hide = False - reroute_390_1.label = 'DO NOT TOUCH' - reroute_390_1.location = (391.4072265625, -820.949951171875) - reroute_390_1.mute = False - reroute_390_1.name = 'Reroute.390' - reroute_390_1.use_custom_color = False - reroute_390_1.width = 16.0 - - reroute_391_1 = test_group.nodes.new('NodeReroute') - reroute_391_1.parent = test_group.nodes.get('Frame.012') - reroute_391_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_391_1.hide = False - reroute_391_1.label = 'DO NOT TOUCH' - reroute_391_1.location = (391.4072265625, -700.949951171875) - reroute_391_1.mute = False - reroute_391_1.name = 'Reroute.391' - reroute_391_1.use_custom_color = False - reroute_391_1.width = 16.0 - - reroute_424_1 = test_group.nodes.new('NodeReroute') - reroute_424_1.parent = test_group.nodes.get('Frame.012') - reroute_424_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_424_1.hide = False - reroute_424_1.label = 'DO NOT TOUCH' - reroute_424_1.location = (611.4072265625, -4380.9501953125) - reroute_424_1.mute = False - reroute_424_1.name = 'Reroute.424' - reroute_424_1.use_custom_color = False - reroute_424_1.width = 16.0 - - reroute_425_1 = test_group.nodes.new('NodeReroute') - reroute_425_1.parent = test_group.nodes.get('Frame.012') - reroute_425_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_425_1.hide = False - reroute_425_1.label = 'DO NOT TOUCH' - reroute_425_1.location = (251.4072265625, 1779.050048828125) - reroute_425_1.mute = False - reroute_425_1.name = 'Reroute.425' - reroute_425_1.use_custom_color = False - reroute_425_1.width = 16.0 - - reroute_442_1 = test_group.nodes.new('NodeReroute') - reroute_442_1.parent = test_group.nodes.get('Frame.012') - reroute_442_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_442_1.hide = False - reroute_442_1.label = 'DO NOT TOUCH' - reroute_442_1.location = (231.4072265625, 539.050048828125) - reroute_442_1.mute = False - reroute_442_1.name = 'Reroute.442' - reroute_442_1.use_custom_color = False - reroute_442_1.width = 16.0 - - reroute_438_1 = test_group.nodes.new('NodeReroute') - reroute_438_1.parent = test_group.nodes.get('Frame.012') - reroute_438_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_438_1.hide = False - reroute_438_1.label = 'DO NOT TOUCH' - reroute_438_1.location = (211.4072265625, -700.949951171875) - reroute_438_1.mute = False - reroute_438_1.name = 'Reroute.438' - reroute_438_1.use_custom_color = False - reroute_438_1.width = 16.0 - - reroute_439_1 = test_group.nodes.new('NodeReroute') - reroute_439_1.parent = test_group.nodes.get('Frame.012') - reroute_439_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_439_1.hide = False - reroute_439_1.label = 'DO NOT TOUCH' - reroute_439_1.location = (191.4072265625, -1940.949951171875) - reroute_439_1.mute = False - reroute_439_1.name = 'Reroute.439' - reroute_439_1.use_custom_color = False - reroute_439_1.width = 16.0 - - reroute_440_1 = test_group.nodes.new('NodeReroute') - reroute_440_1.parent = test_group.nodes.get('Frame.012') - reroute_440_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_440_1.hide = False - reroute_440_1.label = 'DO NOT TOUCH' - reroute_440_1.location = (171.4072265625, -3180.949951171875) - reroute_440_1.mute = False - reroute_440_1.name = 'Reroute.440' - reroute_440_1.use_custom_color = False - reroute_440_1.width = 16.0 - - reroute_441_1 = test_group.nodes.new('NodeReroute') - reroute_441_1.parent = test_group.nodes.get('Frame.012') - reroute_441_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_441_1.hide = False - reroute_441_1.label = 'DO NOT TOUCH' - reroute_441_1.location = (151.4072265625, -4420.9501953125) - reroute_441_1.mute = False - reroute_441_1.name = 'Reroute.441' - reroute_441_1.use_custom_color = False - reroute_441_1.width = 16.0 - - reroute_426_1 = test_group.nodes.new('NodeReroute') - reroute_426_1.parent = test_group.nodes.get('Frame.012') - reroute_426_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_426_1.hide = False - reroute_426_1.label = 'DO NOT TOUCH' - reroute_426_1.location = (251.4072265625, -1273.06005859375) - reroute_426_1.mute = False - reroute_426_1.name = 'Reroute.426' - reroute_426_1.use_custom_color = False - reroute_426_1.width = 16.0 - - reroute_428_1 = test_group.nodes.new('NodeReroute') - reroute_428_1.parent = test_group.nodes.get('Frame.012') - reroute_428_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_428_1.hide = False - reroute_428_1.label = 'DO NOT TOUCH' - reroute_428_1.location = (211.4072265625, -1313.06005859375) - reroute_428_1.mute = False - reroute_428_1.name = 'Reroute.428' - reroute_428_1.use_custom_color = False - reroute_428_1.width = 16.0 - - reroute_430_1 = test_group.nodes.new('NodeReroute') - reroute_430_1.parent = test_group.nodes.get('Frame.012') - reroute_430_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_430_1.hide = False - reroute_430_1.label = 'DO NOT TOUCH' - reroute_430_1.location = (171.4072265625, -1353.06005859375) - reroute_430_1.mute = False - reroute_430_1.name = 'Reroute.430' - reroute_430_1.use_custom_color = False - reroute_430_1.width = 16.0 - - reroute_431_1 = test_group.nodes.new('NodeReroute') - reroute_431_1.parent = test_group.nodes.get('Frame.012') - reroute_431_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_431_1.hide = False - reroute_431_1.label = 'DO NOT TOUCH' - reroute_431_1.location = (151.4072265625, -1373.06005859375) - reroute_431_1.mute = False - reroute_431_1.name = 'Reroute.431' - reroute_431_1.use_custom_color = False - reroute_431_1.width = 16.0 - - reroute_427_1 = test_group.nodes.new('NodeReroute') - reroute_427_1.parent = test_group.nodes.get('Frame.012') - reroute_427_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_427_1.hide = False - reroute_427_1.label = 'DO NOT TOUCH' - reroute_427_1.location = (231.4072265625, -1293.06005859375) - reroute_427_1.mute = False - reroute_427_1.name = 'Reroute.427' - reroute_427_1.use_custom_color = False - reroute_427_1.width = 16.0 - - reroute_429_1 = test_group.nodes.new('NodeReroute') - reroute_429_1.parent = test_group.nodes.get('Frame.012') - reroute_429_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_429_1.hide = False - reroute_429_1.label = 'DO NOT TOUCH' - reroute_429_1.location = (191.4072265625, -1333.06005859375) - reroute_429_1.mute = False - reroute_429_1.name = 'Reroute.429' - reroute_429_1.use_custom_color = False - reroute_429_1.width = 16.0 - - reroute_460_1 = test_group.nodes.new('NodeReroute') - reroute_460_1.parent = test_group.nodes.get('Frame.012') - reroute_460_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_460_1.hide = False - reroute_460_1.label = 'DO NOT TOUCH' - reroute_460_1.location = (-68.5927734375, 2019.050048828125) - reroute_460_1.mute = False - reroute_460_1.name = 'Reroute.460' - reroute_460_1.use_custom_color = False - reroute_460_1.width = 16.0 - - reroute_455_1 = test_group.nodes.new('NodeReroute') - reroute_455_1.parent = test_group.nodes.get('Frame.012') - reroute_455_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_455_1.hide = False - reroute_455_1.label = 'DO NOT TOUCH' - reroute_455_1.location = (-88.5927734375, 779.050048828125) - reroute_455_1.mute = False - reroute_455_1.name = 'Reroute.455' - reroute_455_1.use_custom_color = False - reroute_455_1.width = 16.0 - - reroute_456_1 = test_group.nodes.new('NodeReroute') - reroute_456_1.parent = test_group.nodes.get('Frame.012') - reroute_456_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_456_1.hide = False - reroute_456_1.label = 'DO NOT TOUCH' - reroute_456_1.location = (-108.5927734375, -460.949951171875) - reroute_456_1.mute = False - reroute_456_1.name = 'Reroute.456' - reroute_456_1.use_custom_color = False - reroute_456_1.width = 16.0 - - reroute_457_1 = test_group.nodes.new('NodeReroute') - reroute_457_1.parent = test_group.nodes.get('Frame.012') - reroute_457_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_457_1.hide = False - reroute_457_1.label = 'DO NOT TOUCH' - reroute_457_1.location = (-128.5927734375, -1700.949951171875) - reroute_457_1.mute = False - reroute_457_1.name = 'Reroute.457' - reroute_457_1.use_custom_color = False - reroute_457_1.width = 16.0 - - reroute_458_1 = test_group.nodes.new('NodeReroute') - reroute_458_1.parent = test_group.nodes.get('Frame.012') - reroute_458_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_458_1.hide = False - reroute_458_1.label = 'DO NOT TOUCH' - reroute_458_1.location = (-148.5927734375, -2940.949951171875) - reroute_458_1.mute = False - reroute_458_1.name = 'Reroute.458' - reroute_458_1.use_custom_color = False - reroute_458_1.width = 16.0 - - reroute_443_1 = test_group.nodes.new('NodeReroute') - reroute_443_1.parent = test_group.nodes.get('Frame.012') - reroute_443_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_443_1.hide = False - reroute_443_1.label = 'DO NOT TOUCH' - reroute_443_1.location = (-68.5927734375, -840.949951171875) - reroute_443_1.mute = False - reroute_443_1.name = 'Reroute.443' - reroute_443_1.use_custom_color = False - reroute_443_1.width = 16.0 - - reroute_444_1 = test_group.nodes.new('NodeReroute') - reroute_444_1.parent = test_group.nodes.get('Frame.012') - reroute_444_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_444_1.hide = False - reroute_444_1.label = 'DO NOT TOUCH' - reroute_444_1.location = (-88.5927734375, -860.949951171875) - reroute_444_1.mute = False - reroute_444_1.name = 'Reroute.444' - reroute_444_1.use_custom_color = False - reroute_444_1.width = 16.0 - - reroute_445_1 = test_group.nodes.new('NodeReroute') - reroute_445_1.parent = test_group.nodes.get('Frame.012') - reroute_445_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_445_1.hide = False - reroute_445_1.label = 'DO NOT TOUCH' - reroute_445_1.location = (-108.5927734375, -880.949951171875) - reroute_445_1.mute = False - reroute_445_1.name = 'Reroute.445' - reroute_445_1.use_custom_color = False - reroute_445_1.width = 16.0 - - reroute_446_1 = test_group.nodes.new('NodeReroute') - reroute_446_1.parent = test_group.nodes.get('Frame.012') - reroute_446_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_446_1.hide = False - reroute_446_1.label = 'DO NOT TOUCH' - reroute_446_1.location = (-128.5927734375, -900.949951171875) - reroute_446_1.mute = False - reroute_446_1.name = 'Reroute.446' - reroute_446_1.use_custom_color = False - reroute_446_1.width = 16.0 - - reroute_447_1 = test_group.nodes.new('NodeReroute') - reroute_447_1.parent = test_group.nodes.get('Frame.012') - reroute_447_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_447_1.hide = False - reroute_447_1.label = 'DO NOT TOUCH' - reroute_447_1.location = (-148.5927734375, -920.949951171875) - reroute_447_1.mute = False - reroute_447_1.name = 'Reroute.447' - reroute_447_1.use_custom_color = False - reroute_447_1.width = 16.0 - - reroute_454_1 = test_group.nodes.new('NodeReroute') - reroute_454_1.parent = test_group.nodes.get('Frame.012') - reroute_454_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_454_1.hide = False - reroute_454_1.label = 'DO NOT TOUCH' - reroute_454_1.location = (-188.5927734375, -960.949951171875) - reroute_454_1.mute = False - reroute_454_1.name = 'Reroute.454' - reroute_454_1.use_custom_color = False - reroute_454_1.width = 16.0 - - reroute_449_1 = test_group.nodes.new('NodeReroute') - reroute_449_1.parent = test_group.nodes.get('Frame.012') - reroute_449_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_449_1.hide = False - reroute_449_1.label = 'DO NOT TOUCH' - reroute_449_1.location = (-208.5927734375, -980.949951171875) - reroute_449_1.mute = False - reroute_449_1.name = 'Reroute.449' - reroute_449_1.use_custom_color = False - reroute_449_1.width = 16.0 - - reroute_450_1 = test_group.nodes.new('NodeReroute') - reroute_450_1.parent = test_group.nodes.get('Frame.012') - reroute_450_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_450_1.hide = False - reroute_450_1.label = 'DO NOT TOUCH' - reroute_450_1.location = (-228.5927734375, -1000.949951171875) - reroute_450_1.mute = False - reroute_450_1.name = 'Reroute.450' - reroute_450_1.use_custom_color = False - reroute_450_1.width = 16.0 - - reroute_451_1 = test_group.nodes.new('NodeReroute') - reroute_451_1.parent = test_group.nodes.get('Frame.012') - reroute_451_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_451_1.hide = False - reroute_451_1.label = 'DO NOT TOUCH' - reroute_451_1.location = (-248.5927734375, -1020.949951171875) - reroute_451_1.mute = False - reroute_451_1.name = 'Reroute.451' - reroute_451_1.use_custom_color = False - reroute_451_1.width = 16.0 - - reroute_452_1 = test_group.nodes.new('NodeReroute') - reroute_452_1.parent = test_group.nodes.get('Frame.012') - reroute_452_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_452_1.hide = False - reroute_452_1.label = 'DO NOT TOUCH' - reroute_452_1.location = (-268.5927734375, -1040.949951171875) - reroute_452_1.mute = False - reroute_452_1.name = 'Reroute.452' - reroute_452_1.use_custom_color = False - reroute_452_1.width = 16.0 - - reroute_453_1 = test_group.nodes.new('NodeReroute') - reroute_453_1.parent = test_group.nodes.get('Frame.012') - reroute_453_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_453_1.hide = False - reroute_453_1.label = 'DO NOT TOUCH' - reroute_453_1.location = (-288.5927734375, -1060.949951171875) - reroute_453_1.mute = False - reroute_453_1.name = 'Reroute.453' - reroute_453_1.use_custom_color = False - reroute_453_1.width = 16.0 - - reroute_467_1 = test_group.nodes.new('NodeReroute') - reroute_467_1.parent = test_group.nodes.get('Frame.012') - reroute_467_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_467_1.hide = False - reroute_467_1.label = 'DO NOT TOUCH' - reroute_467_1.location = (-208.5927734375, 579.050048828125) - reroute_467_1.mute = False - reroute_467_1.name = 'Reroute.467' - reroute_467_1.use_custom_color = False - reroute_467_1.width = 16.0 - - reroute_468_1 = test_group.nodes.new('NodeReroute') - reroute_468_1.parent = test_group.nodes.get('Frame.012') - reroute_468_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_468_1.hide = False - reroute_468_1.label = 'DO NOT TOUCH' - reroute_468_1.location = (-228.5927734375, -680.949951171875) - reroute_468_1.mute = False - reroute_468_1.name = 'Reroute.468' - reroute_468_1.use_custom_color = False - reroute_468_1.width = 16.0 - - reroute_469_1 = test_group.nodes.new('NodeReroute') - reroute_469_1.parent = test_group.nodes.get('Frame.012') - reroute_469_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_469_1.hide = False - reroute_469_1.label = 'DO NOT TOUCH' - reroute_469_1.location = (-248.5927734375, -1920.949951171875) - reroute_469_1.mute = False - reroute_469_1.name = 'Reroute.469' - reroute_469_1.use_custom_color = False - reroute_469_1.width = 16.0 - - reroute_470_1 = test_group.nodes.new('NodeReroute') - reroute_470_1.parent = test_group.nodes.get('Frame.012') - reroute_470_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_470_1.hide = False - reroute_470_1.label = 'DO NOT TOUCH' - reroute_470_1.location = (-268.5927734375, -3160.949951171875) - reroute_470_1.mute = False - reroute_470_1.name = 'Reroute.470' - reroute_470_1.use_custom_color = False - reroute_470_1.width = 16.0 - - reroute_471_1 = test_group.nodes.new('NodeReroute') - reroute_471_1.parent = test_group.nodes.get('Frame.012') - reroute_471_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_471_1.hide = False - reroute_471_1.label = 'DO NOT TOUCH' - reroute_471_1.location = (-288.5927734375, -4400.9501953125) - reroute_471_1.mute = False - reroute_471_1.name = 'Reroute.471' - reroute_471_1.use_custom_color = False - reroute_471_1.width = 16.0 - - reroute_334_1 = test_group.nodes.new('NodeReroute') - reroute_334_1.parent = test_group.nodes.get('Frame.012') - reroute_334_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_334_1.hide = False - reroute_334_1.label = 'DO NOT TOUCH' - reroute_334_1.location = (711.4072265625, 359.050048828125) - reroute_334_1.mute = False - reroute_334_1.name = 'Reroute.334' - reroute_334_1.use_custom_color = False - reroute_334_1.width = 16.0 - - reroute_410_1 = test_group.nodes.new('NodeReroute') - reroute_410_1.parent = test_group.nodes.get('Frame.012') - reroute_410_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_410_1.hide = False - reroute_410_1.label = 'DO NOT TOUCH' - reroute_410_1.location = (691.4072265625, 339.050048828125) - reroute_410_1.mute = False - reroute_410_1.name = 'Reroute.410' - reroute_410_1.use_custom_color = False - reroute_410_1.width = 16.0 - - reroute_411_1 = test_group.nodes.new('NodeReroute') - reroute_411_1.parent = test_group.nodes.get('Frame.012') - reroute_411_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_411_1.hide = False - reroute_411_1.label = 'DO NOT TOUCH' - reroute_411_1.location = (671.4072265625, 319.050048828125) - reroute_411_1.mute = False - reroute_411_1.name = 'Reroute.411' - reroute_411_1.use_custom_color = False - reroute_411_1.width = 16.0 - - reroute_412_1 = test_group.nodes.new('NodeReroute') - reroute_412_1.parent = test_group.nodes.get('Frame.012') - reroute_412_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_412_1.hide = False - reroute_412_1.label = 'DO NOT TOUCH' - reroute_412_1.location = (651.4072265625, 299.050048828125) - reroute_412_1.mute = False - reroute_412_1.name = 'Reroute.412' - reroute_412_1.use_custom_color = False - reroute_412_1.width = 16.0 - - reroute_413_1 = test_group.nodes.new('NodeReroute') - reroute_413_1.parent = test_group.nodes.get('Frame.012') - reroute_413_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_413_1.hide = False - reroute_413_1.label = 'DO NOT TOUCH' - reroute_413_1.location = (631.4072265625, 279.050048828125) - reroute_413_1.mute = False - reroute_413_1.name = 'Reroute.413' - reroute_413_1.use_custom_color = False - reroute_413_1.width = 16.0 - - reroute_414_1 = test_group.nodes.new('NodeReroute') - reroute_414_1.parent = test_group.nodes.get('Frame.012') - reroute_414_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_414_1.hide = False - reroute_414_1.label = 'DO NOT TOUCH' - reroute_414_1.location = (611.4072265625, 259.050048828125) - reroute_414_1.mute = False - reroute_414_1.name = 'Reroute.414' - reroute_414_1.use_custom_color = False - reroute_414_1.width = 16.0 - - reroute_485_1 = test_group.nodes.new('NodeReroute') - reroute_485_1.parent = test_group.nodes.get('Frame.012') - reroute_485_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_485_1.hide = False - reroute_485_1.label = 'DO NOT TOUCH' - reroute_485_1.location = (-388.5927734375, 359.050048828125) - reroute_485_1.mute = False - reroute_485_1.name = 'Reroute.485' - reroute_485_1.use_custom_color = False - reroute_485_1.width = 16.0 - - reroute_486_1 = test_group.nodes.new('NodeReroute') - reroute_486_1.parent = test_group.nodes.get('Frame.012') - reroute_486_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_486_1.hide = False - reroute_486_1.label = 'DO NOT TOUCH' - reroute_486_1.location = (-408.5927734375, -880.949951171875) - reroute_486_1.mute = False - reroute_486_1.name = 'Reroute.486' - reroute_486_1.use_custom_color = False - reroute_486_1.width = 16.0 - - reroute_488_1 = test_group.nodes.new('NodeReroute') - reroute_488_1.parent = test_group.nodes.get('Frame.012') - reroute_488_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_488_1.hide = False - reroute_488_1.label = 'DO NOT TOUCH' - reroute_488_1.location = (-448.5927734375, -3360.949951171875) - reroute_488_1.mute = False - reroute_488_1.name = 'Reroute.488' - reroute_488_1.use_custom_color = False - reroute_488_1.width = 16.0 - - reroute_489_1 = test_group.nodes.new('NodeReroute') - reroute_489_1.parent = test_group.nodes.get('Frame.012') - reroute_489_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_489_1.hide = False - reroute_489_1.label = 'DO NOT TOUCH' - reroute_489_1.location = (-468.5927734375, -4600.9501953125) - reroute_489_1.mute = False - reroute_489_1.name = 'Reroute.489' - reroute_489_1.use_custom_color = False - reroute_489_1.width = 16.0 - - reroute_487_1 = test_group.nodes.new('NodeReroute') - reroute_487_1.parent = test_group.nodes.get('Frame.012') - reroute_487_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_487_1.hide = False - reroute_487_1.label = 'DO NOT TOUCH' - reroute_487_1.location = (-428.5927734375, -2120.949951171875) - reroute_487_1.mute = False - reroute_487_1.name = 'Reroute.487' - reroute_487_1.use_custom_color = False - reroute_487_1.width = 16.0 - - reroute_369_1 = test_group.nodes.new('NodeReroute') - reroute_369_1.parent = test_group.nodes.get('Frame.012') - reroute_369_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_369_1.hide = False - reroute_369_1.label = 'DO NOT TOUCH' - reroute_369_1.location = (-368.5927734375, -2160.949951171875) - reroute_369_1.mute = False - reroute_369_1.name = 'Reroute.369' - reroute_369_1.use_custom_color = False - reroute_369_1.width = 16.0 - - reroute_480_1 = test_group.nodes.new('NodeReroute') - reroute_480_1.parent = test_group.nodes.get('Frame.012') - reroute_480_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_480_1.hide = False - reroute_480_1.label = 'DO NOT TOUCH' - reroute_480_1.location = (-388.5927734375, -2180.949951171875) - reroute_480_1.mute = False - reroute_480_1.name = 'Reroute.480' - reroute_480_1.use_custom_color = False - reroute_480_1.width = 16.0 - - reroute_481_1 = test_group.nodes.new('NodeReroute') - reroute_481_1.parent = test_group.nodes.get('Frame.012') - reroute_481_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_481_1.hide = False - reroute_481_1.label = 'DO NOT TOUCH' - reroute_481_1.location = (-408.5927734375, -2200.949951171875) - reroute_481_1.mute = False - reroute_481_1.name = 'Reroute.481' - reroute_481_1.use_custom_color = False - reroute_481_1.width = 16.0 - - reroute_482_1 = test_group.nodes.new('NodeReroute') - reroute_482_1.parent = test_group.nodes.get('Frame.012') - reroute_482_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_482_1.hide = False - reroute_482_1.label = 'DO NOT TOUCH' - reroute_482_1.location = (-428.5927734375, -2220.949951171875) - reroute_482_1.mute = False - reroute_482_1.name = 'Reroute.482' - reroute_482_1.use_custom_color = False - reroute_482_1.width = 16.0 - - reroute_483_1 = test_group.nodes.new('NodeReroute') - reroute_483_1.parent = test_group.nodes.get('Frame.012') - reroute_483_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_483_1.hide = False - reroute_483_1.label = 'DO NOT TOUCH' - reroute_483_1.location = (-448.5927734375, -2240.949951171875) - reroute_483_1.mute = False - reroute_483_1.name = 'Reroute.483' - reroute_483_1.use_custom_color = False - reroute_483_1.width = 16.0 - - reroute_484_1 = test_group.nodes.new('NodeReroute') - reroute_484_1.parent = test_group.nodes.get('Frame.012') - reroute_484_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_484_1.hide = False - reroute_484_1.label = 'DO NOT TOUCH' - reroute_484_1.location = (-468.5927734375, -2260.949951171875) - reroute_484_1.mute = False - reroute_484_1.name = 'Reroute.484' - reroute_484_1.use_custom_color = False - reroute_484_1.width = 16.0 - - reroute_370_1 = test_group.nodes.new('NodeReroute') - reroute_370_1.parent = test_group.nodes.get('Frame.012') - reroute_370_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_370_1.hide = False - reroute_370_1.label = 'DO NOT TOUCH' - reroute_370_1.location = (-368.5927734375, 1599.050048828125) - reroute_370_1.mute = False - reroute_370_1.name = 'Reroute.370' - reroute_370_1.use_custom_color = False - reroute_370_1.width = 16.0 - - reroute_500_1 = test_group.nodes.new('NodeReroute') - reroute_500_1.parent = test_group.nodes.get('Frame.012') - reroute_500_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_500_1.hide = False - reroute_500_1.label = 'DO NOT TOUCH' - reroute_500_1.location = (-708.5927734375, -3760.949951171875) - reroute_500_1.mute = False - reroute_500_1.name = 'Reroute.500' - reroute_500_1.use_custom_color = False - reroute_500_1.width = 16.0 - - reroute_501_1 = test_group.nodes.new('NodeReroute') - reroute_501_1.parent = test_group.nodes.get('Frame.012') - reroute_501_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_501_1.hide = False - reroute_501_1.label = 'DO NOT TOUCH' - reroute_501_1.location = (-728.5927734375, -3780.949951171875) - reroute_501_1.mute = False - reroute_501_1.name = 'Reroute.501' - reroute_501_1.use_custom_color = False - reroute_501_1.width = 16.0 - - reroute_496_1 = test_group.nodes.new('NodeReroute') - reroute_496_1.parent = test_group.nodes.get('Frame.012') - reroute_496_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_496_1.hide = False - reroute_496_1.label = 'DO NOT TOUCH' - reroute_496_1.location = (-748.5927734375, -3800.949951171875) - reroute_496_1.mute = False - reroute_496_1.name = 'Reroute.496' - reroute_496_1.use_custom_color = False - reroute_496_1.width = 16.0 - - reroute_497_1 = test_group.nodes.new('NodeReroute') - reroute_497_1.parent = test_group.nodes.get('Frame.012') - reroute_497_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_497_1.hide = False - reroute_497_1.label = 'DO NOT TOUCH' - reroute_497_1.location = (-768.5927734375, -3820.949951171875) - reroute_497_1.mute = False - reroute_497_1.name = 'Reroute.497' - reroute_497_1.use_custom_color = False - reroute_497_1.width = 16.0 - - reroute_498_1 = test_group.nodes.new('NodeReroute') - reroute_498_1.parent = test_group.nodes.get('Frame.012') - reroute_498_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_498_1.hide = False - reroute_498_1.label = 'DO NOT TOUCH' - reroute_498_1.location = (-788.5927734375, -3840.949951171875) - reroute_498_1.mute = False - reroute_498_1.name = 'Reroute.498' - reroute_498_1.use_custom_color = False - reroute_498_1.width = 16.0 - - reroute_499_1 = test_group.nodes.new('NodeReroute') - reroute_499_1.parent = test_group.nodes.get('Frame.012') - reroute_499_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_499_1.hide = False - reroute_499_1.label = 'DO NOT TOUCH' - reroute_499_1.location = (-808.5927734375, -3860.949951171875) - reroute_499_1.mute = False - reroute_499_1.name = 'Reroute.499' - reroute_499_1.use_custom_color = False - reroute_499_1.width = 16.0 - - reroute_503_1 = test_group.nodes.new('NodeReroute') - reroute_503_1.parent = test_group.nodes.get('Frame.012') - reroute_503_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_503_1.hide = False - reroute_503_1.label = 'DO NOT TOUCH' - reroute_503_1.location = (-708.5927734375, 1179.050048828125) - reroute_503_1.mute = False - reroute_503_1.name = 'Reroute.503' - reroute_503_1.use_custom_color = False - reroute_503_1.width = 16.0 - - reroute_502_1 = test_group.nodes.new('NodeReroute') - reroute_502_1.parent = test_group.nodes.get('Frame.012') - reroute_502_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_502_1.hide = False - reroute_502_1.label = 'DO NOT TOUCH' - reroute_502_1.location = (-728.5927734375, -60.949951171875) - reroute_502_1.mute = False - reroute_502_1.name = 'Reroute.502' - reroute_502_1.use_custom_color = False - reroute_502_1.width = 16.0 - - reroute_505_1 = test_group.nodes.new('NodeReroute') - reroute_505_1.parent = test_group.nodes.get('Frame.012') - reroute_505_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_505_1.hide = False - reroute_505_1.label = 'DO NOT TOUCH' - reroute_505_1.location = (-768.5927734375, -2540.949951171875) - reroute_505_1.mute = False - reroute_505_1.name = 'Reroute.505' - reroute_505_1.use_custom_color = False - reroute_505_1.width = 16.0 - - reroute_504_1 = test_group.nodes.new('NodeReroute') - reroute_504_1.parent = test_group.nodes.get('Frame.012') - reroute_504_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_504_1.hide = False - reroute_504_1.label = 'DO NOT TOUCH' - reroute_504_1.location = (-748.5927734375, -1300.949951171875) - reroute_504_1.mute = False - reroute_504_1.name = 'Reroute.504' - reroute_504_1.use_custom_color = False - reroute_504_1.width = 16.0 - - reroute_506_1 = test_group.nodes.new('NodeReroute') - reroute_506_1.parent = test_group.nodes.get('Frame.012') - reroute_506_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_506_1.hide = False - reroute_506_1.label = 'DO NOT TOUCH' - reroute_506_1.location = (-788.5927734375, -3780.949951171875) - reroute_506_1.mute = False - reroute_506_1.name = 'Reroute.506' - reroute_506_1.use_custom_color = False - reroute_506_1.width = 16.0 - - reroute_507_1 = test_group.nodes.new('NodeReroute') - reroute_507_1.parent = test_group.nodes.get('Frame.012') - reroute_507_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_507_1.hide = False - reroute_507_1.label = 'DO NOT TOUCH' - reroute_507_1.location = (-808.5927734375, -5020.9501953125) - reroute_507_1.mute = False - reroute_507_1.name = 'Reroute.507' - reroute_507_1.use_custom_color = False - reroute_507_1.width = 16.0 - - reroute_472_1 = test_group.nodes.new('NodeReroute') - reroute_472_1.parent = test_group.nodes.get('Frame.012') - reroute_472_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_472_1.hide = False - reroute_472_1.label = 'DO NOT TOUCH' - reroute_472_1.location = (-188.5927734375, 1839.050048828125) - reroute_472_1.mute = False - reroute_472_1.name = 'Reroute.472' - reroute_472_1.use_custom_color = False - reroute_472_1.width = 16.0 - - reroute_495_1 = test_group.nodes.new('NodeReroute') - reroute_495_1.parent = test_group.nodes.get('Frame.012') - reroute_495_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_495_1.hide = False - reroute_495_1.label = 'DO NOT TOUCH' - reroute_495_1.location = (-1048.5927734375, -5200.9501953125) - reroute_495_1.mute = False - reroute_495_1.name = 'Reroute.495' - reroute_495_1.use_custom_color = False - reroute_495_1.width = 16.0 - - reroute_514_1 = test_group.nodes.new('NodeReroute') - reroute_514_1.parent = test_group.nodes.get('Frame.012') - reroute_514_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_514_1.hide = False - reroute_514_1.label = 'DO NOT TOUCH' - reroute_514_1.location = (-1068.5927734375, -5220.9501953125) - reroute_514_1.mute = False - reroute_514_1.name = 'Reroute.514' - reroute_514_1.use_custom_color = False - reroute_514_1.width = 16.0 - - reroute_515_1 = test_group.nodes.new('NodeReroute') - reroute_515_1.parent = test_group.nodes.get('Frame.012') - reroute_515_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_515_1.hide = False - reroute_515_1.label = 'DO NOT TOUCH' - reroute_515_1.location = (-1088.5927734375, -5240.9501953125) - reroute_515_1.mute = False - reroute_515_1.name = 'Reroute.515' - reroute_515_1.use_custom_color = False - reroute_515_1.width = 16.0 - - reroute_516_1 = test_group.nodes.new('NodeReroute') - reroute_516_1.parent = test_group.nodes.get('Frame.012') - reroute_516_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_516_1.hide = False - reroute_516_1.label = 'DO NOT TOUCH' - reroute_516_1.location = (-1108.5927734375, -5260.9501953125) - reroute_516_1.mute = False - reroute_516_1.name = 'Reroute.516' - reroute_516_1.use_custom_color = False - reroute_516_1.width = 16.0 - - reroute_517_1 = test_group.nodes.new('NodeReroute') - reroute_517_1.parent = test_group.nodes.get('Frame.012') - reroute_517_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_517_1.hide = False - reroute_517_1.label = 'DO NOT TOUCH' - reroute_517_1.location = (-1128.5927734375, -5280.9501953125) - reroute_517_1.mute = False - reroute_517_1.name = 'Reroute.517' - reroute_517_1.use_custom_color = False - reroute_517_1.width = 16.0 - - reroute_524_1 = test_group.nodes.new('NodeReroute') - reroute_524_1.parent = test_group.nodes.get('Frame.012') - reroute_524_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_524_1.hide = False - reroute_524_1.label = 'DO NOT TOUCH' - reroute_524_1.location = (-1048.5927734375, 1519.050048828125) - reroute_524_1.mute = False - reroute_524_1.name = 'Reroute.524' - reroute_524_1.use_custom_color = False - reroute_524_1.width = 16.0 - - reroute_519_1 = test_group.nodes.new('NodeReroute') - reroute_519_1.parent = test_group.nodes.get('Frame.012') - reroute_519_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_519_1.hide = False - reroute_519_1.label = 'DO NOT TOUCH' - reroute_519_1.location = (-1068.5927734375, 259.050048828125) - reroute_519_1.mute = False - reroute_519_1.name = 'Reroute.519' - reroute_519_1.use_custom_color = False - reroute_519_1.width = 16.0 - - reroute_520_1 = test_group.nodes.new('NodeReroute') - reroute_520_1.parent = test_group.nodes.get('Frame.012') - reroute_520_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_520_1.hide = False - reroute_520_1.label = 'DO NOT TOUCH' - reroute_520_1.location = (-1088.5927734375, -980.949951171875) - reroute_520_1.mute = False - reroute_520_1.name = 'Reroute.520' - reroute_520_1.use_custom_color = False - reroute_520_1.width = 16.0 - - reroute_522_1 = test_group.nodes.new('NodeReroute') - reroute_522_1.parent = test_group.nodes.get('Frame.012') - reroute_522_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_522_1.hide = False - reroute_522_1.label = 'DO NOT TOUCH' - reroute_522_1.location = (-1128.5927734375, -3460.949951171875) - reroute_522_1.mute = False - reroute_522_1.name = 'Reroute.522' - reroute_522_1.use_custom_color = False - reroute_522_1.width = 16.0 - - reroute_521_1 = test_group.nodes.new('NodeReroute') - reroute_521_1.parent = test_group.nodes.get('Frame.012') - reroute_521_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_521_1.hide = False - reroute_521_1.label = 'DO NOT TOUCH' - reroute_521_1.location = (-1108.5927734375, -2220.949951171875) - reroute_521_1.mute = False - reroute_521_1.name = 'Reroute.521' - reroute_521_1.use_custom_color = False - reroute_521_1.width = 16.0 - - reroute_448_1 = test_group.nodes.new('NodeReroute') - reroute_448_1.parent = test_group.nodes.get('Frame.012') - reroute_448_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_448_1.hide = False - reroute_448_1.label = 'DO NOT TOUCH' - reroute_448_1.location = (-168.5927734375, -940.949951171875) - reroute_448_1.mute = False - reroute_448_1.name = 'Reroute.448' - reroute_448_1.use_custom_color = False - reroute_448_1.width = 16.0 - - reroute_459_1 = test_group.nodes.new('NodeReroute') - reroute_459_1.parent = test_group.nodes.get('Frame.012') - reroute_459_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - reroute_459_1.hide = False - reroute_459_1.label = 'DO NOT TOUCH' - reroute_459_1.location = (-168.5927734375, -4180.9501953125) - reroute_459_1.mute = False - reroute_459_1.name = 'Reroute.459' - reroute_459_1.use_custom_color = False - reroute_459_1.width = 16.0 - - combine_xyz_031_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_031_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_031_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_031_1.hide = False - combine_xyz_031_1.label = 'DO NOT TOUCH' - combine_xyz_031_1.location = (-628.5927734375, 1639.050048828125) - combine_xyz_031_1.mute = False - combine_xyz_031_1.name = 'Combine XYZ.031' - combine_xyz_031_1.use_custom_color = False - combine_xyz_031_1.width = 127.601318359375 - combine_xyz_031_1.inputs[0].default_value = 0.0 - combine_xyz_031_1.inputs[1].default_value = 0.0 - combine_xyz_031_1.inputs[2].default_value = 0.0 - combine_xyz_031_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_030_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_030_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_030_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_030_1.hide = False - combine_xyz_030_1.label = 'DO NOT TOUCH' - combine_xyz_030_1.location = (-28.5927734375, 1819.050048828125) - combine_xyz_030_1.mute = False - combine_xyz_030_1.name = 'Combine XYZ.030' - combine_xyz_030_1.use_custom_color = False - combine_xyz_030_1.width = 125.422119140625 - combine_xyz_030_1.inputs[0].default_value = 0.0 - combine_xyz_030_1.inputs[1].default_value = 0.0 - combine_xyz_030_1.inputs[2].default_value = 0.0 - combine_xyz_030_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_1.hide = False - combine_xyz_1.label = 'DO NOT TOUCH' - combine_xyz_1.location = (431.4072265625, 1979.050048828125) - combine_xyz_1.mute = False - combine_xyz_1.name = 'Combine XYZ' - combine_xyz_1.use_custom_color = False - combine_xyz_1.width = 116.125 - combine_xyz_1.inputs[0].default_value = 0.0 - combine_xyz_1.inputs[1].default_value = 0.0 - combine_xyz_1.inputs[2].default_value = 0.0 - combine_xyz_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_012_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_012_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_012_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_012_1.hide = False - combine_xyz_012_1.label = 'DO NOT TOUCH' - combine_xyz_012_1.location = (1171.4072265625, 2199.050048828125) - combine_xyz_012_1.mute = False - combine_xyz_012_1.name = 'Combine XYZ.012' - combine_xyz_012_1.use_custom_color = False - combine_xyz_012_1.width = 123.68994140625 - combine_xyz_012_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_012_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_012_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_012_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_013_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_013_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_013_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_013_1.hide = False - combine_xyz_013_1.label = 'DO NOT TOUCH' - combine_xyz_013_1.location = (1171.4072265625, 2079.050048828125) - combine_xyz_013_1.mute = False - combine_xyz_013_1.name = 'Combine XYZ.013' - combine_xyz_013_1.use_custom_color = False - combine_xyz_013_1.width = 123.616455078125 - combine_xyz_013_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_013_1.inputs[1].default_value = 0.0 - combine_xyz_013_1.inputs[2].default_value = 0.0 - combine_xyz_013_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_020_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_020_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_020_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_020_1.hide = False - combine_xyz_020_1.label = 'DO NOT TOUCH' - combine_xyz_020_1.location = (1171.4072265625, 1959.050048828125) - combine_xyz_020_1.mute = False - combine_xyz_020_1.name = 'Combine XYZ.020' - combine_xyz_020_1.use_custom_color = False - combine_xyz_020_1.width = 124.859375 - combine_xyz_020_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_020_1.inputs[1].default_value = 0.0 - combine_xyz_020_1.inputs[2].default_value = 0.0 - combine_xyz_020_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_001_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_001_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_001_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_001_1.hide = False - combine_xyz_001_1.label = 'DO NOT TOUCH' - combine_xyz_001_1.location = (431.4072265625, 1859.050048828125) - combine_xyz_001_1.mute = False - combine_xyz_001_1.name = 'Combine XYZ.001' - combine_xyz_001_1.use_custom_color = False - combine_xyz_001_1.width = 117.023681640625 - combine_xyz_001_1.inputs[0].default_value = 0.0 - combine_xyz_001_1.inputs[1].default_value = 0.0 - combine_xyz_001_1.inputs[2].default_value = 0.0 - combine_xyz_001_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_032_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_032_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_032_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_032_1.hide = False - combine_xyz_032_1.label = 'DO NOT TOUCH' - combine_xyz_032_1.location = (-968.5927734375, 1219.050048828125) - combine_xyz_032_1.mute = False - combine_xyz_032_1.name = 'Combine XYZ.032' - combine_xyz_032_1.use_custom_color = False - combine_xyz_032_1.width = 125.2945556640625 - combine_xyz_032_1.inputs[0].default_value = 0.0 - combine_xyz_032_1.inputs[1].default_value = 0.0 - combine_xyz_032_1.inputs[2].default_value = 0.0 - combine_xyz_032_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_014_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_014_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_014_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_014_1.hide = False - combine_xyz_014_1.label = 'DO NOT TOUCH' - combine_xyz_014_1.location = (1171.4072265625, 959.050048828125) - combine_xyz_014_1.mute = False - combine_xyz_014_1.name = 'Combine XYZ.014' - combine_xyz_014_1.use_custom_color = False - combine_xyz_014_1.width = 121.84521484375 - combine_xyz_014_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_014_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_014_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_014_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_015_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_015_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_015_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_015_1.hide = False - combine_xyz_015_1.label = 'DO NOT TOUCH' - combine_xyz_015_1.location = (1171.4072265625, 839.050048828125) - combine_xyz_015_1.mute = False - combine_xyz_015_1.name = 'Combine XYZ.015' - combine_xyz_015_1.use_custom_color = False - combine_xyz_015_1.width = 121.845458984375 - combine_xyz_015_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_015_1.inputs[1].default_value = 0.0 - combine_xyz_015_1.inputs[2].default_value = 0.0 - combine_xyz_015_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_021_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_021_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_021_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_021_1.hide = False - combine_xyz_021_1.label = 'DO NOT TOUCH' - combine_xyz_021_1.location = (1171.4072265625, 719.050048828125) - combine_xyz_021_1.mute = False - combine_xyz_021_1.name = 'Combine XYZ.021' - combine_xyz_021_1.use_custom_color = False - combine_xyz_021_1.width = 121.8447265625 - combine_xyz_021_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_021_1.inputs[1].default_value = 0.0 - combine_xyz_021_1.inputs[2].default_value = 0.0 - combine_xyz_021_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_002_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_002_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_002_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_002_1.hide = False - combine_xyz_002_1.label = 'DO NOT TOUCH' - combine_xyz_002_1.location = (431.4072265625, 739.050048828125) - combine_xyz_002_1.mute = False - combine_xyz_002_1.name = 'Combine XYZ.002' - combine_xyz_002_1.use_custom_color = False - combine_xyz_002_1.width = 124.23828125 - combine_xyz_002_1.inputs[0].default_value = 0.0 - combine_xyz_002_1.inputs[1].default_value = 0.0 - combine_xyz_002_1.inputs[2].default_value = 0.0 - combine_xyz_002_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_003_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_003_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_003_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_003_1.hide = False - combine_xyz_003_1.label = 'DO NOT TOUCH' - combine_xyz_003_1.location = (431.4072265625, 619.050048828125) - combine_xyz_003_1.mute = False - combine_xyz_003_1.name = 'Combine XYZ.003' - combine_xyz_003_1.use_custom_color = False - combine_xyz_003_1.width = 124.238037109375 - combine_xyz_003_1.inputs[0].default_value = 0.0 - combine_xyz_003_1.inputs[1].default_value = 0.0 - combine_xyz_003_1.inputs[2].default_value = 0.0 - combine_xyz_003_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_033_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_033_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_033_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_033_1.hide = False - combine_xyz_033_1.label = 'DO NOT TOUCH' - combine_xyz_033_1.location = (-28.5927734375, 579.050048828125) - combine_xyz_033_1.mute = False - combine_xyz_033_1.name = 'Combine XYZ.033' - combine_xyz_033_1.use_custom_color = False - combine_xyz_033_1.width = 117.468994140625 - combine_xyz_033_1.inputs[0].default_value = 0.0 - combine_xyz_033_1.inputs[1].default_value = 0.0 - combine_xyz_033_1.inputs[2].default_value = 0.0 - combine_xyz_033_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_038_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_038_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_038_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_038_1.hide = False - combine_xyz_038_1.label = 'DO NOT TOUCH' - combine_xyz_038_1.location = (-628.5927734375, 399.050048828125) - combine_xyz_038_1.mute = False - combine_xyz_038_1.name = 'Combine XYZ.038' - combine_xyz_038_1.use_custom_color = False - combine_xyz_038_1.width = 122.51708984375 - combine_xyz_038_1.inputs[0].default_value = 0.0 - combine_xyz_038_1.inputs[1].default_value = 0.0 - combine_xyz_038_1.inputs[2].default_value = 0.0 - combine_xyz_038_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_043_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_043_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_043_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_043_1.hide = False - combine_xyz_043_1.label = 'DO NOT TOUCH' - combine_xyz_043_1.location = (-968.5927734375, -20.949951171875) - combine_xyz_043_1.mute = False - combine_xyz_043_1.name = 'Combine XYZ.043' - combine_xyz_043_1.use_custom_color = False - combine_xyz_043_1.width = 127.3455810546875 - combine_xyz_043_1.inputs[0].default_value = 0.0 - combine_xyz_043_1.inputs[1].default_value = 0.0 - combine_xyz_043_1.inputs[2].default_value = 0.0 - combine_xyz_043_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_016_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_016_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_016_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_016_1.hide = False - combine_xyz_016_1.label = 'DO NOT TOUCH' - combine_xyz_016_1.location = (1171.4072265625, -280.949951171875) - combine_xyz_016_1.mute = False - combine_xyz_016_1.name = 'Combine XYZ.016' - combine_xyz_016_1.use_custom_color = False - combine_xyz_016_1.width = 127.345703125 - combine_xyz_016_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_016_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_016_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_016_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_017_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_017_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_017_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_017_1.hide = False - combine_xyz_017_1.label = 'DO NOT TOUCH' - combine_xyz_017_1.location = (1171.4072265625, -400.949951171875) - combine_xyz_017_1.mute = False - combine_xyz_017_1.name = 'Combine XYZ.017' - combine_xyz_017_1.use_custom_color = False - combine_xyz_017_1.width = 127.967529296875 - combine_xyz_017_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_017_1.inputs[1].default_value = 0.0 - combine_xyz_017_1.inputs[2].default_value = 0.0 - combine_xyz_017_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_022_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_022_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_022_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_022_1.hide = False - combine_xyz_022_1.label = 'DO NOT TOUCH' - combine_xyz_022_1.location = (1171.4072265625, -520.949951171875) - combine_xyz_022_1.mute = False - combine_xyz_022_1.name = 'Combine XYZ.022' - combine_xyz_022_1.use_custom_color = False - combine_xyz_022_1.width = 128.5888671875 - combine_xyz_022_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_022_1.inputs[1].default_value = 0.0 - combine_xyz_022_1.inputs[2].default_value = 0.0 - combine_xyz_022_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_005_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_005_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_005_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_005_1.hide = False - combine_xyz_005_1.label = 'DO NOT TOUCH' - combine_xyz_005_1.location = (431.4072265625, -500.949951171875) - combine_xyz_005_1.mute = False - combine_xyz_005_1.name = 'Combine XYZ.005' - combine_xyz_005_1.use_custom_color = False - combine_xyz_005_1.width = 125.53173828125 - combine_xyz_005_1.inputs[0].default_value = 0.0 - combine_xyz_005_1.inputs[1].default_value = 0.0 - combine_xyz_005_1.inputs[2].default_value = 0.0 - combine_xyz_005_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_004_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_004_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_004_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_004_1.hide = False - combine_xyz_004_1.label = 'DO NOT TOUCH' - combine_xyz_004_1.location = (431.4072265625, -620.949951171875) - combine_xyz_004_1.mute = False - combine_xyz_004_1.name = 'Combine XYZ.004' - combine_xyz_004_1.use_custom_color = False - combine_xyz_004_1.width = 124.860107421875 - combine_xyz_004_1.inputs[0].default_value = 0.0 - combine_xyz_004_1.inputs[1].default_value = 0.0 - combine_xyz_004_1.inputs[2].default_value = 0.0 - combine_xyz_004_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_034_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_034_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_034_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_034_1.hide = False - combine_xyz_034_1.label = 'DO NOT TOUCH' - combine_xyz_034_1.location = (-28.5927734375, -660.949951171875) - combine_xyz_034_1.mute = False - combine_xyz_034_1.name = 'Combine XYZ.034' - combine_xyz_034_1.use_custom_color = False - combine_xyz_034_1.width = 124.85986328125 - combine_xyz_034_1.inputs[0].default_value = 0.0 - combine_xyz_034_1.inputs[1].default_value = 0.0 - combine_xyz_034_1.inputs[2].default_value = 0.0 - combine_xyz_034_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_039_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_039_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_039_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_039_1.hide = False - combine_xyz_039_1.label = 'DO NOT TOUCH' - combine_xyz_039_1.location = (-628.5927734375, -840.949951171875) - combine_xyz_039_1.mute = False - combine_xyz_039_1.name = 'Combine XYZ.039' - combine_xyz_039_1.use_custom_color = False - combine_xyz_039_1.width = 124.696533203125 - combine_xyz_039_1.inputs[0].default_value = 0.0 - combine_xyz_039_1.inputs[1].default_value = 0.0 - combine_xyz_039_1.inputs[2].default_value = 0.0 - combine_xyz_039_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_044_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_044_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_044_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_044_1.hide = False - combine_xyz_044_1.label = 'DO NOT TOUCH' - combine_xyz_044_1.location = (-968.5927734375, -1260.949951171875) - combine_xyz_044_1.mute = False - combine_xyz_044_1.name = 'Combine XYZ.044' - combine_xyz_044_1.use_custom_color = False - combine_xyz_044_1.width = 121.9874267578125 - combine_xyz_044_1.inputs[0].default_value = 0.0 - combine_xyz_044_1.inputs[1].default_value = 0.0 - combine_xyz_044_1.inputs[2].default_value = 0.0 - combine_xyz_044_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_018_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_018_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_018_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_018_1.hide = False - combine_xyz_018_1.label = 'DO NOT TOUCH' - combine_xyz_018_1.location = (1171.4072265625, -1500.949951171875) - combine_xyz_018_1.mute = False - combine_xyz_018_1.name = 'Combine XYZ.018' - combine_xyz_018_1.use_custom_color = False - combine_xyz_018_1.width = 135.3369140625 - combine_xyz_018_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_018_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_018_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_018_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_019_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_019_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_019_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_019_1.hide = False - combine_xyz_019_1.label = 'DO NOT TOUCH' - combine_xyz_019_1.location = (1171.4072265625, -1620.949951171875) - combine_xyz_019_1.mute = False - combine_xyz_019_1.name = 'Combine XYZ.019' - combine_xyz_019_1.use_custom_color = False - combine_xyz_019_1.width = 134.5517578125 - combine_xyz_019_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_019_1.inputs[1].default_value = 0.0 - combine_xyz_019_1.inputs[2].default_value = 0.0 - combine_xyz_019_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_023_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_023_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_023_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_023_1.hide = False - combine_xyz_023_1.label = 'DO NOT TOUCH' - combine_xyz_023_1.location = (1171.4072265625, -1740.949951171875) - combine_xyz_023_1.mute = False - combine_xyz_023_1.name = 'Combine XYZ.023' - combine_xyz_023_1.use_custom_color = False - combine_xyz_023_1.width = 132.196044921875 - combine_xyz_023_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_023_1.inputs[1].default_value = 0.0 - combine_xyz_023_1.inputs[2].default_value = 0.0 - combine_xyz_023_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_007_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_007_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_007_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_007_1.hide = False - combine_xyz_007_1.label = 'DO NOT TOUCH' - combine_xyz_007_1.location = (431.4072265625, -1740.949951171875) - combine_xyz_007_1.mute = False - combine_xyz_007_1.name = 'Combine XYZ.007' - combine_xyz_007_1.use_custom_color = False - combine_xyz_007_1.width = 123.516357421875 - combine_xyz_007_1.inputs[0].default_value = 0.0 - combine_xyz_007_1.inputs[1].default_value = 0.0 - combine_xyz_007_1.inputs[2].default_value = 0.0 - combine_xyz_007_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_006_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_006_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_006_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_006_1.hide = False - combine_xyz_006_1.label = 'DO NOT TOUCH' - combine_xyz_006_1.location = (431.4072265625, -1860.949951171875) - combine_xyz_006_1.mute = False - combine_xyz_006_1.name = 'Combine XYZ.006' - combine_xyz_006_1.use_custom_color = False - combine_xyz_006_1.width = 124.860107421875 - combine_xyz_006_1.inputs[0].default_value = 0.0 - combine_xyz_006_1.inputs[1].default_value = 0.0 - combine_xyz_006_1.inputs[2].default_value = 0.0 - combine_xyz_006_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_035_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_035_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_035_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_035_1.hide = False - combine_xyz_035_1.label = 'DO NOT TOUCH' - combine_xyz_035_1.location = (-48.5927734375, -1900.949951171875) - combine_xyz_035_1.mute = False - combine_xyz_035_1.name = 'Combine XYZ.035' - combine_xyz_035_1.use_custom_color = False - combine_xyz_035_1.width = 122.844482421875 - combine_xyz_035_1.inputs[0].default_value = 0.0 - combine_xyz_035_1.inputs[1].default_value = 0.0 - combine_xyz_035_1.inputs[2].default_value = 0.0 - combine_xyz_035_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_040_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_040_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_040_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_040_1.hide = False - combine_xyz_040_1.label = 'DO NOT TOUCH' - combine_xyz_040_1.location = (-628.5927734375, -2080.949951171875) - combine_xyz_040_1.mute = False - combine_xyz_040_1.name = 'Combine XYZ.040' - combine_xyz_040_1.use_custom_color = False - combine_xyz_040_1.width = 129.021484375 - combine_xyz_040_1.inputs[0].default_value = 0.0 - combine_xyz_040_1.inputs[1].default_value = 0.0 - combine_xyz_040_1.inputs[2].default_value = 0.0 - combine_xyz_040_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_045_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_045_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_045_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_045_1.hide = False - combine_xyz_045_1.label = 'DO NOT TOUCH' - combine_xyz_045_1.location = (-968.5927734375, -2500.949951171875) - combine_xyz_045_1.mute = False - combine_xyz_045_1.name = 'Combine XYZ.045' - combine_xyz_045_1.use_custom_color = False - combine_xyz_045_1.width = 118.6451416015625 - combine_xyz_045_1.inputs[0].default_value = 0.0 - combine_xyz_045_1.inputs[1].default_value = 0.0 - combine_xyz_045_1.inputs[2].default_value = 0.0 - combine_xyz_045_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_024_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_024_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_024_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_024_1.hide = False - combine_xyz_024_1.label = 'DO NOT TOUCH' - combine_xyz_024_1.location = (1171.4072265625, -2760.949951171875) - combine_xyz_024_1.mute = False - combine_xyz_024_1.name = 'Combine XYZ.024' - combine_xyz_024_1.use_custom_color = False - combine_xyz_024_1.width = 131.23486328125 - combine_xyz_024_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_024_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_024_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_024_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_025_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_025_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_025_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_025_1.hide = False - combine_xyz_025_1.label = 'DO NOT TOUCH' - combine_xyz_025_1.location = (1171.4072265625, -2880.949951171875) - combine_xyz_025_1.mute = False - combine_xyz_025_1.name = 'Combine XYZ.025' - combine_xyz_025_1.use_custom_color = False - combine_xyz_025_1.width = 129.781982421875 - combine_xyz_025_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_025_1.inputs[1].default_value = 0.0 - combine_xyz_025_1.inputs[2].default_value = 0.0 - combine_xyz_025_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_026_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_026_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_026_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_026_1.hide = False - combine_xyz_026_1.label = 'DO NOT TOUCH' - combine_xyz_026_1.location = (1171.4072265625, -3000.949951171875) - combine_xyz_026_1.mute = False - combine_xyz_026_1.name = 'Combine XYZ.026' - combine_xyz_026_1.use_custom_color = False - combine_xyz_026_1.width = 127.602783203125 - combine_xyz_026_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_026_1.inputs[1].default_value = 0.0 - combine_xyz_026_1.inputs[2].default_value = 0.0 - combine_xyz_026_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_008_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_008_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_008_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_008_1.hide = False - combine_xyz_008_1.label = 'DO NOT TOUCH' - combine_xyz_008_1.location = (431.4072265625, -2980.949951171875) - combine_xyz_008_1.mute = False - combine_xyz_008_1.name = 'Combine XYZ.008' - combine_xyz_008_1.use_custom_color = False - combine_xyz_008_1.width = 127.346923828125 - combine_xyz_008_1.inputs[0].default_value = 0.0 - combine_xyz_008_1.inputs[1].default_value = 0.0 - combine_xyz_008_1.inputs[2].default_value = 0.0 - combine_xyz_008_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_009_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_009_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_009_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_009_1.hide = False - combine_xyz_009_1.label = 'DO NOT TOUCH' - combine_xyz_009_1.location = (431.4072265625, -3100.949951171875) - combine_xyz_009_1.mute = False - combine_xyz_009_1.name = 'Combine XYZ.009' - combine_xyz_009_1.use_custom_color = False - combine_xyz_009_1.width = 126.103759765625 - combine_xyz_009_1.inputs[0].default_value = 0.0 - combine_xyz_009_1.inputs[1].default_value = 0.0 - combine_xyz_009_1.inputs[2].default_value = 0.0 - combine_xyz_009_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_036_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_036_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_036_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_036_1.hide = False - combine_xyz_036_1.label = 'DO NOT TOUCH' - combine_xyz_036_1.location = (-68.5927734375, -3140.949951171875) - combine_xyz_036_1.mute = False - combine_xyz_036_1.name = 'Combine XYZ.036' - combine_xyz_036_1.use_custom_color = False - combine_xyz_036_1.width = 123.617919921875 - combine_xyz_036_1.inputs[0].default_value = 0.0 - combine_xyz_036_1.inputs[1].default_value = 0.0 - combine_xyz_036_1.inputs[2].default_value = 0.0 - combine_xyz_036_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_041_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_041_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_041_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_041_1.hide = False - combine_xyz_041_1.label = 'DO NOT TOUCH' - combine_xyz_041_1.location = (-628.5927734375, -3320.949951171875) - combine_xyz_041_1.mute = False - combine_xyz_041_1.name = 'Combine XYZ.041' - combine_xyz_041_1.use_custom_color = False - combine_xyz_041_1.width = 119.526123046875 - combine_xyz_041_1.inputs[0].default_value = 0.0 - combine_xyz_041_1.inputs[1].default_value = 0.0 - combine_xyz_041_1.inputs[2].default_value = 0.0 - combine_xyz_041_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_046_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_046_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_046_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_046_1.hide = False - combine_xyz_046_1.label = 'DO NOT TOUCH' - combine_xyz_046_1.location = (-968.5927734375, -3740.949951171875) - combine_xyz_046_1.mute = False - combine_xyz_046_1.name = 'Combine XYZ.046' - combine_xyz_046_1.use_custom_color = False - combine_xyz_046_1.width = 120.1575927734375 - combine_xyz_046_1.inputs[0].default_value = 0.0 - combine_xyz_046_1.inputs[1].default_value = 0.0 - combine_xyz_046_1.inputs[2].default_value = 0.0 - combine_xyz_046_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_028_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_028_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_028_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_028_1.hide = False - combine_xyz_028_1.label = 'DO NOT TOUCH' - combine_xyz_028_1.location = (1171.4072265625, -4000.949951171875) - combine_xyz_028_1.mute = False - combine_xyz_028_1.name = 'Combine XYZ.028' - combine_xyz_028_1.use_custom_color = False - combine_xyz_028_1.width = 132.688232421875 - combine_xyz_028_1.inputs[0].default_value = -1.6666669845581055 - combine_xyz_028_1.inputs[1].default_value = 5.2083330154418945 - combine_xyz_028_1.inputs[2].default_value = 0.6499999761581421 - combine_xyz_028_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_029_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_029_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_029_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_029_1.hide = False - combine_xyz_029_1.label = 'DO NOT TOUCH' - combine_xyz_029_1.location = (1171.4072265625, -4120.9501953125) - combine_xyz_029_1.mute = False - combine_xyz_029_1.name = 'Combine XYZ.029' - combine_xyz_029_1.use_custom_color = False - combine_xyz_029_1.width = 132.68798828125 - combine_xyz_029_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_029_1.inputs[1].default_value = 0.0 - combine_xyz_029_1.inputs[2].default_value = 0.0 - combine_xyz_029_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_027_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_027_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_027_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_027_1.hide = False - combine_xyz_027_1.label = 'DO NOT TOUCH' - combine_xyz_027_1.location = (1171.4072265625, -4240.9501953125) - combine_xyz_027_1.mute = False - combine_xyz_027_1.name = 'Combine XYZ.027' - combine_xyz_027_1.use_custom_color = False - combine_xyz_027_1.width = 133.41455078125 - combine_xyz_027_1.inputs[0].default_value = 0.23999999463558197 - combine_xyz_027_1.inputs[1].default_value = 0.0 - combine_xyz_027_1.inputs[2].default_value = 0.0 - combine_xyz_027_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_010_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_010_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_010_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_010_1.hide = False - combine_xyz_010_1.label = 'DO NOT TOUCH' - combine_xyz_010_1.location = (431.4072265625, -4220.9501953125) - combine_xyz_010_1.mute = False - combine_xyz_010_1.name = 'Combine XYZ.010' - combine_xyz_010_1.use_custom_color = False - combine_xyz_010_1.width = 125.42431640625 - combine_xyz_010_1.inputs[0].default_value = 0.0 - combine_xyz_010_1.inputs[1].default_value = 0.0 - combine_xyz_010_1.inputs[2].default_value = 0.0 - combine_xyz_010_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_011_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_011_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_011_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_011_1.hide = False - combine_xyz_011_1.label = 'DO NOT TOUCH' - combine_xyz_011_1.location = (431.4072265625, -4340.9501953125) - combine_xyz_011_1.mute = False - combine_xyz_011_1.name = 'Combine XYZ.011' - combine_xyz_011_1.use_custom_color = False - combine_xyz_011_1.width = 124.69775390625 - combine_xyz_011_1.inputs[0].default_value = 0.0 - combine_xyz_011_1.inputs[1].default_value = 0.0 - combine_xyz_011_1.inputs[2].default_value = 0.0 - combine_xyz_011_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_037_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_037_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_037_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_037_1.hide = False - combine_xyz_037_1.label = 'DO NOT TOUCH' - combine_xyz_037_1.location = (-68.5927734375, -4380.9501953125) - combine_xyz_037_1.mute = False - combine_xyz_037_1.name = 'Combine XYZ.037' - combine_xyz_037_1.use_custom_color = False - combine_xyz_037_1.width = 126.725830078125 - combine_xyz_037_1.inputs[0].default_value = 0.0 - combine_xyz_037_1.inputs[1].default_value = 0.0 - combine_xyz_037_1.inputs[2].default_value = 0.0 - combine_xyz_037_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_042_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_042_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_042_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_042_1.hide = False - combine_xyz_042_1.label = 'DO NOT TOUCH' - combine_xyz_042_1.location = (-628.5927734375, -4560.9501953125) - combine_xyz_042_1.mute = False - combine_xyz_042_1.name = 'Combine XYZ.042' - combine_xyz_042_1.use_custom_color = False - combine_xyz_042_1.width = 125.42431640625 - combine_xyz_042_1.inputs[0].default_value = 0.0 - combine_xyz_042_1.inputs[1].default_value = 0.0 - combine_xyz_042_1.inputs[2].default_value = 0.0 - combine_xyz_042_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - combine_xyz_047_1 = test_group.nodes.new('ShaderNodeCombineXYZ') - combine_xyz_047_1.parent = test_group.nodes.get('Frame.012') - combine_xyz_047_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - combine_xyz_047_1.hide = False - combine_xyz_047_1.label = 'DO NOT TOUCH' - combine_xyz_047_1.location = (-968.5927734375, -4980.9501953125) - combine_xyz_047_1.mute = False - combine_xyz_047_1.name = 'Combine XYZ.047' - combine_xyz_047_1.use_custom_color = False - combine_xyz_047_1.width = 115.6029052734375 - combine_xyz_047_1.inputs[0].default_value = 0.0 - combine_xyz_047_1.inputs[1].default_value = 0.0 - combine_xyz_047_1.inputs[2].default_value = 0.0 - combine_xyz_047_1.outputs[0].default_value = (0.0, 0.0, 0.0) - - attribute_1 = test_group.nodes.new('ShaderNodeAttribute') - attribute_1.parent = test_group.nodes.get('Frame.012') - attribute_1.attribute_name = 'slots' - attribute_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - attribute_1.hide = True - attribute_1.location = (2020.0, 2400.0) - attribute_1.mute = False - attribute_1.name = 'Attribute' - attribute_1.use_custom_color = False - attribute_1.width = 140.0 - - math_004_1 = test_group.nodes.new('ShaderNodeMath') - math_004_1.parent = test_group.nodes.get('Frame.012') - math_004_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_004_1.hide = True - math_004_1.label = 'Cloth_Secondary_Slot' - math_004_1.location = (2473.43701171875, 1164.050048828125) - math_004_1.mute = False - math_004_1.name = 'Math.004' - math_004_1.operation = 'MULTIPLY' - math_004_1.use_clamp = False - math_004_1.use_custom_color = False - math_004_1.width = 140.0 - math_004_1.inputs[0].default_value = 0.5 - math_004_1.inputs[1].default_value = 0.5 - math_004_1.inputs[2].default_value = 0.0 - math_004_1.outputs[0].default_value = 0.0 - - math_007_1 = test_group.nodes.new('ShaderNodeMath') - math_007_1.parent = test_group.nodes.get('Frame.012') - math_007_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_007_1.hide = True - math_007_1.label = 'Suit_Primary_Slot' - math_007_1.location = (2473.43701171875, 1104.050048828125) - math_007_1.mute = False - math_007_1.name = 'Math.007' - math_007_1.operation = 'MULTIPLY' - math_007_1.use_clamp = False - math_007_1.use_custom_color = False - math_007_1.width = 140.0 - math_007_1.inputs[0].default_value = 0.5 - math_007_1.inputs[1].default_value = 0.5 - math_007_1.inputs[2].default_value = 0.0 - math_007_1.outputs[0].default_value = 0.0 - - separate_rgb_1 = test_group.nodes.new('ShaderNodeSeparateRGB') - separate_rgb_1.parent = test_group.nodes.get('Frame.012') - separate_rgb_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - separate_rgb_1.hide = True - separate_rgb_1.location = (2123.4365234375, 1139.050048828125) - separate_rgb_1.mute = False - separate_rgb_1.name = 'Separate RGB' - separate_rgb_1.use_custom_color = False - separate_rgb_1.width = 140.0 - separate_rgb_1.inputs[0].default_value = (0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0) - separate_rgb_1.outputs[0].default_value = 0.0 - separate_rgb_1.outputs[1].default_value = 0.0 - separate_rgb_1.outputs[2].default_value = 0.0 - - math_001_1 = test_group.nodes.new('ShaderNodeMath') - math_001_1.parent = test_group.nodes.get('Frame.012') - math_001_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_001_1.hide = True - math_001_1.label = 'Cloth_Primary_Slot' - math_001_1.location = (2303.4365234375, 1209.050048828125) - math_001_1.mute = False - math_001_1.name = 'Math.001' - math_001_1.operation = 'GREATER_THAN' - math_001_1.use_clamp = False - math_001_1.use_custom_color = False - math_001_1.width = 140.0 - math_001_1.inputs[0].default_value = 0.5 - math_001_1.inputs[1].default_value = 0.9980000257492065 - math_001_1.inputs[2].default_value = 0.0 - math_001_1.outputs[0].default_value = 0.0 - - math_006_1 = test_group.nodes.new('ShaderNodeMath') - math_006_1.parent = test_group.nodes.get('Frame.012') - math_006_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_006_1.hide = True - math_006_1.label = ' ' - math_006_1.location = (2303.4365234375, 1089.050048828125) - math_006_1.mute = False - math_006_1.name = 'Math.006' - math_006_1.operation = 'GREATER_THAN' - math_006_1.use_clamp = False - math_006_1.use_custom_color = False - math_006_1.width = 140.0 - math_006_1.inputs[0].default_value = 0.5 - math_006_1.inputs[1].default_value = 0.33329999446868896 - math_006_1.inputs[2].default_value = 0.0 - math_006_1.outputs[0].default_value = 0.0 - - math_008_1 = test_group.nodes.new('ShaderNodeMath') - math_008_1.parent = test_group.nodes.get('Frame.012') - math_008_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_008_1.hide = True - math_008_1.label = 'Suit_Secondary_Slot' - math_008_1.location = (2303.4365234375, 1059.050048828125) - math_008_1.mute = False - math_008_1.name = 'Math.008' - math_008_1.operation = 'GREATER_THAN' - math_008_1.use_clamp = False - math_008_1.use_custom_color = False - math_008_1.width = 140.0 - math_008_1.inputs[0].default_value = 0.5 - math_008_1.inputs[1].default_value = 0.9980000257492065 - math_008_1.inputs[2].default_value = 0.0 - math_008_1.outputs[0].default_value = 0.0 - - math_1 = test_group.nodes.new('ShaderNodeMath') - math_1.parent = test_group.nodes.get('Frame.012') - math_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_1.hide = True - math_1.label = 'Armor_Primary_Slot' - math_1.location = (2303.4365234375, 1239.050048828125) - math_1.mute = False - math_1.name = 'Math' - math_1.operation = 'GREATER_THAN' - math_1.use_clamp = False - math_1.use_custom_color = False - math_1.width = 140.0 - math_1.inputs[0].default_value = 0.5 - math_1.inputs[1].default_value = 0.33329999446868896 - math_1.inputs[2].default_value = 0.0 - math_1.outputs[0].default_value = 0.0 - - math_002_1 = test_group.nodes.new('ShaderNodeMath') - math_002_1.parent = test_group.nodes.get('Frame.012') - math_002_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_002_1.hide = True - math_002_1.label = ' ' - math_002_1.location = (2303.4365234375, 1179.050048828125) - math_002_1.mute = False - math_002_1.name = 'Math.002' - math_002_1.operation = 'LESS_THAN' - math_002_1.use_clamp = False - math_002_1.use_custom_color = False - math_002_1.width = 140.0 - math_002_1.inputs[0].default_value = 0.5 - math_002_1.inputs[1].default_value = 0.33329999446868896 - math_002_1.inputs[2].default_value = 0.0 - math_002_1.outputs[0].default_value = 0.0 - - math_003_1 = test_group.nodes.new('ShaderNodeMath') - math_003_1.parent = test_group.nodes.get('Frame.012') - math_003_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_003_1.hide = True - math_003_1.label = ' ' - math_003_1.location = (2303.4365234375, 1149.050048828125) - math_003_1.mute = False - math_003_1.name = 'Math.003' - math_003_1.operation = 'GREATER_THAN' - math_003_1.use_clamp = False - math_003_1.use_custom_color = False - math_003_1.width = 140.0 - math_003_1.inputs[0].default_value = 0.5 - math_003_1.inputs[1].default_value = 0.09 - math_003_1.inputs[2].default_value = 0.0 - math_003_1.outputs[0].default_value = 0.0 - - math_005_1 = test_group.nodes.new('ShaderNodeMath') - math_005_1.parent = test_group.nodes.get('Frame.012') - math_005_1.color = (0.6079999804496765, 0.6079999804496765, 0.6079999804496765) - math_005_1.hide = True - math_005_1.label = ' ' - math_005_1.location = (2303.4365234375, 1119.050048828125) - math_005_1.mute = False - math_005_1.name = 'Math.005' - math_005_1.operation = 'LESS_THAN' - math_005_1.use_clamp = False - math_005_1.use_custom_color = False - math_005_1.width = 140.0 - math_005_1.inputs[0].default_value = 0.5 - math_005_1.inputs[1].default_value = 0.6665999889373779 - math_005_1.inputs[2].default_value = 0.0 - math_005_1.outputs[0].default_value = 0.0 - - # LINKS - test_group.links.new(separate_rgb_1.outputs[0], math_1.inputs[0]) - test_group.links.new(separate_rgb_1.outputs[0], math_001_1.inputs[0]) - test_group.links.new(separate_rgb_1.outputs[1], math_002_1.inputs[0]) - test_group.links.new(separate_rgb_1.outputs[1], math_003_1.inputs[0]) - test_group.links.new(math_002_1.outputs[0], math_004_1.inputs[0]) - test_group.links.new(math_003_1.outputs[0], math_004_1.inputs[1]) - test_group.links.new(separate_rgb_1.outputs[1], math_005_1.inputs[0]) - test_group.links.new(separate_rgb_1.outputs[1], math_006_1.inputs[0]) - test_group.links.new(math_005_1.outputs[0], math_007_1.inputs[0]) - test_group.links.new(math_006_1.outputs[0], math_007_1.inputs[1]) - test_group.links.new(separate_rgb_1.outputs[1], math_008_1.inputs[0]) - test_group.links.new(mix_1.outputs[0], mix_001_1.inputs[1]) - test_group.links.new(mix_001_1.outputs[0], mix_002_1.inputs[1]) - test_group.links.new(mix_002_1.outputs[0], mix_003_1.inputs[1]) - test_group.links.new(mix_003_1.outputs[0], mix_004_1.inputs[1]) - test_group.links.new(mix_004_1.outputs[0], reroute_337_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_001_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_002_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_003_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_004_1.inputs[0]) - test_group.links.new(mix_005_1.outputs[0], mix_006_1.inputs[1]) - test_group.links.new(mix_006_1.outputs[0], mix_007_1.inputs[1]) - test_group.links.new(mix_007_1.outputs[0], mix_008_1.inputs[1]) - test_group.links.new(mix_008_1.outputs[0], mix_009_1.inputs[1]) - test_group.links.new(mix_009_1.outputs[0], reroute_338_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_005_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_006_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_007_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_008_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_009_1.inputs[0]) - test_group.links.new(mix_010_1.outputs[0], mix_011_1.inputs[1]) - test_group.links.new(mix_011_1.outputs[0], mix_012_1.inputs[1]) - test_group.links.new(mix_012_1.outputs[0], mix_013_1.inputs[1]) - test_group.links.new(mix_013_1.outputs[0], mix_014_1.inputs[1]) - test_group.links.new(mix_014_1.outputs[0], reroute_339_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_010_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_011_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_012_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_013_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_014_1.inputs[0]) - test_group.links.new(mix_015_1.outputs[0], mix_016_1.inputs[1]) - test_group.links.new(mix_016_1.outputs[0], mix_017_1.inputs[1]) - test_group.links.new(mix_017_1.outputs[0], mix_018_1.inputs[1]) - test_group.links.new(mix_018_1.outputs[0], mix_019_1.inputs[1]) - test_group.links.new(mix_019_1.outputs[0], reroute_340_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_015_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_016_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_017_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_018_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_019_1.inputs[0]) - test_group.links.new(mix_020_1.outputs[0], mix_021_1.inputs[1]) - test_group.links.new(mix_021_1.outputs[0], mix_022_1.inputs[1]) - test_group.links.new(mix_022_1.outputs[0], mix_023_1.inputs[1]) - test_group.links.new(mix_023_1.outputs[0], mix_024_1.inputs[1]) - test_group.links.new(mix_024_1.outputs[0], reroute_341_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_020_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_021_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_022_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_023_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_024_1.inputs[0]) - test_group.links.new(mix_025_1.outputs[0], mix_026_1.inputs[1]) - test_group.links.new(mix_026_1.outputs[0], mix_027_1.inputs[1]) - test_group.links.new(mix_027_1.outputs[0], mix_028_1.inputs[1]) - test_group.links.new(mix_028_1.outputs[0], mix_029_1.inputs[1]) - test_group.links.new(mix_029_1.outputs[0], reroute_342_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_025_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_026_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_027_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_028_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_029_1.inputs[0]) - test_group.links.new(mix_030_1.outputs[0], mix_031_1.inputs[1]) - test_group.links.new(mix_031_1.outputs[0], mix_032_1.inputs[1]) - test_group.links.new(mix_032_1.outputs[0], mix_033_1.inputs[1]) - test_group.links.new(mix_033_1.outputs[0], mix_034_1.inputs[1]) - test_group.links.new(mix_034_1.outputs[0], reroute_343_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_030_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_031_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_032_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_033_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_034_1.inputs[0]) - test_group.links.new(mix_035_1.outputs[0], mix_036_1.inputs[1]) - test_group.links.new(mix_036_1.outputs[0], mix_037_1.inputs[1]) - test_group.links.new(mix_037_1.outputs[0], mix_038_1.inputs[1]) - test_group.links.new(mix_038_1.outputs[0], mix_039_1.inputs[1]) - test_group.links.new(mix_039_1.outputs[0], reroute_344_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_035_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_036_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_037_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_038_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_039_1.inputs[0]) - test_group.links.new(mix_040_1.outputs[0], mix_041_1.inputs[1]) - test_group.links.new(mix_041_1.outputs[0], mix_042_1.inputs[1]) - test_group.links.new(mix_042_1.outputs[0], mix_043_1.inputs[1]) - test_group.links.new(mix_043_1.outputs[0], mix_044_1.inputs[1]) - test_group.links.new(mix_044_1.outputs[0], reroute_345_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_040_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_041_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_042_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_043_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_044_1.inputs[0]) - test_group.links.new(mix_045_1.outputs[0], mix_046_1.inputs[1]) - test_group.links.new(mix_046_1.outputs[0], mix_047_1.inputs[1]) - test_group.links.new(mix_047_1.outputs[0], mix_048_1.inputs[1]) - test_group.links.new(mix_048_1.outputs[0], mix_049_1.inputs[1]) - test_group.links.new(mix_049_1.outputs[0], reroute_346_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_045_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_046_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_047_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_048_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_049_1.inputs[0]) - test_group.links.new(mix_050_1.outputs[0], mix_051_1.inputs[1]) - test_group.links.new(mix_051_1.outputs[0], mix_052_1.inputs[1]) - test_group.links.new(mix_052_1.outputs[0], mix_053_1.inputs[1]) - test_group.links.new(mix_053_1.outputs[0], mix_054_1.inputs[1]) - test_group.links.new(mix_054_1.outputs[0], reroute_347_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_050_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_051_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_052_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_053_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_054_1.inputs[0]) - test_group.links.new(armor_detail_normal_transform_1.outputs[0], reroute_291_1.inputs[0]) - test_group.links.new(cloth_detail_normal_transform_1.outputs[0], reroute_320_1.inputs[0]) - test_group.links.new(armor_primary_detail_normal_map_1.outputs[0], reroute_011_1.inputs[0]) - test_group.links.new(armor_secondary_detail_normal_map_1.outputs[0], reroute_039_1.inputs[0]) - test_group.links.new(cloth_primary_detail_normal_map_1.outputs[0], reroute_067_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_normal_map_1.outputs[0], reroute_096_1.inputs[0]) - test_group.links.new(suit_primary_detail_normal_map_1.outputs[0], reroute_124_1.inputs[0]) - test_group.links.new(suit_secondary_detail_normal_map_1.outputs[0], reroute_194_1.inputs[0]) - test_group.links.new(armor_detail_diffuse_transform_1.outputs[0], reroute_288_1.inputs[0]) - test_group.links.new(cloth_detail_diffuse_transform_1.outputs[0], reroute_319_1.inputs[0]) - test_group.links.new(armor_primary_wear_remap_x_1.outputs[0], reroute_007_1.inputs[0]) - test_group.links.new(armor_primary_wear_remap_y_1.outputs[0], reroute_008_1.inputs[0]) - test_group.links.new(armor_primary_wear_remap_z_1.outputs[0], reroute_009_1.inputs[0]) - test_group.links.new(armor_primary_wear_remap_w_1.outputs[0], reroute_010_1.inputs[0]) - test_group.links.new(armor_secondary_wear_remap_x_1.outputs[0], reroute_035_1.inputs[0]) - test_group.links.new(armor_secondary_wear_remap_y_1.outputs[0], reroute_036_1.inputs[0]) - test_group.links.new(armor_secondary_wear_remap_z_1.outputs[0], reroute_037_1.inputs[0]) - test_group.links.new(armor_secondary_wear_remap_w_1.outputs[0], reroute_038_1.inputs[0]) - test_group.links.new(cloth_primary_wear_remap_x_1.outputs[0], reroute_063_1.inputs[0]) - test_group.links.new(cloth_primary_wear_remap_y_1.outputs[0], reroute_064_1.inputs[0]) - test_group.links.new(cloth_primary_wear_remap_z_1.outputs[0], reroute_065_1.inputs[0]) - test_group.links.new(cloth_primary_wear_remap_w_1.outputs[0], reroute_066_1.inputs[0]) - test_group.links.new(cloth_secondary_wear_remap_x_1.outputs[0], reroute_091_1.inputs[0]) - test_group.links.new(cloth_secondary_wear_remap_y_1.outputs[0], reroute_092_1.inputs[0]) - test_group.links.new(cloth_secondary_wear_remap_z_1.outputs[0], reroute_093_1.inputs[0]) - test_group.links.new(cloth_secondary_wear_remap_w_1.outputs[0], reroute_094_1.inputs[0]) - test_group.links.new(suit_primary_wear_remap_x_1.outputs[0], reroute_119_1.inputs[0]) - test_group.links.new(suit_primary_wear_remap_y_1.outputs[0], reroute_120_1.inputs[0]) - test_group.links.new(suit_primary_wear_remap_z_1.outputs[0], reroute_121_1.inputs[0]) - test_group.links.new(suit_primary_wear_remap_w_1.outputs[0], reroute_122_1.inputs[0]) - test_group.links.new(suit_secondary_wear_remap_x_1.outputs[0], reroute_183_1.inputs[0]) - test_group.links.new(suit_secondary_wear_remap_y_1.outputs[0], reroute_184_1.inputs[0]) - test_group.links.new(suit_secondary_wear_remap_z_1.outputs[0], reroute_185_1.inputs[0]) - test_group.links.new(suit_secondary_wear_remap_w_1.outputs[0], reroute_186_1.inputs[0]) - test_group.links.new(armor_primary_detail_diffuse_blend_1.outputs[0], reroute_012_1.inputs[0]) - test_group.links.new(armor_primary_detail_normal_blend_1.outputs[0], reroute_013_1.inputs[0]) - test_group.links.new(armor_secondary_detail_diffuse_blend_1.outputs[0], reroute_040_1.inputs[0]) - test_group.links.new(armor_secondary_detail_normal_blend_1.outputs[0], reroute_041_1.inputs[0]) - test_group.links.new(cloth_primary_detail_diffuse_blend_1.outputs[0], reroute_068_1.inputs[0]) - test_group.links.new(cloth_primary_detail_normal_blend_1.outputs[0], reroute_069_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_diffuse_blend_1.outputs[0], reroute_095_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_normal_blend_1.outputs[0], reroute_097_1.inputs[0]) - test_group.links.new(suit_primary_detail_diffuse_blend_1.outputs[0], reroute_123_1.inputs[0]) - test_group.links.new(suit_primary_detail_normal_blend_1.outputs[0], reroute_125_1.inputs[0]) - test_group.links.new(suit_secondary_detail_diffuse_blend_1.outputs[0], reroute_187_1.inputs[0]) - test_group.links.new(suit_secondary_detail_normal_blend_1.outputs[0], reroute_188_1.inputs[0]) - test_group.links.new(armor_primary_detail_roughness_blend_1.outputs[0], reroute_014_1.inputs[0]) - test_group.links.new(armor_secondary_detail_roughness_blend_1.outputs[0], reroute_042_1.inputs[0]) - test_group.links.new(cloth_primary_detail_roughness_blend_1.outputs[0], reroute_070_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_roughness_blend_1.outputs[0], reroute_098_1.inputs[0]) - test_group.links.new(suit_primary_detail_roughness_blend_1.outputs[0], reroute_126_1.inputs[0]) - test_group.links.new(suit_secondary_detail_roughness_blend_1.outputs[0], reroute_189_1.inputs[0]) - test_group.links.new(mix_055_1.outputs[0], mix_056_1.inputs[1]) - test_group.links.new(mix_056_1.outputs[0], mix_057_1.inputs[1]) - test_group.links.new(mix_057_1.outputs[0], mix_058_1.inputs[1]) - test_group.links.new(mix_058_1.outputs[0], mix_059_1.inputs[1]) - test_group.links.new(mix_059_1.outputs[0], reroute_348_1.inputs[0]) - test_group.links.new(armor_primary_roughness_remap_x_1.outputs[0], reroute_001_1.inputs[0]) - test_group.links.new(armor_primary_roughness_remap_y_1.outputs[0], reroute_002_1.inputs[0]) - test_group.links.new(armor_primary_roughness_remap_z_1.outputs[0], reroute_003_1.inputs[0]) - test_group.links.new(armor_primary_roughness_remap_w_1.outputs[0], reroute_004_1.inputs[0]) - test_group.links.new(armor_secondary_roughness_remap_x_1.outputs[0], reroute_029_1.inputs[0]) - test_group.links.new(armor_secondary_roughness_remap_y_1.outputs[0], reroute_030_1.inputs[0]) - test_group.links.new(armor_secondary_roughness_remap_z_1.outputs[0], reroute_031_1.inputs[0]) - test_group.links.new(armor_secondary_roughness_remap_w_1.outputs[0], reroute_032_1.inputs[0]) - test_group.links.new(cloth_primary_roughness_remap_x_1.outputs[0], reroute_057_1.inputs[0]) - test_group.links.new(cloth_primary_roughness_remap_y_1.outputs[0], reroute_058_1.inputs[0]) - test_group.links.new(cloth_primary_roughness_remap_z_1.outputs[0], reroute_059_1.inputs[0]) - test_group.links.new(cloth_primary_roughness_remap_w_1.outputs[0], reroute_060_1.inputs[0]) - test_group.links.new(cloth_secondary_roughness_remap_x_1.outputs[0], reroute_085_1.inputs[0]) - test_group.links.new(cloth_secondary_roughness_remap_y_1.outputs[0], reroute_086_1.inputs[0]) - test_group.links.new(cloth_secondary_roughness_remap_z_1.outputs[0], reroute_087_1.inputs[0]) - test_group.links.new(cloth_secondary_roughness_remap_w_1.outputs[0], reroute_088_1.inputs[0]) - test_group.links.new(suit_primary_roughness_remap_x_1.outputs[0], reroute_113_1.inputs[0]) - test_group.links.new(suit_primary_roughness_remap_y_1.outputs[0], reroute_114_1.inputs[0]) - test_group.links.new(suit_primary_roughness_remap_z_1.outputs[0], reroute_115_1.inputs[0]) - test_group.links.new(suit_primary_roughness_remap_w_1.outputs[0], reroute_116_1.inputs[0]) - test_group.links.new(suit_secondary_roughness_remap_x_1.outputs[0], reroute_177_1.inputs[0]) - test_group.links.new(suit_secondary_roughness_remap_y_1.outputs[0], reroute_182_1.inputs[0]) - test_group.links.new(suit_secondary_roughness_remap_z_1.outputs[0], reroute_181_1.inputs[0]) - test_group.links.new(suit_secondary_roughness_remap_w_1.outputs[0], reroute_180_1.inputs[0]) - test_group.links.new(armor_primary_detail_diffuse_map_1.outputs[0], reroute_005_1.inputs[0]) - test_group.links.new(armor_secondary_detail_diffuse_map_1.outputs[0], reroute_033_1.inputs[0]) - test_group.links.new(cloth_primary_detail_diffuse_map_1.outputs[0], reroute_061_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_diffuse_map_1.outputs[0], reroute_089_1.inputs[0]) - test_group.links.new(suit_primary_detail_diffuse_map_1.outputs[0], reroute_117_1.inputs[0]) - test_group.links.new(suit_secondary_detail_diffuse_map_1.outputs[0], reroute_179_1.inputs[0]) - test_group.links.new(worn_armor_primary_roughness_remap_x_1.outputs[0], reroute_020_1.inputs[0]) - test_group.links.new(worn_armor_primary_roughness_remap_y_1.outputs[0], reroute_021_1.inputs[0]) - test_group.links.new(worn_armor_primary_roughness_remap_z_1.outputs[0], reroute_022_1.inputs[0]) - test_group.links.new(worn_armor_primary_roughness_remap_w_1.outputs[0], reroute_023_1.inputs[0]) - test_group.links.new(worn_armor_secondary_roughness_remap_x_1.outputs[0], reroute_048_1.inputs[0]) - test_group.links.new(worn_armor_secondary_roughness_remap_y_1.outputs[0], reroute_049_1.inputs[0]) - test_group.links.new(worn_armor_secondary_roughness_remap_z_1.outputs[0], reroute_050_1.inputs[0]) - test_group.links.new(worn_armor_secondary_roughness_remap_w_1.outputs[0], reroute_051_1.inputs[0]) - test_group.links.new(worn_cloth_primary_roughness_remap_x_1.outputs[0], reroute_076_1.inputs[0]) - test_group.links.new(worn_cloth_primary_roughness_remap_y_1.outputs[0], reroute_077_1.inputs[0]) - test_group.links.new(worn_cloth_primary_roughness_remap_z_1.outputs[0], reroute_078_1.inputs[0]) - test_group.links.new(worn_cloth_primary_roughness_remap_w_1.outputs[0], reroute_079_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_roughness_remap_x_1.outputs[0], reroute_104_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_roughness_remap_y_1.outputs[0], reroute_105_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_roughness_remap_z_1.outputs[0], reroute_106_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_roughness_remap_w_1.outputs[0], reroute_107_1.inputs[0]) - test_group.links.new(worn_suit_primary_roughness_remap_x_1.outputs[0], reroute_132_1.inputs[0]) - test_group.links.new(worn_suit_primary_roughness_remap_y_1.outputs[0], reroute_133_1.inputs[0]) - test_group.links.new(worn_suit_primary_roughness_remap_z_1.outputs[0], reroute_134_1.inputs[0]) - test_group.links.new(worn_suit_primary_roughness_remap_w_1.outputs[0], reroute_135_1.inputs[0]) - test_group.links.new(worn_suit_secondary_roughness_remap_x_1.outputs[0], reroute_196_1.inputs[0]) - test_group.links.new(worn_suit_secondary_roughness_remap_y_1.outputs[0], reroute_197_1.inputs[0]) - test_group.links.new(worn_suit_secondary_roughness_remap_z_1.outputs[0], reroute_198_1.inputs[0]) - test_group.links.new(worn_suit_secondary_roughness_remap_w_1.outputs[0], reroute_199_1.inputs[0]) - test_group.links.new(armor_primary_detail_diffuse_map_1.outputs[1], reroute_006_1.inputs[0]) - test_group.links.new(armor_secondary_detail_diffuse_map_1.outputs[1], reroute_034_1.inputs[0]) - test_group.links.new(cloth_primary_detail_diffuse_map_1.outputs[1], reroute_062_1.inputs[0]) - test_group.links.new(cloth_secondary_detail_diffuse_map_1.outputs[1], reroute_090_1.inputs[0]) - test_group.links.new(suit_primary_detail_diffuse_map_1.outputs[1], reroute_118_1.inputs[0]) - test_group.links.new(suit_secondary_detail_diffuse_map_1.outputs[1], reroute_178_1.inputs[0]) - test_group.links.new(armor_primary_dye_color_1.outputs[0], reroute_1.inputs[0]) - test_group.links.new(armor_secondary_dye_color_1.outputs[0], reroute_028_1.inputs[0]) - test_group.links.new(cloth_primary_dye_color_1.outputs[0], reroute_056_1.inputs[0]) - test_group.links.new(cloth_secondary_dye_color_1.outputs[0], reroute_084_1.inputs[0]) - test_group.links.new(suit_primary_dye_color_1.outputs[0], reroute_112_1.inputs[0]) - test_group.links.new(suit_secondary_dye_color_1.outputs[0], reroute_176_1.inputs[0]) - test_group.links.new(worn_armor_primary_dye_color_1.outputs[0], reroute_019_1.inputs[0]) - test_group.links.new(worn_armor_secondary_dye_color_1.outputs[0], reroute_047_1.inputs[0]) - test_group.links.new(worn_cloth_primary_dye_color_1.outputs[0], reroute_075_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_dye_color_1.outputs[0], reroute_103_1.inputs[0]) - test_group.links.new(worn_suit_primary_dye_color_1.outputs[0], reroute_131_1.inputs[0]) - test_group.links.new(worn_suit_secondary_dye_color_1.outputs[0], reroute_195_1.inputs[0]) - test_group.links.new(math_1.outputs[0], mix_055_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_056_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_057_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_058_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_059_1.inputs[0]) - test_group.links.new(armor_primary_transmission_1.outputs[0], reroute_017_1.inputs[0]) - test_group.links.new(armor_primary_iridescence_1.outputs[0], reroute_016_1.inputs[0]) - test_group.links.new(armor_primary_metalness_1.outputs[0], reroute_015_1.inputs[0]) - test_group.links.new(armor_secondary_metalness_1.outputs[0], reroute_043_1.inputs[0]) - test_group.links.new(armor_secondary_iridescence_1.outputs[0], reroute_044_1.inputs[0]) - test_group.links.new(armor_secondary_transmission_1.outputs[0], reroute_045_1.inputs[0]) - test_group.links.new(cloth_primary_metalness_1.outputs[0], reroute_071_1.inputs[0]) - test_group.links.new(cloth_primary_iridescence_1.outputs[0], reroute_072_1.inputs[0]) - test_group.links.new(cloth_primary_transmission_1.outputs[0], reroute_073_1.inputs[0]) - test_group.links.new(cloth_secondary_metalness_1.outputs[0], reroute_099_1.inputs[0]) - test_group.links.new(cloth_secondary_iridescence_1.outputs[0], reroute_100_1.inputs[0]) - test_group.links.new(cloth_secondary_transmission_1.outputs[0], reroute_101_1.inputs[0]) - test_group.links.new(suit_primary_metalness_1.outputs[0], reroute_127_1.inputs[0]) - test_group.links.new(suit_primary_iridescence_1.outputs[0], reroute_128_1.inputs[0]) - test_group.links.new(suit_primary_transmission_1.outputs[0], reroute_129_1.inputs[0]) - test_group.links.new(suit_secondary_metalness_1.outputs[0], reroute_190_1.inputs[0]) - test_group.links.new(suit_secondary_iridescence_1.outputs[0], reroute_191_1.inputs[0]) - test_group.links.new(worn_armor_primary_metalness_1.outputs[0], reroute_027_1.inputs[0]) - test_group.links.new(worn_armor_secondary_metalness_1.outputs[0], reroute_055_1.inputs[0]) - test_group.links.new(worn_cloth_primary_metalness_1.outputs[0], reroute_083_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_metalness_1.outputs[0], reroute_111_1.inputs[0]) - test_group.links.new(worn_suit_primary_metalness_1.outputs[0], reroute_139_1.inputs[0]) - test_group.links.new(worn_suit_secondary_metalness_1.outputs[0], reroute_203_1.inputs[0]) - test_group.links.new(armor_primary_emission_color_1.outputs[0], reroute_018_1.inputs[0]) - test_group.links.new(armor_secondary_emission_color_1.outputs[0], reroute_046_1.inputs[0]) - test_group.links.new(cloth_primary_emission_color_1.outputs[0], reroute_074_1.inputs[0]) - test_group.links.new(cloth_secondary_emission_color_1.outputs[0], reroute_102_1.inputs[0]) - test_group.links.new(suit_primary_emission_color_1.outputs[0], reroute_130_1.inputs[0]) - test_group.links.new(suit_secondary_emission_color_1.outputs[0], reroute_193_1.inputs[0]) - test_group.links.new(reroute_001_1.outputs[0], combine_xyz_012_1.inputs[0]) - test_group.links.new(reroute_002_1.outputs[0], combine_xyz_012_1.inputs[1]) - test_group.links.new(reroute_003_1.outputs[0], combine_xyz_012_1.inputs[2]) - test_group.links.new(reroute_004_1.outputs[0], combine_xyz_013_1.inputs[0]) - test_group.links.new(mix_064_1.outputs[0], mix_060_1.inputs[1]) - test_group.links.new(mix_060_1.outputs[0], mix_061_1.inputs[1]) - test_group.links.new(mix_061_1.outputs[0], mix_062_1.inputs[1]) - test_group.links.new(mix_062_1.outputs[0], mix_063_1.inputs[1]) - test_group.links.new(math_1.outputs[0], mix_064_1.inputs[0]) - test_group.links.new(math_001_1.outputs[0], mix_060_1.inputs[0]) - test_group.links.new(math_004_1.outputs[0], mix_061_1.inputs[0]) - test_group.links.new(math_007_1.outputs[0], mix_062_1.inputs[0]) - test_group.links.new(math_008_1.outputs[0], mix_063_1.inputs[0]) - test_group.links.new(worn_armor_primary_detail_diffuse_blend_1.outputs[0], reroute_024_1.inputs[0]) - test_group.links.new(worn_armor_primary_detail_normal_blend_1.outputs[0], reroute_025_1.inputs[0]) - test_group.links.new(worn_armor_primary_detail_roughness_blend_1.outputs[0], reroute_026_1.inputs[0]) - test_group.links.new(worn_armor_secondary_detail_diffuse_blend_1.outputs[0], reroute_052_1.inputs[0]) - test_group.links.new(worn_armor_secondary_detail_normal_blend_1.outputs[0], reroute_053_1.inputs[0]) - test_group.links.new(worn_armor_secondary_detail_roughness_blend_1.outputs[0], reroute_054_1.inputs[0]) - test_group.links.new(worn_cloth_primary_detail_diffuse_blend_1.outputs[0], reroute_080_1.inputs[0]) - test_group.links.new(worn_cloth_primary_detail_normal_blend_1.outputs[0], reroute_081_1.inputs[0]) - test_group.links.new(worn_cloth_primary_detail_roughness_blend_1.outputs[0], reroute_082_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_detail_diffuse_blend_1.outputs[0], reroute_108_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_detail_normal_blend_1.outputs[0], reroute_109_1.inputs[0]) - test_group.links.new(worn_cloth_secondary_detail_roughness_blend_1.outputs[0], reroute_110_1.inputs[0]) - test_group.links.new(worn_suit_primary_detail_diffuse_blend_1.outputs[0], reroute_136_1.inputs[0]) - test_group.links.new(worn_suit_primary_detail_normal_blend_1.outputs[0], reroute_137_1.inputs[0]) - test_group.links.new(worn_suit_primary_detail_roughness_blend_1.outputs[0], reroute_138_1.inputs[0]) - test_group.links.new(worn_suit_secondary_detail_diffuse_blend_1.outputs[0], reroute_200_1.inputs[0]) - test_group.links.new(worn_suit_secondary_detail_normal_blend_1.outputs[0], reroute_201_1.inputs[0]) - test_group.links.new(worn_suit_secondary_detail_roughness_blend_1.outputs[0], reroute_202_1.inputs[0]) - test_group.links.new(reroute_029_1.outputs[0], combine_xyz_014_1.inputs[0]) - test_group.links.new(reroute_030_1.outputs[0], combine_xyz_014_1.inputs[1]) - test_group.links.new(reroute_031_1.outputs[0], combine_xyz_014_1.inputs[2]) - test_group.links.new(reroute_032_1.outputs[0], combine_xyz_015_1.inputs[0]) - test_group.links.new(reroute_057_1.outputs[0], combine_xyz_016_1.inputs[0]) - test_group.links.new(reroute_058_1.outputs[0], combine_xyz_016_1.inputs[1]) - test_group.links.new(reroute_059_1.outputs[0], combine_xyz_016_1.inputs[2]) - test_group.links.new(reroute_060_1.outputs[0], combine_xyz_017_1.inputs[0]) - test_group.links.new(reroute_085_1.outputs[0], combine_xyz_018_1.inputs[0]) - test_group.links.new(reroute_086_1.outputs[0], combine_xyz_018_1.inputs[1]) - test_group.links.new(reroute_087_1.outputs[0], combine_xyz_018_1.inputs[2]) - test_group.links.new(reroute_088_1.outputs[0], combine_xyz_019_1.inputs[0]) - test_group.links.new(reroute_090_1.outputs[0], combine_xyz_019_1.inputs[1]) - test_group.links.new(reroute_078_1.outputs[0], reroute_258_1.inputs[0]) - test_group.links.new(reroute_079_1.outputs[0], reroute_259_1.inputs[0]) - test_group.links.new(reroute_077_1.outputs[0], reroute_257_1.inputs[0]) - test_group.links.new(reroute_076_1.outputs[0], reroute_256_1.inputs[0]) - test_group.links.new(reroute_062_1.outputs[0], combine_xyz_017_1.inputs[1]) - test_group.links.new(reroute_034_1.outputs[0], combine_xyz_015_1.inputs[1]) - test_group.links.new(reroute_048_1.outputs[0], reroute_248_1.inputs[0]) - test_group.links.new(reroute_049_1.outputs[0], reroute_250_1.inputs[0]) - test_group.links.new(reroute_050_1.outputs[0], reroute_251_1.inputs[0]) - test_group.links.new(reroute_051_1.outputs[0], reroute_252_1.inputs[0]) - test_group.links.new(reroute_006_1.outputs[0], combine_xyz_013_1.inputs[1]) - test_group.links.new(reroute_020_1.outputs[0], reroute_158_1.inputs[0]) - test_group.links.new(reroute_021_1.outputs[0], reroute_160_1.inputs[0]) - test_group.links.new(reroute_022_1.outputs[0], reroute_161_1.inputs[0]) - test_group.links.new(reroute_023_1.outputs[0], reroute_162_1.inputs[0]) - test_group.links.new(reroute_113_1.outputs[0], combine_xyz_024_1.inputs[0]) - test_group.links.new(reroute_114_1.outputs[0], combine_xyz_024_1.inputs[1]) - test_group.links.new(reroute_115_1.outputs[0], combine_xyz_024_1.inputs[2]) - test_group.links.new(reroute_116_1.outputs[0], combine_xyz_025_1.inputs[0]) - test_group.links.new(reroute_118_1.outputs[0], combine_xyz_025_1.inputs[1]) - test_group.links.new(reroute_177_1.outputs[0], combine_xyz_028_1.inputs[0]) - test_group.links.new(reroute_182_1.outputs[0], combine_xyz_028_1.inputs[1]) - test_group.links.new(reroute_181_1.outputs[0], combine_xyz_028_1.inputs[2]) - test_group.links.new(reroute_180_1.outputs[0], combine_xyz_029_1.inputs[0]) - test_group.links.new(reroute_178_1.outputs[0], combine_xyz_029_1.inputs[1]) - test_group.links.new(reroute_1.outputs[0], reroute_140_1.inputs[0]) - test_group.links.new(reroute_140_1.outputs[0], reroute_141_1.inputs[0]) - test_group.links.new(reroute_143_1.outputs[0], reroute_142_1.inputs[0]) - test_group.links.new(reroute_028_1.outputs[0], reroute_143_1.inputs[0]) - test_group.links.new(reroute_056_1.outputs[0], reroute_144_1.inputs[0]) - test_group.links.new(reroute_144_1.outputs[0], reroute_145_1.inputs[0]) - test_group.links.new(reroute_084_1.outputs[0], reroute_146_1.inputs[0]) - test_group.links.new(reroute_146_1.outputs[0], reroute_147_1.inputs[0]) - test_group.links.new(reroute_112_1.outputs[0], reroute_148_1.inputs[0]) - test_group.links.new(reroute_148_1.outputs[0], reroute_149_1.inputs[0]) - test_group.links.new(reroute_176_1.outputs[0], reroute_150_1.inputs[0]) - test_group.links.new(reroute_150_1.outputs[0], reroute_151_1.inputs[0]) - test_group.links.new(reroute_141_1.outputs[0], reroute_154_1.inputs[0]) - test_group.links.new(reroute_142_1.outputs[0], reroute_153_1.inputs[0]) - test_group.links.new(reroute_145_1.outputs[0], reroute_155_1.inputs[0]) - test_group.links.new(reroute_147_1.outputs[0], reroute_156_1.inputs[0]) - test_group.links.new(reroute_149_1.outputs[0], reroute_157_1.inputs[0]) - test_group.links.new(reroute_151_1.outputs[0], reroute_152_1.inputs[0]) - test_group.links.new(reroute_154_1.outputs[0], mix_1.inputs[1]) - test_group.links.new(reroute_153_1.outputs[0], mix_1.inputs[2]) - test_group.links.new(reroute_155_1.outputs[0], mix_001_1.inputs[2]) - test_group.links.new(reroute_156_1.outputs[0], mix_002_1.inputs[2]) - test_group.links.new(reroute_157_1.outputs[0], mix_003_1.inputs[2]) - test_group.links.new(reroute_152_1.outputs[0], mix_004_1.inputs[2]) - test_group.links.new(reroute_158_1.outputs[0], reroute_159_1.inputs[0]) - test_group.links.new(reroute_159_1.outputs[0], combine_xyz_013_1.inputs[2]) - test_group.links.new(reroute_160_1.outputs[0], reroute_163_1.inputs[0]) - test_group.links.new(reroute_163_1.outputs[0], combine_xyz_020_1.inputs[0]) - test_group.links.new(reroute_161_1.outputs[0], reroute_164_1.inputs[0]) - test_group.links.new(reroute_164_1.outputs[0], combine_xyz_020_1.inputs[1]) - test_group.links.new(reroute_162_1.outputs[0], reroute_165_1.inputs[0]) - test_group.links.new(reroute_165_1.outputs[0], combine_xyz_020_1.inputs[2]) - test_group.links.new(reroute_205_1.outputs[0], reroute_171_1.inputs[0]) - test_group.links.new(reroute_204_1.outputs[0], reroute_170_1.inputs[0]) - test_group.links.new(reroute_175_1.outputs[0], reroute_169_1.inputs[0]) - test_group.links.new(reroute_174_1.outputs[0], reroute_168_1.inputs[0]) - test_group.links.new(reroute_173_1.outputs[0], reroute_167_1.inputs[0]) - test_group.links.new(reroute_172_1.outputs[0], reroute_166_1.inputs[0]) - test_group.links.new(combine_xyz_012_1.outputs[0], reroute_172_1.inputs[0]) - test_group.links.new(combine_xyz_014_1.outputs[0], reroute_173_1.inputs[0]) - test_group.links.new(combine_xyz_016_1.outputs[0], reroute_174_1.inputs[0]) - test_group.links.new(combine_xyz_018_1.outputs[0], reroute_175_1.inputs[0]) - test_group.links.new(combine_xyz_024_1.outputs[0], reroute_204_1.inputs[0]) - test_group.links.new(combine_xyz_028_1.outputs[0], reroute_205_1.inputs[0]) - test_group.links.new(reroute_166_1.outputs[0], reroute_206_1.inputs[0]) - test_group.links.new(reroute_167_1.outputs[0], reroute_211_1.inputs[0]) - test_group.links.new(reroute_168_1.outputs[0], reroute_207_1.inputs[0]) - test_group.links.new(reroute_169_1.outputs[0], reroute_208_1.inputs[0]) - test_group.links.new(reroute_170_1.outputs[0], reroute_209_1.inputs[0]) - test_group.links.new(reroute_171_1.outputs[0], reroute_210_1.inputs[0]) - test_group.links.new(reroute_206_1.outputs[0], mix_020_1.inputs[1]) - test_group.links.new(reroute_211_1.outputs[0], mix_020_1.inputs[2]) - test_group.links.new(reroute_207_1.outputs[0], mix_021_1.inputs[2]) - test_group.links.new(reroute_208_1.outputs[0], mix_022_1.inputs[2]) - test_group.links.new(reroute_209_1.outputs[0], mix_023_1.inputs[2]) - test_group.links.new(reroute_210_1.outputs[0], mix_024_1.inputs[2]) - test_group.links.new(reroute_219_1.outputs[0], reroute_213_1.inputs[0]) - test_group.links.new(reroute_220_1.outputs[0], reroute_214_1.inputs[0]) - test_group.links.new(reroute_221_1.outputs[0], reroute_215_1.inputs[0]) - test_group.links.new(reroute_222_1.outputs[0], reroute_216_1.inputs[0]) - test_group.links.new(reroute_218_1.outputs[0], reroute_212_1.inputs[0]) - test_group.links.new(reroute_223_1.outputs[0], reroute_217_1.inputs[0]) - test_group.links.new(combine_xyz_013_1.outputs[0], reroute_219_1.inputs[0]) - test_group.links.new(combine_xyz_015_1.outputs[0], reroute_220_1.inputs[0]) - test_group.links.new(combine_xyz_017_1.outputs[0], reroute_221_1.inputs[0]) - test_group.links.new(combine_xyz_019_1.outputs[0], reroute_222_1.inputs[0]) - test_group.links.new(combine_xyz_025_1.outputs[0], reroute_218_1.inputs[0]) - test_group.links.new(combine_xyz_029_1.outputs[0], reroute_223_1.inputs[0]) - test_group.links.new(reroute_213_1.outputs[0], reroute_229_1.inputs[0]) - test_group.links.new(reroute_214_1.outputs[0], reroute_225_1.inputs[0]) - test_group.links.new(reroute_215_1.outputs[0], reroute_226_1.inputs[0]) - test_group.links.new(reroute_216_1.outputs[0], reroute_227_1.inputs[0]) - test_group.links.new(reroute_212_1.outputs[0], reroute_224_1.inputs[0]) - test_group.links.new(reroute_217_1.outputs[0], reroute_228_1.inputs[0]) - test_group.links.new(reroute_229_1.outputs[0], mix_025_1.inputs[1]) - test_group.links.new(reroute_225_1.outputs[0], mix_025_1.inputs[2]) - test_group.links.new(reroute_226_1.outputs[0], mix_026_1.inputs[2]) - test_group.links.new(reroute_227_1.outputs[0], mix_027_1.inputs[2]) - test_group.links.new(reroute_224_1.outputs[0], mix_028_1.inputs[2]) - test_group.links.new(reroute_228_1.outputs[0], mix_029_1.inputs[2]) - test_group.links.new(reroute_236_1.outputs[0], reroute_230_1.inputs[0]) - test_group.links.new(reroute_237_1.outputs[0], reroute_231_1.inputs[0]) - test_group.links.new(reroute_238_1.outputs[0], reroute_232_1.inputs[0]) - test_group.links.new(reroute_239_1.outputs[0], reroute_233_1.inputs[0]) - test_group.links.new(reroute_240_1.outputs[0], reroute_234_1.inputs[0]) - test_group.links.new(reroute_241_1.outputs[0], reroute_235_1.inputs[0]) - test_group.links.new(combine_xyz_020_1.outputs[0], reroute_241_1.inputs[0]) - test_group.links.new(combine_xyz_021_1.outputs[0], reroute_240_1.inputs[0]) - test_group.links.new(combine_xyz_022_1.outputs[0], reroute_239_1.inputs[0]) - test_group.links.new(combine_xyz_023_1.outputs[0], reroute_238_1.inputs[0]) - test_group.links.new(combine_xyz_026_1.outputs[0], reroute_237_1.inputs[0]) - test_group.links.new(combine_xyz_027_1.outputs[0], reroute_236_1.inputs[0]) - test_group.links.new(reroute_235_1.outputs[0], reroute_245_1.inputs[0]) - test_group.links.new(reroute_234_1.outputs[0], reroute_244_1.inputs[0]) - test_group.links.new(reroute_233_1.outputs[0], reroute_243_1.inputs[0]) - test_group.links.new(reroute_232_1.outputs[0], reroute_242_1.inputs[0]) - test_group.links.new(reroute_231_1.outputs[0], reroute_246_1.inputs[0]) - test_group.links.new(reroute_230_1.outputs[0], reroute_247_1.inputs[0]) - test_group.links.new(reroute_245_1.outputs[0], mix_030_1.inputs[1]) - test_group.links.new(reroute_244_1.outputs[0], mix_030_1.inputs[2]) - test_group.links.new(reroute_243_1.outputs[0], mix_031_1.inputs[2]) - test_group.links.new(reroute_242_1.outputs[0], mix_032_1.inputs[2]) - test_group.links.new(reroute_246_1.outputs[0], mix_033_1.inputs[2]) - test_group.links.new(reroute_247_1.outputs[0], mix_034_1.inputs[2]) - test_group.links.new(reroute_248_1.outputs[0], reroute_249_1.inputs[0]) - test_group.links.new(reroute_249_1.outputs[0], combine_xyz_015_1.inputs[2]) - test_group.links.new(reroute_250_1.outputs[0], reroute_253_1.inputs[0]) - test_group.links.new(reroute_251_1.outputs[0], reroute_254_1.inputs[0]) - test_group.links.new(reroute_252_1.outputs[0], reroute_255_1.inputs[0]) - test_group.links.new(reroute_253_1.outputs[0], combine_xyz_021_1.inputs[0]) - test_group.links.new(reroute_254_1.outputs[0], combine_xyz_021_1.inputs[1]) - test_group.links.new(reroute_255_1.outputs[0], combine_xyz_021_1.inputs[2]) - test_group.links.new(reroute_256_1.outputs[0], reroute_263_1.inputs[0]) - test_group.links.new(reroute_257_1.outputs[0], reroute_262_1.inputs[0]) - test_group.links.new(reroute_258_1.outputs[0], reroute_261_1.inputs[0]) - test_group.links.new(reroute_259_1.outputs[0], reroute_260_1.inputs[0]) - test_group.links.new(reroute_260_1.outputs[0], combine_xyz_022_1.inputs[2]) - test_group.links.new(reroute_261_1.outputs[0], combine_xyz_022_1.inputs[1]) - test_group.links.new(reroute_262_1.outputs[0], combine_xyz_022_1.inputs[0]) - test_group.links.new(reroute_263_1.outputs[0], combine_xyz_017_1.inputs[2]) - test_group.links.new(reroute_268_1.outputs[0], reroute_267_1.inputs[0]) - test_group.links.new(reroute_269_1.outputs[0], reroute_265_1.inputs[0]) - test_group.links.new(reroute_270_1.outputs[0], reroute_264_1.inputs[0]) - test_group.links.new(reroute_271_1.outputs[0], reroute_266_1.inputs[0]) - test_group.links.new(reroute_266_1.outputs[0], combine_xyz_023_1.inputs[2]) - test_group.links.new(reroute_264_1.outputs[0], combine_xyz_023_1.inputs[1]) - test_group.links.new(reroute_265_1.outputs[0], combine_xyz_023_1.inputs[0]) - test_group.links.new(reroute_267_1.outputs[0], combine_xyz_019_1.inputs[2]) - test_group.links.new(reroute_104_1.outputs[0], reroute_268_1.inputs[0]) - test_group.links.new(reroute_105_1.outputs[0], reroute_269_1.inputs[0]) - test_group.links.new(reroute_106_1.outputs[0], reroute_270_1.inputs[0]) - test_group.links.new(reroute_107_1.outputs[0], reroute_271_1.inputs[0]) - test_group.links.new(reroute_273_1.outputs[0], reroute_279_1.inputs[0]) - test_group.links.new(reroute_274_1.outputs[0], reroute_278_1.inputs[0]) - test_group.links.new(reroute_275_1.outputs[0], reroute_277_1.inputs[0]) - test_group.links.new(reroute_276_1.outputs[0], reroute_272_1.inputs[0]) - test_group.links.new(reroute_132_1.outputs[0], reroute_273_1.inputs[0]) - test_group.links.new(reroute_133_1.outputs[0], reroute_274_1.inputs[0]) - test_group.links.new(reroute_134_1.outputs[0], reroute_275_1.inputs[0]) - test_group.links.new(reroute_135_1.outputs[0], reroute_276_1.inputs[0]) - test_group.links.new(reroute_272_1.outputs[0], combine_xyz_026_1.inputs[2]) - test_group.links.new(reroute_277_1.outputs[0], combine_xyz_026_1.inputs[1]) - test_group.links.new(reroute_278_1.outputs[0], combine_xyz_026_1.inputs[0]) - test_group.links.new(reroute_279_1.outputs[0], combine_xyz_025_1.inputs[2]) - test_group.links.new(reroute_280_1.outputs[0], reroute_287_1.inputs[0]) - test_group.links.new(reroute_281_1.outputs[0], reroute_286_1.inputs[0]) - test_group.links.new(reroute_282_1.outputs[0], reroute_285_1.inputs[0]) - test_group.links.new(reroute_283_1.outputs[0], reroute_284_1.inputs[0]) - test_group.links.new(reroute_284_1.outputs[0], combine_xyz_027_1.inputs[2]) - test_group.links.new(reroute_285_1.outputs[0], combine_xyz_027_1.inputs[1]) - test_group.links.new(reroute_286_1.outputs[0], combine_xyz_027_1.inputs[0]) - test_group.links.new(reroute_287_1.outputs[0], combine_xyz_029_1.inputs[2]) - test_group.links.new(reroute_196_1.outputs[0], reroute_280_1.inputs[0]) - test_group.links.new(reroute_197_1.outputs[0], reroute_281_1.inputs[0]) - test_group.links.new(reroute_198_1.outputs[0], reroute_282_1.inputs[0]) - test_group.links.new(reroute_199_1.outputs[0], reroute_283_1.inputs[0]) - test_group.links.new(reroute_288_1.outputs[0], reroute_289_1.inputs[0]) - test_group.links.new(reroute_289_1.outputs[0], armor_primary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_288_1.outputs[0], reroute_290_1.inputs[0]) - test_group.links.new(reroute_290_1.outputs[0], armor_secondary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_291_1.outputs[0], reroute_292_1.inputs[0]) - test_group.links.new(reroute_292_1.outputs[0], armor_primary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_291_1.outputs[0], reroute_293_1.inputs[0]) - test_group.links.new(reroute_293_1.outputs[0], armor_secondary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_295_1.outputs[0], armor_detail_normal_transform_1.inputs[0]) - test_group.links.new(reroute_295_1.outputs[0], reroute_296_1.inputs[0]) - test_group.links.new(reroute_296_1.outputs[0], armor_detail_diffuse_transform_1.inputs[0]) - test_group.links.new(reroute_298_1.outputs[0], cloth_detail_normal_transform_1.inputs[0]) - test_group.links.new(reroute_299_1.outputs[0], cloth_detail_diffuse_transform_1.inputs[0]) - test_group.links.new(uv_map_1.outputs[0], reroute_300_1.inputs[0]) - test_group.links.new(reroute_300_1.outputs[0], reroute_299_1.inputs[0]) - test_group.links.new(reroute_300_1.outputs[0], reroute_298_1.inputs[0]) - test_group.links.new(reroute_299_1.outputs[0], reroute_295_1.inputs[0]) - test_group.links.new(reroute_298_1.outputs[0], reroute_301_1.inputs[0]) - test_group.links.new(reroute_301_1.outputs[0], suit_detail_diffuse_transform_1.inputs[0]) - test_group.links.new(reroute_301_1.outputs[0], reroute_302_1.inputs[0]) - test_group.links.new(reroute_302_1.outputs[0], suit_detail_normal_transform_1.inputs[0]) - test_group.links.new(reroute_294_1.outputs[0], reroute_307_1.inputs[0]) - test_group.links.new(reroute_297_1.outputs[0], reroute_308_1.inputs[0]) - test_group.links.new(reroute_303_1.outputs[0], reroute_309_1.inputs[0]) - test_group.links.new(reroute_304_1.outputs[0], reroute_310_1.inputs[0]) - test_group.links.new(reroute_305_1.outputs[0], reroute_311_1.inputs[0]) - test_group.links.new(reroute_306_1.outputs[0], reroute_312_1.inputs[0]) - test_group.links.new(reroute_307_1.outputs[0], mix_005_1.inputs[1]) - test_group.links.new(reroute_308_1.outputs[0], mix_005_1.inputs[2]) - test_group.links.new(reroute_309_1.outputs[0], mix_006_1.inputs[2]) - test_group.links.new(reroute_310_1.outputs[0], mix_007_1.inputs[2]) - test_group.links.new(reroute_311_1.outputs[0], mix_008_1.inputs[2]) - test_group.links.new(reroute_312_1.outputs[0], mix_009_1.inputs[2]) - test_group.links.new(reroute_318_1.outputs[0], reroute_306_1.inputs[0]) - test_group.links.new(reroute_317_1.outputs[0], reroute_305_1.inputs[0]) - test_group.links.new(reroute_316_1.outputs[0], reroute_304_1.inputs[0]) - test_group.links.new(reroute_315_1.outputs[0], reroute_303_1.inputs[0]) - test_group.links.new(reroute_314_1.outputs[0], reroute_297_1.inputs[0]) - test_group.links.new(reroute_313_1.outputs[0], reroute_294_1.inputs[0]) - test_group.links.new(reroute_019_1.outputs[0], reroute_313_1.inputs[0]) - test_group.links.new(reroute_047_1.outputs[0], reroute_314_1.inputs[0]) - test_group.links.new(reroute_075_1.outputs[0], reroute_315_1.inputs[0]) - test_group.links.new(reroute_103_1.outputs[0], reroute_316_1.inputs[0]) - test_group.links.new(reroute_131_1.outputs[0], reroute_317_1.inputs[0]) - test_group.links.new(reroute_195_1.outputs[0], reroute_318_1.inputs[0]) - test_group.links.new(reroute_319_1.outputs[0], reroute_323_1.inputs[0]) - test_group.links.new(reroute_320_1.outputs[0], reroute_321_1.inputs[0]) - test_group.links.new(reroute_321_1.outputs[0], cloth_primary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_320_1.outputs[0], reroute_322_1.inputs[0]) - test_group.links.new(reroute_322_1.outputs[0], cloth_secondary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_323_1.outputs[0], cloth_primary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_319_1.outputs[0], reroute_324_1.inputs[0]) - test_group.links.new(reroute_324_1.outputs[0], cloth_secondary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_328_1.outputs[0], reroute_327_1.inputs[0]) - test_group.links.new(reroute_325_1.outputs[0], reroute_330_1.inputs[0]) - test_group.links.new(reroute_325_1.outputs[0], reroute_326_1.inputs[0]) - test_group.links.new(reroute_328_1.outputs[0], reroute_329_1.inputs[0]) - test_group.links.new(suit_detail_normal_transform_1.outputs[0], reroute_325_1.inputs[0]) - test_group.links.new(suit_detail_diffuse_transform_1.outputs[0], reroute_328_1.inputs[0]) - test_group.links.new(reroute_330_1.outputs[0], suit_primary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_326_1.outputs[0], suit_secondary_detail_normal_map_1.inputs[0]) - test_group.links.new(reroute_329_1.outputs[0], suit_secondary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_327_1.outputs[0], suit_primary_detail_diffuse_map_1.inputs[0]) - test_group.links.new(reroute_007_1.outputs[0], combine_xyz_1.inputs[0]) - test_group.links.new(reroute_008_1.outputs[0], combine_xyz_1.inputs[1]) - test_group.links.new(reroute_009_1.outputs[0], combine_xyz_1.inputs[2]) - test_group.links.new(reroute_010_1.outputs[0], combine_xyz_001_1.inputs[0]) - test_group.links.new(combine_xyz_1.outputs[0], reroute_331_1.inputs[0]) - test_group.links.new(combine_xyz_001_1.outputs[0], reroute_332_1.inputs[0]) - test_group.links.new(reroute_331_1.outputs[0], reroute_333_1.inputs[0]) - test_group.links.new(reroute_332_1.outputs[0], reroute_334_1.inputs[0]) - test_group.links.new(reroute_333_1.outputs[0], reroute_335_1.inputs[0]) - test_group.links.new(reroute_334_1.outputs[0], reroute_336_1.inputs[0]) - test_group.links.new(reroute_335_1.outputs[0], mix_010_1.inputs[1]) - test_group.links.new(reroute_336_1.outputs[0], mix_015_1.inputs[1]) - test_group.links.new(mix_063_1.outputs[0], reroute_349_1.inputs[0]) - test_group.links.new(reroute_337_1.outputs[0], reroute_350_1.inputs[0]) - test_group.links.new(reroute_338_1.outputs[0], reroute_351_1.inputs[0]) - test_group.links.new(reroute_339_1.outputs[0], reroute_352_1.inputs[0]) - test_group.links.new(reroute_340_1.outputs[0], reroute_353_1.inputs[0]) - test_group.links.new(reroute_341_1.outputs[0], reroute_354_1.inputs[0]) - test_group.links.new(reroute_342_1.outputs[0], reroute_355_1.inputs[0]) - test_group.links.new(reroute_343_1.outputs[0], reroute_356_1.inputs[0]) - test_group.links.new(reroute_344_1.outputs[0], reroute_357_1.inputs[0]) - test_group.links.new(reroute_345_1.outputs[0], reroute_358_1.inputs[0]) - test_group.links.new(reroute_346_1.outputs[0], reroute_359_1.inputs[0]) - test_group.links.new(reroute_347_1.outputs[0], reroute_360_1.inputs[0]) - test_group.links.new(reroute_348_1.outputs[0], reroute_361_1.inputs[0]) - test_group.links.new(reroute_349_1.outputs[0], reroute_362_1.inputs[0]) - test_group.links.new(reroute_350_1.outputs[0], group_output_1.inputs[0]) - test_group.links.new(reroute_351_1.outputs[0], group_output_1.inputs[1]) - test_group.links.new(reroute_352_1.outputs[0], group_output_1.inputs[2]) - test_group.links.new(reroute_353_1.outputs[0], group_output_1.inputs[3]) - test_group.links.new(reroute_354_1.outputs[0], group_output_1.inputs[4]) - test_group.links.new(reroute_355_1.outputs[0], group_output_1.inputs[5]) - test_group.links.new(reroute_356_1.outputs[0], group_output_1.inputs[6]) - test_group.links.new(reroute_357_1.outputs[0], group_output_1.inputs[8]) - test_group.links.new(reroute_358_1.outputs[0], group_output_1.inputs[9]) - test_group.links.new(reroute_359_1.outputs[0], group_output_1.inputs[11]) - test_group.links.new(reroute_360_1.outputs[0], group_output_1.inputs[12]) - test_group.links.new(reroute_361_1.outputs[0], group_output_1.inputs[10]) - test_group.links.new(reroute_362_1.outputs[0], group_output_1.inputs[7]) - test_group.links.new(reroute_035_1.outputs[0], combine_xyz_002_1.inputs[0]) - test_group.links.new(reroute_036_1.outputs[0], combine_xyz_002_1.inputs[1]) - test_group.links.new(reroute_037_1.outputs[0], combine_xyz_002_1.inputs[2]) - test_group.links.new(reroute_038_1.outputs[0], combine_xyz_003_1.inputs[0]) - test_group.links.new(reroute_063_1.outputs[0], combine_xyz_005_1.inputs[0]) - test_group.links.new(reroute_064_1.outputs[0], combine_xyz_005_1.inputs[1]) - test_group.links.new(reroute_065_1.outputs[0], combine_xyz_005_1.inputs[2]) - test_group.links.new(reroute_066_1.outputs[0], combine_xyz_004_1.inputs[0]) - test_group.links.new(reroute_091_1.outputs[0], combine_xyz_007_1.inputs[0]) - test_group.links.new(reroute_092_1.outputs[0], combine_xyz_007_1.inputs[1]) - test_group.links.new(reroute_093_1.outputs[0], combine_xyz_007_1.inputs[2]) - test_group.links.new(reroute_094_1.outputs[0], combine_xyz_006_1.inputs[0]) - test_group.links.new(reroute_119_1.outputs[0], combine_xyz_008_1.inputs[0]) - test_group.links.new(reroute_120_1.outputs[0], combine_xyz_008_1.inputs[1]) - test_group.links.new(reroute_121_1.outputs[0], combine_xyz_008_1.inputs[2]) - test_group.links.new(reroute_122_1.outputs[0], combine_xyz_009_1.inputs[0]) - test_group.links.new(reroute_183_1.outputs[0], combine_xyz_010_1.inputs[0]) - test_group.links.new(reroute_184_1.outputs[0], combine_xyz_010_1.inputs[1]) - test_group.links.new(reroute_185_1.outputs[0], combine_xyz_010_1.inputs[2]) - test_group.links.new(reroute_186_1.outputs[0], combine_xyz_011_1.inputs[0]) - test_group.links.new(armor_secondary_fuzz_1.outputs[0], reroute_364_1.inputs[0]) - test_group.links.new(cloth_primary_fuzz_1.outputs[0], reroute_365_1.inputs[0]) - test_group.links.new(cloth_secondary_fuzz_1.outputs[0], reroute_366_1.inputs[0]) - test_group.links.new(suit_primary_fuzz_1.outputs[0], reroute_367_1.inputs[0]) - test_group.links.new(suit_secondary_transmission_1.outputs[0], reroute_192_1.inputs[0]) - test_group.links.new(suit_secondary_fuzz_1.outputs[0], reroute_368_1.inputs[0]) - test_group.links.new(reroute_012_1.outputs[0], combine_xyz_030_1.inputs[0]) - test_group.links.new(reroute_013_1.outputs[0], combine_xyz_030_1.inputs[1]) - test_group.links.new(reroute_014_1.outputs[0], combine_xyz_030_1.inputs[2]) - test_group.links.new(reroute_024_1.outputs[0], combine_xyz_032_1.inputs[0]) - test_group.links.new(reroute_025_1.outputs[0], combine_xyz_032_1.inputs[1]) - test_group.links.new(reroute_026_1.outputs[0], combine_xyz_032_1.inputs[2]) - test_group.links.new(reroute_027_1.outputs[0], reroute_371_1.inputs[0]) - test_group.links.new(reroute_015_1.outputs[0], reroute_372_1.inputs[0]) - test_group.links.new(reroute_016_1.outputs[0], combine_xyz_031_1.inputs[0]) - test_group.links.new(reroute_363_1.outputs[0], combine_xyz_031_1.inputs[1]) - test_group.links.new(reroute_017_1.outputs[0], combine_xyz_031_1.inputs[2]) - test_group.links.new(reroute_371_1.outputs[0], reroute_373_1.inputs[0]) - test_group.links.new(reroute_372_1.outputs[0], reroute_374_1.inputs[0]) - test_group.links.new(reroute_373_1.outputs[0], combine_xyz_001_1.inputs[2]) - test_group.links.new(reroute_374_1.outputs[0], combine_xyz_001_1.inputs[1]) - test_group.links.new(combine_xyz_002_1.outputs[0], reroute_380_1.inputs[0]) - test_group.links.new(reroute_380_1.outputs[0], reroute_375_1.inputs[0]) - test_group.links.new(reroute_375_1.outputs[0], reroute_381_1.inputs[0]) - test_group.links.new(reroute_376_1.outputs[0], reroute_382_1.inputs[0]) - test_group.links.new(reroute_377_1.outputs[0], reroute_383_1.inputs[0]) - test_group.links.new(reroute_378_1.outputs[0], reroute_384_1.inputs[0]) - test_group.links.new(reroute_379_1.outputs[0], reroute_385_1.inputs[0]) - test_group.links.new(reroute_043_1.outputs[0], reroute_386_1.inputs[0]) - test_group.links.new(reroute_055_1.outputs[0], reroute_389_1.inputs[0]) - test_group.links.new(reroute_386_1.outputs[0], reroute_387_1.inputs[0]) - test_group.links.new(reroute_387_1.outputs[0], combine_xyz_003_1.inputs[1]) - test_group.links.new(reroute_388_1.outputs[0], combine_xyz_003_1.inputs[2]) - test_group.links.new(reroute_389_1.outputs[0], reroute_388_1.inputs[0]) - test_group.links.new(reroute_071_1.outputs[0], reroute_390_1.inputs[0]) - test_group.links.new(reroute_083_1.outputs[0], reroute_393_1.inputs[0]) - test_group.links.new(reroute_390_1.outputs[0], reroute_391_1.inputs[0]) - test_group.links.new(reroute_391_1.outputs[0], combine_xyz_004_1.inputs[1]) - test_group.links.new(reroute_392_1.outputs[0], combine_xyz_004_1.inputs[2]) - test_group.links.new(reroute_393_1.outputs[0], reroute_392_1.inputs[0]) - test_group.links.new(reroute_099_1.outputs[0], reroute_394_1.inputs[0]) - test_group.links.new(reroute_111_1.outputs[0], reroute_397_1.inputs[0]) - test_group.links.new(reroute_394_1.outputs[0], reroute_395_1.inputs[0]) - test_group.links.new(reroute_395_1.outputs[0], combine_xyz_006_1.inputs[1]) - test_group.links.new(reroute_396_1.outputs[0], combine_xyz_006_1.inputs[2]) - test_group.links.new(reroute_397_1.outputs[0], reroute_396_1.inputs[0]) - test_group.links.new(reroute_127_1.outputs[0], reroute_398_1.inputs[0]) - test_group.links.new(reroute_139_1.outputs[0], reroute_401_1.inputs[0]) - test_group.links.new(reroute_398_1.outputs[0], reroute_399_1.inputs[0]) - test_group.links.new(reroute_399_1.outputs[0], combine_xyz_009_1.inputs[1]) - test_group.links.new(reroute_400_1.outputs[0], combine_xyz_009_1.inputs[2]) - test_group.links.new(reroute_401_1.outputs[0], reroute_400_1.inputs[0]) - test_group.links.new(reroute_190_1.outputs[0], reroute_402_1.inputs[0]) - test_group.links.new(reroute_203_1.outputs[0], reroute_405_1.inputs[0]) - test_group.links.new(reroute_402_1.outputs[0], reroute_403_1.inputs[0]) - test_group.links.new(reroute_403_1.outputs[0], combine_xyz_011_1.inputs[1]) - test_group.links.new(reroute_404_1.outputs[0], combine_xyz_011_1.inputs[2]) - test_group.links.new(reroute_405_1.outputs[0], reroute_404_1.inputs[0]) - test_group.links.new(combine_xyz_005_1.outputs[0], reroute_406_1.inputs[0]) - test_group.links.new(reroute_406_1.outputs[0], reroute_376_1.inputs[0]) - test_group.links.new(combine_xyz_007_1.outputs[0], reroute_407_1.inputs[0]) - test_group.links.new(reroute_407_1.outputs[0], reroute_377_1.inputs[0]) - test_group.links.new(combine_xyz_008_1.outputs[0], reroute_408_1.inputs[0]) - test_group.links.new(combine_xyz_010_1.outputs[0], reroute_409_1.inputs[0]) - test_group.links.new(reroute_408_1.outputs[0], reroute_378_1.inputs[0]) - test_group.links.new(reroute_409_1.outputs[0], reroute_379_1.inputs[0]) - test_group.links.new(reroute_410_1.outputs[0], reroute_415_1.inputs[0]) - test_group.links.new(reroute_411_1.outputs[0], reroute_416_1.inputs[0]) - test_group.links.new(reroute_412_1.outputs[0], reroute_417_1.inputs[0]) - test_group.links.new(reroute_413_1.outputs[0], reroute_418_1.inputs[0]) - test_group.links.new(combine_xyz_003_1.outputs[0], reroute_420_1.inputs[0]) - test_group.links.new(reroute_420_1.outputs[0], reroute_410_1.inputs[0]) - test_group.links.new(reroute_421_1.outputs[0], reroute_411_1.inputs[0]) - test_group.links.new(combine_xyz_004_1.outputs[0], reroute_421_1.inputs[0]) - test_group.links.new(reroute_424_1.outputs[0], reroute_414_1.inputs[0]) - test_group.links.new(reroute_423_1.outputs[0], reroute_413_1.inputs[0]) - test_group.links.new(reroute_422_1.outputs[0], reroute_412_1.inputs[0]) - test_group.links.new(reroute_414_1.outputs[0], reroute_419_1.inputs[0]) - test_group.links.new(combine_xyz_006_1.outputs[0], reroute_422_1.inputs[0]) - test_group.links.new(combine_xyz_009_1.outputs[0], reroute_423_1.inputs[0]) - test_group.links.new(combine_xyz_011_1.outputs[0], reroute_424_1.inputs[0]) - test_group.links.new(reroute_381_1.outputs[0], mix_010_1.inputs[2]) - test_group.links.new(reroute_382_1.outputs[0], mix_011_1.inputs[2]) - test_group.links.new(reroute_383_1.outputs[0], mix_012_1.inputs[2]) - test_group.links.new(reroute_384_1.outputs[0], mix_013_1.inputs[2]) - test_group.links.new(reroute_385_1.outputs[0], mix_014_1.inputs[2]) - test_group.links.new(reroute_415_1.outputs[0], mix_015_1.inputs[2]) - test_group.links.new(reroute_416_1.outputs[0], mix_016_1.inputs[2]) - test_group.links.new(reroute_417_1.outputs[0], mix_017_1.inputs[2]) - test_group.links.new(reroute_418_1.outputs[0], mix_018_1.inputs[2]) - test_group.links.new(reroute_419_1.outputs[0], mix_019_1.inputs[2]) - test_group.links.new(combine_xyz_030_1.outputs[0], reroute_425_1.inputs[0]) - test_group.links.new(reroute_425_1.outputs[0], reroute_426_1.inputs[0]) - test_group.links.new(reroute_426_1.outputs[0], reroute_432_1.inputs[0]) - test_group.links.new(reroute_427_1.outputs[0], reroute_433_1.inputs[0]) - test_group.links.new(reroute_428_1.outputs[0], reroute_434_1.inputs[0]) - test_group.links.new(reroute_429_1.outputs[0], reroute_435_1.inputs[0]) - test_group.links.new(reroute_430_1.outputs[0], reroute_436_1.inputs[0]) - test_group.links.new(reroute_431_1.outputs[0], reroute_437_1.inputs[0]) - test_group.links.new(reroute_441_1.outputs[0], reroute_431_1.inputs[0]) - test_group.links.new(reroute_440_1.outputs[0], reroute_430_1.inputs[0]) - test_group.links.new(reroute_439_1.outputs[0], reroute_429_1.inputs[0]) - test_group.links.new(reroute_438_1.outputs[0], reroute_428_1.inputs[0]) - test_group.links.new(reroute_442_1.outputs[0], reroute_427_1.inputs[0]) - test_group.links.new(reroute_040_1.outputs[0], combine_xyz_033_1.inputs[0]) - test_group.links.new(reroute_041_1.outputs[0], combine_xyz_033_1.inputs[1]) - test_group.links.new(reroute_042_1.outputs[0], combine_xyz_033_1.inputs[2]) - test_group.links.new(combine_xyz_033_1.outputs[0], reroute_442_1.inputs[0]) - test_group.links.new(reroute_068_1.outputs[0], combine_xyz_034_1.inputs[0]) - test_group.links.new(reroute_069_1.outputs[0], combine_xyz_034_1.inputs[1]) - test_group.links.new(reroute_070_1.outputs[0], combine_xyz_034_1.inputs[2]) - test_group.links.new(combine_xyz_034_1.outputs[0], reroute_438_1.inputs[0]) - test_group.links.new(reroute_095_1.outputs[0], combine_xyz_035_1.inputs[0]) - test_group.links.new(reroute_097_1.outputs[0], combine_xyz_035_1.inputs[1]) - test_group.links.new(reroute_098_1.outputs[0], combine_xyz_035_1.inputs[2]) - test_group.links.new(combine_xyz_035_1.outputs[0], reroute_439_1.inputs[0]) - test_group.links.new(reroute_123_1.outputs[0], combine_xyz_036_1.inputs[0]) - test_group.links.new(reroute_125_1.outputs[0], combine_xyz_036_1.inputs[1]) - test_group.links.new(reroute_126_1.outputs[0], combine_xyz_036_1.inputs[2]) - test_group.links.new(combine_xyz_036_1.outputs[0], reroute_440_1.inputs[0]) - test_group.links.new(reroute_187_1.outputs[0], combine_xyz_037_1.inputs[0]) - test_group.links.new(reroute_188_1.outputs[0], combine_xyz_037_1.inputs[1]) - test_group.links.new(reroute_189_1.outputs[0], combine_xyz_037_1.inputs[2]) - test_group.links.new(combine_xyz_037_1.outputs[0], reroute_441_1.inputs[0]) - test_group.links.new(reroute_432_1.outputs[0], mix_040_1.inputs[1]) - test_group.links.new(reroute_433_1.outputs[0], mix_040_1.inputs[2]) - test_group.links.new(reroute_434_1.outputs[0], mix_041_1.inputs[2]) - test_group.links.new(reroute_435_1.outputs[0], mix_042_1.inputs[2]) - test_group.links.new(reroute_436_1.outputs[0], mix_043_1.inputs[2]) - test_group.links.new(reroute_437_1.outputs[0], mix_044_1.inputs[2]) - test_group.links.new(reroute_459_1.outputs[0], reroute_448_1.inputs[0]) - test_group.links.new(reroute_458_1.outputs[0], reroute_447_1.inputs[0]) - test_group.links.new(reroute_457_1.outputs[0], reroute_446_1.inputs[0]) - test_group.links.new(reroute_456_1.outputs[0], reroute_445_1.inputs[0]) - test_group.links.new(reroute_455_1.outputs[0], reroute_444_1.inputs[0]) - test_group.links.new(reroute_460_1.outputs[0], reroute_443_1.inputs[0]) - test_group.links.new(reroute_005_1.outputs[0], reroute_460_1.inputs[0]) - test_group.links.new(reroute_033_1.outputs[0], reroute_455_1.inputs[0]) - test_group.links.new(reroute_061_1.outputs[0], reroute_456_1.inputs[0]) - test_group.links.new(reroute_089_1.outputs[0], reroute_457_1.inputs[0]) - test_group.links.new(reroute_117_1.outputs[0], reroute_458_1.inputs[0]) - test_group.links.new(reroute_179_1.outputs[0], reroute_459_1.inputs[0]) - test_group.links.new(reroute_443_1.outputs[0], reroute_466_1.inputs[0]) - test_group.links.new(reroute_444_1.outputs[0], reroute_461_1.inputs[0]) - test_group.links.new(reroute_445_1.outputs[0], reroute_462_1.inputs[0]) - test_group.links.new(reroute_446_1.outputs[0], reroute_463_1.inputs[0]) - test_group.links.new(reroute_447_1.outputs[0], reroute_464_1.inputs[0]) - test_group.links.new(reroute_448_1.outputs[0], reroute_465_1.inputs[0]) - test_group.links.new(reroute_466_1.outputs[0], mix_064_1.inputs[1]) - test_group.links.new(reroute_461_1.outputs[0], mix_064_1.inputs[2]) - test_group.links.new(reroute_462_1.outputs[0], mix_060_1.inputs[2]) - test_group.links.new(reroute_463_1.outputs[0], mix_061_1.inputs[2]) - test_group.links.new(reroute_464_1.outputs[0], mix_062_1.inputs[2]) - test_group.links.new(reroute_465_1.outputs[0], mix_063_1.inputs[2]) - test_group.links.new(reroute_471_1.outputs[0], reroute_453_1.inputs[0]) - test_group.links.new(reroute_470_1.outputs[0], reroute_452_1.inputs[0]) - test_group.links.new(reroute_469_1.outputs[0], reroute_451_1.inputs[0]) - test_group.links.new(reroute_468_1.outputs[0], reroute_450_1.inputs[0]) - test_group.links.new(reroute_467_1.outputs[0], reroute_449_1.inputs[0]) - test_group.links.new(reroute_472_1.outputs[0], reroute_454_1.inputs[0]) - test_group.links.new(reroute_454_1.outputs[0], reroute_478_1.inputs[0]) - test_group.links.new(reroute_449_1.outputs[0], reroute_473_1.inputs[0]) - test_group.links.new(reroute_450_1.outputs[0], reroute_474_1.inputs[0]) - test_group.links.new(reroute_451_1.outputs[0], reroute_475_1.inputs[0]) - test_group.links.new(reroute_452_1.outputs[0], reroute_476_1.inputs[0]) - test_group.links.new(reroute_453_1.outputs[0], reroute_477_1.inputs[0]) - test_group.links.new(reroute_478_1.outputs[0], mix_035_1.inputs[1]) - test_group.links.new(reroute_473_1.outputs[0], mix_035_1.inputs[2]) - test_group.links.new(reroute_474_1.outputs[0], mix_036_1.inputs[2]) - test_group.links.new(reroute_475_1.outputs[0], mix_037_1.inputs[2]) - test_group.links.new(reroute_476_1.outputs[0], mix_038_1.inputs[2]) - test_group.links.new(reroute_477_1.outputs[0], mix_039_1.inputs[2]) - test_group.links.new(reroute_011_1.outputs[0], reroute_472_1.inputs[0]) - test_group.links.new(reroute_039_1.outputs[0], reroute_467_1.inputs[0]) - test_group.links.new(reroute_067_1.outputs[0], reroute_468_1.inputs[0]) - test_group.links.new(reroute_096_1.outputs[0], reroute_469_1.inputs[0]) - test_group.links.new(reroute_124_1.outputs[0], reroute_470_1.inputs[0]) - test_group.links.new(reroute_194_1.outputs[0], reroute_471_1.inputs[0]) - test_group.links.new(reroute_489_1.outputs[0], reroute_484_1.inputs[0]) - test_group.links.new(reroute_488_1.outputs[0], reroute_483_1.inputs[0]) - test_group.links.new(reroute_487_1.outputs[0], reroute_482_1.inputs[0]) - test_group.links.new(reroute_486_1.outputs[0], reroute_481_1.inputs[0]) - test_group.links.new(reroute_485_1.outputs[0], reroute_480_1.inputs[0]) - test_group.links.new(reroute_370_1.outputs[0], reroute_369_1.inputs[0]) - test_group.links.new(combine_xyz_031_1.outputs[0], reroute_370_1.inputs[0]) - test_group.links.new(reroute_044_1.outputs[0], combine_xyz_038_1.inputs[0]) - test_group.links.new(reroute_364_1.outputs[0], combine_xyz_038_1.inputs[1]) - test_group.links.new(reroute_045_1.outputs[0], combine_xyz_038_1.inputs[2]) - test_group.links.new(combine_xyz_038_1.outputs[0], reroute_485_1.inputs[0]) - test_group.links.new(reroute_072_1.outputs[0], combine_xyz_039_1.inputs[0]) - test_group.links.new(reroute_365_1.outputs[0], combine_xyz_039_1.inputs[1]) - test_group.links.new(reroute_073_1.outputs[0], combine_xyz_039_1.inputs[2]) - test_group.links.new(combine_xyz_039_1.outputs[0], reroute_486_1.inputs[0]) - test_group.links.new(reroute_100_1.outputs[0], combine_xyz_040_1.inputs[0]) - test_group.links.new(reroute_366_1.outputs[0], combine_xyz_040_1.inputs[1]) - test_group.links.new(reroute_101_1.outputs[0], combine_xyz_040_1.inputs[2]) - test_group.links.new(combine_xyz_040_1.outputs[0], reroute_487_1.inputs[0]) - test_group.links.new(reroute_128_1.outputs[0], combine_xyz_041_1.inputs[0]) - test_group.links.new(reroute_367_1.outputs[0], combine_xyz_041_1.inputs[1]) - test_group.links.new(reroute_129_1.outputs[0], combine_xyz_041_1.inputs[2]) - test_group.links.new(combine_xyz_041_1.outputs[0], reroute_488_1.inputs[0]) - test_group.links.new(combine_xyz_042_1.outputs[0], reroute_489_1.inputs[0]) - test_group.links.new(reroute_191_1.outputs[0], combine_xyz_042_1.inputs[0]) - test_group.links.new(reroute_368_1.outputs[0], combine_xyz_042_1.inputs[1]) - test_group.links.new(reroute_192_1.outputs[0], combine_xyz_042_1.inputs[2]) - test_group.links.new(reroute_369_1.outputs[0], reroute_479_1.inputs[0]) - test_group.links.new(reroute_480_1.outputs[0], reroute_490_1.inputs[0]) - test_group.links.new(reroute_481_1.outputs[0], reroute_491_1.inputs[0]) - test_group.links.new(reroute_482_1.outputs[0], reroute_492_1.inputs[0]) - test_group.links.new(reroute_483_1.outputs[0], reroute_493_1.inputs[0]) - test_group.links.new(reroute_484_1.outputs[0], reroute_494_1.inputs[0]) - test_group.links.new(reroute_479_1.outputs[0], mix_045_1.inputs[1]) - test_group.links.new(reroute_490_1.outputs[0], mix_045_1.inputs[2]) - test_group.links.new(reroute_491_1.outputs[0], mix_046_1.inputs[2]) - test_group.links.new(reroute_492_1.outputs[0], mix_047_1.inputs[2]) - test_group.links.new(reroute_493_1.outputs[0], mix_048_1.inputs[2]) - test_group.links.new(reroute_494_1.outputs[0], mix_049_1.inputs[2]) - test_group.links.new(reroute_052_1.outputs[0], combine_xyz_043_1.inputs[0]) - test_group.links.new(reroute_053_1.outputs[0], combine_xyz_043_1.inputs[1]) - test_group.links.new(reroute_054_1.outputs[0], combine_xyz_043_1.inputs[2]) - test_group.links.new(reroute_080_1.outputs[0], combine_xyz_044_1.inputs[0]) - test_group.links.new(reroute_081_1.outputs[0], combine_xyz_044_1.inputs[1]) - test_group.links.new(reroute_082_1.outputs[0], combine_xyz_044_1.inputs[2]) - test_group.links.new(reroute_108_1.outputs[0], combine_xyz_045_1.inputs[0]) - test_group.links.new(reroute_109_1.outputs[0], combine_xyz_045_1.inputs[1]) - test_group.links.new(reroute_110_1.outputs[0], combine_xyz_045_1.inputs[2]) - test_group.links.new(reroute_136_1.outputs[0], combine_xyz_046_1.inputs[0]) - test_group.links.new(reroute_137_1.outputs[0], combine_xyz_046_1.inputs[1]) - test_group.links.new(reroute_138_1.outputs[0], combine_xyz_046_1.inputs[2]) - test_group.links.new(reroute_200_1.outputs[0], combine_xyz_047_1.inputs[0]) - test_group.links.new(reroute_201_1.outputs[0], combine_xyz_047_1.inputs[1]) - test_group.links.new(reroute_202_1.outputs[0], combine_xyz_047_1.inputs[2]) - test_group.links.new(reroute_503_1.outputs[0], reroute_500_1.inputs[0]) - test_group.links.new(reroute_502_1.outputs[0], reroute_501_1.inputs[0]) - test_group.links.new(reroute_504_1.outputs[0], reroute_496_1.inputs[0]) - test_group.links.new(reroute_505_1.outputs[0], reroute_497_1.inputs[0]) - test_group.links.new(reroute_506_1.outputs[0], reroute_498_1.inputs[0]) - test_group.links.new(reroute_507_1.outputs[0], reroute_499_1.inputs[0]) - test_group.links.new(reroute_500_1.outputs[0], reroute_509_1.inputs[0]) - test_group.links.new(reroute_501_1.outputs[0], reroute_508_1.inputs[0]) - test_group.links.new(reroute_496_1.outputs[0], reroute_510_1.inputs[0]) - test_group.links.new(reroute_497_1.outputs[0], reroute_511_1.inputs[0]) - test_group.links.new(reroute_498_1.outputs[0], reroute_512_1.inputs[0]) - test_group.links.new(reroute_499_1.outputs[0], reroute_513_1.inputs[0]) - test_group.links.new(reroute_509_1.outputs[0], mix_055_1.inputs[1]) - test_group.links.new(reroute_508_1.outputs[0], mix_055_1.inputs[2]) - test_group.links.new(reroute_510_1.outputs[0], mix_056_1.inputs[2]) - test_group.links.new(reroute_511_1.outputs[0], mix_057_1.inputs[2]) - test_group.links.new(reroute_512_1.outputs[0], mix_058_1.inputs[2]) - test_group.links.new(reroute_513_1.outputs[0], mix_059_1.inputs[2]) - test_group.links.new(combine_xyz_032_1.outputs[0], reroute_503_1.inputs[0]) - test_group.links.new(combine_xyz_043_1.outputs[0], reroute_502_1.inputs[0]) - test_group.links.new(combine_xyz_044_1.outputs[0], reroute_504_1.inputs[0]) - test_group.links.new(combine_xyz_045_1.outputs[0], reroute_505_1.inputs[0]) - test_group.links.new(combine_xyz_046_1.outputs[0], reroute_506_1.inputs[0]) - test_group.links.new(combine_xyz_047_1.outputs[0], reroute_507_1.inputs[0]) - test_group.links.new(reroute_524_1.outputs[0], reroute_495_1.inputs[0]) - test_group.links.new(reroute_519_1.outputs[0], reroute_514_1.inputs[0]) - test_group.links.new(reroute_520_1.outputs[0], reroute_515_1.inputs[0]) - test_group.links.new(reroute_521_1.outputs[0], reroute_516_1.inputs[0]) - test_group.links.new(reroute_522_1.outputs[0], reroute_517_1.inputs[0]) - test_group.links.new(reroute_523_1.outputs[0], reroute_518_1.inputs[0]) - test_group.links.new(reroute_495_1.outputs[0], reroute_530_1.inputs[0]) - test_group.links.new(reroute_514_1.outputs[0], reroute_529_1.inputs[0]) - test_group.links.new(reroute_515_1.outputs[0], reroute_528_1.inputs[0]) - test_group.links.new(reroute_516_1.outputs[0], reroute_527_1.inputs[0]) - test_group.links.new(reroute_517_1.outputs[0], reroute_526_1.inputs[0]) - test_group.links.new(reroute_518_1.outputs[0], reroute_525_1.inputs[0]) - test_group.links.new(reroute_530_1.outputs[0], mix_050_1.inputs[1]) - test_group.links.new(reroute_529_1.outputs[0], mix_050_1.inputs[2]) - test_group.links.new(reroute_528_1.outputs[0], mix_051_1.inputs[2]) - test_group.links.new(reroute_527_1.outputs[0], mix_052_1.inputs[2]) - test_group.links.new(reroute_526_1.outputs[0], mix_053_1.inputs[2]) - test_group.links.new(reroute_525_1.outputs[0], mix_054_1.inputs[2]) - test_group.links.new(reroute_018_1.outputs[0], reroute_524_1.inputs[0]) - test_group.links.new(reroute_046_1.outputs[0], reroute_519_1.inputs[0]) - test_group.links.new(reroute_074_1.outputs[0], reroute_520_1.inputs[0]) - test_group.links.new(reroute_102_1.outputs[0], reroute_521_1.inputs[0]) - test_group.links.new(reroute_130_1.outputs[0], reroute_522_1.inputs[0]) - test_group.links.new(reroute_193_1.outputs[0], reroute_523_1.inputs[0]) - test_group.links.new(armor_primary_fuzz_1.outputs[0], reroute_363_1.inputs[0]) - test_group.links.new(group_input_1.outputs[0], math_021_1.inputs[0]) - test_group.links.new(math_021_1.outputs[0], math_022_1.inputs[0]) - test_group.links.new(math_021_1.outputs[0], math_023_1.inputs[0]) - test_group.links.new(math_023_1.outputs[0], math_024_1.inputs[0]) - test_group.links.new(math_022_1.outputs[0], combine_rgb_1.inputs[0]) - test_group.links.new(math_024_1.outputs[0], combine_rgb_1.inputs[1]) - test_group.links.new(mix_071_1.outputs[0], separate_rgb_1.inputs[0]) - test_group.links.new(combine_rgb_1.outputs[0], mix_071_1.inputs[2]) - test_group.links.new(math_021_1.outputs[0], mix_071_1.inputs[0]) - test_group.links.new(attribute_1.outputs[0], mix_071_1.inputs[1]) - # ----------------------------------------------------------------------------------------- - # Armor Transforms - armor_detail_diffuse_transform_1.inputs[1].default_value = (DiffTrans1.Z, DiffTrans1.W, 0.0) # position - armor_detail_diffuse_transform_1.inputs[3].default_value = (DiffTrans1.X, DiffTrans1.Y, 1.0) # scale - armor_detail_normal_transform_1.inputs[1].default_value = (NormTrans1.Z, NormTrans1.W, 1.0) # scale - armor_detail_normal_transform_1.inputs[3].default_value = (NormTrans1.X, NormTrans1.Y, 0.0) # position - - # Armor Primary - armor_primary_dye_color_1.outputs[0].default_value = (CPrime1.X, CPrime1.Y, CPrime1.Z, 1.0) - armor_primary_roughness_remap_x_1.outputs[0].default_value = PrimeRoughMap1.X - armor_primary_roughness_remap_y_1.outputs[0].default_value = PrimeRoughMap1.Y - armor_primary_roughness_remap_z_1.outputs[0].default_value = PrimeRoughMap1.Z - armor_primary_roughness_remap_w_1.outputs[0].default_value = PrimeRoughMap1.W + reroute_056 = Shader_Preset.nodes.new("NodeReroute") - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap1"), check_existing=False) - DetailDiffuse01 = bpy.data.images.get("DiffMap1") - DetailDiffuse01.colorspace_settings.name = "sRGB" - DetailDiffuse01.alpha_mode = "CHANNEL_PACKED" - armor_primary_detail_diffuse_map_1.image = DetailDiffuse01 + reroute_115 = Shader_Preset.nodes.new("NodeReroute") - armor_primary_wear_remap_x_1.outputs[0].default_value = PrimeWearMap1.X - armor_primary_wear_remap_y_1.outputs[0].default_value = PrimeWearMap1.Y - armor_primary_wear_remap_z_1.outputs[0].default_value = PrimeWearMap1.Z - armor_primary_wear_remap_w_1.outputs[0].default_value = PrimeWearMap1.W + reroute_049 = Shader_Preset.nodes.new("NodeReroute") - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap1"), check_existing=False) - DetailNormal01 = bpy.data.images.get("NormMap1") - DetailNormal01.colorspace_settings.name = "Non-Color" - DetailNormal01.alpha_mode = "CHANNEL_PACKED" - armor_primary_detail_normal_map_1.image = DetailNormal01 - - armor_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeMatParams1.X - armor_primary_detail_normal_blend_1.outputs[0].default_value = PrimeMatParams1.Y - armor_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeMatParams1.Z - armor_primary_metalness_1.outputs[0].default_value = PrimeMatParams1.W - armor_primary_iridescence_1.outputs[0].default_value = PrimeAdvMatParams1.X - armor_primary_fuzz_1.outputs[0].default_value = PrimeAdvMatParams1.Y - armor_primary_transmission_1.outputs[0].default_value = PrimeAdvMatParams1.Z - - worn_armor_primary_dye_color_1.outputs[0].default_value = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z, 1.0) - worn_armor_primary_roughness_remap_x_1.outputs[0].default_value = PrimeWornRoughMap1.X - worn_armor_primary_roughness_remap_y_1.outputs[0].default_value = PrimeWornRoughMap1.Y - worn_armor_primary_roughness_remap_z_1.outputs[0].default_value = PrimeWornRoughMap1.Z - worn_armor_primary_roughness_remap_w_1.outputs[0].default_value = PrimeWornRoughMap1.W - worn_armor_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeWornMatParams1.X - worn_armor_primary_detail_normal_blend_1.outputs[0].default_value = PrimeWornMatParams1.Y - worn_armor_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeWornMatParams1.Z - worn_armor_primary_metalness_1.outputs[0].default_value = PrimeWornMatParams1.W - - armor_primary_emission_color_1.outputs[0].default_value = (CPrimeEmit1.X, CPrimeEmit1.Y, CPrimeEmit1.Z, 1.0) - - # Armor Secondary - armor_secondary_dye_color_1.outputs[0].default_value = (CSecon1.X, CSecon1.Y, CSecon1.Z, 1.0) - armor_secondary_roughness_remap_x_1.outputs[0].default_value = SeconRoughMap1.X - armor_secondary_roughness_remap_y_1.outputs[0].default_value = SeconRoughMap1.Y - armor_secondary_roughness_remap_z_1.outputs[0].default_value = SeconRoughMap1.Z - armor_secondary_roughness_remap_w_1.outputs[0].default_value = SeconRoughMap1.W - - bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/DiffMap1"), check_existing=False) - DetailDiffuse02 = bpy.data.images.get("DiffMap1") - DetailDiffuse02.colorspace_settings.name = "sRGB" - DetailDiffuse02.alpha_mode = "CHANNEL_PACKED" - armor_secondary_detail_diffuse_map_1.image = DetailDiffuse02 + reroute_096 = Shader_Preset.nodes.new("NodeReroute") - armor_secondary_wear_remap_x_1.outputs[0].default_value = SeconWearMap1.X - armor_secondary_wear_remap_y_1.outputs[0].default_value = SeconWearMap1.Y - armor_secondary_wear_remap_z_1.outputs[0].default_value = SeconWearMap1.Z - armor_secondary_wear_remap_w_1.outputs[0].default_value = SeconWearMap1.W + worn_armor_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_roughness_remap_x.label = "Roughness Remap X" + worn_armor_primary_roughness_remap_x.use_custom_color = True + worn_armor_primary_roughness_remap_x.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_roughness_remap_x.hide = True + worn_armor_primary_roughness_remap_x.outputs[0].default_value = wornarmorprimaryroughnessremapX - bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/NormMap1"), check_existing=False) - DetailNormal02 = bpy.data.images.get("NormMap1") - DetailNormal02.colorspace_settings.name = "Non-Color" - DetailNormal02.alpha_mode = "CHANNEL_PACKED" - armor_secondary_detail_normal_map_1.image = DetailNormal02 - - armor_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconMatParams1.X - armor_secondary_detail_normal_blend_1.outputs[0].default_value = SeconMatParams1.Y - armor_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconMatParams1.Z - armor_secondary_metalness_1.outputs[0].default_value = SeconMatParams1.W - armor_secondary_iridescence_1.outputs[0].default_value = SeconAdvMatParams1.X - armor_secondary_fuzz_1.outputs[0].default_value = SeconAdvMatParams1.Y - armor_secondary_transmission_1.outputs[0].default_value = SeconAdvMatParams1.Z - - worn_armor_secondary_dye_color_1.outputs[0].default_value = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z, 1.0) - worn_armor_secondary_roughness_remap_x_1.outputs[0].default_value = SeconWornRoughMap1.X - worn_armor_secondary_roughness_remap_y_1.outputs[0].default_value = SeconWornRoughMap1.Y - worn_armor_secondary_roughness_remap_z_1.outputs[0].default_value = SeconWornRoughMap1.Z - worn_armor_secondary_roughness_remap_w_1.outputs[0].default_value = SeconWornRoughMap1.W - worn_armor_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconWornMatParams1.X - worn_armor_secondary_detail_normal_blend_1.outputs[0].default_value = SeconWornMatParams1.Y - worn_armor_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconWornMatParams1.Z - worn_armor_secondary_metalness_1.outputs[0].default_value = SeconWornMatParams1.W - - armor_secondary_emission_color_1.outputs[0].default_value = (CSeconEmit1.X, CSeconEmit1.Y, CSeconEmit1.Z, 1.0) - - # Cloth Transforms - cloth_detail_diffuse_transform_1.inputs[1].default_value = (DiffTrans2.Z, DiffTrans2.W, 1.0) # scale - cloth_detail_diffuse_transform_1.inputs[3].default_value = (DiffTrans2.X, DiffTrans2.Y, 0.0) # position - cloth_detail_normal_transform_1.inputs[1].default_value = (NormTrans2.Z, NormTrans2.W, 1.0) # scale - cloth_detail_normal_transform_1.inputs[3].default_value = (NormTrans2.X, NormTrans2.Y, 0.0) # position - - # Cloth Primary - cloth_primary_dye_color_1.outputs[0].default_value = (CPrime2.X, CPrime2.Y, CPrime2.Z, 1.0) - cloth_primary_roughness_remap_x_1.outputs[0].default_value = PrimeRoughMap2.X - cloth_primary_roughness_remap_y_1.outputs[0].default_value = PrimeRoughMap2.Y - cloth_primary_roughness_remap_z_1.outputs[0].default_value = PrimeRoughMap2.Z - cloth_primary_roughness_remap_w_1.outputs[0].default_value = PrimeRoughMap2.W + reroute_025 = Shader_Preset.nodes.new("NodeReroute") + + reroute_055 = Shader_Preset.nodes.new("NodeReroute") + + cloth_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_roughness_remap_z.label = "Roughness Remap Z" + cloth_secondary_roughness_remap_z.use_custom_color = True + cloth_secondary_roughness_remap_z.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_roughness_remap_z.hide = True + cloth_secondary_roughness_remap_z.outputs[0].default_value = clothsecondaryroughnessremapZ + + worn_cloth_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_roughness_remap_x.label = "Roughness Remap X" + worn_cloth_primary_roughness_remap_x.use_custom_color = True + worn_cloth_primary_roughness_remap_x.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_roughness_remap_x.hide = True + worn_cloth_primary_roughness_remap_x.outputs[0].default_value = wornclothprimaryroughnessremapX + + mix_022 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_roughness_remap_z.label = "Roughness Remap Z" + suit_primary_roughness_remap_z.use_custom_color = True + suit_primary_roughness_remap_z.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_roughness_remap_z.hide = True + suit_primary_roughness_remap_z.outputs[0].default_value = suitprimaryroughnessremapZ + + reroute_081 = Shader_Preset.nodes.new("NodeReroute") + + worn_cloth_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_metalness.label = "Metalness" + worn_cloth_secondary_metalness.use_custom_color = True + worn_cloth_secondary_metalness.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_metalness.hide = True + worn_cloth_secondary_metalness.outputs[0].default_value = wornclothsecondarymetalness + + math_019 = Shader_Preset.nodes.new("ShaderNodeMath") + math_019.operation = 'MULTIPLY_ADD' + math_019.use_clamp = True + math_019.inputs[1].default_value = 100000.0 + math_019.inputs[2].default_value = -99999.0 + + combine_xyz_038 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_roughness_remap_w.label = "Roughness Remap W" + suit_secondary_roughness_remap_w.use_custom_color = True + suit_secondary_roughness_remap_w.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_roughness_remap_w.hide = True + suit_secondary_roughness_remap_w.outputs[0].default_value = suitsecondaryroughnessremapW + + math_007 = Shader_Preset.nodes.new("ShaderNodeMath") + math_007.label = "Suit_Primary_Slot" + math_007.operation = 'MULTIPLY_ADD' + math_007.inputs[1].default_value = 1000.0 + math_007.inputs[2].default_value = -333.0 + + reroute_095 = Shader_Preset.nodes.new("NodeReroute") + + reroute_160 = Shader_Preset.nodes.new("NodeReroute") + + reroute_195 = Shader_Preset.nodes.new("NodeReroute") + + reroute_140 = Shader_Preset.nodes.new("NodeReroute") + + reroute_021 = Shader_Preset.nodes.new("NodeReroute") + + mix_048 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + cloth_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + cloth_secondary_detail_roughness_blend.use_custom_color = True + cloth_secondary_detail_roughness_blend.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_detail_roughness_blend.hide = True + cloth_secondary_detail_roughness_blend.outputs[0].default_value = clothsecondarydetailroughnessblend + + reroute_082 = Shader_Preset.nodes.new("NodeReroute") + + armor_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_detail_normal_blend.label = "Detail Normal Blend" + armor_secondary_detail_normal_blend.use_custom_color = True + armor_secondary_detail_normal_blend.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_detail_normal_blend.hide = True + armor_secondary_detail_normal_blend.outputs[0].default_value = armorsecondarydetailnormalblend + + worn_cloth_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_roughness_remap_z.label = "Roughness Remap Z" + worn_cloth_primary_roughness_remap_z.use_custom_color = True + worn_cloth_primary_roughness_remap_z.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_roughness_remap_z.hide = True + worn_cloth_primary_roughness_remap_z.outputs[0].default_value = wornclothprimaryroughnessremapZ + + combine_xyz_036 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + math_002 = Shader_Preset.nodes.new("ShaderNodeMath") + math_002.operation = 'MULTIPLY_ADD' + math_002.use_clamp = True + math_002.inputs[1].default_value = 1000000.0 + math_002.inputs[2].default_value = -500000.0 + + worn_cloth_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_cloth_secondary_detail_diffuse_blend.use_custom_color = True + worn_cloth_secondary_detail_diffuse_blend.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_detail_diffuse_blend.hide = True + worn_cloth_secondary_detail_diffuse_blend.outputs[0].default_value = wornclothsecondarydetaildiffuseblend + + reroute_068 = Shader_Preset.nodes.new("NodeReroute") + + math_016 = Shader_Preset.nodes.new("ShaderNodeMath") + math_016.operation = 'MULTIPLY_ADD' + math_016.use_clamp = True + math_016.inputs[1].default_value = 1000000.0 + math_016.inputs[2].default_value = -500000.0 + + reroute_041 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_suit_primary_detail_diffuse_blend.use_custom_color = True + worn_suit_primary_detail_diffuse_blend.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_detail_diffuse_blend.hide = True + worn_suit_primary_detail_diffuse_blend.outputs[0].default_value = wornsuitprimarydetaildiffuseblend + + suit_secondary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_wear_remap_x.label = "Wear Remap X" + suit_secondary_wear_remap_x.use_custom_color = True + suit_secondary_wear_remap_x.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_wear_remap_x.hide = True + suit_secondary_wear_remap_x.outputs[0].default_value = suitsecondarywearremapX + + armor_primary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_transmission.label = "Transmission" + armor_primary_transmission.use_custom_color = True + armor_primary_transmission.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_transmission.hide = True + armor_primary_transmission.outputs[0].default_value = armorprimarytransmission + + worn_armor_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_roughness_remap_y.label = "Roughness Remap Y" + worn_armor_primary_roughness_remap_y.use_custom_color = True + worn_armor_primary_roughness_remap_y.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_roughness_remap_y.hide = True + worn_armor_primary_roughness_remap_y.outputs[0].default_value = wornarmorprimaryroughnessremapY + + reroute_109 = Shader_Preset.nodes.new("NodeReroute") + + reroute_129 = Shader_Preset.nodes.new("NodeReroute") + + reroute_177 = Shader_Preset.nodes.new("NodeReroute") + + reroute_014 = Shader_Preset.nodes.new("NodeReroute") + + reroute_130 = Shader_Preset.nodes.new("NodeReroute") + + cloth_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_roughness_remap_y.label = "Roughness Remap Y" + cloth_secondary_roughness_remap_y.use_custom_color = True + cloth_secondary_roughness_remap_y.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_roughness_remap_y.hide = True + cloth_secondary_roughness_remap_y.outputs[0].default_value = clothsecondaryroughnessremapY + + cloth_secondary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_transmission.label = "Transmission" + cloth_secondary_transmission.use_custom_color = True + cloth_secondary_transmission.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_transmission.hide = True + cloth_secondary_transmission.outputs[0].default_value = clothsecondarytransmission + + mix_011 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + cloth_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_detail_normal_blend.label = "Detail Normal Blend" + cloth_primary_detail_normal_blend.use_custom_color = True + cloth_primary_detail_normal_blend.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_detail_normal_blend.hide = True + cloth_primary_detail_normal_blend.outputs[0].default_value = clothprimarydetailnormalblend + + reroute_171 = Shader_Preset.nodes.new("NodeReroute") + + armor_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + armor_secondary_detail_diffuse_blend.use_custom_color = True + armor_secondary_detail_diffuse_blend.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_detail_diffuse_blend.hide = True + armor_secondary_detail_diffuse_blend.outputs[0].default_value = armorsecondarydetaildiffuseblend + + worn_cloth_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_cloth_secondary_detail_roughness_blend.use_custom_color = True + worn_cloth_secondary_detail_roughness_blend.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_detail_roughness_blend.hide = True + worn_cloth_secondary_detail_roughness_blend.outputs[0].default_value = wornclothsecondarydetailroughnessblend + + mix_066 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + mix_066.inputs[2].default_value = (6.0, 6.0, 6.0, 1.0) + + combine_xyz_003 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + armor_primary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + armor_primary_emission_color.label = "Emission Color" + armor_primary_emission_color.use_custom_color = True + armor_primary_emission_color.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_emission_color.hide = True + armor_primary_emission_color.outputs[0].default_value = armorprimaryemissioncolor + + suit_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_roughness_remap_z.label = "Roughness Remap Z" + suit_secondary_roughness_remap_z.use_custom_color = True + suit_secondary_roughness_remap_z.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_roughness_remap_z.hide = True + suit_secondary_roughness_remap_z.outputs[0].default_value = (0.000) + + suit_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_detail_normal_blend.label = "Detail Normal Blend" + suit_primary_detail_normal_blend.use_custom_color = True + suit_primary_detail_normal_blend.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_detail_normal_blend.hide = True + suit_primary_detail_normal_blend.outputs[0].default_value = suitprimarydetailnormalblend + + reroute_174 = Shader_Preset.nodes.new("NodeReroute") + + reroute_191 = Shader_Preset.nodes.new("NodeReroute") + + reroute_016 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_suit_secondary_dye_color.label = "Dye Color" + worn_suit_secondary_dye_color.use_custom_color = True + worn_suit_secondary_dye_color.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_dye_color.hide = True + worn_suit_secondary_dye_color.outputs[0].default_value = wornsuitsecondarydyecolor + + reroute_094 = Shader_Preset.nodes.new("NodeReroute") + + reroute_131 = Shader_Preset.nodes.new("NodeReroute") + + mix_027 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_detail_roughness_blend.label = "Detail Roughness Blend" + suit_primary_detail_roughness_blend.use_custom_color = True + suit_primary_detail_roughness_blend.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_detail_roughness_blend.hide = True + suit_primary_detail_roughness_blend.outputs[0].default_value = suitprimarydetailroughnessblend + + cloth_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_detail_normal_blend.label = "Detail Normal Blend" + cloth_secondary_detail_normal_blend.use_custom_color = True + cloth_secondary_detail_normal_blend.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_detail_normal_blend.hide = True + cloth_secondary_detail_normal_blend.outputs[0].default_value = clothsecondarydetailnormalblend + + reroute_077 = Shader_Preset.nodes.new("NodeReroute") + + cloth_detail_diffuse_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + cloth_detail_diffuse_transform.label = "Detail Diffuse Transform" + cloth_detail_diffuse_transform.use_custom_color = True + cloth_detail_diffuse_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + cloth_detail_diffuse_transform.vector_type = 'POINT' + cloth_detail_diffuse_transform.inputs[2].hide = True + cloth_detail_diffuse_transform.inputs[1].default_value = clothdetaildiffuseposition + cloth_detail_diffuse_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + cloth_detail_diffuse_transform.inputs[3].default_value = clothdetaildiffusescale + + suit_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_roughness_remap_x.label = "Roughness Remap X" + suit_primary_roughness_remap_x.use_custom_color = True + suit_primary_roughness_remap_x.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_roughness_remap_x.hide = True + suit_primary_roughness_remap_x.outputs[0].default_value = suitprimaryroughnessremapX + + cloth_primary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + cloth_primary_emission_color.label = "Emission Color" + cloth_primary_emission_color.use_custom_color = True + cloth_primary_emission_color.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_emission_color.hide = True + cloth_primary_emission_color.outputs[0].default_value = clothprimaryemissioncolor + + worn_cloth_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_roughness_remap_y.label = "Roughness Remap Y" + worn_cloth_primary_roughness_remap_y.use_custom_color = True + worn_cloth_primary_roughness_remap_y.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_roughness_remap_y.hide = True + worn_cloth_primary_roughness_remap_y.outputs[0].default_value = wornclothprimaryroughnessremapY + + reroute_146 = Shader_Preset.nodes.new("NodeReroute") + + reroute_127 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_suit_primary_detail_roughness_blend.use_custom_color = True + worn_suit_primary_detail_roughness_blend.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_detail_roughness_blend.hide = True + worn_suit_primary_detail_roughness_blend.outputs[0].default_value = wornsuitprimarydetailroughnessblend + + mix_006 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_secondary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_wear_remap_w.label = "Wear Remap W" + suit_secondary_wear_remap_w.use_custom_color = True + suit_secondary_wear_remap_w.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_wear_remap_w.hide = True + suit_secondary_wear_remap_w.outputs[0].default_value = suitsecondarywearremapW + + reroute_063 = Shader_Preset.nodes.new("NodeReroute") + + reroute_126 = Shader_Preset.nodes.new("NodeReroute") + + reroute_018 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_detail_normal_blend.label = "Detail Normal Blend" + worn_suit_secondary_detail_normal_blend.use_custom_color = True + worn_suit_secondary_detail_normal_blend.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_detail_normal_blend.hide = True + worn_suit_secondary_detail_normal_blend.outputs[0].default_value = wornsuitsecondarydetailnormalblend + + reroute_135 = Shader_Preset.nodes.new("NodeReroute") + + worn_cloth_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_roughness_remap_y.label = "Roughness Remap Y" + worn_cloth_secondary_roughness_remap_y.use_custom_color = True + worn_cloth_secondary_roughness_remap_y.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_roughness_remap_y.hide = True + worn_cloth_secondary_roughness_remap_y.outputs[0].default_value = wornclothsecondaryroughnessremapY + + reroute_182 = Shader_Preset.nodes.new("NodeReroute") + + mix_002 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_012 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + cloth_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + cloth_secondary_detail_diffuse_blend.use_custom_color = True + cloth_secondary_detail_diffuse_blend.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_detail_diffuse_blend.hide = True + cloth_secondary_detail_diffuse_blend.outputs[0].default_value = clothsecondarydetaildiffuseblend + + armor_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + armor_secondary_dye_color.label = "Dye Color" + armor_secondary_dye_color.use_custom_color = True + armor_secondary_dye_color.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_dye_color.hide = True + armor_secondary_dye_color.outputs[0].default_value = armorsecondarydyecolor + + reroute_132 = Shader_Preset.nodes.new("NodeReroute") + + worn_cloth_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_detail_normal_blend.label = "Detail Normal Blend" + worn_cloth_secondary_detail_normal_blend.use_custom_color = True + worn_cloth_secondary_detail_normal_blend.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_detail_normal_blend.hide = True + worn_cloth_secondary_detail_normal_blend.outputs[0].default_value = wornclothsecondarydetailnormalblend + + reroute_027 = Shader_Preset.nodes.new("NodeReroute") + + reroute_154 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_020 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_099 = Shader_Preset.nodes.new("NodeReroute") + + mix_074 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + armor_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_roughness_remap_x.label = "Roughness Remap_X" + armor_primary_roughness_remap_x.use_custom_color = True + armor_primary_roughness_remap_x.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_roughness_remap_x.hide = True + armor_primary_roughness_remap_x.outputs[0].default_value = armorprimaryroughnessremapX + + armor_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_metalness.label = "Metalness" + armor_secondary_metalness.use_custom_color = True + armor_secondary_metalness.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_metalness.hide = True + armor_secondary_metalness.outputs[0].default_value = armorsecondarymetalness + + reroute_179 = Shader_Preset.nodes.new("NodeReroute") + + cloth_detail_normal_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + cloth_detail_normal_transform.label = "Detail Normal Transform" + cloth_detail_normal_transform.use_custom_color = True + cloth_detail_normal_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + cloth_detail_normal_transform.vector_type = 'POINT' + cloth_detail_normal_transform.inputs[2].hide = True + cloth_detail_normal_transform.inputs[1].default_value = clothdetailnormalposition + cloth_detail_normal_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + cloth_detail_normal_transform.inputs[3].default_value = clothdetailnormalscale + + reroute_106 = Shader_Preset.nodes.new("NodeReroute") + + reroute_134 = Shader_Preset.nodes.new("NodeReroute") + + mix_013 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + armor_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_roughness_remap_w.label = "Roughness Remap_W" + armor_primary_roughness_remap_w.use_custom_color = True + armor_primary_roughness_remap_w.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_roughness_remap_w.hide = True + armor_primary_roughness_remap_w.outputs[0].default_value = armorprimaryroughnessremapW - bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/DiffMap2"), check_existing=False) - DetailDiffuse03 = bpy.data.images.get("DiffMap2") - DetailDiffuse03.colorspace_settings.name = "sRGB" - DetailDiffuse03.alpha_mode = "CHANNEL_PACKED" - cloth_primary_detail_diffuse_map_1.image = DetailDiffuse03 + cloth_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_roughness_remap_x.label = "Roughness Remap X" + cloth_secondary_roughness_remap_x.use_custom_color = True + cloth_secondary_roughness_remap_x.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_roughness_remap_x.hide = True + cloth_secondary_roughness_remap_x.outputs[0].default_value = clothsecondaryroughnessremapX - cloth_primary_wear_remap_x_1.outputs[0].default_value = PrimeWearMap2.X - cloth_primary_wear_remap_y_1.outputs[0].default_value = PrimeWearMap2.Y - cloth_primary_wear_remap_z_1.outputs[0].default_value = PrimeWearMap2.Z - cloth_primary_wear_remap_w_1.outputs[0].default_value = PrimeWearMap2.W + reroute_178 = Shader_Preset.nodes.new("NodeReroute") - bpy.data.images.load(os.path.join(riplocation,"OUTPUTPATH/NormMap2"), check_existing=False) - DetailNormal03 = bpy.data.images.get("NormMap2") - DetailNormal03.colorspace_settings.name = "Non-Color" - DetailNormal03.alpha_mode = "CHANNEL_PACKED" - cloth_primary_detail_normal_map_1.image = DetailNormal03 - - cloth_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeMatParams2.X - cloth_primary_detail_normal_blend_1.outputs[0].default_value = PrimeMatParams2.Y - cloth_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeMatParams2.Z - cloth_primary_metalness_1.outputs[0].default_value = PrimeMatParams2.W - cloth_primary_iridescence_1.outputs[0].default_value = PrimeAdvMatParams2.X - cloth_primary_fuzz_1.outputs[0].default_value = PrimeAdvMatParams2.Y - cloth_primary_transmission_1.outputs[0].default_value = PrimeAdvMatParams2.Z - - worn_cloth_primary_dye_color_1.outputs[0].default_value = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z, 1.0) - worn_cloth_primary_roughness_remap_x_1.outputs[0].default_value = PrimeWornRoughMap2.X - worn_cloth_primary_roughness_remap_y_1.outputs[0].default_value = PrimeWornRoughMap2.Y - worn_cloth_primary_roughness_remap_z_1.outputs[0].default_value = PrimeWornRoughMap2.Z - worn_cloth_primary_roughness_remap_w_1.outputs[0].default_value = PrimeWornRoughMap2.W - worn_cloth_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeWornMatParams1.X - worn_cloth_primary_detail_normal_blend_1.outputs[0].default_value = PrimeWornMatParams1.Y - worn_cloth_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeWornMatParams1.Z - worn_cloth_primary_metalness_1.outputs[0].default_value = PrimeWornMatParams1.W - - cloth_primary_emission_color_1.outputs[0].default_value = (CPrimeEmit2.X, CPrimeEmit2.Y, CPrimeEmit2.Z, 1.0) - - # Cloth Secondary - cloth_secondary_dye_color_1.outputs[0].default_value = (CSecon2.X, CSecon2.Y, CSecon2.Z, 1.0) - cloth_secondary_roughness_remap_x_1.outputs[0].default_value = SeconRoughMap2.X - cloth_secondary_roughness_remap_y_1.outputs[0].default_value = SeconRoughMap2.Y - cloth_secondary_roughness_remap_z_1.outputs[0].default_value = SeconRoughMap2.Z - cloth_secondary_roughness_remap_w_1.outputs[0].default_value = SeconRoughMap2.W - - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap2"), check_existing=False) - DetailDiffuse04 = bpy.data.images.get("DiffMap2") - DetailDiffuse04.colorspace_settings.name = "sRGB" - DetailDiffuse04.alpha_mode = "CHANNEL_PACKED" - cloth_secondary_detail_diffuse_map_1.image = DetailDiffuse04 - - cloth_secondary_wear_remap_x_1.outputs[0].default_value = SeconWearMap2.X - cloth_secondary_wear_remap_y_1.outputs[0].default_value = SeconWearMap2.Y - cloth_secondary_wear_remap_z_1.outputs[0].default_value = SeconWearMap2.Z - cloth_secondary_wear_remap_w_1.outputs[0].default_value = SeconWearMap2.W - - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap2"), check_existing=False) - DetailNormal04 = bpy.data.images.get("NormMap2") - DetailNormal04.colorspace_settings.name = "Non-Color" - DetailNormal04.alpha_mode = "CHANNEL_PACKED" - cloth_secondary_detail_normal_map_1.image = DetailNormal04 - - cloth_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconMatParams2.X - cloth_secondary_detail_normal_blend_1.outputs[0].default_value = SeconMatParams2.Y - cloth_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconMatParams2.Z - cloth_secondary_metalness_1.outputs[0].default_value = SeconMatParams2.W - cloth_secondary_iridescence_1.outputs[0].default_value = SeconAdvMatParams2.X - cloth_secondary_fuzz_1.outputs[0].default_value = SeconAdvMatParams2.Y - cloth_secondary_transmission_1.outputs[0].default_value = SeconAdvMatParams2.Z - - worn_cloth_secondary_dye_color_1.outputs[0].default_value = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z, 1.0) - worn_cloth_secondary_roughness_remap_x_1.outputs[0].default_value = SeconWornRoughMap2.X - worn_cloth_secondary_roughness_remap_y_1.outputs[0].default_value = SeconWornRoughMap2.Y - worn_cloth_secondary_roughness_remap_z_1.outputs[0].default_value = SeconWornRoughMap2.Z - worn_cloth_secondary_roughness_remap_w_1.outputs[0].default_value = SeconWornRoughMap2.W - worn_cloth_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconWornMatParams2.X - worn_cloth_secondary_detail_normal_blend_1.outputs[0].default_value = SeconWornMatParams2.Y - worn_cloth_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconWornMatParams2.Z - worn_cloth_secondary_metalness_1.outputs[0].default_value = SeconWornMatParams2.W - - cloth_secondary_emission_color_1.outputs[0].default_value = (CSeconEmit2.X, CSeconEmit2.Y, CSeconEmit2.Z, 1.0) - - # Suit Transform - suit_detail_diffuse_transform_1.inputs[1].default_value = (DiffTrans3.Z, DiffTrans3.W, 1.0) # scale - suit_detail_diffuse_transform_1.inputs[3].default_value = (DiffTrans3.X, DiffTrans3.Y, 0.0) # position - suit_detail_normal_transform_1.inputs[1].default_value = (NormTrans3.Z, NormTrans3.W, 1.0) # scale - suit_detail_normal_transform_1.inputs[3].default_value = (NormTrans3.X, NormTrans3.Y, 0.0) # position - - # Suit Primary - suit_primary_dye_color_1.outputs[0].default_value = (CPrime3.X, CPrime3.Y, CPrime3.Z, 1.0) - suit_primary_roughness_remap_x_1.outputs[0].default_value = PrimeRoughMap3.X - suit_primary_roughness_remap_y_1.outputs[0].default_value = PrimeRoughMap3.Y - suit_primary_roughness_remap_z_1.outputs[0].default_value = PrimeRoughMap3.Z - suit_primary_roughness_remap_w_1.outputs[0].default_value = PrimeRoughMap3.W + armor_secondary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_wear_remap_z.label = "Wear Remap Z" + armor_secondary_wear_remap_z.use_custom_color = True + armor_secondary_wear_remap_z.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_wear_remap_z.hide = True + armor_secondary_wear_remap_z.outputs[0].default_value = armorsecondarywearremapZ - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap3"), check_existing=False) - DetailDiffuse05 = bpy.data.images.get("DiffMap3") - DetailDiffuse05.colorspace_settings.name = "sRGB" - DetailDiffuse05.alpha_mode = "CHANNEL_PACKED" - suit_primary_detail_diffuse_map_1.image = DetailDiffuse05 + mix_069 = Shader_Preset.nodes.new("ShaderNodeMixRGB") - suit_primary_wear_remap_x_1.outputs[0].default_value = PrimeWearMap3.X - suit_primary_wear_remap_y_1.outputs[0].default_value = PrimeWearMap3.Y - suit_primary_wear_remap_z_1.outputs[0].default_value = PrimeWearMap3.Z - suit_primary_wear_remap_w_1.outputs[0].default_value = PrimeWearMap3.W + mix_069.inputs[1].default_value = (1.0, 1.0, 1.0, 1.0) - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap3"), check_existing=False) - DetailNormal05 = bpy.data.images.get("NormMap3") - DetailNormal05.colorspace_settings.name = "Non-Color" - DetailNormal05.alpha_mode = "CHANNEL_PACKED" - suit_primary_detail_normal_map_1.image = DetailNormal05 - - suit_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeMatParams3.X - suit_primary_detail_normal_blend_1.outputs[0].default_value = PrimeMatParams3.Y - suit_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeMatParams3.Z - suit_primary_metalness_1.outputs[0].default_value = PrimeMatParams3.W - suit_primary_iridescence_1.outputs[0].default_value = PrimeAdvMatParams3.X - suit_primary_fuzz_1.outputs[0].default_value = PrimeAdvMatParams3.Y - suit_primary_transmission_1.outputs[0].default_value = PrimeAdvMatParams3.Z - - worn_suit_primary_dye_color_1.outputs[0].default_value = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z, 1.0) - worn_suit_primary_roughness_remap_x_1.outputs[0].default_value = PrimeWornRoughMap3.X - worn_suit_primary_roughness_remap_y_1.outputs[0].default_value = PrimeWornRoughMap3.Y - worn_suit_primary_roughness_remap_z_1.outputs[0].default_value = PrimeWornRoughMap3.Z - worn_suit_primary_roughness_remap_w_1.outputs[0].default_value = PrimeWornRoughMap3.W - worn_suit_primary_detail_diffuse_blend_1.outputs[0].default_value = PrimeWornMatParams3.X - worn_suit_primary_detail_normal_blend_1.outputs[0].default_value = PrimeWornMatParams3.Y - worn_suit_primary_detail_roughness_blend_1.outputs[0].default_value = PrimeWornMatParams3.Z - worn_suit_primary_metalness_1.outputs[0].default_value = PrimeWornMatParams3.W - - suit_primary_emission_color_1.outputs[0].default_value = (CPrimeEmit3.X, CPrimeEmit3.Y, CPrimeEmit3.Z, 1.0) - - # Suit Secondary - suit_secondary_dye_color_1.outputs[0].default_value = (CSecon3.X, CSecon3.Y, CSecon3.Z, 1.0) - suit_secondary_roughness_remap_x_1.outputs[0].default_value = SeconRoughMap3.X - suit_secondary_roughness_remap_y_1.outputs[0].default_value = SeconRoughMap3.Y - suit_secondary_roughness_remap_z_1.outputs[0].default_value = SeconRoughMap3.Z - suit_secondary_roughness_remap_w_1.outputs[0].default_value = SeconRoughMap3.W + mix_069.inputs[2].default_value = (2.0, 2.0, 2.0, 1.0) - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/DiffMap3"), check_existing=False) - DetailDiffuse06 = bpy.data.images.get("DiffMap3") - DetailDiffuse06.colorspace_settings.name = "sRGB" - DetailDiffuse06.alpha_mode = "CHANNEL_PACKED" - suit_secondary_detail_diffuse_map_1.image = DetailDiffuse06 + cloth_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_roughness_remap_x.label = "Roughness Remap X" + cloth_primary_roughness_remap_x.use_custom_color = True + cloth_primary_roughness_remap_x.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_roughness_remap_x.hide = True + cloth_primary_roughness_remap_x.outputs[0].default_value = clothprimaryroughnessremapX - suit_secondary_wear_remap_x_1.outputs[0].default_value = SeconWearMap3.X - suit_secondary_wear_remap_y_1.outputs[0].default_value = SeconWearMap3.Y - suit_secondary_wear_remap_z_1.outputs[0].default_value = SeconWearMap3.Z - suit_secondary_wear_remap_w_1.outputs[0].default_value = SeconWearMap3.W + reroute_114 = Shader_Preset.nodes.new("NodeReroute") - bpy.data.images.load(os.path.join(riplocation, "OUTPUTPATH/NormMap3"), check_existing=False) - DetailNormal06 = bpy.data.images.get("NormMap3") - DetailNormal06.colorspace_settings.name = "Non-Color" - DetailNormal06.alpha_mode = "CHANNEL_PACKED" - suit_secondary_detail_normal_map_1.image = DetailNormal06 - - suit_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconMatParams3.X - suit_secondary_detail_normal_blend_1.outputs[0].default_value = SeconMatParams3.Y - suit_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconMatParams3.Z - suit_secondary_metalness_1.outputs[0].default_value = SeconMatParams3.W - suit_secondary_iridescence_1.outputs[0].default_value = SeconAdvMatParams3.X - suit_secondary_fuzz_1.outputs[0].default_value = SeconAdvMatParams3.Y - suit_secondary_transmission_1.outputs[0].default_value = SeconAdvMatParams3.Z - - worn_suit_secondary_dye_color_1.outputs[0].default_value = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z, 1.0) - worn_suit_secondary_roughness_remap_x_1.outputs[0].default_value = SeconWornRoughMap3.X - worn_suit_secondary_roughness_remap_y_1.outputs[0].default_value = SeconWornRoughMap3.Y - worn_suit_secondary_roughness_remap_z_1.outputs[0].default_value = SeconWornRoughMap3.Z - worn_suit_secondary_roughness_remap_w_1.outputs[0].default_value = SeconWornRoughMap3.W - worn_suit_secondary_detail_diffuse_blend_1.outputs[0].default_value = SeconWornMatParams3.X - worn_suit_secondary_detail_normal_blend_1.outputs[0].default_value = SeconWornMatParams3.Y - worn_suit_secondary_detail_roughness_blend_1.outputs[0].default_value = SeconWornMatParams3.Z - worn_suit_secondary_metalness_1.outputs[0].default_value = SeconWornMatParams3.W - - suit_secondary_emission_color_1.outputs[0].default_value = (CSeconEmit3.X, CSeconEmit3.Y, CSeconEmit3.Z, 1.0) - - return test_group - - -class NODE_OT_TEST(bpy.types.Operator): - bl_label = "Add D2 Weapons/Armor Shader" + armor_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + armor_primary_dye_color.label = "Dye Color" + armor_primary_dye_color.use_custom_color = True + armor_primary_dye_color.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_dye_color.hide = True + armor_primary_dye_color.outputs[0].default_value = armorprimarydyecolor + + reroute_019 = Shader_Preset.nodes.new("NodeReroute") + + mix_054 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_suit_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_detail_normal_blend.label = "Detail Normal Blend" + worn_suit_primary_detail_normal_blend.use_custom_color = True + worn_suit_primary_detail_normal_blend.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_detail_normal_blend.hide = True + worn_suit_primary_detail_normal_blend.outputs[0].default_value = wornsuitprimarydetailnormalblend + + mix_007 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_metalness.label = "Metalness" + suit_secondary_metalness.use_custom_color = True + suit_secondary_metalness.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_metalness.hide = True + suit_secondary_metalness.outputs[0].default_value = suitsecondarymetalness + + reroute_058 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_roughness_remap_z.label = "Roughness Remap Z" + worn_armor_primary_roughness_remap_z.use_custom_color = True + worn_armor_primary_roughness_remap_z.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_roughness_remap_z.hide = True + worn_armor_primary_roughness_remap_z.outputs[0].default_value = wornarmorprimaryroughnessremapZ + + reroute_110 = Shader_Preset.nodes.new("NodeReroute") + + suit_primary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_wear_remap_w.label = "Wear Remap W" + suit_primary_wear_remap_w.use_custom_color = True + suit_primary_wear_remap_w.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_wear_remap_w.hide = True + suit_primary_wear_remap_w.outputs[0].default_value = suitprimarywearremapW + + worn_armor_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_roughness_remap_w.label = "Roughness Remap W" + worn_armor_primary_roughness_remap_w.use_custom_color = True + worn_armor_primary_roughness_remap_w.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_roughness_remap_w.hide = True + worn_armor_primary_roughness_remap_w.outputs[0].default_value = wornarmorprimaryroughnessremapW + + reroute_120 = Shader_Preset.nodes.new("NodeReroute") + + reroute_091 = Shader_Preset.nodes.new("NodeReroute") + + cloth_secondary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + cloth_secondary_emission_color.label = "Emission Color" + cloth_secondary_emission_color.use_custom_color = True + cloth_secondary_emission_color.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_emission_color.hide = True + cloth_secondary_emission_color.outputs[0].default_value = clothsecondaryemissioncolor + + reroute_185 = Shader_Preset.nodes.new("NodeReroute") + + mix_031 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_189 = Shader_Preset.nodes.new("NodeReroute") + + reroute_128 = Shader_Preset.nodes.new("NodeReroute") + + reroute_111 = Shader_Preset.nodes.new("NodeReroute") + + reroute_084 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_048 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + combine_xyz_048.inputs[2].default_value = 0.0 + + armor_primary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_wear_remap_x.label = "Wear Remap X" + armor_primary_wear_remap_x.use_custom_color = True + armor_primary_wear_remap_x.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_wear_remap_x.hide = True + armor_primary_wear_remap_x.outputs[0].default_value = armorprimarywearremapX + + combine_xyz_033 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_079 = Shader_Preset.nodes.new("NodeReroute") + + suit_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_roughness_remap_y.label = "Roughness Remap Y" + suit_secondary_roughness_remap_y.use_custom_color = True + suit_secondary_roughness_remap_y.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_roughness_remap_y.hide = True + suit_secondary_roughness_remap_y.outputs[0].default_value = suitsecondaryroughnessremapY + + reroute_113 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_roughness_remap_y.label = "Roughness Remap_Y" + armor_primary_roughness_remap_y.use_custom_color = True + armor_primary_roughness_remap_y.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_roughness_remap_y.hide = True + armor_primary_roughness_remap_y.outputs[0].default_value = armorprimaryroughnessremapY + + combine_xyz_029 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_armor_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_armor_primary_detail_diffuse_blend.use_custom_color = True + worn_armor_primary_detail_diffuse_blend.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_detail_diffuse_blend.hide = True + worn_armor_primary_detail_diffuse_blend.outputs[0].default_value = wornarmorprimarydetaildiffuseblend + + reroute_103 = Shader_Preset.nodes.new("NodeReroute") + + reroute_005 = Shader_Preset.nodes.new("NodeReroute") + + mix_015 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_145 = Shader_Preset.nodes.new("NodeReroute") + + reroute_183 = Shader_Preset.nodes.new("NodeReroute") + + mix_045 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_029 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + node = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_065 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_roughness_remap_y.label = "Roughness Remap Y" + cloth_primary_roughness_remap_y.use_custom_color = True + cloth_primary_roughness_remap_y.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_roughness_remap_y.hide = True + cloth_primary_roughness_remap_y.outputs[0].default_value = clothprimaryroughnessremapY + + mix_070 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_070.inputs[2].default_value = (3.0, 3.0, 3.0, 1.0) + + attribute = Shader_Preset.nodes.new("ShaderNodeAttribute") + attribute.attribute_type = 'GEOMETRY' + attribute.attribute_name = 'slots' + + mix_053 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + combine_xyz_006 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_wear_remap_y.label = "Wear Remap Y" + suit_secondary_wear_remap_y.use_custom_color = True + suit_secondary_wear_remap_y.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_wear_remap_y.hide = True + suit_secondary_wear_remap_y.outputs[0].default_value = suitsecondarywearremapY + + combine_xyz_025 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_097 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_armor_primary_detail_roughness_blend.use_custom_color = True + worn_armor_primary_detail_roughness_blend.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_detail_roughness_blend.hide = True + worn_armor_primary_detail_roughness_blend.outputs[0].default_value = wornarmorprimarydetailroughnessblend + + reroute_117 = Shader_Preset.nodes.new("NodeReroute") + + reroute_125 = Shader_Preset.nodes.new("NodeReroute") + + mix_058 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_073 = Shader_Preset.nodes.new("NodeReroute") + + suit_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_metalness.label = "Metalness" + suit_primary_metalness.use_custom_color = True + suit_primary_metalness.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_metalness.hide = True + suit_primary_metalness.outputs[0].default_value = suitprimarymetalness + + cloth_secondary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_wear_remap_w.label = "Wear Remap W" + cloth_secondary_wear_remap_w.use_custom_color = True + cloth_secondary_wear_remap_w.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_wear_remap_w.hide = True + cloth_secondary_wear_remap_w.outputs[0].default_value = clothsecondarywearremapW + + cloth_secondary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_iridescence.label = "Iridescence" + cloth_secondary_iridescence.use_custom_color = True + cloth_secondary_iridescence.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_iridescence.hide = True + cloth_secondary_iridescence.outputs[0].default_value = clothsecondaryiridescence + + reroute_139 = Shader_Preset.nodes.new("NodeReroute") + + armor_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_roughness_remap_y.label = "Roughness Remap Y" + armor_secondary_roughness_remap_y.use_custom_color = True + armor_secondary_roughness_remap_y.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_roughness_remap_y.hide = True + armor_secondary_roughness_remap_y.outputs[0].default_value = armorsecondaryroughnessremapY + + reroute_175 = Shader_Preset.nodes.new("NodeReroute") + + suit_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_roughness_remap_x.label = "Roughness Remap X" + suit_secondary_roughness_remap_x.use_custom_color = True + suit_secondary_roughness_remap_x.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_roughness_remap_x.hide = True + suit_secondary_roughness_remap_x.outputs[0].default_value = suitsecondaryroughnessremapX + + combine_xyz_041 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + mix_044 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + cloth_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_roughness_remap_w.label = "Roughness Remap W" + cloth_secondary_roughness_remap_w.use_custom_color = True + cloth_secondary_roughness_remap_w.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_roughness_remap_w.hide = True + cloth_secondary_roughness_remap_w.outputs[0].default_value = clothsecondaryroughnessremapW + + group_output = Shader_Preset.nodes.new("NodeGroupOutput") + + armor_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_roughness_remap_z.label = "Roughness Remap_Z" + armor_primary_roughness_remap_z.use_custom_color = True + armor_primary_roughness_remap_z.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_roughness_remap_z.hide = True + armor_primary_roughness_remap_z.outputs[0].default_value = armorprimaryroughnessremapZ + + combine_xyz_027 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_188 = Shader_Preset.nodes.new("NodeReroute") + + reroute_122 = Shader_Preset.nodes.new("NodeReroute") + + reroute_002 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_roughness_remap_x.label = "Roughness Remap X" + worn_suit_secondary_roughness_remap_x.use_custom_color = True + worn_suit_secondary_roughness_remap_x.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_roughness_remap_x.hide = True + worn_suit_secondary_roughness_remap_x.outputs[0].default_value = wornsuitsecondaryroughnessremapX + + suit_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + suit_primary_detail_diffuse_blend.use_custom_color = True + suit_primary_detail_diffuse_blend.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_detail_diffuse_blend.hide = True + suit_primary_detail_diffuse_blend.outputs[0].default_value = suitprimarydetaildiffuseblend + + cloth_primary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_roughness_remap_z.label = "Roughness Remap Z" + cloth_primary_roughness_remap_z.use_custom_color = True + cloth_primary_roughness_remap_z.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_roughness_remap_z.hide = True + cloth_primary_roughness_remap_z.outputs[0].default_value = clothprimaryroughnessremapZ + + combine_xyz_019 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + armor_secondary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_fuzz.label = "Fuzz" + armor_secondary_fuzz.use_custom_color = True + armor_secondary_fuzz.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_fuzz.hide = True + armor_secondary_fuzz.outputs[0].default_value = armorsecondaryfuzz + + reroute_069 = Shader_Preset.nodes.new("NodeReroute") + + reroute_030 = Shader_Preset.nodes.new("NodeReroute") + + reroute_116 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_046 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_194 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_roughness_remap_y.label = "Roughness Remap Y" + worn_armor_secondary_roughness_remap_y.use_custom_color = True + worn_armor_secondary_roughness_remap_y.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_roughness_remap_y.hide = True + worn_armor_secondary_roughness_remap_y.outputs[0].default_value = wornarmorsecondaryroughnessremapY + + cloth_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + cloth_primary_dye_color.label = "Dye Color" + cloth_primary_dye_color.use_custom_color = True + cloth_primary_dye_color.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_dye_color.hide = True + cloth_primary_dye_color.outputs[0].default_value = clothprimarydyecolor + + mix_071 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_197 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + armor_primary_detail_diffuse_blend.use_custom_color = True + armor_primary_detail_diffuse_blend.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_detail_diffuse_blend.hide = True + armor_primary_detail_diffuse_blend.outputs[0].default_value = armorprimarydetaildiffuseblend + + combine_xyz_002 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_iridescence.label = "Iridescence" + suit_secondary_iridescence.use_custom_color = True + suit_secondary_iridescence.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_iridescence.hide = True + suit_secondary_iridescence.outputs[0].default_value = suitsecondaryiridescence + + reroute_161 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_wear_remap_y.label = "Wear Remap Y" + armor_primary_wear_remap_y.use_custom_color = True + armor_primary_wear_remap_y.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_wear_remap_y.hide = True + armor_primary_wear_remap_y.outputs[0].default_value = armorprimarywearremapY + + reroute_155 = Shader_Preset.nodes.new("NodeReroute") + + reroute_193 = Shader_Preset.nodes.new("NodeReroute") + + mix_033 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_080 = Shader_Preset.nodes.new("NodeReroute") + + suit_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + suit_secondary_detail_diffuse_blend.use_custom_color = True + suit_secondary_detail_diffuse_blend.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_detail_diffuse_blend.hide = True + suit_secondary_detail_diffuse_blend.outputs[0].default_value = suitsecondarydetaildiffuseblend + + combine_xyz_042 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + math_018 = Shader_Preset.nodes.new("ShaderNodeMath") + math_018.operation = 'MULTIPLY_ADD' + math_018.use_clamp = True + math_018.inputs[1].default_value = -100000.0 + math_018.inputs[2].default_value = 1.0 + + combine_xyz_018 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_166 = Shader_Preset.nodes.new("NodeReroute") + + reroute_070 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_roughness_remap_y.label = "Roughness Remap Y" + worn_suit_primary_roughness_remap_y.use_custom_color = True + worn_suit_primary_roughness_remap_y.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_roughness_remap_y.hide = True + worn_suit_primary_roughness_remap_y.outputs[0].default_value = wornsuitprimaryroughnessremapY + + combine_xyz_008 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_armor_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_metalness.label = "Metalness" + worn_armor_primary_metalness.use_custom_color = True + worn_armor_primary_metalness.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_metalness.hide = True + worn_armor_primary_metalness.outputs[0].default_value = wornarmorprimarymetalness + + reroute_029 = Shader_Preset.nodes.new("NodeReroute") + + reroute_119 = Shader_Preset.nodes.new("NodeReroute") + + reroute_024 = Shader_Preset.nodes.new("NodeReroute") + + worn_cloth_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_roughness_remap_x.label = "Roughness Remap X" + worn_cloth_secondary_roughness_remap_x.use_custom_color = True + worn_cloth_secondary_roughness_remap_x.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_roughness_remap_x.hide = True + worn_cloth_secondary_roughness_remap_x.outputs[0].default_value = wornclothsecondaryroughnessremapX + + mix_050 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + suit_primary_emission_color.label = "Emission Color" + suit_primary_emission_color.use_custom_color = True + suit_primary_emission_color.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_emission_color.hide = True + suit_primary_emission_color.outputs[0].default_value = suitprimaryemissioncolor + + cloth_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_metalness.label = "Metalness" + cloth_primary_metalness.use_custom_color = True + cloth_primary_metalness.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_metalness.hide = True + cloth_primary_metalness.outputs[0].default_value = clothprimarymetalness + + worn_cloth_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_cloth_primary_detail_diffuse_blend.use_custom_color = True + worn_cloth_primary_detail_diffuse_blend.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_detail_diffuse_blend.hide = True + worn_cloth_primary_detail_diffuse_blend.outputs[0].default_value = wornclothprimarydetaildiffuseblend + + mix_068 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_068.inputs[2].default_value = (5.0, 5.0, 5.0, 1.0) + + mix_026 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + combine_xyz = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + armor_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_metalness.label = "Metalness" + armor_primary_metalness.use_custom_color = True + armor_primary_metalness.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_metalness.hide = True + armor_primary_metalness.outputs[0].default_value = armorprimarymetalness + + combine_xyz_021 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_fuzz.label = "Fuzz" + suit_secondary_fuzz.use_custom_color = True + suit_secondary_fuzz.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_fuzz.hide = True + suit_secondary_fuzz.outputs[0].default_value = suitsecondaryfuzz + + mix_003 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_176 = Shader_Preset.nodes.new("NodeReroute") + + reroute_156 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_roughness_remap_w.label = "Roughness Remap W" + cloth_primary_roughness_remap_w.use_custom_color = True + cloth_primary_roughness_remap_w.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_roughness_remap_w.hide = True + cloth_primary_roughness_remap_w.outputs[0].default_value = clothprimaryroughnessremapW + + reroute_098 = Shader_Preset.nodes.new("NodeReroute") + + reroute_136 = Shader_Preset.nodes.new("NodeReroute") + + mix_040 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_186 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_detail_diffuse_blend.label = "Detail Diffuse Blend" + cloth_primary_detail_diffuse_blend.use_custom_color = True + cloth_primary_detail_diffuse_blend.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_detail_diffuse_blend.hide = True + cloth_primary_detail_diffuse_blend.outputs[0].default_value = clothprimarydetaildiffuseblend + + combine_xyz_044 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + math = Shader_Preset.nodes.new("ShaderNodeMath") + math.operation = 'MULTIPLY_ADD' + math.use_clamp = True + math.inputs[1].default_value = 1000.0 + math.inputs[2].default_value = -333.0 + + worn_suit_primary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_roughness_remap_x.label = "Roughness Remap X" + worn_suit_primary_roughness_remap_x.use_custom_color = True + worn_suit_primary_roughness_remap_x.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_roughness_remap_x.hide = True + worn_suit_primary_roughness_remap_x.outputs[0].default_value = wornsuitprimaryroughnessremapX + + combine_xyz_009 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_170 = Shader_Preset.nodes.new("NodeReroute") + + worn_cloth_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_roughness_remap_z.label = "Roughness Remap Z" + worn_cloth_secondary_roughness_remap_z.use_custom_color = True + worn_cloth_secondary_roughness_remap_z.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_roughness_remap_z.hide = True + worn_cloth_secondary_roughness_remap_z.outputs[0].default_value = wornclothsecondaryroughnessremapZ + + reroute_017 = Shader_Preset.nodes.new("NodeReroute") + + reroute_118 = Shader_Preset.nodes.new("NodeReroute") + + mix_057 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_004 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_051 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_transmission.label = "Transmission" + suit_primary_transmission.use_custom_color = True + suit_primary_transmission.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_transmission.hide = True + suit_primary_transmission.outputs[0].default_value = suitprimarytransmission + + reroute_147 = Shader_Preset.nodes.new("NodeReroute") + + armor_secondary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + armor_secondary_emission_color.label = "Emission Color" + armor_secondary_emission_color.use_custom_color = True + armor_secondary_emission_color.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_emission_color.hide = True + armor_secondary_emission_color.outputs[0].default_value = armorsecondaryemissioncolor + + reroute_151 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_030 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + combine_xyz_007 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_transmission.label = "Transmission" + suit_secondary_transmission.use_custom_color = True + suit_secondary_transmission.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_transmission.hide = True + suit_secondary_transmission.outputs[0].default_value = suitsecondarytransmission + + mix_017 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_015 = Shader_Preset.nodes.new("NodeReroute") + + reroute_104 = Shader_Preset.nodes.new("NodeReroute") + + reroute_048 = Shader_Preset.nodes.new("NodeReroute") + + mix_020 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_078 = Shader_Preset.nodes.new("NodeReroute") + + mix_055 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + armor_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_roughness_remap_x.label = "Roughness Remap X" + armor_secondary_roughness_remap_x.use_custom_color = True + armor_secondary_roughness_remap_x.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_roughness_remap_x.hide = True + armor_secondary_roughness_remap_x.outputs[0].default_value = armorsecondaryroughnessremapX + + cloth_primary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_iridescence.label = "Iridescence" + cloth_primary_iridescence.use_custom_color = True + cloth_primary_iridescence.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_iridescence.hide = True + cloth_primary_iridescence.outputs[0].default_value = clothprimaryiridescence + + reroute_059 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_wear_remap_x.label = "Wear Remap X" + cloth_primary_wear_remap_x.use_custom_color = True + cloth_primary_wear_remap_x.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_wear_remap_x.hide = True + cloth_primary_wear_remap_x.outputs[0].default_value = clothprimarywearremapX + + mix_021 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_022 = Shader_Preset.nodes.new("NodeReroute") + + mix_019 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + combine_xyz_039 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_armor_secondary_roughness_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_roughness_remap_x.label = "Roughness Remap X" + worn_armor_secondary_roughness_remap_x.use_custom_color = True + worn_armor_secondary_roughness_remap_x.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_roughness_remap_x.hide = True + worn_armor_secondary_roughness_remap_x.outputs[0].default_value = wornarmorsecondaryroughnessremapX + + mix_073 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_suit_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_suit_primary_dye_color.label = "Dye Color" + worn_suit_primary_dye_color.use_custom_color = True + worn_suit_primary_dye_color.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_dye_color.hide = True + worn_suit_primary_dye_color.outputs[0].default_value = wornsuitprimarydyecolor + + combine_xyz_024 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_172 = Shader_Preset.nodes.new("NodeReroute") + + armor_detail_diffuse_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + armor_detail_diffuse_transform.label = "Detail Diffuse Transform" + armor_detail_diffuse_transform.use_custom_color = True + armor_detail_diffuse_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + armor_detail_diffuse_transform.vector_type = 'POINT' + armor_detail_diffuse_transform.inputs[2].hide = True + armor_detail_diffuse_transform.inputs[1].default_value = armordetaildiffuseposition + armor_detail_diffuse_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + armor_detail_diffuse_transform.inputs[3].default_value = armordetaildiffusescale + + reroute = Shader_Preset.nodes.new("NodeReroute") + + reroute_105 = Shader_Preset.nodes.new("NodeReroute") + + mix_052 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + cloth_secondary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_wear_remap_x.label = "Wear Remap X" + cloth_secondary_wear_remap_x.use_custom_color = True + cloth_secondary_wear_remap_x.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_wear_remap_x.hide = True + cloth_secondary_wear_remap_x.outputs[0].default_value = clothsecondarywearremapX + + armor_secondary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_wear_remap_y.label = "Wear Remap Y" + armor_secondary_wear_remap_y.use_custom_color = True + armor_secondary_wear_remap_y.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_wear_remap_y.hide = True + armor_secondary_wear_remap_y.outputs[0].default_value = armorsecondarywearremapY + + worn_cloth_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_cloth_primary_detail_roughness_blend.use_custom_color = True + worn_cloth_primary_detail_roughness_blend.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_detail_roughness_blend.hide = True + worn_cloth_primary_detail_roughness_blend.outputs[0].default_value = wornclothprimarydetailroughnessblend + + math_021 = Shader_Preset.nodes.new("ShaderNodeMath") + math_021.operation = 'MULTIPLY_ADD' + math_021.use_clamp = True + + math_021.inputs[1].default_value = -100000.0 + + math_021.inputs[2].default_value = 1.0 + + math_004 = Shader_Preset.nodes.new("ShaderNodeMath") + math_004.operation = 'MULTIPLY' + math_004.use_clamp = True + + math_004.inputs[1].default_value = 1000.0 + + math_004.inputs[2].default_value = 0.0 + + combine_xyz_031 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + combine_xyz_023 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + armor_secondary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_iridescence.label = "Iridescence" + armor_secondary_iridescence.use_custom_color = True + armor_secondary_iridescence.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_iridescence.hide = True + armor_secondary_iridescence.outputs[0].default_value = armorsecondaryiridescence + + reroute_047 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_detail_roughness_blend.label = "Detail Roughness Blend" + cloth_primary_detail_roughness_blend.use_custom_color = True + cloth_primary_detail_roughness_blend.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_detail_roughness_blend.hide = True + cloth_primary_detail_roughness_blend.outputs[0].default_value = clothprimarydetailroughnessblend + + combine_xyz_004 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_159 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_armor_primary_dye_color.label = "Dye Color" + worn_armor_primary_dye_color.use_custom_color = True + worn_armor_primary_dye_color.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_dye_color.hide = True + worn_armor_primary_dye_color.outputs[0].default_value = wornarmorprimarydyecolor + + reroute_173 = Shader_Preset.nodes.new("NodeReroute") + + reroute_052 = Shader_Preset.nodes.new("NodeReroute") + + suit_detail_normal_transform = Shader_Preset.nodes.new("ShaderNodeMapping") + suit_detail_normal_transform.label = "Detail Normal Transform" + suit_detail_normal_transform.use_custom_color = True + suit_detail_normal_transform.color = (0.2352934032678604, 0.2352934032678604, 0.5137253999710083) + suit_detail_normal_transform.vector_type = 'POINT' + suit_detail_normal_transform.inputs[2].hide = True + suit_detail_normal_transform.inputs[1].default_value = suitdetailnormalposition + suit_detail_normal_transform.inputs[2].default_value = (0.0, 0.0, 0.0) + suit_detail_normal_transform.inputs[3].default_value = suitdetailnormalscale + + mix_008 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_roughness_remap_y.label = "Roughness Remap Y" + suit_primary_roughness_remap_y.use_custom_color = True + suit_primary_roughness_remap_y.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_roughness_remap_y.hide = True + suit_primary_roughness_remap_y.outputs[0].default_value = suitprimaryroughnessremapY + + mix_042 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + combine_xyz_026 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_123 = Shader_Preset.nodes.new("NodeReroute") + + reroute_148 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_armor_secondary_detail_roughness_blend.use_custom_color = True + worn_armor_secondary_detail_roughness_blend.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_detail_roughness_blend.hide = True + worn_armor_secondary_detail_roughness_blend.outputs[0].default_value = wornarmorsecondarydetailroughnessblend + + reroute_066 = Shader_Preset.nodes.new("NodeReroute") + + cloth_primary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_wear_remap_y.label = "Wear Remap Y" + cloth_primary_wear_remap_y.use_custom_color = True + cloth_primary_wear_remap_y.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_wear_remap_y.hide = True + cloth_primary_wear_remap_y.outputs[0].default_value = clothprimarywearremapY + + combine_xyz_034 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_064 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_wear_remap_z.label = "Wear Remap Z" + armor_primary_wear_remap_z.use_custom_color = True + armor_primary_wear_remap_z.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_wear_remap_z.hide = True + armor_primary_wear_remap_z.outputs[0].default_value = armorprimarywearremapZ + + suit_secondary_emission_color = Shader_Preset.nodes.new("ShaderNodeRGB") + suit_secondary_emission_color.label = "Emission Color" + suit_secondary_emission_color.use_custom_color = True + suit_secondary_emission_color.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_emission_color.hide = True + suit_secondary_emission_color.outputs[0].default_value = suitsecondaryemissioncolor + + reroute_028 = Shader_Preset.nodes.new("NodeReroute") + + reroute_092 = Shader_Preset.nodes.new("NodeReroute") + + reroute_009 = Shader_Preset.nodes.new("NodeReroute") + + reroute_067 = Shader_Preset.nodes.new("NodeReroute") + + reroute_150 = Shader_Preset.nodes.new("NodeReroute") + + reroute_083 = Shader_Preset.nodes.new("NodeReroute") + + mix_041 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_010 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + suit_primary_fuzz = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_fuzz.label = "Fuzz" + suit_primary_fuzz.use_custom_color = True + suit_primary_fuzz.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_fuzz.hide = True + suit_primary_fuzz.outputs[0].default_value = suitprimaryfuzz + + mix_032 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_cloth_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_detail_normal_blend.label = "Detail Normal Blend" + worn_cloth_primary_detail_normal_blend.use_custom_color = True + worn_cloth_primary_detail_normal_blend.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_detail_normal_blend.hide = True + worn_cloth_primary_detail_normal_blend.outputs[0].default_value = wornclothprimarydetailnormalblend + + reroute_045 = Shader_Preset.nodes.new("NodeReroute") + + mix_072 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + armor_secondary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_wear_remap_w.label = "Wear Remap W" + armor_secondary_wear_remap_w.use_custom_color = True + armor_secondary_wear_remap_w.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_wear_remap_w.hide = True + armor_secondary_wear_remap_w.outputs[0].default_value = armorsecondarywearremapW + + worn_armor_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_armor_secondary_dye_color.label = "Dye Color" + worn_armor_secondary_dye_color.use_custom_color = True + worn_armor_secondary_dye_color.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_dye_color.hide = True + worn_armor_secondary_dye_color.outputs[0].default_value = wornarmorsecondarydyecolor + + combine_xyz_035 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + math_013 = Shader_Preset.nodes.new("ShaderNodeMath") + math_013.operation = 'ADD' + math_013.use_clamp = True + math_013.inputs[2].default_value = -500.0 + + combine_xyz_001 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + suit_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + suit_secondary_dye_color.label = "Dye Color" + suit_secondary_dye_color.use_custom_color = True + suit_secondary_dye_color.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_dye_color.hide = True + suit_secondary_dye_color.outputs[0].default_value = suitsecondarydyecolor + + armor_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_detail_normal_blend.label = "Detail Normal Blend" + armor_primary_detail_normal_blend.use_custom_color = True + armor_primary_detail_normal_blend.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_detail_normal_blend.hide = True + armor_primary_detail_normal_blend.outputs[0].default_value = armorprimarydetailnormalblend + + cloth_secondary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_secondary_wear_remap_y.label = "Wear Remap Y" + cloth_secondary_wear_remap_y.use_custom_color = True + cloth_secondary_wear_remap_y.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_wear_remap_y.hide = True + cloth_secondary_wear_remap_y.outputs[0].default_value = clothsecondarywearremapY + + combine_xyz_045 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_167 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_011 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_149 = Shader_Preset.nodes.new("NodeReroute") + + detail_uvs = Shader_Preset.nodes.new("ShaderNodeUVMap") + detail_uvs.label = "Detail UVs" + detail_uvs.uv_map = 'uv1' + detail_uvs.hide = True + + reroute_121 = Shader_Preset.nodes.new("NodeReroute") + + reroute_044 = Shader_Preset.nodes.new("NodeReroute") + + mix_018 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_cloth_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + worn_cloth_secondary_dye_color.label = "Dye Color" + worn_cloth_secondary_dye_color.use_custom_color = True + worn_cloth_secondary_dye_color.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_dye_color.hide = True + worn_cloth_secondary_dye_color.outputs[0].default_value = wornclothsecondarydyecolor + + reroute_087 = Shader_Preset.nodes.new("NodeReroute") + + mix_043 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_cloth_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_metalness.label = "Metalness" + worn_cloth_primary_metalness.use_custom_color = True + worn_cloth_primary_metalness.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_metalness.hide = True + worn_cloth_primary_metalness.outputs[0].default_value = wornclothprimarymetalness + + armor_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_roughness_remap_z.label = "Roughness Remap Z" + armor_secondary_roughness_remap_z.use_custom_color = True + armor_secondary_roughness_remap_z.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_roughness_remap_z.hide = True + armor_secondary_roughness_remap_z.outputs[0].default_value = armorsecondaryroughnessremapZ + + cloth_primary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_wear_remap_z.label = "Wear Remap Z" + cloth_primary_wear_remap_z.use_custom_color = True + cloth_primary_wear_remap_z.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_wear_remap_z.hide = True + cloth_primary_wear_remap_z.outputs[0].default_value = clothprimarywearremapZ + + reroute_008 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_032 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + combine_xyz_028 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + math_023 = Shader_Preset.nodes.new("ShaderNodeMath") + math_023.operation = 'SUBTRACT' + math_023.inputs[1].default_value = 3.0 + math_023.inputs[2].default_value = 0.5 + + mix_016 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + worn_suit_secondary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_metalness.label = "Metalness" + worn_suit_secondary_metalness.use_custom_color = True + worn_suit_secondary_metalness.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_metalness.hide = True + worn_suit_secondary_metalness.outputs[0].default_value = wornsuitsecondarymetalness + + mix_014 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_100 = Shader_Preset.nodes.new("NodeReroute") + + reroute_060 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_secondary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_detail_roughness_blend.label = "Detail Roughness Blend" + worn_suit_secondary_detail_roughness_blend.use_custom_color = True + worn_suit_secondary_detail_roughness_blend.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_detail_roughness_blend.hide = True + worn_suit_secondary_detail_roughness_blend.outputs[0].default_value = wornsuitsecondarydetailroughnessblend + + combine_xyz_040 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_001 = Shader_Preset.nodes.new("NodeReroute") + + reroute_090 = Shader_Preset.nodes.new("NodeReroute") + + mix_025 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_124 = Shader_Preset.nodes.new("NodeReroute") + + cloth_secondary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + cloth_secondary_dye_color.label = "Dye Color" + cloth_secondary_dye_color.use_custom_color = True + cloth_secondary_dye_color.color = (CSecon2.X, CSecon2.Y, CSecon2.Z) + cloth_secondary_dye_color.hide = True + cloth_secondary_dye_color.outputs[0].default_value = clothsecondarydyecolor + + worn_cloth_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_primary_roughness_remap_w.label = "Roughness Remap W" + worn_cloth_primary_roughness_remap_w.use_custom_color = True + worn_cloth_primary_roughness_remap_w.color = (CPrimeWear2.X, CPrimeWear2.Y, CPrimeWear2.Z) + worn_cloth_primary_roughness_remap_w.hide = True + worn_cloth_primary_roughness_remap_w.outputs[0].default_value = wornclothprimaryroughnessremapW + + combine_xyz_010 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_armor_primary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_primary_detail_normal_blend.label = "Detail Normal Blend" + worn_armor_primary_detail_normal_blend.use_custom_color = True + worn_armor_primary_detail_normal_blend.color = (CPrimeWear1.X, CPrimeWear1.Y, CPrimeWear1.Z) + worn_armor_primary_detail_normal_blend.hide = True + worn_armor_primary_detail_normal_blend.outputs[0].default_value = wornarmorprimarydetailnormalblend + + suit_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_detail_normal_blend.label = "Detail Normal Blend" + suit_secondary_detail_normal_blend.use_custom_color = True + suit_secondary_detail_normal_blend.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_detail_normal_blend.hide = True + suit_secondary_detail_normal_blend.outputs[0].default_value = suitsecondarydetailnormalblend + + combine_xyz_015 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_suit_secondary_roughness_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_roughness_remap_y.label = "Roughness Remap Y" + worn_suit_secondary_roughness_remap_y.use_custom_color = True + worn_suit_secondary_roughness_remap_y.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_roughness_remap_y.hide = True + worn_suit_secondary_roughness_remap_y.outputs[0].default_value = wornsuitsecondaryroughnessremapY + + reroute_012 = Shader_Preset.nodes.new("NodeReroute") + + reroute_013 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_iridescence = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_iridescence.label = "Iridescence" + armor_primary_iridescence.use_custom_color = True + armor_primary_iridescence.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_iridescence.hide = True + armor_primary_iridescence.outputs[0].default_value = armorprimaryiridescence + + reroute_089 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_012 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_062 = Shader_Preset.nodes.new("NodeReroute") + + reroute_101 = Shader_Preset.nodes.new("NodeReroute") + + reroute_043 = Shader_Preset.nodes.new("NodeReroute") + + reroute_086 = Shader_Preset.nodes.new("NodeReroute") + + reroute_031 = Shader_Preset.nodes.new("NodeReroute") + + mix_030 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_050 = Shader_Preset.nodes.new("NodeReroute") + + suit_primary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_wear_remap_x.label = "Wear Remap X" + suit_primary_wear_remap_x.use_custom_color = True + suit_primary_wear_remap_x.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_wear_remap_x.hide = True + suit_primary_wear_remap_x.outputs[0].default_value = suitprimarywearremapX + + armor_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_roughness_remap_w.label = "Roughness Remap W" + armor_secondary_roughness_remap_w.use_custom_color = True + armor_secondary_roughness_remap_w.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_roughness_remap_w.hide = True + armor_secondary_roughness_remap_w.outputs[0].default_value = armorsecondaryroughnessremapW + + combine_xyz_037 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + cloth_primary_wear_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_wear_remap_w.label = "Wear Remap W" + cloth_primary_wear_remap_w.use_custom_color = True + cloth_primary_wear_remap_w.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_wear_remap_w.hide = True + cloth_primary_wear_remap_w.outputs[0].default_value = clothprimarywearremapW + + reroute_007 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_005 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_112 = Shader_Preset.nodes.new("NodeReroute") + + reroute_006 = Shader_Preset.nodes.new("NodeReroute") + + armor_primary_detail_roughness_blend = Shader_Preset.nodes.new("ShaderNodeValue") + armor_primary_detail_roughness_blend.label = "Detail Roughness Blend" + armor_primary_detail_roughness_blend.use_custom_color = True + armor_primary_detail_roughness_blend.color = (CPrime1.X, CPrime1.Y, CPrime1.Z) + armor_primary_detail_roughness_blend.hide = True + armor_primary_detail_roughness_blend.outputs[0].default_value = armorprimarydetailroughnessblend + + reroute_010 = Shader_Preset.nodes.new("NodeReroute") + + reroute_184 = Shader_Preset.nodes.new("NodeReroute") + + suit_secondary_wear_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + suit_secondary_wear_remap_z.label = "Wear Remap Z" + suit_secondary_wear_remap_z.use_custom_color = True + suit_secondary_wear_remap_z.color = (CSecon3.X, CSecon3.Y, CSecon3.Z) + suit_secondary_wear_remap_z.hide = True + suit_secondary_wear_remap_z.outputs[0].default_value = suitsecondarywearremapZ + + separate_xyz_001 = Shader_Preset.nodes.new("ShaderNodeSeparateXYZ") + + reroute_093 = Shader_Preset.nodes.new("NodeReroute") + + reroute_061 = Shader_Preset.nodes.new("NodeReroute") + + worn_armor_secondary_detail_normal_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_detail_normal_blend.label = "Detail Normal Blend" + worn_armor_secondary_detail_normal_blend.use_custom_color = True + worn_armor_secondary_detail_normal_blend.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_detail_normal_blend.hide = True + worn_armor_secondary_detail_normal_blend.outputs[0].default_value = wornarmorsecondarydetailnormalblend + + reroute_051 = Shader_Preset.nodes.new("NodeReroute") + + mix_034 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + math_022 = Shader_Preset.nodes.new("ShaderNodeMath") + math_022.operation = 'MULTIPLY' + math_022.inputs[1].default_value = 0.3330000042915344 + math_022.inputs[2].default_value = 0.5 + + reroute_072 = Shader_Preset.nodes.new("NodeReroute") + + worn_suit_primary_metalness = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_metalness.label = "Metalness" + worn_suit_primary_metalness.use_custom_color = True + worn_suit_primary_metalness.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_metalness.hide = True + worn_suit_primary_metalness.outputs[0].default_value = wornsuitprimarymetalness + + cloth_primary_transmission = Shader_Preset.nodes.new("ShaderNodeValue") + cloth_primary_transmission.label = "Transmission" + cloth_primary_transmission.use_custom_color = True + cloth_primary_transmission.color = (CPrime2.X, CPrime2.Y, CPrime2.Z) + cloth_primary_transmission.hide = True + cloth_primary_transmission.outputs[0].default_value = clothprimarytransmission + + suit_primary_dye_color = Shader_Preset.nodes.new("ShaderNodeRGB") + suit_primary_dye_color.label = "Dye Color" + suit_primary_dye_color.use_custom_color = True + suit_primary_dye_color.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_dye_color.hide = True + suit_primary_dye_color.outputs[0].default_value = suitprimarydyecolor + + mix_076 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_067 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_067.inputs[2].default_value = (0.0, 0.0, 0.0, 0.0) + + worn_cloth_secondary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_cloth_secondary_roughness_remap_w.label = "Roughness Remap W" + worn_cloth_secondary_roughness_remap_w.use_custom_color = True + worn_cloth_secondary_roughness_remap_w.color = (CSeconWear2.X, CSeconWear2.Y, CSeconWear2.Z) + worn_cloth_secondary_roughness_remap_w.hide = True + worn_cloth_secondary_roughness_remap_w.outputs[0].default_value = wornclothsecondaryroughnessremapW + + combine_xyz_013 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_011 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_014 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_suit_primary_roughness_remap_w = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_primary_roughness_remap_w.label = "Roughness Remap W" + worn_suit_primary_roughness_remap_w.use_custom_color = True + worn_suit_primary_roughness_remap_w.color = (CPrimeWear3.X, CPrimeWear3.Y, CPrimeWear3.Z) + worn_suit_primary_roughness_remap_w.hide = True + worn_suit_primary_roughness_remap_w.outputs[0].default_value = wornsuitprimaryroughnessremapW + + worn_suit_secondary_roughness_remap_z = Shader_Preset.nodes.new("ShaderNodeValue") + worn_suit_secondary_roughness_remap_z.label = "Roughness Remap Z" + worn_suit_secondary_roughness_remap_z.use_custom_color = True + worn_suit_secondary_roughness_remap_z.color = (CSeconWear3.X, CSeconWear3.Y, CSeconWear3.Z) + worn_suit_secondary_roughness_remap_z.hide = True + worn_suit_secondary_roughness_remap_z.outputs[0].default_value = wornsuitsecondaryroughnessremapZ + + reroute_165 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_047 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + reroute_108 = Shader_Preset.nodes.new("NodeReroute") + + reroute_042 = Shader_Preset.nodes.new("NodeReroute") + + mix_024 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + reroute_046 = Shader_Preset.nodes.new("NodeReroute") + + reroute_180 = Shader_Preset.nodes.new("NodeReroute") + + suit_primary_wear_remap_y = Shader_Preset.nodes.new("ShaderNodeValue") + suit_primary_wear_remap_y.label = "Wear Remap Y" + suit_primary_wear_remap_y.use_custom_color = True + suit_primary_wear_remap_y.color = (CPrime3.X, CPrime3.Y, CPrime3.Z) + suit_primary_wear_remap_y.hide = True + suit_primary_wear_remap_y.outputs[0].default_value = suitprimarywearremapY + + mix_001 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_009 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + mix_046 = Shader_Preset.nodes.new("ShaderNodeMixRGB") + + armor_secondary_wear_remap_x = Shader_Preset.nodes.new("ShaderNodeValue") + armor_secondary_wear_remap_x.label = "Wear Remap X" + armor_secondary_wear_remap_x.use_custom_color = True + armor_secondary_wear_remap_x.color = (CSecon1.X, CSecon1.Y, CSecon1.Z) + armor_secondary_wear_remap_x.hide = True + armor_secondary_wear_remap_x.outputs[0].default_value = armorsecondarywearremapX + + worn_armor_secondary_detail_diffuse_blend = Shader_Preset.nodes.new("ShaderNodeValue") + worn_armor_secondary_detail_diffuse_blend.label = "Detail Diffuse Blend" + worn_armor_secondary_detail_diffuse_blend.use_custom_color = True + worn_armor_secondary_detail_diffuse_blend.color = (CSeconWear1.X, CSeconWear1.Y, CSeconWear1.Z) + worn_armor_secondary_detail_diffuse_blend.hide = True + worn_armor_secondary_detail_diffuse_blend.outputs[0].default_value = wornarmorsecondarydetaildiffuseblend + + math_005 = Shader_Preset.nodes.new("ShaderNodeMath") + math_005.operation = 'MULTIPLY' + math_005.inputs[2].default_value = 0.5 + + reroute_088 = Shader_Preset.nodes.new("NodeReroute") + + combine_xyz_022 = Shader_Preset.nodes.new("ShaderNodeCombineXYZ") + + worn_suit_secondary_detail_diffuse_blend.parent = WornSuitSecondaryFrame + math_017.parent = DoNotTouchFrame + mix_047.parent = DoNotTouchFrame + suit_primary_roughness_remap_w.parent = SuitPrimaryFrame + armor_secondary_detail_roughness_blend.parent = ArmorSecondaryFrame + worn_suit_primary_roughness_remap_z.parent = WornSuitPrimaryFrame + math_008.parent = DoNotTouchFrame + combine_xyz_016.parent = DoNotTouchFrame + mix_023.parent = DoNotTouchFrame + suit_primary_wear_remap_z.parent = SuitPrimaryFrame + worn_armor_secondary_roughness_remap_w.parent = WornArmorSecondaryFrame + worn_cloth_primary_dye_color.parent = WornClothPrimaryFrame + group_input.parent = DoNotTouchFrame + mix_065.parent = DoNotTouchFrame + combine_xyz_017.parent = DoNotTouchFrame + worn_suit_secondary_roughness_remap_w.parent = WornSuitSecondaryFrame + suit_primary_iridescence.parent = SuitPrimaryFrame + mix_005.parent = DoNotTouchFrame + math_010.parent = DoNotTouchFrame + mix_049.parent = DoNotTouchFrame + math_024.parent = DoNotTouchFrame + mix_028.parent = DoNotTouchFrame + math_015.parent = DoNotTouchFrame + cloth_primary_fuzz.parent = ClothPrimaryFrame + armor_primary_wear_remap_w.parent = ArmorPrimaryFrame + mix.parent = DoNotTouchFrame + mix_059.parent = DoNotTouchFrame + worn_armor_secondary_roughness_remap_z.parent = WornArmorSecondaryFrame + armor_secondary_transmission.parent = ArmorSecondaryFrame + combine_xyz_043.parent = DoNotTouchFrame + math_001.parent = DoNotTouchFrame + cloth_secondary_fuzz.parent = ClothSecondaryFrame + mix_056.parent = DoNotTouchFrame + cloth_secondary_metalness.parent = ClothSecondaryFrame + worn_armor_secondary_metalness.parent = WornArmorSecondaryFrame + math_012.parent = DoNotTouchFrame + separate_xyz_002.parent = DoNotTouchFrame + math_003.parent = DoNotTouchFrame + suit_secondary_detail_roughness_blend.parent = SuitSecondaryFrame + cloth_secondary_wear_remap_z.parent = ClothSecondaryFrame + armor_primary_fuzz.parent = ArmorPrimaryFrame + worn_armor_primary_roughness_remap_x.parent = WornArmorPrimaryFrame + cloth_secondary_roughness_remap_z.parent = ClothSecondaryFrame + worn_cloth_primary_roughness_remap_x.parent = WornClothPrimaryFrame + mix_022.parent = DoNotTouchFrame + suit_primary_roughness_remap_z.parent = SuitPrimaryFrame + worn_cloth_secondary_metalness.parent = WornClothSecondaryFrame + math_019.parent = DoNotTouchFrame + combine_xyz_038.parent = DoNotTouchFrame + suit_secondary_roughness_remap_w.parent = SuitSecondaryFrame + math_007.parent = DoNotTouchFrame + mix_048.parent = DoNotTouchFrame + cloth_secondary_detail_roughness_blend.parent = ClothSecondaryFrame + armor_secondary_detail_normal_blend.parent = ArmorSecondaryFrame + worn_cloth_primary_roughness_remap_z.parent = WornClothPrimaryFrame + combine_xyz_036.parent = DoNotTouchFrame + math_002.parent = DoNotTouchFrame + worn_cloth_secondary_detail_diffuse_blend.parent = WornClothSecondaryFrame + math_016.parent = DoNotTouchFrame + worn_suit_primary_detail_diffuse_blend.parent = WornSuitPrimaryFrame + suit_secondary_wear_remap_x.parent = SuitSecondaryFrame + armor_primary_transmission.parent = ArmorPrimaryFrame + worn_armor_primary_roughness_remap_y.parent = WornArmorPrimaryFrame + cloth_secondary_roughness_remap_y.parent = ClothSecondaryFrame + cloth_secondary_transmission.parent = ClothSecondaryFrame + mix_011.parent = DoNotTouchFrame + cloth_primary_detail_normal_blend.parent = ClothPrimaryFrame + armor_secondary_detail_diffuse_blend.parent = ArmorSecondaryFrame + worn_cloth_secondary_detail_roughness_blend.parent = WornClothSecondaryFrame + mix_066.parent = DoNotTouchFrame + combine_xyz_003.parent = DoNotTouchFrame + armor_primary_emission_color.parent = ArmorPrimaryFrame + suit_secondary_roughness_remap_z.parent = SuitSecondaryFrame + suit_primary_detail_normal_blend.parent = SuitPrimaryFrame + worn_suit_secondary_dye_color.parent = WornSuitSecondaryFrame + mix_027.parent = DoNotTouchFrame + suit_primary_detail_roughness_blend.parent = SuitPrimaryFrame + cloth_secondary_detail_normal_blend.parent = ClothSecondaryFrame + suit_primary_roughness_remap_x.parent = SuitPrimaryFrame + cloth_primary_emission_color.parent = ClothPrimaryFrame + worn_cloth_primary_roughness_remap_y.parent = WornClothPrimaryFrame + worn_suit_primary_detail_roughness_blend.parent = WornSuitPrimaryFrame + mix_006.parent = DoNotTouchFrame + suit_secondary_wear_remap_w.parent = SuitSecondaryFrame + worn_suit_secondary_detail_normal_blend.parent = WornSuitSecondaryFrame + worn_cloth_secondary_roughness_remap_y.parent = WornClothSecondaryFrame + mix_002.parent = DoNotTouchFrame + mix_012.parent = DoNotTouchFrame + cloth_secondary_detail_diffuse_blend.parent = ClothSecondaryFrame + armor_secondary_dye_color.parent = ArmorSecondaryFrame + suit_primary_detail_diffuse_map.parent = SuitPrimaryFrame + worn_cloth_secondary_detail_normal_blend.parent = WornClothSecondaryFrame + combine_xyz_020.parent = DoNotTouchFrame + mix_074.parent = DoNotTouchFrame + armor_primary_roughness_remap_x.parent = ArmorPrimaryFrame + armor_secondary_metalness.parent = ArmorSecondaryFrame + mix_013.parent = DoNotTouchFrame + armor_primary_roughness_remap_w.parent = ArmorPrimaryFrame + cloth_secondary_roughness_remap_x.parent = ClothSecondaryFrame + armor_secondary_wear_remap_z.parent = ArmorSecondaryFrame + mix_069.parent = DoNotTouchFrame + cloth_primary_roughness_remap_x.parent = ClothPrimaryFrame + armor_primary_dye_color.parent = ArmorPrimaryFrame + mix_054.parent = DoNotTouchFrame + worn_suit_primary_detail_normal_blend.parent = WornSuitPrimaryFrame + mix_007.parent = DoNotTouchFrame + suit_secondary_metalness.parent = SuitSecondaryFrame + worn_armor_primary_roughness_remap_z.parent = WornArmorPrimaryFrame + suit_primary_wear_remap_w.parent = SuitPrimaryFrame + worn_armor_primary_roughness_remap_w.parent = WornArmorPrimaryFrame + cloth_secondary_emission_color.parent = ClothSecondaryFrame + mix_031.parent = DoNotTouchFrame + combine_xyz_048.parent = DoNotTouchFrame + armor_primary_wear_remap_x.parent = ArmorPrimaryFrame + combine_xyz_033.parent = DoNotTouchFrame + suit_secondary_roughness_remap_y.parent = SuitSecondaryFrame + armor_primary_roughness_remap_y.parent = ArmorPrimaryFrame + combine_xyz_029.parent = DoNotTouchFrame + worn_armor_primary_detail_diffuse_blend.parent = WornArmorPrimaryFrame + mix_015.parent = DoNotTouchFrame + suit_primary_detail_normal_map.parent = SuitPrimaryFrame + cloth_primary_detail_normal_map.parent = ClothPrimaryFrame + mix_045.parent = DoNotTouchFrame + mix_029.parent = DoNotTouchFrame + node.parent = DoNotTouchFrame + cloth_primary_roughness_remap_y.parent = ClothPrimaryFrame + mix_070.parent = DoNotTouchFrame + attribute.parent = DoNotTouchFrame + mix_053.parent = DoNotTouchFrame + combine_xyz_006.parent = DoNotTouchFrame + suit_secondary_wear_remap_y.parent = SuitSecondaryFrame + combine_xyz_025.parent = DoNotTouchFrame + worn_armor_primary_detail_roughness_blend.parent = WornArmorPrimaryFrame + mix_058.parent = DoNotTouchFrame + suit_primary_metalness.parent = SuitPrimaryFrame + cloth_secondary_wear_remap_w.parent = ClothSecondaryFrame + cloth_secondary_iridescence.parent = ClothSecondaryFrame + armor_secondary_roughness_remap_y.parent = ArmorSecondaryFrame + suit_secondary_roughness_remap_x.parent = SuitSecondaryFrame + combine_xyz_041.parent = DoNotTouchFrame + mix_044.parent = DoNotTouchFrame + cloth_secondary_roughness_remap_w.parent = ClothSecondaryFrame + group_output.parent = DoNotTouchFrame + armor_primary_roughness_remap_z.parent = ArmorPrimaryFrame + combine_xyz_027.parent = DoNotTouchFrame + worn_suit_secondary_roughness_remap_x.parent = WornSuitSecondaryFrame + suit_primary_detail_diffuse_blend.parent = SuitPrimaryFrame + cloth_primary_roughness_remap_z.parent = ClothPrimaryFrame + combine_xyz_019.parent = DoNotTouchFrame + armor_secondary_fuzz.parent = ArmorSecondaryFrame + combine_xyz_046.parent = DoNotTouchFrame + worn_armor_secondary_roughness_remap_y.parent = WornArmorSecondaryFrame + cloth_primary_dye_color.parent = ClothPrimaryFrame + mix_071.parent = DoNotTouchFrame + armor_primary_detail_diffuse_blend.parent = ArmorPrimaryFrame + combine_xyz_002.parent = DoNotTouchFrame + suit_secondary_iridescence.parent = SuitSecondaryFrame + armor_primary_wear_remap_y.parent = ArmorPrimaryFrame + mix_033.parent = DoNotTouchFrame + suit_secondary_detail_diffuse_blend.parent = SuitSecondaryFrame + combine_xyz_042.parent = DoNotTouchFrame + math_018.parent = DoNotTouchFrame + combine_xyz_018.parent = DoNotTouchFrame + worn_suit_primary_roughness_remap_y.parent = WornSuitPrimaryFrame + combine_xyz_008.parent = DoNotTouchFrame + worn_armor_primary_metalness.parent = WornArmorPrimaryFrame + worn_cloth_secondary_roughness_remap_x.parent = WornClothSecondaryFrame + mix_050.parent = DoNotTouchFrame + suit_primary_emission_color.parent = SuitPrimaryFrame + cloth_primary_metalness.parent = ClothPrimaryFrame + worn_cloth_primary_detail_diffuse_blend.parent = WornClothPrimaryFrame + mix_068.parent = DoNotTouchFrame + mix_026.parent = DoNotTouchFrame + combine_xyz.parent = DoNotTouchFrame + armor_primary_metalness.parent = ArmorPrimaryFrame + combine_xyz_021.parent = DoNotTouchFrame + suit_secondary_fuzz.parent = SuitSecondaryFrame + mix_003.parent = DoNotTouchFrame + cloth_primary_roughness_remap_w.parent = ClothPrimaryFrame + mix_040.parent = DoNotTouchFrame + cloth_primary_detail_diffuse_blend.parent = ClothPrimaryFrame + cloth_primary_detail_diffuse_map.parent = ClothPrimaryFrame + combine_xyz_044.parent = DoNotTouchFrame + math.parent = DoNotTouchFrame + armor_primary_detail_normal_map.parent = ArmorPrimaryFrame + worn_suit_primary_roughness_remap_x.parent = WornSuitPrimaryFrame + combine_xyz_009.parent = DoNotTouchFrame + worn_cloth_secondary_roughness_remap_z.parent = WornClothSecondaryFrame + mix_057.parent = DoNotTouchFrame + mix_004.parent = DoNotTouchFrame + mix_051.parent = DoNotTouchFrame + suit_primary_transmission.parent = SuitPrimaryFrame + armor_secondary_emission_color.parent = ArmorSecondaryFrame + combine_xyz_030.parent = DoNotTouchFrame + combine_xyz_007.parent = DoNotTouchFrame + suit_secondary_transmission.parent = SuitSecondaryFrame + mix_017.parent = DoNotTouchFrame + armor_primary_detail_diffuse_map.parent = ArmorPrimaryFrame + mix_020.parent = DoNotTouchFrame + mix_055.parent = DoNotTouchFrame + armor_secondary_roughness_remap_x.parent = ArmorSecondaryFrame + cloth_primary_iridescence.parent = ClothPrimaryFrame + cloth_primary_wear_remap_x.parent = ClothPrimaryFrame + mix_021.parent = DoNotTouchFrame + mix_019.parent = DoNotTouchFrame + combine_xyz_039.parent = DoNotTouchFrame + worn_armor_secondary_roughness_remap_x.parent = WornArmorSecondaryFrame + mix_073.parent = DoNotTouchFrame + worn_suit_primary_dye_color.parent = WornSuitPrimaryFrame + combine_xyz_024.parent = DoNotTouchFrame + mix_052.parent = DoNotTouchFrame + cloth_secondary_wear_remap_x.parent = ClothSecondaryFrame + armor_secondary_wear_remap_y.parent = ArmorSecondaryFrame + worn_cloth_primary_detail_roughness_blend.parent = WornClothPrimaryFrame + math_021.parent = DoNotTouchFrame + math_004.parent = DoNotTouchFrame + combine_xyz_031.parent = DoNotTouchFrame + combine_xyz_023.parent = DoNotTouchFrame + armor_secondary_iridescence.parent = ArmorSecondaryFrame + cloth_primary_detail_roughness_blend.parent = ClothPrimaryFrame + combine_xyz_004.parent = DoNotTouchFrame + worn_armor_primary_dye_color.parent = WornArmorPrimaryFrame + mix_008.parent = DoNotTouchFrame + suit_primary_roughness_remap_y.parent = SuitPrimaryFrame + mix_042.parent = DoNotTouchFrame + combine_xyz_026.parent = DoNotTouchFrame + worn_armor_secondary_detail_roughness_blend.parent = WornArmorSecondaryFrame + cloth_primary_wear_remap_y.parent = ClothPrimaryFrame + combine_xyz_034.parent = DoNotTouchFrame + armor_primary_wear_remap_z.parent = ArmorPrimaryFrame + suit_secondary_emission_color.parent = SuitSecondaryFrame + mix_041.parent = DoNotTouchFrame + mix_010.parent = DoNotTouchFrame + suit_primary_fuzz.parent = SuitPrimaryFrame + mix_032.parent = DoNotTouchFrame + worn_cloth_primary_detail_normal_blend.parent = WornClothPrimaryFrame + mix_072.parent = DoNotTouchFrame + armor_secondary_wear_remap_w.parent = ArmorSecondaryFrame + worn_armor_secondary_dye_color.parent = WornArmorSecondaryFrame + combine_xyz_035.parent = DoNotTouchFrame + math_013.parent = DoNotTouchFrame + combine_xyz_001.parent = DoNotTouchFrame + suit_secondary_dye_color.parent = SuitSecondaryFrame + armor_primary_detail_normal_blend.parent = ArmorPrimaryFrame + cloth_secondary_wear_remap_y.parent = ClothSecondaryFrame + combine_xyz_045.parent = DoNotTouchFrame + combine_xyz_011.parent = DoNotTouchFrame + mix_018.parent = DoNotTouchFrame + worn_cloth_secondary_dye_color.parent = WornClothSecondaryFrame + mix_043.parent = DoNotTouchFrame + worn_cloth_primary_metalness.parent = WornClothPrimaryFrame + armor_secondary_roughness_remap_z.parent = ArmorSecondaryFrame + cloth_primary_wear_remap_z.parent = ClothPrimaryFrame + combine_xyz_032.parent = DoNotTouchFrame + combine_xyz_028.parent = DoNotTouchFrame + math_023.parent = DoNotTouchFrame + mix_016.parent = DoNotTouchFrame + worn_suit_secondary_metalness.parent = WornSuitSecondaryFrame + mix_014.parent = DoNotTouchFrame + worn_suit_secondary_detail_roughness_blend.parent = WornSuitSecondaryFrame + combine_xyz_040.parent = DoNotTouchFrame + mix_025.parent = DoNotTouchFrame + cloth_secondary_dye_color.parent = ClothSecondaryFrame + worn_cloth_primary_roughness_remap_w.parent = WornClothPrimaryFrame + combine_xyz_010.parent = DoNotTouchFrame + worn_armor_primary_detail_normal_blend.parent = WornArmorPrimaryFrame + suit_secondary_detail_normal_blend.parent = SuitSecondaryFrame + combine_xyz_015.parent = DoNotTouchFrame + worn_suit_secondary_roughness_remap_y.parent = WornSuitSecondaryFrame + armor_primary_iridescence.parent = ArmorPrimaryFrame + combine_xyz_012.parent = DoNotTouchFrame + mix_030.parent = DoNotTouchFrame + suit_primary_wear_remap_x.parent = SuitPrimaryFrame + armor_secondary_roughness_remap_w.parent = ArmorSecondaryFrame + combine_xyz_037.parent = DoNotTouchFrame + cloth_primary_wear_remap_w.parent = ClothPrimaryFrame + combine_xyz_005.parent = DoNotTouchFrame + armor_primary_detail_roughness_blend.parent = ArmorPrimaryFrame + suit_secondary_wear_remap_z.parent = SuitSecondaryFrame + separate_xyz_001.parent = DoNotTouchFrame + worn_armor_secondary_detail_normal_blend.parent = WornArmorSecondaryFrame + mix_034.parent = DoNotTouchFrame + math_022.parent = DoNotTouchFrame + worn_suit_primary_metalness.parent = WornSuitPrimaryFrame + cloth_primary_transmission.parent = ClothPrimaryFrame + suit_primary_dye_color.parent = SuitPrimaryFrame + mix_076.parent = DoNotTouchFrame + mix_067.parent = DoNotTouchFrame + worn_cloth_secondary_roughness_remap_w.parent = WornClothSecondaryFrame + combine_xyz_013.parent = DoNotTouchFrame + combine_xyz_014.parent = DoNotTouchFrame + worn_suit_primary_roughness_remap_w.parent = WornSuitPrimaryFrame + worn_suit_secondary_roughness_remap_z.parent = WornSuitSecondaryFrame + combine_xyz_047.parent = DoNotTouchFrame + mix_024.parent = DoNotTouchFrame + suit_primary_wear_remap_y.parent = SuitPrimaryFrame + mix_001.parent = DoNotTouchFrame + mix_009.parent = DoNotTouchFrame + mix_046.parent = DoNotTouchFrame + armor_secondary_wear_remap_x.parent = ArmorSecondaryFrame + worn_armor_secondary_detail_diffuse_blend.parent = WornArmorSecondaryFrame + math_005.parent = DoNotTouchFrame + combine_xyz_022.parent = DoNotTouchFrame + + #Set locations + ArmorPrimaryFrame.location = (-660.0, 720.0) + SuitSecondaryFrame.location = (-700.0, -3837.078125) + DoNotTouchFrame.location = (1503.5009765625, -1193.9627685546875) + WornSuitPrimaryFrame.location = (-680.0, -3487.9482421875) + WornClothSecondaryFrame.location = (-680.0, -2490.54150390625) + ArmorSecondaryFrame.location = (-680.0, 102.05084991455078) + SuitPrimaryFrame.location = (-680.0, -2838.179443359375) + WornClothPrimaryFrame.location = (-680.0, -1619.5882568359375) + WornArmorSecondaryFrame.location = (920.0, -941.9125366210938) + ClothSecondaryFrame.location = (-679.4005737304688, -1887.1016845703125) + ClothPrimaryFrame.location = (-680.0, -891.457275390625) + WornSuitSecondaryFrame.location = (-700.0, -4440.0595703125) + WornArmorPrimaryFrame.location = (-660.0, 450.19281005859375) + worn_suit_secondary_detail_diffuse_blend.location = (40.0, -200.126953125) + math_017.location = (-1882.6395263671875, -3699.33740234375) + suit_detail_diffuse_transform.location = (-913.1685180664062, -2939.849365234375) + reroute_004.location = (-377.1822509765625, -3036.572998046875) + mix_047.location = (-1880.0882568359375, -3704.32177734375) + suit_primary_roughness_remap_w.location = (20.0, -147.927978515625) + reroute_003.location = (-377.1822509765625, -2964.310546875) + armor_secondary_detail_roughness_blend.location = (20.0, -392.22430419921875) + reroute_152.location = (-377.1822509765625, -3950.9873046875) + reroute_053.location = (-377.1822509765625, -3348.07177734375) + worn_suit_primary_roughness_remap_z.location = (20.0, -136.16259765625) + math_008.location = (-1880.5616455078125, -3701.11279296875) + reroute_190.location = (-377.1822509765625, -1349.905029296875) + combine_xyz_016.location = (-1881.3702392578125, -3702.39404296875) + reroute_032.location = (-717.01171875, -3028.1875) + mix_023.location = (-1880.0921630859375, -3702.02197265625) + suit_primary_wear_remap_z.location = (20.0, -275.856689453125) + worn_armor_secondary_roughness_remap_w.location = (-1580.0, 271.220947265625) + reroute_162.location = (-377.1822509765625, -4238.8603515625) + worn_cloth_primary_dye_color.location = (20.0, 60.0) + group_input.location = (-2072.258544921875, -3667.01513671875) + mix_065.location = (-1882.0794677734375, -3698.79736328125) + reroute_023.location = (-717.01171875, -1008.372314453125) + combine_xyz_017.location = (-1881.3702392578125, -3702.51416015625) + worn_suit_secondary_roughness_remap_w.location = (40.0, -167.92822265625) + reroute_158.location = (-377.1822509765625, -4143.43115234375) + suit_primary_iridescence.location = (20.0, -499.947509765625) + mix_005.location = (-1880.0882568359375, -3701.37353515625) + math_010.location = (-1882.1995849609375, -3699.0576171875) + reroute_196.location = (-377.1822509765625, -1446.5072021484375) + reroute_026.location = (-717.01171875, -3246.12939453125) + mix_049.location = (-1880.0882568359375, -3704.38232421875) + math_024.location = (-1880.9088134765625, -3699.49365234375) + reroute_168.location = (-377.1822509765625, -4399.40869140625) + mix_028.location = (-1880.0921630859375, -3702.17626953125) + math_015.location = (-1882.9595947265625, -3698.69775390625) + reroute_192.location = (-377.1822509765625, -1286.6318359375) + reroute_076.location = (-377.1822509765625, -300.3265380859375) + cloth_primary_fuzz.location = (20.0, -512.628173828125) + armor_primary_wear_remap_w.location = (0.888427734375, 71.297119140625) + mix.location = (-1880.0882568359375, -3701.19384765625) + reroute_187.location = (-377.1822509765625, -1126.6097412109375) + reroute_169.location = (-377.1822509765625, 1070.6392822265625) + reroute_138.location = (-377.1822509765625, -2173.7353515625) + reroute_071.location = (-377.1822509765625, -428.3582763671875) + reroute_033.location = (-717.01171875, -3188.9267578125) + reroute_157.location = (-377.1822509765625, -4110.927734375) + reroute_054.location = (-377.1822509765625, -3380.574951171875) + mix_059.location = (-1880.0870361328125, -3705.96728515625) + worn_armor_secondary_roughness_remap_z.location = (-1580.0, 303.6099853515625) + armor_secondary_transmission.location = (20.0, -520.1524047851562) + reroute_141.location = (-377.1822509765625, -2237.310546875) + reroute_142.location = (-377.1822509765625, -2269.076171875) + combine_xyz_043.location = (-1883.5101318359375, -3702.13427734375) + math_001.location = (-1880.5616455078125, -3700.99267578125) + cloth_secondary_fuzz.location = (20.0, -468.169189453125) + reroute_107.location = (-377.1822509765625, 589.4473876953125) + reroute_365.location = (-377.1822509765625, -1414.7418212890625) + armor_detail_normal_transform.location = (-913.1685180664062, 727.1367797851562) + reroute_181.location = (-377.1822509765625, -1030.2899169921875) + reroute_137.location = (-377.1822509765625, -2141.53662109375) + reroute_020.location = (-717.01171875, -1222.9573974609375) + mix_056.location = (-1880.0870361328125, -3705.87744140625) + reroute_102.location = (-377.1822509765625, 685.6102294921875) + cloth_secondary_metalness.location = (20.0, -404.205322265625) + worn_armor_secondary_metalness.location = (-1580.0, 143.1917724609375) + math_012.location = (-1882.3995361328125, -3698.99755859375) + separate_xyz_002.location = (-1883.2196044921875, -3699.0576171875) + math_003.location = (-1882.6995849609375, -3698.53759765625) + suit_secondary_detail_roughness_blend.location = (40.0, -391.36962890625) + cloth_secondary_wear_remap_z.location = (20.0, -243.600341796875) + armor_primary_fuzz.location = (0.0, -153.38067626953125) + reroute_056.location = (-377.1822509765625, -1794.3809814453125) + reroute_115.location = (-377.1822509765625, -3538.58544921875) + reroute_049.location = (-377.1822509765625, -3251.967529296875) + reroute_096.location = (-377.1822509765625, 1038.5089111328125) + worn_armor_primary_roughness_remap_x.location = (0.0, -72.19877624511719) + reroute_025.location = (-939.7109985351562, -1334.8509521484375) + reroute_055.location = (-377.1822509765625, -3412.60986328125) + cloth_secondary_roughness_remap_z.location = (20.0, -115.881591796875) + worn_cloth_primary_roughness_remap_x.location = (20.0, 27.474609375) + mix_022.location = (-1880.0921630859375, -3701.99169921875) + reroute_057.location = (-377.1822509765625, -1666.8238525390625) + suit_primary_roughness_remap_z.location = (20.0, -116.16259765625) + reroute_081.location = (-377.1822509765625, -172.86279296875) + worn_cloth_secondary_metalness.location = (20.0, -276.723388671875) + math_019.location = (-1882.6395263671875, -3698.9775390625) + combine_xyz_038.location = (-1883.1702880859375, -3701.7138671875) + suit_secondary_roughness_remap_w.location = (40.0, -167.49462890625) + math_007.location = (-1880.5616455078125, -3701.07275390625) + reroute_095.location = (-377.1822509765625, 1006.5672607421875) + reroute_160.location = (-377.1822509765625, -4175.72802734375) + reroute_195.location = (-377.1822509765625, -1382.4083251953125) + reroute_140.location = (-377.1822509765625, -2205.11181640625) + reroute_021.location = (-717.01171875, -1062.218017578125) + mix_048.location = (-1880.0882568359375, -3704.35205078125) + cloth_secondary_detail_roughness_blend.location = (20.0, -372.006591796875) + reroute_082.location = (-377.1822509765625, -139.966796875) + armor_secondary_detail_normal_blend.location = (20.0, -360.458984375) + worn_cloth_primary_roughness_remap_z.location = (20.0, -36.42626953125) + combine_xyz_036.location = (-1882.6102294921875, -3705.25390625) + math_002.location = (-1882.9595947265625, -3698.51708984375) + worn_cloth_secondary_detail_diffuse_blend.location = (20.0, -180.560546875) + reroute_068.location = (-377.1822509765625, -4650.48876953125) + math_016.location = (-1882.9595947265625, -3698.87744140625) + reroute_041.location = (-377.1822509765625, -3060.040283203125) + worn_suit_primary_detail_diffuse_blend.location = (20.0, -200.12646484375) + suit_secondary_wear_remap_x.location = (40.0, -199.3896484375) + armor_primary_transmission.location = (0.0, -185.14605712890625) + worn_armor_primary_roughness_remap_y.location = (0.0, -103.96417236328125) + reroute_109.location = (-377.1822509765625, 525.4830322265625) + reroute_129.location = (-377.1822509765625, -1981.0106201171875) + reroute_177.location = (-377.1822509765625, 176.5667724609375) + reroute_014.location = (-717.01171875, 964.4620361328125) + reroute_130.location = (-377.1822509765625, -2045.8648681640625) + cloth_secondary_roughness_remap_y.location = (20.0, -84.07275390625) + cloth_secondary_transmission.location = (20.0, -499.9345703125) + mix_011.location = (-1880.0931396484375, -3701.6025390625) + cloth_primary_detail_normal_blend.location = (20.0, -384.5181884765625) + reroute_171.location = (-377.1822509765625, 336.7640380859375) + armor_secondary_detail_diffuse_blend.location = (20.0, -327.8268127441406) + worn_cloth_secondary_detail_roughness_blend.location = (20.0, -244.091064453125) + mix_066.location = (-1881.8795166015625, -3698.79736328125) + combine_xyz_003.location = (-1882.1102294921875, -3701.49365234375) + armor_primary_emission_color.location = (0.0, -217.34481811523438) + suit_secondary_roughness_remap_z.location = (40.0, -136.1630859375) + suit_primary_detail_normal_blend.location = (20.0, -404.21826171875) + reroute_174.location = (-377.1822509765625, 400.8836669921875) + reroute_191.location = (-377.1822509765625, -1254.7452392578125) + reroute_016.location = (-717.01171875, 692.674560546875) + worn_suit_secondary_dye_color.location = (40.0, -40.0) + reroute_094.location = (-377.1822509765625, 973.5015869140625) + reroute_131.location = (-377.1822509765625, -1948.9759521484375) + mix_027.location = (-1880.0921630859375, -3702.14697265625) + suit_primary_detail_roughness_blend.location = (20.0, -435.983642578125) + cloth_secondary_detail_normal_blend.location = (20.0, -340.2412109375) + reroute_077.location = (-377.1822509765625, -268.6146240234375) + cloth_detail_diffuse_transform.location = (-913.1685180664062, -973.8799438476562) + suit_primary_roughness_remap_x.location = (20.0, -52.19873046875) + cloth_primary_emission_color.location = (20.0, -576.59228515625) + worn_cloth_primary_roughness_remap_y.location = (20.0, -4.475830078125) + reroute_146.location = (-377.1822509765625, -2365.671875) + reroute_127.location = (-377.1822509765625, -745.2362060546875) + worn_suit_primary_detail_roughness_blend.location = (20.0, -263.656982421875) + mix_006.location = (-1880.0882568359375, -3701.40380859375) + suit_secondary_wear_remap_w.location = (40.0, -295.552734375) + reroute_063.location = (-377.1822509765625, -1730.8682861328125) + reroute_126.location = (-377.1822509765625, -712.7672119140625) + reroute_018.location = (-939.7109985351562, 909.7139282226562) + worn_suit_secondary_detail_normal_blend.location = (40.0, -231.892578125) + reroute_135.location = (-377.1822509765625, -2077.57275390625) + worn_cloth_secondary_roughness_remap_y.location = (20.0, -84.3974609375) + reroute_182.location = (-377.1822509765625, -934.41748046875) + mix_002.location = (-1880.0882568359375, -3701.25390625) + mix_012.location = (-1880.0931396484375, -3701.63232421875) + cloth_secondary_detail_diffuse_blend.location = (20.0, -308.04248046875) + armor_secondary_dye_color.location = (20.0, -40.0) + suit_primary_detail_diffuse_map.location = (20.0, -180.127197265625) + reroute_132.location = (-377.1822509765625, -2013.0452880859375) + worn_cloth_secondary_detail_normal_blend.location = (20.0, -212.32568359375) + reroute_027.location = (-377.1822509765625, -2521.78955078125) + reroute_154.location = (-377.1822509765625, -3887.38623046875) + combine_xyz_020.location = (-1881.3702392578125, -3700.15380859375) + reroute_099.location = (-377.1822509765625, 845.1400146484375) + mix_074.location = (-1880.0889892578125, -3702.98974609375) + armor_primary_roughness_remap_x.location = (0.0, 327.80126953125) + armor_secondary_metalness.location = (20.0, -423.98968505859375) + reroute_179.location = (-377.1822509765625, -1215.3074951171875) + cloth_detail_normal_transform.location = (-913.1685180664062, -1245.697509765625) + reroute_106.location = (-377.1822509765625, 622.0794677734375) + reroute_134.location = (-377.1822509765625, -1916.9410400390625) + mix_013.location = (-1880.0931396484375, -3701.66259765625) + armor_primary_roughness_remap_w.location = (0.0, 231.2049560546875) + cloth_secondary_roughness_remap_x.location = (20.0, -52.263916015625) + reroute_178.location = (-377.1822509765625, 143.9346923828125) + armor_secondary_wear_remap_z.location = (20.0, -264.27203369140625) + mix_069.location = (-1882.6395263671875, -3698.79736328125) + cloth_primary_roughness_remap_x.location = (20.0, -32.303955078125) + reroute_114.location = (-377.1822509765625, -3667.18017578125) + armor_primary_dye_color.location = (0.0, 360.0) + reroute_019.location = (-939.7109985351562, 637.9833984375) + mix_054.location = (-1880.0882568359375, -3707.41943359375) + worn_suit_primary_detail_normal_blend.location = (20.43377685546875, -231.458251953125) + mix_007.location = (-1880.0882568359375, -3701.43408203125) + suit_secondary_metalness.location = (40.0, -423.568359375) + reroute_058.location = (-377.1822509765625, -1698.3143310546875) + worn_armor_primary_roughness_remap_z.location = (0.0, -136.16294860839844) + reroute_110.location = (-377.1822509765625, 493.2843017578125) + suit_primary_wear_remap_w.location = (20.0, -307.6220703125) + worn_armor_primary_roughness_remap_w.location = (0.0, -168.3617401123047) + reroute_120.location = (-377.1822509765625, -585.2867431640625) + reroute_091.location = (-377.1822509765625, -3444.64453125) + cloth_secondary_emission_color.location = (20.0, -532.13330078125) + reroute_185.location = (-377.1822509765625, -902.113525390625) + mix_031.location = (-1880.0882568359375, -3702.27197265625) + reroute_189.location = (-377.1822509765625, -1190.625732421875) + reroute_128.location = (-377.1822509765625, -777.0906982421875) + reroute_111.location = (-377.1822509765625, -3570.987548828125) + reroute_084.location = (-377.1822509765625, 51.98681640625) + combine_xyz_048.location = (-1880.6287841796875, -3699.41357421875) + armor_primary_wear_remap_x.location = (0.888427734375, 166.59326171875) + combine_xyz_033.location = (-1882.5701904296875, -3701.53369140625) + reroute_079.location = (-377.1822509765625, -332.0384521484375) + suit_secondary_roughness_remap_y.location = (40.0, -103.96435546875) + reroute_113.location = (-377.1822509765625, -3634.271728515625) + armor_primary_roughness_remap_y.location = (0.0, 295.60247802734375) + combine_xyz_029.location = (-1881.3702392578125, -3706.23388671875) + worn_armor_primary_detail_diffuse_blend.location = (0.0, -199.70541381835938) + reroute_103.location = (-377.1822509765625, 653.4114990234375) + reroute_005.location = (-377.1822509765625, -2868.5810546875) + mix_015.location = (-1880.0931396484375, -3701.72900390625) + reroute_145.location = (-377.1822509765625, -2333.4736328125) + reroute_183.location = (-377.1822509765625, -998.50390625) + suit_primary_detail_normal_map.location = (20.0, -339.820556640625) + cloth_primary_detail_normal_map.location = (20.0, -320.298095703125) + mix_045.location = (-1880.0882568359375, -3704.26220703125) + mix_029.location = (-1880.0921630859375, -3702.20654296875) + node.location = (-1880.0958251953125, -3703.15576171875) + reroute_065.location = (-377.1822509765625, -2681.93701171875) + cloth_primary_roughness_remap_y.location = (20.0, -64.001220703125) + mix_070.location = (-1882.4595947265625, -3698.79736328125) + attribute.location = (-1880.6160888671875, -3699.580078125) + mix_053.location = (-1880.0882568359375, -3707.3896484375) + combine_xyz_006.location = (-1882.1102294921875, -3703.97412109375) + suit_secondary_wear_remap_y.location = (40.0, -232.02197265625) + combine_xyz_025.location = (-1881.3702392578125, -3704.99365234375) + reroute_097.location = (-377.1822509765625, 902.1060791015625) + worn_armor_primary_detail_roughness_blend.location = (0.0, -264.2435302734375) + reroute_117.location = (-377.1822509765625, -3698.0625) + reroute_125.location = (-377.1822509765625, -809.1253662109375) + mix_058.location = (-1880.0870361328125, -3705.93701171875) + reroute_073.location = (-377.1822509765625, -364.9344482421875) + suit_primary_metalness.location = (20.0, -468.18212890625) + cloth_secondary_wear_remap_w.location = (20.0, -275.798828125) + cloth_secondary_iridescence.location = (20.0, -435.537109375) + reroute_139.location = (-377.1822509765625, -2301.27490234375) + armor_secondary_roughness_remap_y.location = (20.0, -104.39756774902344) + reroute_175.location = (-377.1822509765625, 240.9642333984375) + suit_secondary_roughness_remap_x.location = (40.0, -71.33203125) + combine_xyz_041.location = (-1883.1702880859375, -3705.43408203125) + mix_044.location = (-1880.0882568359375, -3703.49658203125) + cloth_secondary_roughness_remap_w.location = (20.0, -147.92822265625) + group_output.location = (-1632.9449462890625, -3703.83984375) + armor_primary_roughness_remap_z.location = (0.0, 262.97027587890625) + combine_xyz_027.location = (-1881.3702392578125, -3706.35400390625) + reroute_188.location = (-377.1822509765625, -1158.3216552734375) + reroute_122.location = (-377.1822509765625, -649.3729248046875) + reroute_002.location = (-377.1822509765625, -2900.77978515625) + worn_suit_secondary_roughness_remap_x.location = (40.0, -71.76513671875) + suit_primary_detail_diffuse_blend.location = (20.0, -372.01953125) + cloth_primary_roughness_remap_z.location = (20.0, -96.390380859375) + combine_xyz_019.location = (-1881.3702392578125, -3703.73388671875) + armor_secondary_fuzz.location = (20.0, -488.38714599609375) + reroute_069.location = (-377.1822509765625, -4682.27490234375) + reroute_030.location = (-939.7109985351562, -3029.08984375) + reroute_116.location = (-377.1822509765625, -3794.76171875) + combine_xyz_046.location = (-1883.5101318359375, -3705.85400390625) + reroute_194.location = (-377.1822509765625, -1055.48974609375) + worn_armor_secondary_roughness_remap_y.location = (-1580.0, 335.30712890625) + cloth_primary_dye_color.location = (20.0, 0.0) + mix_071.location = (-1880.2335205078125, -3699.36474609375) + reroute_197.location = (-377.1822509765625, -1478.7059326171875) + armor_primary_detail_diffuse_blend.location = (0.0, 7.17987060546875) + combine_xyz_002.location = (-1882.1102294921875, -3701.37353515625) + suit_secondary_iridescence.location = (40.0, -455.76708984375) + reroute_161.location = (-377.1822509765625, -4207.7626953125) + armor_primary_wear_remap_y.location = (0.888427734375, 134.827880859375) + reroute_155.location = (-377.1822509765625, -4046.8583984375) + reroute_193.location = (-377.1822509765625, -1318.6666259765625) + mix_033.location = (-1880.0882568359375, -3702.33154296875) + reroute_080.location = (-377.1822509765625, -204.57470703125) + suit_secondary_detail_diffuse_blend.location = (40.0, -327.4052734375) + combine_xyz_042.location = (-1883.1702880859375, -3706.673828125) + math_018.location = (-1882.6395263671875, -3699.15771484375) + combine_xyz_018.location = (-1881.3702392578125, -3703.61376953125) + reroute_166.location = (-377.1822509765625, -4335.44482421875) + reroute_070.location = (-377.1822509765625, -4714.06103515625) + worn_suit_primary_roughness_remap_y.location = (20.0, -103.9638671875) + combine_xyz_008.location = (-1882.1102294921875, -3705.09375) + worn_armor_primary_metalness.location = (0.0, -295.80975341796875) + reroute_029.location = (-717.01171875, -2974.341796875) + reroute_119.location = (-377.1822509765625, -3763.373046875) + reroute_024.location = (-939.7109985351562, -1063.120361328125) + worn_cloth_secondary_roughness_remap_x.location = (20.0, -52.632080078125) + mix_050.location = (-1880.0882568359375, -3707.29931640625) + suit_primary_emission_color.location = (20.0, -596.1103515625) + cloth_primary_metalness.location = (20.0, -447.7913818359375) + worn_cloth_primary_detail_diffuse_blend.location = (20.0, -100.111328125) + mix_068.location = (-1882.2794189453125, -3698.79736328125) + mix_026.location = (-1880.0921630859375, -3702.11669921875) + combine_xyz.location = (-1882.1102294921875, -3700.13427734375) + armor_primary_metalness.location = (0.0, -88.5496826171875) + combine_xyz_021.location = (-1881.3702392578125, -3701.39404296875) + suit_secondary_fuzz.location = (40.0, -487.9658203125) + mix_003.location = (-1880.0882568359375, -3701.28369140625) + reroute_176.location = (-377.1822509765625, 208.3321533203125) + reroute_156.location = (-377.1822509765625, -4079.361328125) + cloth_primary_roughness_remap_w.location = (20.0, -128.1763916015625) + reroute_098.location = (-377.1822509765625, 876.9053955078125) + reroute_136.location = (-377.1822509765625, -2108.90478515625) + mix_040.location = (-1880.0882568359375, -3703.37646484375) + reroute_186.location = (-377.1822509765625, -1094.3057861328125) + cloth_primary_detail_diffuse_blend.location = (20.0, -352.631591796875) + cloth_primary_detail_diffuse_map.location = (20.0, -160.4803466796875) + combine_xyz_044.location = (-1883.5101318359375, -3703.37353515625) + math.location = (-1880.5616455078125, -3700.95263671875) + armor_primary_detail_normal_map.location = (0.0, 38.5118408203125) + worn_suit_primary_roughness_remap_x.location = (20.0, -72.19873046875) + combine_xyz_009.location = (-1882.1102294921875, -3705.2138671875) + reroute_170.location = (-377.1822509765625, 303.8829345703125) + worn_cloth_secondary_roughness_remap_z.location = (20.0, -116.59619140625) + reroute_017.location = (-717.01171875, 749.876953125) + reroute_118.location = (-377.1822509765625, -3729.451416015625) + mix_057.location = (-1880.0870361328125, -3705.9072265625) + mix_004.location = (-1880.0894775390625, -3701.31396484375) + mix_051.location = (-1880.0882568359375, -3707.32958984375) + suit_primary_transmission.location = (20.0, -563.91162109375) + reroute_147.location = (-377.1822509765625, -2397.00390625) + armor_secondary_emission_color.location = (20.0, -552.3511352539062) + reroute_151.location = (-377.1822509765625, -3919.4208984375) + combine_xyz_030.location = (-1882.5701904296875, -3700.2939453125) + combine_xyz_007.location = (-1882.1102294921875, -3703.85400390625) + suit_secondary_transmission.location = (40.0, -520.16455078125) + mix_017.location = (-1880.0931396484375, -3701.78857421875) + armor_primary_detail_diffuse_map.location = (0.0, 199.07232666015625) + reroute_015.location = (-717.01171875, 910.6163330078125) + reroute_104.location = (-377.1822509765625, 916.9053955078125) + reroute_048.location = (-377.1822509765625, -3220.167236328125) + mix_020.location = (-1880.0921630859375, -3701.93212890625) + reroute_078.location = (-377.1822509765625, -236.3106689453125) + mix_055.location = (-1880.0870361328125, -3705.84716796875) + armor_secondary_roughness_remap_x.location = (20.0, -72.19877624511719) + cloth_primary_iridescence.location = (20.0, -480.294677734375) + reroute_059.location = (-377.1822509765625, -1634.8016357421875) + cloth_primary_wear_remap_x.location = (20.0, -192.1922607421875) + mix_021.location = (-1880.0921630859375, -3701.9619140625) + reroute_022.location = (-717.01171875, -1280.1597900390625) + mix_019.location = (-1880.0931396484375, -3701.8486328125) + combine_xyz_039.location = (-1883.1702880859375, -3702.95361328125) + worn_armor_secondary_roughness_remap_x.location = (-1580.0, 367.6961669921875) + mix_073.location = (-1880.0904541015625, -3702.95849609375) + worn_suit_primary_dye_color.location = (20.0, -40.0) + combine_xyz_024.location = (-1881.3702392578125, -3704.87353515625) + reroute_172.location = (-377.1822509765625, 369.0975341796875) + armor_detail_diffuse_transform.location = (-913.1685180664062, 998.9544067382812) + reroute.location = (-377.1822509765625, -2932.545166015625) + reroute_105.location = (-377.1822509765625, 758.5118408203125) + mix_052.location = (-1880.0882568359375, -3707.35986328125) + cloth_secondary_wear_remap_x.location = (20.0, -180.069580078125) + armor_secondary_wear_remap_y.location = (20.0, -231.63986206054688) + worn_cloth_primary_detail_roughness_blend.location = (20.0, -164.687744140625) + math_021.location = (-1882.6395263671875, -3699.517578125) + math_004.location = (-1880.5616455078125, -3701.03271484375) + combine_xyz_031.location = (-1883.1702880859375, -3700.47412109375) + combine_xyz_023.location = (-1881.3702392578125, -3703.85400390625) + armor_secondary_iridescence.location = (20.0, -456.1883544921875) + reroute_047.location = (-377.1822509765625, -4746.94189453125) + cloth_primary_detail_roughness_blend.location = (20.0, -416.552978515625) + combine_xyz_004.location = (-1882.1102294921875, -3702.73388671875) + reroute_159.location = (-377.1822509765625, -4271.36376953125) + worn_armor_primary_dye_color.location = (0.0, -40.0) + reroute_173.location = (-377.1822509765625, 272.6444091796875) + reroute_052.location = (-377.1822509765625, -3181.467529296875) + suit_detail_normal_transform.location = (-913.1685180664062, -3211.6669921875) + mix_008.location = (-1880.0882568359375, -3701.4638671875) + suit_primary_roughness_remap_y.location = (20.0, -83.9638671875) + mix_042.location = (-1880.0882568359375, -3703.43603515625) + combine_xyz_026.location = (-1881.3702392578125, -3705.11376953125) + reroute_123.location = (-377.1822509765625, -681.7620849609375) + reroute_148.location = (-377.1822509765625, -2429.20263671875) + worn_armor_secondary_detail_roughness_blend.location = (-1580.0, 175.2264404296875) + reroute_066.location = (-377.1822509765625, -2713.26904296875) + cloth_primary_wear_remap_y.location = (20.0, -224.4962158203125) + combine_xyz_034.location = (-1882.5701904296875, -3702.77392578125) + reroute_064.location = (-377.1822509765625, -1762.3587646484375) + armor_primary_wear_remap_z.location = (0.888427734375, 103.49591064453125) + suit_secondary_emission_color.location = (40.0, -551.49658203125) + reroute_028.location = (-377.1822509765625, -4490.12353515625) + reroute_092.location = (-377.1822509765625, 781.6092529296875) + reroute_009.location = (-377.1822509765625, -2649.73828125) + reroute_067.location = (-377.1822509765625, -2745.034423828125) + reroute_150.location = (-377.1822509765625, -3983.490234375) + reroute_083.location = (-377.1822509765625, -108.25487518310547) + mix_041.location = (-1880.0882568359375, -3703.40576171875) + mix_010.location = (-1880.0931396484375, -3701.57275390625) + suit_primary_fuzz.location = (20.0, -532.146240234375) + mix_032.location = (-1880.0882568359375, -3702.3017578125) + worn_cloth_primary_detail_normal_blend.location = (20.0, -132.66552734375) + reroute_045.location = (-377.1822509765625, -2777.66650390625) + mix_072.location = (-1881.4156494140625, -3699.21630859375) + armor_secondary_wear_remap_w.location = (20.0, -296.4707946777344) + worn_armor_secondary_dye_color.location = (-1580.0, 400.0) + combine_xyz_035.location = (-1882.5902099609375, -3704.01416015625) + math_013.location = (-1881.9395751953125, -3699.11767578125) + combine_xyz_001.location = (-1882.1102294921875, -3700.25390625) + suit_secondary_dye_color.location = (40.0, -40.0) + armor_primary_detail_normal_blend.location = (0.0, -25.0189208984375) + cloth_secondary_wear_remap_y.location = (20.0, -211.8349609375) + combine_xyz_045.location = (-1883.5101318359375, -3704.61376953125) + reroute_167.location = (-377.1822509765625, -4367.2099609375) + combine_xyz_011.location = (-1882.1102294921875, -3706.45361328125) + reroute_149.location = (-377.1822509765625, -4015.056640625) + detail_uvs.location = (-1107.0074462890625, 919.2714233398438) + reroute_121.location = (-377.1822509765625, -616.9840087890625) + reroute_044.location = (-377.1822509765625, -3156.203125) + mix_018.location = (-1880.0931396484375, -3701.81884765625) + worn_cloth_secondary_dye_color.location = (20.0, -20.0) + reroute_087.location = (-377.1822509765625, -44.92504119873047) + mix_043.location = (-1880.0882568359375, -3703.46630859375) + worn_cloth_primary_metalness.location = (20.0, -196.7099609375) + armor_secondary_roughness_remap_z.location = (20.0, -136.16293334960938) + cloth_primary_wear_remap_z.location = (20.0, -256.2081298828125) + reroute_008.location = (-377.1822509765625, -2617.10595703125) + combine_xyz_032.location = (-1883.5101318359375, -3700.89404296875) + combine_xyz_028.location = (-1881.3702392578125, -3706.11376953125) + math_023.location = (-1881.0887451171875, -3699.49365234375) + mix_016.location = (-1880.0931396484375, -3701.75830078125) + worn_suit_secondary_metalness.location = (40.0, -296.2900390625) + mix_014.location = (-1880.0931396484375, -3701.69287109375) + reroute_100.location = (-377.1822509765625, 813.8079833984375) + reroute_060.location = (-377.1822509765625, -1602.2474365234375) + worn_suit_secondary_detail_roughness_blend.location = (40.0, -264.09130859375) + combine_xyz_040.location = (-1883.1702880859375, -3704.19384765625) + reroute_001.location = (-377.1822509765625, -2996.50927734375) + reroute_090.location = (-377.1822509765625, -460.662109375) + mix_025.location = (-1880.0921630859375, -3702.08642578125) + reroute_124.location = (-377.1822509765625, -552.2911376953125) + cloth_secondary_dye_color.location = (20.0, -20.0) + worn_cloth_primary_roughness_remap_w.location = (20.0, -68.620849609375) + combine_xyz_010.location = (-1882.1102294921875, -3706.333984375) + worn_armor_primary_detail_normal_blend.location = (0.0, -231.7401885986328) + suit_secondary_detail_normal_blend.location = (40.0, -360.03759765625) + combine_xyz_015.location = (-1881.3702392578125, -3701.27392578125) + worn_suit_secondary_roughness_remap_y.location = (40.0, -103.96435546875) + reroute_012.location = (-377.1822509765625, -4586.443359375) + reroute_013.location = (-377.1822509765625, -4618.703125) + armor_primary_iridescence.location = (0.0, -121.181884765625) + reroute_089.location = (-377.1822509765625, 19.682861328125) + combine_xyz_012.location = (-1881.3702392578125, -3699.91357421875) + reroute_062.location = (-377.1822509765625, -1826.4031982421875) + reroute_101.location = (-377.1822509765625, 717.8089599609375) + reroute_043.location = (-377.1822509765625, -3124.437744140625) + reroute_086.location = (-377.1822509765625, -76.63695526123047) + reroute_031.location = (-939.7109985351562, -3300.8203125) + mix_030.location = (-1880.0882568359375, -3702.24169921875) + reroute_050.location = (-377.1822509765625, -3284.470947265625) + suit_primary_wear_remap_x.location = (20.0, -211.892578125) + armor_secondary_roughness_remap_w.location = (20.0, -168.3616943359375) + combine_xyz_037.location = (-1882.6102294921875, -3706.49365234375) + cloth_primary_wear_remap_w.location = (20.0, -288.5120849609375) + reroute_007.location = (-377.1822509765625, -2585.774169921875) + combine_xyz_005.location = (-1882.1102294921875, -3702.61376953125) + reroute_112.location = (-377.1822509765625, -3602.8828125) + reroute_006.location = (-377.1822509765625, -2553.5751953125) + armor_primary_detail_roughness_blend.location = (0.0, -57.21771240234375) + reroute_010.location = (-377.1822509765625, -4554.1396484375) + reroute_184.location = (-377.1822509765625, -1070.7535400390625) + suit_secondary_wear_remap_z.location = (40.0, -264.220703125) + separate_xyz_001.location = (-1880.8416748046875, -3700.99267578125) + reroute_093.location = (-377.1822509765625, 940.8695068359375) + reroute_061.location = (-377.1822509765625, -1570.7572021484375) + worn_armor_secondary_detail_normal_blend.location = (-1580.0, 207.62841796875) + reroute_051.location = (-377.1822509765625, -3021.773681640625) + mix_034.location = (-1880.0882568359375, -3702.36181640625) + math_022.location = (-1880.9088134765625, -3699.33349609375) + reroute_072.location = (-377.1822509765625, -396.0543212890625) + worn_suit_primary_metalness.location = (20.0, -295.85546875) + cloth_primary_transmission.location = (20.0, -544.3935546875) + suit_primary_dye_color.location = (20.0, -20.0) + mix_076.location = (-1880.0943603515625, -3703.18701171875) + mix_067.location = (-1881.6595458984375, -3698.87744140625) + worn_cloth_secondary_roughness_remap_w.location = (20.0, -148.361572265625) + combine_xyz_013.location = (-1881.3702392578125, -3700.03369140625) + reroute_011.location = (-377.1822509765625, -4522.427734375) + combine_xyz_014.location = (-1881.3702392578125, -3701.15380859375) + worn_suit_primary_roughness_remap_w.location = (20.0, -167.927734375) + worn_suit_secondary_roughness_remap_z.location = (40.0, -136.1630859375) + reroute_165.location = (-377.1822509765625, -4302.9296875) + combine_xyz_047.location = (-1883.5101318359375, -3707.09375) + reroute_108.location = (-377.1822509765625, 557.2484130859375) + reroute_042.location = (-377.1822509765625, -3092.67236328125) + mix_024.location = (-1880.0921630859375, -3702.05224609375) + reroute_046.location = (-377.1822509765625, -3316.505615234375) + reroute_180.location = (-377.1822509765625, -966.11474609375) + suit_primary_wear_remap_y.location = (20.0, -244.09130859375) + mix_001.location = (-1880.0882568359375, -3701.22412109375) + mix_009.location = (-1880.0882568359375, -3701.49365234375) + mix_046.location = (-1880.0882568359375, -3704.29248046875) + armor_secondary_wear_remap_x.location = (20.0, -200.30789184570312) + worn_armor_secondary_detail_diffuse_blend.location = (-1580.0, 239.5238037109375) + math_005.location = (-1882.6995849609375, -3698.37744140625) + reroute_088.location = (-377.1822509765625, -12.029052734375) + combine_xyz_022.location = (-1881.3702392578125, -3702.63427734375) + + worn_suit_secondary_detail_diffuse_blend.width, worn_suit_secondary_detail_diffuse_blend.height = 140.0, 100.0 + suit_detail_diffuse_transform.width, suit_detail_diffuse_transform.height = 175.1947021484375, 100.0 + suit_primary_roughness_remap_w.width, suit_primary_roughness_remap_w.height = 156.03314208984375, 100.0 + armor_secondary_detail_roughness_blend.width, armor_secondary_detail_roughness_blend.height = 140.0, 100.0 + worn_suit_primary_roughness_remap_z.width, worn_suit_primary_roughness_remap_z.height = 156.03317260742188, 100.0 + suit_primary_wear_remap_z.width, suit_primary_wear_remap_z.height = 156.03314208984375, 100.0 + worn_armor_secondary_roughness_remap_w.width, worn_armor_secondary_roughness_remap_w.height = 156.46646118164062, 100.0 + worn_cloth_primary_dye_color.width, worn_cloth_primary_dye_color.height = 140.0, 100.0 + worn_suit_secondary_roughness_remap_w.width, worn_suit_secondary_roughness_remap_w.height = 156.46649169921875, 100.0 + suit_primary_iridescence.width, suit_primary_iridescence.height = 140.0, 100.0 + cloth_primary_fuzz.width, cloth_primary_fuzz.height = 140.0, 100.0 + armor_primary_wear_remap_w.width, armor_primary_wear_remap_w.height = 155.1663818359375, 100.0 + worn_armor_secondary_roughness_remap_z.width, worn_armor_secondary_roughness_remap_z.height = 156.03314208984375, 100.0 + armor_secondary_transmission.width, armor_secondary_transmission.height = 140.0, 100.0 + cloth_secondary_fuzz.width, cloth_secondary_fuzz.height = 140.0, 100.0 + armor_detail_normal_transform.width, armor_detail_normal_transform.height = 176.44476318359375, 100.0 + cloth_secondary_metalness.width, cloth_secondary_metalness.height = 140.0, 100.0 + worn_armor_secondary_metalness.width, worn_armor_secondary_metalness.height = 140.0, 100.0 + suit_secondary_detail_roughness_blend.width, suit_secondary_detail_roughness_blend.height = 140.0, 100.0 + cloth_secondary_wear_remap_z.width, cloth_secondary_wear_remap_z.height = 155.92791748046875, 100.0 + armor_primary_fuzz.width, armor_primary_fuzz.height = 140.0, 100.0 + worn_armor_primary_roughness_remap_x.width, worn_armor_primary_roughness_remap_x.height = 155.01483154296875, 100.0 + cloth_secondary_roughness_remap_z.width, cloth_secondary_roughness_remap_z.height = 156.39630126953125, 100.0 + worn_cloth_primary_roughness_remap_x.width, worn_cloth_primary_roughness_remap_x.height = 156.39630126953125, 100.0 + suit_primary_roughness_remap_z.width, suit_primary_roughness_remap_z.height = 156.03314208984375, 100.0 + worn_cloth_secondary_metalness.width, worn_cloth_secondary_metalness.height = 140.0, 100.0 + suit_secondary_roughness_remap_w.width, suit_secondary_roughness_remap_w.height = 155.599853515625, 100.0 + cloth_secondary_detail_roughness_blend.width, cloth_secondary_detail_roughness_blend.height = 140.0, 100.0 + armor_secondary_detail_normal_blend.width, armor_secondary_detail_normal_blend.height = 140.0, 100.0 + worn_cloth_primary_roughness_remap_z.width, worn_cloth_primary_roughness_remap_z.height = 156.86474609375, 100.0 + worn_cloth_secondary_detail_diffuse_blend.width, worn_cloth_secondary_detail_diffuse_blend.height = 140.0, 100.0 + worn_suit_primary_detail_diffuse_blend.width, worn_suit_primary_detail_diffuse_blend.height = 140.0, 100.0 + suit_secondary_wear_remap_x.width, suit_secondary_wear_remap_x.height = 156.46649169921875, 100.0 + armor_primary_transmission.width, armor_primary_transmission.height = 140.0, 100.0 + worn_armor_primary_roughness_remap_y.width, worn_armor_primary_roughness_remap_y.height = 155.46978759765625, 100.0 + cloth_secondary_roughness_remap_y.width, cloth_secondary_roughness_remap_y.height = 155.92782592773438, 100.0 + cloth_secondary_transmission.width, cloth_secondary_transmission.height = 140.0, 100.0 + cloth_primary_detail_normal_blend.width, cloth_primary_detail_normal_blend.height = 140.0, 100.0 + armor_secondary_detail_diffuse_blend.width, armor_secondary_detail_diffuse_blend.height = 140.0, 100.0 + worn_cloth_secondary_detail_roughness_blend.width, worn_cloth_secondary_detail_roughness_blend.height = 140.0, 100.0 + armor_primary_emission_color.width, armor_primary_emission_color.height = 140.0, 100.0 + suit_secondary_roughness_remap_z.width, suit_secondary_roughness_remap_z.height = 156.89984130859375, 100.0 + suit_primary_detail_normal_blend.width, suit_primary_detail_normal_blend.height = 140.0, 100.0 + worn_suit_secondary_dye_color.width, worn_suit_secondary_dye_color.height = 140.0, 100.0 + suit_primary_detail_roughness_blend.width, suit_primary_detail_roughness_blend.height = 140.0, 100.0 + cloth_secondary_detail_normal_blend.width, cloth_secondary_detail_normal_blend.height = 140.0, 100.0 + cloth_detail_diffuse_transform.width, cloth_detail_diffuse_transform.height = 175.1947021484375, 100.0 + suit_primary_roughness_remap_x.width, suit_primary_roughness_remap_x.height = 156.206298828125, 100.0 + cloth_primary_emission_color.width, cloth_primary_emission_color.height = 140.0, 100.0 + worn_cloth_primary_roughness_remap_y.width, worn_cloth_primary_roughness_remap_y.height = 156.86471557617188, 100.0 + worn_suit_primary_detail_roughness_blend.width, worn_suit_primary_detail_roughness_blend.height = 140.0, 100.0 + suit_secondary_wear_remap_w.width, suit_secondary_wear_remap_w.height = 156.8997802734375, 100.0 + worn_suit_secondary_detail_normal_blend.width, worn_suit_secondary_detail_normal_blend.height = 140.0, 100.0 + worn_cloth_secondary_roughness_remap_y.width, worn_cloth_secondary_roughness_remap_y.height = 156.46652221679688, 100.0 + cloth_secondary_detail_diffuse_blend.width, cloth_secondary_detail_diffuse_blend.height = 140.0, 100.0 + armor_secondary_dye_color.width, armor_secondary_dye_color.height = 140.0, 100.0 + suit_primary_detail_diffuse_map.width, suit_primary_detail_diffuse_map.height = 240.0, 100.0 + worn_cloth_secondary_detail_normal_blend.width, worn_cloth_secondary_detail_normal_blend.height = 140.0, 100.0 + armor_primary_roughness_remap_x.width, armor_primary_roughness_remap_x.height = 155.72564697265625, 100.0 + armor_secondary_metalness.width, armor_secondary_metalness.height = 140.0, 100.0 + cloth_detail_normal_transform.width, cloth_detail_normal_transform.height = 176.44476318359375, 100.0 + armor_primary_roughness_remap_w.width, armor_primary_roughness_remap_w.height = 156.45462036132812, 100.0 + cloth_secondary_roughness_remap_x.width, cloth_secondary_roughness_remap_x.height = 156.86474609375, 100.0 + armor_secondary_wear_remap_z.width, armor_secondary_wear_remap_z.height = 156.03314208984375, 100.0 + cloth_primary_roughness_remap_x.width, cloth_primary_roughness_remap_x.height = 155.92779541015625, 100.0 + armor_primary_dye_color.width, armor_primary_dye_color.height = 140.0, 100.0 + worn_suit_primary_detail_normal_blend.width, worn_suit_primary_detail_normal_blend.height = 140.0, 100.0 + suit_secondary_metalness.width, suit_secondary_metalness.height = 140.0, 100.0 + worn_armor_primary_roughness_remap_z.width, worn_armor_primary_roughness_remap_z.height = 155.92486572265625, 100.0 + suit_primary_wear_remap_w.width, suit_primary_wear_remap_w.height = 155.59979248046875, 100.0 + worn_armor_primary_roughness_remap_w.width, worn_armor_primary_roughness_remap_w.height = 156.83477783203125, 100.0 + cloth_secondary_emission_color.width, cloth_secondary_emission_color.height = 140.0, 100.0 + armor_primary_wear_remap_x.width, armor_primary_wear_remap_x.height = 154.7330322265625, 100.0 + suit_secondary_roughness_remap_y.width, suit_secondary_roughness_remap_y.height = 156.89984130859375, 100.0 + armor_primary_roughness_remap_y.width, armor_primary_roughness_remap_y.height = 156.39605712890625, 100.0 + worn_armor_primary_detail_diffuse_blend.width, worn_armor_primary_detail_diffuse_blend.height = 140.0, 100.0 + suit_primary_detail_normal_map.width, suit_primary_detail_normal_map.height = 240.0, 100.0 + cloth_primary_detail_normal_map.width, cloth_primary_detail_normal_map.height = 240.0, 100.0 + node.width, node.height = 140.0, 100.0 + cloth_primary_roughness_remap_y.width, cloth_primary_roughness_remap_y.height = 156.39620971679688, 100.0 + suit_secondary_wear_remap_y.width, suit_secondary_wear_remap_y.height = 156.46649169921875, 100.0 + worn_armor_primary_detail_roughness_blend.width, worn_armor_primary_detail_roughness_blend.height = 140.0, 100.0 + suit_primary_metalness.width, suit_primary_metalness.height = 140.0, 100.0 + cloth_secondary_wear_remap_w.width, cloth_secondary_wear_remap_w.height = 156.39642333984375, 100.0 + cloth_secondary_iridescence.width, cloth_secondary_iridescence.height = 140.0, 100.0 + armor_secondary_roughness_remap_y.width, armor_secondary_roughness_remap_y.height = 155.599853515625, 100.0 + suit_secondary_roughness_remap_x.width, suit_secondary_roughness_remap_x.height = 156.46649169921875, 100.0 + cloth_secondary_roughness_remap_w.width, cloth_secondary_roughness_remap_w.height = 156.39627075195312, 100.0 + armor_primary_roughness_remap_z.width, armor_primary_roughness_remap_z.height = 156.48974609375, 100.0 + worn_suit_secondary_roughness_remap_x.width, worn_suit_secondary_roughness_remap_x.height = 156.466552734375, 100.0 + suit_primary_detail_diffuse_blend.width, suit_primary_detail_diffuse_blend.height = 140.0, 100.0 + cloth_primary_roughness_remap_z.width, cloth_primary_roughness_remap_z.height = 156.86474609375, 100.0 + armor_secondary_fuzz.width, armor_secondary_fuzz.height = 140.0, 100.0 + worn_armor_secondary_roughness_remap_y.width, worn_armor_secondary_roughness_remap_y.height = 155.599853515625, 100.0 + cloth_primary_dye_color.width, cloth_primary_dye_color.height = 140.0, 100.0 + armor_primary_detail_diffuse_blend.width, armor_primary_detail_diffuse_blend.height = 140.0, 100.0 + suit_secondary_iridescence.width, suit_secondary_iridescence.height = 140.0, 100.0 + armor_primary_wear_remap_y.width, armor_primary_wear_remap_y.height = 154.73309326171875, 100.0 + suit_secondary_detail_diffuse_blend.width, suit_secondary_detail_diffuse_blend.height = 140.0, 100.0 + worn_suit_primary_roughness_remap_y.width, worn_suit_primary_roughness_remap_y.height = 156.03314208984375, 100.0 + worn_armor_primary_metalness.width, worn_armor_primary_metalness.height = 140.0, 100.0 + worn_cloth_secondary_roughness_remap_x.width, worn_cloth_secondary_roughness_remap_x.height = 155.599853515625, 100.0 + suit_primary_emission_color.width, suit_primary_emission_color.height = 140.0, 100.0 + cloth_primary_metalness.width, cloth_primary_metalness.height = 140.0, 100.0 + worn_cloth_primary_detail_diffuse_blend.width, worn_cloth_primary_detail_diffuse_blend.height = 140.0, 100.0 + armor_primary_metalness.width, armor_primary_metalness.height = 140.0, 100.0 + suit_secondary_fuzz.width, suit_secondary_fuzz.height = 140.0, 100.0 + cloth_primary_roughness_remap_w.width, cloth_primary_roughness_remap_w.height = 155.45928955078125, 100.0 + cloth_primary_detail_diffuse_blend.width, cloth_primary_detail_diffuse_blend.height = 140.0, 100.0 + cloth_primary_detail_diffuse_map.width, cloth_primary_detail_diffuse_map.height = 240.0, 100.0 + armor_primary_detail_normal_map.width, armor_primary_detail_normal_map.height = 240.0, 100.0 + worn_suit_primary_roughness_remap_x.width, worn_suit_primary_roughness_remap_x.height = 156.03314208984375, 100.0 + worn_cloth_secondary_roughness_remap_z.width, worn_cloth_secondary_roughness_remap_z.height = 156.03317260742188, 100.0 + suit_primary_transmission.width, suit_primary_transmission.height = 140.0, 100.0 + armor_secondary_emission_color.width, armor_secondary_emission_color.height = 140.0, 100.0 + suit_secondary_transmission.width, suit_secondary_transmission.height = 140.0, 100.0 + armor_primary_detail_diffuse_map.width, armor_primary_detail_diffuse_map.height = 240.0, 100.0 + armor_secondary_roughness_remap_x.width, armor_secondary_roughness_remap_x.height = 156.03314208984375, 100.0 + cloth_primary_iridescence.width, cloth_primary_iridescence.height = 140.0, 100.0 + cloth_primary_wear_remap_x.width, cloth_primary_wear_remap_x.height = 156.4664306640625, 100.0 + worn_armor_secondary_roughness_remap_x.width, worn_armor_secondary_roughness_remap_x.height = 155.16650390625, 100.0 + worn_suit_primary_dye_color.width, worn_suit_primary_dye_color.height = 140.0, 100.0 + armor_detail_diffuse_transform.width, armor_detail_diffuse_transform.height = 175.1947021484375, 100.0 + cloth_secondary_wear_remap_x.width, cloth_secondary_wear_remap_x.height = 156.3963623046875, 100.0 + armor_secondary_wear_remap_y.width, armor_secondary_wear_remap_y.height = 156.03314208984375, 100.0 + worn_cloth_primary_detail_roughness_blend.width, worn_cloth_primary_detail_roughness_blend.height = 140.0, 100.0 + armor_secondary_iridescence.width, armor_secondary_iridescence.height = 140.0, 100.0 + cloth_primary_detail_roughness_blend.width, cloth_primary_detail_roughness_blend.height = 140.0, 100.0 + worn_armor_primary_dye_color.width, worn_armor_primary_dye_color.height = 140.0, 100.0 + suit_detail_normal_transform.width, suit_detail_normal_transform.height = 176.44476318359375, 100.0 + suit_primary_roughness_remap_y.width, suit_primary_roughness_remap_y.height = 156.4664306640625, 100.0 + worn_armor_secondary_detail_roughness_blend.width, worn_armor_secondary_detail_roughness_blend.height = 140.0, 100.0 + cloth_primary_wear_remap_y.width, cloth_primary_wear_remap_y.height = 155.59979248046875, 100.0 + armor_primary_wear_remap_z.width, armor_primary_wear_remap_z.height = 155.59967041015625, 100.0 + suit_secondary_emission_color.width, suit_secondary_emission_color.height = 140.0, 100.0 + suit_primary_fuzz.width, suit_primary_fuzz.height = 140.0, 100.0 + worn_cloth_primary_detail_normal_blend.width, worn_cloth_primary_detail_normal_blend.height = 140.0, 100.0 + armor_secondary_wear_remap_w.width, armor_secondary_wear_remap_w.height = 156.033203125, 100.0 + worn_armor_secondary_dye_color.width, worn_armor_secondary_dye_color.height = 140.0, 100.0 + suit_secondary_dye_color.width, suit_secondary_dye_color.height = 140.0, 100.0 + armor_primary_detail_normal_blend.width, armor_primary_detail_normal_blend.height = 140.0, 100.0 + cloth_secondary_wear_remap_y.width, cloth_secondary_wear_remap_y.height = 155.92794799804688, 100.0 + worn_cloth_secondary_dye_color.width, worn_cloth_secondary_dye_color.height = 140.0, 100.0 + worn_cloth_primary_metalness.width, worn_cloth_primary_metalness.height = 140.0, 100.0 + armor_secondary_roughness_remap_z.width, armor_secondary_roughness_remap_z.height = 156.8997802734375, 100.0 + cloth_primary_wear_remap_z.width, cloth_primary_wear_remap_z.height = 156.4664306640625, 100.0 + worn_suit_secondary_metalness.width, worn_suit_secondary_metalness.height = 140.0, 100.0 + worn_suit_secondary_detail_roughness_blend.width, worn_suit_secondary_detail_roughness_blend.height = 140.0, 100.0 + cloth_secondary_dye_color.width, cloth_secondary_dye_color.height = 140.0, 100.0 + worn_cloth_primary_roughness_remap_w.width, worn_cloth_primary_roughness_remap_w.height = 156.39630126953125, 100.0 + worn_armor_primary_detail_normal_blend.width, worn_armor_primary_detail_normal_blend.height = 140.0, 100.0 + suit_secondary_detail_normal_blend.width, suit_secondary_detail_normal_blend.height = 140.0, 100.0 + worn_suit_secondary_roughness_remap_y.width, worn_suit_secondary_roughness_remap_y.height = 156.46649169921875, 100.0 + armor_primary_iridescence.width, armor_primary_iridescence.height = 140.0, 100.0 + suit_primary_wear_remap_x.width, suit_primary_wear_remap_x.height = 156.46649169921875, 100.0 + armor_secondary_roughness_remap_w.width, armor_secondary_roughness_remap_w.height = 155.599853515625, 100.0 + cloth_primary_wear_remap_w.width, cloth_primary_wear_remap_w.height = 155.16650390625, 100.0 + armor_primary_detail_roughness_blend.width, armor_primary_detail_roughness_blend.height = 140.0, 100.0 + suit_secondary_wear_remap_z.width, suit_secondary_wear_remap_z.height = 156.46646118164062, 100.0 + worn_armor_secondary_detail_normal_blend.width, worn_armor_secondary_detail_normal_blend.height = 140.0, 100.0 + worn_suit_primary_metalness.width, worn_suit_primary_metalness.height = 140.0, 100.0 + cloth_primary_transmission.width, cloth_primary_transmission.height = 140.0, 100.0 + suit_primary_dye_color.width, suit_primary_dye_color.height = 140.0, 100.0 + worn_cloth_secondary_roughness_remap_w.width, worn_cloth_secondary_roughness_remap_w.height = 155.599853515625, 100.0 + worn_suit_primary_roughness_remap_w.width, worn_suit_primary_roughness_remap_w.height = 155.599853515625, 100.0 + worn_suit_secondary_roughness_remap_z.width, worn_suit_secondary_roughness_remap_z.height = 156.46649169921875, 100.0 + suit_primary_wear_remap_y.width, suit_primary_wear_remap_y.height = 155.599853515625, 100.0 + armor_secondary_wear_remap_x.width, armor_secondary_wear_remap_x.height = 156.46649169921875, 100.0 + worn_armor_secondary_detail_diffuse_blend.width, worn_armor_secondary_detail_diffuse_blend.height = 140.0, 100.0 + +# Activate Node Connection usage + link = Shader_Preset.links.new + Shader_Preset.links.new(mix.outputs[0], mix_001.inputs[1]) + Shader_Preset.links.new(mix_001.outputs[0], mix_002.inputs[1]) + Shader_Preset.links.new(mix_002.outputs[0], mix_003.inputs[1]) + Shader_Preset.links.new(mix_003.outputs[0], mix_004.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_001.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_002.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_003.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_004.inputs[0]) + Shader_Preset.links.new(mix_005.outputs[0], mix_006.inputs[1]) + Shader_Preset.links.new(mix_006.outputs[0], mix_007.inputs[1]) + Shader_Preset.links.new(mix_007.outputs[0], mix_008.inputs[1]) + Shader_Preset.links.new(mix_008.outputs[0], mix_009.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_005.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_006.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_007.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_008.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_009.inputs[0]) + Shader_Preset.links.new(mix_010.outputs[0], mix_011.inputs[1]) + Shader_Preset.links.new(mix_011.outputs[0], mix_012.inputs[1]) + Shader_Preset.links.new(mix_012.outputs[0], mix_013.inputs[1]) + Shader_Preset.links.new(mix_013.outputs[0], mix_014.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_010.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_011.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_012.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_013.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_014.inputs[0]) + Shader_Preset.links.new(mix_015.outputs[0], mix_016.inputs[1]) + Shader_Preset.links.new(mix_016.outputs[0], mix_017.inputs[1]) + Shader_Preset.links.new(mix_017.outputs[0], mix_018.inputs[1]) + Shader_Preset.links.new(mix_018.outputs[0], mix_019.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_015.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_016.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_017.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_018.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_019.inputs[0]) + Shader_Preset.links.new(mix_020.outputs[0], mix_021.inputs[1]) + Shader_Preset.links.new(mix_021.outputs[0], mix_022.inputs[1]) + Shader_Preset.links.new(mix_022.outputs[0], mix_023.inputs[1]) + Shader_Preset.links.new(mix_023.outputs[0], mix_024.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_020.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_021.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_022.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_023.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_024.inputs[0]) + Shader_Preset.links.new(mix_025.outputs[0], mix_026.inputs[1]) + Shader_Preset.links.new(mix_026.outputs[0], mix_027.inputs[1]) + Shader_Preset.links.new(mix_027.outputs[0], mix_028.inputs[1]) + Shader_Preset.links.new(mix_028.outputs[0], mix_029.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_025.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_026.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_027.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_028.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_029.inputs[0]) + Shader_Preset.links.new(mix_030.outputs[0], mix_031.inputs[1]) + Shader_Preset.links.new(mix_031.outputs[0], mix_032.inputs[1]) + Shader_Preset.links.new(mix_032.outputs[0], mix_033.inputs[1]) + Shader_Preset.links.new(mix_033.outputs[0], mix_034.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_030.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_031.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_032.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_033.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_034.inputs[0]) + Shader_Preset.links.new(mix_040.outputs[0], mix_041.inputs[1]) + Shader_Preset.links.new(mix_041.outputs[0], mix_042.inputs[1]) + Shader_Preset.links.new(mix_042.outputs[0], mix_043.inputs[1]) + Shader_Preset.links.new(mix_043.outputs[0], mix_044.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_040.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_041.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_042.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_043.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_044.inputs[0]) + Shader_Preset.links.new(mix_045.outputs[0], mix_046.inputs[1]) + Shader_Preset.links.new(mix_046.outputs[0], mix_047.inputs[1]) + Shader_Preset.links.new(mix_047.outputs[0], mix_048.inputs[1]) + Shader_Preset.links.new(mix_048.outputs[0], mix_049.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_045.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_046.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_047.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_048.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_049.inputs[0]) + Shader_Preset.links.new(mix_050.outputs[0], mix_051.inputs[1]) + Shader_Preset.links.new(mix_051.outputs[0], mix_052.inputs[1]) + Shader_Preset.links.new(mix_052.outputs[0], mix_053.inputs[1]) + Shader_Preset.links.new(mix_053.outputs[0], mix_054.inputs[1]) + Shader_Preset.links.new(math.outputs[0], mix_050.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_051.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_052.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_053.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_054.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_normal_map.outputs[0], reroute_105.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_normal_map.outputs[0], reroute_179.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_normal_map.outputs[0], reroute_052.inputs[0]) + Shader_Preset.links.new(armor_primary_wear_remap_x.outputs[0], reroute_098.inputs[0]) + Shader_Preset.links.new(armor_primary_wear_remap_y.outputs[0], reroute_099.inputs[0]) + Shader_Preset.links.new(armor_primary_wear_remap_z.outputs[0], reroute_100.inputs[0]) + Shader_Preset.links.new(armor_primary_wear_remap_w.outputs[0], reroute_092.inputs[0]) + Shader_Preset.links.new(armor_secondary_wear_remap_x.outputs[0], reroute_083.inputs[0]) + Shader_Preset.links.new(armor_secondary_wear_remap_y.outputs[0], reroute_082.inputs[0]) + Shader_Preset.links.new(armor_secondary_wear_remap_z.outputs[0], reroute_081.inputs[0]) + Shader_Preset.links.new(armor_secondary_wear_remap_w.outputs[0], reroute_080.inputs[0]) + Shader_Preset.links.new(cloth_primary_wear_remap_x.outputs[0], reroute_186.inputs[0]) + Shader_Preset.links.new(cloth_primary_wear_remap_y.outputs[0], reroute_187.inputs[0]) + Shader_Preset.links.new(cloth_primary_wear_remap_z.outputs[0], reroute_188.inputs[0]) + Shader_Preset.links.new(cloth_primary_wear_remap_w.outputs[0], reroute_189.inputs[0]) + Shader_Preset.links.new(cloth_secondary_wear_remap_x.outputs[0], reroute_135.inputs[0]) + Shader_Preset.links.new(cloth_secondary_wear_remap_y.outputs[0], reroute_136.inputs[0]) + Shader_Preset.links.new(cloth_secondary_wear_remap_z.outputs[0], reroute_137.inputs[0]) + Shader_Preset.links.new(cloth_secondary_wear_remap_w.outputs[0], reroute_138.inputs[0]) + Shader_Preset.links.new(suit_primary_wear_remap_x.outputs[0], reroute_041.inputs[0]) + Shader_Preset.links.new(suit_primary_wear_remap_y.outputs[0], reroute_042.inputs[0]) + Shader_Preset.links.new(suit_primary_wear_remap_z.outputs[0], reroute_043.inputs[0]) + Shader_Preset.links.new(suit_primary_wear_remap_w.outputs[0], reroute_044.inputs[0]) + Shader_Preset.links.new(suit_secondary_wear_remap_x.outputs[0], reroute_155.inputs[0]) + Shader_Preset.links.new(suit_secondary_wear_remap_y.outputs[0], reroute_156.inputs[0]) + Shader_Preset.links.new(suit_secondary_wear_remap_z.outputs[0], reroute_157.inputs[0]) + Shader_Preset.links.new(suit_secondary_wear_remap_w.outputs[0], reroute_158.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_diffuse_blend.outputs[0], reroute_101.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_normal_blend.outputs[0], reroute_102.inputs[0]) + Shader_Preset.links.new(armor_secondary_detail_diffuse_blend.outputs[0], reroute_078.inputs[0]) + Shader_Preset.links.new(armor_secondary_detail_normal_blend.outputs[0], reroute_077.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_diffuse_blend.outputs[0], reroute_191.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_normal_blend.outputs[0], reroute_192.inputs[0]) + Shader_Preset.links.new(cloth_secondary_detail_diffuse_blend.outputs[0], reroute_140.inputs[0]) + Shader_Preset.links.new(cloth_secondary_detail_normal_blend.outputs[0], reroute_141.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_diffuse_blend.outputs[0], reroute_048.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_normal_blend.outputs[0], reroute_049.inputs[0]) + Shader_Preset.links.new(suit_secondary_detail_diffuse_blend.outputs[0], reroute_160.inputs[0]) + Shader_Preset.links.new(suit_secondary_detail_normal_blend.outputs[0], reroute_161.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_roughness_blend.outputs[0], reroute_103.inputs[0]) + Shader_Preset.links.new(armor_secondary_detail_roughness_blend.outputs[0], reroute_076.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_roughness_blend.outputs[0], reroute_193.inputs[0]) + Shader_Preset.links.new(cloth_secondary_detail_roughness_blend.outputs[0], reroute_142.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_roughness_blend.outputs[0], reroute_050.inputs[0]) + Shader_Preset.links.new(suit_secondary_detail_roughness_blend.outputs[0], reroute_162.inputs[0]) + Shader_Preset.links.new(mix_055.outputs[0], mix_056.inputs[1]) + Shader_Preset.links.new(mix_056.outputs[0], mix_057.inputs[1]) + Shader_Preset.links.new(mix_057.outputs[0], mix_058.inputs[1]) + Shader_Preset.links.new(mix_058.outputs[0], mix_059.inputs[1]) + Shader_Preset.links.new(armor_primary_roughness_remap_x.outputs[0], reroute_096.inputs[0]) + Shader_Preset.links.new(armor_primary_roughness_remap_y.outputs[0], reroute_095.inputs[0]) + Shader_Preset.links.new(armor_primary_roughness_remap_z.outputs[0], reroute_094.inputs[0]) + Shader_Preset.links.new(armor_primary_roughness_remap_w.outputs[0], reroute_093.inputs[0]) + Shader_Preset.links.new(armor_secondary_roughness_remap_x.outputs[0], reroute_089.inputs[0]) + Shader_Preset.links.new(armor_secondary_roughness_remap_y.outputs[0], reroute_088.inputs[0]) + Shader_Preset.links.new(armor_secondary_roughness_remap_z.outputs[0], reroute_087.inputs[0]) + Shader_Preset.links.new(armor_secondary_roughness_remap_w.outputs[0], reroute_086.inputs[0]) + Shader_Preset.links.new(cloth_primary_roughness_remap_x.outputs[0], reroute_182.inputs[0]) + Shader_Preset.links.new(cloth_primary_roughness_remap_y.outputs[0], reroute_180.inputs[0]) + Shader_Preset.links.new(cloth_primary_roughness_remap_z.outputs[0], reroute_183.inputs[0]) + Shader_Preset.links.new(cloth_primary_roughness_remap_w.outputs[0], reroute_181.inputs[0]) + Shader_Preset.links.new(cloth_secondary_roughness_remap_x.outputs[0], reroute_131.inputs[0]) + Shader_Preset.links.new(cloth_secondary_roughness_remap_y.outputs[0], reroute_129.inputs[0]) + Shader_Preset.links.new(cloth_secondary_roughness_remap_z.outputs[0], reroute_132.inputs[0]) + Shader_Preset.links.new(cloth_secondary_roughness_remap_w.outputs[0], reroute_130.inputs[0]) + Shader_Preset.links.new(suit_primary_roughness_remap_x.outputs[0], reroute_002.inputs[0]) + Shader_Preset.links.new(suit_primary_roughness_remap_y.outputs[0], reroute.inputs[0]) + Shader_Preset.links.new(suit_primary_roughness_remap_z.outputs[0], reroute_003.inputs[0]) + Shader_Preset.links.new(suit_primary_roughness_remap_w.outputs[0], reroute_001.inputs[0]) + Shader_Preset.links.new(suit_secondary_roughness_remap_x.outputs[0], reroute_151.inputs[0]) + Shader_Preset.links.new(suit_secondary_roughness_remap_y.outputs[0], reroute_152.inputs[0]) + Shader_Preset.links.new(suit_secondary_roughness_remap_z.outputs[0], reroute_150.inputs[0]) + Shader_Preset.links.new(suit_secondary_roughness_remap_w.outputs[0], reroute_149.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_diffuse_map.outputs[0], reroute_104.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_diffuse_map.outputs[0], reroute_194.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_diffuse_map.outputs[0], reroute_051.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_roughness_remap_x.outputs[0], reroute_172.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_roughness_remap_y.outputs[0], reroute_171.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_roughness_remap_z.outputs[0], reroute_170.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_roughness_remap_w.outputs[0], reroute_173.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_roughness_remap_x.outputs[0], reroute_120.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_roughness_remap_y.outputs[0], reroute_121.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_roughness_remap_z.outputs[0], reroute_122.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_roughness_remap_w.outputs[0], reroute_123.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_roughness_remap_x.outputs[0], reroute_060.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_roughness_remap_y.outputs[0], reroute_059.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_roughness_remap_z.outputs[0], reroute_057.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_roughness_remap_w.outputs[0], reroute_058.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_roughness_remap_x.outputs[0], reroute_006.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_roughness_remap_y.outputs[0], reroute_007.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_roughness_remap_z.outputs[0], reroute_008.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_roughness_remap_w.outputs[0], reroute_009.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_roughness_remap_x.outputs[0], reroute_111.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_roughness_remap_y.outputs[0], reroute_112.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_roughness_remap_z.outputs[0], reroute_113.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_roughness_remap_w.outputs[0], reroute_114.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_roughness_remap_x.outputs[0], reroute_011.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_roughness_remap_y.outputs[0], reroute_010.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_roughness_remap_z.outputs[0], reroute_012.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_roughness_remap_w.outputs[0], reroute_013.inputs[0]) + Shader_Preset.links.new(armor_primary_detail_diffuse_map.outputs[1], reroute_097.inputs[0]) + Shader_Preset.links.new(cloth_primary_detail_diffuse_map.outputs[1], reroute_184.inputs[0]) + Shader_Preset.links.new(suit_primary_detail_diffuse_map.outputs[1], reroute_004.inputs[0]) + Shader_Preset.links.new(armor_primary_dye_color.outputs[0], reroute_169.inputs[0]) + Shader_Preset.links.new(armor_secondary_dye_color.outputs[0], reroute_084.inputs[0]) + Shader_Preset.links.new(cloth_primary_dye_color.outputs[0], reroute_185.inputs[0]) + Shader_Preset.links.new(cloth_secondary_dye_color.outputs[0], reroute_134.inputs[0]) + Shader_Preset.links.new(suit_primary_dye_color.outputs[0], reroute_005.inputs[0]) + Shader_Preset.links.new(suit_secondary_dye_color.outputs[0], reroute_154.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_dye_color.outputs[0], reroute_174.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_dye_color.outputs[0], reroute_124.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_dye_color.outputs[0], reroute_061.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_dye_color.outputs[0], reroute_027.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_dye_color.outputs[0], reroute_115.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_dye_color.outputs[0], reroute_028.inputs[0]) + Shader_Preset.links.new(math.outputs[0], mix_055.inputs[0]) + Shader_Preset.links.new(math_001.outputs[0], mix_056.inputs[0]) + Shader_Preset.links.new(math_004.outputs[0], mix_057.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_058.inputs[0]) + Shader_Preset.links.new(math_008.outputs[0], mix_059.inputs[0]) + Shader_Preset.links.new(armor_primary_transmission.outputs[0], reroute_109.inputs[0]) + Shader_Preset.links.new(armor_primary_iridescence.outputs[0], reroute_107.inputs[0]) + Shader_Preset.links.new(armor_primary_metalness.outputs[0], reroute_106.inputs[0]) + Shader_Preset.links.new(armor_secondary_metalness.outputs[0], reroute_079.inputs[0]) + Shader_Preset.links.new(armor_secondary_iridescence.outputs[0], reroute_073.inputs[0]) + Shader_Preset.links.new(armor_secondary_transmission.outputs[0], reroute_071.inputs[0]) + Shader_Preset.links.new(cloth_primary_metalness.outputs[0], reroute_190.inputs[0]) + Shader_Preset.links.new(cloth_primary_iridescence.outputs[0], reroute_195.inputs[0]) + Shader_Preset.links.new(cloth_primary_transmission.outputs[0], reroute_196.inputs[0]) + Shader_Preset.links.new(cloth_secondary_metalness.outputs[0], reroute_139.inputs[0]) + Shader_Preset.links.new(cloth_secondary_iridescence.outputs[0], reroute_145.inputs[0]) + Shader_Preset.links.new(cloth_secondary_transmission.outputs[0], reroute_147.inputs[0]) + Shader_Preset.links.new(suit_primary_metalness.outputs[0], reroute_046.inputs[0]) + Shader_Preset.links.new(suit_primary_iridescence.outputs[0], reroute_053.inputs[0]) + Shader_Preset.links.new(suit_primary_transmission.outputs[0], reroute_055.inputs[0]) + Shader_Preset.links.new(suit_secondary_metalness.outputs[0], reroute_159.inputs[0]) + Shader_Preset.links.new(suit_secondary_iridescence.outputs[0], reroute_165.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_metalness.outputs[0], reroute_178.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_metalness.outputs[0], reroute_125.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_metalness.outputs[0], reroute_062.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_metalness.outputs[0], reroute_045.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_metalness.outputs[0], reroute_116.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_metalness.outputs[0], reroute_047.inputs[0]) + Shader_Preset.links.new(armor_primary_emission_color.outputs[0], reroute_110.inputs[0]) + Shader_Preset.links.new(armor_secondary_emission_color.outputs[0], reroute_090.inputs[0]) + Shader_Preset.links.new(cloth_primary_emission_color.outputs[0], reroute_197.inputs[0]) + Shader_Preset.links.new(cloth_secondary_emission_color.outputs[0], reroute_148.inputs[0]) + Shader_Preset.links.new(suit_primary_emission_color.outputs[0], reroute_091.inputs[0]) + Shader_Preset.links.new(suit_secondary_emission_color.outputs[0], reroute_168.inputs[0]) + Shader_Preset.links.new(reroute_096.outputs[0], combine_xyz_012.inputs[0]) + Shader_Preset.links.new(reroute_095.outputs[0], combine_xyz_012.inputs[1]) + Shader_Preset.links.new(reroute_094.outputs[0], combine_xyz_012.inputs[2]) + Shader_Preset.links.new(reroute_093.outputs[0], combine_xyz_013.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_detail_diffuse_blend.outputs[0], reroute_175.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_detail_normal_blend.outputs[0], reroute_176.inputs[0]) + Shader_Preset.links.new(worn_armor_primary_detail_roughness_blend.outputs[0], reroute_177.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_detail_diffuse_blend.outputs[0], reroute_126.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_detail_normal_blend.outputs[0], reroute_127.inputs[0]) + Shader_Preset.links.new(worn_armor_secondary_detail_roughness_blend.outputs[0], reroute_128.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_detail_diffuse_blend.outputs[0], reroute_063.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_detail_normal_blend.outputs[0], reroute_064.inputs[0]) + Shader_Preset.links.new(worn_cloth_primary_detail_roughness_blend.outputs[0], reroute_056.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_detail_diffuse_blend.outputs[0], reroute_065.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_detail_normal_blend.outputs[0], reroute_066.inputs[0]) + Shader_Preset.links.new(worn_cloth_secondary_detail_roughness_blend.outputs[0], reroute_067.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_detail_diffuse_blend.outputs[0], reroute_117.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_detail_normal_blend.outputs[0], reroute_118.inputs[0]) + Shader_Preset.links.new(worn_suit_primary_detail_roughness_blend.outputs[0], reroute_119.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_detail_diffuse_blend.outputs[0], reroute_068.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_detail_normal_blend.outputs[0], reroute_069.inputs[0]) + Shader_Preset.links.new(worn_suit_secondary_detail_roughness_blend.outputs[0], reroute_070.inputs[0]) + Shader_Preset.links.new(reroute_089.outputs[0], combine_xyz_014.inputs[0]) + Shader_Preset.links.new(reroute_088.outputs[0], combine_xyz_014.inputs[1]) + Shader_Preset.links.new(reroute_087.outputs[0], combine_xyz_014.inputs[2]) + Shader_Preset.links.new(reroute_086.outputs[0], combine_xyz_015.inputs[0]) + Shader_Preset.links.new(reroute_182.outputs[0], combine_xyz_016.inputs[0]) + Shader_Preset.links.new(reroute_180.outputs[0], combine_xyz_016.inputs[1]) + Shader_Preset.links.new(reroute_183.outputs[0], combine_xyz_016.inputs[2]) + Shader_Preset.links.new(reroute_181.outputs[0], combine_xyz_017.inputs[0]) + Shader_Preset.links.new(reroute_131.outputs[0], combine_xyz_018.inputs[0]) + Shader_Preset.links.new(reroute_129.outputs[0], combine_xyz_018.inputs[1]) + Shader_Preset.links.new(reroute_132.outputs[0], combine_xyz_018.inputs[2]) + Shader_Preset.links.new(reroute_130.outputs[0], combine_xyz_019.inputs[0]) + Shader_Preset.links.new(reroute_184.outputs[0], combine_xyz_017.inputs[1]) + Shader_Preset.links.new(reroute_097.outputs[0], combine_xyz_013.inputs[1]) + Shader_Preset.links.new(reroute_002.outputs[0], combine_xyz_024.inputs[0]) + Shader_Preset.links.new(reroute.outputs[0], combine_xyz_024.inputs[1]) + Shader_Preset.links.new(reroute_003.outputs[0], combine_xyz_024.inputs[2]) + Shader_Preset.links.new(reroute_001.outputs[0], combine_xyz_025.inputs[0]) + Shader_Preset.links.new(reroute_004.outputs[0], combine_xyz_025.inputs[1]) + Shader_Preset.links.new(reroute_151.outputs[0], combine_xyz_028.inputs[0]) + Shader_Preset.links.new(reroute_152.outputs[0], combine_xyz_028.inputs[1]) + Shader_Preset.links.new(reroute_150.outputs[0], combine_xyz_028.inputs[2]) + Shader_Preset.links.new(reroute_149.outputs[0], combine_xyz_029.inputs[0]) + Shader_Preset.links.new(reroute_169.outputs[0], mix.inputs[1]) + Shader_Preset.links.new(reroute_084.outputs[0], mix.inputs[2]) + Shader_Preset.links.new(reroute_185.outputs[0], mix_001.inputs[2]) + Shader_Preset.links.new(reroute_134.outputs[0], mix_002.inputs[2]) + Shader_Preset.links.new(reroute_005.outputs[0], mix_003.inputs[2]) + Shader_Preset.links.new(reroute_154.outputs[0], mix_004.inputs[2]) + Shader_Preset.links.new(reroute_172.outputs[0], combine_xyz_013.inputs[2]) + Shader_Preset.links.new(reroute_171.outputs[0], combine_xyz_020.inputs[0]) + Shader_Preset.links.new(reroute_170.outputs[0], combine_xyz_020.inputs[1]) + Shader_Preset.links.new(reroute_173.outputs[0], combine_xyz_020.inputs[2]) + Shader_Preset.links.new(combine_xyz_012.outputs[0], mix_020.inputs[1]) + Shader_Preset.links.new(combine_xyz_014.outputs[0], mix_020.inputs[2]) + Shader_Preset.links.new(combine_xyz_016.outputs[0], mix_021.inputs[2]) + Shader_Preset.links.new(combine_xyz_018.outputs[0], mix_022.inputs[2]) + Shader_Preset.links.new(combine_xyz_024.outputs[0], mix_023.inputs[2]) + Shader_Preset.links.new(combine_xyz_028.outputs[0], mix_024.inputs[2]) + Shader_Preset.links.new(combine_xyz_013.outputs[0], mix_025.inputs[1]) + Shader_Preset.links.new(combine_xyz_015.outputs[0], mix_025.inputs[2]) + Shader_Preset.links.new(combine_xyz_017.outputs[0], mix_026.inputs[2]) + Shader_Preset.links.new(combine_xyz_019.outputs[0], mix_027.inputs[2]) + Shader_Preset.links.new(combine_xyz_025.outputs[0], mix_028.inputs[2]) + Shader_Preset.links.new(combine_xyz_029.outputs[0], mix_029.inputs[2]) + Shader_Preset.links.new(combine_xyz_020.outputs[0], mix_030.inputs[1]) + Shader_Preset.links.new(combine_xyz_021.outputs[0], mix_030.inputs[2]) + Shader_Preset.links.new(combine_xyz_022.outputs[0], mix_031.inputs[2]) + Shader_Preset.links.new(combine_xyz_023.outputs[0], mix_032.inputs[2]) + Shader_Preset.links.new(combine_xyz_026.outputs[0], mix_033.inputs[2]) + Shader_Preset.links.new(combine_xyz_027.outputs[0], mix_034.inputs[2]) + Shader_Preset.links.new(reroute_120.outputs[0], combine_xyz_015.inputs[2]) + Shader_Preset.links.new(reroute_121.outputs[0], combine_xyz_021.inputs[0]) + Shader_Preset.links.new(reroute_122.outputs[0], combine_xyz_021.inputs[1]) + Shader_Preset.links.new(reroute_123.outputs[0], combine_xyz_021.inputs[2]) + Shader_Preset.links.new(reroute_058.outputs[0], combine_xyz_022.inputs[2]) + Shader_Preset.links.new(reroute_057.outputs[0], combine_xyz_022.inputs[1]) + Shader_Preset.links.new(reroute_059.outputs[0], combine_xyz_022.inputs[0]) + Shader_Preset.links.new(reroute_060.outputs[0], combine_xyz_017.inputs[2]) + Shader_Preset.links.new(reroute_009.outputs[0], combine_xyz_023.inputs[2]) + Shader_Preset.links.new(reroute_008.outputs[0], combine_xyz_023.inputs[1]) + Shader_Preset.links.new(reroute_007.outputs[0], combine_xyz_023.inputs[0]) + Shader_Preset.links.new(reroute_006.outputs[0], combine_xyz_019.inputs[2]) + Shader_Preset.links.new(reroute_114.outputs[0], combine_xyz_026.inputs[2]) + Shader_Preset.links.new(reroute_113.outputs[0], combine_xyz_026.inputs[1]) + Shader_Preset.links.new(reroute_112.outputs[0], combine_xyz_026.inputs[0]) + Shader_Preset.links.new(reroute_111.outputs[0], combine_xyz_025.inputs[2]) + Shader_Preset.links.new(reroute_013.outputs[0], combine_xyz_027.inputs[2]) + Shader_Preset.links.new(reroute_012.outputs[0], combine_xyz_027.inputs[1]) + Shader_Preset.links.new(reroute_010.outputs[0], combine_xyz_027.inputs[0]) + Shader_Preset.links.new(reroute_011.outputs[0], combine_xyz_029.inputs[2]) + Shader_Preset.links.new(reroute_018.outputs[0], armor_detail_diffuse_transform.inputs[0]) + Shader_Preset.links.new(reroute_174.outputs[0], mix_005.inputs[1]) + Shader_Preset.links.new(reroute_124.outputs[0], mix_005.inputs[2]) + Shader_Preset.links.new(reroute_061.outputs[0], mix_006.inputs[2]) + Shader_Preset.links.new(reroute_027.outputs[0], mix_007.inputs[2]) + Shader_Preset.links.new(reroute_115.outputs[0], mix_008.inputs[2]) + Shader_Preset.links.new(reroute_028.outputs[0], mix_009.inputs[2]) + Shader_Preset.links.new(reroute_098.outputs[0], combine_xyz.inputs[0]) + Shader_Preset.links.new(reroute_099.outputs[0], combine_xyz.inputs[1]) + Shader_Preset.links.new(reroute_100.outputs[0], combine_xyz.inputs[2]) + Shader_Preset.links.new(reroute_092.outputs[0], combine_xyz_001.inputs[0]) + Shader_Preset.links.new(combine_xyz.outputs[0], mix_010.inputs[1]) + Shader_Preset.links.new(combine_xyz_001.outputs[0], mix_015.inputs[1]) + Shader_Preset.links.new(reroute_083.outputs[0], combine_xyz_002.inputs[0]) + Shader_Preset.links.new(reroute_082.outputs[0], combine_xyz_002.inputs[1]) + Shader_Preset.links.new(reroute_081.outputs[0], combine_xyz_002.inputs[2]) + Shader_Preset.links.new(reroute_080.outputs[0], combine_xyz_003.inputs[0]) + Shader_Preset.links.new(reroute_186.outputs[0], combine_xyz_005.inputs[0]) + Shader_Preset.links.new(reroute_187.outputs[0], combine_xyz_005.inputs[1]) + Shader_Preset.links.new(reroute_188.outputs[0], combine_xyz_005.inputs[2]) + Shader_Preset.links.new(reroute_189.outputs[0], combine_xyz_004.inputs[0]) + Shader_Preset.links.new(reroute_135.outputs[0], combine_xyz_007.inputs[0]) + Shader_Preset.links.new(reroute_136.outputs[0], combine_xyz_007.inputs[1]) + Shader_Preset.links.new(reroute_137.outputs[0], combine_xyz_007.inputs[2]) + Shader_Preset.links.new(reroute_138.outputs[0], combine_xyz_006.inputs[0]) + Shader_Preset.links.new(reroute_041.outputs[0], combine_xyz_008.inputs[0]) + Shader_Preset.links.new(reroute_042.outputs[0], combine_xyz_008.inputs[1]) + Shader_Preset.links.new(reroute_043.outputs[0], combine_xyz_008.inputs[2]) + Shader_Preset.links.new(reroute_044.outputs[0], combine_xyz_009.inputs[0]) + Shader_Preset.links.new(reroute_155.outputs[0], combine_xyz_010.inputs[0]) + Shader_Preset.links.new(reroute_156.outputs[0], combine_xyz_010.inputs[1]) + Shader_Preset.links.new(reroute_157.outputs[0], combine_xyz_010.inputs[2]) + Shader_Preset.links.new(reroute_158.outputs[0], combine_xyz_011.inputs[0]) + Shader_Preset.links.new(armor_secondary_fuzz.outputs[0], reroute_072.inputs[0]) + Shader_Preset.links.new(cloth_primary_fuzz.outputs[0], reroute_365.inputs[0]) + Shader_Preset.links.new(cloth_secondary_fuzz.outputs[0], reroute_146.inputs[0]) + Shader_Preset.links.new(suit_primary_fuzz.outputs[0], reroute_054.inputs[0]) + Shader_Preset.links.new(suit_secondary_transmission.outputs[0], reroute_167.inputs[0]) + Shader_Preset.links.new(suit_secondary_fuzz.outputs[0], reroute_166.inputs[0]) + Shader_Preset.links.new(reroute_101.outputs[0], combine_xyz_030.inputs[0]) + Shader_Preset.links.new(reroute_102.outputs[0], combine_xyz_030.inputs[1]) + Shader_Preset.links.new(reroute_103.outputs[0], combine_xyz_030.inputs[2]) + Shader_Preset.links.new(reroute_175.outputs[0], combine_xyz_032.inputs[0]) + Shader_Preset.links.new(reroute_176.outputs[0], combine_xyz_032.inputs[1]) + Shader_Preset.links.new(reroute_177.outputs[0], combine_xyz_032.inputs[2]) + Shader_Preset.links.new(reroute_107.outputs[0], combine_xyz_031.inputs[0]) + Shader_Preset.links.new(reroute_108.outputs[0], combine_xyz_031.inputs[1]) + Shader_Preset.links.new(reroute_109.outputs[0], combine_xyz_031.inputs[2]) + Shader_Preset.links.new(reroute_178.outputs[0], combine_xyz_001.inputs[2]) + Shader_Preset.links.new(reroute_106.outputs[0], combine_xyz_001.inputs[1]) + Shader_Preset.links.new(reroute_079.outputs[0], combine_xyz_003.inputs[1]) + Shader_Preset.links.new(reroute_125.outputs[0], combine_xyz_003.inputs[2]) + Shader_Preset.links.new(reroute_190.outputs[0], combine_xyz_004.inputs[1]) + Shader_Preset.links.new(reroute_062.outputs[0], combine_xyz_004.inputs[2]) + Shader_Preset.links.new(reroute_139.outputs[0], combine_xyz_006.inputs[1]) + Shader_Preset.links.new(reroute_045.outputs[0], combine_xyz_006.inputs[2]) + Shader_Preset.links.new(reroute_046.outputs[0], combine_xyz_009.inputs[1]) + Shader_Preset.links.new(reroute_116.outputs[0], combine_xyz_009.inputs[2]) + Shader_Preset.links.new(reroute_159.outputs[0], combine_xyz_011.inputs[1]) + Shader_Preset.links.new(reroute_047.outputs[0], combine_xyz_011.inputs[2]) + Shader_Preset.links.new(combine_xyz_002.outputs[0], mix_010.inputs[2]) + Shader_Preset.links.new(combine_xyz_005.outputs[0], mix_011.inputs[2]) + Shader_Preset.links.new(combine_xyz_007.outputs[0], mix_012.inputs[2]) + Shader_Preset.links.new(combine_xyz_008.outputs[0], mix_013.inputs[2]) + Shader_Preset.links.new(combine_xyz_010.outputs[0], mix_014.inputs[2]) + Shader_Preset.links.new(combine_xyz_003.outputs[0], mix_015.inputs[2]) + Shader_Preset.links.new(combine_xyz_004.outputs[0], mix_016.inputs[2]) + Shader_Preset.links.new(combine_xyz_006.outputs[0], mix_017.inputs[2]) + Shader_Preset.links.new(combine_xyz_009.outputs[0], mix_018.inputs[2]) + Shader_Preset.links.new(combine_xyz_011.outputs[0], mix_019.inputs[2]) + Shader_Preset.links.new(reroute_078.outputs[0], combine_xyz_033.inputs[0]) + Shader_Preset.links.new(reroute_077.outputs[0], combine_xyz_033.inputs[1]) + Shader_Preset.links.new(reroute_076.outputs[0], combine_xyz_033.inputs[2]) + Shader_Preset.links.new(reroute_191.outputs[0], combine_xyz_034.inputs[0]) + Shader_Preset.links.new(reroute_192.outputs[0], combine_xyz_034.inputs[1]) + Shader_Preset.links.new(reroute_193.outputs[0], combine_xyz_034.inputs[2]) + Shader_Preset.links.new(reroute_140.outputs[0], combine_xyz_035.inputs[0]) + Shader_Preset.links.new(reroute_141.outputs[0], combine_xyz_035.inputs[1]) + Shader_Preset.links.new(reroute_142.outputs[0], combine_xyz_035.inputs[2]) + Shader_Preset.links.new(reroute_048.outputs[0], combine_xyz_036.inputs[0]) + Shader_Preset.links.new(reroute_049.outputs[0], combine_xyz_036.inputs[1]) + Shader_Preset.links.new(reroute_050.outputs[0], combine_xyz_036.inputs[2]) + Shader_Preset.links.new(reroute_160.outputs[0], combine_xyz_037.inputs[0]) + Shader_Preset.links.new(reroute_161.outputs[0], combine_xyz_037.inputs[1]) + Shader_Preset.links.new(reroute_162.outputs[0], combine_xyz_037.inputs[2]) + Shader_Preset.links.new(combine_xyz_030.outputs[0], mix_040.inputs[1]) + Shader_Preset.links.new(combine_xyz_033.outputs[0], mix_040.inputs[2]) + Shader_Preset.links.new(combine_xyz_034.outputs[0], mix_041.inputs[2]) + Shader_Preset.links.new(combine_xyz_035.outputs[0], mix_042.inputs[2]) + Shader_Preset.links.new(combine_xyz_036.outputs[0], mix_043.inputs[2]) + Shader_Preset.links.new(combine_xyz_037.outputs[0], mix_044.inputs[2]) + Shader_Preset.links.new(reroute_073.outputs[0], combine_xyz_038.inputs[0]) + Shader_Preset.links.new(reroute_072.outputs[0], combine_xyz_038.inputs[1]) + Shader_Preset.links.new(reroute_071.outputs[0], combine_xyz_038.inputs[2]) + Shader_Preset.links.new(reroute_195.outputs[0], combine_xyz_039.inputs[0]) + Shader_Preset.links.new(reroute_365.outputs[0], combine_xyz_039.inputs[1]) + Shader_Preset.links.new(reroute_196.outputs[0], combine_xyz_039.inputs[2]) + Shader_Preset.links.new(reroute_145.outputs[0], combine_xyz_040.inputs[0]) + Shader_Preset.links.new(reroute_146.outputs[0], combine_xyz_040.inputs[1]) + Shader_Preset.links.new(reroute_147.outputs[0], combine_xyz_040.inputs[2]) + Shader_Preset.links.new(reroute_053.outputs[0], combine_xyz_041.inputs[0]) + Shader_Preset.links.new(reroute_054.outputs[0], combine_xyz_041.inputs[1]) + Shader_Preset.links.new(reroute_055.outputs[0], combine_xyz_041.inputs[2]) + Shader_Preset.links.new(reroute_165.outputs[0], combine_xyz_042.inputs[0]) + Shader_Preset.links.new(reroute_166.outputs[0], combine_xyz_042.inputs[1]) + Shader_Preset.links.new(reroute_167.outputs[0], combine_xyz_042.inputs[2]) + Shader_Preset.links.new(combine_xyz_031.outputs[0], mix_045.inputs[1]) + Shader_Preset.links.new(combine_xyz_038.outputs[0], mix_045.inputs[2]) + Shader_Preset.links.new(combine_xyz_039.outputs[0], mix_046.inputs[2]) + Shader_Preset.links.new(combine_xyz_040.outputs[0], mix_047.inputs[2]) + Shader_Preset.links.new(combine_xyz_041.outputs[0], mix_048.inputs[2]) + Shader_Preset.links.new(combine_xyz_042.outputs[0], mix_049.inputs[2]) + Shader_Preset.links.new(reroute_126.outputs[0], combine_xyz_043.inputs[0]) + Shader_Preset.links.new(reroute_127.outputs[0], combine_xyz_043.inputs[1]) + Shader_Preset.links.new(reroute_128.outputs[0], combine_xyz_043.inputs[2]) + Shader_Preset.links.new(reroute_063.outputs[0], combine_xyz_044.inputs[0]) + Shader_Preset.links.new(reroute_064.outputs[0], combine_xyz_044.inputs[1]) + Shader_Preset.links.new(reroute_056.outputs[0], combine_xyz_044.inputs[2]) + Shader_Preset.links.new(reroute_065.outputs[0], combine_xyz_045.inputs[0]) + Shader_Preset.links.new(reroute_066.outputs[0], combine_xyz_045.inputs[1]) + Shader_Preset.links.new(reroute_067.outputs[0], combine_xyz_045.inputs[2]) + Shader_Preset.links.new(reroute_117.outputs[0], combine_xyz_046.inputs[0]) + Shader_Preset.links.new(reroute_118.outputs[0], combine_xyz_046.inputs[1]) + Shader_Preset.links.new(reroute_119.outputs[0], combine_xyz_046.inputs[2]) + Shader_Preset.links.new(reroute_068.outputs[0], combine_xyz_047.inputs[0]) + Shader_Preset.links.new(reroute_069.outputs[0], combine_xyz_047.inputs[1]) + Shader_Preset.links.new(reroute_070.outputs[0], combine_xyz_047.inputs[2]) + Shader_Preset.links.new(combine_xyz_032.outputs[0], mix_055.inputs[1]) + Shader_Preset.links.new(combine_xyz_043.outputs[0], mix_055.inputs[2]) + Shader_Preset.links.new(combine_xyz_044.outputs[0], mix_056.inputs[2]) + Shader_Preset.links.new(combine_xyz_045.outputs[0], mix_057.inputs[2]) + Shader_Preset.links.new(combine_xyz_046.outputs[0], mix_058.inputs[2]) + Shader_Preset.links.new(combine_xyz_047.outputs[0], mix_059.inputs[2]) + Shader_Preset.links.new(reroute_110.outputs[0], mix_050.inputs[1]) + Shader_Preset.links.new(reroute_090.outputs[0], mix_050.inputs[2]) + Shader_Preset.links.new(reroute_197.outputs[0], mix_051.inputs[2]) + Shader_Preset.links.new(reroute_148.outputs[0], mix_052.inputs[2]) + Shader_Preset.links.new(reroute_091.outputs[0], mix_053.inputs[2]) + Shader_Preset.links.new(reroute_168.outputs[0], mix_054.inputs[2]) + Shader_Preset.links.new(armor_primary_fuzz.outputs[0], reroute_108.inputs[0]) + Shader_Preset.links.new(math_023.outputs[0], math_024.inputs[0]) + Shader_Preset.links.new(separate_xyz_001.outputs[0], math.inputs[0]) + Shader_Preset.links.new(separate_xyz_001.outputs[0], math_001.inputs[0]) + Shader_Preset.links.new(separate_xyz_001.outputs[1], math_008.inputs[0]) + Shader_Preset.links.new(separate_xyz_001.outputs[1], math_007.inputs[0]) + Shader_Preset.links.new(separate_xyz_001.outputs[1], math_004.inputs[0]) + Shader_Preset.links.new(mix_071.outputs[0], separate_xyz_001.inputs[0]) + Shader_Preset.links.new(math_022.outputs[0], combine_xyz_048.inputs[0]) + Shader_Preset.links.new(math_024.outputs[0], combine_xyz_048.inputs[1]) + Shader_Preset.links.new(combine_xyz_048.outputs[0], mix_071.inputs[2]) + Shader_Preset.links.new(attribute.outputs[0], mix_071.inputs[1]) + Shader_Preset.links.new(separate_xyz_002.outputs[0], math_002.inputs[0]) + Shader_Preset.links.new(separate_xyz_002.outputs[1], math_015.inputs[0]) + Shader_Preset.links.new(separate_xyz_002.outputs[2], math_016.inputs[0]) + Shader_Preset.links.new(mix_069.outputs[0], mix_070.inputs[1]) + Shader_Preset.links.new(mix_070.outputs[0], mix_068.inputs[1]) + Shader_Preset.links.new(mix_065.outputs[0], mix_066.inputs[1]) + Shader_Preset.links.new(math_002.outputs[0], mix_069.inputs[0]) + Shader_Preset.links.new(math_015.outputs[0], mix_070.inputs[0]) + Shader_Preset.links.new(math_002.outputs[0], math_003.inputs[0]) + Shader_Preset.links.new(math_015.outputs[0], math_003.inputs[1]) + Shader_Preset.links.new(math_002.outputs[0], math_005.inputs[0]) + Shader_Preset.links.new(math_016.outputs[0], math_005.inputs[1]) + Shader_Preset.links.new(math_005.outputs[0], mix_066.inputs[0]) + Shader_Preset.links.new(math_016.outputs[0], mix_068.inputs[0]) + Shader_Preset.links.new(mix_068.outputs[0], mix_065.inputs[1]) + Shader_Preset.links.new(math_003.outputs[0], mix_065.inputs[0]) + Shader_Preset.links.new(math_012.outputs[0], math_010.inputs[0]) + Shader_Preset.links.new(math_010.outputs[0], math_013.inputs[0]) + Shader_Preset.links.new(mix_066.outputs[0], mix_067.inputs[1]) + Shader_Preset.links.new(mix_072.outputs[0], math_023.inputs[0]) + Shader_Preset.links.new(mix_067.outputs[0], mix_071.inputs[0]) + Shader_Preset.links.new(separate_xyz_002.outputs[2], math_017.inputs[0]) + Shader_Preset.links.new(math_017.outputs[0], math_010.inputs[1]) + Shader_Preset.links.new(separate_xyz_002.outputs[1], math_018.inputs[0]) + Shader_Preset.links.new(math_018.outputs[0], math_012.inputs[1]) + Shader_Preset.links.new(separate_xyz_002.outputs[0], math_019.inputs[0]) + Shader_Preset.links.new(math_019.outputs[0], math_012.inputs[0]) + Shader_Preset.links.new(math_013.outputs[0], mix_067.inputs[0]) + Shader_Preset.links.new(mix_067.outputs[0], mix_072.inputs[1]) + Shader_Preset.links.new(mix_072.outputs[0], math_022.inputs[0]) + Shader_Preset.links.new(math_021.outputs[0], math_013.inputs[1]) + Shader_Preset.links.new(mix_073.outputs[0], mix_074.inputs[1]) + Shader_Preset.links.new(math_001.outputs[0], mix_073.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_074.inputs[0]) + Shader_Preset.links.new(reroute_104.outputs[0], mix_073.inputs[1]) + Shader_Preset.links.new(reroute_194.outputs[0], mix_073.inputs[2]) + Shader_Preset.links.new(reroute_051.outputs[0], mix_074.inputs[2]) + Shader_Preset.links.new(math_001.outputs[0], node.inputs[0]) + Shader_Preset.links.new(math_007.outputs[0], mix_076.inputs[0]) + Shader_Preset.links.new(node.outputs[0], mix_076.inputs[1]) + Shader_Preset.links.new(reroute_105.outputs[0], node.inputs[1]) + Shader_Preset.links.new(reroute_179.outputs[0], node.inputs[2]) + Shader_Preset.links.new(reroute_052.outputs[0], mix_076.inputs[2]) + Shader_Preset.links.new(reroute_097.outputs[0], combine_xyz_015.inputs[1]) + Shader_Preset.links.new(reroute_184.outputs[0], combine_xyz_019.inputs[1]) + Shader_Preset.links.new(reroute_004.outputs[0], combine_xyz_029.inputs[1]) + Shader_Preset.links.new(armor_detail_diffuse_transform.outputs[0], reroute_014.inputs[0]) + Shader_Preset.links.new(reroute_014.outputs[0], reroute_015.inputs[0]) + Shader_Preset.links.new(reroute_015.outputs[0], armor_primary_detail_diffuse_map.inputs[0]) + Shader_Preset.links.new(reroute_016.outputs[0], reroute_017.inputs[0]) + Shader_Preset.links.new(armor_detail_normal_transform.outputs[0], reroute_016.inputs[0]) + Shader_Preset.links.new(reroute_017.outputs[0], armor_primary_detail_normal_map.inputs[0]) + Shader_Preset.links.new(detail_uvs.outputs[0], reroute_018.inputs[0]) + Shader_Preset.links.new(reroute_018.outputs[0], reroute_019.inputs[0]) + Shader_Preset.links.new(reroute_019.outputs[0], armor_detail_normal_transform.inputs[0]) + Shader_Preset.links.new(reroute_024.outputs[0], cloth_detail_diffuse_transform.inputs[0]) + Shader_Preset.links.new(cloth_detail_diffuse_transform.outputs[0], reroute_023.inputs[0]) + Shader_Preset.links.new(reroute_023.outputs[0], reroute_021.inputs[0]) + Shader_Preset.links.new(reroute_022.outputs[0], reroute_020.inputs[0]) + Shader_Preset.links.new(cloth_detail_normal_transform.outputs[0], reroute_022.inputs[0]) + Shader_Preset.links.new(reroute_024.outputs[0], reroute_025.inputs[0]) + Shader_Preset.links.new(reroute_025.outputs[0], cloth_detail_normal_transform.inputs[0]) + Shader_Preset.links.new(reroute_021.outputs[0], cloth_primary_detail_diffuse_map.inputs[0]) + Shader_Preset.links.new(reroute_020.outputs[0], cloth_primary_detail_normal_map.inputs[0]) + Shader_Preset.links.new(reroute_019.outputs[0], reroute_024.inputs[0]) + Shader_Preset.links.new(reroute_030.outputs[0], suit_detail_diffuse_transform.inputs[0]) + Shader_Preset.links.new(suit_detail_diffuse_transform.outputs[0], reroute_029.inputs[0]) + Shader_Preset.links.new(reroute_029.outputs[0], reroute_032.inputs[0]) + Shader_Preset.links.new(reroute_026.outputs[0], reroute_033.inputs[0]) + Shader_Preset.links.new(suit_detail_normal_transform.outputs[0], reroute_026.inputs[0]) + Shader_Preset.links.new(reroute_030.outputs[0], reroute_031.inputs[0]) + Shader_Preset.links.new(reroute_031.outputs[0], suit_detail_normal_transform.inputs[0]) + Shader_Preset.links.new(reroute_032.outputs[0], suit_primary_detail_diffuse_map.inputs[0]) + Shader_Preset.links.new(reroute_033.outputs[0], suit_primary_detail_normal_map.inputs[0]) + Shader_Preset.links.new(reroute_025.outputs[0], reroute_030.inputs[0]) + +#Group Input Connections + Shader_Preset.links.new(group_input.outputs[0], separate_xyz_002.inputs[0]) + Shader_Preset.links.new(group_input.outputs[1], math_021.inputs[0]) + Shader_Preset.links.new(group_input.outputs[2], mix_072.inputs[0]) + Shader_Preset.links.new(group_input.outputs[2], mix_072.inputs[2]) +#Group Output connections + Shader_Preset.links.new(mix_004.outputs[0], group_output.inputs[0]) + Shader_Preset.links.new(mix_009.outputs[0], group_output.inputs[1]) + Shader_Preset.links.new(mix_014.outputs[0], group_output.inputs[2]) + Shader_Preset.links.new(mix_019.outputs[0], group_output.inputs[3]) + Shader_Preset.links.new(mix_024.outputs[0], group_output.inputs[4]) + Shader_Preset.links.new(mix_029.outputs[0], group_output.inputs[5]) + Shader_Preset.links.new(mix_034.outputs[0], group_output.inputs[6]) + Shader_Preset.links.new(mix_074.outputs[0], group_output.inputs[7]) + Shader_Preset.links.new(mix_076.outputs[0], group_output.inputs[8]) + Shader_Preset.links.new(mix_044.outputs[0], group_output.inputs[9]) + Shader_Preset.links.new(mix_059.outputs[0], group_output.inputs[10]) + Shader_Preset.links.new(mix_049.outputs[0], group_output.inputs[11]) + Shader_Preset.links.new(mix_054.outputs[0], group_output.inputs[12]) + + return Shader_Preset + +class NODE(bpy.types.Operator): + bl_label = ("Generate SHADERNAMEENUM Shader Preset") bl_idname = "node.test_operator" def execute(self, context): - # BIOS Change Nodegroup name dependent on name of shader ripped from API - custom_node_name = "SHADERNAMEENUM" + custom_node_name = "SHADERNAMEENUM Shader Preset" global RIP_LOCATION - my_group = create_test_group(self, context, custom_node_name, RIP_LOCATION+"/../") - test_node = context.view_layer.objects.active.active_material.node_tree.nodes.new('ShaderNodeGroup') - test_node.node_tree = bpy.data.node_groups[my_group.name] - test_node.use_custom_color = True - test_node.color = (0.101, 0.170, 0.297) + GroupNode = create_Shader_Preset(self, context, custom_node_name, RIP_LOCATION) + shaderpreset_node = context.view_layer.objects.active.active_material.node_tree.nodes.new('ShaderNodeGroup') + shaderpreset_node.node_tree = bpy.data.node_groups[GroupNode.name] + shaderpreset_node.use_custom_color = True + shaderpreset_node.color = (0.101, 0.170, 0.297) return {'FINISHED'} - def register(): global RIP_LOCATION - RIP_LOCATION = os.path.abspath(bpy.context.space_data.text.filepath) - bpy.utils.register_class(NODE_PT_MAINPANEL) - bpy.utils.register_class(NODE_OT_TEST) - + RIP_LOCATION = os.path.abspath(bpy.context.space_data.text.filepath+"/../") + bpy.utils.register_class(MAINPANEL) + bpy.utils.register_class(NODE) def unregister(): - bpy.utils.unregister_class(NODE_PT_MAINPANEL) - bpy.utils.unregister_class(NODE_OT_TEST) - + bpy.utils.unregister_class(MAINPANEL) + bpy.utils.unregister_class(NODE) if __name__ == "__main__": register() diff --git a/Tiger/Helpers.cs b/Tiger/Helpers.cs index eff333a6..6cbb78f9 100644 --- a/Tiger/Helpers.cs +++ b/Tiger/Helpers.cs @@ -78,6 +78,24 @@ public static void DecorateSignaturesWithBufferIndex(ref InputSignature[] inputS // however, it's impossible for there to be more semantics than the stride max Debug.Assert(strideBound >= offset); } + + public static uint Fnv(string fnvString, bool le = false) + { + uint value = 0x811c9dc5; + for (var i = 0; i < fnvString.Length; i++) + { + value *= 0x01000193; + value ^= fnvString[i]; + } + if(le) + { + byte[] littleEndianBytes = BitConverter.GetBytes(value); + Array.Reverse(littleEndianBytes); + return BitConverter.ToUInt32(littleEndianBytes, 0); + } + else + return value; + } } public static class NestedTypeHelpers diff --git a/Tiger/Schema/Activity/Activity.cs b/Tiger/Schema/Activity/Activity.cs index d4a0886f..59b2a9ef 100644 --- a/Tiger/Schema/Activity/Activity.cs +++ b/Tiger/Schema/Activity/Activity.cs @@ -1,5 +1,7 @@ -using Tiger.Schema.Audio; -using Tiger.Schema.Strings; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using Tiger.Schema.Entity; namespace Tiger.Schema.Activity { @@ -9,10 +11,20 @@ public struct Bubble public Tag MapReference; } + public struct ActivityEntities + { + public string BubbleName; + public string ActivityPhaseName2; + public FileHash Hash; + public List DataTables; + public Dictionary> WorldIDs; //World ID, name/subname + } + public interface IActivity : ISchema { public FileHash FileHash { get; } public IEnumerable EnumerateBubbles(); + public IEnumerable EnumerateActivityEntities(FileHash UnkActivity = null); } } @@ -44,6 +56,83 @@ private string GetBubbleNameFromBubbleIndex(int index) { return GlobalStrings.Get().GetString(_tag.LocationNames.TagData.BubbleNames.First(e => e.BubbleIndex == index).BubbleName); } + + public IEnumerable EnumerateActivityEntities(FileHash UnkActivity = null) + { + Tag tag = FileResourcer.Get().GetSchemaTag(UnkActivity); + foreach (var entry in tag.TagData.Unk50) + { + foreach (var entry2 in entry.Unk08) + { + yield return new ActivityEntities + { + BubbleName = GlobalStrings.Get().GetString(entry2.UnkName1), + Hash = entry2.Unk44.Hash, + ActivityPhaseName2 = GlobalStrings.Get().GetString(entry2.UnkName0), + DataTables = CollapseResourceParent(entry2.Unk44.Hash) + }; + } + } + } + + private List CollapseResourceParent(FileHash hash) + { + ConcurrentBag items = new(); + + var entry = FileResourcer.Get().GetSchemaTag(hash); + + // :))) + foreach (var resource in entry.TagData.Unk14.TagData.Unk08) + { + foreach (var a in resource.Unk00.TagData.Unk38) + { + foreach (var table in a.Unk08) + { + if (table.Unk00 is null || table.Unk00.TagData.DataTable is null) + continue; + + if (table.Unk00.TagData.DataTable.TagData.DataEntries.Count > 0) + { + items.Add(table.Unk00.TagData.DataTable.Hash); + } + } + } + } + foreach (var resource in entry.TagData.Unk14.TagData.Unk18) + { + foreach (var a in resource.Unk00.TagData.Unk38) + { + foreach (var table in a.Unk08) + { + if (table.Unk00 is null || table.Unk00.TagData.DataTable is null) + continue; + + if (table.Unk00.TagData.DataTable.TagData.DataEntries.Count > 0) + { + items.Add(table.Unk00.TagData.DataTable.Hash); + } + } + } + } + foreach (var resource in entry.TagData.Unk14.TagData.Unk28) + { + foreach (var a in resource.Unk00.TagData.Unk38) + { + foreach (var table in a.Unk08) + { + if (table.Unk00 is null || table.Unk00.TagData.DataTable is null) + continue; + + if (table.Unk00.TagData.DataTable.TagData.DataEntries.Count > 0) + { + items.Add(table.Unk00.TagData.DataTable.Hash); + } + } + } + } + + return items.ToList(); + } } } @@ -73,6 +162,11 @@ public IEnumerable EnumerateBubbles() } } + public IEnumerable EnumerateActivityEntities(FileHash UnkActivity = null) + { + throw new NotSupportedException(); + } + // protected override void ParseStructs() // { // // Getting the string container @@ -127,5 +221,122 @@ public IEnumerable EnumerateBubbles() } } } + + public IEnumerable EnumerateActivityEntities(FileHash UnkActivity = null) + { + foreach (var entry in _tag.Unk50) + { + foreach (var resource in entry.Unk18) + { + yield return new ActivityEntities + { + BubbleName = GlobalStrings.Get().GetString(resource.BubbleName), + Hash = resource.UnkEntityReference.Hash, + ActivityPhaseName2 = resource.ActivityPhaseName2, + DataTables = CollapseResourceParent(resource.UnkEntityReference.Hash), + WorldIDs = GetWorldIDs(resource.UnkEntityReference.Hash) + }; + } + } + } + + private List CollapseResourceParent(FileHash hash) + { + ConcurrentBag items = new(); + var entry = FileResourcer.Get().GetSchemaTag(hash); + var Unk18 = FileResourcer.Get().GetSchemaTag(entry.TagData.Unk18.Hash); + + foreach(var resource in Unk18.TagData.EntityResources) + { + if(resource.EntityResourceParent != null) + { + var resourceValue = resource.EntityResourceParent.TagData.EntityResource.TagData.Unk18.GetValue(resource.EntityResourceParent.TagData.EntityResource.GetReader()); + switch (resourceValue) + { + case D2Class_D8928080: + var tag = (D2Class_D8928080)resourceValue; + if (tag.Unk84 is not null) + { + if (tag.Unk84.TagData.DataEntries.Count > 0) + { + items.Add(tag.Unk84.Hash); + } + } + break; + + case D2Class_EF8C8080: + var tag2 = (D2Class_EF8C8080)resourceValue; + if (tag2.Unk58 is not null) + { + if (tag2.Unk58.TagData.DataEntries.Count > 0) + { + items.Add(tag2.Unk58.Hash); + } + } + break; + } + } + } + + return items.ToList(); + } + + private Dictionary> GetWorldIDs(FileHash hash) + { + Dictionary> items = new(); + Dictionary strings = new(); + var entry = FileResourcer.Get().GetSchemaTag(hash); + var Unk18 = FileResourcer.Get().GetSchemaTag(entry.TagData.Unk18.Hash); + + foreach (var resource in Unk18.TagData.EntityResources) + { + if (resource.EntityResourceParent != null) + { + var resourceValue = resource.EntityResourceParent.TagData.EntityResource.TagData.Unk18.GetValue(resource.EntityResourceParent.TagData.EntityResource.GetReader()); + switch (resourceValue) + { + //This is kinda dumb + case D2Class_95468080: + case D2Class_26988080: + case D2Class_6F418080: + case D2Class_EF988080: + case D2Class_F88C8080: + case D2Class_FA988080: + if (resource.EntityResourceParent.TagData.EntityResource.TagData.UnkHash80 != null) + { + var unk80 = FileResourcer.Get().GetSchemaTag(resource.EntityResourceParent.TagData.EntityResource.TagData.UnkHash80.Hash); + foreach (var a in unk80.TagData.Unk08) + { + if (a.Unk00.Value.Name.Value is not null) + { + strings.TryAdd(Helpers.Fnv(a.Unk00.Value.Name.Value), a.Unk00.Value.Name.Value); + } + } + foreach (var worldid in resourceValue.Unk58) + { + if (strings.ContainsKey(worldid.FNVHash.Hash32) && strings.Any(kv => kv.Key == worldid.FNVHash.Hash32)) + { + Dictionary name = new(); + if (strings.ContainsKey(resourceValue.FNVHash.Hash32)) + { + name.TryAdd(strings[worldid.FNVHash.Hash32], strings[resourceValue.FNVHash.Hash32]); + items.TryAdd(worldid.WorldID, name); + } + else + { + name.TryAdd(strings[worldid.FNVHash.Hash32], ""); + items.TryAdd(worldid.WorldID, name); + } + } + } + } + break; + default: + break; + } + } + } + return items; + } } } diff --git a/Tiger/Schema/Activity/ActivityStructsSK.cs b/Tiger/Schema/Activity/ActivityStructsSK.cs index e01b8c87..b8ad57a8 100644 --- a/Tiger/Schema/Activity/ActivityStructsSK.cs +++ b/Tiger/Schema/Activity/ActivityStructsSK.cs @@ -74,12 +74,13 @@ public struct SUnkActivity_SK public TigerHash Unk20; public TigerHash Unk24; public LocalizedStrings LocalizedStrings; - // [SchemaField(0x30)] - // public StringPointer ActivityDevName; + [SchemaField(0x30)] + public StringPointer ActivityDevName; // public Tag Unk38; // 80978080 - // [SchemaField(0x40)] - // public DynamicArray Unk40; - // public DynamicArray Unk50; + //[SchemaField(0x40)] + //public DynamicArray Unk40; + [SchemaField(0x50)] + public DynamicArray Unk50; // [SchemaField(0x78)] // public Tag Unk78; // [SchemaField(0x80)] @@ -112,7 +113,7 @@ public struct S4F928080 public uint Unk20; [SchemaField(0x40)] public StringHash UnkName1; - public Tag Unk44; + public Tag Unk44; public uint Unk48; } @@ -131,17 +132,42 @@ public struct S5E928080 public long FileSize; public DynamicArray Unk08; public DynamicArray Unk18; - public DynamicArray Unk28; // there's probably another one here + public DynamicArray Unk28; //This sometimes crashes for some reason...? } -[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "6098080", 0x04)] +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "60928080", 0x4)] public struct S60928080 { public Tag Unk00; } -[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "6098080", 0x04)] +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "62948080", 0x58)] public struct S62948080 { - public Tag Unk00; + public long FileSize; + public TigerHash Unk08; //BubbleName? + public TigerHash Unk0C; //ActivityPhaseName? + + [SchemaField(0x38)] + public DynamicArray Unk38; +} + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "64948080", 0x1C)] +public struct S64948080 +{ + [SchemaField(0x8)] + public DynamicArray Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "66948080", 0x4)] +public struct S66948080 +{ + public Tag Unk00; +} + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "68948080", 0x20)] +public struct S68948080 +{ + public long FileSize; + public Tag DataTable; } diff --git a/Tiger/Schema/Activity/ActivityStructsWQ.cs b/Tiger/Schema/Activity/ActivityStructsWQ.cs index 4b527e7e..edc7a48d 100644 --- a/Tiger/Schema/Activity/ActivityStructsWQ.cs +++ b/Tiger/Schema/Activity/ActivityStructsWQ.cs @@ -1,10 +1,12 @@ using Tiger.Schema.Audio; +using Tiger.Schema.Entity; using Tiger.Schema.Strings; namespace Tiger.Schema.Activity.DESTINY2_WITCHQUEEN_6307; [SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "8E8E8080", 0xB4)] [SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "8E8E8080", 0x78)] +[SchemaStruct(TigerStrategy.DESTINY2_LATEST, "8E8E8080", 0x88)] public struct SActivity_WQ { public long FileSize; @@ -23,9 +25,15 @@ public struct SActivity_WQ [SchemaField(0x40, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] public DynamicArray Unk40; public DynamicArray Unk50; + [SchemaField(0x90, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(0x60, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x70, TigerStrategy.DESTINY2_LATEST)] public TigerHash Unk60; public FileHash Unk64; // an entity thing - // public FileHash64 UnkActivity68; // todo this uses an unknown hash64 system in the package + //[SchemaField(0xA0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + //[SchemaField(0x68, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + //[SchemaField(0x78, TigerStrategy.DESTINY2_LATEST)] + //public FileHash64 UnkActivity68; // todo this uses an unknown hash64 system in the package } [SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "8B8E8080", 0xD0)] @@ -108,7 +116,7 @@ public struct D2Class_48898080 public StringPointer DevBubbleName; public TigerHash LocationName; public TigerHash ActivityName; - public TigerHash BubbleName; + public StringHash BubbleName; public TigerHash ActivityPhaseName; public TigerHash ActivityPhaseName2; public Tag UnkEntityReference; @@ -120,7 +128,8 @@ public struct D2Class_898E8080 public long FileSize; public long Unk08; public ResourcePointer Unk10; // 46938080 has dialogue table, 45938080 unk, 19978080 unk - public Tag Unk14; // D2Class_898E8080 entity script stuff + [SchemaField(0x18)] + public Tag Unk18; // D2Class_898E8080 entity script stuff } [SchemaStruct("46938080", 0x58)] @@ -191,15 +200,63 @@ public struct D2Class_C39F8080 public Tag DirectiveTable; } -[SchemaStruct("18978080", 0x20)] -public struct D2Class_18978080 +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "18978080", 0x80)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "18978080", 0x20)] +public struct D2Class_18978080 //uhh { - [Tag64] + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, Obsolete = true)] + [Tag64, SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307)] public Tag DialogueTable; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, Obsolete = true)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307)] public TigerHash Unk10; - [SchemaField(0x18)] + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, Obsolete = true)] + [SchemaField(0x18, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] public TigerHash Unk18; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, Obsolete = true)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307)] public int Unk1C; + + //Beyond Light only below + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public int Unk00BL; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public TigerHash Unk04BL; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public TigerHash Unk08BL; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public TigerHash Unk0CBL; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public TigerHash Unk10BL; + + [Tag64, SchemaField(0x28, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public Tag Unk28BL; + + [SchemaField(TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public DynamicArray Unk38BL; + + [Tag64, SchemaField(0x50, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public Tag Unk50BL; + + [Tag64, SchemaField(0x68, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] + public Tag Unk68BL; } [SchemaStruct("17978080", 0x20)] @@ -562,4 +619,26 @@ public struct SUnkMusicE8BF8080 public TigerHash Unk24; } +[SchemaStruct("BE8E8080", 0x20)] +public struct D2Class_BE8E8080 +{ + public long FileSize; + public DynamicArray EntityResources; +} + +[SchemaStruct("42898080", 0x4)] +public struct D2Class_42898080 +{ + public Tag EntityResourceParent; +} + +[SchemaStruct("43898080", 0x28)] +public struct D2Class_43898080 +{ + public long FileSize; + public TigerHash Unk08; + [SchemaField(0x20)] + public EntityResource EntityResource; +} + #endregion diff --git a/Tiger/Schema/Entity/Entity.cs b/Tiger/Schema/Entity/Entity.cs index ddfd7aa0..6fcf5829 100644 --- a/Tiger/Schema/Entity/Entity.cs +++ b/Tiger/Schema/Entity/Entity.cs @@ -120,4 +120,47 @@ public bool HasGeometry() } return Model != null; } + + public List GetEntityChildren() + { + lock (_lock) + { + if (!_loaded) + { + Load(); + } + } + + List entities = new List(); + foreach (var resource in _tag.EntityResources.Select(GetReader(), r => r.Resource)) + { + //Weird to have to get Unk10 first to be able to get Unk18 + //Trying to get Unk18 directly just crashes + switch (resource.TagData.Unk10.GetValue(resource.GetReader())) + { + case D2Class_12848080: + foreach (var entry in ((D2Class_0E848080)resource.TagData.Unk18.GetValue(resource.GetReader())).Unk88) + { + foreach (var entry2 in entry.Unk08) + { + if (entry2.Unk08 is null) + continue; + + Entity entity = FileResourcer.Get().GetFile(entry2.Unk08.Hash); + if(entity.HasGeometry()) + { + entities.Add(entity); + //Just in case + foreach (var child in entity.GetEntityChildren()) + { + entities.Add(child); + } + } + } + } + break; + } + } + return entities; + } } diff --git a/Tiger/Schema/Entity/EntityModel.cs b/Tiger/Schema/Entity/EntityModel.cs index d19f55d9..aea00ccd 100644 --- a/Tiger/Schema/Entity/EntityModel.cs +++ b/Tiger/Schema/Entity/EntityModel.cs @@ -101,6 +101,12 @@ private List GenerateParts(Dictionary materials = new(); - if (Strategy.CurrentStrategy >= TigerStrategy.DESTINY2_WITCHQUEEN_6307) + + var map = ((D2Class_8F6D8080)parentResource.TagData.Unk18.GetValue(reader)).ExternalMaterialsMap; + var mats = ((D2Class_8F6D8080)parentResource.TagData.Unk18.GetValue(reader)).ExternalMaterials; + if (map.Count == 0 || mats.Count == 0) { - var map = ((D2Class_8F6D8080)parentResource.TagData.Unk18.GetValue(reader)).ExternalMaterialsMapWQ; - var mats = ((D2Class_8F6D8080)parentResource.TagData.Unk18.GetValue(reader)).ExternalMaterials; - if (map.Count == 0 || mats.Count == 0) - { - return null; - } - if (externalMaterialIndex >= map.Count) - return null; // todo this is actually wrong ig... - - var mapEntry = map[reader, externalMaterialIndex]; - // For now we'll just set as the first material in the array - for (int i = mapEntry.MaterialStartIndex; i < mapEntry.MaterialStartIndex + mapEntry.MaterialCount; i++) - { - materials.Add(mats[reader, i].Material); - } - } - else - { - return null; // todo shadowkeep + return null; } + if (variantShaderIndex >= map.Count) + return null; // todo this is actually wrong ig...s + + var mapEntry = map[reader, variantShaderIndex]; - return materials[0]; + return mats[reader, mapEntry.MaterialStartIndex + (0 % mapEntry.MaterialCount)].Material; } public static void AddVertexColourSlotInfo(DynamicMeshPart dynamicPart, short w) diff --git a/Tiger/Schema/Entity/EntityStructs.cs b/Tiger/Schema/Entity/EntityStructs.cs index b9509c37..1602ead7 100644 --- a/Tiger/Schema/Entity/EntityStructs.cs +++ b/Tiger/Schema/Entity/EntityStructs.cs @@ -118,7 +118,8 @@ public struct D2Class_6E908080 * could be these external materials are dynamic themselves - we'll extract them all but select the first */ [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "BD728080", 0x340)] -[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "8F6D8080", 0x450)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "8F6D8080", 0x3E0)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "8F6D8080", 0x450)] public struct D2Class_8F6D8080 { [SchemaField(0x1DC, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] @@ -126,14 +127,16 @@ public struct D2Class_8F6D8080 public EntityModel Model; [SchemaField(0x310, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] // todo shadowkeep, beyond light public Tag TexturePlates; - // todo there might be a nice way to combine these two and namespace the struct, and instead use properties not fields? would mean all the mess is in the data side not the logic, basically mapping one onto the other. Possible to make it so everything maps onto the latest given, so it only needs to be done for older versions. - [SchemaField(0x300, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] - [SchemaField(0x398, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] - [SchemaField(TigerStrategy.DESTINY2_WITCHQUEEN_6307, Obsolete = true)] - public DynamicArrayUnloaded ExternalMaterialsMapSK; + [SchemaField(0x2D0, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x360, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] [SchemaField(0x3C0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] - public DynamicArrayUnloaded ExternalMaterialsMapWQ; + public DynamicArrayUnloaded ExternalMaterialsMap; + + [SchemaField(0x300, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x398, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + [SchemaField(0x3F0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + public DynamicArrayUnloaded Unk3F0; [SchemaField(0x310, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] [SchemaField(0x3A0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] @@ -246,16 +249,17 @@ public struct D2Class_939E8080 [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "C5728080", 0x8)] [SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "986D8080", 0x8)] -public struct SExternalMaterialMapEntrySK +public struct D2Class_986D8080 { - public ushort MaterialCount; - public ushort MaterialStartIndex; - public ushort Unk04; // maybe some kind of LOD or dynamic marker + public ushort Unk00; + public ushort Unk02; + public ushort Unk04; public ushort Unk06; } -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "976D8080", 0xC)] -public struct SExternalMaterialMapEntryWQ +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "C4728080", 0xC)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "976D8080", 0xC)] +public struct SExternalMaterialMapEntry { public int MaterialCount; public int MaterialStartIndex; @@ -322,7 +326,7 @@ public struct D2Class_DC818080 } [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "759F8080", 0x20)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "4F9F8080", 0x20)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "4F9F8080", 0x20)] public struct D2Class_4F9F8080 { public Tiger.Schema.Vector4 Rotation; @@ -817,6 +821,7 @@ public struct D2Class_1D848080 { public int Unk00; public int Unk04; + [Tag64] public Tag Unk08; public int Unk0C; public int Unk10; @@ -1223,6 +1228,9 @@ public struct D2Class_F62C8080 [SchemaStruct(TigerStrategy.DESTINY2_LATEST, "F42C8080", 0x358)] public struct D2Class_F42C8080 { + [SchemaField(0x188, TigerStrategy.DESTINY2_LATEST)] + public ResourcePointer Unk188; + [SchemaField(0x2C8, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] [SchemaField(0x2E8, TigerStrategy.DESTINY2_LATEST)] public DynamicArray PatternAudioGroups; @@ -1284,6 +1292,9 @@ public struct D2Class_FA2C8080 //[SchemaField(0x1A8)] //public int Unk1A8; //public float Unk1AC; + [SchemaField(0x118, TigerStrategy.DESTINY2_LATEST)] + public ResourcePointer Unk118; + [SchemaField(0x1C0, TigerStrategy.DESTINY2_WITCHQUEEN_6307), Tag64] [SchemaField(0x1D0, TigerStrategy.DESTINY2_LATEST), Tag64] public Tag Unk1C0; @@ -1363,33 +1374,166 @@ public struct D2Class_E3918080 { } +[SchemaStruct("0A2D8080", 0x4C)] +public struct D2Class_0A2D8080 +{ + [SchemaField(0x8), Tag64] + public Entity? Unk08; + [SchemaField(0x20), Tag64] + public Entity? Unk20; + [SchemaField(0x38), Tag64] + public Entity? Unk38; +} + #endregion -[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2999, "7F6B8080", 0x1C0)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "95668080", 0x1E0)] +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "7F6B8080", 0x1C0)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "95668080", 0x1E0)] public struct CubemapResource //Dataresource for cubemaps { [SchemaField(0x20)] public Vector4 CubemapSize; //XYZ, no W public Vector4 CubemapPosition; //Cubemap texture lines up with this one - [SchemaField(0xF0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0xF0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public Vector4 UnkF0; //This might actually be position? Similar to other but in GDC image this one looked more correct - [SchemaField(0x140, TigerStrategy.DESTINY2_SHADOWKEEP_2999)] - [SchemaField(0x100, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x140, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x100, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public Vector4 CubemapRotation; - [SchemaField(0x190, TigerStrategy.DESTINY2_SHADOWKEEP_2999)] - [SchemaField(0x1B0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x190, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x1B0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public StringPointer CubemapName; - [SchemaField(0x198, TigerStrategy.DESTINY2_SHADOWKEEP_2999)] - [SchemaField(0x1B8, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x198, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x1B8, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public Texture CubemapTexture; - [SchemaField(0x1A0, TigerStrategy.DESTINY2_SHADOWKEEP_2999)] - [SchemaField(0x1C0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x1A0, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0x1C0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public Texture Unk1C0; //Sometype of reflection tint texture idk } + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "D99B8080", 0x190)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "D8928080", 0x190)] +public struct D2Class_D8928080 +{ + //[DestinyOffset(0x10)] + //public DestinyHash Unk10; + //public DestinyHash Unk14; + //public DestinyHash Unk18; + //public DestinyHash Unk1C; + //public DestinyHash Unk20; + //public DestinyHash Unk24; + //[SchemaField(0x68)] + //public DynamicArray Unk68; + [SchemaField(0x84)] + public Tag Unk84; + [SchemaField(0x90)] + public Vector4 Rotation; + public Vector4 Translation; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "EF8C8080", 0x60)] +public struct D2Class_EF8C8080 +{ + [SchemaField(0x58)] + public Tag Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "FA988080", 0x80)] +public struct D2Class_FA988080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "F88C8080", 0x80)] +public struct D2Class_F88C8080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "EF988080", 0x80)] +public struct D2Class_EF988080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "6F418080", 0xE0)] +public struct D2Class_6F418080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "26988080", 0x98)] +public struct D2Class_26988080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "95468080", 0x90)] +public struct D2Class_95468080 +{ + [SchemaField(0x28)] + public TigerHash FNVHash; + [SchemaField(0x30)] + public ulong WorldID; + [SchemaField(0x58)] + public DynamicArray Unk58; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "05998080", 0x10)] +public struct D2Class_05998080 +{ + public TigerHash FNVHash; + [SchemaField(0x8)] + public ulong WorldID; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "6B908080", 0x28)] +public struct D2Class_6B908080 +{ + [SchemaField(0x8)] + public DynamicArray Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "029D8080", 0x10)] +public struct D2Class_029D8080 +{ + public ResourceInTablePointer Unk00; + public RelativePointer Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "4D898080", 0xC)] +public struct D2Class_4D898080 +{ + public StringPointer Name; +} + diff --git a/Tiger/Schema/Investment/InvestmentHandler.cs b/Tiger/Schema/Investment/InvestmentHandler.cs index 326f86f8..35cd649e 100644 --- a/Tiger/Schema/Investment/InvestmentHandler.cs +++ b/Tiger/Schema/Investment/InvestmentHandler.cs @@ -342,7 +342,7 @@ private Entity.Entity GetEntityFromAssignmentHash(TigerHash assignmentHash) // var index = _entityAssignmentsMap.TagData.EntityArrangementMap.BinarySearch(x, new D2Class_454F8080()); Tag tag = _sortedArrangementHashmap[assignmentHash]; tag.Load(); - if (tag.TagData.EntityData is null) + if (tag.TagData.EntityData.IsInvalid() || tag.TagData.EntityData is null) return null; // if entity if (tag.TagData.EntityData.GetReferenceHash() == 0x80809ad8) diff --git a/Tiger/Schema/Model/VertexBuffer.cs b/Tiger/Schema/Model/VertexBuffer.cs index a6c07e13..c67b8341 100644 --- a/Tiger/Schema/Model/VertexBuffer.cs +++ b/Tiger/Schema/Model/VertexBuffer.cs @@ -338,7 +338,9 @@ private bool ReadVertexDataType5(TigerReader handle, MeshPart part) // it can be longer here, its not broken i think if (handle.BaseStream.Length <= handle.BaseStream.Position) { - part.VertexColours.Add(new Vector4(0, 0, 0, 0)); + handle.BaseStream.Position = handle.BaseStream.Length-4; + part.VertexColours.Add(new Vector4(handle.ReadByte(), handle.ReadByte(), handle.ReadByte(), + handle.ReadByte())); } else { @@ -381,7 +383,7 @@ private bool ReadVertexDataType6(TigerReader handle, DynamicMeshPart dynamicPart */ // new code vvv - VertexWeight vw = new(); + VertexWeight vw = new VertexWeight(); short w = (short)dynamicPart.VertexPositions[dynamicPart.VertexIndexMap[vertexIndex]].W; if (w >= 0 && w < 0x800) { @@ -399,7 +401,7 @@ private bool ReadVertexDataType6(TigerReader handle, DynamicMeshPart dynamicPart } else { - chunkIndex = w - 0x800; // remove the flag + chunkIndex = w - 0x800; // remove the flag weightCount = 2; } @@ -415,17 +417,25 @@ private bool ReadVertexDataType6(TigerReader handle, DynamicMeshPart dynamicPart } else { + // always the first two weights valid then the second group can be one or two handle.BaseStream.Seek(chunkIndex * 0x20 + (vertexIndex % 4) * 8, SeekOrigin.Begin); - vw.WeightValues = new IntVector4(handle.ReadByte(), handle.ReadByte(), handle.ReadByte(), - handle.ReadByte()); - if (vw.WeightValues.X + vw.WeightValues.Y + vw.WeightValues.Z == 255) + vw.WeightIndices = new IntVector4(handle.ReadByte(), handle.ReadByte(), 0, 0); + vw.WeightValues = new IntVector4(handle.ReadByte(), handle.ReadByte(), 0, 0); + // if (vw.WeightValues.X + vw.WeightValues.Y + vw.WeightValues.Z == 255) + // { + // vw.WeightValues.W = 0; + // } + vw.WeightIndices.Z = handle.ReadByte(); + vw.WeightIndices.W = handle.ReadByte(); + vw.WeightValues.Z = handle.ReadByte(); + if (vw.WeightIndices.Z == vw.WeightIndices.W) { - vw.WeightValues.W = 0; + vw.WeightIndices.W = 0; + } + else + { + vw.WeightValues.W = handle.ReadByte(); } - - vw.WeightIndices = new IntVector4(handle.ReadByte(), handle.ReadByte(), handle.ReadByte(), - handle.ReadByte()); - // Debug.Assert(vw.WeightValues.X + vw.WeightValues.Y + vw.WeightValues.Z + vw.WeightValues.W == 255); dynamicPart.VertexWeights.Add(vw); } @@ -438,32 +448,42 @@ private bool ReadVertexDataType6(TigerReader handle, DynamicMeshPart dynamicPart } public void ReadVertexDataSignatures(MeshPart part, HashSet uniqueVertexIndices, - List inputSignatures) + List inputSignatures, bool isTerrain = false) { using var reader = GetReferenceReader(); foreach (uint vertexIndex in uniqueVertexIndices) { - ReadVertexDataSignature(reader, part, vertexIndex, inputSignatures); + ReadVertexDataSignature(reader, part, vertexIndex, inputSignatures, isTerrain); } } private void ReadVertexDataSignature(TigerReader reader, MeshPart part, uint vertexIndex, - List inputSignatures) + List inputSignatures, bool isTerrain = false) { reader.Seek(vertexIndex * _tag.Stride, SeekOrigin.Begin); + foreach (InputSignature inputSignature in inputSignatures) { switch (inputSignature.Semantic) { case InputSemantic.Position: - part.VertexPositions.Add(new Vector4(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), - reader.ReadInt16(), true)); + if(isTerrain) //has to be a float + { + part.VertexPositions.Add(new Vector4((float)reader.ReadInt16(), (float)reader.ReadInt16(), (float)reader.ReadInt16(), + (float)reader.ReadInt16())); + } + else + part.VertexPositions.Add(new Vector4(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), + reader.ReadInt16())); break; case InputSemantic.Texcoord: switch (inputSignature.Mask) { case ComponentMask.XY: - part.VertexTexcoords0.Add(new Vector2(reader.ReadInt16(), reader.ReadInt16())); + if(isTerrain) + part.VertexTexcoords0.Add(new Vector2(reader.ReadHalf(), reader.ReadHalf())); + else + part.VertexTexcoords0.Add(new Vector2(reader.ReadInt16(), reader.ReadInt16())); break; case ComponentMask.XYZW: part.VertexTexcoords0.Add(new Vector2(reader.ReadInt16(), reader.ReadInt16())); @@ -515,6 +535,17 @@ private void ReadVertexDataSignature(TigerReader reader, MeshPart part, uint ver part.VertexColours.Add(new Vector4(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte())); break; + case InputSemantic.BlendIndices: + //Indices get set in BlendWeight + break; + case InputSemantic.BlendWeight: + //VertexWeight vw = new() + //{ + // WeightIndices = new IntVector4(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte()), + // WeightValues = new IntVector4(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte()), + //}; + //(part as DynamicMeshPart).VertexWeights.Add(vw); + break; default: throw new NotImplementedException(); } diff --git a/Tiger/Schema/Shaders/DirectXTexUtil.cs b/Tiger/Schema/Shaders/DirectXTexUtil.cs index b1a83307..143749c1 100644 --- a/Tiger/Schema/Shaders/DirectXTexUtil.cs +++ b/Tiger/Schema/Shaders/DirectXTexUtil.cs @@ -906,19 +906,19 @@ public static byte[] EncodeDDSHeader(DDSHeader header, DX10Header dx10Header) /// Compression Format /// Whether or not this is a cube map /// Resulting TexMetaData Object - public static TexMetadata GenerateMetaData(int width, int height, int mipMapLevels, DXGIFormat format, bool isCubeMap) + public static TexMetadata GenerateMetaData(int width, int height, int depth, int mipMapLevels, DXGIFormat format, bool isCubeMap) { // Create Texture MetaData return new TexMetadata( width, height, - 1, + depth, isCubeMap ? 6 : 1, mipMapLevels, isCubeMap ? TexMiscFlags.TEXTURECUBE : 0, 0, format, - TexDimension.TEXTURE2D + depth == 1 ? TexDimension.TEXTURE2D : TexDimension.TEXTURE3D ); } diff --git a/Tiger/Schema/Shaders/Material.cs b/Tiger/Schema/Shaders/Material.cs index 7d942d94..4f8df672 100644 --- a/Tiger/Schema/Shaders/Material.cs +++ b/Tiger/Schema/Shaders/Material.cs @@ -47,6 +47,7 @@ public struct Output public interface IMaterial : ISchema { public FileHash FileHash { get; } + public uint Unk0C { get; } //Seems to be backface culling public IEnumerable EnumerateVSTextures(); public IEnumerable EnumeratePSTextures(); public ShaderBytecode? VertexShader { get; } @@ -60,6 +61,7 @@ public interface IMaterial : ISchema public DynamicArray Unk2D0 { get; } public DynamicArray Unk2E0 { get; } public DynamicArray Unk300 { get; } + public static object _lock = new object(); private static ConfigSubsystem _config = CharmInstance.GetSubsystem(); @@ -123,8 +125,8 @@ public void SavePixelShader(string saveDirectory, bool isTerrain = false) { if (PixelShader != null && PixelShader.Hash.IsValid()) { - string pixel = Decompile(PixelShader.GetBytecode(), $"ps{FileHash}"); - string vertex = Decompile(VertexShader.GetBytecode(), $"vs{FileHash}"); + string pixel = Decompile(PixelShader.GetBytecode(), $"ps{PixelShader.Hash}"); + string vertex = Decompile(VertexShader.GetBytecode(), $"vs{VertexShader.Hash}"); string usf = _config.GetUnrealInteropEnabled() ? new UsfConverter().HlslToUsf(this, pixel, false) : ""; string vfx = Source2Handler.source2Shaders ? new S2ShaderConverter().HlslToVfx(this, pixel, vertex, isTerrain) : ""; @@ -144,9 +146,9 @@ public void SavePixelShader(string saveDirectory, bool isTerrain = false) { File.WriteAllText($"{saveDirectory}/Unreal/PS_{FileHash}.usf", usf); } - if (vfx != String.Empty && !File.Exists($"{saveDirectory}/Source2/PS_{FileHash}.shader")) + if (vfx != String.Empty && !File.Exists($"{saveDirectory}/Source2/PS_{PixelShader.Hash}.shader")) { - File.WriteAllText($"{saveDirectory}/Source2/PS_{FileHash}.shader", vfx); + File.WriteAllText($"{saveDirectory}/Source2/PS_{PixelShader.Hash}.shader", vfx); } } catch (IOException) // threading error @@ -164,8 +166,8 @@ public void SaveVertexShader(string saveDirectory) Directory.CreateDirectory($"{saveDirectory}"); if (VertexShader != null && VertexShader.Hash.IsValid()) { - string hlsl = Decompile(VertexShader.GetBytecode(), $"vs{FileHash}"); - string usf = new UsfConverter().HlslToUsf(this, hlsl, true); + string hlsl = Decompile(VertexShader.GetBytecode(), $"vs{VertexShader.Hash}"); + string usf = _config.GetUnrealInteropEnabled() ? new UsfConverter().HlslToUsf(this, hlsl, true) : ""; if (usf != String.Empty) { try @@ -200,6 +202,7 @@ namespace Tiger.Schema.Shaders.DESTINY2_SHADOWKEEP_2601 public class Material : Tag, IMaterial { public FileHash FileHash => Hash; + public uint Unk0C => _tag.Unk0C; public ShaderBytecode VertexShader => _tag.VertexShader; public ShaderBytecode PixelShader => _tag.PixelShader; public FileHash PSVector4Container => _tag.PSVector4Container; @@ -239,6 +242,7 @@ namespace Tiger.Schema.Shaders.DESTINY2_BEYONDLIGHT_3402 public class Material : Tag, IMaterial { public FileHash FileHash => Hash; + public uint Unk0C => _tag.Unk0C; public ShaderBytecode VertexShader => _tag.VertexShader; public ShaderBytecode PixelShader => _tag.PixelShader; public FileHash PSVector4Container => _tag.PSVector4Container; @@ -279,6 +283,7 @@ namespace Tiger.Schema.Shaders.DESTINY2_WITCHQUEEN_6307 public class Material : Tag, IMaterial { public FileHash FileHash => Hash; + public uint Unk0C => _tag.Unk0C; public ShaderBytecode VertexShader => _tag.VertexShader; public ShaderBytecode PixelShader => _tag.PixelShader; public FileHash PSVector4Container => _tag.PSVector4Container; diff --git a/Tiger/Schema/Shaders/S2ShaderConverter.cs b/Tiger/Schema/Shaders/S2ShaderConverter.cs index f431c6dd..ebdac4a0 100644 --- a/Tiger/Schema/Shaders/S2ShaderConverter.cs +++ b/Tiger/Schema/Shaders/S2ShaderConverter.cs @@ -1,7 +1,9 @@ using System; using System.Diagnostics; +using System.Linq; using System.Runtime.InteropServices; using System.Text; +using System.Text.RegularExpressions; using Tiger; using Tiger.Schema; using Tiger.Schema.Shaders; @@ -20,8 +22,10 @@ public class S2ShaderConverter private readonly List outputs = new List(); private static bool isTerrain = false; private bool bOpacityEnabled = false; + private bool bTranslucent = true; private bool bUsesFrontFace = false; private bool bFixRoughness = false; + private bool bUsesNormalBuffer = false; public string vfxStructure = $@"HEADER @@ -68,7 +72,7 @@ struct VertexInput struct PixelInput {{ float4 vBlendValues : TEXCOORD14; - float3 o0 : TEXCOORD15; + float3 v5 : TEXCOORD15; //terrain specific #include ""common/pixelinput.hlsl"" }}; @@ -82,15 +86,15 @@ struct PixelInput //vs_CBuffers //vs_Inputs - PixelInput MainVs( INSTANCED_SHADER_PARAMS( VS_INPUT i ) ) + PixelInput MainVs( VertexInput i ) {{ PixelInput o = ProcessVertex( i ); - float4 o0,o1,o2,o3,o4,o5,o6,o7,o8; + float4 r0,r1,r2; o.vBlendValues = i.vColorBlendValues; o.vBlendValues.a = i.vColorBlendValues.a; //vs_Function - {(isTerrain ? "float4 r0;\r\n r0.xyzw = (int4)float4(i.vPositionOs.xyz,0);\r\n r0.xyzw = float4(0,0,0,0) + r0.xyzw;\r\n r0.z = r0.w * 65536 + r0.z;\r\n r0.xyw = float3(0.015625,0.015625,0.000122070313) * r0.xyz;\r\n o.o0.xyz = r0.xyw;" : "")} + {(isTerrain ? " r1.xyz = abs(i.vNormalOs.xyz) * abs(i.vNormalOs.xyz);\r\n r1.xyz = r1.xyz * r1.xyz;\r\n r2.xyz = r1.xyz * r1.xyz;\r\n r2.xyz = r2.xyz * r2.xyz;\r\n r1.xyz = r2.xyz * r1.xyz;\r\n r0.z = dot(r1.xyz, float3(1,1,1));\r\n o.v5.xyz = r1.xyz / r0.zzz;" : "")} return FinalizeVertex( o ); }} }} @@ -109,15 +113,6 @@ PixelInput MainVs( INSTANCED_SHADER_PARAMS( VS_INPUT i ) ) #define FinalOutput float4 #endif - //Debugs, uncomment for use in shader baker - //bool g_bDiffuse < Attribute( ""Debug_Diffuse"" ); >; - //bool g_bRough < Attribute( ""Debug_Rough"" ); >; - //bool g_bMetal < Attribute( ""Debug_Metal"" ); >; - //bool g_bNorm < Attribute( ""Debug_Normal"" ); >; - //bool g_bAO < Attribute( ""Debug_AO"" ); >; - //bool g_bEmit < Attribute( ""Debug_Emit"" ); >; - //bool g_bAlpha < Attribute( ""Debug_Alpha"" ); >; - //ps_samplers //ps_CBuffers //ps_Inputs @@ -126,68 +121,7 @@ FinalOutput MainPs( PixelInput i ) : SV_Target0 {{ //ps_Function - // Normal - float3 biased_normal = o1.xyz - float3(0.5, 0.5, 0.5); - float normal_length = length(biased_normal); - float3 normal_in_world_space = biased_normal / normal_length; - - float smoothness = saturate(8 * (normal_length - 0.375)); - - Material mat = Material::From(i, - float4(o0.xyz, alpha), //albedo, alpha - float4(0.5, 0.5, 1, 1), //Normal, gets set later - float4(1 - smoothness, saturate(o2.x), saturate(o2.y * 2), 1), //rough, metal, ao - float3(1.0f, 1.0f, 1.0f), //tint - clamp((o2.y - 0.5) * 2 * 6 * o0.xyz, 0, 100)); //emission - - mat.Transmission = o2.z; - mat.Normal = normal_in_world_space; //Normal is already in world space so no need to convert in Material::From - - //if(g_bDiffuse) - //{{ - // mat.Albedo = 0; - // mat.Emission = o0.xyz; - //}} - //if(g_bRough) - //{{ - // mat.Albedo = 0; - // mat.Emission = 1 - smoothness; - //}} - //if(g_bMetal) - //{{ - // mat.Albedo = 0; - // mat.Emission = saturate(o2.x); - //}} - //if(g_bNorm) - //{{ - // mat.Albedo = 0; - // mat.Emission = SrgbGammaToLinear(PackNormal3D(Vec3WsToTs(normal_in_world_space.xyz, i.vNormalWs.xyz, vTangentUWs.xyz, vTangentVWs.xyz))); - //}} - //if(g_bAO) - //{{ - // mat.Albedo = 0; - // mat.Emission = saturate(o2.y * 2); - //}} - //if(g_bEmit) - //{{ - // mat.Albedo = 0; - // mat.Emission = (o2.y - 0.5); - //}} - //if(g_bAlpha) - //{{ - // mat.Albedo = 0; - // mat.Emission = alpha; - //}} - - #if ( S_MODE_REFLECTIONS ) - {{ - return Reflections::From( i, mat, SampleCountIntersection ); - }} - #else - {{ - return ShadingModelStandard::Shade(i, mat); - }} - #endif +//ps_output }} }}"; @@ -201,13 +135,9 @@ public string HlslToVfx(IMaterial material, string pixel, string vertex, bool bI ProcessHlslData(); - if (bOpacityEnabled) //This way is stupid but it works - vfxStructure = vfxStructure.Replace("//alpha", "#ifndef S_ALPHA_TEST\r\n\t#define S_ALPHA_TEST 1\r\n\t#endif\r\n\t#ifndef S_TRANSLUCENT\r\n\t#define S_TRANSLUCENT 0\r\n\t#endif"); - if (bUsesFrontFace) { vfxStructure = vfxStructure.Replace("//frontface", "#define S_RENDER_BACKFACES 1"); - vfxStructure = vfxStructure.Replace("//RenderState", "RenderState( CullMode, S_RENDER_BACKFACES ? NONE : DEFAULT );"); } for (int i = 0; i < material.PS_Samplers.Count; i++) @@ -223,7 +153,7 @@ public string HlslToVfx(IMaterial material, string pixel, string vertex, bool bI vfxStructure = vfxStructure.Replace("//ps_CBuffers", WriteCbuffers(material, false).ToString()); hlsl = new StringReader(pixel); - StringBuilder instructions = ConvertInstructions(false); + StringBuilder instructions = ConvertInstructions(material, false); if (instructions.ToString().Length == 0) { return ""; @@ -231,38 +161,40 @@ public string HlslToVfx(IMaterial material, string pixel, string vertex, bool bI vfxStructure = vfxStructure.Replace("//ps_Function", instructions.ToString()); vfxStructure = vfxStructure.Replace("//ps_Inputs", WriteFunctionDefinition(material, false).ToString()); - if (bFixRoughness) - vfxStructure = vfxStructure.Replace("float smoothness = saturate(8 * (normal_length - 0.375));", "float smoothness = saturate(8 * (0 - 0.375));"); + if (bOpacityEnabled || bTranslucent) //This way is stupid but it works + { + vfxStructure = vfxStructure.Replace("//alpha", $"#ifndef S_ALPHA_TEST\r\n\t#define S_ALPHA_TEST {((bUsesNormalBuffer || bTranslucent) ? "0" : "1")}\r\n\t#endif\r\n\t#ifndef S_TRANSLUCENT\r\n\t#define S_TRANSLUCENT {((bUsesNormalBuffer || bTranslucent) ? "1" : "0")}\r\n\t#endif"); + if (bTranslucent) + vfxStructure = vfxStructure.Replace("FinalOutput MainPs", "float4 MainPs"); + } + + vfxStructure = vfxStructure.Replace("//ps_output", AddOutput(material).ToString()); //------------------------------------------------------------------------------ //Vertex Shader - Commented out for now - //if(bIsTerrain) - //{ - // texSamples = new StringBuilder(); - // hlsl = new StringReader(vertex); + //texSamples = new StringBuilder(); + //hlsl = new StringReader(vertex); - // ProcessHlslData(); + //ProcessHlslData(); - // for (int i = 0; i < material.Header.VSSamplers.Count; i++) - // { - // if (material.Header.VSSamplers[i].Samplers is null) - // continue; - - // var sampler = material.Header.VSSamplers[i].Samplers.Sampler; - // texSamples.AppendLine($"SamplerState g_s{i + 1} < Filter({sampler.Header.Filter}); AddressU({sampler.Header.AddressU}); AddressV({sampler.Header.AddressV}); AddressW({sampler.Header.AddressW}); ComparisonFunc({sampler.Header.ComparisonFunc}); MaxAniso({sampler.Header.MaxAnisotropy}); >;"); - // } + //for (int i = 0; i < material.VS_Samplers.Count; i++) + //{ + // if (material.VS_Samplers[i] is null) + // continue; - // vfxStructure = vfxStructure.Replace("//vs_samplers", texSamples.ToString()); + // var sampler = material.VS_Samplers[i].Sampler; + // texSamples.AppendLine($"SamplerState g_s{i + 1} < Filter({sampler.Filter}); AddressU({sampler.AddressU}); AddressV({sampler.AddressV}); AddressW({sampler.AddressW}); ComparisonFunc({sampler.ComparisonFunc}); MaxAniso({sampler.MaxAnisotropy}); >;"); + //} - // vfxStructure = vfxStructure.Replace("//vs_Inputs", WriteFunctionDefinition(material, true).ToString()); - // vfxStructure = vfxStructure.Replace("//vs_CBuffers", WriteCbuffers(material, true).ToString()); + //vfxStructure = vfxStructure.Replace("//vs_samplers", texSamples.ToString()); - // hlsl = new StringReader(vertex); - // instructions = ConvertInstructions(true); - // vfxStructure = vfxStructure.Replace("//vs_Function", instructions.ToString()); + //vfxStructure = vfxStructure.Replace("//vs_Inputs", WriteFunctionDefinition(material, true).ToString()); + //vfxStructure = vfxStructure.Replace("//vs_CBuffers", WriteCbuffers(material, true).ToString()); - //} + //hlsl = new StringReader(vertex); + //instructions = ConvertInstructions(material, true); + //vfxStructure = vfxStructure.Replace("//vs_Function", instructions.ToString()); //-------------------------- vfx.AppendLine(vfxStructure); @@ -356,8 +288,7 @@ private void ProcessHlslData() private StringBuilder WriteCbuffers(IMaterial material, bool bIsVertexShader) { StringBuilder CBuffers = new(); - // Try to find matches, pixel shader has Unk2D0, Unk2E0, Unk300 available - // Vertex has Unk90, UnkA0, UnkC0 + foreach (var buffer in buffers) { CBuffers.AppendLine($"\tBuffer<{buffer.Type}> b_{buffer.Variable} : register({buffer.Variable});"); @@ -365,105 +296,23 @@ private StringBuilder WriteCbuffers(IMaterial material, bool bIsVertexShader) foreach (var cbuffer in cbuffers) { - CBuffers.AppendLine($"\tstatic {cbuffer.Type} {cbuffer.Variable}[{cbuffer.Count}] = ").AppendLine("\t{"); + //CBuffers.AppendLine($"\tstatic {cbuffer.Type} {cbuffer.Variable}[{cbuffer.Count}] = ").AppendLine("\t{"); dynamic data = null; if (bIsVertexShader) { - if (cbuffer.Count == material.Unk90.Count) - { - data = material.Unk90; - } - else if (cbuffer.Count == material.UnkA0.Count) - { - data = material.UnkA0; - } - else if (cbuffer.Count == material.UnkC0.Count) + for (int i = 0; i < cbuffer.Count; i++) { - data = material.UnkC0; + CBuffers.AppendLine($"\tfloat4 vs_cb{cbuffer.Index}_{i} < Default4( 0.0f, 0.0f, 0.0f, 0.0f ); UiGroup( \"vs_cb{cbuffer.Index}/{i}\"); >;"); } } else { - //if (cbuffer.Count == material.Header.Unk2D0.Count) Unk2D0 is byte, not float, so not a cbuffer? - //{ - // data = material.Header.Unk2D0; - //} - if (cbuffer.Count == material.Unk2E0.Count) - { - data = material.Unk2E0; - } - else if (cbuffer.Count == material.Unk300.Count) - { - data = material.Unk300; - } - else - { - if (material.PSVector4Container.IsValid()) - { - // Try the Vector4 storage file - TigerFile container = new(material.PSVector4Container.GetReferenceHash()); - byte[] containerData = container.GetData(); - int num = containerData.Length / 16; - if (cbuffer.Count == num) - { - List float4s = new(); - for (int i = 0; i < containerData.Length / 16; i++) - { - float4s.Add(containerData.Skip(i * 16).Take(16).ToArray().ToType()); - } - - data = float4s; - } - } - - } - } - - for (int i = 0; i < cbuffer.Count; i++) - { - switch (cbuffer.Type) + for (int i = 0; i < cbuffer.Count; i++) { - case "float4": - if (data == null) CBuffers.AppendLine(" float4(0.0, 0.0, 0.0, 0.0), //null" + i); - else - { - try - { - if (data[i] is Vec4) - { - CBuffers.AppendLine($"\t\tfloat4({data[i].Vec.X}, {data[i].Vec.Y}, {data[i].Vec.Z}, {data[i].Vec.W}), //" + i); - } - else if (data[i] is Vector4) - { - CBuffers.AppendLine($"\t\tfloat4({data[i].X}, {data[i].Y}, {data[i].Z}, {data[i].W}), //" + i); - } - else - { - var x = data[i].Unk00.X; // really bad but required - - CBuffers.AppendLine($"\t\tfloat4({x}, {data[i].Unk00.Y}, {data[i].Unk00.Z}, {data[i].Unk00.W}), //" + i); - } - } - catch (Exception e) // figure out whats up here, taniks breaks it - { - CBuffers.AppendLine("\t\tfloat4(0.0, 0.0, 0.0, 0.0), //Exception" + i); - } - } - break; - case "float3": - if (data == null) CBuffers.AppendLine("\t\tfloat3(0.0, 0.0, 0.0), //null" + i); - else CBuffers.AppendLine($"\t\tfloat3({data[i].Unk00.X}, {data[i].Unk00.Y}, {data[i].Unk00.Z}), //" + i); - break; - case "float": - if (data == null) CBuffers.AppendLine("\t\tfloat(0.0), //null" + i); - else CBuffers.AppendLine($"\t\tfloat4({data[i].Unk00}), //" + i); - break; - default: - throw new NotImplementedException(); + CBuffers.AppendLine($"\tfloat4 cb{cbuffer.Index}_{i} < Default4( 0.0f, 0.0f, 0.0f, 0.0f ); UiGroup( \"cb{cbuffer.Index}/{i}\"); >;"); } } - CBuffers.AppendLine("\t};"); } return CBuffers.Replace("∞", "1.#INF"); @@ -512,18 +361,24 @@ private StringBuilder WriteFunctionDefinition(IMaterial material, bool bIsVertex funcDef.AppendLine($"\tTextureAttribute(g_t14_1, g_t14_1);\n"); funcDef.AppendLine($"\tCreateInputTexture2D( TextureT14_2, Linear, 8, \"\", \"\", \"Textures,10/16\", Default3( 1.0, 1.0, 1.0 ));"); - funcDef.AppendLine($"\tTexture2D g_t14_2< Channel( RGBA, Box( TextureT14_2 ), Linear ); OutputFormat( RGBA8888 ); SrgbRead( False ); >; "); + funcDef.AppendLine($"\tTexture2D g_t14_2 < Channel( RGBA, Box( TextureT14_2 ), Linear ); OutputFormat( RGBA8888 ); SrgbRead( False ); >; "); funcDef.AppendLine($"\tTextureAttribute(g_t14_2, g_t14_2);\n"); funcDef.AppendLine($"\tCreateInputTexture2D( TextureT14_3, Linear, 8, \"\", \"\", \"Textures,10/17\", Default3( 1.0, 1.0, 1.0 ));"); - funcDef.AppendLine($"\tTexture2D( g_t14_3 ) < Channel( RGBA, Box( TextureT14_3 ), Linear ); OutputFormat( RGBA8888 ); SrgbRead( False ); >; "); + funcDef.AppendLine($"\tTexture2D g_t14_3 < Channel( RGBA, Box( TextureT14_3 ), Linear ); OutputFormat( RGBA8888 ); SrgbRead( False ); >; "); funcDef.AppendLine($"\tTextureAttribute(g_t14_3, g_t14_3);\n"); } + + //if(bUsesNormalBuffer) + //{ + // funcDef.AppendLine($"\tBoolAttribute( bWantsFBCopyTexture, true );"); + // funcDef.AppendLine($"\tCreateTexture2D( g_tFrameBufferCopyTexture ) < Attribute( \"FrameBufferCopyTexture\" ); SrgbRead( true ); Filter( MIN_MAG_MIP_LINEAR ); AddressU( CLAMP ); AddressV( CLAMP ); >;"); + //} } return funcDef; } - private StringBuilder ConvertInstructions(bool isVertexShader) + private StringBuilder ConvertInstructions(IMaterial material, bool isVertexShader) { StringBuilder funcDef = new(); @@ -531,52 +386,32 @@ private StringBuilder ConvertInstructions(bool isVertexShader) { foreach (var i in inputs) { - if (i.Semantic == "POSITION0") - { - funcDef.AppendLine($"\t\tfloat4 {i.Variable} = float4(i.vPositionOs, 0); //{i.Semantic}"); - } - else if (i.Semantic == "TANGENT0") - { - funcDef.AppendLine($"\t\tfloat4 {i.Variable} = i.vTangentUOs; //{i.Semantic}"); - } - else if (i.Semantic == "TEXCOORD0") - { - funcDef.AppendLine($"\t\tfloat4 {i.Variable} = float4(i.vTexCoord, 0, 0); //{i.Semantic}"); - } - else if (i.Semantic == "NORMAL0") - { - funcDef.AppendLine($"\t\tfloat4 {i.Variable} = i.vNormalOs; //{i.Semantic}"); - } - else if (i.Semantic == "SV_VERTEXID0") - { - funcDef.AppendLine($"\t\tuint {i.Variable} = i.vVertexID; //{i.Semantic}"); - } - else if (i.Semantic == "SV_InstanceID0") - { - funcDef.AppendLine($"\t\tuint {i.Variable} = i.vInstanceID; //{i.Semantic}"); - } - else + switch(i.Semantic) { - funcDef.AppendLine($"\t\t{i.Type} {i.Variable} = {i.Variable}; //{i.Semantic}"); + case "POSITION0": + funcDef.AppendLine($"\t\tfloat4 {i.Variable} = float4(i.vPositionOs, 0); //{i.Semantic}"); + break; + case "TANGENT0": + funcDef.AppendLine($"\t\tfloat4 {i.Variable} = i.vTangentUOs; //{i.Semantic}"); + break; + case "TEXCOORD0": + funcDef.AppendLine($"\t\tfloat4 {i.Variable} = float4(i.vTexCoord, 0, 0); //{i.Semantic}"); + break; + case "NORMAL0": + funcDef.AppendLine($"\t\tfloat4 {i.Variable} = i.vNormalOs; //{i.Semantic}"); + break; + case "SV_VERTEXID0": + funcDef.AppendLine($"\t\tuint {i.Variable} = i.vVertexID; //{i.Semantic}"); + break; + case "SV_InstanceID0": + funcDef.AppendLine($"\t\tuint {i.Variable} = i.vInstanceID; //{i.Semantic}"); + break; + default: + funcDef.AppendLine($"\t\t{i.Type} {i.Variable} = {i.Variable}; //{i.Semantic}"); + break; } - - //if (i.Type == "uint") - //{ - // if (i.Semantic == "SV_isFrontFace0") - // funcDef.AppendLine($" int {i.Variable} = i.face;"); - // else - // funcDef.AppendLine($" int {i.Variable} = {i.Variable};"); - //} } - Dictionary texDict = new(); - - foreach (var texture in textures) - { - texDict.Add(texture.Index, texture); - } - List sortedIndices = texDict.Keys.OrderBy(x => x).ToList(); - List sortedTextures = texDict.Values.OrderBy(x => x.Variable).ToList(); string line = hlsl.ReadLine(); if (line == null) { @@ -631,18 +466,16 @@ private StringBuilder ConvertInstructions(bool isVertexShader) { funcDef.AppendLine("\t\tfloat3 vPositionWs = i.vPositionWithOffsetWs.xyz + g_vHighPrecisionLightingOffsetWs.xyz;"); funcDef.AppendLine("\t\tfloat3 vCameraToPositionDirWs = CalculateCameraToPositionDirWs( vPositionWs.xyz );"); - - funcDef.AppendLine("\t\tfloat4 o0,o1,o2;"); funcDef.AppendLine("\t\tfloat alpha = 1;"); if (isTerrain) //variables are different for terrain for whatever reason, kinda have to guess { - funcDef.AppendLine("\t\tfloat4 v0 = {i.o0,1};"); //Detail uv? - funcDef.AppendLine("\t\tfloat4 v1 = {i.o0*0.05,1};"); //Main uv? + funcDef.AppendLine("\t\tfloat4 v0 = {vPositionWs/39.37, 1};"); //Detail uv? + funcDef.AppendLine("\t\tfloat4 v1 = {i.vTextureCoords, 1, 1};"); //Main uv? funcDef.AppendLine("\t\tfloat4 v2 = {i.vNormalWs,1};"); funcDef.AppendLine("\t\tfloat4 v3 = {i.vTangentUWs,1};"); funcDef.AppendLine("\t\tfloat4 v4 = {i.vTangentVWs,1};"); - funcDef.AppendLine("\t\tfloat4 v5 = {0,0,0,0};"); + funcDef.AppendLine("\t\tfloat4 v5 = {i.v5,1};"); } else { @@ -650,37 +483,44 @@ private StringBuilder ConvertInstructions(bool isVertexShader) funcDef.AppendLine("\t\tfloat4 v1 = {i.vTangentUWs,1};"); funcDef.AppendLine("\t\tfloat4 v2 = {i.vTangentVWs,1};"); funcDef.AppendLine("\t\tfloat4 v3 = {i.vTextureCoords,0,0};"); //UVs - funcDef.AppendLine("\t\tfloat4 v4 = {(vPositionWs+v3.xyz)/39.37,0};"); //Don't really know, just guessing its world offset or something + funcDef.AppendLine("\t\tfloat4 v4 = {(vPositionWs)/39.37,0};"); //Don't really know, just guessing its world offset or something funcDef.AppendLine("\t\tfloat4 v5 = i.vBlendValues;"); //Vertex color. //funcDef.AppendLine("uint v6 = 1;"); //Usually FrontFace but can also be v7 } foreach (var i in inputs) { - if (i.Type == "uint") + switch(i.Type) { - if (i.Semantic == "SV_isFrontFace0") - funcDef.AppendLine($"\t\tint {i.Variable} = i.face;"); - else - funcDef.AppendLine($"\t\tint {i.Variable} = {i.Variable};"); + case "uint": + if (i.Semantic == "SV_isFrontFace0") + funcDef.AppendLine($"\t\tint {i.Variable} = i.face;"); + else + funcDef.AppendLine($"\t\tint {i.Variable} = 1;"); + break; + case "float4": + if (i.Semantic == "SV_POSITION0" && i.Variable != "v5") + funcDef.AppendLine($"\t\tfloat4 {i.Variable} = i.vPositionSs;"); + break; } } + funcDef.AppendLine("\t\tfloat4 o0 = float4(0,0,0,0);"); + funcDef.AppendLine("\t\tfloat4 o1 = float4(PackNormal3D(v0.xyz),1);"); + funcDef.AppendLine("\t\tfloat4 o2 = float4(0,0.5,0,0);\n"); - Dictionary texDict = new(); + //if (cbuffers.Any(cbuffer => cbuffer.Index == 13 && cbuffer.Count == 2)) //Should be time (g_flTime) but probably gets manipulated somehow + //{ + // funcDef.AppendLine("\t\tcb13[0] = 1;"); + // funcDef.AppendLine("\t\tcb13[1] = 1;"); + //} - foreach (var texture in textures) - { - texDict.Add(texture.Index, texture); - } - List sortedIndices = texDict.Keys.OrderBy(x => x).ToList(); - List sortedTextures = texDict.Values.OrderBy(x => x.Variable).ToList(); string line = hlsl.ReadLine(); if (line == null) { // its a broken pixel shader that uses some kind of memory textures return new StringBuilder(); } - while (!line.Contains("SV_TARGET2")) + while (!line.Contains("SV_TARGET0")) { line = hlsl.ReadLine(); if (line == null) @@ -689,20 +529,30 @@ private StringBuilder ConvertInstructions(bool isVertexShader) return new StringBuilder(); } } - hlsl.ReadLine(); + while (!line.Contains("{")) + { + if (line.Contains("SV_TARGET2")) + bTranslucent = false; + line = hlsl.ReadLine(); + } do { line = hlsl.ReadLine(); if (line != null) { - if (line.Contains("cb12[7].xyz")) //cb12 is view scope + if (line.Contains("cb12[7].xyz") || line.Contains("cb12[14].xyz")) //cb12 is view scope { - funcDef.AppendLine($"\t\t{line.TrimStart().Replace("cb12[7].xyz", "vCameraToPositionDirWs").Replace("v4.xyz", "float3(0,0,0)")}"); + funcDef.AppendLine($"\t\t{line.TrimStart().Replace("cb12[7].xyz", "vCameraToPositionDirWs") + .Replace("v4.xyz", "float3(0,0,0)") + .Replace("cb12[14].xyz", "vCameraToPositionDirWs")}"); + } + else if (line.Contains("cb")) + { + string pattern = @"cb(\d+)\[(\d+)\]"; // Matches cb#[#] + string output = Regex.Replace(line, pattern, isVertexShader ? "vs_cb$1_$2" : "cb$1_$2"); + + funcDef.AppendLine($"\t\t{output.TrimStart()}"); } - //else if (line.Contains("v4.xy * cb")) //might be a detail uv or something when v4 is used like this, idk - //{ - // funcDef.AppendLine($"\t\t{line.TrimStart().Replace("v4", "(v3.xy*5)")}"); - //} else if (line.Contains("while (true)")) { funcDef.AppendLine($"\t\t{line.TrimStart().Replace("while (true)", "[unroll(20)] while (true)")}"); @@ -720,28 +570,32 @@ private StringBuilder ConvertInstructions(bool isVertexShader) var dotAfter = line.Split(").")[1]; // todo add dimension - if (texIndex == 14) //THIS IS SO SO BAD + if (texIndex == 14 && isTerrain) //THIS IS SO SO BAD { funcDef.AppendLine($"\t\tbool red = i.vBlendValues.x > 0.5;\r\n" + $" bool green = i.vBlendValues.y > 0.5;\r\n" + $" bool blue = i.vBlendValues.z > 0.5;\r\n\r\n" + $" if (red && !green && !blue)\r\n" + $" {{\r\n" + - $" {equal} = Tex2DS(g_t14_0, TextureFiltering, {sampleUv}).{dotAfter};\r\n" + + $" {equal} = g_t{texIndex}_0.Sample(g_s{sampleIndex}, {sampleUv}).{dotAfter}\r\n" + $" }}\r\n" + $" else if (!red && green && !blue)\r\n" + $" {{\r\n" + - $" {equal} = Tex2DS(g_t14_1, TextureFiltering, {sampleUv}).{dotAfter};\r\n" + + $" {equal} = g_t{texIndex}_1.Sample(g_s{sampleIndex}, {sampleUv}).{dotAfter}\r\n" + $" }}\r\n" + $" else if (!red && !green && blue)\r\n" + $" {{\r\n" + - $" {equal} = Tex2DS(g_t14_2, TextureFiltering, {sampleUv}).{dotAfter};\r\n" + + $" {equal} = g_t{texIndex}_2.Sample(g_s{sampleIndex}, {sampleUv}).{dotAfter}\r\n" + $" }}\r\n" + $" else if (red && green && blue)\r\n" + $" {{\r\n" + - $" {equal} = Tex2DS(g_t14_3, TextureFiltering, {sampleUv}).{dotAfter};\r\n" + + $" {equal} = g_t{texIndex}_3.Sample(g_s{sampleIndex}, {sampleUv}).{dotAfter}\r\n" + $" }}"); } + else if (!material.EnumeratePSTextures().Any(texture => texture.TextureIndex == texIndex)) //Some kind of buffer texture + { + funcDef.AppendLine($"\t\t{equal.TrimStart()}= float4(1,1,1,1).{dotAfter} //t{texIndex}"); + } else { funcDef.AppendLine($"\t\t{equal.TrimStart()}= g_t{texIndex}.Sample(g_s{sampleIndex}, {sampleUv}).{dotAfter}"); @@ -756,13 +610,22 @@ private StringBuilder ConvertInstructions(bool isVertexShader) funcDef.AppendLine($"\t\t{equal.TrimStart()}= g_t{texIndex}.CalculateLevelOfDetail(g_s{sampleIndex}, {sampleUv});"); } - else if (line.Contains("Load")) + else if (line.Contains("Load")) { var equal = line.Split("=")[0]; var texIndex = Int32.Parse(line.Split(".Load")[0].Split("t")[1]); var sampleUv = line.Split("(")[1].Split(")")[0]; - - funcDef.AppendLine($"\t\t{equal.TrimStart()}= g_t{texIndex + 1}.Load({sampleUv});"); //Usually seen in decals, the texture isnt actually valid though? Probably from gbuffer + var dotAfter = line.Split(").")[1]; + + if (texIndex == 2) //Pretty sure this is normal buffer, cant get/use in Forward Rendering... + { + bUsesNormalBuffer = true; + funcDef.AppendLine($"\t\t{equal.TrimStart()}= v0.{dotAfter}"); + } + else if (!material.EnumeratePSTextures().Any(texture => texture.TextureIndex == texIndex)) //Some kind of buffer texture + { + funcDef.AppendLine($"\t\t{equal.TrimStart()}= float4(1,1,1,1).{dotAfter} //t{texIndex}.Load"); + } } else if (line.Contains("o0.w = r")) //o0.w = r(?) { @@ -789,14 +652,37 @@ private StringBuilder ConvertInstructions(bool isVertexShader) return funcDef; } - //private void AddOutputs() - //{ - // Dictionary texDict = new Dictionary(); + private StringBuilder AddOutput(IMaterial material) + { + StringBuilder output = new StringBuilder(); + + if(!bTranslucent) //uses o1,o2 + { + //this is fine... + output.Append($"\t\t// Normal\r\n float3 biased_normal = o1.xyz - float3(0.5, 0.5, 0.5);\r\n float normal_length = length(biased_normal);\r\n float3 normal_in_world_space = biased_normal / normal_length;\r\n\r\n float smoothness = saturate(8 * (normal_length - 0.375));\r\n \r\n Material mat = Material::From(i,\r\n float4(o0.xyz, alpha), //albedo, alpha\r\n float4(0.5, 0.5, 1, 1), //Normal, gets set later\r\n float4(1 - smoothness, saturate(o2.x), saturate(o2.y * 2), 1), //rough, metal, ao\r\n float3(1.0f, 1.0f, 1.0f), //tint\r\n clamp((o2.y - 0.5) * 2 * 6 * o0.xyz, 0, 100)); //emission\r\n\r\n mat.Transmission = o2.z;\r\n mat.Normal = normal_in_world_space; //Normal is already in world space so no need to convert in Material::From\r\n\r\n #if ( S_MODE_REFLECTIONS )\r\n\t\t{{\r\n\t\t\treturn Reflections::From( i, mat, SampleCountIntersection );\r\n\t\t}}\r\n #else\r\n\t\t{{\r\n return ShadingModelStandard::Shade(i, mat);\r\n }}\r\n #endif"); + + if (bFixRoughness) + output = output.Replace("float smoothness = saturate(8 * (normal_length - 0.375));", "float smoothness = saturate(8 * (0 - 0.375));"); + + if (bUsesNormalBuffer) //Cant get normal buffer in forward rendering so just use world normal ig... + output = output.Replace("mat.Normal = normal_in_world_space;", $"mat.Normal = v0;"); + } + else //only uses o0 + { + output.AppendLine($"\t\tMaterial mat = Material::From(i, float4(o0.xyz, alpha), float4(0.5, 0.5, 1, 1), float4(0.5, 0, 1, 1), float3(1.0f, 1.0f, 1.0f), 0);"); + output.AppendLine($"\t\treturn ShadingModelStandard::Shade(i, mat);"); + + //if (material.Unk0C == 2) //Unlit? + //{ + // output.Append($"\t\treturn float4(o0.xyz, alpha);"); + //} + //else + //{ + // output.AppendLine($"\t\tMaterial mat = Material::From(i, float4(o0.xyz, alpha), float4(0.5, 0.5, 1, 1), float4(0.5, 0, 1, 1), float3(1.0f, 1.0f, 1.0f), 0);"); + // output.AppendLine($"\t\treturn ShadingModelStandard::Shade(i, mat);"); + //} + } - // foreach (var texture in textures) - // { - // texDict.Add(texture.Index, texture); - // } - // List sortedTextures = texDict.Values.OrderBy(x => x.Variable).ToList(); - //} + return output; + } } diff --git a/Tiger/Schema/Shaders/Texture.cs b/Tiger/Schema/Shaders/Texture.cs index b3f2c25c..f148b73a 100644 --- a/Tiger/Schema/Shaders/Texture.cs +++ b/Tiger/Schema/Shaders/Texture.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using Arithmic; using DirectXTex; using DirectXTexNet; @@ -45,7 +46,7 @@ public byte[] GetDDSBytes() data = GetReferenceData(); } - DirectXTexUtility.TexMetadata metadata = DirectXTexUtility.GenerateMetaData(_tag.Width, _tag.Height, 1, (DirectXTexUtility.DXGIFormat)format, _tag.ArraySize == 6); + DirectXTexUtility.TexMetadata metadata = DirectXTexUtility.GenerateMetaData(_tag.Width, _tag.Height, _tag.Depth, 1, (DirectXTexUtility.DXGIFormat)format, _tag.ArraySize == 6); DirectXTexUtility.DDSHeader ddsHeader; DirectXTexUtility.DX10Header dx10Header; DirectXTexUtility.GenerateDDSHeader(metadata, DirectXTexUtility.DDSFlags.NONE, out ddsHeader, out dx10Header); @@ -189,7 +190,7 @@ public static void SavetoFile(string savePath, ScratchImage simg, bool isCubemap public void SavetoFile(string savePath) { ScratchImage simg = GetScratchImage(); - SavetoFile(savePath, simg, IsCubemap()); + SavetoFile(savePath, simg, IsCubemap() || IsVolume()); } diff --git a/Tiger/Schema/Shaders/TextureExtractor.cs b/Tiger/Schema/Shaders/TextureExtractor.cs index 48c1a244..1f050fb9 100644 --- a/Tiger/Schema/Shaders/TextureExtractor.cs +++ b/Tiger/Schema/Shaders/TextureExtractor.cs @@ -26,11 +26,11 @@ public static bool SaveTextureToFile(string savePath, ScratchImage scratchImage, case TextureExportFormat.DDS_BGRA_UNCOMP_DX10: scratchImage.SaveToDDSFile(DDS_FLAGS.FORCE_DX10_EXT, savePath + ".dds"); break; - case TextureExportFormat.DDS_BGRA_BC7_DX10: + case TextureExportFormat.DDS_BGRA_BC3_DX10: if (TexHelper.Instance.IsSRGB(scratchImage.GetMetadata().Format)) - scratchImage = scratchImage.Compress(DXGI_FORMAT.BC7_UNORM_SRGB, TEX_COMPRESS_FLAGS.SRGB, 0); + scratchImage = scratchImage.Compress(DXGI_FORMAT.BC3_UNORM_SRGB, TEX_COMPRESS_FLAGS.SRGB, 0); else - scratchImage = scratchImage.Compress(DXGI_FORMAT.BC7_UNORM, TEX_COMPRESS_FLAGS.DEFAULT, 0); + scratchImage = scratchImage.Compress(DXGI_FORMAT.BC3_UNORM, TEX_COMPRESS_FLAGS.DEFAULT, 0); scratchImage.SaveToDDSFile(DDS_FLAGS.FORCE_DX9_LEGACY, savePath + ".dds"); break; @@ -61,7 +61,7 @@ public static string GetExtension(TextureExportFormat exportFormat) switch (exportFormat) { case TextureExportFormat.DDS_BGRA_UNCOMP_DX10: - case TextureExportFormat.DDS_BGRA_BC7_DX10: + case TextureExportFormat.DDS_BGRA_BC3_DX10: case TextureExportFormat.DDS_BGRA_UNCOMP: return "dds"; case TextureExportFormat.PNG: @@ -77,7 +77,7 @@ public static string GetExtension(TextureExportFormat exportFormat) public enum TextureExportFormat { DDS_BGRA_UNCOMP_DX10, - DDS_BGRA_BC7_DX10, + DDS_BGRA_BC3_DX10, DDS_BGRA_UNCOMP, PNG, TGA, diff --git a/Tiger/Schema/Static/StaticMapData.cs b/Tiger/Schema/Static/StaticMapData.cs index 7fe3c4ab..c30714ff 100644 --- a/Tiger/Schema/Static/StaticMapData.cs +++ b/Tiger/Schema/Static/StaticMapData.cs @@ -1,5 +1,8 @@ using System.Runtime.InteropServices; +using Microsoft.VisualBasic.FileIO; using Tiger.Exporters; +using Tiger.Schema.Entity; +using Tiger.Schema.Shaders; namespace Tiger.Schema; @@ -77,20 +80,22 @@ public struct SUnknownUInt public uint Unk00; } - -[SchemaStruct("B1938080", 0x18)] +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "71968080", 0x18)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B1938080", 0x18)] public struct SOcclusionBounds { public long FileSize; public DynamicArray InstanceBounds; } -[SchemaStruct("B3938080", 0x30)] +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "73968080", 0x30)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B3938080", 0x30)] public struct SMeshInstanceOcclusionBounds { public Vector4 Corner1; public Vector4 Corner2; public TigerHash Unk20; + public TigerHash Unk24; } [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "A3718080", 0x30)] @@ -224,6 +229,8 @@ public struct SMapDataEntry public Entity.Entity EntityWQ; [SchemaField(0x68)] public uint Unk68; + [SchemaField(0x70, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + public ulong WorldID; [SchemaField(0x78)] public ResourcePointer DataResource; @@ -261,6 +268,287 @@ public struct SStaticMapParent public TigerHash Unk2C; } +/// +/// Light Lens Flares +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "BF6C8080", 0x18)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B5678080", 0x1C)] +public struct D2Class_B5678080 +{ + [SchemaField(0x10)] + public Tag Unk10; +} + +/// +/// Unk data resource. +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "686F8080", 0x38)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "786A8080", 0x38)] +public struct D2Class_786A8080 +{ + public ulong FileSize; + [SchemaField(0x18)] + public Tag Unk10; + [SchemaField(0x20)] + public DynamicArray Unk20; + public TigerHash Unk30; +} + +/// +/// Unk data resource. +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "6D6F8080", 0xC)] +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "7D6A8080", 0xC)] +public struct D2Class_7D6A8080 +{ + public IMaterial Unk00; + public Tag Unk04; + public int Unk08; +} + +/// +/// Unk data resource. +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "DC718080", 0x90)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "A16D8080", 0x80)] +public struct D2Class_A16D8080 +{ + public ulong FileSize; + [SchemaField(0x40)] + public DynamicArray Unk40; //first entry might be color? + [SchemaField(0x60)] + public DynamicArray Unk60; //if first doesnt exist then use this one? +} + +/// +/// Map Light +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "5A6F8080", 0x18)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "636A8080", 0x18)] +public struct SMapLightResource +{ + [SchemaField(0x10)] + public Tag Unk10; +} + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "3A718080", 0x60)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "656C8080", 0x60)] +public struct D2Class_656C8080 +{ + [SchemaField(0x10)] + public Vector4 Unk10; + public Vector4 Unk20; + public DynamicArray Unk30; + public DynamicArray Unk40; + [SchemaField(0x58)] + public Tag Unk58; +} + +/// +/// Background entities/skybox resource +/// +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "A36A8080", 0x18)] +public struct SMapSkyEntResource +{ + [SchemaField(0x10)] + public Tag Unk10; // A76A8080 +} + +/// +/// Background entities/skybox +/// +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "A76A8080", 0x60)] +public struct SMapSkyEntities +{ + public long FileSize; + public DynamicArray Unk08; + public DynamicArray Unk18; + public DynamicArray Unk28; + [SchemaField(0x40)] + public Vector4 Unk40; + public Vector4 Unk50; +} + +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "3E718080", 0xA0)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "706C8080", 0xF0)] +public struct D2Class_706C8080 +{ + //public Vector4 Unk00; + //public Vector4 Unk10; + + //Matrix4x4? + //[SchemaField(0x20)] + //public Vector4 Unk20; + //public Vector4 Unk30; + //public Vector4 Unk40; + //public Vector4 Unk50; + + //[SchemaField(0x80, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + //[SchemaField(0xC0, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + //public IMaterial UnkC0; + //[SchemaField(0x84, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + //[SchemaField(0xC4, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + //public IMaterial UnkC4; + //[SchemaField(TigerStrategy.DESTINY2_SHADOWKEEP_2601, Obsolete = true)] + //[SchemaField(0xC8, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + //public IMaterial UnkC8; + [SchemaField(0x88, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] + [SchemaField(0xCC, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + public Tag UnkCC; + [SchemaField(0xD0, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] + public Tag UnkD0; + //[SchemaField(0xDF)] + //public byte UnkDF; //color index? unlikely + //[SchemaField(0xE0)] + //public byte UnkE0; //light shape? +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "A96A8080", 0x90)] +public struct D2Class_A96A8080 +{ + //Matrix4x4 + public Vector4 Unk00; + public Vector4 Unk10; + public Vector4 Unk20; + public Vector4 Unk30; + + //Bounds + public Vector4 Unk40; + public Vector4 Unk50; + + public Tag Unk60;//80806aae + public float Unk64; + public int Unk68; + public ushort Unk6C; + public short Unk6E; + public float Unk70; + public int Unk74; + public Tag Unk78; + public int Unk7C; + public long Unk80; + public int Unk88; + public int Unk8c; +} + +/// +/// Map Decals Resource +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "626E8080", 0x18)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "55698080", 0x18)] +public struct SMapDecalsResource +{ + [SchemaField(0x10)] + public Tag MapDecals; +} + +/// +/// Map Decals +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "686E8080", 0x78)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "5B698080", 0x78)] +public struct SMapDecals +{ + public ulong FileSize; + public DynamicArray DecalResources; + [SchemaField(0x18)] + public DynamicArray Locations; + [SchemaField(0x28)] + public Tag Unk28; + public Tag Unk2C; + [SchemaField(0x38)] + public Tag DecalProjectionBounds; + [SchemaField(0x40)] + public Vector4 Unk40; //some type of bounds + public Vector4 Unk50; + public TigerHash Unk60; +} + +/// +/// Decal resources +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "6C6E8080", 0x8)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "63698080", 0x8)] +public struct D2Class_63698080 +{ + public IMaterial Material; + public short StartIndex; + public short Count; //Number of entries to read +} + +/// +/// Decal Location +/// +[SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "6D6E8080", 0x10)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "64698080", 0x10)] +public struct D2Class_64698080 +{ + public Vector4 Location; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "AE6A8080", 0x10)] +public struct D2Class_AE6A8080 +{ + public long FileSize; + public EntityModel Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B3938080", 0x30)] +public struct D2Class_B3938080 +{ + //Bounds + public Vector4 Unk00; + public Vector4 Unk10; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "986C8080", 0xA0)] +public struct D2Class_986C8080 +{ + public long FileSize; + public DynamicArray Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B16C8080", 0x4)] +public struct D2Class_B16C8080 +{ + public Tag Unk00; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B26C8080", 0x100)] +public struct D2Class_B26C8080 +{ + public long FileSize; + public EntityModel Unk08; + + [SchemaField(0x34)] + public Tag Unk34; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "B86C8080", 0x18)] +public struct D2Class_B86C8080 +{ + public DynamicArray Unk08; +} + +[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "BA6C8080", 0x50)] +public struct D2Class_BA6C8080 +{ + //Matrix? + public Vector4 Unk00; + public Vector4 Unk10; + public Vector4 Unk20; + public Vector4 Unk30; + public Vector4 Unk40; +} + +[SchemaStruct("5E6C8080", 0x20)] +public struct SMapSpotLightResource +{ + [SchemaField(0x10)] + public Tag Unk10; // D2Class_716C8080, might be related to lights for entities? + [SchemaField(0x1C)] + public TigerHash Unk1C; +} + // /// // /// Boss entity data resource? // /// @@ -274,17 +562,6 @@ public struct SStaticMapParent // public TigerHash EntityName; // } // -// /// -// /// Unk data resource, maybe lights for entities? -// /// -// [SchemaStruct("5E6C8080", 0x20)] -// public struct D2Class_5E6C8080 -// { -// [SchemaField(0x10), DestinyField(FieldType.FileHash)] -// public Tag Unk10; // D2Class_716C8080, might be related to lights for entities? -// [SchemaField(0x1C)] -// public TigerHash Unk1C; -// } // // /// // /// Unk data resource, maybe lights for entities? @@ -296,15 +573,6 @@ public struct SStaticMapParent // public Tag Unk10; // D2Class_656C8080, might be related to lights for entities? // } // -// /// -// /// Unk data resource. -// /// -// [SchemaStruct("B5678080", 0x18)] -// public struct D2Class_B5678080 -// { -// [SchemaField(0x10), DestinyField(FieldType.FileHash)] -// public Tag Unk10; // D2Class_A16D8080, has some materials and coords -// } // // /// // /// Audio data resource. @@ -348,16 +616,6 @@ public struct SStaticMapParent // /// // /// Unk data resource. // /// -// [SchemaStruct("A36A8080", 0x18)] -// public struct D2Class_A36A8080 -// { -// [SchemaField(0x10), DestinyField(FieldType.FileHash)] -// public Tag Unk10; // A76A8080 -// } -// -// /// -// /// Unk data resource. -// /// // [SchemaStruct("55698080", 0x18)] // public struct D2Class_55698080 // { diff --git a/Tiger/Schema/Static/Terrain.cs b/Tiger/Schema/Static/Terrain.cs index cd3bd0e2..ef869ec6 100644 --- a/Tiger/Schema/Static/Terrain.cs +++ b/Tiger/Schema/Static/Terrain.cs @@ -1,3 +1,6 @@ +using Arithmic; +using System; +using System.Diagnostics; using Tiger.Exporters; using Tiger.Schema.Model; using Tiger.Schema.Shaders; @@ -13,73 +16,68 @@ public Terrain(FileHash hash) : base(hash) } // To test use edz.strike_hmyn and alleys_a adf6ae80 - public void LoadIntoExporter(ExporterScene scene, string saveDirectory, bool bSaveShaders, D2Class_7D6C8080 parentResource, bool exportStatic = false) + public void LoadIntoExporter(ExporterScene scene, string saveDirectory, bool bSaveShaders, bool exportStatic = false) { - // todo fix terrain - if (Strategy.CurrentStrategy <= TigerStrategy.DESTINY2_SHADOWKEEP_2999) - { - return; - } - // Directory.CreateDirectory(saveDirectory + "/Textures/Terrain/"); - // Directory.CreateDirectory(saveDirectory + "/Shaders/Terrain/"); - - // if (Hash != "CAC7D380") - // { - // return; - // } // Uses triangle strip + only using first set of vertices and indices Dictionary parts = new Dictionary(); - List dyeMaps = new List(); - var x = new List(); - var y = new List(); - var z = new List(); + List dyeMaps = new List(); foreach (var partEntry in _tag.StaticParts) { if (partEntry.DetailLevel == 0) { + if (partEntry.Material is null || partEntry.Material.VertexShader is null) + continue; + var part = MakePart(partEntry); parts.TryAdd(part, partEntry.Material); - x.AddRange(part.VertexPositions.Select(a => a.X)); - y.AddRange(part.VertexPositions.Select(a => a.Y)); - z.AddRange(part.VertexPositions.Select(a => a.Z)); - - if (partEntry.Material == null) continue; scene.Materials.Add(new ExportMaterial(partEntry.Material, true)); part.Material = partEntry.Material; + + if (exportStatic) //Need access to material early, before scene system exports + partEntry.Material.SavePixelShader($"{saveDirectory}/Shaders", true); } } - var globalOffset = new Vector3( - (_tag.Unk10.X + _tag.Unk20.X) / 2, - (_tag.Unk10.Y + _tag.Unk20.Y) / 2, - (_tag.Unk10.Z + _tag.Unk20.Z) / 2); - Vector3 localOffset; int terrainTextureIndex = 14; for (int i = 0; i < _tag.MeshGroups.Count; i++) { - // Part part = MakePart(partEntry); - // parts.Add(part); var partEntry = _tag.MeshGroups[i]; - if (partEntry.Dyemap != null) + var lastValidEntry = _tag.MeshGroups.LastOrDefault(e => e.Dyemap != null); + + //Use the last valid dyemap for any invalid + if (partEntry.Dyemap == null) + { + if (lastValidEntry.Dyemap != null) + { + scene.Textures.Add(lastValidEntry.Dyemap); + dyeMaps.Add(lastValidEntry.Dyemap); + } + } + else { scene.Textures.Add(partEntry.Dyemap); - dyeMaps.Add(partEntry.Dyemap.Hash.ToString()); + dyeMaps.Add(partEntry.Dyemap); } } - localOffset = new Vector3((x.Max() + x.Min()) / 2, (y.Max() + y.Min()) / 2, (z.Max() + z.Min()) / 2); + foreach (var part in parts) { - // scale by 1.99 ish, -1 for all sides, multiply by 512? - TransformPositions(part.Key, localOffset); + TransformPositions(part.Key); TransformTexcoords(part.Key); + TransformVertexColors(part.Key); } scene.AddStatic(Hash, parts.Keys.ToList()); // For now we pre-transform it if (!exportStatic) { - scene.AddStaticInstance(Hash, 1, Vector4.Zero, globalOffset); + scene.AddStaticInstance(Hash, 1, Vector4.Zero, Vector3.Zero); + + for (int i = 0; i < dyeMaps.Count; i++) + { + scene.AddTerrainDyemap(Hash, dyeMaps[i].Hash); + } } // We need to add these textures after the static is initialised @@ -88,11 +86,6 @@ public void LoadIntoExporter(ExporterScene scene, string saveDirectory, bool bSa Texture dyemap = _tag.MeshGroups[part.Key.GroupIndex].Dyemap; if (dyemap != null) { - if (!exportStatic) - { - scene.AddTextureToMaterial(part.Key.Material.FileHash, terrainTextureIndex, dyemap); - } - if (CharmInstance.GetSubsystem().GetS2ShaderExportEnabled()) { if (File.Exists($"{saveDirectory}/Shaders/Source2/materials/Terrain/{part.Value.FileHash}.vmat")) @@ -106,8 +99,7 @@ public void LoadIntoExporter(ExporterScene scene, string saveDirectory, bool bSa for (int i = 0; i < dyeMaps.Count; i++) //Add all the dyemaps to the vmat { - //Console.WriteLine($"{dyeMaps[i]}"); - newVmat.Add($" TextureT{terrainTextureIndex}_{i} \"materials/Textures/{dyeMaps[i]}.png\""); + newVmat.Add($" TextureT{terrainTextureIndex}_{i} \"materials/Textures/{dyeMaps[i].Hash}.png\""); } newVmat.AddRange(vmat.Skip(lastBraceIndex)); @@ -118,6 +110,8 @@ public void LoadIntoExporter(ExporterScene scene, string saveDirectory, bool bSa } } } + if (CharmInstance.GetSubsystem().GetS2VMDLExportEnabled()) + Source2Handler.SaveTerrainVMDL(saveDirectory, Hash, parts.Keys.ToList(), TagData); } public StaticPart MakePart(SStaticPart entry) @@ -135,90 +129,133 @@ public StaticPart MakePart(SStaticPart entry) } part.VertexIndices = uniqueVertexIndices.ToList(); - _tag.Vertices1.ReadVertexData(part, uniqueVertexIndices, 0, -1, true); - _tag.Vertices2.ReadVertexData(part, uniqueVertexIndices, 0, -1, true); + List inputSignatures = entry.Material.VertexShader.InputSignatures; + int b0Stride = _tag.Vertices1.TagData.Stride; + int b1Stride = _tag.Vertices2?.TagData.Stride ?? 0; + List inputSignatures0 = new(); + List inputSignatures1 = new(); + int stride = 0; + foreach (InputSignature inputSignature in inputSignatures) + { + if (stride < b0Stride) + inputSignatures0.Add(inputSignature); + else + inputSignatures1.Add(inputSignature); + + if (inputSignature.Semantic == InputSemantic.Colour) + stride += inputSignature.GetNumberOfComponents() * 1; // 1 byte per component + else + stride += inputSignature.GetNumberOfComponents() * 2; // 2 bytes per component + } + + Log.Debug($"Reading vertex buffers {_tag.Vertices1.Hash}/{_tag.Vertices1.TagData.Stride}/{inputSignatures.Where(s => s.BufferIndex == 0).DebugString()} and {_tag.Vertices2?.Hash}/{_tag.Vertices2?.TagData.Stride}/{inputSignatures.Where(s => s.BufferIndex == 1).DebugString()}"); + _tag.Vertices1.ReadVertexDataSignatures(part, uniqueVertexIndices, inputSignatures0, true); + _tag.Vertices2.ReadVertexDataSignatures(part, uniqueVertexIndices, inputSignatures1, true); + + //_tag.Vertices1.ReadVertexData(part, uniqueVertexIndices, 0, -1, true); + //_tag.Vertices2.ReadVertexData(part, uniqueVertexIndices, 0, -1, true); return part; } - private void TransformPositions(StaticPart part, Vector3 localOffset) + private void TransformPositions(StaticPart part) { + Debug.Assert(part.VertexPositions.Count == part.VertexNormals.Count); for (int i = 0; i < part.VertexPositions.Count; i++) { - // based on middle points - part.VertexPositions[i] = new Vector4( // technically actually 1008 1008 4 not 1024 1024 4? - (part.VertexPositions[i].X - localOffset.X) * 1024, - (part.VertexPositions[i].Y - localOffset.Y) * 1024, - (part.VertexPositions[i].Z - localOffset.Z) * 4, - part.VertexPositions[i].W - ); + //The "standard" terrain vertex shader from hlsl + System.Numerics.Vector4 r0, r1, r2 = new(); + System.Numerics.Vector4 v0 = new(part.VertexPositions[i].X, part.VertexPositions[i].Y, part.VertexPositions[i].Z, part.VertexPositions[i].W); + System.Numerics.Vector4 v1 = new(part.VertexNormals[i].X, part.VertexNormals[i].Y, part.VertexNormals[i].Z, part.VertexNormals[i].W); + + //r0 = cb11.transform + v0; + r0.X = _tag.Unk30.X + v0.X; + r0.Y = _tag.Unk30.Y + v0.Y; + r0.Z = _tag.Unk30.Z + v0.Z; + r0.W = _tag.Unk30.W + v0.W; + + r0.Z = r0.W * 65536 + r0.Z; + + //r0.xyw = float3(0.015625, 0.015625, 0.000122070313) * r0.xyz; + r0.X = 0.015625f * r0.X; + r0.Y = 0.015625f * r0.Y; + r0.W = 0.000122070313f * r0.Z; + + //r1.xyz = float3(0,1,0) * v1.yzx; + r1.X = 0 * v1.Y; + r1.Y = 1 * v1.Z; + r1.Z = 0 * v1.X; + + //r1.xyz = v1.zxy * float3(0,0,1) + -r1.xyz; + r1.X = v1.Z * 0 + -r1.X; + r1.Y = v1.X * 0 + -r1.Y; + r1.Z = v1.Y * 1 + -r1.Z; + + //r0.z = dot(r1.yz, r1.yz); + r0.Z = System.Numerics.Vector2.Dot(new(r1.Y, r1.Z), new(r1.Y, r1.Z)); + + //r0.z = rsqrt(r0.z); + r0.Z = MathF.ReciprocalSqrtEstimate(r0.Z); + + //r1.xyz = r1.xyz * r0.zzz; + r1.X = r1.X * r0.Z; + r1.Y = r1.Y * r0.Z; + r1.Z = r1.Z * r0.Z; + + //r2.xyz = v1.zxy * r1.yzx; + r2.X = v1.Z * r1.Y; + r2.Y = v1.X * r1.Z; + r2.Z = v1.Y * r1.X; + + //r2.xyz = v1.yzx * r1.zxy + -r2.xyz; + r2.X = v1.Y * r1.Z + -r2.X; + r2.Y = v1.Z * r1.X + -r2.Y; + r2.Z = v1.X * r1.Y + -r2.Z; + + //r0.z = dot(r2.xyz, r2.xyz); + //r0.z = rsqrt(r0.z); + r0.Z = System.Numerics.Vector3.Dot(new(r2.X, r2.Y, r2.Z), new(r2.X, r2.Y, r2.Z)); + r0.Z = MathF.ReciprocalSqrtEstimate(r0.Z); + + part.VertexPositions[i] = new Vector4(r0.X, r0.Y, r0.Z * r0.W, r0.W); } } private void TransformTexcoords(StaticPart part) { - double scaleX, scaleY, translateX, translateY; - - Vector4 vec = _tag.MeshGroups[part.GroupIndex].Unk20; - - if (vec.Z == 0.0078125) - { - scaleX = 1 / 0.4375 * 2.28571428571 * 2; - translateX = 0.333333; // 0 if no 2 * 2.285 - } - else if (vec.Z == -0.9765625) - { - scaleX = 32; - translateX = -14; - } - else if (vec.Z == -1.9609375) - { - // todo shadowkeep idk - scaleX = 1; - translateX = 0; - } - else if (vec.Z == -2.9453125) - { - // todo shadowkeep idk - scaleX = 1; - translateX = 0; - } - else - { - throw new Exception("Unknown terrain uv scale x"); - } - if (vec.W == 0.0078125) - { - scaleY = -1 / 0.4375 * 2.28571428571 * 2; - translateY = 0.333333; - } - else if (vec.W == -0.9765625) - { - scaleY = -32; - translateY = -14; - } - else if (vec.W == -1.9609375) - { - // todo shadowkeep idk - scaleY = 1; - translateY = 0; - } - else if (vec.W == -2.9453125) - { - // todo shadowkeep idk - scaleY = 1; - translateY = 0; - } - else - { - throw new Exception("Unknown terrain uv scale y"); - } for (int i = 0; i < part.VertexTexcoords0.Count; i++) { part.VertexTexcoords0[i] = new Vector2( - part.VertexTexcoords0[i].X * scaleX + translateX, - part.VertexTexcoords0[i].Y * scaleY + (1 - translateY) - ); + part.VertexTexcoords0[i].X * _tag.MeshGroups[part.GroupIndex].Unk20.X + _tag.MeshGroups[part.GroupIndex].Unk20.Z, + part.VertexTexcoords0[i].Y * -_tag.MeshGroups[part.GroupIndex].Unk20.Y + 1 - _tag.MeshGroups[part.GroupIndex].Unk20.W); + } + } + + private void TransformVertexColors(StaticPart part) + { + //Helper for dyemap assignment + //SK can have up to index 15, maybe more? + for (int i = 0; i < part.VertexPositions.Count; i++) + { + int colorIndex = part.GroupIndex % 4; + switch (colorIndex) + { + case 0: + part.VertexColours.Add(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); + break; + case 1: + part.VertexColours.Add(new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); + break; + case 2: + part.VertexColours.Add(new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); + break; + case 3: + part.VertexColours.Add(new Vector4(1.0f, 1.0f, 1.0f, 1.0f)); + break; + default: + part.VertexColours.Add(new Vector4(0.0f, 0.0f, 0.0f, 0.0f)); + break; + }; } } } @@ -227,8 +264,8 @@ private void TransformTexcoords(StaticPart part) /// Terrain data resource. /// [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "4B718080", 0x20)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "7D6C8080", 0x20)] -public struct D2Class_7D6C8080 +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "7D6C8080", 0x20)] +public struct SMapTerrainResource { [SchemaField(0x10)] public short Unk10; // tile x-y coords? @@ -242,7 +279,7 @@ public struct D2Class_7D6C8080 /// Terrain _tag. /// [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "4F718080", 0xB0)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "816C8080", 0xB0)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "816C8080", 0xB0)] public struct STerrain { public long FileSize; @@ -251,7 +288,7 @@ public struct STerrain public Vector4 Unk20; public Vector4 Unk30; [SchemaField(0x58, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] - [SchemaField(0x50, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x50, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public DynamicArray MeshGroups; public VertexBuffer Vertices1; @@ -260,30 +297,25 @@ public struct STerrain public IMaterial Unk6C; public IMaterial Unk70; [SchemaField(0x80, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] - [SchemaField(0x78, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x78, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public DynamicArray StaticParts; public VertexBuffer Vertices3; public VertexBuffer Vertices4; public IndexBuffer Indices2; [SchemaField(0xA0, TigerStrategy.DESTINY2_SHADOWKEEP_2601)] - [SchemaField(0x98, TigerStrategy.DESTINY2_WITCHQUEEN_6307)] + [SchemaField(0x98, TigerStrategy.DESTINY2_BEYONDLIGHT_3402)] public int Unk98; public int Unk9C; public int UnkA0; } [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "54718080", 0x60)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "866C8080", 0x60)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "866C8080", 0x60)] public struct SMeshGroup { - public float Unk00; - public float Unk04; - public float Unk08; - public float Unk0C; - public float Unk10; - public float Unk14; - public float Unk18; - [SchemaField(0x20)] + //Location? + public Vector4 Unk00; + public Vector4 Unk10; public Vector4 Unk20; public uint Unk30; public uint Unk34; @@ -297,7 +329,7 @@ public struct SMeshGroup } [SchemaStruct(TigerStrategy.DESTINY2_SHADOWKEEP_2601, "52718080", 0x0C)] -[SchemaStruct(TigerStrategy.DESTINY2_WITCHQUEEN_6307, "846C8080", 0x0C)] +[SchemaStruct(TigerStrategy.DESTINY2_BEYONDLIGHT_3402, "846C8080", 0x0C)] public struct SStaticPart { public IMaterial Material; diff --git a/Tiger/Schema/Test.cs b/Tiger/Schema/Test.cs index 7b0ad547..5b70c8a9 100644 --- a/Tiger/Schema/Test.cs +++ b/Tiger/Schema/Test.cs @@ -1,33 +1,33 @@ -namespace Tiger.Schema; +//namespace Tiger.Schema; -[SchemaStruct("5B698080", 0x70)] -public struct UnkLights -{ - public long ThisSize; - public DynamicArray Unk0x08; - public DynamicArray Unk0x18; - public FileHash Unk0x28; - public FileHash Unk0x2C; - public ushort Unk0x30; - public ushort Unk0x32; - public ushort Unk0x34; - public ushort Unk0x36; - public FileHash Unk0x38; - [SchemaField(0x40)] - public Vector4 Unk0x40; - public Vector4 Unk0x50; -} +//[SchemaStruct("5B698080", 0x70)] +//public struct UnkLights +//{ +// public long ThisSize; +// public DynamicArray Unk0x08; +// public DynamicArray Unk0x18; +// public FileHash Unk0x28; +// public FileHash Unk0x2C; +// public ushort Unk0x30; +// public ushort Unk0x32; +// public ushort Unk0x34; +// public ushort Unk0x36; +// public FileHash Unk0x38; +// [SchemaField(0x40)] +// public Vector4 Unk0x40; +// public Vector4 Unk0x50; +//} -[SchemaStruct("63698080", 0x8)] -public struct Unk63698080 -{ - public FileHash Unk00; - public ushort StartIndex; - public ushort Count; -} +//[SchemaStruct("63698080", 0x8)] +//public struct Unk63698080 +//{ +// public FileHash Unk00; +// public ushort StartIndex; +// public ushort Count; +//} -[SchemaStruct("64698080", 0x10)] -public struct Unk64698080 -{ - public Vector4 Translation; -} +//[SchemaStruct("64698080", 0x10)] +//public struct Unk64698080 +//{ +// public Vector4 Translation; +//} diff --git a/Tiger/Schema/Vector.cs b/Tiger/Schema/Vector.cs index 44245dd3..5d989f4f 100644 --- a/Tiger/Schema/Vector.cs +++ b/Tiger/Schema/Vector.cs @@ -20,6 +20,12 @@ public Vector2(float x, float y) Y = y; } + public Vector2(Half x, Half y) + { + X = (float)x; + Y = (float)y; + } + public Vector2(double x, double y) { X = (float)x; diff --git a/Tiger/SchemaTypes.cs b/Tiger/SchemaTypes.cs index 1b9616ac..e96d208c 100644 --- a/Tiger/SchemaTypes.cs +++ b/Tiger/SchemaTypes.cs @@ -493,6 +493,10 @@ public void Deserialize(TigerReader reader) FileHash fileHash = new(reader.ReadUInt32()); LocalizedStrings localizedStrings = FileResourcer.Get().GetFile(fileHash); StringHash stringHash = new(reader.ReadUInt32()); + if (localizedStrings == null || stringHash.IsInvalid()) + { + return; + } Value = localizedStrings.GetStringFromHash(stringHash); }