Fix sky particles rendering in vulkan
Align them with the vertical axis
This commit is contained in:
parent
cfb10dbb1f
commit
5ecdc11ffd
@ -105,7 +105,7 @@ std::vector<float> g_flips_data;
|
|||||||
void ObjectData::init(const irr::scene::SParticle& particle, int material_id,
|
void ObjectData::init(const irr::scene::SParticle& particle, int material_id,
|
||||||
const btQuaternion& rotation,
|
const btQuaternion& rotation,
|
||||||
const irr::core::vector3df& view_position, bool flips,
|
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);
|
memcpy(&m_translation_x, &particle.pos, sizeof(float) * 3);
|
||||||
float scale_x = particle.size.Width / 2.0f;
|
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;
|
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
|
else
|
||||||
memcpy(m_rotation, &rotation[0], sizeof(btQuaternion));
|
memcpy(m_rotation, &rotation[0], sizeof(btQuaternion));
|
||||||
m_scale_x = scale_x;
|
m_scale_x = scale_x;
|
||||||
@ -505,11 +515,12 @@ start:
|
|||||||
}
|
}
|
||||||
ObjectData* obj = (ObjectData*)mapped_addr;
|
ObjectData* obj = (ObjectData*)mapped_addr;
|
||||||
bool flips = pn->getFlips();
|
bool flips = pn->getFlips();
|
||||||
|
bool sky_particle = pn->isSkyParticle();
|
||||||
for (unsigned i = 0; i < ps; i++)
|
for (unsigned i = 0; i < ps; i++)
|
||||||
{
|
{
|
||||||
obj[i].init(particles[i], material_id,
|
obj[i].init(particles[i], material_id,
|
||||||
m_billboard_rotation, m_view_position, flips,
|
m_billboard_rotation, m_view_position, flips,
|
||||||
settings.m_backface_culling);
|
sky_particle, settings.m_backface_culling);
|
||||||
written_size += sizeof(ObjectData);
|
written_size += sizeof(ObjectData);
|
||||||
mapped_addr += sizeof(ObjectData);
|
mapped_addr += sizeof(ObjectData);
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ struct ObjectData
|
|||||||
void init(const irr::scene::SParticle& particle, int material_id,
|
void init(const irr::scene::SParticle& particle, int material_id,
|
||||||
const btQuaternion& rotation,
|
const btQuaternion& rotation,
|
||||||
const irr::core::vector3df& view_position, bool flips,
|
const irr::core::vector3df& view_position, bool flips,
|
||||||
bool backface_culling);
|
bool sky_particle, bool backface_culling);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PipelineSettings
|
struct PipelineSettings
|
||||||
|
@ -506,6 +506,7 @@ public:
|
|||||||
|
|
||||||
virtual core::array<SParticle>& getParticles() = 0;
|
virtual core::array<SParticle>& getParticles() = 0;
|
||||||
virtual bool getFlips() const { return false; }
|
virtual bool getFlips() const { return false; }
|
||||||
|
virtual bool isSkyParticle() const { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace scene
|
} // end namespace scene
|
||||||
|
@ -160,6 +160,8 @@ public:
|
|||||||
assert(m_flips_buffer != 0);
|
assert(m_flips_buffer != 0);
|
||||||
return m_flips_buffer;
|
return m_flips_buffer;
|
||||||
}
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
virtual bool isSkyParticle() const { return m_hm != NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user