mirror of
https://github.com/celisej567/mcpe.git
synced 2025-12-31 17:49:17 +03:00
120 lines
3.1 KiB
C++
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;
|
|
}
|
|
}
|