Example #1
0
        public static bool RenderInstanceCommonBuildingAIPrefix(CommonBuildingAI __instance, RenderManager.CameraInfo cameraInfo, ushort buildingID, ref Building data, int layerMask, ref RenderManager.Instance instance)
        {
            if ((data.m_flags & (Building.Flags.Completed | Building.Flags.Collapsed)) != Building.Flags.Completed)
            {
                if ((data.m_flags & Building.Flags.Collapsed) != 0)
                {
                    uint           num        = (uint)(buildingID << 8) / 49152u;
                    uint           num2       = Singleton <SimulationManager> .instance.m_referenceFrameIndex - num;
                    float          t          = ((float)(double)(num2 & 0xFF) + Singleton <SimulationManager> .instance.m_referenceTimer) * 0.00390625f;
                    Building.Frame frameData  = data.GetFrameData(num2 - 512);
                    Building.Frame frameData2 = data.GetFrameData(num2 - 256);
                    instance.m_dataVector0.x = Mathf.Max(0f, (Mathf.Lerp((int)frameData.m_fireDamage, (int)frameData2.m_fireDamage, t) - 127f) * 0.0078125f);
                    instance.m_dataVector0.y = 0f;
                    instance.m_dataVector0.z = (((data.m_flags & Building.Flags.Abandoned) == 0) ? 0f : 1f);
                    float      num3       = 0f;
                    Randomizer randomizer = new Randomizer(buildingID);
                    int        num4       = randomizer.Int32(4u);
                    if (frameData.m_constructState != 0)
                    {
                        float y    = __instance.m_info.m_size.y;
                        float num5 = (float)GetCollapseTimeReverse(__instance);
                        num5 /= Mathf.Max(1f, num5 - 6f);
                        float num6 = Mathf.Lerp((int)frameData.m_constructState, (int)frameData2.m_constructState, t) * 0.003921569f;
                        num3 = 1f - num5 * (1f - num6);
                        instance.m_dataVector0.y = Mathf.Max(instance.m_dataVector0.y, y * num3);
                        if (instance.m_dataVector0.y > 0.1f)
                        {
                            __instance.RenderProps(cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: false, renderNonfixed: true);
                            float      angle      = data.m_angle;
                            Vector3    position   = instance.m_position;
                            Quaternion rotation   = instance.m_rotation;
                            Matrix4x4  dataMatrix = instance.m_dataMatrix1;
                            float      f          = (float)randomizer.Int32(1000u) * ((float)Math.PI / 500f);
                            float      num7       = randomizer.Int32(10, 45);
                            float      angle2     = (1f - num3) * (1f - num3) * num7;
                            Vector3    axis       = new Vector3(Mathf.Cos(f), 0f, Mathf.Sin(f));
                            float      num8       = (y - instance.m_dataVector0.y) * (y - instance.m_dataVector0.y) / y;
                            instance.m_position.x += axis.z * num8 * num7 * 0.01f;
                            instance.m_position.z -= axis.x * num8 * num7 * 0.01f;
                            instance.m_position.y -= num8;
                            instance.m_rotation    = Quaternion.AngleAxis(angle2, axis) * Quaternion.AngleAxis(angle * 57.29578f, Vector3.down);
                            instance.m_dataMatrix1.SetTRS(instance.m_position, instance.m_rotation, Vector3.one);
                            instance.m_dataVector0.y = y;
#if UseTask
                            var localData     = data;
                            var localInstance = instance;
                            Patcher.Dispatcher.Add(() => __instance.RenderMeshes(cameraInfo, buildingID, ref localData, layerMask, ref localInstance));
#else
                            __instance.RenderMeshes(cameraInfo, buildingID, ref data, layerMask, ref instance);
#endif
                            __instance.RenderProps(cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: true, renderNonfixed: false);
                            instance.m_dataVector0.y = y - num8;
                            instance.m_position      = position;
                            instance.m_rotation      = rotation;
                            instance.m_dataMatrix1   = dataMatrix;
                        }
                        else if ((data.m_flags & Building.Flags.Demolishing) == 0)
                        {
                            RenderDestroyedPropsPrefix(__instance, cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: false, renderNonfixed: true);
                        }
                    }
                    else if ((data.m_flags & Building.Flags.Demolishing) == 0)
                    {
                        RenderDestroyedPropsPrefix(__instance, cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: false, renderNonfixed: true);
                    }
                    float num9 = Mathf.Clamp01(1f - num3);
                    instance.m_dataVector0.x = 0f - instance.m_dataVector0.x;
                    if ((data.m_flags & Building.Flags.Demolishing) == 0 && num9 > 0.01f)
                    {
                        BuildingInfoBase collapsedInfo = __instance.m_info.m_collapsedInfo;
                        if (__instance.m_info.m_mesh != null && collapsedInfo != null)
                        {
                            if (((1 << num4) & __instance.m_info.m_collapsedRotations) == 0)
                            {
                                num4 = ((num4 + 1) & 3);
                            }
                            Vector3 min   = __instance.m_info.m_generatedInfo.m_min;
                            Vector3 max   = __instance.m_info.m_generatedInfo.m_max;
                            float   num10 = (float)data.Width * 4f;
                            float   num11 = (float)data.Length * 4f;
                            float   num12 = Building.CalculateLocalMeshOffset(__instance.m_info, data.Length);
                            min = Vector3.Max(min - new Vector3(4f, 0f, 4f + num12), new Vector3(0f - num10, 0f, 0f - num11));
                            max = Vector3.Min(max + new Vector3(4f, 0f, 4f - num12), new Vector3(num10, 0f, num11));
                            Vector3    vector  = (min + max) * 0.5f;
                            Vector3    vector2 = max - min;
                            float      x       = (((num4 & 1) != 0) ? vector2.z : vector2.x) * num9 / Mathf.Max(1f, collapsedInfo.m_generatedInfo.m_size.x);
                            float      z       = (((num4 & 1) != 0) ? vector2.x : vector2.z) * num9 / Mathf.Max(1f, collapsedInfo.m_generatedInfo.m_size.z);
                            Quaternion q       = Quaternion.AngleAxis((float)num4 * 90f, Vector3.down);
                            instance.m_dataVector0.y = Mathf.Max(instance.m_dataVector0.y, collapsedInfo.m_generatedInfo.m_size.y);
                            Matrix4x4 matrix = Matrix4x4.TRS(new Vector3(vector.x, 0f, vector.z + num12), q, new Vector3(x, num9, z));
                            collapsedInfo.m_rendered = true;
#if UseTask
                            var localInstance = instance;
                            Patcher.Dispatcher.Add(() => BuildingAI.RenderMesh(cameraInfo, __instance.m_info, collapsedInfo, matrix, ref localInstance));
#else
                            BuildingAI.RenderMesh(cameraInfo, __instance.m_info, collapsedInfo, matrix, ref instance);
#endif
                        }
                    }
                    if (Singleton <InfoManager> .instance.CurrentMode == InfoManager.InfoMode.None)
                    {
#if UseTask
                        var localData = data;
                        Patcher.Dispatcher.Add(() => __instance.RenderCollapseEffect(cameraInfo, buildingID, ref localData, num3));
#else
                        __instance.RenderCollapseEffect(cameraInfo, buildingID, ref data, num3);
#endif
                    }
                    return(false);
                }
                uint           num13      = (uint)(buildingID << 8) / 49152u;
                uint           num14      = Singleton <SimulationManager> .instance.m_referenceFrameIndex - num13;
                float          t2         = ((float)(double)(num14 & 0xFF) + Singleton <SimulationManager> .instance.m_referenceTimer) * 0.00390625f;
                Building.Frame frameData3 = data.GetFrameData(num14 - 512);
                Building.Frame frameData4 = data.GetFrameData(num14 - 256);
                float          num15      = 0f;
                BuildingInfo   buildingInfo;
                BuildingInfo   buildingInfo2;
                if ((data.m_flags & Building.Flags.Upgrading) != 0)
                {
                    BuildingInfo upgradeInfo = __instance.GetUpgradeInfo(buildingID, ref data);
                    if (upgradeInfo != null)
                    {
                        buildingInfo  = __instance.m_info;
                        buildingInfo2 = upgradeInfo;
                    }
                    else
                    {
                        buildingInfo  = null;
                        buildingInfo2 = __instance.m_info;
                    }
                }
                else
                {
                    buildingInfo  = null;
                    buildingInfo2 = __instance.m_info;
                }
                float num16 = buildingInfo2.m_size.y;
                if (buildingInfo != null)
                {
                    num16 = Mathf.Max(num16, buildingInfo.m_size.y);
                }
                float num17 = (float)GetConstructionTimeReverse(__instance);
                num17 /= Mathf.Max(1f, num17 - 6f);
                float num18 = Mathf.Max(0.5f, num16 / 60f);
                float num19 = Mathf.Ceil(num16 / num18 / 6f) * 6f;
                float num20 = (num19 * 2f + 6f) * num17 * Mathf.Lerp((int)frameData3.m_constructState, (int)frameData4.m_constructState, t2) * 0.003921569f;
                float num21 = (num20 - 6f) * num18;
                if (num21 >= buildingInfo2.m_size.y && instance.m_dataInt0 != buildingInfo2.m_prefabDataIndex)
                {
                    BuildingAI.RefreshInstance(buildingInfo2, cameraInfo, buildingID, ref data, layerMask, ref instance, requireHeightMap: false);
                }
                float num22 = (!(num20 > num19)) ? num20 : Mathf.Min(num19, num19 * 2f + 6f - num20);
                if (frameData4.m_productionState < frameData3.m_productionState)
                {
                    instance.m_dataVector3.w = Mathf.Lerp((int)frameData3.m_productionState, (float)(int)frameData4.m_productionState + 256f, t2) * 0.00390625f;
                    if (instance.m_dataVector3.w >= 1f)
                    {
                        instance.m_dataVector3.w -= 1f;
                    }
                }
                else
                {
                    instance.m_dataVector3.w = Mathf.Lerp((int)frameData3.m_productionState, (int)frameData4.m_productionState, t2) * 0.00390625f;
                }
                if (buildingInfo != null)
                {
                    instance.m_position = Building.CalculateMeshPosition(buildingInfo, data.m_position, data.m_angle, data.Length);
                    instance.m_rotation = Quaternion.AngleAxis(data.m_angle * 57.29578f, Vector3.down);
                    instance.m_dataMatrix1.SetTRS(instance.m_position, instance.m_rotation, Vector3.one);
                    instance.m_dataColor0 = buildingInfo.m_buildingAI.GetColor(buildingID, ref data, Singleton <InfoManager> .instance.CurrentMode);
                    float num23 = num20 * num18;
                    float num24 = (!(num23 > buildingInfo.m_size.y)) ? buildingInfo.m_size.y : (buildingInfo.m_size.y * 2f - num23);
                    if (num24 > 0f)
                    {
                        instance.m_dataVector0.y = 0f - num24;
                        instance.m_dataVector0.x = num22 * num18;
#if UseTask
                        var localData     = data;
                        var localInstance = instance;
                        Patcher.Dispatcher.Add(() => buildingInfo.m_buildingAI.RenderMeshes(cameraInfo, buildingID, ref localData, layerMask, ref localInstance));
#else
                        buildingInfo.m_buildingAI.RenderMeshes(cameraInfo, buildingID, ref data, layerMask, ref instance);
#endif
                        num15 = Mathf.Max(num15, instance.m_dataVector0.y);
                        if (instance.m_dataVector0.y >= buildingInfo.m_size.y && instance.m_dataInt0 == buildingInfo.m_prefabDataIndex)
                        {
                            layerMask &= ~(1 << Singleton <TreeManager> .instance.m_treeLayer);
                            buildingInfo.m_buildingAI.RenderProps(cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: true, renderNonfixed: true);
                        }
                    }
                }
                float num25  = data.m_angle;
                int   length = data.Length;
                int   num26  = 0;
                if (buildingInfo != null && buildingInfo2 != null)
                {
                    if (buildingInfo.m_zoningMode == BuildingInfo.ZoningMode.CornerLeft && buildingInfo2.m_zoningMode == BuildingInfo.ZoningMode.CornerRight)
                    {
                        num25 -= (float)Math.PI / 2f;
                        num26  = -1;
                        length = data.Width;
                    }
                    else if (buildingInfo.m_zoningMode == BuildingInfo.ZoningMode.CornerRight && buildingInfo2.m_zoningMode == BuildingInfo.ZoningMode.CornerLeft)
                    {
                        num25 += (float)Math.PI / 2f;
                        num26  = 1;
                        length = data.Width;
                    }
                }
                instance.m_position = Building.CalculateMeshPosition(buildingInfo2, data.m_position, num25, length);
                instance.m_rotation = Quaternion.AngleAxis(num25 * 57.29578f, Vector3.down);
                instance.m_dataMatrix1.SetTRS(instance.m_position, instance.m_rotation, Vector3.one);
                instance.m_dataColor0 = buildingInfo2.m_buildingAI.GetColor(buildingID, ref data, Singleton <InfoManager> .instance.CurrentMode);
                if (num21 > 0f)
                {
                    instance.m_dataVector0.y = 0f - num21;
                    instance.m_dataVector0.x = num22 * num18;
#if UseTask
                    var localData     = data;
                    var localInstance = instance;
                    Patcher.Dispatcher.Add(() => buildingInfo2.m_buildingAI.RenderMeshes(cameraInfo, buildingID, ref localData, layerMask, ref localInstance));
#else
                    buildingInfo2.m_buildingAI.RenderMeshes(cameraInfo, buildingID, ref data, layerMask, ref instance);
#endif
                    num15 = Mathf.Max(num15, instance.m_dataVector0.y);
                    if (num21 >= buildingInfo2.m_size.y && instance.m_dataInt0 == buildingInfo2.m_prefabDataIndex)
                    {
                        layerMask &= ~(1 << Singleton <TreeManager> .instance.m_treeLayer);
                        buildingInfo2.m_buildingAI.RenderProps(cameraInfo, buildingID, ref data, layerMask, ref instance, renderFixed: true, renderNonfixed: true);
                    }
                }
                BuildingManager instance2 = Singleton <BuildingManager> .instance;
                if (instance2.m_common != null)
                {
                    BuildingInfoBase construction = instance2.m_common.m_construction;
                    Vector3          vector3      = buildingInfo2.m_generatedInfo.m_max;
                    Vector3          vector4      = buildingInfo2.m_generatedInfo.m_min;
                    if (buildingInfo != null)
                    {
                        Vector3 zero = Vector3.zero;
                        zero.z = 0f - Building.CalculateLocalMeshOffset(buildingInfo2, length);
                        switch (num26)
                        {
                        case -1:
                        {
                            zero.x -= Building.CalculateLocalMeshOffset(buildingInfo, data.Length);
                            Vector3 max3 = buildingInfo.m_generatedInfo.m_max;
                            Vector3 min3 = buildingInfo.m_generatedInfo.m_min;
                            vector3 = Vector3.Max(vector3, new Vector3(max3.z, max3.y, 0f - min3.x) - zero);
                            vector4 = Vector3.Min(vector4, new Vector3(min3.z, min3.y, 0f - max3.x) - zero);
                            break;
                        }

                        case 1:
                        {
                            zero.x += Building.CalculateLocalMeshOffset(buildingInfo, data.Length);
                            Vector3 max2 = buildingInfo.m_generatedInfo.m_max;
                            Vector3 min2 = buildingInfo.m_generatedInfo.m_min;
                            vector3 = Vector3.Max(vector3, new Vector3(max2.z, max2.y, max2.x) - zero);
                            vector4 = Vector3.Min(vector4, new Vector3(min2.z, min2.y, min2.x) - zero);
                            break;
                        }

                        default:
                            zero.z += Building.CalculateLocalMeshOffset(buildingInfo, data.Length);
                            vector3 = Vector3.Max(vector3, buildingInfo.m_generatedInfo.m_max - zero);
                            vector4 = Vector3.Min(vector4, buildingInfo.m_generatedInfo.m_min - zero);
                            break;
                        }
                    }
                    Vector3   vector5 = vector3 - vector4;
                    float     x2      = (vector5.x + 1f) / Mathf.Max(1f, construction.m_generatedInfo.m_size.x);
                    float     z2      = (vector5.z + 1f) / Mathf.Max(1f, construction.m_generatedInfo.m_size.z);
                    Matrix4x4 matrix2 = Matrix4x4.TRS(new Vector3((vector3.x + vector4.x) * 0.5f, 0f, (vector3.z + vector4.z) * 0.5f), s: new Vector3(x2, num18, z2), q: Quaternion.identity);
                    if (num22 > 0f)
                    {
                        instance.m_dataVector0.y = num22;
                        construction.m_rendered  = true;
#if UseTask
                        var localInstance = instance;
                        Patcher.Dispatcher.Add(() => BuildingAI.RenderMesh(cameraInfo, buildingInfo2, construction, matrix2, ref localInstance));
#else
                        BuildingAI.RenderMesh(cameraInfo, buildingInfo2, construction, matrix2, ref instance);
#endif
                        num15 = Mathf.Max(num15, instance.m_dataVector0.y);
                    }
                }
                instance.m_dataVector0.y = num15;
                return(false);
            }
            if (!__instance.m_hideGarbageBins)
            {
#if UseTask
                var localData     = data;
                var localInstance = instance;
                Patcher.Dispatcher.Add(() => __instance.RenderGarbageBins(cameraInfo, buildingID, ref localData, layerMask, ref localInstance));
#else
                __instance.RenderGarbageBins(cameraInfo, buildingID, ref data, layerMask, ref instance);
#endif
            }
            uint           num27      = (uint)(buildingID << 8) / 49152u;
            uint           num28      = Singleton <SimulationManager> .instance.m_referenceFrameIndex - num27;
            float          t3         = ((float)(double)(num28 & 0xFF) + Singleton <SimulationManager> .instance.m_referenceTimer) * 0.00390625f;
            Building.Frame frameData5 = data.GetFrameData(num28 - 512);
            Building.Frame frameData6 = data.GetFrameData(num28 - 256);
            instance.m_dataVector0.x = Mathf.Max(0f, (Mathf.Lerp((int)frameData5.m_fireDamage, (int)frameData6.m_fireDamage, t3) - 127f) * 0.0078125f);
            instance.m_dataVector0.z = (((data.m_flags & Building.Flags.Abandoned) == 0) ? 0f : 1f);
            if (frameData6.m_productionState < frameData5.m_productionState)
            {
                instance.m_dataVector3.w = Mathf.Lerp((int)frameData5.m_productionState, (float)(int)frameData6.m_productionState + 256f, t3) * 0.00390625f;
                if (instance.m_dataVector3.w >= 1f)
                {
                    instance.m_dataVector3.w -= 1f;
                }
            }
            else
            {
                instance.m_dataVector3.w = Mathf.Lerp((int)frameData5.m_productionState, (int)frameData6.m_productionState, t3) * 0.00390625f;
            }
            RenderInstanceBuildingAIPrefix(__instance, cameraInfo, buildingID, ref data, layerMask, ref instance);
            if (data.m_fireIntensity != 0 && Singleton <InfoManager> .instance.CurrentMode == InfoManager.InfoMode.None)
            {
#if UseTask
                var localData     = data;
                var localInstance = instance;
                var action        = new Action(() =>
                {
                    __instance.RenderFireEffect(cameraInfo, buildingID, ref localData, localInstance.m_dataVector0.x);
                    RenderFireEffectPropsReverse(__instance, cameraInfo, buildingID, ref localData, ref localInstance, (float)(int)localData.m_fireIntensity * 0.003921569f, localInstance.m_dataVector0.x, true, true);
                });
                Patcher.Dispatcher.Add(action);
#else
                __instance.RenderFireEffect(cameraInfo, buildingID, ref data, instance.m_dataVector0.x);
                RenderFireEffectPropsReverse(__instance, cameraInfo, buildingID, ref data, ref instance, (float)(int)data.m_fireIntensity * 0.003921569f, instance.m_dataVector0.x, true, true);
#endif
            }

            return(false);
        }
        private void BuildingAIRenderMesh(RenderManager.CameraInfo cameraInfo, BuildingInfo info, BuildingInfoBase subInfo, Matrix4x4 matrix, ref RenderManager.Instance instance)
        {
            matrix = instance.m_dataMatrix1 * matrix;

            BuildingManager instance2 = Singleton<BuildingManager>.instance;

            instance2.m_materialBlock.Clear();
            instance2.m_materialBlock.AddVector(instance2.ID_BuildingState, instance.m_dataVector0);
            instance2.m_materialBlock.AddVector(instance2.ID_ObjectIndex, instance.m_dataVector3);
            instance2.m_materialBlock.AddColor(instance2.ID_Color, instance.m_dataColor0);
            if (subInfo.m_requireHeightMap)
            {
                instance2.m_materialBlock.AddTexture(instance2.ID_HeightMap, instance.m_dataTexture0);
                instance2.m_materialBlock.AddVector(instance2.ID_HeightMapping, instance.m_dataVector1);
                instance2.m_materialBlock.AddVector(instance2.ID_SurfaceMapping, instance.m_dataVector2);
            }
            BuildingManager expr_D9_cp_0 = instance2;

            expr_D9_cp_0.m_drawCallData.m_defaultCalls = expr_D9_cp_0.m_drawCallData.m_defaultCalls + 1;
            Bounds bounds = subInfo.m_mesh.bounds;
            if (bounds.min.y > 0.1f - instance.m_dataVector0.w)
            {
                Vector3 min = bounds.min;
                min.y = -instance.m_dataVector0.w;
                bounds.min = min;
                subInfo.m_mesh.bounds = bounds;
            }

            Graphics.DrawMesh(subInfo.m_mesh, matrix, subInfo.m_material, info.m_prefabDataLayer, null, 0, instance2.m_materialBlock);
        }