载入中...
搜索中...
未找到
ActionTimelineScriptBindings.cpp
浏览该文件的文档.
47ssq::Table bindingFailure(HSQUIRRELVM vm, DiagnosticCode code, std::string message, std::string path = {}) {
48 return ::eve::editor::bindingFailure(vm, kBindingSource, code, std::move(message), std::move(path));
62const action::ActionAnimationSection* sectionAt(const action::ActionTimeline& timeline, int index) {
63 if (index < 0 || static_cast<std::size_t>(index) >= timeline.animationSections.size()) return nullptr;
72const action::ActionNotifyState* findState(const action::ActionTimeline& timeline, const std::string& itemId) {
81const action::ActionNotify* findNotify(const action::ActionTimeline& timeline, const std::string& itemId) {
90const action::ActionAnimationSection* findSection(const action::ActionTimeline& timeline, const std::string& itemId) {
91 const auto found = std::find_if(timeline.animationSections.begin(), timeline.animationSections.end(),
115 diagnostics.insert(diagnostics.end(), stored.diagnostics().begin(), stored.diagnostics().end());
120 diagnostics.insert(diagnostics.end(), timeline.diagnostics().begin(), timeline.diagnostics().end());
130 if (guid.empty() || !uri.starts_with("content://") || uri.size() <= std::string("content://").size())
155 return std::filesystem::path(entry->logicalUri.substr(std::string("content://").size())).stem().string();
186void accumulateRootMotion(animation::TransformTRS& total, const animation::TransformTRS& delta) {
202 void add(std::unique_ptr<action::IActionPreviewSink> sink) { sinks_.push_back(std::move(sink)); }
257 auto interrupted = blockRuntime_.interrupt(runtimeContext(montage ? montage->time() : Duration::zero()));
282 return !snapshot.ok() || snapshot.value().dirty() || editor_.target().revision() != savedEditorRevision_;
469 Diagnostic::error(DiagnosticCode::InvalidArgument, "montage clip URI must not be empty", "uri"));
470 if (animationIndex < 0 || animationIndex >= animation::AnimImporter::getAnimationCountFromModel(&model))
489 [[nodiscard]] Result<void> replaceRuntimeClip(std::string uri, const animation::AnimClip& clip) {
492 Diagnostic::error(DiagnosticCode::InvalidArgument, "montage clip URI must not be empty", "uri"));
523 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
534 return Result<animation::MontageAdvance>::success(std::move(paused), Status::success(StatusCode::NoOp));
550 Duration::fromNanoseconds(runtimeTimeline_->duration.nanoseconds() - montage->time().nanoseconds());
558 runtimeTimeline_->montage.looping ? std::min(remainingDelta, remainingTimeline) : remainingDelta;
599 return Result<animation::MontageAdvance>::success(std::move(combined), Status::success(StatusCode::Pending));
602 [[nodiscard]] Result<void> setRuntimeBlockExternallyHandled(const std::string& type, bool external) {
623 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
641 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
647 [[nodiscard]] Result<animation::MontageAdvance> evaluateRuntimeSectionProgress(std::size_t index,
651 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
666 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
673 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
694 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
697 return Result<void>::success(Status::success(sectionRates_.erase(index) > 0 ? StatusCode::Applied
704 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
711 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
718 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
731 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
745 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
758 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
832 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
840 Diagnostic::error(DiagnosticCode::Conflict, "montage runtime has not been started", "runtime"));
853 auto resolved = static_cast<const animation::MontageCoordinator&>(*coordinator_).resolve(montageHandle_);
873 auto edited = documents_->edit(document_.id, editor_.target().snapshotValue(), snapshot.value().revision.edit);
886 definition.timing.active = Duration::fromNanoseconds(runtimeTimeline_->splitTimestamps[1].nanoseconds() -
888 definition.timing.recover = Duration::fromNanoseconds(runtimeTimeline_->duration.nanoseconds() -
903 auto interrupted = blockRuntime_.interrupt(runtimeContext(montage ? montage->time() : Duration::zero()));
915 Diagnostic::error(DiagnosticCode::Conflict, "montage coordinator has not been started", "runtime"));
918 auto played = coordinator_->play(layer, *runtimeTimeline_, cloneRuntimeClips(), submitted.value(), tick_);
984std::optional<Value> itemPayloadField(ScriptActionTimelineEditor* self, const std::string& itemId,
1027 std::function<ScriptActionTimelineEditor*()>([]() -> ScriptActionTimelineEditor* { return nullptr; }), true);
1034 assetCatalog.addFunc("refresh", [vm](ScriptActionTimelineAssetCatalog* self, const std::string& text) {
1035 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action asset catalog is null");
1046 [](ScriptActionTimelineAssetCatalog* self, int index) { return self ? self->guid(index) : ""; });
1048 [](ScriptActionTimelineAssetCatalog* self, int index) { return self ? self->uri(index) : ""; });
1052 assetCatalog.addFunc("registerDocument", [vm](ScriptActionTimelineAssetCatalog* self, const std::string& guid,
1054 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action asset catalog is null");
1058 actionEditor.addFunc("configureWorkspace", [vm](ScriptActionTimelineEditor* self, EditorWorkspace* workspace) {
1065 "setViewport", [vm](ScriptActionTimelineEditor* self, float width, float rowHeight, float labelWidth) {
1067 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1070 actionEditor.addFunc("addNotifyAtCursor", [vm](ScriptActionTimelineEditor* self, const std::string& trackId,
1072 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1080 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "notify payload must be a JSON object",
1084 actionEditor.addFunc("addStateAtCursor", [vm](ScriptActionTimelineEditor* self, const std::string& trackId,
1087 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1097 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "notify-state payload must be a JSON object",
1099 return project(vm, self->widget().addStateAtCursor(*parsedTrack, type, duration.value(), *payload));
1103 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1106 actionEditor.addFunc("addTrack", [vm](ScriptActionTimelineEditor* self, const std::string& trackId,
1108 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1111 if (!parsedId) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1119 actionEditor.addFunc("removeTrack", [vm](ScriptActionTimelineEditor* self, const std::string& trackId) {
1120 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1122 if (!parsed) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1126 "renameTrack", [vm](ScriptActionTimelineEditor* self, const std::string& trackId, const std::string& label) {
1127 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1129 if (!parsed) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1133 "setTrackMuted", [vm](ScriptActionTimelineEditor* self, const std::string& trackId, bool muted) {
1134 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1136 if (!parsed) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1140 "setTrackLocked", [vm](ScriptActionTimelineEditor* self, const std::string& trackId, bool locked) {
1141 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1143 if (!parsed) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1146 actionEditor.addFunc("copyTrack", [vm](ScriptActionTimelineEditor* self, const std::string& trackId) {
1147 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1149 if (!parsed) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "track id is invalid", "trackId");
1153 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1160 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1170 actionEditor.addFunc("setSnapSeconds", [vm](ScriptActionTimelineEditor* self, float intervalSeconds) {
1172 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1178 "setVisibleSeconds", [vm](ScriptActionTimelineEditor* self, float startSeconds, float endSeconds) {
1180 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1187 actionEditor.addFunc("zoomTimeline", [vm](ScriptActionTimelineEditor* self, float factor, float anchor) {
1189 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1192 actionEditor.addFunc("panTimelineSeconds", [vm](ScriptActionTimelineEditor* self, float deltaSeconds) {
1194 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1199 actionEditor.addFunc("pointerDown", [vm](ScriptActionTimelineEditor* self, float x, float y, bool additive) {
1201 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1206 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1211 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1216 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1221 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1226 actionEditor.addFunc("resizeState", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1229 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1236 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "state item id is not canonical", "itemId");
1238 vm, self->editor().resizeState(*parsedItemId, std::move(start).takeValue(), std::move(end).takeValue()));
1240 actionEditor.addFunc("setItemTiming", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1243 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1248 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is not canonical", "itemId");
1253 return project(vm, self->editor().resizeAnimationSection(*parsedItemId, start.value(), end.value(),
1256 return project(vm, self->editor().editItem(*parsedItemId, start.value(), end.value(), state->type,
1259 return project(vm, self->editor().editItem(*parsedItemId, start.value(), start.value(), notify->type,
1263 actionEditor.addFunc("removeItem", [vm](ScriptActionTimelineEditor* self, const std::string& itemId) {
1266 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is invalid", "itemId");
1269 actionEditor.addFunc("setItemEnabled", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1273 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is invalid", "itemId");
1276 actionEditor.addFunc("fitBlockToClip", [vm](ScriptActionTimelineEditor* self, const std::string& itemId) {
1278 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1281 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is invalid", "itemId");
1285 actionEditor.addFunc("fitClipToBlock", [vm](ScriptActionTimelineEditor* self, const std::string& itemId) {
1287 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1290 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is invalid", "itemId");
1297 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1300 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item id is invalid", "itemId");
1310 actionEditor.addFunc("editItemDetails", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1315 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item identity or type is invalid",
1321 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "timeline item payload must be a JSON object",
1327 return bindingFailure(vm, DiagnosticCode::NotFound, "editable notify item was not found", "itemId");
1330 const auto expected = state ? action::ActionNotifyShape::State : action::ActionNotifyShape::Instant;
1346 return bindingFailure(vm, DiagnosticCode::NotFound, "timeline item track was not found", "itemId");
1358 actionEditor.addFunc("addParameterKey", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1369 actionEditor.addFunc("editParameterKey", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
1387 return project(vm, self->editor().removeParameterKey(*parsedId, static_cast<std::size_t>(index)));
1391 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1393 return project(vm, result, Value(result.ok() ? static_cast<std::int64_t>(result.value().afterRevision) : 0));
1397 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1399 return project(vm, result, Value(result.ok() ? static_cast<std::int64_t>(result.value().afterRevision) : 0));
1403 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1407 return project(vm, result, Value(result.ok() ? static_cast<std::int64_t>(result.value()) : 0));
1411 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1419 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1434 "registerRuntimeClip", [vm](ScriptActionTimelineEditor* self, const std::string& uri, model3d::ModelData* model,
1439 return script::projectResult(vm, self->registerRuntimeClip(uri, *model, *skeleton, animationIndex));
1449 actionEditor.addFunc("beginRuntime", [vm](ScriptActionTimelineEditor* self, animation::AnimSkeleton* skeleton) {
1451 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "editor and skeleton must not be null",
1455 actionEditor.addFunc("advanceRuntime", [vm](ScriptActionTimelineEditor* self, float deltaSeconds) {
1457 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1460 return script::projectResult(vm, self->advanceRuntime(std::move(delta).takeValue()), montageAdvanceValue);
1462 actionEditor.addFunc("jumpRuntimeSeconds", [vm](ScriptActionTimelineEditor* self, float targetSeconds) {
1464 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1467 return script::projectResult(vm, self->jumpRuntime(std::move(target).takeValue()), montageAdvanceValue);
1469 actionEditor.addFunc("jumpRuntimeSection", [vm](ScriptActionTimelineEditor* self, int sectionIndex) {
1471 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "runtime section index is invalid", "index");
1472 return script::projectResult(vm, self->jumpRuntimeSection(static_cast<std::size_t>(sectionIndex)),
1492 "syncRuntimeSection", [vm](ScriptActionTimelineEditor* self, int sectionIndex, float targetSeconds) {
1494 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "runtime section index is invalid", "index");
1498 vm, self->syncRuntimeSection(static_cast<std::size_t>(sectionIndex), std::move(target).takeValue()));
1501 "syncRuntimeSectionAndJump", [vm](ScriptActionTimelineEditor* self, int sectionIndex, float targetSeconds) {
1513 actionEditor.addFunc("clearRuntimeSectionSync", [vm](ScriptActionTimelineEditor* self, int sectionIndex) {
1533 actionEditor.addFunc("setRuntimeLayerWeight", [vm](ScriptActionTimelineEditor* self, float weight) {
1535 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1540 actionEditor.addFunc("setRuntimeLayerAdditive", [vm](ScriptActionTimelineEditor* self, bool additive) {
1542 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1547 actionEditor.addFunc("beginRuntimeBlendOut", [vm](ScriptActionTimelineEditor* self, float durationSeconds) {
1549 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1578 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1583 actionEditor.addFunc("getRuntimePoseOverBase", [](ScriptActionTimelineEditor* self, animation::AnimPose* basePose) {
1601 if (!self || !self->runtimeAdvance() || !self->runtimeAdvance()->sectionId) return std::string{};
1614 return self && self->runtimeAdvance() ? static_cast<float>(self->runtimeAdvance()->weight) : 0.0f;
1617 return self && self->runtimeAdvance() ? static_cast<int>(self->runtimeAdvance()->events.size()) : 0;
1637 actionEditor.addFunc("getRuntimeEventSeconds", [](ScriptActionTimelineEditor* self, int index) {
1641 return static_cast<float>(self->runtimeAdvance()->events[static_cast<std::size_t>(index)].time.seconds());
1643 actionEditor.addFunc("getRuntimeEventPayloadJson", [](ScriptActionTimelineEditor* self, int index) {
1647 auto encoded = Value(self->runtimeAdvance()->events[static_cast<std::size_t>(index)].payload).toJson();
1651 return self && self->runtimeAdvance() ? static_cast<int>(self->runtimeAdvance()->activeBlocks.size()) : 0;
1653 actionEditor.addFunc("getRuntimeActiveBlockType", [](ScriptActionTimelineEditor* self, int index) {
1659 actionEditor.addFunc("getRuntimeActiveBlockLocalSeconds", [](ScriptActionTimelineEditor* self, int index) {
1671 actionEditor.addFunc("getRuntimeSectionProgress", [](ScriptActionTimelineEditor* self, int sectionIndex) {
1684 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1687 actionEditor.addFunc("stepFrames", [vm](ScriptActionTimelineEditor* self, int frames, float frameRate) {
1688 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1692 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1703 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1709 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1712 reconciled.ok() ? Value(static_cast<std::int64_t>(reconciled.value().revision.edit)) : Value{});
1723 actionEditor.addFunc("canUndo", [](ScriptActionTimelineEditor* self) { return self && self->editor().canUndo(); });
1724 actionEditor.addFunc("canRedo", [](ScriptActionTimelineEditor* self) { return self && self->editor().canRedo(); });
1729 return self ? static_cast<float>(self->editor().target().timeline().duration.seconds()) : 0.0f;
1737 actionEditor.addFunc("setMontageSettings", [vm](ScriptActionTimelineEditor* self, float basePlayRate,
1765 return self ? static_cast<float>(self->editor().target().timeline().montage.basePlayRate) : 1.0f;
1777 return self ? static_cast<float>(self->editor().target().timeline().montage.defaultBlendIn.seconds()) : 0.0f;
1780 return self ? static_cast<float>(self->editor().target().timeline().montage.defaultBlendOut.seconds()) : 0.0f;
1783 return self ? static_cast<float>(self->editor().target().timeline().montage.blendOutOffset.seconds()) : 0.0f;
1805 self->editor().target().timeline().splitTimestamps[static_cast<std::size_t>(index)].seconds());
1807 actionEditor.addFunc("addSectionSplit", [vm](ScriptActionTimelineEditor* self, float timeSeconds) {
1808 if (!self) return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor is null");
1813 actionEditor.addFunc("setSectionSplit", [vm](ScriptActionTimelineEditor* self, int index, float timeSeconds) {
1828 return self ? static_cast<int>(self->editor().target().timeline().animationSections.size()) : 0;
1830 actionEditor.addFunc("getAnimationSectionId", [](ScriptActionTimelineEditor* self, int index) {
1834 actionEditor.addFunc("getAnimationSectionUri", [](ScriptActionTimelineEditor* self, int index) {
1838 actionEditor.addFunc("getAnimationSectionStart", [](ScriptActionTimelineEditor* self, int index) {
1842 actionEditor.addFunc("getAnimationSectionEnd", [](ScriptActionTimelineEditor* self, int index) {
1846 actionEditor.addFunc("getAnimationSectionBlendIn", [](ScriptActionTimelineEditor* self, int index) {
1850 actionEditor.addFunc("getAnimationSectionSourceStart", [](ScriptActionTimelineEditor* self, int index) {
1854 actionEditor.addFunc("getAnimationSectionSourceEnd", [](ScriptActionTimelineEditor* self, int index) {
1858 actionEditor.addFunc("getAnimationSectionBlendCurve", [](ScriptActionTimelineEditor* self, int index) {
1860 return section ? std::string(action::actionBlendCurveName(section->blendCurve)) : std::string{};
1862 actionEditor.addFunc("addAnimationSection", [vm](ScriptActionTimelineEditor* self, const std::string& sectionId,
1866 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1869 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "animation section id is not canonical",
1877 action::ActionAnimationSection section{*parsed, animationUri, start.value(), end.value(), blend.value()};
1880 actionEditor.addFunc("editAnimationSection", [vm](ScriptActionTimelineEditor* self, const std::string& sectionId,
1884 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1887 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "animation section id is not canonical",
1896 vm, self->editor().editAnimationSection(*parsed, start.value(), end.value(), blend.value(), animationUri));
1899 "removeAnimationSection", [vm](ScriptActionTimelineEditor* self, const std::string& sectionId) {
1901 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1904 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "animation section id is not canonical",
1912 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline editor must not be null");
1916 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "section id or blend curve is invalid",
1923 vm, self->editor().editAnimationSectionSource(*parsed, sourceStart.value(), sourceEnd.value(), *curve));
1948 actionEditor.addFunc("getInsertableTypeCount", [](ScriptActionTimelineEditor* self, bool state) {
1955 actionEditor.addFunc("getInsertableType", [](ScriptActionTimelineEditor* self, bool state, int index) {
1959 return static_cast<std::size_t>(index) < types.size() ? types[static_cast<std::size_t>(index)].type
1962 actionEditor.addFunc("getInsertableTypeLabel", [](ScriptActionTimelineEditor* self, bool state, int index) {
1974 [](ScriptActionTimelineEditor* self) { return self ? self->widget().layout().height : 0.0f; });
2051 actionEditor.addFunc("getStateStart", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2055 actionEditor.addFunc("getStateEnd", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2059 actionEditor.addFunc("getItemStart", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2062 if (const auto* section = findSection(timeline, itemId)) return static_cast<float>(section->start.seconds());
2063 if (const auto* state = findState(timeline, itemId)) return static_cast<float>(state->start.seconds());
2064 if (const auto* notify = findNotify(timeline, itemId)) return static_cast<float>(notify->time.seconds());
2067 actionEditor.addFunc("getItemEnd", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2070 if (const auto* section = findSection(timeline, itemId)) return static_cast<float>(section->end.seconds());
2071 if (const auto* state = findState(timeline, itemId)) return static_cast<float>(state->end.seconds());
2072 if (const auto* notify = findNotify(timeline, itemId)) return static_cast<float>(notify->time.seconds());
2075 actionEditor.addFunc("getItemEnabled", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2083 actionEditor.addFunc("getItemPayloadJson", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2093 actionEditor.addFunc("patchItemPayload", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2099 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "payload patch must be a JSON object",
2103 actionEditor.addFunc("setItemPayloadText", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2107 actionEditor.addFunc("setItemPayloadNumber", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2111 actionEditor.addFunc("setItemPayloadInteger", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2113 return project(vm, patchItemPayload(self, itemId, {{field, static_cast<std::int64_t>(value)}}));
2115 actionEditor.addFunc("setItemPayloadBool", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2119 actionEditor.addFunc("setItemPayloadVector3", [vm](ScriptActionTimelineEditor* self, const std::string& itemId,
2145 actionEditor.addFunc("getItemPayloadText", [](ScriptActionTimelineEditor* self, const std::string& itemId,
2151 actionEditor.addFunc("getItemPayloadNumber", [](ScriptActionTimelineEditor* self, const std::string& itemId,
2159 actionEditor.addFunc("getItemPayloadBool", [](ScriptActionTimelineEditor* self, const std::string& itemId,
2179 actionEditor.addFunc("getItemPayloadVector", [](ScriptActionTimelineEditor* self, const std::string& itemId,
2189 actionEditor.addFunc("getParameterKeyCount", [](ScriptActionTimelineEditor* self, const std::string& itemId) {
2270 moduleClass.addFunc("create", [vm, clipboard](eve::action_editor::ActionEditorModule*, const std::string& targetId,
2273 return bindingFailure(vm, DiagnosticCode::InvalidArgument, "action timeline target id must not be empty",
2306 auto opened = documents->open({DocumentKind::Timeline, AssetGuid(assetGuid)}, title, resourceUri,
2318 return ::eve::editor::projectOwnedInstance<ScriptActionTimelineEditor>(vm, std::move(instance));
Deterministic notify-state lifecycle routing.
Extensible notify descriptors, validation and runtime routing.
Typed continuous parameter-curve action block.
Atomic action-preview transport and presentation orchestration.
UI-neutral transactional action timeline editor and preview model.
Validated partial editing for action-block payloads.
Squirrel adapter for the canonical action timeline editor.
Renderer-neutral interactive action timeline widget.
Layered dual-slot montage ownership and stable handles.
Deterministic presentation-only action montage playback.
The single Squirrel projection for common Result, Status and Value.
Explicit Value/Owned/Borrowed semantics at the Squirrel boundary.
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
static Result< Duration > fromSeconds(double seconds)
Convert finite seconds to the nearest nanosecond.
Definition Time.cpp:16
static constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept
Construct an exact duration from nanoseconds.
Definition Time.h:55
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static constexpr RuntimeHandle invalid() noexcept
Returns the canonical invalid handle.
Definition RuntimeHandle.h:143
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Result< std::string > toJson() const
Serialize this value as deterministic compact JSON.
Definition Value.cpp:67
static Result< Value > fromJson(std::string_view json)
Parse one strict JSON value into an owning Value.
Definition Value.cpp:57
static Result< ActionNotifyRegistry > withBuiltins()
Build a registry containing the engine's standard semantic notify types.
Definition ActionNotifyRegistry.cpp:172
Composition adapter that contributes action-timeline commands, automation targets,...
Definition ActionEditorModule.h:21
Per-bone weights used by override and additive animation layers.
Definition AnimLayerMixer.h:20
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:145
static AnimClip * loadClipFromModel(const model3d::ModelData *model, const AnimSkeleton *skeleton, int animIndex=0)
Loads clip from model.
Definition AnimImporterModel.cpp:13
static int getAnimationCountFromModel(const model3d::ModelData *model)
Returns the animation count from model.
Definition AnimImporterModel.cpp:19
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:17
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
Definition AnimSkeleton.h:16
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
Definition StrongUint64.h:24
Applies typed partial payload changes through the canonical timeline transaction authority.
Definition ActionTimelinePayloadEditor.h:20
Result< void > fitClipToBlock(const LogicalId &itemId)
Extend one VFX state's clip end so its authored interval matches the block duration.
Definition ActionTimelinePayloadEditor.cpp:77
Result< void > fitBlockToClip(const LogicalId &itemId)
Resize one VFX state to its authored clip interval at 1.0x playback.
Definition ActionTimelinePayloadEditor.cpp:60
Result< void > fitClipToNaturalDuration(const LogicalId &itemId, OptionalRef< const action::IActionVfxDurationProvider > provider)
Set one VFX state's clip end to the finite duration reported by its resource provider.
Definition ActionTimelinePayloadEditor.cpp:96
Composition model shared by project-specific developer and runtime editors.
Definition EditorWorkspace.h:43
CPU-side decoded 3D model (Assimp scene owned via medialoader::ModelScene). Does not upload to GPU — ...
Definition ModelData.h:39
std::string_view actionTrackKindName(ActionTrackKind kind) noexcept
Stable lowercase protocol spelling for a track kind.
Definition ActionTimeline.cpp:196
std::optional< ActionBlendCurve > actionBlendCurveFromName(std::string_view name) noexcept
Parse a persisted montage cross-fade curve name.
Definition ActionTimeline.cpp:190
Result< ActionTrackKind > parseActionTrackKind(std::string_view text)
Parse a stable track kind spelling.
Definition ActionTimeline.cpp:210
std::string_view actionBlendCurveName(ActionBlendCurve curve) noexcept
Stable persisted name for a montage cross-fade curve.
Definition ActionTimeline.cpp:182
ActionTimelineEventKind
Boundary emitted by deterministic timeline sampling.
Definition ActionTimeline.h:138
@ StateEnter
std::optional< ActionParameterInterpolation > actionParameterInterpolationFromName(std::string_view value) noexcept
Parse a stable persisted interpolation spelling.
Definition ActionParameterCurve.cpp:51
eve::detail::StrongUint64< ActionExecutionIdTag > ActionExecutionId
Definition Action.h:157
std::string_view actionParameterInterpolationName(ActionParameterInterpolation value) noexcept
Stable persisted interpolation spelling.
Definition ActionParameterCurve.cpp:42
RuntimeHandle< MontageHandleTag > MontageHandle
Generation-qualified identity owned by one MontageCoordinator.
Definition MontageCoordinator.h:24
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
eve::Value toPresentationValue(const Value &value)
To presentation value.
Definition EditingProperty.cpp:94
Result< T > applied(T value, std::vector< Diagnostic > diagnostics={})
Construct an Applied result with an owning payload and optional diagnostics.
Definition EditingResult.h:43
Result< void > noOp(std::vector< Diagnostic > diagnostics={})
Construct a successful void result for an operation that made no change.
Definition EditingResult.h:58
Definition ActionPreviewController.cpp:6
eve::editing::Value EditorValue
Compatibility alias for the UI-independent authoring value tree.
Definition EditorValue.h:8
EditorValue toEditorValue(const eve::Value &value)
Compatibility spelling for conversion into the authoring value tree.
Definition EditorProperty.h:29
void exposeActionTimelineScriptBindings(ssq::Table &table, ssq::Class &moduleClass)
Expose the script-owned action timeline editor adapter.
Definition ActionTimelineScriptBindings.cpp:1022
std::string_view timelineItemVisualName(TimelineItemVisual visual) noexcept
Return the stable script-facing name for a timeline visual kind.
Definition ActionTimelineWidget.cpp:146
ssq::Table project(HSQUIRRELVM vm, const eve::Result< void > &result)
Project a completed editing result that has no payload.
Definition EditorScriptProjection.h:28
ssq::Table bindingFailure(HSQUIRRELVM vm, const char *source, DiagnosticCode code, std::string message, std::string path={})
Project a binding-layer argument failure with a stable diagnostic source.
Definition EditorScriptProjection.h:57
@ Timeline
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
Definition SquirrelBinding.cpp:454
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
Result< Value > valueFromSquirrel(HSQUIRRELVM vm, SQInteger index, const SquirrelValueOptions &options)
Convert one Squirrel value into the canonical owning Value tree.
Definition SquirrelBinding.cpp:342
@ InvalidArgument
@ NotFound
@ Failed
@ Conflict
@ Pending
@ NoOp
@ Applied
std::optional< std::reference_wrapper< T > > OptionalRef
Optional borrowed reference; it does not extend T's lifetime.
Definition BorrowedRef.h:24
detail::StrongUint64< detail::SimulationTickTag > SimulationTick
Deterministic simulation time step; it is not wall-clock time.
Definition Time.h:31
Definition Container.h:602
Objective animation segment placed on the montage presentation lane.
Definition ActionTimeline.h:58
Montage-wide presentation settings persisted with the action timeline.
Definition ActionTimeline.h:36
static Result< ActionParameterCurveBinding > fromPayload(const Value::Object &payload)
Decode and validate target, operation and normalized ordered keys.
Definition ActionParameterCurve.cpp:65
Owning event projection returned by the runtime sampler.
Definition ActionTimeline.h:146
static Result< ActionTimeline > fromValue(const Value &value)
Decode and validate one canonical schema value transactionally.
Definition ActionTimeline.cpp:425
Ordered semantic lane in one action timeline.
Definition ActionTimeline.h:124
Complete renderer-neutral layout for one widget frame.
Definition ActionTimelineWidget.h:82
std::vector< TimelineRulerTick > rulerTicks
Definition ActionTimelineWidget.h:89
Limits and provenance used by the Squirrel ↔ Value adapter.
Definition SquirrelBinding.h:35