Files
mcpe/source/world/particle/TerrainParticle.cpp
Brent afe875e4fa iOS Support (#113)
undefined
2024-01-22 17:22:41 +02:00

81 lines
2.5 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"
#include "world/level/Level.hpp"
void TerrainParticle::_init(Tile* tile)
{
m_pTile = tile;
field_DC = tile->m_TextureFrame;
field_F4 = tile->field_28;
field_100 = 0.6f;
field_FC = 0.6f;
field_F8 = 0.6f;
field_F0 *= 0.5f;
}
TerrainParticle::TerrainParticle(Level* level, float x, float y, float z, Tile* tile) :
Particle(level, x, y, z, 0.0f, 0.0f, 0.0f)
{
_init(tile);
}
TerrainParticle::TerrainParticle(Level* level, float x, float y, float z, float vx, float vy, float vz, Tile* tile) :
Particle(level, x, y, z, vx, vy, vz)
{
_init(tile);
}
TerrainParticle* TerrainParticle::init(int x, int y, int z)
{
if (m_pTile == Tile::grass)
return this;
int color = m_pTile->getColor(m_pLevel, x, y, z);
field_F8 *= float(GET_RED(color)) / 255.0f;
field_FC *= float(GET_GREEN(color)) / 255.0f;
field_100 *= float(GET_BLUE(color)) / 255.0f;
return this;
}
int TerrainParticle::getParticleTexture()
{
return PT_TERRAIN;
}
void TerrainParticle::render(Tesselator& t, float f, float a4, float a5, float a6, float a7, float a8)
{
constexpr float C_MAGIC_1 = 0.015609f; // @BUG: Slightly bigger than 1/64.0f
int texture = field_DC;
int texX = texture % 16;
if (texture < 0)
texture += 15;
float texU_1 = (float(texX) + 0.25f * field_E0) / 16.0f;
float texV_1 = (float(texture >> 4) + 0.25f * field_E4) / 16.0f;
float posX = Mth::Lerp(field_3C.x, m_pos.x, f) - xOff;
float posY = Mth::Lerp(field_3C.y, m_pos.y, f) - yOff;
float posZ = Mth::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);
}