mirror of
https://github.com/celisej567/mcpe.git
synced 2026-01-04 14:09:47 +03:00
81 lines
2.5 KiB
C++
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);
|
|
} |