public override void Transform(InstanceState state, ref Matrix4x4 matrix4x, float deltaHeight, float deltaAngle, Vector3 center, bool followTerrain) { Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaHeight; /*if (!PropManager.instance.m_props.m_buffer[id.Prop].FixedHeight && deltaHeight != 0 && (MoveItLoader.loadMode == ICities.LoadMode.LoadAsset || MoveItLoader.loadMode == ICities.LoadMode.NewAsset)) * { * PropManager.instance.m_props.m_buffer[id.Prop].FixedHeight = true; * }*/ if (followTerrain) { newPosition.y = newPosition.y + TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition) - state.terrainHeight; } Move(newPosition, state.angle + deltaAngle); }
public override void RenderCloneGeometry(InstanceState instanceState, ref Matrix4x4 matrix4x, Vector3 deltaPosition, float deltaAngle, Vector3 center, bool followTerrain, RenderManager.CameraInfo cameraInfo, Color toolColor) { TreeState state = instanceState as TreeState; TreeInfo info = state.Info.Prefab as TreeInfo; Randomizer randomizer = new Randomizer(state.instance.id.Tree); float scale = info.m_minScale + (float)randomizer.Int32(10000u) * (info.m_maxScale - info.m_minScale) * 0.0001f; float brightness = info.m_minBrightness + (float)randomizer.Int32(10000u) * (info.m_maxBrightness - info.m_minBrightness) * 0.0001f; Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaPosition.y; if (followTerrain) { newPosition.y = newPosition.y - state.terrainHeight + TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition); } TreeInstance.RenderInstance(cameraInfo, info, newPosition, scale, brightness, RenderManager.DefaultColorLocation); }
public override Instance Clone(InstanceState instanceState, ref Matrix4x4 matrix4x, float deltaHeight, float deltaAngle, Vector3 center, bool followTerrain, Dictionary <ushort, ushort> clonedNodes, Action action) { NodeState state = instanceState as NodeState; Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaHeight; if (followTerrain) { newPosition.y = newPosition.y + TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition) - state.terrainHeight; } Instance cloneInstance = null; if (NetManager.instance.CreateNode(out ushort clone, ref SimulationManager.instance.m_randomizer, state.Info.Prefab as NetInfo, newPosition, SimulationManager.instance.m_currentBuildIndex)) { SimulationManager.instance.m_currentBuildIndex++; InstanceID cloneID = default; cloneID.NetNode = clone; nodeBuffer[clone].m_flags = state.flags; nodeBuffer[clone].CalculateNode(clone); nodeBuffer[clone].Info.m_netAI.GetNodeBuilding(clone, ref nodeBuffer[clone], out BuildingInfo newBuilding, out float heightOffset); nodeBuffer[clone].UpdateBuilding(clone, newBuilding, heightOffset); cloneInstance = new MoveableNode(cloneID); if (((NetNode)data).m_building > 0) { buildingBuffer[((NetNode)(cloneInstance.data)).m_building].m_flags = buildingBuffer[((NetNode)data).m_building].m_flags; } } return(cloneInstance); }
public override void RenderCloneOverlay(InstanceState instanceState, ref Matrix4x4 matrix4x, Vector3 deltaPosition, float deltaAngle, Vector3 center, bool followTerrain, RenderManager.CameraInfo cameraInfo, Color toolColor) { //if (MoveItTool.m_isLowSensitivity) return; PropState state = instanceState as PropState; PropInfo info = state.Info.Prefab as PropInfo; Randomizer randomizer = new Randomizer(state.instance.id.Prop); float scale = info.m_minScale + (float)randomizer.Int32(10000u) * (info.m_maxScale - info.m_minScale) * 0.0001f; Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaPosition.y; if (followTerrain) { newPosition.y = newPosition.y - state.terrainHeight + TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition); } float newAngle = state.angle + deltaAngle; PropTool.RenderOverlay(cameraInfo, info, newPosition, scale, newAngle, toolColor); }
public override void LoadFromState(InstanceState state) { if (!(state is BuildingState buildingState)) { return; } ushort building = buildingState.instance.id.Building; buildingBuffer[building].m_flags = buildingState.flags; AddFixedHeightFlag(building); RelocateBuilding(building, ref buildingBuffer[building], buildingState.position, buildingState.angle); isSubInstance = buildingState.isSubInstance; isHidden = buildingState.isHidden; if (buildingState.subStates != null) { foreach (InstanceState subState in buildingState.subStates) { subState.instance.LoadFromState(subState); } } buildingBuffer[building].m_flags = buildingState.flags; }
public override Instance Clone(InstanceState instanceState, Dictionary <ushort, ushort> clonedNodes) { NodeState state = instanceState as NodeState; MoveableNode cloneInstance = null; if (NetManager.instance.CreateNode(out ushort clone, ref SimulationManager.instance.m_randomizer, state.Info.Prefab as NetInfo, state.position, SimulationManager.instance.m_currentBuildIndex)) { SimulationManager.instance.m_currentBuildIndex++; InstanceID cloneID = default; cloneID.NetNode = clone; cloneInstance = new MoveableNode(cloneID); nodeBuffer[clone].m_flags = state.flags; // TODO: Clone pillar instead? nodeBuffer[clone].Info.m_netAI.GetNodeBuilding(clone, ref nodeBuffer[clone], out BuildingInfo newBuilding, out float heightOffset); nodeBuffer[clone].UpdateBuilding(clone, newBuilding, heightOffset); } return(cloneInstance); }
public override void RenderCloneGeometry(InstanceState instanceState, ref Matrix4x4 matrix4x, Vector3 deltaPosition, float deltaAngle, Vector3 center, bool followTerrain, RenderManager.CameraInfo cameraInfo, Color toolColor) { RenderCloneGeometryImplementation(instanceState, ref matrix4x, deltaPosition, deltaAngle, center, followTerrain, cameraInfo); }
public override Instance Clone(InstanceState instanceState, ref Matrix4x4 matrix4x, float deltaHeight, float deltaAngle, Vector3 center, bool followTerrain, Dictionary <ushort, ushort> clonedNodes, Action action) { BuildingState state = instanceState as BuildingState; Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaHeight; float terrainHeight = TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition); if (followTerrain) { newPosition.y = newPosition.y + terrainHeight - state.terrainHeight; } MoveableBuilding cloneInstance = null; BuildingInfo info = state.Info.Prefab as BuildingInfo; float newAngle = state.angle + deltaAngle; if (BuildingManager.instance.CreateBuilding(out ushort clone, ref SimulationManager.instance.m_randomizer, info, newPosition, newAngle, state.length, SimulationManager.instance.m_currentBuildIndex)) { SimulationManager.instance.m_currentBuildIndex++; InstanceID cloneID = default; cloneID.Building = clone; cloneInstance = new MoveableBuilding(cloneID); if ((state.flags & Building.Flags.Completed) != Building.Flags.None) { buildingBuffer[clone].m_flags = buildingBuffer[clone].m_flags | Building.Flags.Completed; } if ((state.flags & Building.Flags.FixedHeight) != Building.Flags.None) { buildingBuffer[clone].m_flags = buildingBuffer[clone].m_flags | Building.Flags.FixedHeight; } if ((state.flags & Building.Flags.Historical) != Building.Flags.None) { buildingBuffer[clone].m_flags = buildingBuffer[clone].m_flags | Building.Flags.Historical; } if ((state.flags & Building.Flags.Hidden) != Building.Flags.None) { buildingBuffer[clone].m_flags = buildingBuffer[clone].m_flags | Building.Flags.Hidden; } if (Mathf.Abs(terrainHeight - newPosition.y) > 0.01f) { AddFixedHeightFlag(clone); } else { RemoveFixedHeightFlag(clone); } if (info.m_subBuildings != null && info.m_subBuildings.Length != 0) { Matrix4x4 subMatrix4x = default; subMatrix4x.SetTRS(newPosition, Quaternion.AngleAxis(newAngle * Mathf.Rad2Deg, Vector3.down), Vector3.one); for (int i = 0; i < info.m_subBuildings.Length; i++) { BuildingInfo subInfo = info.m_subBuildings[i].m_buildingInfo; Vector3 subPosition = subMatrix4x.MultiplyPoint(info.m_subBuildings[i].m_position); float subAngle = info.m_subBuildings[i].m_angle * 0.0174532924f + newAngle; if (BuildingManager.instance.CreateBuilding(out ushort subClone, ref SimulationManager.instance.m_randomizer, subInfo, subPosition, subAngle, 0, SimulationManager.instance.m_currentBuildIndex)) { SimulationManager.instance.m_currentBuildIndex++; if (info.m_subBuildings[i].m_fixedHeight) { buildingBuffer[subClone].m_flags = buildingBuffer[subClone].m_flags | Building.Flags.FixedHeight; } } if (clone != 0 && subClone != 0) { buildingBuffer[clone].m_subBuilding = subClone; buildingBuffer[subClone].m_parentBuilding = clone; buildingBuffer[subClone].m_flags = buildingBuffer[subClone].m_flags | Building.Flags.Untouchable; clone = subClone; } } } cloneInstance.ResetSubInstances(); } return(cloneInstance); }
public override void Transform(InstanceState instanceState, ref Matrix4x4 matrix4x, float deltaHeight, float deltaAngle, Vector3 center, bool followTerrain) { BuildingState state = instanceState as BuildingState; Vector3 newPosition = matrix4x.MultiplyPoint(state.position - center); newPosition.y = state.position.y + deltaHeight; float terrainHeight = TerrainManager.instance.SampleOriginalRawHeightSmooth(newPosition); bool isFixed = GetFixedHeightFlag(id.Building); if (!isFixed) { AddFixedHeightFlag(id.Building); } if (followTerrain) { newPosition.y = newPosition.y + terrainHeight - state.terrainHeight; } AddFixedHeightFlag(id.Building); Move(newPosition, state.angle + deltaAngle); Matrix4x4 matrixSub = default; matrixSub.SetTRS(Vector3.zero, Quaternion.AngleAxis(deltaAngle * Mathf.Rad2Deg, Vector3.down), Vector3.one); if (state.subStates != null) { foreach (InstanceState subState in state.subStates) { Vector3 subOffset = (subState.position - center) - (state.position - center); Vector3 subPosition = TransformPosition + matrixSub.MultiplyPoint(subOffset); subPosition.y = subState.position.y - state.position.y + newPosition.y; subState.instance.Move(subPosition, subState.angle + deltaAngle); if (subState.instance is MoveableNode mn) { if (mn.Pillar != null) { mn.Pillar.Move(subPosition, subState.angle + deltaAngle); } } if (subState is BuildingState bs) { if (bs.subStates != null) { foreach (InstanceState subSubState in bs.subStates) { Vector3 subSubOffset = (subSubState.position - center) - (state.position - center); Vector3 subSubPosition = TransformPosition + matrixSub.MultiplyPoint(subSubOffset); subSubPosition.y = subSubState.position.y - state.position.y + newPosition.y; subSubState.instance.Move(subSubPosition, subSubState.angle + deltaAngle); if (subSubState.instance is MoveableNode mn2) { if (mn2.Pillar != null) { mn2.Pillar.Move(subSubPosition, subSubState.angle + deltaAngle); } } } } } } } if (!isFixed && Mathf.Abs(terrainHeight - newPosition.y) < 0.01f) { RemoveFixedHeightFlag(id.Building); } }
public override void RenderCloneOverlay(InstanceState state, ref Matrix4x4 matrix4x, Vector3 deltaPosition, float deltaAngle, Vector3 center, bool followTerrain, RenderManager.CameraInfo cameraInfo, Color toolColor) { }