Files
mcpe/source/world/particle/Particle.cpp

120 lines
3.1 KiB
C++

/********************************************************************
Minecraft: Pocket Edition - Decompilation Project
Copyright (C) 2023 iProgramInCpp
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#include "Particle.hpp"
float Particle::xOff, Particle::yOff, Particle::zOff;
void Particle::_init()
{
field_DC = 0;
field_E0 = 0.0f;
field_E4 = 0.0f;
field_E8 = 0;
field_EC = 0;
field_F0 = 0.0f;
field_F4 = 0.0f;
field_F8 = 1.0f;
field_FC = 1.0f;
field_100 = 1.0f;
}
Particle::Particle(Level* level, float x, float y, float z, float vx, float vy, float vz) : Entity(level)
{
_init();
setSize(0.2f, 0.2f);
field_84 = 0.5f * field_8C;
setPos(x, y, z);
m_vel.x = vx + 0.4f * (2.0f * Mth::random() - 1.0f);
m_vel.y = vy + 0.4f * (2.0f * Mth::random() - 1.0f);
m_vel.z = vz + 0.4f * (2.0f * Mth::random() - 1.0f);
float mult = 0.4f * 0.15f * (Mth::random() + Mth::random() + 1.0f) / Mth::sqrt(m_vel.x * m_vel.x + m_vel.y * m_vel.y + m_vel.z * m_vel.z);
m_vel.x *= mult;
m_vel.y = m_vel.y * mult + 0.1f;
m_vel.z *= mult;
field_E0 = 3.0f * sharedRandom.nextFloat();
field_E4 = 3.0f * sharedRandom.nextFloat();
field_F0 = 2.0f * (0.5f + 0.5f * sharedRandom.nextFloat());
field_EC = int(4.0f / (0.1f + 0.9f * sharedRandom.nextFloat()));
}
int Particle::getParticleTexture()
{
return PT_PARTICLES;
}
Particle* Particle::scale(float f)
{
setSize(0.2f * f, 0.2f * f);
field_F0 *= f;
return this;
}
Particle* Particle::setPower(float f)
{
m_vel.x *= f;
m_vel.y = (m_vel.y - 0.1f) * f + 0.1f;
m_vel.z *= f;
return this;
}
void Particle::render(Tesselator& t, float f, float a4, float a5, float a6, float a7, float a8)
{
constexpr float C_MAGIC_1 = 0.062438f; // @BUG: Slightly bigger than 1/16.0f
int texture = field_DC;
int texX = texture % 16;
if (texture < 0)
texture += 15;
float texU_1 = float(texX) / 16.0f;
float texV_1 = float(texture >> 4) / 16.0f;
float posX = Lerp(field_3C.x, m_pos.x, f) - xOff;
float posY = Lerp(field_3C.y, m_pos.y, f) - yOff;
float posZ = Lerp(field_3C.z, m_pos.z, f) - zOff;
float fBright = getBrightness(f);
float sizeX = a4 * field_F0 * 0.1f;
float sizeY = a5 * field_F0 * 0.1f;
float sizeZ = a6 * field_F0 * 0.1f;
float siz2X = a7 * field_F0 * 0.1f;
float siz2Z = a8 * field_F0 * 0.1f;
t.color(field_F8 * fBright, field_FC * fBright, field_100 * fBright);
t.vertexUV(posX - sizeX - siz2X, posY - sizeY, posZ - sizeZ - siz2Z, texU_1 + C_MAGIC_1, texV_1 + C_MAGIC_1);
t.vertexUV(posX - sizeX + siz2X, posY + sizeY, posZ - sizeZ + siz2Z, texU_1 + C_MAGIC_1, texV_1);
t.vertexUV(posX + sizeX + siz2X, posY + sizeY, posZ + sizeZ + siz2Z, texU_1, texV_1);
t.vertexUV(posX + sizeX - siz2X, posY - sizeY, posZ + sizeZ - siz2Z, texU_1, texV_1 + C_MAGIC_1);
}
void Particle::tick()
{
field_3C = m_pos;
field_E8++;
if (field_E8 >= field_EC)
remove();
m_vel.y -= field_F4 * 0.04f;
move(m_vel.x, m_vel.y, m_vel.z);
m_vel.x *= 0.98f;
m_vel.y *= 0.98f;
m_vel.z *= 0.98f;
if (field_7C)
{
m_vel.x *= 0.7f;
m_vel.z *= 0.7f;
}
}