10using namespace Tempest;
25 for(
size_t i=0; i<eff.size(); ) {
26 if(eff[i]->timeUntil<time) {
27 eff.erase(eff.begin()+
int(i));
35 for(
auto& pi:timeEff) {
37 dt = dt*i.mul + timeWrldRem;
38 timeWrldRem = dt%i.div;
43static float generator(uint64_t dt, uint64_t period) {
44 float a0 = float((dt+period/2)%period)/float(period);
50 for(
auto& pi:morphEff) {
52 float x = i.amplitude*0.075f;
53 float y = i.amplitude*0.075f;
55 uint64_t time = owner.
tickCount()-i.timeStart;
60 a0 = std::sin(a0*
float(M_PI));
61 a1 = std::sin(a1*
float(M_PI));
63 proj.scale(1.f+a0*x,1.f-a0*y,1.f);
64 proj.scale(1.f+a1*x,1.f+a1*y,1.f);
69 for(
auto& pi:scrEff) {
74 float a0 = std::min(1.f, (
float(now-i.timeStart)/1000.f)/i.inout);
75 float a1 = std::min(1.f, (
float(i.timeUntil-now)/1000.f)/i.inout);
76 float a = std::min(a0,a1);
77 cl.set(cl.r(),cl.g(),cl.b(),cl.a()*a);
79 if(i.frames.size()==0) {
80 p.setBrush(Tempest::Brush(cl,Tempest::Painter::Alpha));
82 uint64_t dt = owner.
tickCount()-i.timeStart;
83 size_t frame = size_t(i.fps*dt)/1000;
86 p.setBrush(Tempest::Brush(*i.frames[frame],Tempest::Color(1,1,1,cl.a()),Tempest::Painter::Alpha));
88 p.drawRect(rect.x,rect.y,rect.w,rect.h,0,0,p.brush().w(),p.brush().h());
93 auto ret = create(what,argv,argc);
96 eff.timeUntil = uint64_t(-1);
else
99 eff.timeLen = len==0 ? uint64_t(-1) : len;
107 if(what==
"screenblend.scx")
109 if(what==
"morph.fov")
111 if(what==
"earthquake.eqk")
115GlobalFx GlobalEffects::create(std::string_view what,
const std::string* argv,
size_t argc) {
117 return addSlowTime(argv,argc);
118 if(what==
"screenblend.scx")
119 return addScreenBlend(argv,argc);
120 if(what==
"morph.fov")
121 return addMorphFov(argv,argc);
122 if(what==
"earthquake.eqk")
123 return addEarthQuake(argv,argc);
127GlobalFx GlobalEffects::addSlowTime(
const std::string* argv,
size_t argc) {
128 double val[2] = {1,1};
129 for(
size_t i=0; i<argc && i<2; ++i) {
131 val[i] = std::stof(argv[i]);
134 Log::e(
"invalid time.slw parameter [",i,
"]: \"", argv[i],
"\"");
138 for(
int i=0; i<2; ++i)
139 v[i] = uint64_t(val[i]*1000);
144 timeEff.emplace_back(std::make_shared<SlowTime>(s));
148GlobalFx GlobalEffects::addScreenBlend(
const std::string* argv,
size_t argc) {
152 sc.loop = float(std::stof(argv[0]));
155 Log::e(
"invalid screenblend.scx parameter [0]: \"", argv[0],
"\"");
159 sc.cl = parseColor(argv[1]);
163 sc.inout = float(std::stof(argv[2]));
166 Log::e(
"invalid screenblend.scx parameter [2]: \"", argv[2],
"\"");
174 sc.fps = size_t(std::stoi(argv[4]));
177 Log::e(
"invalid screen-blend parameter [4]: \"", argv[4],
"\"");
180 sc.timeLoop = uint64_t(sc.loop*1000.f);
182 scrEff.emplace_back(std::make_shared<ScreenBlend>(sc));
186GlobalFx GlobalEffects::addMorphFov(
const std::string* argv,
size_t argc) {
187 double val[4] = {0,0,0,0};
188 for(
size_t i=0; i<argc && i<4; ++i) {
189 val[i] = std::stof(argv[i]);
192 m.amplitude = float(val[0]);
193 m.speed = float(val[1]);
194 m.baseX = float(val[2]);
195 m.baseY = float(val[3]);
197 morphEff.emplace_back(std::make_shared<Morph>(m));
201GlobalFx GlobalEffects::addEarthQuake(
const std::string*,
size_t) {
202 quakeEff.emplace_back(std::make_shared<Quake>());
206Tempest::Color GlobalEffects::parseColor(std::string_view sv) {
207 auto s = std::string(sv);
211 for(
int i=0;i<4;++i) {
213 v[i] = std::strtof(str,&next)/255.f;
216 return Tempest::Color(v[0],v[0],v[0],1.f);
218 return Tempest::Color(v[0],v[1],0.f,1.f);
220 return Tempest::Color(v[0],v[1],v[2],1.f);
224 return Tempest::Color(v[0],v[1],v[2],v[3]);
227void GlobalEffects::Effect::stop() {
void scrBlend(Tempest::Painter &p, const Tempest::Rect &rect)
void scaleTime(uint64_t &dt)
GlobalEffects(World &owner)
void stopEffect(const VisualFx &vfx)
GlobalFx startEffect(std::string_view what, uint64_t len, const std::string *argv, size_t argc)
void morph(Tempest::Matrix4x4 &proj)
static auto loadTextureAnim(std::string_view name) -> std::vector< const Tempest::Texture2d * >
uint64_t tickCount() const
static float generator(uint64_t dt, uint64_t period)