11 void TerrainTile(Shape square, vector
coords, vector min, vector max)
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
25 protected float m_iSelectionSize;
27 protected static const float SIZE_MIN = 1;
28 protected static const float SIZE_MAX = 20;
29 protected static const float SIZE_STEP = 1;
35 ref array<ref TerrainTile> terrainTileVisual = {};
36 ref array<ref TerrainTile> terrainTileSelection = {};
39 ref array<ref Shape> visualTiles = {};
40 ref array<vector> visualCoords = {};
42 ref array<vector> selectedCoords = {};
43 ref array<ref Shape> selectedTiles = {};
46 ref array<ref Shape> shapeTiles = {};
60 protected void Blender()
62 if (!EBTConfigPlugin.HasBlenderRegistered())
64 WorldEditor we = Workbench.GetModule(WorldEditor);
65 auto api = we.GetApi();
66 array<float> heightMap = {};
71 Workbench.GetAbsolutePath(
"$profile:",
path);
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();
76 int area = (
Math.Floor(tileResX) *
Math.Floor(tileResY));
83 for(
int i = 0; i < selectedCoords.Count(); i++)
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()));
89 int indexX = selectedCoords[i][0];
90 int indexY = selectedCoords[i][2];
97 if (api.GetTerrainSurfaceTile(0, selectedCoords[i][0], selectedCoords[i][2], heightMap))
99 bin.WriteArray(heightMap);
102 api.EndTerrainAction();
105 string pathToExecutable;
106 if (!EBTConfigPlugin.GetDefaultBlenderPath(pathToExecutable))
110 m_API.GetWorldPath(worldpath);
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);
119 StartBlenderWithOperator(operatorDescription,
false);
126 protected void ClearSelection()
129 selectedTiles.Clear();
130 selectedCoords.Clear();
137 override void OnMouseMoveEvent(
float x,
float y)
139 terrainTileVisual.Clear();
141 visualCoords.Clear();
146 if (m_API.TraceWorldPos(x, y,
TraceFlags.WORLD, traceStart, traceEnd, traceDir))
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);
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));
155 for(
int w = 1; w <= m_iSelectionSize; w++)
158 for(
int h = 1; h <= m_iSelectionSize; h++)
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));
165 visualTiles.Insert(tileShape);
166 visualCoords.Insert(tile);
177 void UpdateSelection(
vector mouseCoords)
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);
183 for(
int i = 0; i < visualCoords.Count(); i++)
185 if(!selectedCoords.Contains(visualCoords[i]))
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));
190 selectedTiles.Insert(selectedShape);
191 selectedCoords.Insert(visualCoords[i]);
195 int index = selectedCoords.Find(visualCoords[i]);
196 selectedCoords.Remove(
index);
197 selectedTiles.Remove(
index);
202 override void OnMousePressEvent(
float x,
float y, WETMouseButtonFlag buttons)
207 if (m_API.TraceWorldPos(x, y,
TraceFlags.WORLD, traceStart, traceEnd, traceDir))
209 UpdateSelection(traceEnd);
215 EBTConfigPlugin.UpdateRegisteredBlenderExecutables();
218 override void OnDeActivate()
220 selectedTiles.Clear();
221 selectedCoords.Clear();
225 startPosition =
"0 0 0";
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)
Instance of created debug visualizer.
SCR_FieldOfViewSettings Attribute
FileMode
Mode for opening file. See FileSystem::Open.
proto native vector Vector(float x, float y, float z)
proto int ARGB(int a, int r, int g, int b)