2class SCR_RandomisationEditorData
4 bool m_bPlaceByBoundingBox;
8 vector m_vRandomVertOffset;
20 bool RandomiseExt(notnull WorldEditorAPI worldEditorAPI, notnull IEntitySource entitySource, RandomGenerator randomGenerator)
22 BaseWorld world = worldEditorAPI.GetWorld();
27 if (!entitySource.Get(
"angles",
angles))
31 if (!entitySource.Get(
"coords",
coords))
34 IEntity entity = worldEditorAPI.SourceToEntity(entitySource);
40 float ySurface = world.GetSurfaceY(worldPos[0], worldPos[2]);
41 vector surfacePos = { worldPos[0], ySurface, worldPos[2] };
44 angles[1] = Math.Repeat(randomGenerator.RandFloatXY(0, 360), 360);
52 worldEditorAPI.SetVariableValue(entitySource, null,
"angles",
angles.ToString(
false));
57 TraceParam traceParam =
new TraceParam();
59 traceParam.Start = surfacePos + vector.Up;
60 traceParam.End = surfacePos - vector.Up;
63 entity = worldEditorAPI.SourceToEntity(entitySource);
67 world.TraceMove(traceParam, null);
69 vector newUp = traceParam.TraceNorm.Normalized();
70 vector newRight = (newUp * mat[2]).Normalized();
73 mat[1] = traceParam.TraceNorm.Normalized();
74 mat[0] = (mat[1] * mat[2]).Normalized();
75 mat[2] = (mat[0] * mat[1]).Normalized();
77 angles = Math3D.MatrixToAngles(mat);
78 worldEditorAPI.SetVariableValue(entitySource, null,
"angles",
string.Format(
"%1 %2 %3",
angles[1],
angles[0],
angles[2]));
81 if (m_vRandomScale[0] != m_vRandomScale[1])
82 worldEditorAPI.SetVariableValue(entitySource, null,
"scale", randomGenerator.RandFloatXY(m_vRandomScale[0], m_vRandomScale[1]).ToString());
84 if (m_vRandomScale[0] != 1)
85 worldEditorAPI.SetVariableValue(entitySource, null,
"scale", m_vRandomScale[0].
ToString());
87 float absoluteYOffset;
91 if (m_vRandomVertOffset[0] != 0 || m_vRandomVertOffset[1] != 0)
92 absoluteYOffset += randomGenerator.RandFloatXY(m_vRandomVertOffset[0], m_vRandomVertOffset[1]);
94 if (absoluteYOffset != 0)
97 entity = worldEditorAPI.SourceToEntity(entitySource);
99 vector newLocalPos =
coords + entity.
CoordToLocal(worldPos + absoluteYOffset * vector.Up);
100 worldEditorAPI.SetVariableValue(entitySource, null,
"coords",
string.Format(
"%1 %2 %3", newLocalPos[0], newLocalPos[1], newLocalPos[2]));
111 static SCR_RandomisationEditorData CreateFromEntitySource(notnull IEntitySource entitySource)
113 BaseContainerList editorData = entitySource.GetObjectArray(
"editorData");
117 int editorDataCount = editorData.Count();
118 if (editorDataCount < 1)
121 BaseContainer randomisationEditorData;
122 for (
int i; i < editorDataCount; ++i)
124 randomisationEditorData = editorData.Get(i);
125 if (randomisationEditorData.GetClassName() ==
"RandomizationEditorData")
128 randomisationEditorData = null;
131 if (!randomisationEditorData)
134 SCR_RandomisationEditorData result =
new SCR_RandomisationEditorData();
137 if (randomisationEditorData.Get(
"randomYaw", placement))
138 result.m_bPlaceByBoundingBox = placement == 1;
140 randomisationEditorData.Get(
"randomYaw", result.m_bRandomYaw);
141 randomisationEditorData.Get(
"alignToNormal", result.m_bAlignToNormal);
142 randomisationEditorData.Get(
"randomScale", result.m_vRandomScale);
143 randomisationEditorData.Get(
"randomVertOffset", result.m_vRandomVertOffset);
144 randomisationEditorData.Get(
"randomPitchAngle", result.m_fRandomPitchAngle);
145 randomisationEditorData.Get(
"randomRollAngle", result.m_fRandomRollAngle);
152 protected void SCR_RandomisationEditorData();
float m_fRandomPitchAngle
ref array< string > coords
ref array< string > angles
enum EVehicleType IEntity
proto external vector GetOrigin()
proto external void GetTransform(out vector mat[])
proto external vector CoordToLocal(vector coord)
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.