aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/PaintingRenderer.cpp
blob: b51ab0f488ca73bfa65cc978cd3432bafceaba7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "stdafx.h"
#include "PaintingRenderer.h"
#include "entityRenderDispatcher.h"
#include "..\Minecraft.World\net.minecraft.world.entity.h"
#include "..\Minecraft.World\net.minecraft.world.level.h"
#include "..\Minecraft.World\Random.h"
#include "..\Minecraft.World\Mth.h"

ResourceLocation PaintingRenderer::PAINTING_LOCATION(TN_ART_KZ);

PaintingRenderer::PaintingRenderer()
{
	random = new Random();
}

void PaintingRenderer::render(shared_ptr<Entity> _painting, double x, double y, double z, float rot, float a)
{
	// 4J - dynamic cast required because we aren't using templates/generics in our version
	shared_ptr<Painting> painting = dynamic_pointer_cast<Painting>(_painting);
	
    random->setSeed(187);

    glPushMatrix();
    glTranslatef(static_cast<float>(x), static_cast<float>(y), static_cast<float>(z));
    glRotatef(rot, 0, 1, 0);
    glEnable(GL_RESCALE_NORMAL);
    bindTexture(painting);	// 4J was L"/art/kz.png"

    Painting::Motive *motive = painting->motive;

    float s = 1 / 16.0f;
    glScalef(s, s, s);
    renderPainting(painting, motive->w, motive->h, motive->uo, motive->vo);
    glDisable(GL_RESCALE_NORMAL);
    glPopMatrix();
}

void PaintingRenderer::renderPainting(shared_ptr<Painting> painting, int w, int h, int uo, int vo)
{
	float xx0 = -w / 2.0f;
	float yy0 = -h / 2.0f;

	float edgeWidth = 0.5f;

	// Back
	float bu0 = (12 * 16) / 256.0f;
	float bu1 = (12 * 16 + 16) / 256.0f;
	float bv0 = (0) / 256.0f;
	float bv1 = (0 + 16) / 256.0f;

	// Border
	float uu0 = (12 * 16) / 256.0f;
	float uu1 = (12 * 16 + 16) / 256.0f;
	float uv0 = (0.5f) / 256.0f;
	float uv1 = (0.5f) / 256.0f;

	// Border
	float su0 = (12 * 16 + 0.5f) / 256.0f;
	float su1 = (12 * 16 + 0.5f) / 256.0f;
	float sv0 = (0) / 256.0f;
	float sv1 = (0 + 16) / 256.0f;

	for (int xs = 0; xs < w / 16; xs++)
	{
		for (int ys = 0; ys < h / 16; ys++) {
			float x0 = xx0 + (xs + 1) * 16;
			float x1 = xx0 + (xs) * 16;
			float y0 = yy0 + (ys + 1) * 16;
			float y1 = yy0 + (ys) * 16;

			setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2);

			// Painting
			float fu0 = (uo + w - (xs) * 16) / 256.0f;
			float fu1 = (uo + w - (xs + 1) * 16) / 256.0f;
			float fv0 = (vo + h - (ys) * 16) / 256.0f;
			float fv1 = (vo + h - (ys + 1) * 16) / 256.0f;

			Tesselator *t = Tesselator::getInstance();
			t->begin();
			t->normal(0, 0, -1);
			t->vertexUV(x0, y1, -edgeWidth, fu1, fv0);
			t->vertexUV(x1, y1, -edgeWidth, fu0, fv0);
			t->vertexUV(x1, y0, -edgeWidth, fu0, fv1);
			t->vertexUV(x0, y0, -edgeWidth, fu1, fv1);

			t->normal(0, 0, 1);
			t->vertexUV(x0, y0, edgeWidth, bu0, bv0);
			t->vertexUV(x1, y0, edgeWidth, bu1, bv0);
			t->vertexUV(x1, y1, edgeWidth, bu1, bv1);
			t->vertexUV(x0, y1, edgeWidth, bu0, bv1);

			t->normal(0, 1, 0);
			t->vertexUV(x0, y0, -edgeWidth, uu0, uv0);
			t->vertexUV(x1, y0, -edgeWidth, uu1, uv0);
			t->vertexUV(x1, y0, edgeWidth, uu1, uv1);
			t->vertexUV(x0, y0, edgeWidth, uu0, uv1);
			
			t->normal(0, -1, 0);
			t->vertexUV(x0, y1, edgeWidth, uu0, uv0);
			t->vertexUV(x1, y1, edgeWidth, uu1, uv0);
			t->vertexUV(x1, y1, -edgeWidth, uu1, uv1);
			t->vertexUV(x0, y1, -edgeWidth, uu0, uv1);
			
			t->normal(-1, 0, 0);
			t->vertexUV(x0, y0, edgeWidth, su1, sv0);
			t->vertexUV(x0, y1, edgeWidth, su1, sv1);
			t->vertexUV(x0, y1, -edgeWidth, su0, sv1);
			t->vertexUV(x0, y0, -edgeWidth, su0, sv0);
			
			t->normal(1, 0, 0);
			t->vertexUV(x1, y0, -edgeWidth, su1, sv0);
			t->vertexUV(x1, y1, -edgeWidth, su1, sv1);
			t->vertexUV(x1, y1, edgeWidth, su0, sv1);
			t->vertexUV(x1, y0, edgeWidth, su0, sv0);
			t->end();
		}
	}
}

void PaintingRenderer::setBrightness(shared_ptr<Painting> painting, float ss, float ya)
{
    int x = Mth::floor(painting->x);
    int y = Mth::floor(painting->y + ya/16.0f);
    int z = Mth::floor(painting->z);
    if (painting->dir == 0) x = Mth::floor(painting->x + ss/16.0f);
    if (painting->dir == 1) z = Mth::floor(painting->z - ss/16.0f);
    if (painting->dir == 2) x = Mth::floor(painting->x - ss/16.0f);
    if (painting->dir == 3) z = Mth::floor(painting->z + ss/16.0f);

    int col = this->entityRenderDispatcher->level->getLightColor(x, y, z, 0);
    int u = col % 65536;
    int v = col / 65536;
    glMultiTexCoord2f(0, u, v);
    glColor3f(1, 1, 1);
}

ResourceLocation *PaintingRenderer::getTextureLocation(shared_ptr<Entity> mob)
{
    return &PAINTING_LOCATION;
}