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); }