From 9b5d12832d468fad74cceb9ba30eefd52b285234 Mon Sep 17 00:00:00 2001 From: Dram27 Date: Tue, 12 May 2026 18:12:17 +0200 Subject: [PATCH] Isometric-view --- src/client/gui/screens/PauseScreen.cpp | 24 +- src/client/gui/screens/PauseScreen.h | 1 + src/client/gui/screens/UploadPhotoScreen.cpp | 337 +++++++++---------- src/client/gui/screens/UploadPhotoScreen.h | 86 +++-- src/client/renderer/GameRenderer.cpp | 43 ++- src/client/renderer/GameRenderer.h | 4 + src/client/renderer/LevelRenderer.cpp | 25 +- 7 files changed, 291 insertions(+), 229 deletions(-) diff --git a/src/client/gui/screens/PauseScreen.cpp b/src/client/gui/screens/PauseScreen.cpp index 64b611e..4b60a21 100755 --- a/src/client/gui/screens/PauseScreen.cpp +++ b/src/client/gui/screens/PauseScreen.cpp @@ -8,6 +8,7 @@ #include "client/Options.h" #include "client/gui/components/Button.h" #include "client/gui/screens/OptionsScreen.h" +#include "UploadPhotoScreen.h" PauseScreen::PauseScreen(bool wasBackPaused) : saveStep(0), @@ -17,6 +18,7 @@ PauseScreen::PauseScreen(bool wasBackPaused) bOptions(0), bQuitAndSaveLocally(0), bServerVisibility(0), + bPhotoMode(0), // bThirdPerson(0), wasBackPaused(wasBackPaused), // bSound(OPTIONS_SOUND_VOLUME, 1, 0), @@ -43,6 +45,7 @@ PauseScreen::~PauseScreen() { delete bQuit; delete bQuitAndSaveLocally; delete bServerVisibility; + delete bPhotoMode; delete bOptions; // delete bThirdPerson; } @@ -51,6 +54,7 @@ void PauseScreen::init() { if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 0) { bContinue = new Touch::TButton(1, "Back to game"); bOptions = new Touch::TButton(5, "Options"); + bPhotoMode = new Touch::TButton(6, "Photo Mode"); bQuit = new Touch::TButton(2, "Quit to title"); bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map"); bServerVisibility = new Touch::TButton(4, ""); @@ -58,6 +62,7 @@ void PauseScreen::init() { } else if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 1) { bContinue = new Button(1, "Back to game"); bOptions = new Button(5, "Options"); + bPhotoMode = new Button(6, "Photo Mode"); bQuit = new Button(2, "Quit to title"); bQuitAndSaveLocally = new Button(3, "Quit and copy map"); bServerVisibility = new Button(4, ""); @@ -66,6 +71,7 @@ void PauseScreen::init() { bContinue = new Button(1, 0, 0, 200, 20, "Back to game"); bServerVisibility = new Button(4, 0, 0, 200, 20, ""); bOptions = new Button(5, 0, 0, 200, 20, "Options..."); + bPhotoMode = new Button(6, 0, 0, 200, 20, "Photo Mode"); bQuit = new Button(2, 0, 0, 200, 20, "Save and quit to title"); bQuitAndSaveLocally = new Button(3, 0, 0, 200, 20, "Copy and quit map"); // bThirdPerson = new Button(5, "Toggle 3:rd person view"); @@ -74,6 +80,7 @@ void PauseScreen::init() { buttons.push_back(bContinue); buttons.push_back(bQuit); buttons.push_back(bOptions); + buttons.push_back(bPhotoMode); // bSound.updateImage(&minecraft->options); bThirdPerson.updateImage(&minecraft->options); bHideGui.updateImage(&minecraft->options); @@ -115,7 +122,7 @@ void PauseScreen::setupPositions() { if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){ yBase = 50; - bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 200; + bContinue->width = bOptions->width = bPhotoMode->width = bQuit->width = /*bThirdPerson->w =*/ 200; bQuitAndSaveLocally->width = bServerVisibility->width = 200; bContinue->x = (width - bContinue->width) / 2; @@ -124,6 +131,9 @@ void PauseScreen::setupPositions() { bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2; bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 24 * 2; + bPhotoMode->x = (width - bPhotoMode->width) / 2; + bPhotoMode->y = yBase + 24 * 3; + bOptions->x = (width - bOptions->width) / 2; bOptions->y = yBase + 24 * 3 + 24; @@ -131,7 +141,7 @@ void PauseScreen::setupPositions() { bQuit->y = yBase + 24 * 4 + 24; } else { - bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 160; + bContinue->width = bOptions->width = bPhotoMode->width = bQuit->width = /*bThirdPerson->w =*/ 160; bQuitAndSaveLocally->width = bServerVisibility->width = 160; bContinue->x = (width - bContinue->width) / 2; @@ -140,15 +150,18 @@ void PauseScreen::setupPositions() { bOptions->x = (width - bOptions->width) / 2; bOptions->y = yBase + 32 * 2; + bPhotoMode->x = (width - bPhotoMode->width) / 2; + bPhotoMode->y = yBase + 32 * 3; + bQuit->x = (width - bQuit->width) / 2; - bQuit->y = yBase + 32 * 3; + bQuit->y = yBase + 32 * 4; #if APPLE_DEMO_PROMOTION bQuit->y += 16; #endif bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2; - bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 4; + bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 5; } @@ -192,6 +205,9 @@ void PauseScreen::buttonClicked(Button* button) { if (button->id == bQuit->id) { minecraft->leaveGame(); } + if (button->id == bPhotoMode->id) { + minecraft->setScreen(new UploadPhotoScreen()); + } if (button->id == bQuitAndSaveLocally->id) { minecraft->leaveGame(true); } diff --git a/src/client/gui/screens/PauseScreen.h b/src/client/gui/screens/PauseScreen.h index 4098511..db1c95a 100755 --- a/src/client/gui/screens/PauseScreen.h +++ b/src/client/gui/screens/PauseScreen.h @@ -33,6 +33,7 @@ private: Button* bQuit; Button* bQuitAndSaveLocally; Button* bServerVisibility; + Button* bPhotoMode; Button* bOptions; // Button* bThirdPerson; diff --git a/src/client/gui/screens/UploadPhotoScreen.cpp b/src/client/gui/screens/UploadPhotoScreen.cpp index ccf38f8..f44d958 100755 --- a/src/client/gui/screens/UploadPhotoScreen.cpp +++ b/src/client/gui/screens/UploadPhotoScreen.cpp @@ -1,177 +1,160 @@ -#if 0 - -#include "UploadPhotoScreen.h" -#include "../renderer/TileRenderer.h" -#include "../player/LocalPlayer.h" -#include "../../world/entity/player/Inventory.h" - -UploadPhotoScreen::UploadPhotoScreen() - : -selectedItem(0) -{ -} - -void UploadPhotoScreen::init() -{ - int currentSelection = minecraft->player->inventory->getSelectedItemId(); - for (int i = 0; i < Inventory::INVENTORY_SIZE; i++) - { - if (currentSelection == minecraft->player->inventory->getSelectionSlotItemId(i + Inventory::SELECTION_SIZE)) - { - selectedItem = i; - break; - } - } - -} - -void UploadPhotoScreen::renderSlots() -{ - glColor4f2(1, 1, 1, 1); - - blitOffset = -90; - - minecraft->textures->loadAndBindTexture("gui/gui.png"); - for (int r = 0; r < Inventory::INVENTORY_ROWS; r++) - { - blit(width / 2 - 182 / 2, height - 22 * 3 - 22 * r, 0, 0, 182, 22); - } - if (selectedItem >= 0) - { - int x = width / 2 - 182 / 2 - 1 + (selectedItem % Inventory::SELECTION_SIZE) * 20; - int y = height - 22 * 3 - 1 - (selectedItem / Inventory::SELECTION_SIZE) * 22; - blit(x, y, 0, 22, 24, 22); - } - - for (int r = 0; r < Inventory::INVENTORY_ROWS; r++) - { - for (int i = 0; i < 9; i++) { - int x = width / 2 - 9 * 10 + i * 20 + 2; - int y = height - 16 - 3 - 22 * 2 - 22 * r; - renderSlot(r * 9 + i + Inventory::SELECTION_SIZE, x, y, 0); - } - } - -} - -void UploadPhotoScreen::renderSlot(int slot, int x, int y, float a) -{ - int itemId = minecraft->player->inventory->getSelectionSlotItemId(slot); - if (itemId < 0) return; - - const bool fancy = false; - - if (fancy && itemId < 256 && TileRenderer::canRender(Tile::tiles[itemId]->getRenderShape())) { - - } else { - if (itemId < 256) { - Tile* tile = Tile::tiles[itemId]; - if (tile == NULL) return; - - minecraft->textures->loadAndBindTexture("terrain.png"); - - int textureId = tile->getTexture(2, 0); - blit(x, y, textureId % 16 * 16, textureId / 16 * 16, 16, 16); - } - } - -} - -void UploadPhotoScreen::keyPressed(int eventKey) -{ - int selX = selectedItem % Inventory::SELECTION_SIZE; - int selY = selectedItem / Inventory::SELECTION_SIZE; - - Options& o = minecraft->options; - if (eventKey == o.keyLeft.key && selX > 0) - { - selectedItem -= 1; - } - else if (eventKey == o.keyRight.key && selX < (Inventory::SELECTION_SIZE - 1)) - { - selectedItem += 1; - } - else if (eventKey == o.keyDown.key && selY > 0) - { - selectedItem -= Inventory::SELECTION_SIZE; - } - else if (eventKey == o.keyUp.key && selY < (Inventory::INVENTORY_ROWS - 1)) - { - selectedItem += Inventory::SELECTION_SIZE; - } - - if (eventKey == o.keyMenuOk.key) - { - selectSlotAndClose(); - } -} - -int UploadPhotoScreen::getSelectedSlot(int x, int y) -{ - int left = 3 + width / 2 - Inventory::SELECTION_SIZE * 10; - int top = height - 16 - 3 - 22 * 2 - 22 * Inventory::INVENTORY_ROWS; - - if (x >= left && y >= top) - { - int xSlot = (x - left) / 20; - if (xSlot < Inventory::SELECTION_SIZE) - { - // rows are rendered upsidedown - return xSlot + Inventory::INVENTORY_SIZE - ((y - top) / 22) * Inventory::SELECTION_SIZE; - } - } - return -1; -} - -void UploadPhotoScreen::mouseClicked(int x, int y, int buttonNum) { - if (buttonNum == MouseAction::ACTION_LEFT) { - - int slot = getSelectedSlot(x, y); - if (slot >= 0 && slot < Inventory::INVENTORY_SIZE) - { - selectedItem = slot; - //minecraft->soundEngine->playUI("random.click", 1, 1); - } - } -} - -void UploadPhotoScreen::mouseReleased(int x, int y, int buttonNum) -{ - if (buttonNum == MouseAction::ACTION_LEFT) { - - int slot = getSelectedSlot(x, y); - if (slot >= 0 && slot < Inventory::INVENTORY_SIZE && slot == selectedItem) - { - selectSlotAndClose(); - } - } -} - -void UploadPhotoScreen::selectSlotAndClose() -{ - Inventory* inventory = minecraft->player->inventory; - - int itemId = inventory->getSelectionSlotItemId(selectedItem + Inventory::SELECTION_SIZE); - int i = 0; - - for (; i < Inventory::SELECTION_SIZE - 2; i++) - { - if (itemId == inventory->getSelectionSlotItemId(i)) - { - break; - } - } - - // update selection list - for (; i >= 1; i--) - { - inventory->setSelectionSlotItemId(i, inventory->getSelectionSlotItemId(i - 1)); - } - inventory->setSelectionSlotItemId(0, itemId); - inventory->selectSlot(0); - - minecraft->soundEngine->playUI("random.click", 1, 1); - minecraft->setScreen(NULL); -} - -#endif +#include "UploadPhotoScreen.h" + +#include "../components/Button.h" +#include "../../Minecraft.h" +#include "../../player/LocalPlayer.h" +#include "../../../world/entity/item/TripodCamera.h" +#include "../../../world/level/Level.h" +#include "../../../platform/input/Keyboard.h" +#include "../../renderer/GameRenderer.h" +#include "../../renderer/LevelRenderer.h" + +UploadPhotoScreen::UploadPhotoScreen() +: hasAppliedPhotoMode(false), + oldHideGui(false), + oldThirdPerson(false), + oldFixedCamera(false), + hasOldPose(false), + oldX(0), + oldY(0), + oldZ(0), + oldYaw(0), + oldPitch(0), + photoCameraTarget(NULL), + photoCameraX(0), + photoCameraY(0), + photoCameraZ(0), + bBack(0) +{ +} + +UploadPhotoScreen::~UploadPhotoScreen() +{ + restorePhotoMode(); + delete photoCameraTarget; + delete bBack; +} + +void UploadPhotoScreen::init() +{ + applyPhotoMode(); + + if (minecraft->useTouchscreen()) { + bBack = new Touch::TButton(1, "Back"); + } else { + bBack = new Button(1, "Back"); + } + + buttons.push_back(bBack); + tabButtons.push_back(bBack); +} + +void UploadPhotoScreen::removed() +{ + restorePhotoMode(); +} + +void UploadPhotoScreen::applyPhotoMode() +{ + if (hasAppliedPhotoMode || !minecraft || !minecraft->gameRenderer) return; + + if (minecraft->player) { + oldX = minecraft->player->x; + oldY = minecraft->player->y; + oldZ = minecraft->player->z; + oldYaw = minecraft->player->yRot; + oldPitch = minecraft->player->xRot; + hasOldPose = true; + } + + oldHideGui = minecraft->options.getBooleanValue(OPTIONS_HIDEGUI); + oldThirdPerson = minecraft->options.getBooleanValue(OPTIONS_THIRD_PERSON_VIEW); + oldFixedCamera = minecraft->options.getBooleanValue(OPTIONS_FIXED_CAMERA); + Pos spawn = minecraft->level->getSharedSpawnPos(); + photoCameraX = (float) spawn.x; + photoCameraY = 128.0f; + photoCameraZ = (float) spawn.z; + if (!photoCameraTarget) { + photoCameraTarget = new TripodCamera(minecraft->level, minecraft->player, photoCameraX, photoCameraY, photoCameraZ); + } + photoCameraTarget->setPos(photoCameraX, photoCameraY, photoCameraZ); + photoCameraTarget->xo = photoCameraTarget->xOld = photoCameraX; + photoCameraTarget->yo = photoCameraTarget->yOld = photoCameraY; + photoCameraTarget->zo = photoCameraTarget->zOld = photoCameraZ; + + if (!oldHideGui) minecraft->options.toggle(OPTIONS_HIDEGUI); + if (!oldThirdPerson) minecraft->options.toggle(OPTIONS_THIRD_PERSON_VIEW); + if (!oldFixedCamera) minecraft->options.toggle(OPTIONS_FIXED_CAMERA); + + minecraft->gameRenderer->setPhotoModeIsometric(); + minecraft->levelRenderer->allChanged(); + hasAppliedPhotoMode = true; +} + +void UploadPhotoScreen::tick() +{ + if (!hasAppliedPhotoMode || !minecraft || !minecraft->player || !minecraft->level) return; + + if (photoCameraTarget) { + photoCameraTarget->setPos(photoCameraX, photoCameraY, photoCameraZ); + photoCameraTarget->xo = photoCameraTarget->xOld = photoCameraX; + photoCameraTarget->yo = photoCameraTarget->yOld = photoCameraY; + photoCameraTarget->zo = photoCameraTarget->zOld = photoCameraZ; + photoCameraTarget->yRot = photoCameraTarget->yRotO = 45.0f; + photoCameraTarget->xRot = photoCameraTarget->xRotO = 68.0f; + minecraft->cameraTargetPlayer = photoCameraTarget; + } +} + +void UploadPhotoScreen::restorePhotoMode() +{ + if (!hasAppliedPhotoMode || !minecraft) return; + + if (minecraft->options.getBooleanValue(OPTIONS_HIDEGUI) != oldHideGui) minecraft->options.toggle(OPTIONS_HIDEGUI); + if (minecraft->options.getBooleanValue(OPTIONS_THIRD_PERSON_VIEW) != oldThirdPerson) minecraft->options.toggle(OPTIONS_THIRD_PERSON_VIEW); + if (minecraft->options.getBooleanValue(OPTIONS_FIXED_CAMERA) != oldFixedCamera) minecraft->options.toggle(OPTIONS_FIXED_CAMERA); + minecraft->gameRenderer->clearPhotoModeIsometric(); + minecraft->cameraTargetPlayer = minecraft->player; + + if (hasOldPose && minecraft->player) { + minecraft->player->yRot = oldYaw; + minecraft->player->xRot = oldPitch; + } + + hasAppliedPhotoMode = false; +} + +void UploadPhotoScreen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + restorePhotoMode(); + minecraft->setScreen(NULL); + return; + } + + Screen::keyPressed(eventKey); +} + +void UploadPhotoScreen::buttonClicked(Button* button) +{ + if (!button || button->id != 1) return; + + restorePhotoMode(); + minecraft->setScreen(NULL); +} + +void UploadPhotoScreen::setupPositions() +{ + const int buttonWidth = 120; + const int buttonHeight = 24; + bBack->width = buttonWidth; + bBack->height = buttonHeight; + bBack->x = (width - buttonWidth) / 2; + bBack->y = height - 32; +} + +void UploadPhotoScreen::render(int xm, int ym, float a) +{ + drawCenteredString(font, "Photo Mode - Isometric", width / 2, 12, 0xffffff); + Screen::render(xm, ym, a); +} diff --git a/src/client/gui/screens/UploadPhotoScreen.h b/src/client/gui/screens/UploadPhotoScreen.h index 773f5bb..afe188f 100755 --- a/src/client/gui/screens/UploadPhotoScreen.h +++ b/src/client/gui/screens/UploadPhotoScreen.h @@ -1,36 +1,50 @@ -#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__ -#define NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__ - -#include "Screen.h" - -class UploadPhotoScreen : public Screen -{ -public: - - UploadPhotoScreen(); - virtual ~UploadPhotoScreen() {} - - virtual void init(); - - void render(int xm, int ym, float a) { - Screen::render(xm, ym, a); - } - -protected: - - virtual void mouseClicked(int x, int y, int buttonNum); - virtual void mouseReleased(int x, int y, int buttonNum); - virtual void keyPressed(int eventKey); - -private: - - int selectedItem; - - void renderSlots(); - void renderSlot(int slot, int x, int y, float a); - - int getSelectedSlot(int x, int y); - void selectSlotAndClose(); -}; - -#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__*/ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__ + +#include "../Screen.h" + +class Button; +class Mob; + +class UploadPhotoScreen : public Screen +{ +public: + + UploadPhotoScreen(); + virtual ~UploadPhotoScreen(); + + virtual void init(); + virtual void setupPositions(); + virtual void tick(); + virtual void removed(); + virtual void keyPressed(int eventKey); + + virtual void render(int xm, int ym, float a); + +protected: + + virtual void buttonClicked(Button* button); + +private: + + void applyPhotoMode(); + void restorePhotoMode(); + + bool hasAppliedPhotoMode; + bool oldHideGui; + bool oldThirdPerson; + bool oldFixedCamera; + bool hasOldPose; + float oldX; + float oldY; + float oldZ; + float oldYaw; + float oldPitch; + Mob* photoCameraTarget; + float photoCameraX; + float photoCameraY; + float photoCameraZ; + Button* bBack; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__UploadPhotoScreen_H__*/ diff --git a/src/client/renderer/GameRenderer.cpp b/src/client/renderer/GameRenderer.cpp index e104e26..f062aa3 100755 --- a/src/client/renderer/GameRenderer.cpp +++ b/src/client/renderer/GameRenderer.cpp @@ -34,6 +34,7 @@ static int _shTicks = -1; GameRenderer::GameRenderer( Minecraft* mc ) : mc(mc), renderDistance(0), + photoModeIsometric(false), _tick(0), _lastTickT(0), fovOffset(0), @@ -90,7 +91,7 @@ void renderCursor(float x, float y, Minecraft* minecraft) { /*private*/ void GameRenderer::setupCamera(float a, int eye) { - renderDistance = (float) (16 * 16 >> (mc->options.getIntValue(OPTIONS_VIEW_DISTANCE))); + renderDistance = photoModeIsometric ? 1024.0f : (float) (16 * 16 >> (mc->options.getIntValue(OPTIONS_VIEW_DISTANCE))); #if defined(ANDROID) if (mc->isPowerVR() && mc->options.getIntValue(OPTIONS_VIEW_DISTANCE) <= 2) renderDistance *= 0.8f; @@ -314,7 +315,7 @@ void GameRenderer::renderLevel(float a) { setupFog(1); // MCPE renders clouds using this, but this method breaks 3d clouds and also breaks 2d clouds transparency viewed from above, add as a Legacy Sky or Fast Sky option. - shredder if(!mc->options.getBooleanValue(OPTIONS_BETA_SKY)){ - if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) { + if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && !photoModeIsometric) { prepareAndRenderClouds(levelRenderer, a); } } @@ -573,6 +574,14 @@ void GameRenderer::bobView(float a) { /*private*/ void GameRenderer::setupFog(int i) { + if (photoModeIsometric) { + glDisable2(GL_FOG); + glFogf(GL_FOG_START, 0.0f); + glFogf(GL_FOG_END, 1024.0f); + glEnable2(GL_COLOR_MATERIAL); + return; + } + Mob* player = mc->cameraTargetPlayer; float fogBuffer[4] = {fr, fg, fb, 1}; @@ -829,6 +838,14 @@ void GameRenderer::tick(int nTick, int maxTick) { /*private*/ void GameRenderer::setupClearColor(float a) { + if (photoModeIsometric) { + fr = 0.47f; + fg = 0.78f; + fb = 1.0f; + glClearColor(fr, fg, fb, 1.0f); + return; + } + Level* level = mc->level; Mob* player = mc->cameraTargetPlayer; @@ -942,6 +959,28 @@ void GameRenderer::onGraphicsReset() if (itemInHandRenderer) itemInHandRenderer->onGraphicsReset(); } +void GameRenderer::setPhotoModeIsometric() +{ + photoModeIsometric = true; + thirdDistance = thirdDistanceO = 128.0f; + thirdRotation = thirdRotationO = 45.0f; + thirdTilt = thirdTiltO = 56.0f; + zoom = 1.0f; + zoom_x = 0.0f; + zoom_y = 0.0f; + cameraRoll = cameraRollO = 0.0f; +} + +void GameRenderer::clearPhotoModeIsometric() +{ + photoModeIsometric = false; +} + +bool GameRenderer::isPhotoModeIsometric() const +{ + return photoModeIsometric; +} + void GameRenderer::saveMatrices() { #if defined(RPI) diff --git a/src/client/renderer/GameRenderer.h b/src/client/renderer/GameRenderer.h index ca8d7ec..0b948a4 100755 --- a/src/client/renderer/GameRenderer.h +++ b/src/client/renderer/GameRenderer.h @@ -33,6 +33,9 @@ public: void renderItemInHand(float a, int eye); void onGraphicsReset(); + void setPhotoModeIsometric(); + void clearPhotoModeIsometric(); + bool isPhotoModeIsometric() const; void setupCamera(float a, int eye); void moveCameraToPlayer(float a); @@ -58,6 +61,7 @@ private: Minecraft* mc; float renderDistance; + bool photoModeIsometric; int _tick; Vec3 pickDirection; diff --git a/src/client/renderer/LevelRenderer.cpp b/src/client/renderer/LevelRenderer.cpp index 2630d63..b47e6de 100755 --- a/src/client/renderer/LevelRenderer.cpp +++ b/src/client/renderer/LevelRenderer.cpp @@ -193,7 +193,9 @@ void LevelRenderer::allChanged() TileRenderer::setUseTint(sideTint); - int dist = (512 >> 3) << (3 - lastViewDistance); + int dist = mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric() + ? 1024 + : (512 >> 3) << (3 - lastViewDistance); if (lastViewDistance <= 2 && mc->isPowerVR()) dist = (int)((float)dist * 0.8f); LOGI("last: %d, power: %d\n", lastViewDistance, mc->isPowerVR()); @@ -202,7 +204,9 @@ void LevelRenderer::allChanged() dist *= 0.6f; #endif - if (dist > 400) dist = 400; + if (!(mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric())) { + if (dist > 400) dist = 400; + } /* * if (Minecraft.FLYBY_MODE) { dist = 512 - CHUNK_SIZE * 2; } */ @@ -674,9 +678,11 @@ void LevelRenderer::tick() bool LevelRenderer::updateDirtyChunks( Mob* player, bool force ) { - bool slow = false; + bool slow = mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric(); if (slow) { + const int visibleLimit = 12; + const int invisibleLimit = 4; DirtyChunkSorter dirtySorter(player); std::sort(dirtyChunks.begin(), dirtyChunks.end(), dirtySorter); int s = dirtyChunks.size() - 1; @@ -686,9 +692,9 @@ bool LevelRenderer::updateDirtyChunks( Mob* player, bool force ) if (!force) { if (chunk->distanceToSqr(player) > 16 * 16) { if (chunk->visible) { - if (i >= MAX_VISIBLE_REBUILDS_PER_FRAME) return false; + if (i >= visibleLimit) return false; } else { - if (i >= MAX_INVISIBLE_REBUILDS_PER_FRAME) return false; + if (i >= invisibleLimit) return false; } } } else { @@ -702,10 +708,9 @@ bool LevelRenderer::updateDirtyChunks( Mob* player, bool force ) return dirtyChunks.size() == 0; } else { - const int count = 3; - + const int count = (mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric()) ? 32 : 3; + Chunk* toAdd[24] = {NULL}; DirtyChunkSorter dirtyChunkSorter(player); - Chunk* toAdd[count] = {NULL}; std::vector* nearChunks = NULL; int pendingChunkSize = dirtyChunks.size(); @@ -715,7 +720,7 @@ bool LevelRenderer::updateDirtyChunks( Mob* player, bool force ) Chunk* chunk = dirtyChunks[i]; if (!force) { - if (chunk->distanceToSqr(player) > 1024.0f) { + if (chunk->distanceToSqr(player) > ((mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric()) ? 65536.0f : 1024.0f)) { int index; // is this chunk in the closest ? @@ -754,7 +759,7 @@ bool LevelRenderer::updateDirtyChunks( Mob* player, bool force ) // if there are nearby chunks that need to be prepared for // rendering, sort them and then process them - static const float MaxFrameTime = 1.0f / 100.0f; + static const float MaxFrameTime = (mc->gameRenderer && mc->gameRenderer->isPhotoModeIsometric()) ? (1.0f / 75.0f) : (1.0f / 100.0f); Stopwatch chunkWatch; chunkWatch.start();