示例#1
0
 private void Update()
 {
     if ((this.prefabRendering != this.prefab) || !this.oi)
     {
         if (this.prefabRendering != null)
         {
             this.renderer = null;
         }
         if (this.prefab != null)
         {
             this.renderer = PrefabRenderer.GetOrCreateRender(this.prefab);
         }
         this.prefabRendering = this.prefab;
         this.oi = true;
         this.ApplyOverrides();
     }
     if (this.renderer == null)
     {
         Debug.Log("None", this);
     }
     else
     {
         this.renderer.Render(null, base.transform.localToWorldMatrix, null, this.overrideMaterials);
     }
 }
示例#2
0
    public virtual void RenderDeployPreview(Vector3 point, Quaternion rot, TransCarrier carrier)
    {
        if (this._aimGizmo != null)
        {
            this._aimGizmo.rotation = rot;
            this._aimGizmo.position = point;
        }
        if (this._prefabRenderer == null)
        {
            DeployableObject objectToPlace = this.datablock.ObjectToPlace;
            if (!objectToPlace)
            {
                return;
            }
            this._prefabRenderer = PrefabRenderer.GetOrCreateRender(objectToPlace.gameObject);
        }
        Material material = (T)this.datablock.overrideMat;

        if (!material)
        {
            PrefabRenderer prefabRenderer = this._prefabRenderer;
            Camera         camera         = MountedCamera.main.camera;
            T t = this.datablock;
            prefabRenderer.Render(camera, Matrix4x4.TRS(point, rot, t.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, null);
        }
        else
        {
            PrefabRenderer prefabRenderer1 = this._prefabRenderer;
            Camera         camera1         = MountedCamera.main.camera;
            T t1 = this.datablock;
            prefabRenderer1.RenderOneMaterial(camera1, Matrix4x4.TRS(point, rot, t1.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, material);
        }
        if (this._aimGizmo != null)
        {
            bool flag = false;
            if (carrier)
            {
                Renderer renderer = carrier.renderer;
                if (renderer is MeshRenderer && renderer && renderer.enabled)
                {
                    flag = true;
                    this._aimGizmo.carrierRenderer = (MeshRenderer)renderer;
                }
            }
            if (!flag)
            {
                this._aimGizmo.carrierRenderer = null;
            }
        }
    }
示例#3
0
    public static PrefabRenderer GetOrCreateRender(GameObject prefab)
    {
        PrefabRenderer target;
        bool           flag;
        WeakReference  weakReference;

        if (!prefab)
        {
            return(null);
        }
        while (prefab.transform.parent)
        {
            prefab = prefab.transform.parent.gameObject;
        }
        int    instanceID = prefab.GetInstanceID();
        object @lock      = PrefabRenderer.Runtime.Lock;

        Monitor.Enter(@lock);
        try
        {
            if (!PrefabRenderer.Runtime.Register.TryGetValue(instanceID, out weakReference))
            {
                target = null;
            }
            else
            {
                target = (PrefabRenderer)weakReference.Target;
            }
            flag = target != null;
            if (!flag)
            {
                target = new PrefabRenderer(instanceID);
            }
        }
        finally
        {
            Monitor.Exit(@lock);
        }
        if (!flag)
        {
            target.prefab = prefab;
            target.Refresh();
        }
        return(target);
    }
示例#4
0
    public virtual void RenderDeployPreview(Vector3 point, Quaternion rot, TransCarrier carrier)
    {
        if (this._aimGizmo != null)
        {
            this._aimGizmo.rotation = rot;
            this._aimGizmo.position = point;
        }
        if (this._prefabRenderer == null)
        {
            DeployableObject objectToPlace = base.datablock.ObjectToPlace;
            if (objectToPlace == null)
            {
                return;
            }
            this._prefabRenderer = PrefabRenderer.GetOrCreateRender(objectToPlace.gameObject);
        }
        Material overrideMat = base.datablock.overrideMat;

        if (overrideMat != null)
        {
            this._prefabRenderer.RenderOneMaterial(MountedCamera.main.camera, Matrix4x4.TRS(point, rot, base.datablock.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, overrideMat);
        }
        else
        {
            this._prefabRenderer.Render(MountedCamera.main.camera, Matrix4x4.TRS(point, rot, base.datablock.ObjectToPlace.transform.localScale), this._aimGizmo.propertyBlock, null);
        }
        if (this._aimGizmo != null)
        {
            bool flag = false;
            if (carrier != null)
            {
                Renderer renderer = carrier.renderer;
                if (((renderer is MeshRenderer) && (renderer != null)) && renderer.enabled)
                {
                    flag = true;
                    this._aimGizmo.carrierRenderer = (MeshRenderer)renderer;
                }
            }
            if (!flag)
            {
                this._aimGizmo.carrierRenderer = null;
            }
        }
    }
示例#5
0
    public static PrefabRenderer GetOrCreateRender(GameObject prefab)
    {
        PrefabRenderer target;
        bool           flag;

        if (prefab == null)
        {
            return(null);
        }
        while (prefab.transform.parent != null)
        {
            prefab = prefab.transform.parent.gameObject;
        }
        int    instanceID = prefab.GetInstanceID();
        object @lock      = Runtime.Lock;

        lock (@lock)
        {
            WeakReference reference;
            if (Runtime.Register.TryGetValue(instanceID, out reference))
            {
                target = (PrefabRenderer)reference.Target;
            }
            else
            {
                target = null;
            }
            flag = target != null;
            if (!flag)
            {
                target = new PrefabRenderer(instanceID);
            }
        }
        if (!flag)
        {
            target.prefab = prefab;
            target.Refresh();
        }
        return(target);
    }
示例#6
0
    public virtual void RenderDeployPreview(Vector3 point, Quaternion rot)
    {
        if (this._prefabRenderer == null)
        {
            StructureComponent structureToPlacePrefab = base.datablock.structureToPlacePrefab;
            if (structureToPlacePrefab == null)
            {
                return;
            }
            this._prefabRenderer = PrefabRenderer.GetOrCreateRender(structureToPlacePrefab.gameObject);
            this._materialProps  = new MaterialPropertyBlock();
        }
        Material overrideMat = base.datablock.overrideMat;

        if (overrideMat != null)
        {
            this._prefabRenderer.RenderOneMaterial(MountedCamera.main.camera, Matrix4x4.TRS(point, rot, Vector3.one), this._materialProps, overrideMat);
        }
        else
        {
            this._prefabRenderer.Render(MountedCamera.main.camera, Matrix4x4.TRS(point, rot, Vector3.one), this._materialProps, null);
        }
    }
示例#7
0
    public void Refresh()
    {
        PrefabRenderer     renderer  = this;
        Transform          transform = this.prefab.transform;
        HashSet <Material> set       = new HashSet <Material>();
        HashSet <Mesh>     set2      = new HashSet <Mesh>();
        List <Material[]>  list      = new List <Material[]>();
        List <Mesh>        list2     = new List <Mesh>();
        int capacity = 0;

        Renderer[] componentsInChildren = this.prefab.GetComponentsInChildren <Renderer>(true);
        int        size = 0;

        for (int i = 0; i < componentsInChildren.Length; i++)
        {
            Renderer renderer2 = componentsInChildren[i];
            if ((((renderer2 != null) && renderer2.enabled) && !renderer2.name.EndsWith("-lod", StringComparison.InvariantCultureIgnoreCase)) && !renderer2.name.EndsWith("_LOD_LOWEST", StringComparison.InvariantCultureIgnoreCase))
            {
                if (renderer2 is MeshRenderer)
                {
                    componentsInChildren[size++] = renderer2;
                    Mesh sharedMesh = renderer2.GetComponent <MeshFilter>().sharedMesh;
                    if ((sharedMesh != null) && set2.Add(sharedMesh))
                    {
                        capacity++;
                    }
                    list2.Add(sharedMesh);
                }
                else
                {
                    if (!(renderer2 is SkinnedMeshRenderer))
                    {
                        continue;
                    }
                    componentsInChildren[size++] = renderer2;
                    Mesh item = ((SkinnedMeshRenderer)renderer2).sharedMesh;
                    if ((item != null) && set2.Add(item))
                    {
                        capacity++;
                    }
                    list2.Add(item);
                }
                Material[] sharedMaterials = renderer2.sharedMaterials;
                list.Add(sharedMaterials);
                set.UnionWith(sharedMaterials);
            }
        }
        for (int j = size; j < componentsInChildren.Length; j++)
        {
            componentsInChildren[j] = null;
        }
        int count = set.Count;
        int num6  = ((count % 0x20) <= 0) ? (count / 0x20) : ((count / 0x20) + 1);

        DoNotCareResize <int>(ref renderer.skipBits, num6);
        for (int k = 0; k < num6; k++)
        {
            this.skipBits[k] = 0;
        }
        Dictionary <Material, int> dictionary  = new Dictionary <Material, int>(count);
        Dictionary <Mesh, int>     dictionary2 = new Dictionary <Mesh, int>(capacity);

        DoNotCareResize <Material>(ref renderer.originalMaterials, count);
        int index = 0;

        foreach (Material material in set)
        {
            if (material.GetTag("IgnorePrefabRenderer", false, "False") == "True")
            {
                this.skipBits[index / 0x20] |= ((int)1) << (index % 0x20);
            }
            renderer.originalMaterials[index] = material;
            dictionary[material] = index++;
        }
        DoNotCareResize <Mesh>(ref renderer.originalMeshes, capacity);
        int num9 = 0;

        foreach (Mesh mesh3 in set2)
        {
            renderer.originalMeshes[num9] = mesh3;
            dictionary2[mesh3]            = num9++;
        }
        DoNotCareResize <MeshRender>(ref renderer.meshes, size);
        for (int m = 0; m < size; m++)
        {
            Renderer   renderer3      = componentsInChildren[m];
            Material[] materialArray2 = list[m];
            int[]      materials      = new int[materialArray2.Length];
            for (int n = 0; n < materialArray2.Length; n++)
            {
                materials[n] = dictionary[materialArray2[n]];
            }
            renderer.meshes[m].Set(dictionary2[list2[m]], materials, renderer3.transform.localToWorldMatrix * transform.worldToLocalMatrix, renderer3.gameObject.layer, renderer3.castShadows, renderer3.receiveShadows);
        }
    }
示例#8
0
    public void Refresh()
    {
        Renderer           renderer;
        PrefabRenderer     prefabRenderer = this;
        Transform          transforms     = this.prefab.transform;
        HashSet <Material> materials      = new HashSet <Material>();
        HashSet <Mesh>     meshes         = new HashSet <Mesh>();
        List <Material[]>  materialArrays = new List <Material[]>();
        List <Mesh>        meshes1        = new List <Mesh>();
        int num = 0;

        Renderer[] componentsInChildren = this.prefab.GetComponentsInChildren <Renderer>(true);
        int        num1 = 0;

        for (int i = 0; i < (int)componentsInChildren.Length; i++)
        {
            renderer = componentsInChildren[i];
            if (renderer && renderer.enabled && !renderer.name.EndsWith("-lod", StringComparison.InvariantCultureIgnoreCase) && !renderer.name.EndsWith("_LOD_LOWEST", StringComparison.InvariantCultureIgnoreCase))
            {
                if (!(renderer is MeshRenderer))
                {
                    if (renderer is SkinnedMeshRenderer)
                    {
                        goto Label1;
                    }
                    goto Label0;
                }
                else
                {
                    int num2 = num1;
                    num1 = num2 + 1;
                    componentsInChildren[num2] = renderer;
                    Mesh component = renderer.GetComponent <MeshFilter>().sharedMesh;
                    if (component && meshes.Add(component))
                    {
                        num++;
                    }
                    meshes1.Add(component);
                }
Label2:
                Material[] materialArray = renderer.sharedMaterials;
                materialArrays.Add(materialArray);
                materials.UnionWith(materialArray);
            }
Label0:
        }
        for (int j = num1; j < (int)componentsInChildren.Length; j++)
        {
            componentsInChildren[j] = null;
        }
        int count = materials.Count;
        int num3  = (count % 32 <= 0 ? count / 32 : count / 32 + 1);

        PrefabRenderer.DoNotCareResize <int>(ref prefabRenderer.skipBits, num3);
        for (int k = 0; k < num3; k++)
        {
            this.skipBits[k] = 0;
        }
        Dictionary <Material, int> materials1 = new Dictionary <Material, int>(count);
        Dictionary <Mesh, int>     meshes2    = new Dictionary <Mesh, int>(num);

        PrefabRenderer.DoNotCareResize <Material>(ref prefabRenderer.originalMaterials, count);
        int num4 = 0;

        foreach (Material material in materials)
        {
            if (material.GetTag("IgnorePrefabRenderer", false, "False") == "True")
            {
                this.skipBits[num4 / 32] = this.skipBits[num4 / 32] | 1 << (num4 % 32 & 31 & 31);
            }
            prefabRenderer.originalMaterials[num4] = material;
            int num5 = num4;
            num4 = num5 + 1;
            materials1[material] = num5;
        }
        PrefabRenderer.DoNotCareResize <Mesh>(ref prefabRenderer.originalMeshes, num);
        int num6 = 0;

        foreach (Mesh mesh in meshes)
        {
            prefabRenderer.originalMeshes[num6] = mesh;
            int num7 = num6;
            num6          = num7 + 1;
            meshes2[mesh] = num7;
        }
        PrefabRenderer.DoNotCareResize <PrefabRenderer.MeshRender>(ref prefabRenderer.meshes, num1);
        for (int l = 0; l < num1; l++)
        {
            Renderer   renderer1 = componentsInChildren[l];
            Material[] item      = materialArrays[l];
            int[]      numArray  = new int[(int)item.Length];
            for (int m = 0; m < (int)item.Length; m++)
            {
                numArray[m] = materials1[item[m]];
            }
            prefabRenderer.meshes[l].Set(meshes2[meshes1[l]], numArray, renderer1.transform.localToWorldMatrix * transforms.worldToLocalMatrix, renderer1.gameObject.layer, renderer1.castShadows, renderer1.receiveShadows);
        }
        return;

Label1:
        int num8 = num1;

        num1 = num8 + 1;
        componentsInChildren[num8] = renderer;
        Mesh mesh1 = ((SkinnedMeshRenderer)renderer).sharedMesh;

        if (mesh1 && meshes.Add(mesh1))
        {
            num++;
        }
        meshes1.Add(mesh1);
        goto Label2;
    }
示例#9
0
 private void Update()
 {
     if (this.prefabRendering != this.prefab || !this.oi)
     {
         if (this.prefabRendering)
         {
             this.renderer = null;
         }
         if (this.prefab)
         {
             this.renderer = PrefabRenderer.GetOrCreateRender(this.prefab);
         }
         this.prefabRendering = this.prefab;
         this.oi = true;
         this.ApplyOverrides();
     }
     if (this.renderer == null)
     {
         Debug.Log("None", this);
         return;
     }
     this.renderer.Render(null, base.transform.localToWorldMatrix, null, this.overrideMaterials);
 }