载入中...
搜索中...
未找到
MeshModifierGraphScript.cpp
浏览该文件的文档.
2
5#include "image/ImageData.h"
11
12#include <simplesquirrel/simplesquirrel.hpp>
13
14#include <functional>
15#include <memory>
16
17namespace eve::procgen {
18
19void exposeMeshModifierGraph(ssq::Table& table) {
20 auto dynamicPaint = table.addClass<DynamicMeshUvPaintSession>(
21 "ProcgenDynamicMeshUvPaintSession",
22 std::function<DynamicMeshUvPaintSession*()>([]() -> DynamicMeshUvPaintSession* { return nullptr; }), true);
23 dynamicPaint.addFunc("initialize", [vm = dynamicPaint.getHandle()](DynamicMeshUvPaintSession* self,
25 if (!mesh || !pixels)
26 return eve::script::projectResult(vm, Result<void>::failure(Diagnostic::error(
27 DiagnosticCode::InvalidArgument, "initialize requires mesh and ImageData", "input", {},
28 "procgen.dynamicMeshUvPaint.script")));
30 });
31 dynamicPaint.addFunc("updateMesh", [vm = dynamicPaint.getHandle()](DynamicMeshUvPaintSession* self,
32 MeshBuild* mesh) {
33 if (!mesh)
35 DiagnosticCode::InvalidArgument, "updateMesh requires a mesh", "mesh", {},
36 "procgen.dynamicMeshUvPaint.script")));
37 return eve::script::projectResult(vm, self->updateMeshResult(*mesh));
38 });
39 dynamicPaint.addFunc("paintSurfacePoint",
40 [vm = dynamicPaint.getHandle()](DynamicMeshUvPaintSession* self, int triangle, float x,
41 float y, float z, float radius, float r, float g, float b,
42 float a, bool wrapU, bool wrapV) {
43 return eve::script::projectResult(vm, self->paintSurfacePointResult(triangle, x, y, z, radius, r, g, b, a,
44 wrapU, wrapV));
45 });
46 dynamicPaint.addFunc("undo", [vm = dynamicPaint.getHandle()](DynamicMeshUvPaintSession* self) {
47 return eve::script::projectResult(vm, self->undoResult());
48 });
49 dynamicPaint.addFunc("currentImageResult", [vm = dynamicPaint.getHandle()](DynamicMeshUvPaintSession* self) {
50 auto result = self->currentImageResult();
51 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
52 auto instance = eve::script::makeOwnedSquirrelInstance<image::ImageData>(vm, std::move(result).takeValue());
53 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
54 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
55 });
56 dynamicPaint.addFunc("getMeshRevision", [](DynamicMeshUvPaintSession* self) { return self->meshRevision(); });
57 dynamicPaint.addFunc("getPaintRevision", [](DynamicMeshUvPaintSession* self) { return self->paintRevision(); });
58 auto sample = table.addClass<SplineSample>("ProcgenSplineSample", ssq::Class::Ctor<SplineSample()>());
59 sample.addFunc("getX", [](SplineSample* self) { return self->x; });
60 sample.addFunc("getY", [](SplineSample* self) { return self->y; });
61 sample.addFunc("getZ", [](SplineSample* self) { return self->z; });
62 sample.addFunc("getTangentX", [](SplineSample* self) { return self->tangentX; });
63 sample.addFunc("getTangentY", [](SplineSample* self) { return self->tangentY; });
64 sample.addFunc("getTangentZ", [](SplineSample* self) { return self->tangentZ; });
65 sample.addFunc("getNormalizedDistance", [](SplineSample* self) { return self->normalizedDistance; });
66 sample.addFunc("getRollDegrees", [](SplineSample* self) { return self->rollDegrees; });
67 sample.addFunc("getScaleX", [](SplineSample* self) { return self->scaleX; });
68 sample.addFunc("getScaleY", [](SplineSample* self) { return self->scaleY; });
69 sample.addFunc("getChunkIndex", [](SplineSample* self) { return self->chunkIndex; });
70 sample.addFunc("getPitchDegrees", [](SplineSample* self) { return self->pitchDegrees; });
71 sample.addFunc("getYawDegrees", [](SplineSample* self) { return self->yawDegrees; });
72
73 auto frame = table.addClass<SplineFrameSample>("ProcgenSplineFrameSample", ssq::Class::Ctor<SplineFrameSample()>());
74 frame.addFunc("getX", [](SplineFrameSample* self) { return self->sample.x; });
75 frame.addFunc("getY", [](SplineFrameSample* self) { return self->sample.y; });
76 frame.addFunc("getZ", [](SplineFrameSample* self) { return self->sample.z; });
77 frame.addFunc("getTangentX", [](SplineFrameSample* self) { return self->sample.tangentX; });
78 frame.addFunc("getTangentY", [](SplineFrameSample* self) { return self->sample.tangentY; });
79 frame.addFunc("getTangentZ", [](SplineFrameSample* self) { return self->sample.tangentZ; });
80 frame.addFunc("getSideX", [](SplineFrameSample* self) { return self->sideX; });
81 frame.addFunc("getSideY", [](SplineFrameSample* self) { return self->sideY; });
82 frame.addFunc("getSideZ", [](SplineFrameSample* self) { return self->sideZ; });
83 frame.addFunc("getUpX", [](SplineFrameSample* self) { return self->upX; });
84 frame.addFunc("getUpY", [](SplineFrameSample* self) { return self->upY; });
85 frame.addFunc("getUpZ", [](SplineFrameSample* self) { return self->upZ; });
86 frame.addFunc("getForwardX", [](SplineFrameSample* self) { return self->forwardX; });
87 frame.addFunc("getForwardY", [](SplineFrameSample* self) { return self->forwardY; });
88 frame.addFunc("getForwardZ", [](SplineFrameSample* self) { return self->forwardZ; });
89 frame.addFunc("getNormalizedDistance", [](SplineFrameSample* self) { return self->sample.normalizedDistance; });
90 frame.addFunc("getRollDegrees", [](SplineFrameSample* self) { return self->sample.rollDegrees; });
91 frame.addFunc("getScaleX", [](SplineFrameSample* self) { return self->sample.scaleX; });
92 frame.addFunc("getScaleY", [](SplineFrameSample* self) { return self->sample.scaleY; });
93
94 auto distribution = table.addClass<SplineDistribution>(
95 "ProcgenSplineDistribution",
96 std::function<SplineDistribution*()>([]() -> SplineDistribution* { return nullptr; }), true);
97 distribution.addFunc("getCount", [](SplineDistribution* self) { return self->count(); });
98 distribution.addFunc("getSampleResult", [vm = distribution.getHandle()](SplineDistribution* self, int index) {
99 auto result = self->sampleResult(index);
100 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
101 auto instance = eve::script::makeOwnedSquirrelInstance<SplineSample>(
102 vm, std::make_unique<SplineSample>(std::move(result).takeValue()));
103 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
104 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
105 });
106 distribution.addFunc("getFrameResult", [vm = distribution.getHandle()](SplineDistribution* self, int index) {
107 auto result = self->frameResult(index);
108 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
109 auto instance = eve::script::makeOwnedSquirrelInstance<SplineFrameSample>(
110 vm, std::make_unique<SplineFrameSample>(std::move(result).takeValue()));
111 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
112 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
113 });
114
115 auto polyline = table.addClass<SplinePolyline>(
116 "ProcgenSplinePolyline", std::function<SplinePolyline*()>([]() -> SplinePolyline* { return nullptr; }), true);
117 polyline.addFunc("getCount", [](SplinePolyline* self) { return self->count(); });
118 polyline.addFunc("isClosed", [](SplinePolyline* self) { return self->isClosed(); });
119 polyline.addFunc("getChunkCount", [](SplinePolyline* self) { return self->chunkCount(); });
120 polyline.addFunc("getChunkPointCount",
121 [](SplinePolyline* self, int chunk) { return self->chunkPointCount(chunk); });
122 polyline.addFunc("getPointResult", [vm = polyline.getHandle()](SplinePolyline* self, int index) {
123 auto result = self->pointResult(index);
124 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
125 auto instance = eve::script::makeOwnedSquirrelInstance<SplineSample>(
126 vm, std::make_unique<SplineSample>(std::move(result).takeValue()));
127 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
128 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
129 });
130 polyline.addFunc("getChunkPointResult", [vm = polyline.getHandle()](SplinePolyline* self, int chunk, int index) {
131 auto result = self->chunkPointResult(chunk, index);
132 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
133 auto instance = eve::script::makeOwnedSquirrelInstance<SplineSample>(
134 vm, std::make_unique<SplineSample>(std::move(result).takeValue()));
135 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
136 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
137 });
138
139 auto spline = table.addClass<SplinePath>(
140 "ProcgenSplinePath", std::function<SplinePath*()>([]() -> SplinePath* { return nullptr; }), true);
141 const auto projectSplineVoid = [vm = spline.getHandle()](Result<void> result) {
142 return eve::script::projectResult(vm, std::move(result));
143 };
144 const auto projectSample = [vm = spline.getHandle()](Result<SplineSample> result) {
145 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
146 auto instance = eve::script::makeOwnedSquirrelInstance<SplineSample>(
147 vm, std::make_unique<SplineSample>(std::move(result).takeValue()));
148 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
149 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
150 };
151 spline.addFunc("setKind", [projectSplineVoid](SplinePath* self, const std::string& kind) mutable {
152 return projectSplineVoid(self->setKindResult(kind));
153 });
154 spline.addFunc("setClosed", [](SplinePath* self, bool closed) { self->setClosed(closed); });
155 spline.addFunc("addPoint", [projectSplineVoid](SplinePath* self, float x, float y, float z, float inX, float inY,
156 float inZ, float outX, float outY, float outZ) mutable {
157 return projectSplineVoid(self->addPointResult({x, y, z, inX, inY, inZ, outX, outY, outZ}));
158 });
159 spline.addFunc("setPoint", [projectSplineVoid](SplinePath* self, int index, float x, float y, float z, float inX,
160 float inY, float inZ, float outX, float outY, float outZ) mutable {
161 return projectSplineVoid(self->setPointResult(index, {x, y, z, inX, inY, inZ, outX, outY, outZ}));
162 });
163 spline.addFunc("setPointProfile", [projectSplineVoid](SplinePath* self, int index, float rollDegrees, float scaleX,
164 float scaleY) mutable {
165 return projectSplineVoid(self->setPointProfileResult(index, rollDegrees, scaleX, scaleY));
166 });
167 spline.addFunc("setPointChunkBreak", [projectSplineVoid](SplinePath* self, int index, bool disconnected) mutable {
168 return projectSplineVoid(self->setPointChunkBreakResult(index, disconnected));
169 });
170 spline.addFunc("setPointRotation", [projectSplineVoid](SplinePath* self, int index, float pitchDegrees,
171 float yawDegrees, float rollDegrees) mutable {
172 return projectSplineVoid(self->setPointRotationResult(index, pitchDegrees, yawDegrees, rollDegrees));
173 });
174 spline.addFunc("removePoint", [projectSplineVoid](SplinePath* self, int index) mutable {
175 return projectSplineVoid(self->removePointResult(index));
176 });
177 spline.addFunc("clear", [](SplinePath* self) { self->clear(); });
178 spline.addFunc("evaluateResult", [projectSample](SplinePath* self, float t) mutable {
179 return projectSample(self->evaluateResult(t));
180 });
181 spline.addFunc("evaluateDistanceResult",
182 [projectSample](SplinePath* self, float distance, int samplesPerSegment) mutable {
183 return projectSample(self->evaluateDistanceResult(distance, samplesPerSegment));
184 });
185 spline.addFunc("closestPointResult",
186 [projectSample](SplinePath* self, float x, float y, float z, int samplesPerSegment) mutable {
187 return projectSample(self->closestPointResult(x, y, z, samplesPerSegment));
188 });
189 spline.addFunc("travelResult", [projectSample](SplinePath* self, float distance, const std::string& wrapMode,
190 int samplesPerSegment) mutable {
191 return projectSample(self->travelResult(distance, wrapMode, samplesPerSegment));
192 });
193 spline.addFunc("travelFrameResult", [vm = spline.getHandle()](SplinePath* self, float distance,
194 const std::string& wrapMode, int samplesPerSegment) {
195 auto result = self->travelFrameResult(distance, wrapMode, samplesPerSegment);
196 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
197 auto instance = eve::script::makeOwnedSquirrelInstance<SplineFrameSample>(
198 vm, std::make_unique<SplineFrameSample>(std::move(result).takeValue()));
199 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
200 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
201 });
202 spline.addFunc("distributeResult",
203 [vm = spline.getHandle()](SplinePath* self, int count, bool includeEnd, int samplesPerSegment) {
204 auto result = self->distributeResult(count, includeEnd, samplesPerSegment);
205 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
206 auto instance = eve::script::makeOwnedSquirrelInstance<SplineDistribution>(
207 vm, std::make_unique<SplineDistribution>(std::move(result).takeValue()));
208 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
209 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
210 });
211 spline.addFunc("polylineResult", [vm = spline.getHandle()](SplinePath* self, int sampleCount,
212 bool uniformByDistance, int samplesPerSegment) {
213 auto result = self->polylineResult(sampleCount, uniformByDistance, samplesPerSegment);
214 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
215 auto instance = eve::script::makeOwnedSquirrelInstance<SplinePolyline>(
216 vm, std::make_unique<SplinePolyline>(std::move(result).takeValue()));
217 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
218 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
219 });
220 spline.addFunc("applyShapePreset", [projectSplineVoid](SplinePath* self, const std::string& preset, int pointCount,
221 float radius, float height, float turns) mutable {
222 return projectSplineVoid(self->applyShapePresetResult(preset, pointCount, radius, height, turns));
223 });
224 spline.addFunc("lengthResult", [vm = spline.getHandle()](SplinePath* self, int samplesPerSegment) {
225 auto result = self->lengthResult(samplesPerSegment);
226 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
227 return eve::script::projectStatusResult(vm, Status::success(), result.value());
228 });
229 spline.addFunc("getPointCount", [](SplinePath* self) { return self->pointCount(); });
230 spline.addFunc("getSegmentCount", [](SplinePath* self) { return self->segmentCount(); });
231 spline.addFunc("getChunkCount", [](SplinePath* self) { return self->chunkCount(); });
232 spline.addFunc("getKind", [](SplinePath* self) { return std::string(self->kind()); });
233 spline.addFunc("isClosed", [](SplinePath* self) { return self->isClosed(); });
234 spline.addFunc("getRevision", [](SplinePath* self) { return self->revision(); });
235
236 auto stroke = table.addClass<GeometryStroke>("ProcgenGeometryStroke", ssq::Class::Ctor<GeometryStroke()>());
237 const auto projectStrokeVoid = [vm = stroke.getHandle()](Result<void> result) {
238 return eve::script::projectResult(vm, std::move(result));
239 };
240 stroke.addFunc("setShape", [projectStrokeVoid](GeometryStroke* self, const std::string& shape) mutable {
241 return projectStrokeVoid(self->setShapeResult(shape));
242 });
243 stroke.addFunc("setInputSpace", [projectStrokeVoid](GeometryStroke* self, const std::string& inputSpace,
244 float planeY) mutable {
245 return projectStrokeVoid(self->setInputSpaceResult(inputSpace, planeY));
246 });
247 stroke.addFunc("setSize", [projectStrokeVoid](GeometryStroke* self, float width, float depth) mutable {
248 return projectStrokeVoid(self->setSizeResult(width, depth));
249 });
250 stroke.addFunc("setMinimumSpacing", [projectStrokeVoid](GeometryStroke* self, float spacing) mutable {
251 return projectStrokeVoid(self->setMinimumSpacingResult(spacing));
252 });
253 stroke.addFunc("addPoint", [vm = stroke.getHandle()](GeometryStroke* self, float x, float y, float z) {
254 auto result = self->addPointResult(x, y, z);
255 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
256 return eve::script::projectStatusResult(vm, Status::success(), result.value());
257 });
258 stroke.addFunc("undo", [projectStrokeVoid](GeometryStroke* self) mutable {
259 return projectStrokeVoid(self->undoResult());
260 });
261 stroke.addFunc("clear", [](GeometryStroke* self) { self->clear(); });
262 stroke.addFunc("buildMeshResult", [vm = stroke.getHandle()](GeometryStroke* self) {
263 auto result = self->buildMeshResult();
264 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
265 auto instance = eve::script::makeOwnedSquirrelInstance<MeshBuild>(
266 vm, std::make_unique<MeshBuild>(std::move(result).takeValue()));
267 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
268 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
269 });
270 stroke.addFunc("getPointCount", [](GeometryStroke* self) { return self->pointCount(); });
271 stroke.addFunc("getShape", [](GeometryStroke* self) { return std::string(self->shape()); });
272 stroke.addFunc("getInputSpace", [](GeometryStroke* self) { return std::string(self->inputSpace()); });
273 stroke.addFunc("getRevision", [](GeometryStroke* self) { return self->revision(); });
274
275 auto session = table.addClass<MeshDeformationSession>(
276 "ProcgenMeshDeformationSession",
277 std::function<MeshDeformationSession*()>([]() -> MeshDeformationSession* { return nullptr; }), true);
278 const auto projectSessionVoid = [vm = session.getHandle()](Result<void> result) {
279 return eve::script::projectResult(vm, std::move(result));
280 };
281 session.addFunc("initialize", [projectSessionVoid](MeshDeformationSession* self, MeshBuild* mesh) mutable {
282 if (!mesh)
283 return projectSessionVoid(
285 "mesh", {}, "procgen.meshDeformationSession.script")));
286 return projectSessionVoid(self->initializeResult(*mesh));
287 });
288 session.addFunc("applyBrush",
289 [projectSessionVoid](MeshDeformationSession* self, const std::string& mode, float x, float y,
290 float z, float radius, float strength, float falloff) mutable {
291 return projectSessionVoid(self->applyBrushResult(mode, x, y, z, radius, strength, falloff));
292 });
293 session.addFunc("applyBrushGpu",
294 [projectSessionVoid](MeshDeformationSession* self, const std::string& mode, float x, float y,
295 float z, float radius, float strength, float falloff) mutable {
296 return projectSessionVoid(self->applyBrushGpuResult(mode, x, y, z, radius, strength, falloff));
297 });
298 session.addFunc(
299 "applyDirectionalBrush",
300 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z, float radius, float strength,
301 float falloff, float directionX, float directionY, float directionZ) mutable {
302 return projectSessionVoid(self->applyBrushResult("directional", x, y, z, radius, strength, falloff,
303 directionX, directionY, directionZ));
304 });
305 session.addFunc("applyImpact",
306 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z, float impulseX,
307 float impulseY, float impulseZ, float radius, float plasticity, float hardness,
308 float maxDisplacement) mutable {
309 return projectSessionVoid(self->applyImpactResult(x, y, z, impulseX, impulseY, impulseZ, radius,
310 plasticity, hardness, maxDisplacement));
311 });
312 session.addFunc("applyImpactGpu",
313 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z, float impulseX,
314 float impulseY, float impulseZ, float radius, float plasticity, float hardness,
315 float maxDisplacement) mutable {
316 return projectSessionVoid(self->applyImpactGpuResult(x, y, z, impulseX, impulseY, impulseZ,
317 radius, plasticity, hardness,
318 maxDisplacement));
319 });
320 session.addFunc("prepareImpactVertexBlocks",
321 [projectSessionVoid](MeshDeformationSession* self, int divisionsPerAxis) mutable {
322 return projectSessionVoid(self->prepareImpactVertexBlocksResult(divisionsPerAxis));
323 });
324 session.addFunc("getImpactVertexBlockCount",
325 [](MeshDeformationSession* self) { return self->impactVertexBlockCount(); });
326 session.addFunc("hasImpactVertexBlocks",
327 [](MeshDeformationSession* self) { return self->hasImpactVertexBlocks(); });
328 session.addFunc(
329 "applySurfaceContact",
330 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z, float normalX, float normalY,
331 float normalZ, float velocityX, float velocityY, float velocityZ, float radius,
332 float depth, float drag, float falloff, float plasticity) mutable {
333 return projectSessionVoid(self->applySurfaceContactResult(x, y, z, normalX, normalY, normalZ, velocityX,
334 velocityY, velocityZ, radius, depth, drag,
335 falloff, plasticity));
336 });
337 session.addFunc("recoverSurface",
338 [projectSessionVoid](MeshDeformationSession* self, float dt, float recoveryRate) mutable {
339 return projectSessionVoid(self->recoverSurfaceResult(dt, recoveryRate));
340 });
341 session.addFunc("applySlimeImpulse",
342 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z, float impulseX,
343 float impulseY, float impulseZ, float radius, float falloff) mutable {
344 return projectSessionVoid(
345 self->applySlimeImpulseResult(x, y, z, impulseX, impulseY, impulseZ, radius, falloff));
346 });
347 session.addFunc("stepSlime", [projectSessionVoid](MeshDeformationSession* self, float dt, float stiffness,
348 float damping, float maxSpeed) mutable {
349 return projectSessionVoid(self->stepSlimeResult(dt, stiffness, damping, maxSpeed));
350 });
351 session.addFunc(
352 "configureColliderRefresh",
353 [projectSessionVoid](MeshDeformationSession* self, const std::string& mode, float interval, float offsetX,
354 float offsetY, float offsetZ) mutable {
355 return projectSessionVoid(self->configureColliderRefreshResult(mode, interval, offsetX, offsetY, offsetZ));
356 });
357 session.addFunc("requestColliderRefresh", [projectSessionVoid](MeshDeformationSession* self) mutable {
358 return projectSessionVoid(self->requestColliderRefreshResult());
359 });
360 session.addFunc("updateColliderRefresh", [vm = session.getHandle()](MeshDeformationSession* self, float dt) {
361 return eve::script::projectResult(vm, self->updateColliderRefreshResult(dt),
362 [](bool value) { return eve::Value(value); });
363 });
364 session.addFunc("colliderMeshResult", [vm = session.getHandle()](MeshDeformationSession* self) {
365 auto result = self->colliderMeshResult();
366 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
367 auto instance = eve::script::makeOwnedSquirrelInstance<MeshBuild>(
368 vm, std::make_unique<MeshBuild>(std::move(result).takeValue()));
369 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
370 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
371 });
372 session.addFunc("selectVerticesSphere", [vm = session.getHandle()](MeshDeformationSession* self, float x, float y,
373 float z, float radius, bool replace) {
374 return eve::script::projectResult(vm, self->selectVerticesSphereResult(x, y, z, radius, replace),
375 [](int value) { return eve::Value(value); });
376 });
377 session.addFunc("selectVerticesBox", [vm = session.getHandle()](MeshDeformationSession* self, float minX,
378 float minY, float minZ, float maxX, float maxY,
379 float maxZ, bool replace) {
381 self->selectVerticesBoxResult(minX, minY, minZ, maxX, maxY, maxZ, replace),
382 [](int value) { return eve::Value(value); });
383 });
384 session.addFunc("clearVertexSelection", [](MeshDeformationSession* self) { self->clearVertexSelection(); });
385 session.addFunc("getSelectedVertexCount", [](MeshDeformationSession* self) { return self->selectedVertexCount(); });
386 session.addFunc("moveSelectedVertices",
387 [projectSessionVoid](MeshDeformationSession* self, float x, float y, float z) mutable {
388 return projectSessionVoid(self->moveSelectedVerticesResult(x, y, z));
389 });
390 session.addFunc("manipulateSelectedVertices",
391 [projectSessionVoid](MeshDeformationSession* self, const std::string& mode, float originX,
392 float originY, float originZ, float directionX, float directionY,
393 float directionZ, float distance) mutable {
394 return projectSessionVoid(self->manipulateSelectedVerticesResult(
395 mode, originX, originY, originZ, directionX, directionY, directionZ, distance));
396 });
397 session.addFunc("restore", [projectSessionVoid](MeshDeformationSession* self) mutable {
398 return projectSessionVoid(self->restoreResult());
399 });
400 session.addFunc("bake", [projectSessionVoid](MeshDeformationSession* self) mutable {
401 return projectSessionVoid(self->bakeResult());
402 });
403 session.addFunc("undo", [projectSessionVoid](MeshDeformationSession* self) mutable {
404 return projectSessionVoid(self->undoResult());
405 });
406 session.addFunc("currentMeshResult", [vm = session.getHandle()](MeshDeformationSession* self) {
407 auto result = self->currentMeshResult();
408 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
409 auto instance = eve::script::makeOwnedSquirrelInstance<MeshBuild>(
410 vm, std::make_unique<MeshBuild>(std::move(result).takeValue()));
411 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
412 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
413 });
414 session.addFunc("getRevision", [](MeshDeformationSession* self) { return self->revision(); });
415 session.addFunc("getUndoCount", [](MeshDeformationSession* self) { return self->undoCount(); });
416 session.addFunc("isInitialized", [](MeshDeformationSession* self) { return self->isInitialized(); });
417
418 auto graph = table.addClass<MeshModifierGraph>(
419 "ProcgenMeshModifierGraph", std::function<MeshModifierGraph*()>([]() -> MeshModifierGraph* { return nullptr; }),
420 true);
421 const auto projectVoid = [vm = graph.getHandle()](Result<void> result) {
422 return eve::script::projectResult(vm, std::move(result));
423 };
424 graph.addFunc("addNode",
425 [projectVoid](MeshModifierGraph* self, const std::string& id, const std::string& operation) mutable {
426 return projectVoid(self->addNode(id, operation));
427 });
428 graph.addFunc("removeNode", [projectVoid](MeshModifierGraph* self, const std::string& id) mutable {
429 return projectVoid(self->removeNode(id));
430 });
431 graph.addFunc("connect", [projectVoid](MeshModifierGraph* self, const std::string& from, const std::string& to,
432 int input) mutable { return projectVoid(self->connect(from, to, input)); });
433 graph.addFunc("disconnect", [projectVoid](MeshModifierGraph* self, const std::string& to, int input) mutable {
434 return projectVoid(self->disconnect(to, input));
435 });
436 graph.addFunc(
437 "setNodeMesh", [projectVoid](MeshModifierGraph* self, const std::string& id, MeshBuild* mesh) mutable {
438 if (!mesh)
440 "setNodeMesh requires a mesh", "mesh", {},
441 "procgen.meshModifierGraph.script")));
442 return projectVoid(self->setNodeMesh(id, *mesh));
443 });
444 graph.addFunc(
445 "setNodeSplinePath", [projectVoid](MeshModifierGraph* self, const std::string& id, SplinePath* path) mutable {
446 if (!path)
448 "setNodeSplinePath requires a path", "path",
449 {}, "procgen.meshModifierGraph.script")));
450 return projectVoid(self->setNodeSplinePath(id, *path));
451 });
452 graph.addFunc("setNodeSplineProfile", [projectVoid](MeshModifierGraph* self, const std::string& id,
453 ssq::Array coordinates, bool closed) mutable {
454 if (coordinates.size() % 2u != 0u)
455 return projectVoid(Result<void>::failure(
456 Diagnostic::error(DiagnosticCode::InvalidArgument, "profile coordinates require x/y pairs",
457 "coordinates", {}, "procgen.meshModifierGraph.script")));
458 SplineProfile profile;
459 profile.closed = closed;
460 profile.points.reserve(coordinates.size() / 2u);
461 for (std::size_t i = 0; i < coordinates.size(); i += 2u)
462 profile.points.push_back({coordinates.get<float>(i), coordinates.get<float>(i + 1u)});
463 return projectVoid(self->setNodeSplineProfile(id, profile));
464 });
465 graph.addFunc("setNodeFloat",
466 [projectVoid](MeshModifierGraph* self, const std::string& id, const std::string& key,
467 float value) mutable { return projectVoid(self->setNodeFloat(id, key, value)); });
468 graph.addFunc("setNodeInt",
469 [projectVoid](MeshModifierGraph* self, const std::string& id, const std::string& key,
470 int value) mutable { return projectVoid(self->setNodeInt(id, key, value)); });
471 graph.addFunc("setNodeString", [projectVoid](MeshModifierGraph* self, const std::string& id, const std::string& key,
472 const std::string& value) mutable {
473 return projectVoid(self->setNodeString(id, key, value));
474 });
475 graph.addFunc("validateResult", [vm = graph.getHandle()](MeshModifierGraph* self) {
476 return eve::script::projectResult(vm, self->validateResult());
477 });
478 graph.addFunc("executeResult", [vm = graph.getHandle()](MeshModifierGraph* self, const std::string& output) {
479 auto result = self->executeResult(output);
480 if (!result.ok()) return eve::script::projectStatusResult(vm, result.status());
481 auto instance = eve::script::makeOwnedSquirrelInstance<MeshBuild>(
482 vm, std::make_unique<MeshBuild>(std::move(result).takeValue()));
483 if (!instance.ok()) return eve::script::projectStatusResult(vm, instance.status());
484 return eve::script::projectStatusResult(vm, Status::success(), std::move(instance).takeValue());
485 });
486 graph.addFunc("clearCache", [](MeshModifierGraph* self) { self->clearCache(); });
487 graph.addFunc("getRevision", [](MeshModifierGraph* self) { return self->revision(); });
488 graph.addFunc("getExecutionPlanBuildCount",
489 [](MeshModifierGraph* self) { return self->executionPlanBuildCount(); });
490 graph.addFunc("getCompiledSegmentCount", [](MeshModifierGraph* self) { return self->compiledSegmentCount(); });
491 graph.addFunc("getFusedOperationCount", [](MeshModifierGraph* self) { return self->fusedOperationCount(); });
492 graph.addFunc("hasNode", [](MeshModifierGraph* self, const std::string& id) { return self->hasNode(id); });
493 graph.addFunc("getNodeCount", [](MeshModifierGraph* self) { return self->nodeCount(); });
494 graph.addFunc("getNodeId", [](MeshModifierGraph* self, int index) { return self->nodeId(index); });
495 graph.addFunc("getNodeOperation",
496 [](MeshModifierGraph* self, const std::string& id) { return self->nodeOperation(id); });
497 graph.addFunc("getOperationCount", [](MeshModifierGraph*) { return MeshModifierGraph::operationCount(); });
498 graph.addFunc("getOperationId",
499 [](MeshModifierGraph*, int index) { return MeshModifierGraph::operationId(index); });
500 graph.addFunc("getOperationInputCount", [](MeshModifierGraph*, const std::string& operation) {
502 });
503 graph.addFunc("getOperationParamCount", [](MeshModifierGraph*, const std::string& operation) {
505 });
506 graph.addFunc("getOperationParamKey", [](MeshModifierGraph*, const std::string& operation, int index) {
508 });
509 graph.addFunc("getOperationParamKind", [](MeshModifierGraph*, const std::string& operation, int index) {
511 });
512 graph.addFunc("getOperationParamDefault", [](MeshModifierGraph*, const std::string& operation, int index) {
514 });
515}
516
517} // namespace eve::procgen
ActionParameterOperation operation
double value
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
std::string output
std::string from
HSQUIRRELVM vm
Definition ECS.cpp:20
EvpackChunkInput input
Definition Evpack.cpp:170
int triangle
tensor::Graph g
Definition GpuGraph.cpp:7
std::uint32_t key
ShaderImageInput shape
float u
Definition Grass.cpp:233
double r
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
std::uint32_t height
std::uint32_t width
TokenKind kind
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
float distance
std::map< std::string, std::vector< std::string > > graph
Definition Package.cpp:59
float radius
std::string path
Definition PlayHost.cpp:110
float t
uint8_t * pixels
Mesh * mesh
SplinePath spline
std::uint32_t count
The single Squirrel projection for common Result, Status and Value.
Explicit Value/Owned/Borrowed semantics at the Squirrel boundary.
std::optional< InteractionSession > session
Definition Tactics.cpp:39
int spacing
float offsetX
float offsetY
uint32_t index
std::uint32_t depth
int turns
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Represents raw pixel data.
Definition ImageData.h:38
Integrates dynamic-mesh hit mapping with the canonical image UV-paint session.
Result< void > initializeResult(const MeshBuild &mesh, const image::ImageData &image)
Initialize owning mesh and RGBA8 image snapshots atomically.
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
static std::string operationParamDefault(std::string_view operation, int index)
Return encoded reflected parameter default.
static int operationParamCount(std::string_view operation)
Return reflected parameter count.
static std::string operationParamKind(std::string_view operation, int index)
Return reflected parameter kind: float, int, or string.
static std::string operationParamKey(std::string_view operation, int index)
Return reflected parameter key.
static int operationInputCount(std::string_view operation)
Return required mesh input count, or -1 for an unknown operation.
static int operationCount()
Return reflected operation count.
static std::string operationId(int index)
Return reflected operation id, or an empty string for an invalid index.
double sample(const Heightmap &map, double u, double v)
Sample.
void exposeMeshModifierGraph(ssq::Table &table)
Register MeshModifierGraph script types on the Procgen module table.
std::unordered_map< std::string, SkillDefinition > & table()
Definition Skill.cpp:65
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.