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
264 lines
7.5 KiB
C++
Executable File
264 lines
7.5 KiB
C++
Executable File
#include "EntityRenderer.h"
|
|
|
|
#include "../Tesselator.h"
|
|
#include "../Textures.h"
|
|
#include "../gles.h"
|
|
#include "../../../world/phys/AABB.h"
|
|
#include "EntityRenderDispatcher.h"
|
|
#include "../../../util/Mth.h"
|
|
#include "../../../world/level/Level.h"
|
|
#include "../../../world/level/tile/Tile.h"
|
|
|
|
#include "../../Minecraft.h"
|
|
#include "../../Option.h"
|
|
|
|
#include "../Lighting.h"
|
|
EntityRenderDispatcher* EntityRenderer::entityRenderDispatcher = NULL;
|
|
|
|
EntityRenderer::EntityRenderer()
|
|
: shadowRadius(0),
|
|
shadowStrength(1.0f)
|
|
{}
|
|
|
|
void EntityRenderer::bindTexture(const std::string& resourceName) {
|
|
entityRenderDispatcher->textures->loadAndBindTexture(resourceName);
|
|
}
|
|
|
|
//bool bindTexture(std::string urlTexture, std::string backupTexture) {
|
|
// Textures t = entityRenderDispatcher.textures;
|
|
|
|
// int id = t.loadHttpTexture(urlTexture, backupTexture);
|
|
// if (id >= 0) {
|
|
// t.bind(id);
|
|
// return true;
|
|
// } else {
|
|
// return false;
|
|
// }
|
|
//}
|
|
|
|
/*static*/
|
|
void EntityRenderer::render(const AABB& bb, float xo, float yo, float zo) {
|
|
glDisable2(GL_TEXTURE_2D);
|
|
Tesselator& t = Tesselator::instance;
|
|
glColor4f2(1, 1, 1, 1);
|
|
t.begin();
|
|
t.offset(xo, yo, zo);
|
|
t.normal(0, 0, -1);
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
|
|
t.normal(0, 0, 1);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
|
|
t.normal(0, -1, 0);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
|
|
t.normal(0, 1, 0);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
|
|
t.normal(-1, 0, 0);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
|
|
t.normal(1, 0, 0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.offset(0, 0, 0);
|
|
t.draw();
|
|
glEnable2(GL_TEXTURE_2D);
|
|
// model.render(0, 1)
|
|
}
|
|
|
|
/*static*/
|
|
void EntityRenderer::renderFlat(const AABB& bb) {
|
|
Tesselator& t = Tesselator::instance;
|
|
t.begin();
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z1);
|
|
t.vertex(bb.x0, bb.y1, bb.z0);
|
|
t.vertex(bb.x0, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y0, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z0);
|
|
t.vertex(bb.x1, bb.y1, bb.z1);
|
|
t.vertex(bb.x1, bb.y0, bb.z1);
|
|
t.draw();
|
|
}
|
|
|
|
void EntityRenderer::init(EntityRenderDispatcher* entityRenderDispatcher) {
|
|
this->entityRenderDispatcher = entityRenderDispatcher;
|
|
}
|
|
|
|
Font* EntityRenderer::getFont() {
|
|
return entityRenderDispatcher->getFont();
|
|
}
|
|
|
|
void EntityRenderer::postRender(Entity* entity, float x, float y, float z, float rot, float a) {
|
|
if (/*entityRenderDispatcher.options.fancyGraphics &&*/entityRenderDispatcher->minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && shadowRadius > 0) {
|
|
float dist = entityRenderDispatcher->distanceToSqr(entity->x, entity->y, entity->z);
|
|
float pow = (float) ((1 - dist / (16.0f * 16.0f)) * shadowStrength);
|
|
if (pow > 0) {
|
|
renderShadow(entity, x, y, z, pow, a);
|
|
}
|
|
}
|
|
if (entity->isOnFire()) renderFlame(entity, x, y, z, a);
|
|
}
|
|
void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a) {
|
|
glDisable(GL_LIGHTING);
|
|
int tex = ((Tile*)Tile::fire)->tex;
|
|
|
|
int xt = (tex & 0xf) << 4;
|
|
int yt = tex & 0xf0;
|
|
|
|
float u0 = (xt) / 256.0f;
|
|
float u1 = (xt + 15.99f) / 256.0f;
|
|
float v0 = (yt) / 256.0f;
|
|
float v1 = (yt + 15.99f) / 256.0f;
|
|
|
|
glPushMatrix2();
|
|
glTranslatef2((float) x, (float) y, (float) z);
|
|
|
|
float s = e->bbWidth * 1.4f;
|
|
glScalef2(s, s, s);
|
|
bindTexture("terrain.png");
|
|
Tesselator& t = Tesselator::instance;
|
|
|
|
float r = 1.0f;
|
|
float xo = 0.5f;
|
|
float yo = 0.0f;
|
|
|
|
float h = e->bbHeight / e->bbWidth;
|
|
|
|
glRotatef2(-entityRenderDispatcher->playerRotY, 0, 1, 0);
|
|
glTranslatef2(0, 0, -0.4f + ((int) h) * 0.02f);
|
|
glColor4f2(1, 1, 1, 1);
|
|
// glRotatef2(-playerRotX, 1, 0, 0);
|
|
t.begin();
|
|
while (h > 0) {
|
|
t.vertexUV(r - xo, 0 - yo, 0, u1, v1);
|
|
t.vertexUV(0 - xo, 0 - yo, 0, u0, v1);
|
|
t.vertexUV(0 - xo, 1.4f - yo, 0, u0, v0);
|
|
t.vertexUV(r - xo, 1.4f - yo, 0, u1, v0);
|
|
h -= 1;
|
|
yo -= 1;
|
|
r *= 0.9f;
|
|
glTranslatef2(0, 0, -0.04f);
|
|
}
|
|
t.draw();
|
|
glPopMatrix2();
|
|
glEnable2(GL_LIGHTING);
|
|
}
|
|
|
|
void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float pow, float a) { //
|
|
glEnable2(GL_BLEND);
|
|
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
//Textures* textures = entityRenderDispatcher->textures;
|
|
//textures->bind(textures->loadTexture("%clamp%/environment/shadow.png"));
|
|
Textures* textures = entityRenderDispatcher->textures;
|
|
textures->loadAndBindTexture("/misc/shadow.png");
|
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
|
|
|
|
Level* level = getLevel();
|
|
|
|
glDepthMask(false);
|
|
float r = shadowRadius;
|
|
|
|
float ex = e->xOld + (e->x - e->xOld) * a;
|
|
float ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs();
|
|
float ez = e->zOld + (e->z - e->zOld) * a;
|
|
|
|
int x0 = Mth::floor(ex - r);
|
|
int x1 = Mth::floor(ex + r);
|
|
int y0 = Mth::floor(ey - r);
|
|
int y1 = Mth::floor(ey);
|
|
int z0 = Mth::floor(ez - r);
|
|
int z1 = Mth::floor(ez + r);
|
|
|
|
float xo = x - ex;
|
|
float yo = y - ey;
|
|
float zo = z - ez;
|
|
|
|
Tesselator& tt = Tesselator::instance;
|
|
tt.begin();
|
|
for (int xt = x0; xt <= x1; xt++)
|
|
for (int yt = y0; yt <= y1; yt++)
|
|
for (int zt = z0; zt <= z1; zt++) {
|
|
int t = level->getTile(xt, yt - 1, zt);
|
|
if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) {
|
|
renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs(), z, xt, yt, zt, pow, r, xo, yo + e->getShadowHeightOffs(), zo);
|
|
}
|
|
}
|
|
tt.draw();
|
|
|
|
glColor4f2(1, 1, 1, 1);
|
|
glDisable2(GL_BLEND);
|
|
glDepthMask(true);
|
|
}
|
|
|
|
Level* EntityRenderer::getLevel() {
|
|
return entityRenderDispatcher->level;
|
|
}
|
|
|
|
void EntityRenderer::renderTileShadow(Tile* tt, float x, float y, float z, int xt, int yt, int zt, float pow, float r, float xo, float yo, float zo) {
|
|
Tesselator& t = Tesselator::instance;
|
|
if (!tt->isCubeShaped()) return;
|
|
|
|
float a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt);
|
|
if (a < 0) return;
|
|
if (a > 1) a = 1;
|
|
// t.color(1, 1, 1, (float) a);
|
|
glColor4f2(1, 1, 1, (float) a);
|
|
|
|
float x0 = xt + tt->xx0 + xo;
|
|
float x1 = xt + tt->xx1 + xo;
|
|
float y0 = yt + tt->yy0 + yo + 1.0 / 64.0f;
|
|
float z0 = zt + tt->zz0 + zo;
|
|
float z1 = zt + tt->zz1 + zo;
|
|
|
|
float u0 = (float) ((x - (x0)) / 2 / r + 0.5f);
|
|
float u1 = (float) ((x - (x1)) / 2 / r + 0.5f);
|
|
float v0 = (float) ((z - (z0)) / 2 / r + 0.5f);
|
|
float v1 = (float) ((z - (z1)) / 2 / r + 0.5f);
|
|
|
|
t.vertexUV(x0, y0, z0, u0, v0);
|
|
t.vertexUV(x0, y0, z1, u0, v1);
|
|
t.vertexUV(x1, y0, z1, u1, v1);
|
|
t.vertexUV(x1, y0, z0, u1, v0);
|
|
}
|