1[
ComponentEditorProps(
category:
"GameScripted/Editor", description:
"Manager of preview entity. Works only with SCR_EditorBaseEntity!", icon:
"WBData/ComponentEditorProps/componentEditor.png")]
33 private float m_fPreviewTranslationInertia;
36 private float m_fPreviewRotationInertia;
38 [
Attribute(
category:
"Preview", defvalue:
"1 1 1 0.2",
desc:
"Color of height indicator helper object.")]
48 private bool m_bIsVerticalSnap;
51 private float m_fVerticalSnapLimit;
53 [
Attribute(
category:
"Settings",
desc:
"When true, interaction between entities passes when at least one edited entity meets the criteria.\nWhen false, all edited entities must be compatible.")]
54 private bool m_bORInteraction;
56 [
Attribute(
category:
"Settings", defvalue:
"EditorPreviewContext",
desc:
"Action context activated all the time.")]
63 private float m_fHeightTerrain;
64 private float m_fHeightSea;
65 private bool m_bIsHeightSet;
66 private bool m_bIsChange;
68 private bool m_bHasTerrain;
70 private bool m_bTargetSnap;
71 private bool m_bTargetDelegate;
73 private float m_fTargetRotationStep;
74 private bool m_bInstantTransformation;
75 private bool m_bIsFixedPosition;
76 private bool m_bIsRotating;
77 private bool m_bIsMovingVertically;
78 private bool m_bHasSpecialInteraction;
80 private int m_iHeightIndicatorColor;
81 private bool m_bPreviewDisabled;
90 private vector m_aLocalOffset[4];
129 if (m_Target && !m_bTargetSnap)
137 vector cameraTransform[4];
138 m_World.GetCurrentCamera(cameraTransform);
139 vector cameraPos = cameraTransform[3];
140 m_bIsUnderwater = cameraPos[1] < m_World.GetOceanBaseHeight();
142 if (m_Target && m_bTargetSnap)
145 vector targetTransform[4];
146 if (m_Target.GetTransform(targetTransform))
151 case (m_fTargetRotationStep == -1):
153 transform = targetTransform;
157 case (m_fTargetRotationStep != 0):
159 vector targetAngles =
Math3D.MatrixToAngles(targetTransform);
161 angles[0] = targetAngles[0] +
Math.Round((
angles[0] - targetAngles[0]) / m_fTargetRotationStep) * m_fTargetRotationStep;
169 if (!m_bInstantTransformation)
177 transform[3] = targetTransform[3];
180 Math3D.MatrixMultiply4(transform, m_aLocalOffset, transform);
181 m_PreviewEntity.SetPreviewTransform(transform, verticalMode, m_fHeightTerrain, m_bIsUnderwater);
187 if (!m_bInstantTransformation && !instant)
189 vector transformCurrent[4];
192 float quat[4], quatCurrent[4];
193 Math3D.MatrixToQuat(transform, quat);
194 Math3D.MatrixToQuat(transformCurrent, quatCurrent);
195 Math3D.QuatLerp(quatCurrent, quat, quat, timeSlice);
196 Math3D.QuatToMatrix(quat, transform);
212 trace.Start = matrix[3];
216 m_PreviewEntity.SetPreviewTransform(transform, verticalMode, m_fHeightTerrain, m_bIsUnderwater, trace);
225 m_bInstantTransformation =
false;
226 m_VerticalModeReal = verticalMode;
227 Event_OnPreviewChange.Invoke(transform,
true);
233 float indicatorHeight = m_fHeightTerrain - m_aLocalOffset[3][1];
234 if (indicatorHeight > 0.025)
236 vector indicatorPos = transform[3] -
Vector(0, indicatorHeight * 0.5 + m_aLocalOffset[3][1], 0);
249 bool isChange = m_bIsChange;
258 Event_OnPreviewChange.Invoke(transform, m_bIsChange);
280 Math3D.MatrixCopy(m_vTransform, transform);
291 m_fHeightSea = pos[1];
306 m_fHeightTerrain = m_fHeightSea;
308 m_bIsHeightSet =
true;
316 m_fHeightTerrain = 0;
324 return m_fHeightTerrain;
339 return m_aLocalOffset[3];
347 if (mode == m_VerticalMode || !
SCR_Enum.HasFlag(m_AllowedVerticalModes, mode))
350 m_VerticalMode = mode;
352 Event_OnVerticalModeChange.Invoke(m_VerticalMode);
360 return m_VerticalMode;
369 return m_VerticalModeReal;
377 if (enabled == m_bIsVerticalSnap)
380 m_bIsVerticalSnap = enabled;
382 Event_OnVerticalSnapChange.Invoke(m_bIsVerticalSnap);
390 return m_bIsVerticalSnap;
400 float delta = pos[1] - baseSnapHeight;
401 if (delta < m_fVerticalSnapLimit)
402 pos[1] = baseSnapHeight;
417 float delta = pos[1] - baseSnapHeight;
418 return Math.AbsFloat(delta) < m_fVerticalSnapLimit;
432 return verticalDelta > 0;
438 switch (verticalMode)
452 return m_aLocalOffset[3][1];
467 if (disable == m_bPreviewDisabled)
470 m_bPreviewDisabled = disable;
474 material = m_DisabledPreviewMaterial;
485 if (m_LastPreviewState == state)
493 material = m_PreviewMaterial;
499 material = m_DisabledPreviewMaterial;
505 material = m_WarningPreviewMaterial;
520 m_LastPreviewState = state;
535 if (target == m_Target && isDelegate == m_bTargetDelegate)
541 if (!
CanInteractWith(target, targetSnap, targetInteraction, isDelegate))
548 m_bTargetSnap = targetSnap;
549 m_TargetInteraction = targetInteraction;
550 m_bTargetDelegate = isDelegate;
556 m_fTargetRotationStep = slotEntity.GetRotationStep();
558 m_fTargetRotationStep = -1;
564 if (!m_Target)
return false;
567 m_TargetInteraction = 0;
569 Event_OnTargetChange.Invoke(target);
575 if (target == m_Entity)
598 if (m_bORInteraction)
609 if (!isTargetDestroyed && (!editableChild || !editableChild.
IsDestroyed()))
615 if (!editableChild || editableChild.
GetPlayerID() == 0)
639 if (!isTargetDestroyed && (!editableChild || !editableChild.
IsDestroyed()))
645 if (!editableChild || editableChild.
GetPlayerID() == 0)
675 return m_TargetInteraction;
683 return m_bTargetSnap;
724 return m_bIsChange || m_bIsFixedPosition || m_Target;
732 return m_bIsRotating;
740 return m_bIsFixedPosition;
756 m_bIsMovingVertically = isMovingVertically;
764 return m_bIsMovingVertically;
772 m_bIsRotating = isRotating;
780 return m_bIsUnderwater;
800 return Event_OnPreviewCreate;
808 return Event_OnPreviewDelete;
816 return Event_OnPreviewChange;
824 return Event_OnTargetChange;
832 return Event_OnWaitingPreviewCreate;
840 return Event_OnVerticalModeChange;
848 return Event_OnVerticalSnapChange;
853 m_vTransform = transform;
856 Math3D.MatrixNormalize(m_vTransform);
879 Math3D.MatrixCopy(m_vTransform, spawnParams.Transform);
881 m_bInstantTransformation =
true;
894 vector localOffsetPos = m_aLocalOffset[3];
895 if (pivot.
GetPos(localOffsetPos))
898 pivot.GetOwner().GetWorldTransform(pivotTransform);
899 Math3D.MatrixInvMultiply4(m_vTransform, pivotTransform, pivotTransform);
900 m_aLocalOffset[3] = -pivotTransform[3];
936 if (m_bIsFixedPosition)
940 entitySource.Get(
"coords",
coords);
941 if (
coords.LengthSq() != 0)
943 spawnParams.Transform[3] =
coords;
947 Print(
string.Format(
"Prefab '%1' is flagged as STATIC_POSITION, but its position is <0,0,0>!", prefab.GetPath()),
LogLevel.WARNING);
948 m_bIsFixedPosition =
false;
951 else if (initTransform[3] == vector.Zero)
954 vector
angles =
Vector(Math3D.MatrixToAngles(m_vTransform)[0], 0, 0);
955 Math3D.AnglesToMatrix(
angles, m_vTransform);
956 m_vTransform[3] = vector.Zero;
957 spawnParams.Transform = m_vTransform;
961 spawnParams.Transform = initTransform;
964 if (offsets.Count() > 1)
967 array<ref SCR_BasePreviewEntry> entries = SCR_PrefabPreviewEntity.GetPreviewEntriesFromPrefab(prefabResource);
968 SCR_BasePreviewEntry sourceEntry = entries[0];
969 SCR_BasePreviewEntry entry;
970 for (
int i = 0, count = offsets.Count(); i < count; i++)
978 entry =
new SCR_BasePreviewEntry();
979 entry.CopyFrom(sourceEntry);
980 entries.Insert(entry);
982 entry.m_vPosition = offsets[i];
984 m_PreviewEntity = SCR_EditablePreviewEntity.Cast(SCR_PrefabPreviewEntity.SpawnPreview(entries, m_PreviewEntityPrefab, spawnParams: spawnParams, material: m_PreviewMaterial));
989 m_PreviewEntity = SCR_EditablePreviewEntity.Cast(SCR_PrefabPreviewEntity.SpawnPreviewFromPrefab(prefabResource, m_PreviewEntityPrefab, spawnParams: spawnParams, material: m_PreviewMaterial));
993 m_fHeightTerrain = 0;
1010 previewEntity.GetWorldTransform(m_vTransform);
1012 Event_OnTargetChange.Invoke(null);
1014 Event_OnPreviewDelete.Invoke(previewEntity);
1015 delete previewEntity;
1017 m_bIsChange =
false;
1018 m_bIsHeightSet =
false;
1019 m_bIsFixedPosition =
false;
1020 m_bIsRotating =
false;
1021 m_bPreviewDisabled =
false;
1023 m_TargetInteraction = 0;
1025 m_aLocalOffset[3] =
vector.Zero;
1036 if (!previewResource || !previewResource.IsValid())
1042 Event_OnWaitingPreviewCreate.Invoke(previewEntity);
1043 return previewEntity;
1048 return vector.Lerp(currentPos, targetPos,
Math.Min(timeSlice * m_fPreviewTranslationInertia, 1));
1053 targetAngles[0] =
SCR_Math.
LerpAngle(currentAngles[1], targetAngles[0],
Math.Min(timeSlice * m_fPreviewRotationInertia, 1));
1058 BaseContainer editorSettings =
GetGame().GetGameUserSettings().GetModule(
"SCR_EditorSettings");
1059 if (!editorSettings)
1063 editorSettings.Get(
"m_PreviewVerticalSnap", value);
1065 editorSettings.Get(
"m_PreviewVerticleMode", value);
1074 debugTexts.Insert(
"Vertical Snap: " + m_bIsVerticalSnap);
1075 debugTexts.Insert(
"Height ASL: " + m_fHeightSea);
1076 debugTexts.Insert(
"Height ATL: " + m_fHeightTerrain);
1080 debugTexts.Insert(
string.Format(
"Preview Target: %1", m_Target));
1081 debugTexts.Insert(
string.Format(
"Preview Target Interaction: %1",
typename.EnumToString(
EEditableEntityInteraction, m_TargetInteraction)));
1088 if (verticalMode != m_VerticalMode)
1105 m_World =
game.GetWorld();
1111 DiagMenu.RegisterRange(
SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_VERTICAL_MODE,
"",
"Vertical Mode",
"Transforming",
string.Format(
"0 %1 0 1", enumVerticalMode.GetVariableCount() - 1));
1114 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_VERTICAL_SNAP,
"",
"Vertical Snap",
"Transforming");
1128 GenericWorldEntity worldEntity =
game.GetWorldEntity();
1135 m_bHasTerrain = worldEntity.GetTerrain(0, 0) != null;
1137 m_fPreviewTranslationInertia = 1 /
Math.Max(m_fPreviewTranslationInertia, 0.001);
1138 m_fPreviewRotationInertia = 1 /
Math.Max(m_fPreviewRotationInertia, 0.001);
1140 BaseContainer editorSettings =
GetGame().GetGameUserSettings().GetModule(
"SCR_EditorSettings");
1150 Math3D.MatrixIdentity3(m_aLocalOffset);
SCR_EAIThreatSectorFlags flags
ArmaReforgerScripted GetGame()
ref array< string > coords
ref array< string > angles
class SCR_AIPolar m_Target
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
@ BLOCKED
User has this asset blocked so it should not be possible to interact with it until unblocked.
ResourceName m_SlotPrefab
@ PLACEABLE
Default value, composition is pacable.
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
proto external int SetEventMask(notnull IEntity owner, int mask)
Object holding reference to resource. In destructor release the resource.
void SCR_BaseEditorComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
static ResourceName GetSlotPrefab(IEntityComponentSource componentSource)
EEditableEntityType GetEntityType()
static bool HasFlag(IEntityComponentSource componentSource, EEditableEntityFlag flag)
SCR_EditableEntityInteraction GetEntityInteraction()
bool HasEntityState(EEditableEntityState state)
static SCR_EditableEntityComponent GetEditableEntity(IEntity owner)
bool GetPos(out vector pos)
EEditableEntityType GetEntityType(IEntity owner=null)
SCR_EditableEntityInteraction GetEntityInteraction(IEntity owner=null)
SCR_UIInfo GetInfo(IEntity owner=null)
sealed bool CanSetParent(SCR_EditableEntityComponent parentEntity, EEditableEntityInteractionFlag interactionFlags=int.MAX)
ResourceName GetSlotPrefab()
static SCR_BasePreviewEntity SpawnPreviewFromEditableOwner(IEntity entity, ResourceName previewPrefab, BaseWorld world=null, EntitySpawnParams spawnParams=null, ResourceName material=ResourceName.Empty, EPreviewEntityFlag flags=0)
static SCR_BasePreviewEntity SpawnPreviewFromEditableEntities(notnull set< SCR_EditableEntityComponent > entities, ResourceName previewPrefab, BaseWorld world=null, EntitySpawnParams spawnParams=null, ResourceName material=ResourceName.Empty, EPreviewEntityFlag flags=0)
static void SetMaterial(IEntity entity, ResourceName material, bool recursively=true)
static float LerpAngle(float a, float b, float t)
SCR_EditableEntityComponent GetTarget()
void InitTransform(vector transform[4])
ScriptInvoker GetOnVerticalSnapChange()
bool SetTarget(SCR_EditableEntityComponent target, bool isDelegate=false)
ScriptInvoker GetOnWaitingPreviewCreate()
void OnUserSettingsChanged()
ResourceName m_sPreviewPrefab
bool GetPreviewTransform(out vector transform[4])
void ResetPreviewTransform()
void SetIsRotating(bool isRotating)
const float VERTICAL_TRACE_OFFSET
bool IsMovingVertically()
SCR_EditablePreviewEntity GetPreviewEntity()
ResourceName GetPreviewPrefab()
bool GetCanAdjustVerticalPosition()
ResourceName GetSlotPrefab()
SCR_EditablePreviewEntity m_PreviewEntity
void ResetPreviewHeight()
bool GetPreviewTransformOrigin(out vector transform[4])
void SetVerticalMode(EEditorTransformVertical mode)
float GetSnapBaseHeight(vector pos, EEditorTransformVertical verticalMode)
SCR_BasePreviewEntity CreatePreview(SCR_EditableEntityComponent pivot, set< SCR_EditableEntityComponent > entities)
float GetPreviewHeightAboveSea()
override void EOnEditorInit()
void LerpAngles(vector currentAngles, out vector targetAngles, float timeSlice)
void SetPreviewState(SCR_EPreviewState state)
void SetPreviewHeight(vector pos)
void SetVerticalSnap(bool enabled)
override void EOnEditorDeactivate()
array< IEntity > GetExcludeArray()
bool CanInteractWith(SCR_EditableEntityComponent target, out bool snap, out EEditableEntityInteraction interaction, bool isDelegate)
void SetPreviewTransform(vector transform[4], float timeSlice=1, bool instant=false, EEditorTransformVertical verticalMode=EEditorTransformVertical.TERRAIN)
ref Color m_HeightIndicatorColor
EEditorTransformVertical GetVerticalModeReal()
string GetActionContext()
override void EOnEditorDebug(array< string > debugTexts)
override void EOnEditorActivate()
override void OnDelete(IEntity owner)
void SetIsMovingVertically(bool isMovingVertically)
EEditableEntityInteraction GetTargetInteraction()
ScriptInvoker GetOnVerticalModeChange()
ref SCR_EditableEntityInteraction m_Interaction
SCR_LayersEditorComponent m_LayerManager
bool CanUnsnap(float verticalDelta)
ScriptInvoker GetOnPreviewCreate()
EEditorTransformVertical GetVerticalMode()
vector LerpTranslation(vector currentPos, vector targetPos, float timeSlice)
float GetPreviewHeightAboveTerrain()
ScriptInvoker GetOnPreviewChange()
vector SnapVertically(vector pos)
void SetLastPreviewState(SCR_EPreviewState state)
bool IsSnappedVertically()
SCR_BasePreviewEntity CreateWaitingPreview()
ScriptInvoker GetOnTargetChange()
bool m_bCanAdjustVerticalPosition
override void EOnFrame(IEntity owner, float timeSlice)
void ShowAsDisabled(bool disable=true)
SCR_BasePreviewEntity CreatePreview(ResourceName prefab, notnull array< vector > offsets, vector initTransform[4]={})
ScriptInvoker GetOnPreviewDelete()
SCR_StatesEditorComponent m_StateManager
static float GetTerrainY(vector pos, BaseWorld world=null, bool noUnderwater=false, TraceParam trace=null)
proto external GenericEntity GetOwner()
Get owner entity.
Instance of created debug visualizer.
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
@ NONE
When Shape is created and not initialized yet.
EEditableEntityType
Defines type of SCR_EditableEntityComponent. Assigned automatically based on IEntity inheritance.
EEditableEntityFlag
Unique flags of the entity.
SCR_FieldOfViewSettings Attribute
EEditorTransformVertical
Vertical transformation mode.
EEditorState
Unique editor state.
EEditableEntityInteraction
Type of suggested interaction when hovering edited entity on top of another entity.
EEditableEntityInteractionFlag
Details of entity interaction.
EntityEvent
Various entity events.
EntityFlags
Various entity flags.
proto native vector Vector(float x, float y, float z)