#pragma once #include #include class Level; class LevelSource; class Tile; class RailTile; class Material; class TileEntity; class ThinFenceTile; class FenceTile; class FenceGateTile; class BrewingStandTile; class CauldronTile; class EggTile; class TheEndPortalFrameTile; class RepeaterTile; class ComparatorTile; class DiodeTile; class FireTile; class StemTile; class StairTile; class CocoaTile; class AnvilTile; class FlowerPotTile; class WallTile; class BeaconTile; class HopperTile; class Icon; class Minecraft; class TileRenderer { friend class FallingTileRenderer; private: LevelSource* level; Icon* fixedTexture; bool xFlipTexture; bool noCulling; public: static bool fancy; bool setColor; float tileShapeX0; float tileShapeX1; float tileShapeY0; float tileShapeY1; float tileShapeZ0; float tileShapeZ1; bool fixedShape; bool smoothShapeLighting; Minecraft* minecraft; ///////////////////////////////////////// Data caching std::unordered_map getLightColorCount; int xMin, yMin, zMin; int xMin2, yMin2, zMin2; int getLightColor(Tile* tt, LevelSource* level, int x, int y, int z); float getShadeBrightness(Tile* tt, LevelSource* level, int x, int y, int z); bool isTranslucentAt(LevelSource* level, int x, int y, int z); unsigned int* cache; unsigned char* tileIds; static const unsigned int cache_getLightColor_valid = 0x80000000; static const unsigned int cache_isTranslucentAt_valid = 0x40000000; static const unsigned int cache_isSolidBlockingTile_valid = 0x20000000; static const unsigned int cache_getLightColor_mask = 0x00f000f0; static const unsigned int cache_isTranslucentAt_flag = 0x00000001; static const unsigned int cache_isSolidBlockingTile_flag = 0x00000002; ///////////////////////////////////////// void _init(); public: TileRenderer(LevelSource* level, int xMin, int yMin, int zMin, unsigned char* tileIds); TileRenderer(LevelSource* level); TileRenderer(); ~TileRenderer(); void setFixedTexture(Icon* fixedTexture); void clearFixedTexture(); bool hasFixedTexture(); void setShape(float x0, float y0, float z0, float x1, float y1, float z1); void setShape(Tile* tt); void setFixedShape(float x0, float y0, float z0, float x1, float y1, float z1); void clearFixedShape(); void tesselateInWorldFixedTexture( Tile* tile, int x, int y, int z, Icon* fixedTexture); // 4J renamed to differentiate from tesselateInWorld void tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr< TileEntity>()); // 4J added forceData, forceEntity param bool tesselateInWorld( Tile* tt, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr< TileEntity>()); // 4J added forceData, forceEntity param private: bool tesselateAirPortalFrameInWorld(TheEndPortalFrameTile* tt, int x, int y, int z); bool tesselateBedInWorld(Tile* tt, int x, int y, int z); bool tesselateBrewingStandInWorld(BrewingStandTile* tt, int x, int y, int z); bool tesselateCauldronInWorld(CauldronTile* tt, int x, int y, int z); bool tesselateFlowerPotInWorld(FlowerPotTile* tt, int x, int y, int z); bool tesselateAnvilInWorld(AnvilTile* tt, int x, int y, int z); public: bool tesselateAnvilInWorld(AnvilTile* tt, int x, int y, int z, int data); private: bool tesselateAnvilInWorld(AnvilTile* tt, int x, int y, int z, int data, bool render); float tesselateAnvilPiece(AnvilTile* tt, int x, int y, int z, int part, float bottom, float width, float height, float length, bool rotate, bool render, int data); public: bool tesselateTorchInWorld(Tile* tt, int x, int y, int z); private: bool tesselateRepeaterInWorld(RepeaterTile* tt, int x, int y, int z); bool tesselateComparatorInWorld(ComparatorTile* tt, int x, int y, int z); bool tesselateDiodeInWorld(DiodeTile* tt, int x, int y, int z); void tesselateDiodeInWorld(DiodeTile* tt, int x, int y, int z, int dir); static const int FLIP_NONE = 0, FLIP_CW = 1, FLIP_CCW = 2, FLIP_180 = 3; int northFlip; int southFlip; int eastFlip; int westFlip; int upFlip; int downFlip; public: void tesselatePistonBaseForceExtended( Tile* tile, int x, int y, int z, int forceData = -1); // 4J added data param private: bool tesselatePistonBaseInWorld(Tile* tt, int x, int y, int z, bool forceExtended, int forceData = -1); // 4J added data param void renderPistonArmUpDown(float x0, float x1, float y0, float y1, float z0, float z1, float br, float armLengthPixels); void renderPistonArmNorthSouth(float x0, float x1, float y0, float y1, float z0, float z1, float br, float armLengthPixels); void renderPistonArmEastWest(float x0, float x1, float y0, float y1, float z0, float z1, float br, float armLengthPixels); public: void tesselatePistonArmNoCulling( Tile* tile, int x, int y, int z, bool fullArm, int forceData = -1); // 4J added data param private: bool tesselatePistonExtensionInWorld( Tile* tt, int x, int y, int z, bool fullArm, int forceData = -1); // 4J added data param public: bool tesselateLeverInWorld(Tile* tt, int x, int y, int z); bool tesselateTripwireSourceInWorld(Tile* tt, int x, int y, int z); bool tesselateTripwireInWorld(Tile* tt, int x, int y, int z); bool tesselateFireInWorld(FireTile* tt, int x, int y, int z); bool tesselateDustInWorld(Tile* tt, int x, int y, int z); bool tesselateRailInWorld(RailTile* tt, int x, int y, int z); bool tesselateLadderInWorld(Tile* tt, int x, int y, int z); bool tesselateVineInWorld(Tile* tt, int x, int y, int z); bool tesselateThinPaneInWorld(Tile* tt, int x, int y, int z); bool tesselateThinFenceInWorld(ThinFenceTile* tt, int x, int y, int z); bool tesselateCrossInWorld(Tile* tt, int x, int y, int z); bool tesselateStemInWorld(Tile* _tt, int x, int y, int z); bool tesselateRowInWorld(Tile* tt, int x, int y, int z); void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza, int data); void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z, float scale); void tesselateStemTexture(Tile* tt, int data, float h, float x, float y, float z); bool tesselateLilypadInWorld(Tile* tt, int x, int y, int z); void tesselateStemDirTexture(StemTile* tt, int data, int dir, float h, float x, float y, float z); void tesselateRowTexture(Tile* tt, int data, float x, float y, float z); bool tesselateWaterInWorld(Tile* tt, int x, int y, int z); private: float getWaterHeight(int x, int y, int z, Material* m); public: void renderBlock(Tile* tt, Level* level, int x, int y, int z); void renderBlock(Tile* tt, Level* level, int x, int y, int z, int data); bool tesselateBlockInWorld(Tile* tt, int x, int y, int z); // AP - added so we can cull earlier bool tesselateBlockInWorld(Tile* tt, int x, int y, int z, int faceFlags); bool tesselateTreeInWorld(Tile* tt, int x, int y, int z); bool tesselateQuartzInWorld(Tile* tt, int x, int y, int z); bool tesselateCocoaInWorld(CocoaTile* tt, int x, int y, int z); private: bool applyAmbienceOcclusion; float llxyz, llxy0, llxyZ, ll0yz, ll0yZ, llXyz, llXy0; float llXyZ, llxYz, llxY0, llxYZ, ll0Yz, llXYz, llXY0; float ll0YZ, llXYZ, llx0z, llX0z, llx0Z, llX0Z; // 4J - brought forward changes from 1.8.2 int ccxyz, ccxy0, ccxyZ, cc0yz, cc0yZ, ccXyz, ccXy0; int ccXyZ, ccxYz, ccxY0, ccxYZ, cc0Yz, ccXYz, ccXY0; int cc0YZ, ccXYZ, ccx0z, ccX0z, ccx0Z, ccX0Z; int tc1, tc2, tc3, tc4; // 4J - brought forward changes from 1.8.2 float c1r, c2r, c3r, c4r; float c1g, c2g, c3g, c4g; float c1b, c2b, c3b, c4b; public: // 4J - brought forward changes from 1.8.2 // AP - added faceFlags so we can cull earlier bool tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tt, int pX, int pY, int pZ, float pBaseRed, float pBaseGreen, float pBaseBlue, int faceFlags, bool smoothShapeLighting); private: int blend(int a, int b, int c, int def); int blend(int a, int b, int c, int d, double fa, double fb, double fc, double fd); public: bool tesselateBlockInWorld(Tile* tt, int x, int y, int z, float r, float g, float b); bool tesselateBeaconInWorld(Tile* tt, int x, int y, int z); bool tesselateCactusInWorld(Tile* tt, int x, int y, int z); bool tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r, float g, float b); bool tesselateFenceInWorld(FenceTile* tt, int x, int y, int z); bool tesselateWallInWorld(WallTile* tt, int x, int y, int z); bool tesselateEggInWorld(EggTile* tt, int x, int y, int z); bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z); bool tesselateHopperInWorld(Tile* tt, int x, int y, int z); bool tesselateHopperInWorld(Tile* tt, int x, int y, int z, int data, bool render); bool tesselateStairsInWorld(StairTile* tt, int x, int y, int z); bool tesselateDoorInWorld(Tile* tt, int x, int y, int z); void renderFaceUp(Tile* tt, double x, double y, double z, Icon* tex); void renderFaceDown(Tile* tt, double x, double y, double z, Icon* tex); void renderNorth(Tile* tt, double x, double y, double z, Icon* tex); void renderSouth(Tile* tt, double x, double y, double z, Icon* tex); void renderWest(Tile* tt, double x, double y, double z, Icon* tex); void renderEast(Tile* tt, double x, double y, double z, Icon* tex); void renderCube(Tile* tile, float alpha); void renderTile(Tile* tile, int data, float brightness, float fAlpha = 1.0f, bool useCompiled = true); // 4J Added useCompiled static bool canRender(int renderShape); Icon* getTexture(Tile* tile, LevelSource* level, int x, int y, int z, int face); Icon* getTexture(Tile* tile, int face, int data); Icon* getTexture(Tile* tile, int face); Icon* getTexture(Tile* tile); Icon* getTextureOrMissing(Icon* icon); };