Files
minecraft-pe-0.6.1/src/client/renderer/ptexture/DynamicTexture.cpp
Shredder 890604256b Fixes and New Additions
Added GUI Styles with 3 options: Java, Pi/Xperia and Pocket

Hopefully fixed touch input eating and breaking blocks bug

Fire should render on all mobs now

Fixed only one side of the first person burning animation being animated

Added Window Scaling Option for PC Users (Hasn't been tested on other platforms

Render Distance is now configurable from the settings menu

Tried to fix shadows again on IOS and Android, hopefully works?

Block Outline Selection now has a thicker outline for better visibility
2026-05-11 04:51:03 +05:00

484 lines
11 KiB
C++
Executable File

#include "DynamicTexture.h"
#include <cstring>
#include "../Textures.h"
#include "../../../world/level/tile/Tile.h"
#include "../../../util/Mth.h"
//
// DynamicTexture
//
DynamicTexture::DynamicTexture(int tex_)
: tex(tex_),
replicate(1)
{
memset(pixels, 0, 16*16*4);
}
void DynamicTexture::bindTexture(Textures* tex) {
tex->loadAndBindTexture("terrain.png");
}
//
// WaterTexture
// I was thinking of adding something simple (a simple frame copy from a
// "still water image sequence") every n:th tick for calm water, and shifting
// the rows of a texture for the running water. I might do that, but I got
// impressed over the java code, so I will try that first.. and I suspect they
// wont mix very good.
/*
WaterTexture::WaterTexture()
: super(Tile::water->tex),
_tick(0),
_frame(0)
{
}
void WaterTexture::tick() {
}
*/
WaterTexture::WaterTexture()
: super(Tile::water->tex),
_tick(0),
_frame(0)
{
current = new float[16*16];
next = new float[16*16];
heat = new float[16*16];
heata = new float[16*16];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
WaterTexture::~WaterTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
void WaterTexture::tick()
{
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
float pow = 0;
for (int xx = x - 1; xx <= x + 1; xx++) {
int xi = (xx) & 15;
int yi = (y) & 15;
pow += current[xi + yi * 16];
}
next[x + y * 16] = pow / 3.3f + heat[x + y * 16] * 0.8f;
}
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
heat[x + y * 16] += heata[x + y * 16] * 0.05f;
if (heat[x + y * 16] < 0) heat[x + y * 16] = 0;
heata[x + y * 16] -= 0.1f;
if (Mth::random() < 0.05f) {
heata[x + y * 16] = 0.5f;
}
}
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = current[i];
if (pow > 1) pow = 1;
if (pow < 0) pow = 0;
float pp = pow * pow;
int r = (int) (32 + pp * 32);
int g = (int) (50 + pp * 64);
int b = (int) (255);
int a = (int) (146 + pp * 50);
//if (anaglyph3d) {
// int rr = (r * 30 + g * 59 + b * 11) / 100;
// int gg = (r * 30 + g * 70) / (100);
// int bb = (r * 30 + b * 70) / (100);
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = a;
}
}
//
// WaterSideTexture
//
WaterSideTexture::WaterSideTexture()
: super(Tile::water->tex + 1),
_tick(0),
_frame(0),
_tickCount(0)
{
replicate = 2;
current = new float[16*16];
next = new float[16*16];
heat = new float[16*16];
heata = new float[16*16];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
WaterSideTexture::~WaterSideTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
void WaterSideTexture::tick() {
++_tickCount;
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
float pow = 0;
for (int xx = y - 2; xx <= y; xx++) {
int xi = (x) & 15;
int yi = (xx) & 15;
pow += current[xi + yi * 16];
}
next[x + y * 16] = pow / 3.2f + heat[x + y * 16] * 0.8f;
}
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
heat[x + y * 16] += heata[x + y * 16] * 0.05f;
if (heat[x + y * 16] < 0) heat[x + y * 16] = 0;
heata[x + y * 16] -= 0.3f;
if (Mth::random() < 0.2) {
heata[x + y * 16] = 0.5f;
}
}
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = current[(i - _tickCount * 16) & 255];
if (pow > 1) pow = 1;
if (pow < 0) pow = 0;
float pp = pow * pow;
int r = (int) (32 + pp * 32);
int g = (int) (50 + pp * 64);
int b = (int) (255);
int a = (int) (146 + pp * 50);
//if (anaglyph3d) {
// int rr = (r * 30 + g * 59 + b * 11) / 100;
// int gg = (r * 30 + g * 70) / (100);
// int bb = (r * 30 + b * 70) / (100);
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = a;
}
}
///
/// Lava Texture
///
LavaTexture::LavaTexture()
: super(Tile::lava->tex),
_tick(0),
_frame(0)
{
current = new float[16*16];
next = new float[16*16];
heat = new float[16*16];
heata = new float[16*16];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
LavaTexture::~LavaTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
void LavaTexture::tick()
{
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
float pow = 0;
int xxo = (int)(Mth::sin((float)(y) * (float)(Mth::PI) * 2.0f / 16.0f) * 1.2f);
int yyo = (int)(Mth::sin((float)(x) * (float)(Mth::PI) * 2.0f / 16.0f) * 1.2f);
for (int xx = x - 1; xx <= x + 1; xx++) {
for (int yy = y - 1; yy <= y + 1; yy++) {
int xi = xx + xxo & 15;
int yi = yy + yyo & 15;
pow += current[xi + yi * 16];
}
}
next[x + y * 16] = pow / 10.0f + (heat[(x + 0 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 1 & 15) * 16] + heat[(x + 0 & 15) + (y + 1 & 15) * 16]) / 4.0f * 0.8f;
heat[x + y * 16] = heat[x + y * 16] + heata[x + y * 16] * 0.01f;
if (heat[x + y * 16] < 0.0f) {
heat[x + y * 16] = 0.0f;
}
heata[x + y * 16] = heata[x + y * 16] - 0.06f;
if (Mth::random() < 0.005) {
heata[x + y * 16] = 1.5f;
}
}
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = current[i] * 2.0f;
if (pow > 1) pow = 1;
if (pow < 0) pow = 0;
float pp = pow * pow;
int r = (int) (pow * 100.0f + 155.0f);
int g = (int) (pp * 255.0f);
int b = (int) (pp * pp * 128.0f);
//if (anaglyph3d) {
// int rr = (r * 30 + g * 59 + b * 11) / 100;
// int gg = (r * 30 + g * 70) / (100);
// int bb = (r * 30 + b * 70) / (100);
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = -1;
}
}
///
/// Lava Side Texture
///
LavaSideTexture::LavaSideTexture()
: super(Tile::lava->tex + 1),
_tick(0),
_frame(0),
_tickCount(0)
{
replicate = 2;
current = new float[16*16];
next = new float[16*16];
heat = new float[16*16];
heata = new float[16*16];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
LavaSideTexture::~LavaSideTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
void LavaSideTexture::tick() {
++_tickCount;
for (int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++) {
float pow = 0;
int yl = (int)(Mth::sin((float)(y) * (float)(Mth::PI)* 2.0f / 16.0f) * 1.2f); // var2 is y
int xl = (int)(Mth::sin((float)(x) * (float)(Mth::PI)* 2.0f / 16.0f) * 1.2f); // var1 is x
for (int yy = x - 1; yy <= x + 1; yy++) {
for (int xx = y - 1; xx <= y + 1; xx++) {
int xi = (yy + yl) & 15; // var8
int yi = (xx + xl) & 15; //var9
pow += current[xi + yi * 16];
}
}
next[x + y * 16] =
next[x + y * 16] =
pow / 10.0f + (
heat[(x + 0 & 15) + (y + 0 & 15) *
16] + heat[
(x + 1 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 1 & 15) *
16] + heat[
(x + 0 & 15) + (y + 1 & 15) * 16]) / 4.0f
* 0.8f;
heat[x + y * 16] = heat[x + y * 16] + heata[x + y * 16] * 0.01f;
if (heat[x + y * 16] < 0.0f) {
heat[x + y * 16] = 0.0f;
}
heata[x + y * 16] = heata[x + y * 16] - 0.06f;
if (Mth::random() < 0.005) {
heata[x + y * 16] = 1.5f;
}
}
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = current[(i - _tickCount / 3 * 16) & 255] * 2.0f;
if (pow > 1) pow = 1;
if (pow < 0) pow = 0;
float pp = pow * pow;
int r = (int) (pow * 100.0f + 155.0f);
int g = (int) (pow * pow * 255.0f);
int b = (int) (pow * pow * pow * pow * 128.0f);
// int a = (int) (146 + pp * 50);
//if (anaglyph3d) {
// int rr = (r * 30 + g * 59 + b * 11) / 100;
// int gg = (r * 30 + g * 70) / (100);
// int bb = (r * 30 + b * 70) / (100);
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = -1;
}
}
FireTexture::FireTexture(int id)
: super(((Tile*)Tile::fire)->tex + id * 16),
_tick(0),
_frame(0)
{
current = new float[16*20];
next = new float[16*20];
heat = new float[16*20];
heata = new float[16*20];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
FireTexture::~FireTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
// oh boy time to implement fire textures, i am so fucked - shredder
void FireTexture::tick() {
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
for (int x = 0; x < 16; x++) {
for (int y = 0; y < 20; y++) {
int count = 18;
float pow = this->current[x + (y + 1) % 20 * 16] * (float)(count);
for (int xx = x - 1; xx <= x + 1; xx++) {
for (int yy = y; yy <= y + 1; yy++) {
if (xx >= 0 && yy >= 0 && xx < 16 && yy < 20) {
pow += this->current[xx + yy * 16];
}
count++;
}
}
this->next[x + y * 16] = pow / (float(count) * 1.06f);
if (y >= 19) {
this->next[x + y * 16] = float(Mth::random() * Mth::random() * Mth::random() * 4.0 + Mth::random() * 0.1f + 0.2f);
}
}
}
// hopefully this doesn't cause any mysterious issues - shredder
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = this->current[i] * 1.8f;
if (pow > 1.0f) {
pow = 1.0f;
}
if (pow < 0.0f) {
pow = 0.0f;
}
int r = (int) (pow * 155.0f + 100.0f);
int g = (int)(pow * pow * 255.0f);
int b = (int)(pow * pow * pow * pow * pow * pow * pow * pow * pow * pow * 255.0f);
int a = 255;
if (pow < 0.5f) {
a = 0;
}
// @TODO: cant be arsed rn to implement the anaglyph3d check would be nice to check if it does - shredder
//if (this->anaglyph3d) {
// float rr = (r * 30 + g * 59 + b * 11) / 100;
// float gg = (r * 30 + g * 70) / 100;
// float bb = (r * 30 + b * 70) / 100;
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = a;
}
}