载入中...
搜索中...
未找到
Editor.cpp
浏览该文件的文档.
1#include "editor/Editor.h"
2
3#include "editor/Brush.h"
4#include "editor/EditorDock.h"
9#include "editor/TileBuffer.h"
11
12#include "graphics/Graphics.h"
13#include "graphics/Mesh.h"
14#ifdef EVENGINE_HAS_PROCGEN
16#endif
17
18#include <simplesquirrel/simplesquirrel.hpp>
19
20#include <cstdint>
21#include <vector>
22
23namespace eve::editor {
24
26
27#ifdef EVENGINE_HAS_PROCGEN
28namespace {
29
30#ifdef EVENGINE_HAS_PROCGEN
31struct HeightmapArrays {
32 std::vector<float> pos;
33 std::vector<float> nrm;
34 std::vector<float> uv;
35 std::vector<uint32_t> idx;
36};
37
39void buildHeightmapArrays(const eve::procgen::Heightmap &hm, float cell, float hScale,
40 HeightmapArrays &out) {
41 out.pos.clear();
42 out.nrm.clear();
43 out.uv.clear();
44 out.idx.clear();
45 const int w = hm.getWidth();
46 const int h = hm.getHeight();
47 if (w < 2 || h < 2) return;
48 const float uw = float(w - 1);
49 const float uh = float(h - 1);
50
51 auto addTri = [&](float ax, float az, float ay, float bx, float bz, float by, float cx,
52 float cz, float cy) {
53 const float p0x = ax * cell, p0y = ay * hScale, p0z = az * cell;
54 const float p1x = bx * cell, p1y = by * hScale, p1z = bz * cell;
55 const float p2x = cx * cell, p2y = cy * hScale, p2z = cz * cell;
56 const float e1x = p1x - p0x, e1y = p1y - p0y, e1z = p1z - p0z;
57 const float e2x = p2x - p0x, e2y = p2y - p0y, e2z = p2z - p0z;
58 float nx = e1y * e2z - e1z * e2y;
59 float ny = e1z * e2x - e1x * e2z;
60 float nz = e1x * e2y - e1y * e2x;
61 const float len = std::sqrt(nx * nx + ny * ny + nz * nz);
62 if (len > 1e-8f) {
63 nx /= len;
64 ny /= len;
65 nz /= len;
66 }
67 const uint32_t base = uint32_t(out.pos.size() / 3);
68 out.pos.insert(out.pos.end(), {p0x, p0y, p0z, p1x, p1y, p1z, p2x, p2y, p2z});
69 out.nrm.insert(out.nrm.end(), {nx, ny, nz, nx, ny, nz, nx, ny, nz});
70 out.uv.insert(out.uv.end(),
71 {ax / uw, az / uh, bx / uw, bz / uh, cx / uw, cz / uh});
72 out.idx.insert(out.idx.end(), {base, base + 1, base + 2});
73 };
74
75 for (int y = 0; y < h - 1; ++y) {
76 for (int x = 0; x < w - 1; ++x) {
77 const float h00 = hm.height(x, y);
78 const float h10 = hm.height(x + 1, y);
79 const float h01 = hm.height(x, y + 1);
80 const float h11 = hm.height(x + 1, y + 1);
81 // Grid is XZ; y in the function is the XZ "row" axis.
82 addTri(float(x), float(y), h00, float(x + 1), float(y), h10, float(x), float(y + 1), h01);
83 addTri(float(x + 1), float(y), h10, float(x + 1), float(y + 1), h11, float(x),
84 float(y + 1), h01);
85 }
86 }
87}
88#endif
89
90} // namespace
91#endif
92
94
96
98
99Brush *Editor::newBrush() { return new Brush(); }
100
102
104
106
108
109#ifdef EVENGINE_HAS_PROCGEN
110graphics::Mesh *Editor::newHeightmapMesh(procgen::Heightmap *hm, float cellSize,
111 float heightScale) {
112 auto *gfx = eve::ModuleManager::getInstance<graphics::Graphics>("Graphics");
113 if (!gfx || !hm) return nullptr;
114 HeightmapArrays a;
115 buildHeightmapArrays(*hm, cellSize, heightScale, a);
116 if (a.idx.empty()) return nullptr;
117 return gfx->newMeshFromArrays(a.pos.data(), a.nrm.data(), a.uv.data(),
118 int(a.pos.size() / 3), a.idx.data(), int(a.idx.size()));
119}
120
121bool Editor::updateHeightmapMesh(graphics::Mesh *mesh, graphics::Graphics *gfx,
122 procgen::Heightmap *hm, float cellSize, float heightScale) {
123 if (!mesh || !gfx || !hm) return false;
124 HeightmapArrays a;
125 buildHeightmapArrays(*hm, cellSize, heightScale, a);
126 if (a.idx.empty()) return false;
127 return gfx->updateMeshVertices(mesh, a.pos.data(), a.nrm.data(), a.uv.data(),
128 int(a.pos.size() / 3), a.idx.data(), int(a.idx.size()));
129}
130#endif
131
132void Editor::expose(ssq::Table &table) {
133 auto cls = table.addClass(name, Editor::create, false);
134 expose(cls);
135
136 auto gizmo = table.addClass<TransformGizmo>(
137 "TransformGizmo",
138 std::function<TransformGizmo *()>([]() -> TransformGizmo * { return nullptr; }), true);
139 gizmo.addFunc("setMode", &TransformGizmo::setMode);
140 gizmo.addFunc("getMode", &TransformGizmo::getMode);
141 gizmo.addFunc("setSpace", &TransformGizmo::setSpace);
142 gizmo.addFunc("getSpace", &TransformGizmo::getSpace);
143 gizmo.addFunc("setSize", &TransformGizmo::setSize);
144 gizmo.addFunc("getSize", &TransformGizmo::getSize);
145 gizmo.addFunc("setPosition", &TransformGizmo::setPosition);
146 gizmo.addFunc("getPositionX", &TransformGizmo::getPositionX);
147 gizmo.addFunc("getPositionY", &TransformGizmo::getPositionY);
148 gizmo.addFunc("getPositionZ", &TransformGizmo::getPositionZ);
149 gizmo.addFunc("setRotationEuler", &TransformGizmo::setRotationEuler);
150 gizmo.addFunc("getRotationX", &TransformGizmo::getRotationX);
151 gizmo.addFunc("getRotationY", &TransformGizmo::getRotationY);
152 gizmo.addFunc("getRotationZ", &TransformGizmo::getRotationZ);
153 gizmo.addFunc("setScale", &TransformGizmo::setScale);
154 gizmo.addFunc("getScaleX", &TransformGizmo::getScaleX);
155 gizmo.addFunc("getScaleY", &TransformGizmo::getScaleY);
156 gizmo.addFunc("getScaleZ", &TransformGizmo::getScaleZ);
157 gizmo.addFunc("setBounds", &TransformGizmo::setBounds);
158 gizmo.addFunc("getBoundsMinX", &TransformGizmo::getBoundsMinX);
159 gizmo.addFunc("getBoundsMinY", &TransformGizmo::getBoundsMinY);
160 gizmo.addFunc("getBoundsMinZ", &TransformGizmo::getBoundsMinZ);
161 gizmo.addFunc("getBoundsMaxX", &TransformGizmo::getBoundsMaxX);
162 gizmo.addFunc("getBoundsMaxY", &TransformGizmo::getBoundsMaxY);
163 gizmo.addFunc("getBoundsMaxZ", &TransformGizmo::getBoundsMaxZ);
164 gizmo.addFunc("setSnapTranslate", &TransformGizmo::setSnapTranslate);
165 gizmo.addFunc("setSnapRotate", &TransformGizmo::setSnapRotate);
166 gizmo.addFunc("setSnapScale", &TransformGizmo::setSnapScale);
167 gizmo.addFunc("getSnapTranslateX", &TransformGizmo::getSnapTranslateX);
168 gizmo.addFunc("getSnapTranslateY", &TransformGizmo::getSnapTranslateY);
169 gizmo.addFunc("getSnapTranslateZ", &TransformGizmo::getSnapTranslateZ);
170 gizmo.addFunc("getSnapRotate", &TransformGizmo::getSnapRotate);
171 gizmo.addFunc("getSnapScale", &TransformGizmo::getSnapScale);
172 gizmo.addFunc("getMatrix", &TransformGizmo::getMatrix);
173 gizmo.addFunc("pick", &TransformGizmo::pick);
174 gizmo.addFunc("beginDrag", &TransformGizmo::beginDrag);
175 gizmo.addFunc("updateDrag", &TransformGizmo::updateDrag);
176 gizmo.addFunc("endDrag", &TransformGizmo::endDrag);
177 gizmo.addFunc("isDragging", &TransformGizmo::isDragging);
178 gizmo.addFunc("isHovered", &TransformGizmo::isHovered);
179 gizmo.addFunc("getActiveAxis", &TransformGizmo::getActiveAxis);
180 gizmo.addFunc("getHoverAxis", &TransformGizmo::getHoverAxis);
181 gizmo.addFunc("rebuildParts", &TransformGizmo::rebuildParts);
182 gizmo.addFunc("getPartCount", &TransformGizmo::getPartCount);
183 gizmo.addFunc("getPartKind", &TransformGizmo::getPartKind);
184 gizmo.addFunc("getPartAxis", &TransformGizmo::getPartAxis);
185 gizmo.addFunc("getPartColorR", &TransformGizmo::getPartColorR);
186 gizmo.addFunc("getPartColorG", &TransformGizmo::getPartColorG);
187 gizmo.addFunc("getPartColorB", &TransformGizmo::getPartColorB);
188 gizmo.addFunc("getPartColorA", &TransformGizmo::getPartColorA);
189 gizmo.addFunc("getPartOriginX", &TransformGizmo::getPartOriginX);
190 gizmo.addFunc("getPartOriginY", &TransformGizmo::getPartOriginY);
191 gizmo.addFunc("getPartOriginZ", &TransformGizmo::getPartOriginZ);
192 gizmo.addFunc("getPartDirX", &TransformGizmo::getPartDirX);
193 gizmo.addFunc("getPartDirY", &TransformGizmo::getPartDirY);
194 gizmo.addFunc("getPartDirZ", &TransformGizmo::getPartDirZ);
195 gizmo.addFunc("getPartLength", &TransformGizmo::getPartLength);
196 gizmo.addFunc("getPartRadius", &TransformGizmo::getPartRadius);
197
198 auto mgr = table.addClass<GizmoManager>(
199 "GizmoManager",
200 std::function<GizmoManager *()>([]() -> GizmoManager * { return nullptr; }), true);
201 mgr.addFunc("getGizmo", &GizmoManager::getGizmo);
202 mgr.addFunc("setPositionEnabled", &GizmoManager::setPositionEnabled);
203 mgr.addFunc("setRotationEnabled", &GizmoManager::setRotationEnabled);
204 mgr.addFunc("setScaleEnabled", &GizmoManager::setScaleEnabled);
205 mgr.addFunc("setBoundEnabled", &GizmoManager::setBoundEnabled);
206 mgr.addFunc("getPositionEnabled", &GizmoManager::getPositionEnabled);
207 mgr.addFunc("getRotationEnabled", &GizmoManager::getRotationEnabled);
208 mgr.addFunc("getScaleEnabled", &GizmoManager::getScaleEnabled);
209 mgr.addFunc("getBoundEnabled", &GizmoManager::getBoundEnabled);
210 mgr.addFunc("attach", &GizmoManager::attach);
211 mgr.addFunc("detach", &GizmoManager::detach);
212 mgr.addFunc("isAttached", &GizmoManager::isAttached);
213 mgr.addFunc("pick", &GizmoManager::pick);
214 mgr.addFunc("beginDrag", &GizmoManager::beginDrag);
215 mgr.addFunc("updateDrag", &GizmoManager::updateDrag);
216 mgr.addFunc("endDrag", &GizmoManager::endDrag);
217 mgr.addFunc("isDragging", &GizmoManager::isDragging);
218 mgr.addFunc("isHovered", &GizmoManager::isHovered);
219
220 auto buf = table.addClass<TileBuffer>(
221 "TileBuffer", std::function<TileBuffer *()>([]() -> TileBuffer * { return nullptr; }),
222 true);
223 buf.addFunc("getWidth", &TileBuffer::getWidth);
224 buf.addFunc("getHeight", &TileBuffer::getHeight);
225 buf.addFunc("resize", &TileBuffer::resize);
226 buf.addFunc("clear", &TileBuffer::clear);
227 buf.addFunc("fill", &TileBuffer::fill);
228 buf.addFunc("setGid", &TileBuffer::setGid);
229 buf.addFunc("getGid", &TileBuffer::getGid);
230 buf.addFunc("inBounds", &TileBuffer::inBounds);
231
232 auto brush = table.addClass<Brush>(
233 "Brush", std::function<Brush *()>([]() -> Brush * { return nullptr; }), true);
234 brush.addFunc("setTool", &Brush::setTool);
235 brush.addFunc("getTool", &Brush::getTool);
236 brush.addFunc("setSize", &Brush::setSize);
237 brush.addFunc("getSize", &Brush::getSize);
238 brush.addFunc("setShape", &Brush::setShape);
239 brush.addFunc("getShape", &Brush::getShape);
240 brush.addFunc("setTile", &Brush::setTile);
241 brush.addFunc("getTile", &Brush::getTile);
242 brush.addFunc("setEraseTile", &Brush::setEraseTile);
243 brush.addFunc("getEraseTile", &Brush::getEraseTile);
244 brush.addFunc("setStampSize", &Brush::setStampSize);
245 brush.addFunc("getStampWidth", &Brush::getStampWidth);
246 brush.addFunc("getStampHeight", &Brush::getStampHeight);
247 brush.addFunc("setStampTile", &Brush::setStampTile);
248 brush.addFunc("getStampTile", &Brush::getStampTile);
249 brush.addFunc("clearStamp", &Brush::clearStamp);
250 brush.addFunc("paintAt", &Brush::paintAt);
251 brush.addFunc("eraseAt", &Brush::eraseAt);
252 brush.addFunc("floodFill", &Brush::floodFill);
253 brush.addFunc("paintLine", &Brush::paintLine);
254 brush.addFunc("paintRect", &Brush::paintRect);
255 brush.addFunc("previewAt", &Brush::previewAt);
256 brush.addFunc("previewLine", &Brush::previewLine);
257 brush.addFunc("previewRect", &Brush::previewRect);
258 brush.addFunc("getPreviewCount", &Brush::getPreviewCount);
259 brush.addFunc("getPreviewX", &Brush::getPreviewX);
260 brush.addFunc("getPreviewY", &Brush::getPreviewY);
261 brush.addFunc("getPreviewGid", &Brush::getPreviewGid);
262 brush.addFunc("getChangeCount", &Brush::getChangeCount);
263 brush.addFunc("getChangeX", &Brush::getChangeX);
264 brush.addFunc("getChangeY", &Brush::getChangeY);
265 brush.addFunc("getChangeOldGid", &Brush::getChangeOldGid);
266 brush.addFunc("getChangeNewGid", &Brush::getChangeNewGid);
267
268 auto tb = table.addClass<EditorToolbar>(
269 "EditorToolbar",
270 std::function<EditorToolbar *()>([]() -> EditorToolbar * { return nullptr; }), true);
271 tb.addFunc("clear", &EditorToolbar::clear);
272 tb.addFunc("addTool", &EditorToolbar::addTool);
273 tb.addFunc("setShortcut", &EditorToolbar::setShortcut);
274 tb.addFunc("setActive", &EditorToolbar::setActive);
275 tb.addFunc("getActive", &EditorToolbar::getActive);
276 tb.addFunc("matchShortcut", &EditorToolbar::matchShortcut);
277 tb.addFunc("getToolCount", &EditorToolbar::getToolCount);
278 tb.addFunc("getToolId", &EditorToolbar::getToolId);
279 tb.addFunc("getToolLabel", &EditorToolbar::getToolLabel);
280 tb.addFunc("getToolShortcut", &EditorToolbar::getToolShortcut);
281
282 auto insp = table.addClass<EditorInspector>(
283 "EditorInspector",
284 std::function<EditorInspector *()>([]() -> EditorInspector * { return nullptr; }), true);
285 insp.addFunc("clear", &EditorInspector::clear);
286 insp.addFunc("addFloat", &EditorInspector::addFloat);
287 insp.addFunc("addFloat3", &EditorInspector::addFloat3);
288 insp.addFunc("addBool", &EditorInspector::addBool);
289 insp.addFunc("addString", &EditorInspector::addString);
290 insp.addFunc("addChoice", &EditorInspector::addChoice);
291 insp.addFunc("getFieldCount", &EditorInspector::getFieldCount);
292 insp.addFunc("getFieldKind", &EditorInspector::getFieldKind);
293 insp.addFunc("getFieldId", &EditorInspector::getFieldId);
294 insp.addFunc("getFieldLabel", &EditorInspector::getFieldLabel);
295 insp.addFunc("getFloat", &EditorInspector::getFloat);
296 insp.addFunc("setFloat", &EditorInspector::setFloat);
297 insp.addFunc("getFloatMin", &EditorInspector::getFloatMin);
298 insp.addFunc("getFloatMax", &EditorInspector::getFloatMax);
299 insp.addFunc("getFloatStep", &EditorInspector::getFloatStep);
300 insp.addFunc("getFloat3X", &EditorInspector::getFloat3X);
301 insp.addFunc("getFloat3Y", &EditorInspector::getFloat3Y);
302 insp.addFunc("getFloat3Z", &EditorInspector::getFloat3Z);
303 insp.addFunc("setFloat3", &EditorInspector::setFloat3);
304 insp.addFunc("getBool", &EditorInspector::getBool);
305 insp.addFunc("setBool", &EditorInspector::setBool);
306 insp.addFunc("getString", &EditorInspector::getString);
307 insp.addFunc("setString", &EditorInspector::setString);
308 insp.addFunc("getChoice", &EditorInspector::getChoice);
309 insp.addFunc("setChoice", &EditorInspector::setChoice);
310 insp.addFunc("getChoicesCsv", &EditorInspector::getChoicesCsv);
311 insp.addFunc("isDirty", &EditorInspector::isDirty);
312 insp.addFunc("clearDirty", &EditorInspector::clearDirty);
313 insp.addFunc("clearAllDirty", &EditorInspector::clearAllDirty);
314 insp.addFunc("pollChangedId", &EditorInspector::pollChangedId);
315
316 auto dock = table.addClass<EditorDock>(
317 "EditorDock", std::function<EditorDock *()>([]() -> EditorDock * { return nullptr; }),
318 true);
319 dock.addFunc("setRegionSize", &EditorDock::setRegionSize);
320 dock.addFunc("getRegionSize", &EditorDock::getRegionSize);
321 dock.addFunc("layout", &EditorDock::layout);
322 dock.addFunc("getRegionX", &EditorDock::getRegionX);
323 dock.addFunc("getRegionY", &EditorDock::getRegionY);
324 dock.addFunc("getRegionW", &EditorDock::getRegionW);
325 dock.addFunc("getRegionH", &EditorDock::getRegionH);
326
327 auto hist = table.addClass<EditorHistory>(
328 "EditorHistory",
329 std::function<EditorHistory *()>([]() -> EditorHistory * { return nullptr; }), true);
330 hist.addFunc("clear", &EditorHistory::clear);
331 hist.addFunc("push", &EditorHistory::push);
332 hist.addFunc("beginGroup", &EditorHistory::beginGroup);
333 hist.addFunc("recordTile", &EditorHistory::recordTile);
334 hist.addFunc("endGroup", &EditorHistory::endGroup);
335 hist.addFunc("isGrouping", &EditorHistory::isGrouping);
336 hist.addFunc("canUndo", &EditorHistory::canUndo);
337 hist.addFunc("canRedo", &EditorHistory::canRedo);
338 hist.addFunc("getUndoCount", &EditorHistory::getUndoCount);
339 hist.addFunc("getRedoCount", &EditorHistory::getRedoCount);
340 hist.addFunc("undo", &EditorHistory::undo);
341 hist.addFunc("redo", &EditorHistory::redo);
342 hist.addFunc("applyLastToBuffer", &EditorHistory::applyLastToBuffer);
343 hist.addFunc("getLastActionName", &EditorHistory::getLastActionName);
344 hist.addFunc("getLastActionKind", &EditorHistory::getLastActionKind);
345 hist.addFunc("getLastPayload", &EditorHistory::getLastPayload);
346 hist.addFunc("getLastTileCount", &EditorHistory::getLastTileCount);
347 hist.addFunc("getLastTileX", &EditorHistory::getLastTileX);
348 hist.addFunc("getLastTileY", &EditorHistory::getLastTileY);
349 hist.addFunc("getLastTileOldGid", &EditorHistory::getLastTileOldGid);
350 hist.addFunc("getLastTileNewGid", &EditorHistory::getLastTileNewGid);
351}
352
353void Editor::expose(ssq::Class &cls) {
354 cls.addFunc("getName", &Editor::getName);
355 cls.addFunc("newGizmo", &Editor::newGizmo);
356 cls.addFunc("newGizmoManager", &Editor::newGizmoManager);
357 cls.addFunc("newTileBuffer", &Editor::newTileBuffer);
358 cls.addFunc("newBrush", &Editor::newBrush);
359 cls.addFunc("newToolbar", &Editor::newToolbar);
360 cls.addFunc("newInspector", &Editor::newInspector);
361 cls.addFunc("newDock", &Editor::newDock);
362 cls.addFunc("newHistory", &Editor::newHistory);
363#ifdef EVENGINE_HAS_PROCGEN
364 cls.addFunc("newHeightmapMesh", &Editor::newHeightmapMesh);
365 cls.addFunc("updateHeightmapMesh", &Editor::updateHeightmapMesh);
366#endif
367}
368
369} // namespace eve::editor
float cx
Definition CardTypes.cpp:31
float cy
Definition CardTypes.cpp:32
HSQOBJECT cls
Definition ECS.cpp:21
int y
Definition Grass.cpp:135
float height
Definition Grass.cpp:235
int x
Definition Grass.cpp:135
int h
int w
uint32_t a
float tb
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
int width
int idx
Mesh * mesh
const char * name
Definition RockMesh.cpp:21
virtual std::string getName() const =0
Unity GridBrushBase-inspired tile brush. Operates on TileBuffer; exposes preview + change list for UI...
Definition Brush.h:14
int getPreviewX(int index) const
Definition Brush.cpp:304
void setSize(int size)
Definition Brush.cpp:22
void setTool(const std::string &tool)
Definition Brush.cpp:14
int getPreviewGid(int index) const
Definition Brush.cpp:312
int paintLine(TileBuffer *buffer, int x0, int y0, int x1, int y1)
Definition Brush.cpp:243
int previewAt(TileBuffer *buffer, int tx, int ty)
Fill preview buffer without mutating target.
Definition Brush.cpp:257
void setStampTile(int lx, int ly, int gid)
Definition Brush.cpp:45
int getPreviewCount() const
Definition Brush.h:52
int eraseAt(TileBuffer *buffer, int tx, int ty)
Definition Brush.cpp:201
int previewRect(TileBuffer *buffer, int x0, int y0, int x1, int y1, bool filled)
Definition Brush.cpp:290
int paintAt(TileBuffer *buffer, int tx, int ty)
Apply current tool at / between cells. Returns cells changed.
Definition Brush.cpp:192
int paintRect(TileBuffer *buffer, int x0, int y0, int x1, int y1, bool filled)
Definition Brush.cpp:250
int getEraseTile() const
Definition Brush.h:31
void setTile(int gid)
Definition Brush.cpp:34
int previewLine(TileBuffer *buffer, int x0, int y0, int x1, int y1)
Definition Brush.cpp:283
int getChangeNewGid(int index) const
Definition Brush.cpp:328
int getChangeX(int index) const
Definition Brush.cpp:316
int getTile() const
Definition Brush.h:28
void setEraseTile(int gid)
Definition Brush.cpp:36
int getStampTile(int lx, int ly) const
Definition Brush.cpp:52
int getChangeY(int index) const
Definition Brush.cpp:320
std::string getShape() const
Definition Brush.h:25
int getStampWidth() const
Definition Brush.h:34
int getChangeOldGid(int index) const
Definition Brush.cpp:324
void setShape(const std::string &shape)
Definition Brush.cpp:27
int getSize() const
Definition Brush.h:22
int getPreviewY(int index) const
Definition Brush.cpp:308
void clearStamp()
Definition Brush.cpp:59
int floodFill(TileBuffer *buffer, int tx, int ty)
Definition Brush.cpp:207
int getChangeCount() const
Definition Brush.h:57
void setStampSize(int width, int height)
Definition Brush.cpp:38
std::string getTool() const
Definition Brush.h:19
int getStampHeight() const
Definition Brush.h:35
Simple editor chrome regions: left / right / top / bottom / center.
Definition EditorDock.h:9
float getRegionX(const std::string &region) const
void setRegionSize(const std::string &region, float pixels)
float getRegionY(const std::string &region) const
void layout(float screenW, float screenH)
float getRegionW(const std::string &region) const
float getRegionH(const std::string &region) const
float getRegionSize(const std::string &region) const
Undo/redo stack: opaque string actions + optional tile change groups that can apply directly to a Til...
std::string getLastActionName() const
int getLastTileY(int index) const
int getLastTileOldGid(int index) const
int getLastTileX(int index) const
int getLastTileNewGid(int index) const
void recordTile(int x, int y, int oldGid, int newGid)
std::string getLastActionKind() const
void push(const std::string &name, const std::string &payload)
bool applyLastToBuffer(TileBuffer *buffer)
Apply last undone/redone tile group to buffer (no-op for opaque actions).
std::string getLastPayload() const
void beginGroup(const std::string &name)
Property sheet descriptors + values (host renders via ui).
void addFloat(const std::string &id, const std::string &label, float value, float minV, float maxV, float step)
std::string getFieldKind(int index) const
bool isDirty(const std::string &id) const
void setFloat3(const std::string &id, float x, float y, float z)
float getFloatStep(const std::string &id) const
std::string getFieldLabel(int index) const
float getFloat3X(const std::string &id) const
void setChoice(const std::string &id, const std::string &value)
std::string getString(const std::string &id) const
void clearDirty(const std::string &id)
std::string pollChangedId()
Returns next dirty field id, or "" if none.
void setFloat(const std::string &id, float value)
std::string getChoice(const std::string &id) const
std::string getChoicesCsv(const std::string &id) const
void addString(const std::string &id, const std::string &label, const std::string &value)
float getFloat(const std::string &id) const
float getFloat3Z(const std::string &id) const
std::string getFieldId(int index) const
void setString(const std::string &id, const std::string &value)
void setBool(const std::string &id, bool value)
void addBool(const std::string &id, const std::string &label, bool value)
float getFloatMax(const std::string &id) const
float getFloatMin(const std::string &id) const
void addFloat3(const std::string &id, const std::string &label, float x, float y, float z)
bool getBool(const std::string &id) const
void addChoice(const std::string &id, const std::string &label, const std::string &choicesCsv, const std::string &selected)
float getFloat3Y(const std::string &id) const
Tool strip state for assembling editor chrome with ui.
std::string getToolLabel(int index) const
std::string getToolId(int index) const
void addTool(const std::string &id, const std::string &label)
bool setActive(const std::string &id)
std::string getActive() const
void setShortcut(const std::string &id, const std::string &key)
std::string getToolShortcut(int index) const
bool matchShortcut(const std::string &key)
Editor building blocks — not a shipped 3D/map editor app. Script: editor <- eve.Editor();
Definition Editor.h:35
GizmoManager * newGizmoManager()
Definition Editor.cpp:95
TileBuffer * newTileBuffer(int width, int height)
Definition Editor.cpp:97
EditorHistory * newHistory()
Definition Editor.cpp:107
TransformGizmo * newGizmo()
Definition Editor.cpp:93
Brush * newBrush()
Definition Editor.cpp:99
EditorToolbar * newToolbar()
Definition Editor.cpp:101
EditorInspector * newInspector()
Definition Editor.cpp:103
EditorDock * newDock()
Definition Editor.cpp:105
Babylon.js-style manager: toggles which transform modes are enabled and routes pick/drag to the owned...
void setPositionEnabled(bool enabled)
void setScaleEnabled(bool enabled)
void setBoundEnabled(bool enabled)
bool getPositionEnabled() const
void setRotationEnabled(bool enabled)
TransformGizmo * getGizmo()
std::string pick(float ox, float oy, float oz, float dx, float dy, float dz)
Pick across enabled modes; sets gizmo mode to the winning tool.
bool getRotationEnabled() const
bool beginDrag(const std::string &axis, float ox, float oy, float oz, float dx, float dy, float dz)
bool updateDrag(float ox, float oy, float oz, float dx, float dy, float dz)
Independent GID grid for map brushes (no hard dependency on map.TileLayer).
Definition TileBuffer.h:9
int getGid(int x, int y) const
bool inBounds(int x, int y) const
void resize(int width, int height)
void setGid(int x, int y, int gid)
3D transform gizmo (Three.js TransformControls + ImGuizmo style). Owns TRS + optional local bounds; i...
float getPartDirY(int index) const
std::string getHoverAxis() const
void setSnapRotate(float degrees)
float getPartColorR(int index) const
void rebuildParts()
Rebuild draw parts for current mode/space (call after TRS/mode change).
float getPartDirX(int index) const
std::string pick(float ox, float oy, float oz, float dx, float dy, float dz)
Ray pick against active mode handles. Returns axis id: "x"|"y"|"z"|"xy"|"yz"|"xz"|"xyz"|"bx"|…|"bz"|"...
float getPartDirZ(int index) const
std::string getPartKind(int index) const
std::string getMode() const
float getPartRadius(int index) const
float getMatrix(int index) const
Column-major matrix element 0..15 of current TRS.
float getPartColorG(int index) const
void setBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)
Local AABB extents for bound mode (relative to object origin).
float getPartColorB(int index) const
bool beginDrag(const std::string &axis, float ox, float oy, float oz, float dx, float dy, float dz)
float getPartOriginY(int index) const
void setSnapTranslate(float x, float y, float z)
std::string getActiveAxis() const
float getPartLength(int index) const
void setPosition(float x, float y, float z)
float getPartColorA(int index) const
bool updateDrag(float ox, float oy, float oz, float dx, float dy, float dz)
float getPartOriginX(int index) const
void setRotationEuler(float x, float y, float z)
Euler radians, XYZ order.
void setMode(const std::string &mode)
std::string getSpace() const
void setScale(float x, float y, float z)
std::string getPartAxis(int index) const
float getPartOriginZ(int index) const
void setSpace(const std::string &space)
virtual bool updateMeshVertices(Mesh *mesh, const float *posXYZ, const float *nrmXYZ, const float *uvST, int vertexCount, const uint32_t *indices, int indexCount)=0
In-place update of a mesh's vertex/index data (CPU -> host-visible VBO). Mirrors bakeMeshMorph: the u...
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:18
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:19
float height(int x, int y) const
Definition Heightmap.cpp:28