the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 124 lines 4.3 kB view raw
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}