the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "Camera.h"
3#include "MemoryTracker.h"
4#include "..\Minecraft.World\net.minecraft.world.entity.player.h"
5#include "..\Minecraft.World\net.minecraft.world.level.h"
6#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
7#include "..\Minecraft.World\TilePos.h"
8
9float Camera::xPlayerOffs = 0.0f;
10float Camera::yPlayerOffs = 0.0f;
11float Camera::zPlayerOffs = 0.0f;
12
13//IntBuffer *Camera::viewport = MemoryTracker::createIntBuffer(16);
14FloatBuffer *Camera::modelview = MemoryTracker::createFloatBuffer(16);
15FloatBuffer *Camera::projection = MemoryTracker::createFloatBuffer(16);
16//FloatBuffer *Camera::position = MemoryTracker::createFloatBuffer(3);
17
18float Camera::xa = 0.0f;
19float Camera::ya = 0.0f;
20float Camera::za = 0.0f;
21float Camera::xa2 = 0.0f;
22float Camera::za2 = 0.0f;
23
24void Camera::prepare(shared_ptr<Player> player, bool mirror)
25{
26 glGetFloat(GL_MODELVIEW_MATRIX, modelview);
27 glGetFloat(GL_PROJECTION_MATRIX, projection);
28
29 /* Original java code for reference
30 glGetInteger(GL_VIEWPORT, viewport);
31
32 float x = (viewport.get(0) + viewport.get(2)) / 2;
33 float y = (viewport.get(1) + viewport.get(3)) / 2;
34 gluUnProject(x, y, 0, modelview, projection, viewport, position);
35
36 xPlayerOffs = position->get(0);
37 yPlayerOffs = position->get(1);
38 zPlayerOffs = position->get(2);
39 */
40
41 // Xbox conversion here... note that we don't bother getting the viewport as this is just working out how to get a (0,0,0) point in clip space to pass into the inverted
42 // combined model/view/projection matrix, so we just need to get this matrix and get its translation as an equivalent.
43 XMMATRIX _modelview, _proj, _final, _invert;
44 XMVECTOR _det;
45 XMFLOAT4 trans;
46
47 memcpy( &_modelview, modelview->_getDataPointer(), 64 );
48 memcpy( &_proj, projection->_getDataPointer(), 64 );
49
50#if ( defined __ORBIS__ ) || ( defined __PSVITA__ )
51 _modelview = transpose(_modelview);
52 _proj = transpose(_proj);
53 _final = _modelview * _proj;
54 _invert = sce::Vectormath::Simd::Aos::inverse(_final);
55 xPlayerOffs = _invert.getElem(0,3) / _invert.getElem(3,3);
56 yPlayerOffs = _invert.getElem(1,3) / _invert.getElem(3,3);
57 zPlayerOffs = _invert.getElem(2,3) / _invert.getElem(3,3);
58#elif defined __PS3__
59 _modelview = transpose(_modelview);
60 _proj = transpose(_proj);
61 _final = _modelview * _proj;
62 _invert = Vectormath::Aos::inverse(_final);
63 xPlayerOffs = _invert.getElem(0,3) / _invert.getElem(3,3);
64 yPlayerOffs = _invert.getElem(1,3) / _invert.getElem(3,3);
65 zPlayerOffs = _invert.getElem(2,3) / _invert.getElem(3,3);
66#else
67 _final = XMMatrixMultiply( _modelview, _proj );
68 _det = XMMatrixDeterminant(_final);
69 _invert = XMMatrixInverse(&_det, _final);
70
71 XMStoreFloat4(&trans,_invert.r[3]);
72
73 xPlayerOffs = trans.x / trans.w;
74 yPlayerOffs = trans.y / trans.w;
75 zPlayerOffs = trans.z / trans.w;
76#endif
77
78 int flipCamera = mirror ? 1 : 0;
79
80 float xRot = player->xRot;
81 float yRot = player->yRot;
82
83 xa = cosf(yRot * PI / 180.0f) * (1 - flipCamera * 2);
84 za = sinf(yRot * PI / 180.0f) * (1 - flipCamera * 2);
85
86 xa2 = -za * sinf(xRot * PI / 180.0f) * (1 - flipCamera * 2);
87 za2 = xa * sinf(xRot * PI / 180.0f) * (1 - flipCamera * 2);
88 ya = cosf(xRot * PI / 180.0f);
89}
90
91TilePos *Camera::getCameraTilePos(shared_ptr<LivingEntity> player, double alpha)
92{
93 return new TilePos(getCameraPos(player, alpha));
94}
95
96Vec3 *Camera::getCameraPos(shared_ptr<LivingEntity> player, double alpha)
97{
98 double xx = player->xo + (player->x - player->xo) * alpha;
99 double yy = player->yo + (player->y - player->yo) * alpha + player->getHeadHeight();
100 double zz = player->zo + (player->z - player->zo) * alpha;
101
102 double xt = xx + Camera::xPlayerOffs * 1;
103 double yt = yy + Camera::yPlayerOffs * 1;
104 double zt = zz + Camera::zPlayerOffs * 1;
105
106 return Vec3::newTemp(xt, yt, zt);
107}
108
109int Camera::getBlockAt(Level *level, shared_ptr<LivingEntity> player, float alpha)
110{
111 Vec3 *p = Camera::getCameraPos(player, alpha);
112 TilePos tp = TilePos(p);
113 int t = level->getTile(tp.x, tp.y, tp.z);
114 if (t != 0 && Tile::tiles[t]->material->isLiquid())
115 {
116 float hh = LiquidTile::getHeight(level->getData(tp.x, tp.y, tp.z)) - 1 / 9.0f;
117 float h = tp.y + 1 - hh;
118 if (p->y >= h)
119 {
120 t = level->getTile(tp.x, tp.y + 1, tp.z);
121 }
122 }
123 return t;
124}