Beispiel #1
0
    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);
            }
        }
    }
Beispiel #2
0
        public static void Reset(GameObject gameobj)
        {
            WorkshopSkin component = gameobj.GetComponent <WorkshopSkin>();

            if (component != null)
            {
                component.UpdateSkinReference(null, (ulong)0);
            }
            MaterialReplacement.Reset(gameobj);
        }
Beispiel #3
0
 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();
 }
Beispiel #4
0
        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);
        }
Beispiel #5
0
    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);
    }
Beispiel #6
0
    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);
    }
Beispiel #7
0
        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);
        }