载入中...
搜索中...
未找到
Fluid.h
浏览该文件的文档.
1#pragma once
2
3#include <cstdint>
4#include <unordered_map>
5#include <vector>
6
7namespace eve::graphics {
8class Graphics;
9}
10
11namespace eve::physics {
12
17class Fluid {
18public:
19 explicit Fluid(int capacity = 512);
20 ~Fluid();
21
22 Fluid(const Fluid &) = delete;
23 Fluid &operator=(const Fluid &) = delete;
24
25 void update(float dt);
26
27 void setGravity(float gx, float gy);
28 float getGravityX() const { return gravityX_; }
29 float getGravityY() const { return gravityY_; }
30
32 void setSmoothingRadius(float radius);
33 float getSmoothingRadius() const { return h_; }
34
36 void setRestDensity(float density);
37 float getRestDensity() const { return restDensity_; }
38
40 void setPressureStiffness(float k);
41 float getPressureStiffness() const { return pressureK_; }
42
44 void setNearPressureStiffness(float k);
45 float getNearPressureStiffness() const { return nearPressureK_; }
46
47 void setViscosity(float viscosity);
48 float getViscosity() const { return viscosity_; }
49
51 void setIterations(int iterations);
52 int getIterations() const { return iterations_; }
53
55 void setBounds(float x, float y, float w, float h);
56 void clearBounds();
57
62 int emit(float x, float y, int count, float vx = 0.f, float vy = 0.f);
63
65 void clear();
66
71 void interactAt(float x, float y, float radius, float strength);
72
73 void setColor(float r, float g, float b, float a = 1.f);
74 float getColorR() const { return colorR_; }
75 float getColorG() const { return colorG_; }
76 float getColorB() const { return colorB_; }
77 float getColorA() const { return colorA_; }
78
80 void setParticleSize(float size);
81 float getParticleSize() const { return particleSize_; }
82
83 void draw(graphics::Graphics *gfx);
84
85 int getCapacity() const { return capacity_; }
86 int getParticleCount() const { return static_cast<int>(particles_.size()); }
87 float getParticleX(int index) const;
88 float getParticleY(int index) const;
89 float getParticleVx(int index) const;
90 float getParticleVy(int index) const;
91
92 void destroy();
93
94private:
95 struct Particle {
96 float x = 0.f, y = 0.f;
97 float vx = 0.f, vy = 0.f;
98 float density = 0.f;
99 };
100
101 void rebuildHash();
102 void applyViscosity(float dt);
103 void doubleDensityRelaxation();
104 void collideBounds();
105 bool validIndex(int index) const;
106 int64_t cellKey(int cx, int cy) const;
107
108 int capacity_ = 512;
109 float gravityX_ = 0.f;
110 float gravityY_ = 980.f;
111 float h_ = 18.f;
112 float restDensity_ = 4.f;
113 float pressureK_ = 0.5f;
114 float nearPressureK_ = 0.5f;
115 float viscosity_ = 0.12f;
116 int iterations_ = 3;
117
118 bool hasBounds_ = false;
119 float boundX_ = 0.f, boundY_ = 0.f, boundW_ = 0.f, boundH_ = 0.f;
120
121 float interactX_ = 0.f, interactY_ = 0.f;
122 float interactRadius_ = 0.f;
123 float interactStrength_ = 0.f;
124
125 float colorR_ = 0.25f, colorG_ = 0.55f, colorB_ = 0.95f, colorA_ = 0.85f;
126 float particleSize_ = 5.f;
127
128 bool destroyed_ = false;
129
130 std::vector<Particle> particles_;
131 std::unordered_map<int64_t, std::vector<int>> hash_;
132};
133
134} // namespace eve::physics
float cx
Definition CardTypes.cpp:31
float cy
Definition CardTypes.cpp:32
int y
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
int h
int w
uint32_t a
uint32_t b
int iterations
Definition TreeMesh.cpp:193
Interactive 2D particle fluid (double-density relaxation) in pixel space. Script-owned; independent o...
Definition Fluid.h:17
int emit(float x, float y, int count, float vx=0.f, float vy=0.f)
Spawn up to count particles at (x,y) with initial velocity. Returns number actually added.
Definition Fluid.cpp:65
float getViscosity() const
Definition Fluid.h:48
float getGravityY() const
Definition Fluid.h:29
float getColorA() const
Definition Fluid.h:77
float getParticleVx(int index) const
Definition Fluid.cpp:119
float getParticleVy(int index) const
Definition Fluid.cpp:124
float getRestDensity() const
Definition Fluid.h:37
void setRestDensity(float density)
Target rest density for the relaxation solver (default 4).
Definition Fluid.cpp:38
float getPressureStiffness() const
Definition Fluid.h:41
void setColor(float r, float g, float b, float a=1.f)
Definition Fluid.cpp:96
int getParticleCount() const
Definition Fluid.h:86
void setIterations(int iterations)
Solver iterations per frame (default 3).
Definition Fluid.cpp:49
int getIterations() const
Definition Fluid.h:52
void setParticleSize(float size)
Particle draw size in pixels (default 5).
Definition Fluid.cpp:103
void setBounds(float x, float y, float w, float h)
Axis-aligned container; particles bounce inside.
Definition Fluid.cpp:51
void setViscosity(float viscosity)
Definition Fluid.cpp:47
Fluid(const Fluid &)=delete
void update(float dt)
Definition Fluid.cpp:266
float getNearPressureStiffness() const
Definition Fluid.h:45
float getParticleY(int index) const
Definition Fluid.cpp:114
int getCapacity() const
Definition Fluid.h:85
void draw(graphics::Graphics *gfx)
Definition Fluid.cpp:329
float getSmoothingRadius() const
Definition Fluid.h:33
void setPressureStiffness(float k)
Pressure stiffness (default 0.5).
Definition Fluid.cpp:43
void setSmoothingRadius(float radius)
Interaction / neighbor radius in pixels (default 18).
Definition Fluid.cpp:33
float getGravityX() const
Definition Fluid.h:28
float getColorB() const
Definition Fluid.h:76
float getParticleSize() const
Definition Fluid.h:81
float getColorG() const
Definition Fluid.h:75
void clear()
Clear all particles.
Definition Fluid.cpp:84
void setNearPressureStiffness(float k)
Near-pressure (anti-clustering) stiffness (default 0.5).
Definition Fluid.cpp:45
Fluid & operator=(const Fluid &)=delete
void interactAt(float x, float y, float radius, float strength)
Mouse / pointer interaction: positive strength attracts, negative repels. Applied as acceleration wit...
Definition Fluid.cpp:89
float getColorR() const
Definition Fluid.h:74
float getParticleX(int index) const
Definition Fluid.cpp:109
void setGravity(float gx, float gy)
Definition Fluid.cpp:28
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6