Merge branch 'main' into visuals-restoration

This commit is contained in:
MihailRis 2025-12-18 18:59:37 +03:00
commit 30e014fce1
5 changed files with 11 additions and 10 deletions

View file

@ -22,6 +22,7 @@ Particles are a table, all fields of which are optional.
| max_angular_vel | Maximum angular velocity (radians per sec). Non-negative. | 0.0 | | max_angular_vel | Maximum angular velocity (radians per sec). Non-negative. | 0.0 |
| spawn_shape | Shape of particle spawn area. (ball/sphere/box) | ball | | spawn_shape | Shape of particle spawn area. (ball/sphere/box) | ball |
| spawn_spread | Size of particle spawn area. | {0, 0, 0} | | spawn_spread | Size of particle spawn area. | {0, 0, 0} |
| spawn_offset | Offset of particle spawn area. | {0, 0, 0} |
| random_sub_uv | Size of random texture subregion (1 - entire texture will be used). | 1.0 | | random_sub_uv | Size of random texture subregion (1 - entire texture will be used). | 1.0 |
## *gfx.particles* library ## *gfx.particles* library

View file

@ -23,6 +23,7 @@
| max_angular_vel | Максимальная угловая скорость (радианы в сек.). Неотрицательное. | 0.0 | | max_angular_vel | Максимальная угловая скорость (радианы в сек.). Неотрицательное. | 0.0 |
| spawn_shape | Форма области спавна частиц. (ball/sphere/box) | ball | | spawn_shape | Форма области спавна частиц. (ball/sphere/box) | ball |
| spawn_spread | Размер области спавна частиц. | {0, 0, 0} | | spawn_spread | Размер области спавна частиц. | {0, 0, 0} |
| spawn_offset | Смещение области спавна частиц. | {0, 0, 0} |
| random_sub_uv | Размер случайного подрегиона текстуры (1 - будет использована вся текстура). | 1.0 | | random_sub_uv | Размер случайного подрегиона текстуры (1 - будет использована вся текстура). | 1.0 |
## Библиотека *gfx.particles* ## Библиотека *gfx.particles*

View file

@ -103,6 +103,7 @@ void Emitter::update(
glm::vec3 spawnOffset = generate_coord(preset.spawnShape); glm::vec3 spawnOffset = generate_coord(preset.spawnShape);
spawnOffset *= preset.spawnSpread; spawnOffset *= preset.spawnSpread;
spawnOffset += preset.spawnOffset;
particle.position = position + spawnOffset; particle.position = position + spawnOffset;
particle.lifetime *= 1.0f - preset.lifetimeSpread * random.randFloat(); particle.lifetime *= 1.0f - preset.lifetimeSpread * random.randFloat();

View file

@ -28,7 +28,8 @@ dv::value ParticlesPreset::serialize() const {
root["angle_spread"] = angleSpread; root["angle_spread"] = angleSpread;
root["min_angular_vel"] = minAngularVelocity; root["min_angular_vel"] = minAngularVelocity;
root["max_angular_vel"] = maxAngularVelocity; root["max_angular_vel"] = maxAngularVelocity;
root["spawn_spread"] = dv::to_value(size); root["spawn_spread"] = dv::to_value(spawnSpread);
root["spawn_offset"] = dv::to_value(spawnOffset);
root["spawn_shape"] = ParticleSpawnShapeMeta.getName(spawnShape); root["spawn_shape"] = ParticleSpawnShapeMeta.getName(spawnShape);
root["random_sub_uv"] = randomSubUV; root["random_sub_uv"] = randomSubUV;
return root; return root;
@ -47,9 +48,7 @@ void ParticlesPreset::deserialize(const dv::value& src) {
src.at("min_angular_vel").get(minAngularVelocity); src.at("min_angular_vel").get(minAngularVelocity);
src.at("max_angular_vel").get(maxAngularVelocity); src.at("max_angular_vel").get(maxAngularVelocity);
src.at("random_sub_uv").get(randomSubUV); src.at("random_sub_uv").get(randomSubUV);
if (src.has("velocity")) { dv::get_vec(src, "velocity", velocity);
dv::get_vec(src["velocity"], velocity);
}
if (src.has("acceleration")) { if (src.has("acceleration")) {
dv::get_vec(src["acceleration"], acceleration); dv::get_vec(src["acceleration"], acceleration);
} }
@ -57,12 +56,9 @@ void ParticlesPreset::deserialize(const dv::value& src) {
dv::get_vec(src["size"], size); dv::get_vec(src["size"], size);
} }
src.at("size_spread").get(sizeSpread); src.at("size_spread").get(sizeSpread);
if (src.has("spawn_spread")) { dv::get_vec(src, "spawn_spread", spawnSpread);
dv::get_vec(src["spawn_spread"], spawnSpread); dv::get_vec(src, "spawn_offset", spawnOffset);
} dv::get_vec(src, "explosion", explosion);
if (src.has("explosion")) {
dv::get_vec(src["explosion"], explosion);
}
if (src.has("spawn_shape")) { if (src.has("spawn_shape")) {
ParticleSpawnShapeMeta.getItem(src["spawn_shape"].asString(), spawnShape); ParticleSpawnShapeMeta.getItem(src["spawn_shape"].asString(), spawnShape);
} }

View file

@ -60,6 +60,8 @@ struct ParticlesPreset : public Serializable {
ParticleSpawnShape spawnShape = ParticleSpawnShape::BALL; ParticleSpawnShape spawnShape = ParticleSpawnShape::BALL;
/// @brief Spawn spread /// @brief Spawn spread
glm::vec3 spawnSpread {}; glm::vec3 spawnSpread {};
/// @brief Particles spawn zone offset
glm::vec3 spawnOffset {};
/// @brief Texture name /// @brief Texture name
std::string texture = ""; std::string texture = "";
/// @brief Size of random sub-uv region /// @brief Size of random sub-uv region