载入中...
搜索中...
未找到
ParticleOffscreenRuntime.cpp
浏览该文件的文档.
2
3#include "graphics/Canvas.h"
6
7#include <cmath>
8
10namespace {
11const EditorValue* field(const EditorValue& value, const char* key) {
12 const auto* object=value.getIf<EditorValue::Object>(); if(!object)return nullptr;
13 auto found=object->find(key); return found==object->end()?nullptr:&found->second;
14}
15class EmitterGuard {
16public:
17 explicit EmitterGuard(particles::ParticleEmitter* emitter):emitter_(emitter){}
18 ~EmitterGuard(){if(emitter_)emitter_->release();}
19 particles::ParticleEmitter* get()const{return emitter_;}
20private: particles::ParticleEmitter* emitter_=nullptr;
21};
22}
23
26 const ParticleGraphPreviewResult& estimate, graphics::Graphics* graphics,
27 graphics::Canvas* canvas) {
28 if (!graphics || !canvas || compiled.documentRevision != request.graph.revision ||
29 estimate.documentRevision != request.graph.revision)
30 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.particles.preview-stale"), "Particle runtime preview requires current graph and graphics targets");
31 const EditorValue* output=field(compiled.configuration,"output");
32 const EditorValue* bufferValue=output?field(*output,"bufferSize"):nullptr;
33 const auto* buffer=bufferValue?bufferValue->getIf<int64_t>():nullptr;
34 if(!buffer||*buffer<1||*buffer>request.particleBudget)
35 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.particles.preview-buffer"), "Particle preview buffer is invalid or exceeds its budget");
36 EmitterGuard emitter(particles::ParticleEmitter::createEmitter(static_cast<int>(*buffer)));
37 if(!emitter.get())return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.particles.preview-emitter"), "Could not create an isolated particle emitter");
38 auto applied=ParticleGraphRuntimeBuilder().apply(request.graph,emitter.get(),textures_);
39 if(!applied.ok())return applied;
40 emitter.get()->setGpuSimulation(false);
41 emitter.get()->setAutoRandomSeed(false);
42 emitter.get()->setCanvas(canvas);
43 emitter.get()->setPosition(static_cast<float>(request.width)*0.5f,
44 static_cast<float>(request.height)*0.5f);
45 emitter.get()->start();
46 const int fullSteps=static_cast<int>(std::floor(estimate.simulatedSeconds/request.fixedStep));
47 const double remainder=estimate.simulatedSeconds-static_cast<double>(fullSteps)*request.fixedStep;
48 std::uint64_t tick=0;
49 for(int i=0;i<fullSteps+(remainder>1e-12?1:0);++i){
50 const double seconds=i<fullSteps?request.fixedStep:remainder;
52 if(!duration)return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.particles.preview-step"), "Particle preview fixed step is invalid");
53 auto advanced=emitter.get()->advance({eve::SimulationTick(++tick),duration.value()});
54 if(!advanced)return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.particles.preview-advance"), "Particle emitter rejected deterministic preview stepping");
55 }
57 return eve::editing::applied<void>();
58}
59
60} // namespace eve::particles_graphics_editing
double value
float duration
std::string output
const GltfImportRequest & request
std::uint32_t key
std::unique_ptr< gpgpu::GpuBuffer > buffer
Definition OnnxGpgpu.cpp:26
bool found
std::unique_ptr< TrailEmitter > emitter
SimulationTick tick
static Result< Duration > fromSeconds(double seconds)
Convert finite seconds to the nearest nanosecond.
Definition Time.cpp:16
Move-only operation result carrying either a value or Status.
Definition Result.h:155
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Deterministic owning value tree shared by authoring hosts.
std::map< std::string, Value > Object
const T * getIf() const
Return an immediately borrowed typed value.
Canvas public API.
Definition Canvas.h:17
static ParticleEmitter * createEmitter(int bufferSize=1000)
static int renderEmitter(graphics::Graphics *gfx, ParticleEmitter *emitter)
Draw exactly one emitter without traversing the global ECS registry.
Optional bridge applying a compiled graph to a real ParticleEmitter.
Result< void > apply(const GraphDocumentData &graph, particles::ParticleEmitter *emitter, const TextureResolver &textures={}) const
Applies .
Result< void > draw(const ParticleOffscreenPreviewRequest &request, const ParticleGraphCompileResult &compiled, const ParticleGraphPreviewResult &estimate, graphics::Graphics *graphics, graphics::Canvas *canvas) override
Draws .
const EditorValue * field(const EditorValue &value, const char *name)
detail::StrongUint64< detail::SimulationTickTag > SimulationTick
Deterministic simulation time step; it is not wall-clock time.
Definition Time.h:31
Validated particle configuration compiled from a module graph.
Deterministic, revision-tagged particle preview estimate.