Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
TerrainToBlender.c
Go to the documentation of this file.
1#ifdef WORKBENCH
2
3class TerrainTile
4{
5 Shape shapeTile;
6 vector coordsTile;
7 vector minTile;
8 vector maxTile;
9
10
11 void TerrainTile(Shape square, vector coords, vector min, vector max)
12 {
13 shapeTile = square;
14 coordsTile = coords;
15 minTile = min;
16 maxTile = max;
17 }
18}
19
20
21[WorkbenchToolAttribute(name: "Send Terrain To Blender", description: "Sends terrain selection to Blender for advanced terrain modifications.", wbModules: { "WorldEditor" }, shortcut: "Ctrl+P", awesomeFontCode: 0xf00a)]
22class TerrainExportTool : WorldEditorTool
23{
24 [Attribute(defvalue: "1", uiwidget: UIWidgets.Slider, desc: "Brush radius", params: string.Format("%1 %2 %3", SIZE_MIN, SIZE_MAX, SIZE_STEP), category: "Brush")]
25 protected float m_iSelectionSize;
26
27 protected static const float SIZE_MIN = 1;
28 protected static const float SIZE_MAX = 20;
29 protected static const float SIZE_STEP = 1;
30
31
32 vector previousPoint3D;
33 ref Shape square;
34
35 ref array<ref TerrainTile> terrainTileVisual = {};
36 ref array<ref TerrainTile> terrainTileSelection = {};
37
38
39 ref array<ref Shape> visualTiles = {};
40 ref array<vector> visualCoords = {};
41
42 ref array<vector> selectedCoords = {};
43 ref array<ref Shape> selectedTiles = {};
44
45
46 ref array<ref Shape> shapeTiles = {};
47 //ref array<vector> selectedTiles = {};
48
49 //Remove
50 vector currentPoint3D;
51 vector line[8];
52 //------
53
54
55 vector startPosition;
56 bool clicked = false;
57
58
59 [ButtonAttribute("Export To Blender")]
60 protected void Blender()
61 {
62 if (!EBTConfigPlugin.HasBlenderRegistered())
63 return;
64 WorldEditor we = Workbench.GetModule(WorldEditor);
65 auto api = we.GetApi();
66 array<float> heightMap = {};
67
68
69 string path;
70 // creating temp bin file to pass the coords
71 Workbench.GetAbsolutePath("$profile:", path);
72 path = path + "/BlendTerrain.bin";
73 float tileResX = (m_API.GetTerrainResolutionX(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesX(0) / m_API.GetTerrainUnitScale();
74 float tileResY = (m_API.GetTerrainResolutionY(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesY(0) / m_API.GetTerrainUnitScale();
75
76 int area = (Math.Floor(tileResX) * Math.Floor(tileResY));
77 int tileCount = 0;
78 FileHandle bin = FileIO.OpenFile(path, FileMode.WRITE);
79 api.BeginTerrainAction(TerrainToolType.HEIGHT_EXACT);
80 // Area of one tile
81 bin.Write(area);
82
83 for(int i = 0; i < selectedCoords.Count(); i++)
84 {
85 tileCount += 1;
86 int coordsX = Math.Round(selectedCoords[i][0] * (Math.Floor(tileResX) * m_API.GetTerrainUnitScale()));
87 int coordsY = Math.Round(selectedCoords[i][2] * (Math.Floor(tileResY) * m_API.GetTerrainUnitScale()));
88
89 int indexX = selectedCoords[i][0];
90 int indexY = selectedCoords[i][2];
91 bin.Write(indexX);
92 bin.Write(indexY);
93
94 bin.Write(coordsX);
95 bin.Write(coordsY);
96
97 if (api.GetTerrainSurfaceTile(0, selectedCoords[i][0], selectedCoords[i][2], heightMap))
98 {
99 bin.WriteArray(heightMap);
100 }
101 }
102 api.EndTerrainAction();
103 bin.Close();
104
105 string pathToExecutable;
106 if (!EBTConfigPlugin.GetDefaultBlenderPath(pathToExecutable))
107 return;
108
109 string worldpath;
110 m_API.GetWorldPath(worldpath);
111
112 BlenderOperatorDescription operatorDescription = new BlenderOperatorDescription("terrain");
113 operatorDescription.blIDName = "ebt.import_terrain";
114 operatorDescription.AddParam("bin_path", path);
115 operatorDescription.AddParam("cell_size", m_API.GetTerrainUnitScale(0));
116 operatorDescription.AddParam("world_path",worldpath);
117 operatorDescription.AddParam("tile_count", tileCount);
118
119 StartBlenderWithOperator(operatorDescription, false);
120 }
121
122
123
124 //------------------------------------------------------------------------------------------------
125 [ButtonAttribute("Clear Selection")]
126 protected void ClearSelection()
127 {
128 visualTiles.Clear();
129 selectedTiles.Clear();
130 selectedCoords.Clear();
131 shapeTiles.Clear();
132 }
133
134
135
136 //------------------------------------------------------------------------------------------------
137 override void OnMouseMoveEvent(float x, float y)
138 {
139 terrainTileVisual.Clear();
140 visualTiles.Clear();
141 visualCoords.Clear();
142 vector traceStart;
143 vector traceEnd;
144 vector traceDir;
145
146 if (m_API.TraceWorldPos(x, y, TraceFlags.WORLD, traceStart, traceEnd, traceDir))
147 {
148 float tileResX = (m_API.GetTerrainResolutionX(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesX(0);
149 float tileResY = (m_API.GetTerrainResolutionY(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesY(0);
150 vector tile = Vector(Math.Floor(traceEnd[0] / Math.Floor(tileResX)), 0, Math.Floor(traceEnd[2] / Math.Floor(tileResY)));
151 vector tileCornerMin = Vector(tile[0] * Math.Floor(tileResX),0, tile[2] * Math.Floor(tileResY));
152 vector tileCornerMax = Vector(tileCornerMin[0] + Math.Floor(tileResX),0,tileCornerMin[2] + Math.Floor(tileResY));
153
154 vector coords = traceEnd;
155 for(int w = 1; w <= m_iSelectionSize; w++)
156 {
157 // now just deleting when click and clicking
158 for(int h = 1; h <= m_iSelectionSize; h++)
159 {
160 tile = Vector(Math.Floor(coords[0] / Math.Floor(tileResX)),0,Math.Floor(coords[2] / Math.Floor(tileResY)));
161
162 tileCornerMin = Vector(tile[0] * Math.Floor(tileResX),0, tile[2] * Math.Floor(tileResY));
163 tileCornerMax = Vector(tileCornerMin[0] + Math.Floor(tileResX),0,tileCornerMin[2] + Math.Floor(tileResY));
164 Shape tileShape = Shape.Create(ShapeType.BBOX, ARGB(50,100,100,100), ShapeFlags.NOZBUFFER|ShapeFlags.TRANSP, tileCornerMin, tileCornerMax);
165 visualTiles.Insert(tileShape);
166 visualCoords.Insert(tile);
167
168 coords[0] = coords[0] + tileResX;
169 }
170 coords[0] = coords[0] - tileResX * m_iSelectionSize;
171 coords[2] = coords[2] + tileResY;
172 }
173 }
174 }
175
176
177 void UpdateSelection(vector mouseCoords)
178 {
179 float tileResX = (m_API.GetTerrainResolutionX(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesX(0);
180 float tileResY = (m_API.GetTerrainResolutionY(0) * m_API.GetTerrainUnitScale(0)) / m_API.GetTerrainTilesY(0);
181 vector tile = Vector(Math.Floor(mouseCoords[0] / Math.Floor(tileResX)), 0, Math.Floor(mouseCoords[2] / Math.Floor(tileResY)));
182
183 for(int i = 0; i < visualCoords.Count(); i++)
184 {
185 if(!selectedCoords.Contains(visualCoords[i]))
186 {
187 vector tileCornerMin = Vector(visualCoords[i][0] * Math.Floor(tileResX),0, visualCoords[i][2] * Math.Floor(tileResY));
188 vector tileCornerMax = Vector(tileCornerMin[0] + Math.Floor(tileResX),0,tileCornerMin[2] + Math.Floor(tileResY));
189 Shape selectedShape = Shape.Create(ShapeType.BBOX, ARGB(50,100,100,0), ShapeFlags.NOZBUFFER|ShapeFlags.TRANSP, tileCornerMin, tileCornerMax);
190 selectedTiles.Insert(selectedShape);
191 selectedCoords.Insert(visualCoords[i]);
192 }
193 else
194 {
195 int index = selectedCoords.Find(visualCoords[i]);
196 selectedCoords.Remove(index);
197 selectedTiles.Remove(index);
198 }
199 }
200 }
201
202 override void OnMousePressEvent(float x, float y, WETMouseButtonFlag buttons)
203 {
204 vector traceStart;
205 vector traceEnd;
206 vector traceDir;
207 if (m_API.TraceWorldPos(x, y, TraceFlags.WORLD, traceStart, traceEnd, traceDir))
208 {
209 UpdateSelection(traceEnd);
210 }
211 }
212
213 override void OnActivate()
214 {
215 EBTConfigPlugin.UpdateRegisteredBlenderExecutables();
216
217 }
218 override void OnDeActivate()
219 {
220 selectedTiles.Clear();
221 selectedCoords.Clear();
222 shapeTiles.Clear();
223 visualTiles.Clear();
224 square = null;
225 startPosition = "0 0 0";
226 }
227}
228
229#endif
230
string path
ref array< string > coords
override void OnActivate()
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
class WorkbenchDialog_AbortRetryIgnore ButtonAttribute("OK", true)
Definition Math.c:13
Instance of created debug visualizer.
Definition Shape.c:14
ShapeType
Definition ShapeType.c:13
ShapeFlags
Definition ShapeFlags.c:13
SCR_FieldOfViewSettings Attribute
FileMode
Mode for opening file. See FileSystem::Open.
Definition FileMode.c:14
proto native vector Vector(float x, float y, float z)
TerrainToolType
TraceFlags
Definition TraceFlags.c:13
proto int ARGB(int a, int r, int g, int b)