Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_RandomisationEditorData.c
Go to the documentation of this file.
1#ifdef WORKBENCH
2class SCR_RandomisationEditorData
3{
4 bool m_bPlaceByBoundingBox;
5 bool m_bRandomYaw;
6 bool m_bAlignToNormal;
7 vector m_vRandomScale;
8 vector m_vRandomVertOffset;
10 float m_fRandomRollAngle;
11
12 //------------------------------------------------------------------------------------------------
20 bool RandomiseExt(notnull WorldEditorAPI worldEditorAPI, notnull IEntitySource entitySource, RandomGenerator randomGenerator) // bool snapToGround // \param[in] snapToGround
21 {
22 BaseWorld world = worldEditorAPI.GetWorld();
23 if (!world)
24 return false;
25
26 vector angles;
27 if (!entitySource.Get("angles", angles))
28 return false;
29
30 vector coords;
31 if (!entitySource.Get("coords", coords))
32 return false;
33
34 IEntity entity = worldEditorAPI.SourceToEntity(entitySource);
35 if (!entity)
36 return false;
37
38 vector worldPos = entity.GetOrigin();
39
40 float ySurface = world.GetSurfaceY(worldPos[0], worldPos[2]);
41 vector surfacePos = { worldPos[0], ySurface, worldPos[2] };
42
43 if (m_bRandomYaw)
44 angles[1] = Math.Repeat(randomGenerator.RandFloatXY(0, 360), 360);
45
46 if (m_fRandomPitchAngle > 0)
47 angles[0] = Math.Repeat(randomGenerator.RandFloatXY(-m_fRandomPitchAngle, m_fRandomPitchAngle), 360);
48
49 if (m_fRandomRollAngle > 0)
50 angles[2] = Math.Repeat(randomGenerator.RandFloatXY(-m_fRandomRollAngle, m_fRandomRollAngle), 360);
51
52 worldEditorAPI.SetVariableValue(entitySource, null, "angles", angles.ToString(false));
53
54 if (m_bAlignToNormal)
55 {
56 float angleY = angles[1];
57 TraceParam traceParam = new TraceParam();
58 traceParam.Flags = TraceFlags.WORLD;
59 traceParam.Start = surfacePos + vector.Up;
60 traceParam.End = surfacePos - vector.Up;
61
62 if (!entity)
63 entity = worldEditorAPI.SourceToEntity(entitySource);
64
65 vector mat[4];
66 entity.GetTransform(mat);
67 world.TraceMove(traceParam, null);
68
69 vector newUp = traceParam.TraceNorm.Normalized();
70 vector newRight = (newUp * mat[2]).Normalized();
71 // vector newForward = (newRight * newUp).Normalized();
72
73 mat[1] = traceParam.TraceNorm.Normalized(); // newUp
74 mat[0] = (mat[1] * mat[2]).Normalized(); // newRight
75 mat[2] = (mat[0] * mat[1]).Normalized(); // newForward
76
77 angles = Math3D.MatrixToAngles(mat);
78 worldEditorAPI.SetVariableValue(entitySource, null, "angles", string.Format("%1 %2 %3", angles[1], angles[0], angles[2]));
79 }
80
81 if (m_vRandomScale[0] != m_vRandomScale[1])
82 worldEditorAPI.SetVariableValue(entitySource, null, "scale", randomGenerator.RandFloatXY(m_vRandomScale[0], m_vRandomScale[1]).ToString());
83 else
84 if (m_vRandomScale[0] != 1)
85 worldEditorAPI.SetVariableValue(entitySource, null, "scale", m_vRandomScale[0].ToString());
86
87 float absoluteYOffset;
88// if (snapToGround)
89// absoluteYOffset += ySurface - worldPos[1];
90
91 if (m_vRandomVertOffset[0] != 0 || m_vRandomVertOffset[1] != 0)
92 absoluteYOffset += randomGenerator.RandFloatXY(m_vRandomVertOffset[0], m_vRandomVertOffset[1]);
93
94 if (absoluteYOffset != 0)
95 {
96 if (!entity)
97 entity = worldEditorAPI.SourceToEntity(entitySource);
98
99 vector newLocalPos = coords + entity.CoordToLocal(worldPos + absoluteYOffset * vector.Up); // offset, not position - add coords
100 worldEditorAPI.SetVariableValue(entitySource, null, "coords", string.Format("%1 %2 %3", newLocalPos[0], newLocalPos[1], newLocalPos[2]));
101 }
102
103 return true;
104 }
105
106 //------------------------------------------------------------------------------------------------
111 static SCR_RandomisationEditorData CreateFromEntitySource(notnull IEntitySource entitySource)
112 {
113 BaseContainerList editorData = entitySource.GetObjectArray("editorData");
114 if (!editorData)
115 return null;
116
117 int editorDataCount = editorData.Count();
118 if (editorDataCount < 1)
119 return null;
120
121 BaseContainer randomisationEditorData;
122 for (int i; i < editorDataCount; ++i)
123 {
124 randomisationEditorData = editorData.Get(i);
125 if (randomisationEditorData.GetClassName() == "RandomizationEditorData")
126 break;
127
128 randomisationEditorData = null;
129 }
130
131 if (!randomisationEditorData)
132 return null;
133
134 SCR_RandomisationEditorData result = new SCR_RandomisationEditorData();
135
136 int placement;
137 if (randomisationEditorData.Get("randomYaw", placement))
138 result.m_bPlaceByBoundingBox = placement == 1; // "boundingBox"
139
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);
146
147 return result;
148 }
149
150 //------------------------------------------------------------------------------------------------
151 // constructor
152 protected void SCR_RandomisationEditorData();
153}
154#endif
float m_fRandomRollAngle
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.
TraceFlags
Definition TraceFlags.c:13