载入中...
搜索中...
未找到
StylizeRuntime.cpp
浏览该文件的文档.
2
3#include "common/Exception.h"
4#include "graphics/Canvas.h"
5#include "graphics/Graphics.h"
7#include "stylize/StylePass.h"
9
10#include <utility>
11
12namespace eve::stylize_editing {
13namespace {} // namespace
14
17
19 if (!graphics)
20 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.stylize.graphics"),
21 "Stylize publication requires Graphics");
22 const auto diagnostics = document.validate();
23 for (const auto& d : diagnostics)
24 if (d.severity() == DiagnosticSeverity::Error)
25 return Result<void>::failure(eve::Status(EditorStatus::Rejected, diagnostics));
26 std::vector<std::unique_ptr<stylize::StyleInstance>> instances;
27 auto recipe = std::make_unique<stylize::StyleRecipe>();
28 try {
29 for (const auto& pass : document.passes()) {
30 if (!pass.enabled) continue;
31 auto instance = std::make_unique<stylize::StyleInstance>(pass.style);
32 instance->setPriority(pass.priority);
33 for (const auto& [name, value] : pass.overrides) instance->setFloat(name, static_cast<float>(value));
34 recipe->add(instance.get());
35 instances.push_back(std::move(instance));
36 }
37 if (!instances.empty()) recipe->compile(graphics);
38 } catch (const std::exception& exception) {
39 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.stylize.compile"), exception.what());
40 }
41 instances_ = std::move(instances);
42 recipe_ = std::move(recipe);
43 graphics_ = graphics;
44 revision_ = document.revision();
45 return eve::editing::applied<void>(diagnostics);
46}
48 graphics::Canvas* destination, Revision expectedRevision) const {
49 if (expectedRevision != revision_)
50 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.stylize.stale"),
51 "Stylize runtime generation is stale");
52 if (!graphics || !source || !destination || graphics != graphics_ || revision_ == 0)
53 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.stylize.runtime"),
54 "Stylize runtime requires its compiled Graphics, source and destination");
55 try {
56 if (instances_.empty()) {
57 auto* previous = graphics->getCanvas();
58 graphics->setCanvas(destination);
59 graphics->drawTexturedRect(source, 0, 0, static_cast<float>(destination->getWidth()),
60 static_cast<float>(destination->getHeight()), graphics::Color(1, 1, 1, 1));
61 graphics->setCanvas(previous);
62 } else
63 recipe_->apply(graphics, source, destination);
64 } catch (const std::exception& exception) {
65 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.stylize.apply"), exception.what());
66 }
67 return eve::editing::applied<void>();
68}
69
70} // namespace eve::stylize_editing
double value
std::vector< BuildingInstanceSnapshot > instances
std::string name
graphics::Canvas * previous
float d
const UnitySourceAsset & source
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
std::uint64_t revision() const override
Return the current revision.
Canvas public API.
Definition Canvas.h:17
virtual int getWidth() const =0
Returns the width.
virtual int getHeight() const =0
Returns the height.
virtual Canvas * getCanvas() const =0
Returns the canvas.
virtual void setCanvas(Canvas *canvas)=0
nullptr or this → screen. Switching flushes pending draws to the previous target.
virtual void drawTexturedRect(Texture *texture, float x, float y, float w, float h, float r, float g, float b, float a=1.f)
RGBA-float overload matching the script-facing drawTexturedRect name.
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:18
StylizeRecipeRuntime()
Stylize recipe runtime.
Result< void > apply(graphics::Graphics *graphics, graphics::Texture *source, graphics::Canvas *destination, Revision expectedRevision) const
Apply the active post recipe into an explicit destination Canvas.
~StylizeRecipeRuntime()
Stylize recipe runtime.
Result< void > publish(const StylizeRecipeTarget &document, graphics::Graphics *graphics)
Compile a complete candidate before replacing the active generation.
Serializable ordered style recipe with dynamic parameter Inspector.
std::vector< EditorDiagnostic > validate() const
Validate style existence, stage compatibility, parameters and budgets.
std::vector< StylizePassValue > passes() const
Return ordered immutable pass values.
eve::Color Color
RGBA color used by every graphics draw call. Lives inside eve::graphics so including a graphics heade...
Definition Color.h:13