public void SetData(ObjectPlacementBlockManualConstructionSessionData sessionData) { if (!_isActive) { _block = sessionData.Block; _blockSegments = sessionData.BlockSegments; _blockExtensionPlane = sessionData.BlockExtensionPlane; _startObject = sessionData.StartObject; _startObjectHierarchyWorldOrientedBox = _startObject.GetHierarchyWorldOrientedBox(); _blockObjectPlacementDataCalculator.Block = _block; _manualConstructionSettings = _block.Settings.ManualConstructionSettings; _heightAdjustmentSettings = _manualConstructionSettings.HeightAdjustmentSettings; _automaticRandomHeightAdjustmentSettings = _heightAdjustmentSettings.AutomaticRandomHeightAdjustmentSettings; _paddingSettings = _manualConstructionSettings.PaddingSettings; _subdivisionSettings = _manualConstructionSettings.SubdivisionSettings; } }
public ObjectPlacementBlockSubdivisionSettingsView(ObjectPlacementBlockSubdivisionSettings settings) { _settings = settings; }
public static void SendToInterestedListeners(ObjectPlacementBlockSubdivisionSettings subdivisionSettings) { var message = new ObjectPlacementBlockSubdivisionSettingsWereChangedMessage(subdivisionSettings); MessageListenerDatabase.Instance.SendMessageToInterestedListeners(message); }
public void ApplySubdivisionToEntireBlock(List <ObjectPlacementBoxStackSegment> allBlockSegments, ObjectPlacementBlockSubdivisionSettings subdivisionSettings) { // No subdivision required? if (!subdivisionSettings.SubdivideAlongGrowDirection && !subdivisionSettings.SubdivideAlongExtensionRight && !subdivisionSettings.SubdivideAlongExtensionLook) { return; } // Note: The following code assumes the segments' stacks extend along the extension plane right axis // and the segments themselves are arranged along the plane's look axis. for (int segmentIndex = 0; segmentIndex < allBlockSegments.Count; ++segmentIndex) { int numberOfTraversedSegments = segmentIndex + 1; ObjectPlacementBoxStackSegment segment = allBlockSegments[segmentIndex]; segment.ClearHideFlagInAllStacks(ObjectPlacementBoxHideFlags.BlockApplySubdivisions); // If we must subdivide along the extension look axis, we may need to hide the entire segment based // on the number of segments we have traversed so far. if (subdivisionSettings.SubdivideAlongExtensionLook) { // First calculate the remainder of how many pairs of <subidvision, gap> we have traversed int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongExtensionLook + subdivisionSettings.SubdivisionSizeAlongExtensionLook; int remainder = numberOfTraversedSegments % subdivisionGapPairSize; // If the remainder is 0 it means we are at the end of a pair and the end of a pair is always a gap. So we activate // the hide flags. We also activate the hide flags if the remainder is bigger than the subdivision size. In that case // it means we reside somewhere inside the gap. if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongExtensionLook) { segment.SetHideFlagInAllStacks(ObjectPlacementBoxHideFlags.BlockApplySubdivisions); } } for (int stackIndex = 0; stackIndex < segment.NumberOfStacks; ++stackIndex) { int numberOfTraversedStacks = stackIndex + 1; ObjectPlacementBoxStack stack = segment.GetStackByIndex(stackIndex); if (subdivisionSettings.SubdivideAlongExtensionRight) { int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongExtensionRight + subdivisionSettings.SubdivisionSizeAlongExtensionRight; int remainder = numberOfTraversedStacks % subdivisionGapPairSize; if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongExtensionRight) { stack.SetHideFlagForAllBoxes(ObjectPlacementBoxHideFlags.BlockApplySubdivisions); } } for (int boxIndex = 0; boxIndex < stack.NumberOfBoxes; ++boxIndex) { int numberOfTraversedBoxes = boxIndex + 1; if (subdivisionSettings.SubdivideAlongGrowDirection) { int subdivisionGapPairSize = subdivisionSettings.SubdivisionGapSizeAlongGrowDirection + subdivisionSettings.SubdivisionSizeAlongGrowDirection; int remainder = numberOfTraversedBoxes % subdivisionGapPairSize; if (remainder == 0 || remainder > subdivisionSettings.SubdivisionSizeAlongGrowDirection) { stack.GetBoxByIndex(boxIndex).SetHideFlag(ObjectPlacementBoxHideFlags.BlockApplySubdivisions); } } } } } }
public ObjectPlacementBlockSubdivisionSettingsWereChangedMessage(ObjectPlacementBlockSubdivisionSettings subdivisionSettings) : base(MessageType.ObjectPlacementBlockSubdivisionSettingsWereChanged) { _subdivisionSettings = subdivisionSettings; }