mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-06 20:13:10 +02:00
More particle work
This commit is contained in:
parent
2dd494b5df
commit
9c5486fb4b
2 changed files with 12 additions and 52 deletions
|
@ -26,16 +26,15 @@
|
|||
|
||||
static const size_t VERTEX_PER_PARTICLE = 4;
|
||||
|
||||
template<typename T>
|
||||
struct InterpolationData {
|
||||
T start;
|
||||
T middle;
|
||||
T finish;
|
||||
T spread;
|
||||
};
|
||||
|
||||
class ParticlePayloadData {
|
||||
public:
|
||||
template<typename T>
|
||||
struct InterpolationData {
|
||||
T start;
|
||||
T middle;
|
||||
T finish;
|
||||
T spread;
|
||||
};
|
||||
struct ParticleUniforms {
|
||||
InterpolationData<float> radius;
|
||||
InterpolationData<glm::vec4> color; // rgba
|
||||
|
@ -207,19 +206,17 @@ void RenderableParticleEffectEntityItem::updateRenderItem() {
|
|||
using ParticleUniforms = ParticlePayloadData::ParticleUniforms;
|
||||
using ParticlePrimitive = ParticlePayloadData::ParticlePrimitive;
|
||||
using ParticlePrimitives = ParticlePayloadData::ParticlePrimitives;
|
||||
|
||||
ParticleUniforms particleUniforms;
|
||||
|
||||
// Fill in Uniforms structure
|
||||
ParticleUniforms particleUniforms;
|
||||
particleUniforms.radius.start = getRadiusStart();
|
||||
particleUniforms.radius.middle = getParticleRadius();
|
||||
particleUniforms.radius.finish = getRadiusFinish();
|
||||
particleUniforms.radius.spread = getRadiusSpread();
|
||||
|
||||
particleUniforms.color.start = toGlm(getColorStart(), getAlphaStart());
|
||||
particleUniforms.color.middle = toGlm(getXColor(), getAlpha());
|
||||
particleUniforms.color.finish = toGlm(getColorFinish(), getAlphaFinish());
|
||||
particleUniforms.color.spread = toGlm(getColorSpread(), getAlphaSpread());
|
||||
|
||||
particleUniforms.lifespan = getLifespan();
|
||||
|
||||
// Build particle primitives
|
||||
|
@ -254,8 +251,7 @@ void RenderableParticleEffectEntityItem::updateRenderItem() {
|
|||
payload.setModelTransform(transform);
|
||||
payload.setBound(bounds);
|
||||
|
||||
bool textured = _texture && _texture->isLoaded();
|
||||
if (textured) {
|
||||
if (_texture && _texture->isLoaded()) {
|
||||
payload.setTexture(_texture->getGPUTexture());
|
||||
payload.setPipeline(_texturedPipeline);
|
||||
} else {
|
||||
|
|
|
@ -61,43 +61,7 @@ float interpolate3Floats(float y1, float y2, float y3, float u) {
|
|||
// Flat line.
|
||||
return y2;
|
||||
}
|
||||
|
||||
if ((y2 >= y1 && y2 >= y3) || (y2 <= y1 && y2 <= y3)) {
|
||||
// U or inverted-U shape.
|
||||
// Make the slope at y2 = 0, which means that the control points half way between the value points have the value y2.
|
||||
if (u <= 0.5) {
|
||||
return bezierInterpolate(y1, y2, y2, 2.0 * u);
|
||||
} else {
|
||||
return bezierInterpolate(y2, y2, y3, 2.0 * u - 1.0);
|
||||
}
|
||||
|
||||
} else {
|
||||
// L or inverted and/or mirrored L shape.
|
||||
// Make the slope at y2 be the slope between y1 and y3, up to a maximum of double the minimum of the slopes between y1
|
||||
// and y2, and y2 and y3. Use this slope to calculate the control points half way between the value points.
|
||||
// Note: The maximum ensures that the control points and therefore the interpolated values stay between y1 and y3.
|
||||
float slope = y3 - y1;
|
||||
float slope12 = y2 - y1;
|
||||
float slope23 = y3 - y2;
|
||||
if (abs(slope) > abs(2.0 * slope12)) {
|
||||
slope = 2.0 * slope12;
|
||||
} else if (abs(slope) > abs(2.0 * slope23)) {
|
||||
slope = 2.0 * slope23;
|
||||
}
|
||||
|
||||
if (u <= 0.5) {
|
||||
return bezierInterpolate(y1, y2 - slope / 2.0, y2, 2.0 * u);
|
||||
} else {
|
||||
return bezierInterpolate(y2, y2 + slope / 2.0, y3, 2.0 * u - 1.0);
|
||||
}
|
||||
|
||||
// float uGreaterHalf = step(0.5, u);
|
||||
// float uSign = sign(uGreaterHalf - 0.5);
|
||||
// vec4 y12 = mix(y1, y2, uGreaterHalf)
|
||||
// vec4 y23 = mix(y2, y3, uGreaterHalf)
|
||||
//
|
||||
// return bezierInterpolate(y12, y2 + uSign * slope / 2.0, y23, 2.0 * u - uGreaterHalf);
|
||||
}
|
||||
return bezierInterpolate(y1, y2, y3, u);
|
||||
}
|
||||
|
||||
vec4 interpolate3Vec4(vec4 y1, vec4 y2, vec4 y3, float u) {
|
||||
|
@ -116,7 +80,7 @@ void main(void) {
|
|||
int particleID = gl_VertexID / NUM_VERTICES_PER_PARTICLE;
|
||||
// Which quad vertex pos?
|
||||
int twoTriID = gl_VertexID - particleID * NUM_VERTICES_PER_PARTICLE;
|
||||
|
||||
|
||||
// Particle properties
|
||||
float age = inColor.x / particle.lifespan;
|
||||
float seed = inColor.y;
|
||||
|
|
Loading…
Reference in a new issue