OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
pfxobjects.cpp
Go to the documentation of this file.
1#include "pfxobjects.h"
2
3#include <Tempest/Log>
4#include <cstring>
5
7
8#include "pfxbucket.h"
9#include "particlefx.h"
10
11using namespace Tempest;
12
14 :world(world), scene(scene), visual(visual) {
15 }
16
19
20void PfxObjects::setViewerPos(const Vec3& pos) {
21 viewerPos = pos;
22 }
23
25 lastUpdate = size_t(-1);
26 }
27
28void PfxObjects::tick(uint64_t ticks) {
29 static bool disabled = false;
30 if(disabled)
31 return;
32
33 if(lastUpdate>ticks) {
34 lastUpdate = ticks;
35 return;
36 }
37
38 uint64_t dt = ticks-lastUpdate;
39 if(dt==0)
40 return;
41
42 for(auto& i:bucket)
43 i.tick(dt,viewerPos);
44
45 for(auto& i:bucket)
46 i.buildSsbo();
47
48 lastUpdate = ticks;
49 }
50
51bool PfxObjects::isInPfxRange(const Vec3& pos) const {
52 auto dp = viewerPos-pos;
53 return dp.quadLength()<viewRage*viewRage;
54 }
55
56void PfxObjects::preFrameUpdate(uint8_t fId) {
57 for(auto i=bucket.begin(), end = bucket.end(); i!=end; ) {
58 if(i->isEmpty()) {
59 i = bucket.erase(i);
60 } else {
61 ++i;
62 }
63 }
64
65 for(auto& i:bucket)
66 i.preFrameUpdate(scene, fId);
67 }
68
69void PfxObjects::drawGBuffer(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId) {
70 for(auto& i:bucket)
71 i.drawGBuffer(cmd, scene, fId);
72 }
73
74void PfxObjects::drawShadow(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId, int layer) {
75 for(auto& i:bucket)
76 i.drawShadow(cmd, scene, fId, layer);
77 }
78
79void PfxObjects::drawTranslucent(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId) {
80 for(auto& i:bucket)
81 i.drawTranslucent(cmd, scene, fId);
82 }
83
84PfxBucket& PfxObjects::getBucket(const ParticleFx &decl) {
85 for(auto& i:bucket)
86 if(&i.decl==&decl)
87 return i;
88 bucket.emplace_back(decl,*this,scene,visual);
89 return bucket.back();
90 }
91
92PfxBucket& PfxObjects::getBucket(const Material& mat, const zenkit::VirtualObject& vob) {
93 Tempest::Vec2 dimension {};
94 if(auto decal = dynamic_cast<const zenkit::VisualDecal*>(vob.visual.get()))
95 dimension = Tempest::Vec2{decal->dimension.x, decal->dimension.y};
96
97 for(auto& i:spriteEmit)
98 if(i.pfx->visMaterial==mat &&
99 i.visualCamAlign==vob.sprite_camera_facing_mode &&
100 i.zBias==vob.bias &&
101 i.decalDim==dimension) {
102 return getBucket(*i.pfx);
103 }
104 spriteEmit.emplace_back();
105 auto& e = spriteEmit.back();
106
107 e.visualCamAlign = vob.sprite_camera_facing_mode;
108 e.zBias = vob.bias;
109 e.decalDim = dimension;
110 e.pfx.reset(new ParticleFx(mat,vob));
111 return getBucket(*e.pfx);
112 }
113
void preFrameUpdate(uint8_t fId)
void tick(uint64_t ticks)
void drawGBuffer(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
void drawShadow(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId, int layer)
void setViewerPos(const Tempest::Vec3 &pos)
PfxObjects(WorldView &world, const SceneGlobals &scene, VisualObjects &visual)
bool isInPfxRange(const Tempest::Vec3 &pos) const
void resetTicks()
void drawTranslucent(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
static constexpr const float viewRage
Definition pfxobjects.h:22