#include "../../Minecraft.World/Platform/stdafx.h" #include "../../Minecraft.Client/Minecraft.h" #include "../../Minecraft.Client/UI/ScreenSizeCalculator.h" #include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" #include "../../Minecraft.Client/Rendering/Lighting.h" #include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" #include "XUI_Ctrl_MinecraftPlayer.h" #include "XUI_Scene_AbstractContainer.h" #include "XUI_Scene_Inventory.h" #include "../../Minecraft.Client/GameState/Options.h" //----------------------------------------------------------------------------- // CXuiCtrlMinecraftPlayer class //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- CXuiCtrlMinecraftPlayer::CXuiCtrlMinecraftPlayer() : m_bDirty(false), m_fScale(1.0f), m_fAlpha(1.0f) { Minecraft* pMinecraft = Minecraft::GetInstance(); ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); m_fScreenWidth = (float)pMinecraft->width_phys; m_fRawWidth = (float)ssc.rawWidth; m_fScreenHeight = (float)pMinecraft->height_phys; m_fRawHeight = (float)ssc.rawHeight; } //----------------------------------------------------------------------------- HRESULT CXuiCtrlMinecraftPlayer::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) { HRESULT hr = S_OK; HXUIOBJ parent = m_hObj; HXUICLASS hcInventoryClass = XuiFindClass(L"CXuiSceneInventory"); HXUICLASS currentClass; do { XuiElementGetParent(parent, &parent); currentClass = XuiGetObjectClass(parent); } while (parent != NULL && !XuiClassDerivesFrom(currentClass, hcInventoryClass)); assert(parent != NULL); void* pObj; XuiObjectFromHandle(parent, &pObj); m_containerScene = (CXuiSceneInventory*)pObj; m_iPad = m_containerScene->getPad(); return hr; } HRESULT CXuiCtrlMinecraftPlayer::OnRender(XUIMessageRender* pRenderData, BOOL& bHandled) { #ifdef _XBOX HXUIDC hDC = pRenderData->hDC; // build and render with the game call RenderManager.Set_matrixDirty(); Minecraft* pMinecraft = Minecraft::GetInstance(); glColor4f(1, 1, 1, 1); glClear(GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, m_fRawWidth, m_fRawHeight, 0, 1000, 3000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -2000); D3DXMATRIX matrix; CXuiControl xuiControl(m_hObj); xuiControl.GetFullXForm(&matrix); float bwidth, bheight; xuiControl.GetBounds(&bwidth, &bheight); float xo = ((matrix._41 + ((bwidth * matrix._11) / 2)) / m_fScreenWidth) * m_fRawWidth; float yo = ((matrix._42 + (bheight * matrix._22)) / m_fScreenHeight) * m_fRawHeight; glEnable(GL_RESCALE_NORMAL); glEnable(GL_COLOR_MATERIAL); glPushMatrix(); glTranslatef(xo, yo - 3.5f, 50.0f); float ss; // = 26; if (!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) { ss = 24; } else { if (app.GetLocalPlayerCount() > 1) { ss = 13; } else { ss = 26; } } // Base scale on height of this control // Potentially we might want separate x & y scales here // ss = ( ( bheight / m_fScreenHeight ) * m_fRawHeight ); // For testing split screen - this scale is correct for 4 player split // screen // how many local players do we have? // int iPlayerC=0; // // for(int i=0;ilocalplayers[i] != NULL) // { // iPlayerC++; // } // } // // switch(iPlayerC) // { // case 1: // break; // case 2: // case 3: // case 4: // ss *= 0.5f; // break; // } glScalef(-ss, ss, ss); glRotatef(180, 0, 0, 1); float oybr = pMinecraft->localplayers[m_iPad]->yBodyRot; float oyr = pMinecraft->localplayers[m_iPad]->yRot; float oxr = pMinecraft->localplayers[m_iPad]->xRot; float oyhr = pMinecraft->localplayers[m_iPad]->yHeadRot; D3DXVECTOR3 pointerPosition = m_containerScene->GetCursorScreenPosition(); // printf("Pointer screen position is x:%f, y:%f, z:%f\n",pointerPosition.x, // pointerPosition.y, pointerPosition.z); float xd = (matrix._41 + ((bwidth * matrix._11) / 2)) - pointerPosition.x; // Need to base Y on head position, not centre of mass float yd = (matrix._42 + ((bheight * matrix._22) / 2) - 40) - pointerPosition.y; glRotatef(45 + 90, 0, 1, 0); Lighting::turnOn(); glRotatef(-45 - 90, 0, 1, 0); glRotatef(-(float)atan(yd / 40.0f) * 20, 1, 0, 0); pMinecraft->localplayers[m_iPad]->yBodyRot = (float)atan(xd / 40.0f) * 20; pMinecraft->localplayers[m_iPad]->yRot = (float)atan(xd / 40.0f) * 40; pMinecraft->localplayers[m_iPad]->xRot = -(float)atan(yd / 40.0f) * 20; pMinecraft->localplayers[m_iPad]->yHeadRot = pMinecraft->localplayers[m_iPad]->yRot; // pMinecraft->localplayers[m_iPad]->glow = 1; glTranslatef(0, pMinecraft->localplayers[m_iPad]->heightOffset, 0); EntityRenderDispatcher::instance->playerRotY = 180; // 4J Stu - Turning on hideGui while we do this stops the name rendering in // split-screen bool wasHidingGui = pMinecraft->options->hideGui; pMinecraft->options->hideGui = true; EntityRenderDispatcher::instance->render(pMinecraft->localplayers[m_iPad], 0, 0, 0, 0, 1, false, false); pMinecraft->options->hideGui = wasHidingGui; // pMinecraft->localplayers[m_iPad]->glow = 0; pMinecraft->localplayers[m_iPad]->yBodyRot = oybr; pMinecraft->localplayers[m_iPad]->yRot = oyr; pMinecraft->localplayers[m_iPad]->xRot = oxr; pMinecraft->localplayers[m_iPad]->yHeadRot = oyhr; glPopMatrix(); Lighting::turnOff(); glDisable(GL_RESCALE_NORMAL); XuiRenderRestoreState(hDC); bHandled = TRUE; #endif return S_OK; }