2[
EntityEditorProps(
category:
"GameLib/Scripted/Generator", description:
"RoadGeneratorEntity", dynamicBox:
true, visible:
false)]
8class RoadGeneratorEntity : GeneratorBaseEntity
11 private bool AdjustHeightMap;
14 private int AdjustHeightMapPriority;
17 private bool GenerateRoad;
20 private float RoadClearance;
23 private float RoadWidth;
26 private float FalloffStartWidth;
29 private float RoadFalloffWidth;
32 private ShapeEntity m_ShapeEntity;
37 float GetRoadClearance()
49 protected void RoadGeneratorEntity(IEntitySource src,
IEntity parent)
51 if (_WB_GetEditorAPI())
57 IEntitySource parentSrc = m_RoadGenSrc.GetParent();
58 ShapeEntity shapeEnt = ShapeEntity.Cast(parent);
59 if (parentSrc && shapeEnt)
67 protected void ~RoadGeneratorEntity()
69 WorldEditorAPI api = _WB_GetEditorAPI();
73 api.RemoveTerrainFlatterEntity(
this,
false);
78 override bool _WB_IsTraceable(IEntitySource src)
84 override void _WB_OnDelete(IEntitySource src)
86 WorldEditorAPI api = _WB_GetEditorAPI();
89 api.RemoveTerrainFlatterEntity(
this,
true);
94 override bool _WB_OnKeyChanged(BaseContainer src,
string key, BaseContainerList ownerContainers,
IEntity parent)
96 WorldEditorAPI api = _WB_GetEditorAPI();
97 if (!api.AreGeneratorEventsEnabled())
100 BaseContainerTools.WriteToInstance(
this, src);
105 Print(
"RoadGeneratorEntity requires a SplineShapeEntity!",
LogLevel.ERROR);
109 array<vector> updateMins =
new array<vector>();
110 array<vector> updateMaxes =
new array<vector>();
112 m_ShapeEntity.GetAllInfluenceBBoxes(m_ShapeSrc, updateMins, updateMaxes);
114 bool bForceUpdate =
false;
116 if (key ==
"AdjustHeightMap")
124 api.RemoveTerrainFlatterEntity(
this,
true);
128 UpdateTerrain(m_ShapeEntity, bForceUpdate, updateMins, updateMaxes);
129 UpdateRoad(m_ShapeSrc);
135 override void _WB_OnCreate(IEntitySource src)
137 WorldEditorAPI api = _WB_GetEditorAPI();
139 if (api && m_ShapeEntity)
141 IEntitySource shapeEntitySrc = src.GetParent();
142 array<vector> updateMins =
new array<vector>();
143 array<vector> updateMaxes =
new array<vector>();
144 m_ShapeEntity.GetAllInfluenceBBoxes(m_ShapeSrc, updateMins, updateMaxes);
146 UpdateRoad(m_ShapeSrc,
false);
147 UpdateTerrain(m_ShapeEntity,
false, updateMins, updateMaxes);
152 protected override void OnShapeInitInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity)
154 m_ShapeEntity = shapeEntity;
155 m_ShapeSrc = shapeEntitySrc;
157 WorldEditorAPI api = _WB_GetEditorAPI();
161 array<vector> updateMins =
new array<vector>();
162 array<vector> updateMaxes =
new array<vector>();
163 shapeEntity.GetAllInfluenceBBoxes(m_ShapeSrc, updateMins, updateMaxes);
165 UpdateTerrain(m_ShapeEntity,
false, updateMins, updateMaxes);
170 protected override void OnShapeTransformInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity, array<vector> mins, array<vector> maxes)
172 UpdateTerrain(shapeEntity,
false, mins, maxes);
173 UpdateRoad(shapeEntitySrc);
178 protected override void OnShapeChangedInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity, array<vector> mins, array<vector> maxes)
180 UpdateTerrain(shapeEntity,
false, mins, maxes);
181 UpdateRoad(shapeEntitySrc);
186 protected void UpdateRoad(IEntitySource shapeEntitySrc,
bool requireRoad =
true)
190 UpdateRoadEntity(_WB_GetEditorAPI(), shapeEntitySrc, m_RoadGenSrc, RoadWidth, requireRoad);
195 protected void UpdateTerrain(ShapeEntity shapeEntity,
bool bForceUpdate, array<vector> updateMins, array<vector> updateMaxes)
197 WorldEditorAPI api = _WB_GetEditorAPI();
200 if (!api || !AdjustHeightMap)
203 vector mins = vector.One * 100000;
206 array<vector> roadPoints =
new array<vector>;
209 m_ShapeEntity.GenerateTesselatedShape(roadPoints);
210 m_ShapeEntity.GetWorldTransform(mat);
212 for (
int i = 0; i < roadPoints.Count(); i++)
214 vector pos = roadPoints[i].Multiply4(mat);
215 mins[0] = Math.Min(mins[0], pos[0]);
216 mins[1] = Math.Min(mins[1], pos[1]);
217 mins[2] = Math.Min(mins[2], pos[2]);
219 maxs[0] = Math.Max(maxs[0], pos[0]);
220 maxs[1] = Math.Max(maxs[1], pos[1]);
221 maxs[2] = Math.Max(maxs[2], pos[2]);
224 api.AddTerrainFlatterEntity(
this, mins, maxs, AdjustHeightMapPriority, RoadWidth * 0.5 + FalloffStartWidth, RoadFalloffWidth, bForceUpdate, updateMins, updateMaxes);
229 static void UpdateRoadEntity(WorldEditorAPI api, IEntitySource splineSrc, IEntitySource genSrc,
float roadWidth,
bool requireRoad)
231 if (api.UndoOrRedoIsRestoring() || !api.IsModifyingData())
235 SplineShapeEntity splineEntity = SplineShapeEntity.Cast(api.SourceToEntity(splineSrc));
238 Print(
"RoadGeneratorEntity requires a SplineShapeEntity!",
LogLevel.ERROR);
243 IEntitySource roadSrc;
246 IEntitySource child = null;
247 int numChildren = genSrc.GetNumChildren();
248 for (
int i = 0; i < numChildren; i++)
250 child = genSrc.GetChild(i);
251 if (child.GetClassName() ==
"RoadEntity")
262 Print(
"RoadGeneratorEntity requires RoadEntity as child in hierarchy to be able to generate the road!",
LogLevel.ERROR);
270 api.BeginEditSequence(roadSrc);
274 splineSrc.Get(
"IsClosed", isClosed);
277 api.SetVariableValue(roadSrc, null,
"IsClosedSpline",
"true");
279 api.SetVariableValue(roadSrc, null,
"IsClosedSpline",
"false");
280 api.SetVariableValue(roadSrc, null,
"Width", roadWidth.ToString());
281 api.SetVariableValue(roadSrc, null,
"Points",
"@@@");
287 splineEntity.GetWorldTransform(wTrans);
290 array<vector> positions =
new array<vector>;
291 splineEntity.GetPointsPositions(positions);
292 auto roadPoints = roadSrc.GetObjectArray(
"SplinePoints");
296 for (; i<positions.Count(); i++)
299 if (i >= roadPoints.Count())
301 api.CreateObjectArrayVariableMember(roadSrc, null,
"SplinePoints",
"ShapePoint", i);
302 roadPoints = roadSrc.GetObjectArray(
"SplinePoints");
305 auto roadPoint = roadPoints.Get(i);
307 auto containerPath =
new array<ref ContainerIdPathEntry>();
311 positions[i] = positions[i].Multiply4(wTrans);
312 positions[i] = api.SourceToEntity(roadSrc).
CoordToLocal(positions[i]);
317 roadPoint.Get(
"Position", oldPos);
318 if (oldPos != positions[i])
319 api.SetVariableValue(roadSrc, containerPath,
"Position", positions[i].
ToString(
false));
323 int numPointData = roadPoint.GetObjectArray(
"Data").Count();
324 if (splineEntity.HasPointExplicitTangents(i))
327 bool createSplineData = numPointData < 1 || roadPoint.GetObjectArray(
"Data").Get(0).GetClassName() !=
"SplinePointData";
328 if (createSplineData)
329 api.CreateObjectArrayVariableMember(roadSrc, containerPath,
"Data",
"SplinePointData", 0);
330 for (
int j=numPointData-1; j>0; j--)
331 api.RemoveObjectArrayVariableMember(roadSrc, containerPath,
"Data", j);
332 roadPoints = roadSrc.GetObjectArray(
"SplinePoints");
333 roadPoint = roadPoints.Get(i);
338 splineEntity.GetTangents(i, tIn, tOut);
340 vector tInOld, tOutOld;
341 auto oldTangents = roadPoint.GetObjectArray(
"Data").Get(0);
342 oldTangents.Get(
"InTangent", tInOld);
343 oldTangents.Get(
"OutTangent", tOutOld);
345 if (tIn != tInOld || tOut != tOutOld)
348 api.SetVariableValue(roadSrc, containerPath,
"InTangent", tIn.ToString(
false));
349 api.SetVariableValue(roadSrc, containerPath,
"OutTangent", tOut.ToString(
false));
350 roadPoints = roadSrc.GetObjectArray(
"SplinePoints");
351 roadPoint = roadPoints.Get(i);
358 for (
int j=numPointData-1; j>=0; j--)
359 api.RemoveObjectArrayVariableMember(roadSrc, containerPath,
"Data", j);
364 while (i < roadPoints.Count())
365 api.RemoveObjectArrayVariableMember(roadSrc, null,
"SplinePoints", roadPoints.Count() - 1);
367 api.EndEditSequence(roadSrc);
void ContainerIdPathEntry(string propertyName, int index=-1)
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
override bool _WB_OnKeyChanged(IEntity owner, BaseContainer src, string key, BaseContainerList ownerContainers, IEntity parent)
Any property value has been changed. You can use editor API here and do some additional edit actions ...
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
enum EVehicleType IEntity
proto external vector CoordToLocal(vector coord)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
void OnShapeTransformInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity, array< vector > mins, array< vector > maxes)
void OnShapeInitInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity)
void OnShapeChangedInternal(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity, array< vector > mins, array< vector > maxes)
EntityEvent
Various entity events.
GeneratorBaseEntityClass GenericEntityClass OnShapeInit(IEntitySource shapeEntitySrc, ShapeEntity shapeEntity)
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.