public void Rebuild() { multiMesh.materialOverride = drawShadowOnly ? shadowMaterial : null; multiMesh.RebuildModel(); // Should the censorship cube be enabled { var clothes = GetComponentsInChildren <ClothingItem>(); var censored = clothes.Any(x => x.showCensorshipCube == true); if (censorshipCube != null) { censorshipCube.SetActive(!drawShadowOnly && censored); } } // // If we have a world model, replace its material too // if (worldModelObject) { if (multiMesh.materialOverride) { MaterialReplacement.ReplaceRecursive(worldModelObject, multiMesh.materialOverride); } else { MaterialReplacement.Reset(worldModelObject); } } }
public static void Reset(GameObject gameobj) { WorkshopSkin component = gameobj.GetComponent <WorkshopSkin>(); if (component != null) { component.UpdateSkinReference(null, (ulong)0); } MaterialReplacement.Reset(gameobj); }
public static void Apply(GameObject obj, Skinnable skinnable, Material[] Materials) { TimeWarning.BeginSample("Skin.Apply"); if (Materials == null) { TimeWarning.EndSample(); return; } if (obj == null) { TimeWarning.EndSample(); return; } MaterialReplacement.ReplaceRecursive(obj, skinnable.SourceMaterials, Materials); TimeWarning.EndSample(); }
private void LoadMaterialReplacements(BinaryReader reader) { StringBuilder builder = new StringBuilder(); int[] counts = new int[LodCount]; long[] offsets = new long[LodCount]; for (int i = 0; i < LodCount; ++i) { long basePosition = reader.BaseStream.Position; counts[i] = reader.ReadInt32(); offsets[i] = basePosition + reader.ReadInt32(); } ImmutableArray <MaterialReplacement>[] materialReplacements = new ImmutableArray <MaterialReplacement> [LodCount]; for (int i = 0; i < LodCount; ++i) { reader.BaseStream.Position = offsets[i]; int[] ids = new int[counts[i]]; long[] nameOffsets = new long[counts[i]]; for (int j = 0; j < counts[i]; ++j) { ids[j] = reader.ReadUInt16(); nameOffsets[j] = offsets[i] + reader.ReadInt32(); } MaterialReplacement[] replacements = new MaterialReplacement[counts[i]]; for (int j = 0; j < counts[i]; ++j) { reader.BaseStream.Position = nameOffsets[j]; builder.Clear(); for (char c; (c = reader.ReadChar()) != '\0';) { builder.Append(c); } replacements[j] = new MaterialReplacement(ids[j], builder.ToString()); } materialReplacements[i] = new ImmutableArray <MaterialReplacement>(replacements); } MaterialReplacements = new ImmutableArray <ImmutableArray <MaterialReplacement> >(materialReplacements); }
public static void ReplaceRecursive(GameObject go, Material mat) { List <UnityEngine.Renderer> list = Pool.GetList <UnityEngine.Renderer>(); go.transform.GetComponentsInChildren <UnityEngine.Renderer>(true, list); foreach (UnityEngine.Renderer renderer in list) { if (renderer is ParticleSystemRenderer) { continue; } MaterialReplacement orAddComponent = renderer.transform.GetOrAddComponent <MaterialReplacement>(); orAddComponent.Init(); orAddComponent.Replace(mat); } Pool.FreeList <UnityEngine.Renderer>(ref list); }
public static void ReplaceRecursive(GameObject obj, Material[] find, Material[] replace) { Assert.AreEqual((int)find.Length, (int)replace.Length); List <UnityEngine.Renderer> list = Pool.GetList <UnityEngine.Renderer>(); obj.GetComponentsInChildren <UnityEngine.Renderer>(true, list); foreach (UnityEngine.Renderer renderer in list) { if (renderer is ParticleSystemRenderer || !MaterialReplacement.MaterialsContainAny(renderer.sharedMaterials, find)) { continue; } MaterialReplacement orAddComponent = renderer.transform.GetOrAddComponent <MaterialReplacement>(); orAddComponent.Init(); orAddComponent.Revert(); orAddComponent.Replace(find, replace); } Pool.FreeList <UnityEngine.Renderer>(ref list); }
private void LoadMaterialReplacements(BinaryReader reader) { StringBuilder builder = new StringBuilder(); int[] counts = new int[LodCount]; long[] offsets = new long[LodCount]; for (int i = 0; i < LodCount; ++i) { long basePosition = reader.BaseStream.Position; counts[i] = reader.ReadInt32(); offsets[i] = basePosition + reader.ReadInt32(); } ImmutableArray<MaterialReplacement>[] materialReplacements = new ImmutableArray<MaterialReplacement>[LodCount]; for (int i = 0; i < LodCount; ++i) { reader.BaseStream.Position = offsets[i]; int[] ids = new int[counts[i]]; long[] nameOffsets = new long[counts[i]]; for (int j = 0; j < counts[i]; ++j) { ids[j] = reader.ReadUInt16(); nameOffsets[j] = offsets[i] + reader.ReadInt32(); } MaterialReplacement[] replacements = new MaterialReplacement[counts[i]]; for (int j = 0; j < counts[i]; ++j) { reader.BaseStream.Position = nameOffsets[j]; builder.Clear(); for (char c; (c = reader.ReadChar()) != '\0'; ) { builder.Append(c); } replacements[j] = new MaterialReplacement(ids[j], builder.ToString()); } materialReplacements[i] = new ImmutableArray<MaterialReplacement>(replacements); } MaterialReplacements = new ImmutableArray<ImmutableArray<MaterialReplacement>>(materialReplacements); }