Added rotation and size decay support for particles
This commit is contained in:
parent
aa0c9d08e0
commit
b8a2e206f7
|
@ -157,7 +157,7 @@
|
||||||
Scale: {x: 1, y: 1, z: 1}
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
IsActive: true
|
IsActive: true
|
||||||
classSHADE::SHParticleEmitterComponent:
|
classSHADE::SHParticleEmitterComponent:
|
||||||
Emission Count: 7
|
Emission Count: 15
|
||||||
Is Passive: true
|
Is Passive: true
|
||||||
Emission Interval: 0.0939999968
|
Emission Interval: 0.0939999968
|
||||||
Min Life: 2
|
Min Life: 2
|
||||||
|
@ -166,8 +166,11 @@
|
||||||
Maximum Speed: 6
|
Maximum Speed: 6
|
||||||
Minimum Size: 0
|
Minimum Size: 0
|
||||||
Maximum Size: 0.5
|
Maximum Size: 0.5
|
||||||
|
Size Decay: 0.990999997
|
||||||
Angular Ranges And Offset: {x: 6.19999981, y: 1.10000002, z: 0, w: 0.100000001}
|
Angular Ranges And Offset: {x: 6.19999981, y: 1.10000002, z: 0, w: 0.100000001}
|
||||||
Rotation Speed: 0
|
Rotation Speed: 0.0309999995
|
||||||
Texture Asset ID: 63456868
|
Rotation Decay: 0.0199999996
|
||||||
|
Texture Asset ID: 0
|
||||||
|
Custom Update Shader Asset ID: 0
|
||||||
IsActive: true
|
IsActive: true
|
||||||
Scripts: ~
|
Scripts: ~
|
|
@ -10,8 +10,11 @@ struct EmitterParameters
|
||||||
float minSpeed;
|
float minSpeed;
|
||||||
float maxSpeed;
|
float maxSpeed;
|
||||||
float rotationSpeed;
|
float rotationSpeed;
|
||||||
uint textureIndex;
|
float rotationDecay;
|
||||||
vec4 lifeAndSizeRange; // min life, max life, min size, max size
|
vec4 lifeAndSizeRange; // min life, max life, min size, max size
|
||||||
|
float sizeDecay;
|
||||||
|
uint textureIndex;
|
||||||
|
float padding[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ParticleData
|
struct ParticleData
|
||||||
|
@ -165,14 +168,16 @@ void main()
|
||||||
|
|
||||||
// Set size of particle
|
// Set size of particle
|
||||||
particle.scaleAndDecay.x = particleSize;
|
particle.scaleAndDecay.x = particleSize;
|
||||||
particle.scaleAndDecay.z = particleSize;
|
particle.scaleAndDecay.y = particleSize;
|
||||||
|
particle.scaleAndDecay.z = emitterParams.data.sizeDecay;
|
||||||
|
particle.scaleAndDecay.w = emitterParams.data.sizeDecay;
|
||||||
|
|
||||||
// Set the texture for the particle
|
// Set the texture for the particle
|
||||||
particle.textureIndex = emitterParams.data.textureIndex;
|
particle.textureIndex = emitterParams.data.textureIndex;
|
||||||
|
|
||||||
// Set orientation and rotation speed
|
// Set orientation and rotation speed
|
||||||
if (emitterParams.data.rotationSpeed != 0.0f)
|
if (emitterParams.data.rotationSpeed != 0.0f)
|
||||||
particle.orientationSpeedDecay = vec4 (rand(seed) * PI, emitterParams.data.rotationSpeed, 0.0f, 0.0f);
|
particle.orientationSpeedDecay = vec4 (rand(seed) * PI, emitterParams.data.rotationSpeed, emitterParams.data.rotationDecay, 0.0f);
|
||||||
else
|
else
|
||||||
particle.orientationSpeedDecay = vec4 (0.0f);
|
particle.orientationSpeedDecay = vec4 (0.0f);
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -123,7 +123,15 @@ void main()
|
||||||
particle.velocity += particle.acceleration;
|
particle.velocity += particle.acceleration;
|
||||||
particle.life -= genericDataBuffer.data.dt;
|
particle.life -= genericDataBuffer.data.dt;
|
||||||
particle.orientationSpeedDecay.x += particle.orientationSpeedDecay.y;
|
particle.orientationSpeedDecay.x += particle.orientationSpeedDecay.y;
|
||||||
particle.orientationSpeedDecay.y -= particle.orientationSpeedDecay.z * genericDataBuffer.data.dt;
|
particle.scaleAndDecay.x *= particle.scaleAndDecay.z;
|
||||||
|
particle.scaleAndDecay.y *= particle.scaleAndDecay.w;
|
||||||
|
|
||||||
|
if (particle.orientationSpeedDecay.y > 0.0f)
|
||||||
|
{
|
||||||
|
particle.orientationSpeedDecay.y -= particle.orientationSpeedDecay.z * genericDataBuffer.data.dt;
|
||||||
|
if (particle.orientationSpeedDecay.y < 0.0f)
|
||||||
|
particle.orientationSpeedDecay.y = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (particle.life < 0.0f || particle.scaleAndDecay.x < 0.0f || particle.scaleAndDecay.y < 0.0f)
|
if (particle.life < 0.0f || particle.scaleAndDecay.x < 0.0f || particle.scaleAndDecay.y < 0.0f)
|
||||||
{
|
{
|
||||||
|
|
Binary file not shown.
|
@ -81,7 +81,7 @@ void main()
|
||||||
vec3 normalized = normalize (particle.velocity.xyz);
|
vec3 normalized = normalize (particle.velocity.xyz);
|
||||||
float angle = particle.orientationSpeedDecay.x;
|
float angle = particle.orientationSpeedDecay.x;
|
||||||
// float angle = atan (normalized.y, normalized.x);
|
// float angle = atan (normalized.y, normalized.x);
|
||||||
vec2 particleScaleData = particle.scaleAndDecay.xz; // x and y
|
vec2 particleScaleData = particle.scaleAndDecay.xy; // x and y
|
||||||
|
|
||||||
mat3 rotate = mat3 (1.0f);
|
mat3 rotate = mat3 (1.0f);
|
||||||
rotate[0][0] = cos(angle);
|
rotate[0][0] = cos(angle);
|
||||||
|
|
Binary file not shown.
|
@ -830,6 +830,7 @@ namespace SHADE
|
||||||
SHEditorWidgets::DragFloat("Max Life", [comp = component]() {return comp->GetMaxLife(); }, [comp = component](float val) {comp->SetMaxLife(val); });
|
SHEditorWidgets::DragFloat("Max Life", [comp = component]() {return comp->GetMaxLife(); }, [comp = component](float val) {comp->SetMaxLife(val); });
|
||||||
SHEditorWidgets::DragFloat("Min Size", [comp = component]() {return comp->GetMinSize(); }, [comp = component](float val) {comp->SetMinSize(val); });
|
SHEditorWidgets::DragFloat("Min Size", [comp = component]() {return comp->GetMinSize(); }, [comp = component](float val) {comp->SetMinSize(val); });
|
||||||
SHEditorWidgets::DragFloat("Max Size", [comp = component]() {return comp->GetMaxSize(); }, [comp = component](float val) {comp->SetMaxSize(val); });
|
SHEditorWidgets::DragFloat("Max Size", [comp = component]() {return comp->GetMaxSize(); }, [comp = component](float val) {comp->SetMaxSize(val); });
|
||||||
|
SHEditorWidgets::DragFloat("Size Decay", [comp = component]() {return comp->GetSizeDecayMult(); }, [comp = component](float val) {comp->SetSizeDecayMult(val); }, {}, 0.0001f);
|
||||||
|
|
||||||
SHEditorWidgets::DragVec4("Angles and Offsets", {"yaw", "bank", "yaw off", "bank off"},
|
SHEditorWidgets::DragVec4("Angles and Offsets", {"yaw", "bank", "yaw off", "bank off"},
|
||||||
[comp = component]()
|
[comp = component]()
|
||||||
|
@ -872,6 +873,16 @@ namespace SHADE
|
||||||
comp->SetRotationSpeed(val);
|
comp->SetRotationSpeed(val);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
SHEditorWidgets::DragFloat("Rotation Decay",
|
||||||
|
[comp = component]()
|
||||||
|
{
|
||||||
|
return comp->GetRotationDecay();
|
||||||
|
},
|
||||||
|
[comp = component](float val)
|
||||||
|
{
|
||||||
|
comp->SetRotationDecay(val);
|
||||||
|
});
|
||||||
|
|
||||||
SHEditorWidgets::DragInt("Texture Index",
|
SHEditorWidgets::DragInt("Texture Index",
|
||||||
[comp = component]()
|
[comp = component]()
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,6 +67,11 @@ namespace SHADE
|
||||||
cpuEmitterData.rotationSpeed = speed;
|
cpuEmitterData.rotationSpeed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHParticleEmitterComponent::SetRotationDecay(float decay) noexcept
|
||||||
|
{
|
||||||
|
cpuEmitterData.rotationDecay = decay;
|
||||||
|
}
|
||||||
|
|
||||||
void SHParticleEmitterComponent::SetTextureIndex(uint32_t index) noexcept
|
void SHParticleEmitterComponent::SetTextureIndex(uint32_t index) noexcept
|
||||||
{
|
{
|
||||||
cpuEmitterData.textureIndex = index;
|
cpuEmitterData.textureIndex = index;
|
||||||
|
@ -92,6 +97,11 @@ namespace SHADE
|
||||||
cpuEmitterData.lifeAndSizeRange.w = size;
|
cpuEmitterData.lifeAndSizeRange.w = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHParticleEmitterComponent::SetSizeDecayMult(float decay) noexcept
|
||||||
|
{
|
||||||
|
cpuEmitterData.sizeDecayMult = decay;
|
||||||
|
}
|
||||||
|
|
||||||
void SHParticleEmitterComponent::SetCustomUpdateShader(Handle<SHVkShaderModule> shaderModule) noexcept
|
void SHParticleEmitterComponent::SetCustomUpdateShader(Handle<SHVkShaderModule> shaderModule) noexcept
|
||||||
{
|
{
|
||||||
customUpdateShader = shaderModule;
|
customUpdateShader = shaderModule;
|
||||||
|
@ -143,6 +153,11 @@ namespace SHADE
|
||||||
return cpuEmitterData.rotationSpeed;
|
return cpuEmitterData.rotationSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float SHParticleEmitterComponent::GetRotationDecay(void) const noexcept
|
||||||
|
{
|
||||||
|
return cpuEmitterData.rotationDecay;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t SHParticleEmitterComponent::GetTextureIndex(void) const noexcept
|
uint32_t SHParticleEmitterComponent::GetTextureIndex(void) const noexcept
|
||||||
{
|
{
|
||||||
return cpuEmitterData.textureIndex;
|
return cpuEmitterData.textureIndex;
|
||||||
|
@ -169,6 +184,11 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float SHParticleEmitterComponent::GetSizeDecayMult(void) const noexcept
|
||||||
|
{
|
||||||
|
return cpuEmitterData.sizeDecayMult;
|
||||||
|
}
|
||||||
|
|
||||||
Handle<SHVkShaderModule> SHParticleEmitterComponent::GetCustomUpdateShader(void) const noexcept
|
Handle<SHVkShaderModule> SHParticleEmitterComponent::GetCustomUpdateShader(void) const noexcept
|
||||||
{
|
{
|
||||||
return customUpdateShader;
|
return customUpdateShader;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Resource/SHHandle.h"
|
#include "Resource/SHHandle.h"
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
#include "Math/Vector/SHVec4.h"
|
#include "Math/Vector/SHVec4.h"
|
||||||
#include "ECS_Base/Components/SHComponent.h"
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
||||||
|
@ -32,11 +33,21 @@ namespace SHADE
|
||||||
//! Rotational speed of the quad
|
//! Rotational speed of the quad
|
||||||
float rotationSpeed;
|
float rotationSpeed;
|
||||||
|
|
||||||
//! Texture used by the particle
|
//! Rotation decay rate
|
||||||
uint32_t textureIndex;
|
float rotationDecay;
|
||||||
|
|
||||||
//! Spawn lifetime and size range (min and max)
|
//! Spawn lifetime and size range (min and max)
|
||||||
SHVec4 lifeAndSizeRange;
|
SHVec4 lifeAndSizeRange;
|
||||||
|
|
||||||
|
//! Size decay for particles
|
||||||
|
float sizeDecayMult;
|
||||||
|
|
||||||
|
//! Texture used by the particle
|
||||||
|
uint32_t textureIndex;
|
||||||
|
|
||||||
|
//! Padding for the shader struct
|
||||||
|
float padding[2];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GPUParticleStruct
|
struct GPUParticleStruct
|
||||||
|
@ -139,9 +150,11 @@ namespace SHADE
|
||||||
void SetMinSpeed (float speed) noexcept;
|
void SetMinSpeed (float speed) noexcept;
|
||||||
void SetMaxSpeed (float speed) noexcept;
|
void SetMaxSpeed (float speed) noexcept;
|
||||||
void SetRotationSpeed (float speed) noexcept;
|
void SetRotationSpeed (float speed) noexcept;
|
||||||
|
void SetRotationDecay (float decay) noexcept;
|
||||||
void SetTextureIndex (uint32_t index) noexcept;
|
void SetTextureIndex (uint32_t index) noexcept;
|
||||||
void SetMinSize (float size) noexcept;
|
void SetMinSize (float size) noexcept;
|
||||||
void SetMaxSize (float size) noexcept;
|
void SetMaxSize (float size) noexcept;
|
||||||
|
void SetSizeDecayMult (float decay) noexcept;
|
||||||
void SetCustomUpdateShader (Handle<SHVkShaderModule> shaderModule) noexcept;
|
void SetCustomUpdateShader (Handle<SHVkShaderModule> shaderModule) noexcept;
|
||||||
|
|
||||||
uint32_t GetEmissionCount (void) const noexcept;
|
uint32_t GetEmissionCount (void) const noexcept;
|
||||||
|
@ -153,9 +166,11 @@ namespace SHADE
|
||||||
float GetMinSpeed (void) const noexcept;
|
float GetMinSpeed (void) const noexcept;
|
||||||
float GetMaxSpeed (void) const noexcept;
|
float GetMaxSpeed (void) const noexcept;
|
||||||
float GetRotationSpeed (void) const noexcept;
|
float GetRotationSpeed (void) const noexcept;
|
||||||
|
float GetRotationDecay (void) const noexcept;
|
||||||
uint32_t GetTextureIndex (void) const noexcept;
|
uint32_t GetTextureIndex (void) const noexcept;
|
||||||
float GetMinSize (void) const noexcept;
|
float GetMinSize (void) const noexcept;
|
||||||
float GetMaxSize (void) const noexcept;
|
float GetMaxSize (void) const noexcept;
|
||||||
|
float GetSizeDecayMult (void) const noexcept;
|
||||||
Handle<SHVkShaderModule> GetCustomUpdateShader (void) const noexcept;
|
Handle<SHVkShaderModule> GetCustomUpdateShader (void) const noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -512,9 +512,11 @@ namespace YAML
|
||||||
static constexpr std::string_view ANGULAR_RANGES_OFFSET_TAG = "Angular Ranges And Offset";
|
static constexpr std::string_view ANGULAR_RANGES_OFFSET_TAG = "Angular Ranges And Offset";
|
||||||
static constexpr std::string_view MIN_SIZE_TAG = "Minimum Size";
|
static constexpr std::string_view MIN_SIZE_TAG = "Minimum Size";
|
||||||
static constexpr std::string_view MAX_SIZE_TAG = "Maximum Size";
|
static constexpr std::string_view MAX_SIZE_TAG = "Maximum Size";
|
||||||
|
static constexpr std::string_view SIZE_DECAY_TAG = "Size Decay";
|
||||||
static constexpr std::string_view MIN_SPEED_TAG = "Minimum Speed";
|
static constexpr std::string_view MIN_SPEED_TAG = "Minimum Speed";
|
||||||
static constexpr std::string_view MAX_SPEED_TAG = "Maximum Speed";
|
static constexpr std::string_view MAX_SPEED_TAG = "Maximum Speed";
|
||||||
static constexpr std::string_view ROTATION_SPEED_TAG = "Rotation Speed";
|
static constexpr std::string_view ROTATION_SPEED_TAG = "Rotation Speed";
|
||||||
|
static constexpr std::string_view ROTATION_DECAY_TAG = "Rotation Decay";
|
||||||
static constexpr std::string_view TEXTURE_ASSET_ID_TAG = "Texture Asset ID";
|
static constexpr std::string_view TEXTURE_ASSET_ID_TAG = "Texture Asset ID";
|
||||||
static constexpr std::string_view CUSTOM_UPDATE_SHADER_ASSET_ID_TAG = "Custom Update Shader Asset ID";
|
static constexpr std::string_view CUSTOM_UPDATE_SHADER_ASSET_ID_TAG = "Custom Update Shader Asset ID";
|
||||||
|
|
||||||
|
@ -530,8 +532,10 @@ namespace YAML
|
||||||
node[MAX_SPEED_TAG.data()] = rhs.GetMaxSpeed();
|
node[MAX_SPEED_TAG.data()] = rhs.GetMaxSpeed();
|
||||||
node[MIN_SIZE_TAG.data()] = rhs.GetMinSize();
|
node[MIN_SIZE_TAG.data()] = rhs.GetMinSize();
|
||||||
node[MAX_SIZE_TAG.data()] = rhs.GetMaxSize();
|
node[MAX_SIZE_TAG.data()] = rhs.GetMaxSize();
|
||||||
|
node[SIZE_DECAY_TAG.data()] = rhs.GetSizeDecayMult();
|
||||||
node[ANGULAR_RANGES_OFFSET_TAG.data()] = rhs.GetAngularRangesAndOffsets();
|
node[ANGULAR_RANGES_OFFSET_TAG.data()] = rhs.GetAngularRangesAndOffsets();
|
||||||
node[ROTATION_SPEED_TAG.data()] = rhs.GetRotationSpeed();
|
node[ROTATION_SPEED_TAG.data()] = rhs.GetRotationSpeed();
|
||||||
|
node[ROTATION_DECAY_TAG.data()] = rhs.GetRotationDecay();
|
||||||
node[TEXTURE_ASSET_ID_TAG.data()] = rhs.GetTextureAssetID();
|
node[TEXTURE_ASSET_ID_TAG.data()] = rhs.GetTextureAssetID();
|
||||||
node[CUSTOM_UPDATE_SHADER_ASSET_ID_TAG.data()] = rhs.GetCustomUpdateShaderAssetID();
|
node[CUSTOM_UPDATE_SHADER_ASSET_ID_TAG.data()] = rhs.GetCustomUpdateShaderAssetID();
|
||||||
|
|
||||||
|
@ -556,6 +560,9 @@ namespace YAML
|
||||||
if (node[MAX_LIFE_TAG.data()].IsDefined())
|
if (node[MAX_LIFE_TAG.data()].IsDefined())
|
||||||
rhs.SetMaxLife(node[MAX_LIFE_TAG.data()].as<float>());
|
rhs.SetMaxLife(node[MAX_LIFE_TAG.data()].as<float>());
|
||||||
|
|
||||||
|
if (node[SIZE_DECAY_TAG.data()].IsDefined())
|
||||||
|
rhs.SetSizeDecayMult(node[SIZE_DECAY_TAG.data()].as<float>());
|
||||||
|
|
||||||
if (node[ANGULAR_RANGES_OFFSET_TAG.data()].IsDefined())
|
if (node[ANGULAR_RANGES_OFFSET_TAG.data()].IsDefined())
|
||||||
rhs.SetAngularRangesAndOffsets(node[ANGULAR_RANGES_OFFSET_TAG.data()].as<SHVec4>());
|
rhs.SetAngularRangesAndOffsets(node[ANGULAR_RANGES_OFFSET_TAG.data()].as<SHVec4>());
|
||||||
|
|
||||||
|
@ -571,6 +578,10 @@ namespace YAML
|
||||||
if (node[ROTATION_SPEED_TAG.data()].IsDefined())
|
if (node[ROTATION_SPEED_TAG.data()].IsDefined())
|
||||||
rhs.SetRotationSpeed(node[ROTATION_SPEED_TAG.data()].as<float>());
|
rhs.SetRotationSpeed(node[ROTATION_SPEED_TAG.data()].as<float>());
|
||||||
|
|
||||||
|
if (node[ROTATION_DECAY_TAG.data()].IsDefined())
|
||||||
|
rhs.SetRotationDecay(node[ROTATION_DECAY_TAG.data()].as<float>());
|
||||||
|
|
||||||
|
|
||||||
if (node[TEXTURE_ASSET_ID_TAG.data()].IsDefined())
|
if (node[TEXTURE_ASSET_ID_TAG.data()].IsDefined())
|
||||||
{
|
{
|
||||||
AssetID id = node[TEXTURE_ASSET_ID_TAG.data()].as<AssetID>();
|
AssetID id = node[TEXTURE_ASSET_ID_TAG.data()].as<AssetID>();
|
||||||
|
|
Loading…
Reference in New Issue