public static void RenderInstance(ref Building b, RenderManager.CameraInfo cameraInfo, ushort buildingID, int layerMask) { if ((b.m_flags & (Building.Flags.Created | Building.Flags.Deleted | Building.Flags.Hidden)) != Building.Flags.Created) return; BuildingInfo info = b.Info; //begin mod if (info == null) { return; } var ai = info.m_buildingAI; if ((layerMask & 1 << info.m_prefabDataLayer) == 0 && !(ai is PlayerBuildingAI || ai is DecorationBuildingAI/* || ai is DummyBuildingAI*/)) //TODO(earalov): do we need to uncomment that? //end mod return; Vector3 point = b.m_position; float radius = info.m_renderSize + (float)b.m_baseHeight * 0.5f; point.y += (float)(((double)info.m_size.y - (double)b.m_baseHeight) * 0.5); if (!cameraInfo.Intersect(point, radius)) return; RenderManager instance = Singleton<RenderManager>.instance; uint instanceIndex; if (!instance.RequireInstance((uint)buildingID, 1U, out instanceIndex)) return; RenderInstance(ref b, cameraInfo, buildingID, layerMask, info, ref instance.m_instances[(uint)instanceIndex]); }
protected void BeginOverlayImpl(RenderManager.CameraInfo cameraInfo) { var g = GameAreaManager.instance; float m_borderAlpha = (float)g.GetType().GetField("m_borderAlpha", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); float m_areaAlpha = (float)g.GetType().GetField("m_areaAlpha", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); Material m_borderMaterial = (Material)g.GetType().GetField("m_borderMaterial", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); Material m_areaMaterial = (Material)g.GetType().GetField("m_areaMaterial", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); Material m_decorationMaterial = (Material)g.GetType().GetField("m_decorationMaterial", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); Mesh m_borderMesh = (Mesh)g.GetType().GetField("m_borderMesh", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); int ID_Color = (int)g.GetType().GetField("ID_Color", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); int ID_AreaMapping = (int)g.GetType().GetField("ID_AreaMapping", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(g); if ((double)m_borderAlpha >= 1.0 / 1000.0 && (UnityEngine.Object)m_borderMaterial != (UnityEngine.Object)null) { Quaternion rotation = Quaternion.AngleAxis(90f, Vector3.up); Color color = Color.white; ToolController toolController = Singleton<ToolManager>.instance.m_properties; if ((UnityEngine.Object)toolController != (UnityEngine.Object)null && (toolController.CurrentTool.GetErrors() & ToolBase.ToolErrors.OutOfArea) != ToolBase.ToolErrors.None) color = Color.red; color.a = m_borderAlpha; for (int z = 0; z < GRID; z +=1) { for (int x = 0; x < GRID; x +=1) { bool flag1 = g.GetArea(x, z) > 0; bool flag2 = g.GetArea(x, z - 1) > 0; bool flag3 = g.GetArea(x - 1, z) > 0; if (flag1 != flag2) { Vector3 vector3 = new Vector3((float)(((double)x - 4.5 + 0.5) * 1920.0), 0.0f, (float)(((double)z - 4.5) * 1920.0)); Vector3 size = new Vector3(1920f, 1024f, 100f); Bounds bounds = new Bounds(vector3 + new Vector3(0.0f, size.y * 0.5f, 0.0f), size); if (cameraInfo.Intersect(bounds)) { Singleton<TerrainManager>.instance.SetWaterMaterialProperties(vector3, m_borderMaterial); m_borderMaterial.SetColor(ID_Color, color); if (m_borderMaterial.SetPass(0)) { ++Singleton<GameAreaManager>.instance.m_drawCallData.m_overlayCalls; Graphics.DrawMeshNow(m_borderMesh, vector3, rotation); } } } if (flag1 != flag3) { Vector3 vector3 = new Vector3((float)(((double)x - 4.5) * 1920.0), 0.0f, (float)(((double)z - 4.5 + 0.5) * 1920.0)); Vector3 size = new Vector3(100f, 1024f, 1920f); Bounds bounds = new Bounds(vector3 + new Vector3(0.0f, size.y * 0.5f, 0.0f), size); if (cameraInfo.Intersect(bounds)) { Singleton<TerrainManager>.instance.SetWaterMaterialProperties(vector3, m_borderMaterial); m_borderMaterial.SetColor(ID_Color, color); if (m_borderMaterial.SetPass(0)) { ++Singleton<GameAreaManager>.instance.m_drawCallData.m_overlayCalls; Graphics.DrawMeshNow(m_borderMesh, vector3, Quaternion.identity); } } } } } } if (m_areaAlpha < 1.0 / 1000.0 || !((UnityEngine.Object)m_areaMaterial != (UnityEngine.Object)null)) return; Vector4 vector; vector.z = 1 / (float)(1920f * TEXSIZE); //6.510417E-05f; vector.x = (GRID + 2) / (float)(TEXSIZE * 2); // 0.5f; vector.y = (GRID + 2)/ (float)(TEXSIZE * 2); // 0.5f; vector.w = 0.125f; m_areaMaterial.mainTexture = (Texture)m_areaTex; m_areaMaterial.SetColor(ID_Color, new Color(1f, 1f, 1f, m_areaAlpha)); m_areaMaterial.SetVector(ID_AreaMapping, vector); Bounds freeBounds = GetFreeBounds(); freeBounds.size = freeBounds.size + new Vector3(100f, 1f, 100f); ++Singleton<GameAreaManager>.instance.m_drawCallData.m_overlayCalls; Singleton<RenderManager>.instance.OverlayEffect.DrawEffect(cameraInfo, m_areaMaterial, 0, freeBounds); }
public static bool RenderInstance(ref CitizenInstance instance, RenderManager.CameraInfo cameraInfo, ushort instanceID) { if ((instance.m_flags & CitizenInstance.Flags.Character) == CitizenInstance.Flags.None) return false; CitizenInfo info = instance.Info; if ((UnityEngine.Object)info == (UnityEngine.Object)null) return false; uint num = Singleton<SimulationManager>.instance.m_referenceFrameIndex - ((uint)instanceID << 4) / 65536U; CitizenInstance.Frame frameData1 = instance.GetFrameData(num - 32U); float maxDistance = Mathf.Min(RenderManager.LevelOfDetailFactor * 800f, info.m_maxRenderDistance + cameraInfo.m_height * 0.5f); if (!cameraInfo.CheckRenderDistance(frameData1.m_position, maxDistance) || !cameraInfo.Intersect(frameData1.m_position, 10f)) return false; CitizenInstance.Frame frameData2 = instance.GetFrameData(num - 16U); float t = (float)(((double)(num & 15U) + (double)Singleton<SimulationManager>.instance.m_referenceTimer) * (1.0 / 16.0)); bool flag1 = frameData2.m_underground && frameData1.m_underground; bool flag2 = frameData2.m_insideBuilding && frameData1.m_insideBuilding; bool flag3 = frameData2.m_transition || frameData1.m_transition; if (flag2 && !flag3 || flag1 && !flag3 && (cameraInfo.m_layerMask & 1 << Singleton<CitizenManager>.instance.m_undergroundLayer) == 0) return false; //begin mod info = GetUpdatedInfo(instance, instanceID); //end mod Vector3 vector3 = new Bezier3() { a = frameData1.m_position, b = (frameData1.m_position + frameData1.m_velocity * 0.333f), c = (frameData2.m_position - frameData2.m_velocity * 0.333f), d = frameData2.m_position }.Position(t); Quaternion quaternion = Quaternion.Lerp(frameData1.m_rotation, frameData2.m_rotation, t); Color color = info.m_citizenAI.GetColor(instanceID, ref instance, Singleton<InfoManager>.instance.CurrentMode); if (cameraInfo.CheckRenderDistance(vector3, info.m_lodRenderDistance)) { InstanceID id = InstanceID.Empty; id.CitizenInstance = instanceID; CitizenInfo citizenInfo = info.ObtainPrefabInstance<CitizenInfo>(id, (int)byte.MaxValue); if ((UnityEngine.Object)citizenInfo != (UnityEngine.Object)null) { Vector3 velocity = Vector3.Lerp(frameData1.m_velocity, frameData2.m_velocity, t); //begin mod if (info.m_subCulture == Citizen.SubCulture.Generic) { citizenInfo.m_citizenAI.SetRenderParameters(cameraInfo, instanceID, ref instance, vector3, quaternion, velocity, color, (flag1 || flag3) && (cameraInfo.m_layerMask & 1 << Singleton<CitizenManager>.instance.m_undergroundLayer) != 0); } else { citizenInfo.SetRenderParameters(vector3, quaternion, velocity, color, 5, (flag1 || flag3) && (cameraInfo.m_layerMask & 1 << Singleton<CitizenManager>.instance.m_undergroundLayer) != 0); } //end mod return true; } } if (flag1 || flag3) { info.m_undergroundLodLocations[info.m_undergroundLodCount].SetTRS(vector3, quaternion, Vector3.one); info.m_undergroundLodColors[info.m_undergroundLodCount] = color; info.m_undergroundLodMin = Vector3.Min(info.m_undergroundLodMin, vector3); info.m_undergroundLodMax = Vector3.Max(info.m_undergroundLodMax, vector3); if (++info.m_undergroundLodCount == info.m_undergroundLodLocations.Length) CitizenInstance.RenderUndergroundLod(cameraInfo, info); } if (!flag1 || flag3) { info.m_lodLocations[info.m_lodCount].SetTRS(vector3, quaternion, Vector3.one); info.m_lodColors[info.m_lodCount] = color; info.m_lodMin = Vector3.Min(info.m_lodMin, vector3); info.m_lodMax = Vector3.Max(info.m_lodMax, vector3); if (++info.m_lodCount == info.m_lodLocations.Length) CitizenInstance.RenderLod(cameraInfo, info); } return true; }
private void BuildingRenderInstance(Building building, RenderManager.CameraInfo cameraInfo, ushort buildingID, int layerMask) { if (building.m_flags == Building.Flags.None) { return; } BuildingInfo info = building.Info; if ((layerMask & 1 << info.m_prefabDataLayer) == 0) { return; } Vector3 position = building.m_position; float radius = info.m_renderSize + (float)building.m_baseHeight * 0.5f; position.y += (info.m_size.y - (float)building.m_baseHeight) * 0.5f; if (!cameraInfo.Intersect(position, radius)) { return; } RenderManager instance = Singleton<RenderManager>.instance; uint num; if (instance.RequireInstance((uint)buildingID, 1u, out num)) { BuildingRenderInstance(building, cameraInfo, buildingID, layerMask, info, ref instance.m_instances[(int)((UIntPtr)num)]); } }