Fix sky particles rendering in vulkan

Align them with the vertical axis
This commit is contained in:
Benau 2022-10-16 12:08:02 +08:00
parent cfb10dbb1f
commit 5ecdc11ffd
4 changed files with 17 additions and 3 deletions

View File

@ -105,7 +105,7 @@ std::vector<float> g_flips_data;
void ObjectData::init(const irr::scene::SParticle& particle, int material_id,
const btQuaternion& rotation,
const irr::core::vector3df& view_position, bool flips,
bool backface_culling)
bool sky_particle, bool backface_culling)
{
memcpy(&m_translation_x, &particle.pos, sizeof(float) * 3);
float scale_x = particle.size.Width / 2.0f;
@ -152,6 +152,16 @@ void ObjectData::init(const irr::scene::SParticle& particle, int material_id,
scale_x = -scale_x;
}
}
else if (sky_particle)
{
irr::core::vector3df diff = particle.pos - view_position;
float angle = atan2f(diff.X, diff.Z);
btQuaternion rotated(btVector3(0.0f, 1.0f, 0.0f), angle);
rotated.normalize();
// Conjugated quaternion in glsl
rotated[3] = -rotated[3];
memcpy(m_rotation, &rotated[0], sizeof(btQuaternion));
}
else
memcpy(m_rotation, &rotation[0], sizeof(btQuaternion));
m_scale_x = scale_x;
@ -505,11 +515,12 @@ start:
}
ObjectData* obj = (ObjectData*)mapped_addr;
bool flips = pn->getFlips();
bool sky_particle = pn->isSkyParticle();
for (unsigned i = 0; i < ps; i++)
{
obj[i].init(particles[i], material_id,
m_billboard_rotation, m_view_position, flips,
settings.m_backface_culling);
sky_particle, settings.m_backface_culling);
written_size += sizeof(ObjectData);
mapped_addr += sizeof(ObjectData);
}

View File

@ -62,7 +62,7 @@ struct ObjectData
void init(const irr::scene::SParticle& particle, int material_id,
const btQuaternion& rotation,
const irr::core::vector3df& view_position, bool flips,
bool backface_culling);
bool sky_particle, bool backface_culling);
};
struct PipelineSettings

View File

@ -506,6 +506,7 @@ public:
virtual core::array<SParticle>& getParticles() = 0;
virtual bool getFlips() const { return false; }
virtual bool isSkyParticle() const { return false; }
};
} // end namespace scene

View File

@ -160,6 +160,8 @@ public:
assert(m_flips_buffer != 0);
return m_flips_buffer;
}
// ------------------------------------------------------------------------
virtual bool isSkyParticle() const { return m_hm != NULL; }
};
#endif