the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 894 lines 36 kB view raw
1#include "stdafx.h" 2#ifdef __PS3__ 3#ifndef SN_TARGET_PS3_SPU 4// #include "..\..\..\stdafx.h" 5#endif 6#endif 7 8#include "ChunkRebuildData.h" 9#include "Tesselator_SPU.h" 10 11 12#ifndef SN_TARGET_PS3_SPU 13#include "..\..\..\..\Minecraft.World\Tile.h" 14#include "..\..\..\..\Minecraft.World\Level.h" 15#include "..\..\..\..\Minecraft.World\Dimension.h" 16// 17// #include "..\..\..\Chunk.h" 18// #include "..\..\..\TileRenderer.h" 19// #include "..\..\..\TileEntityRenderDispatcher.h" 20// #include "..\..\..\LevelRenderer.h" 21#include "..\..\..\..\Minecraft.World\net.minecraft.world.level.h" 22#include "..\..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" 23#include "..\..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" 24#include "..\..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" 25#include "..\..\..\..\Minecraft.World\Icon.h" 26#include "..\..\..\..\Minecraft.World\BiomeSource.h" 27 28#else 29 30#include "..\Common\spu_assert.h" 31 32#endif //SN_TARGET_PS3_SPU 33 34static const int Level_maxBuildHeight = 256; 35static const int Level_MAX_LEVEL_SIZE = 30000000; 36static const int Level_MAX_BRIGHTNESS = 15; 37 38 39#include "TileRenderer_SPU.h" 40#include "Tile_SPU.h" 41#include "ChunkRebuildData.h" 42TileData_SPU g_tileSPUData; 43 44static const int MAX_LEVEL_SIZE = 30000000; 45static const int MAX_BRIGHTNESS = 15; 46 47#if 0 //def SN_TARGET_PS3_SPU 48int ChunkRebuildData::getTile( int x, int y, int z ) { return m_tileIds[getTileIdx(x,y,z)]; } 49int ChunkRebuildData::getBrightnessSky(int x, int y, int z) { return m_brightness[getTileIdx(x,y,z)] & 0x0f; } 50int ChunkRebuildData::getBrightnessBlock(int x, int y, int z) { return m_brightness[getTileIdx(x,y,z)] >> 4; } 51int ChunkRebuildData::getData(int x, int y, int z) { return m_data_flags[getTileIdx(x,y,z)] & 0x0f; } 52int ChunkRebuildData::getGrassColor( int x, int z ) { return m_grassColor[getTileIdx(x,z)]; } 53int ChunkRebuildData::getFoliageColor( int x, int z ) { return m_foliageColor[getTileIdx(x,z)]; } 54int ChunkRebuildData::getFlags(int x, int y, int z) { return m_data_flags[getTileIdx(x,y,z)] >> 4; } 55void ChunkRebuildData::setFlag(int x, int y, int z, int flag) { m_data_flags[getTileIdx(x,y,z)] |= (flag<<4);} 56#endif 57 58 59 60void ChunkRebuildData::disableUnseenTiles() 61{ 62 // We now go through the vertical section of this level chunk that we are interested in and try and establish 63 // (1) if it is completely empty 64 // (2) if any of the tiles can be quickly determined to not need rendering because they are in the middle of other tiles and 65 // so can't be seen. A large amount (> 60% in tests) of tiles that call tesselateInWorld in the unoptimised version 66 // of this function fall into this category. By far the largest category of these are tiles in solid regions of rock. 67 int startX = m_x0+2; // beginning of the chunk 68 int startY = m_y0+2; // beginning of the chunk 69 int startZ = m_z0+2; // beginning of the chunk 70 71 for(int iX=startX; iX<(startX+16); iX++) 72 { 73 for(int iY=startY; iY<(startY+16); iY++) 74 { 75 for(int iZ=startZ; iZ<(startZ+16); iZ++) 76 { 77 int tileID = getTile(iX,iY,iZ); 78 if( tileID == 0 ) continue; 79 m_flags &= ~e_flag_EmptyChunk; 80 81 82 // Don't bother trying to work out neighbours for this tile if we are at the edge of the chunk - apart from the very 83 // bottom of the world where we shouldn't ever be able to see 84 if( iY == 127 ) continue; 85 if(( iX-startX == 0 ) || ( iX-startX == 15 )) continue; 86 if(( iZ-startZ == 0 ) || ( iZ-startZ == 15 )) continue; 87 88 int flags = getFlags(iX, iY, iZ); 89 90 // Establish whether this tile and its neighbours are all made of rock, dirt, unbreakable tiles, or have already 91 // been determined to meet this criteria themselves and have a tile of 255 set. 92 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 93 tileID = getTile(iX-1, iY, iZ); 94 flags = getFlags(iX-1, iY, iZ); 95 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 96 tileID = getTile(iX+1, iY, iZ); 97 flags = getFlags(iX+1, iY, iZ); 98 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 99 tileID = getTile(iX, iY, iZ-1); 100 flags = getFlags(iX, iY, iZ-1); 101 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 102 tileID = getTile(iX, iY, iZ+1); 103 flags = getFlags(iX, iY, iZ+1); 104 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 105 // Treat the bottom of the world differently - we shouldn't ever be able to look up at this, so consider tiles as invisible 106 // if they are surrounded on sides other than the bottom 107 if( iY > 0 ) 108 { 109 tileID = getTile(iX, iY-1, iZ); 110 flags = getFlags(iX, iY-1, iZ); 111 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 112 } 113 tileID = getTile(iX, iY+1, iZ); 114 flags = getFlags(iX, iY+1, iZ); 115 if( !( ( tileID == Tile_SPU::rock_Id ) || ( tileID == Tile_SPU::dirt_Id ) || ( tileID == Tile_SPU::unbreakable_Id ) || ( flags & e_flag_NoRender) ) ) continue; 116 117 // This tile is surrounded. Flag it as not requiring to be rendered by setting its id to 255. 118 setFlag(iX, iY, iZ, e_flag_NoRender); 119 } 120 } 121 } 122} 123 124#ifndef SN_TARGET_PS3_SPU 125 126void setIconSPUFromIcon(Icon_SPU* iconSpu, Icon* icon) 127{ 128 iconSpu->set(icon->getX(), icon->getY(), icon->getWidth(), icon->getHeight(), icon->getSourceWidth(), icon->getSourceHeight()); 129} 130 131void ChunkRebuildData::buildMaterial(int matSPUIndex, Material* mat) 132{ 133 Material_SPU* matSPU = &m_tileData.materials[matSPUIndex]; 134 matSPU->id = matSPUIndex; 135 matSPU->color = mat->color->col; 136 matSPU->flags =0; 137 matSPU->flags |= mat->isFlammable() ? Material_SPU::e_flammable : 0; 138 matSPU->flags |= mat->isReplaceable() ? Material_SPU::e_replaceable : 0; 139 matSPU->flags |= mat->_neverBuildable ? Material_SPU::e_neverBuildable : 0; 140 matSPU->flags |= mat->isSolid() ? Material_SPU::e_isSolid : 0; 141 matSPU->flags |= mat->isLiquid() ? Material_SPU::e_isLiquid : 0; 142 matSPU->flags |= mat->blocksLight() ? Material_SPU::e_blocksLight : 0; 143 matSPU->flags |= mat->blocksMotion() ? Material_SPU::e_blocksMotion : 0; 144} 145 146void ChunkRebuildData::buildMaterials() 147{ 148 buildMaterial(Material_SPU::air_Id, Material::air); 149 buildMaterial(Material_SPU::grass_Id, Material::grass); 150 buildMaterial(Material_SPU::dirt_Id, Material::dirt); 151 buildMaterial(Material_SPU::wood_Id, Material::wood); 152 buildMaterial(Material_SPU::stone_Id, Material::stone); 153 buildMaterial(Material_SPU::metal_Id, Material::metal); 154 buildMaterial(Material_SPU::water_Id, Material::water); 155 buildMaterial(Material_SPU::lava_Id, Material::lava); 156 buildMaterial(Material_SPU::leaves_Id, Material::leaves); 157 buildMaterial(Material_SPU::plant_Id, Material::plant); 158 buildMaterial(Material_SPU::replaceable_plant_Id, Material::replaceable_plant); 159 buildMaterial(Material_SPU::sponge_Id, Material::sponge); 160 buildMaterial(Material_SPU::cloth_Id, Material::cloth); 161 buildMaterial(Material_SPU::fire_Id, Material::fire); 162 buildMaterial(Material_SPU::sand_Id, Material::sand); 163 buildMaterial(Material_SPU::decoration_Id, Material::decoration); 164 buildMaterial(Material_SPU::clothDecoration_Id, Material::clothDecoration); 165 buildMaterial(Material_SPU::glass_Id, Material::glass); 166 buildMaterial(Material_SPU::explosive_Id, Material::explosive); 167 buildMaterial(Material_SPU::coral_Id, Material::coral); 168 buildMaterial(Material_SPU::ice_Id, Material::ice); 169 buildMaterial(Material_SPU::topSnow_Id, Material::topSnow); 170 buildMaterial(Material_SPU::snow_Id, Material::snow); 171 buildMaterial(Material_SPU::cactus_Id, Material::cactus); 172 buildMaterial(Material_SPU::clay_Id, Material::clay); 173 buildMaterial(Material_SPU::vegetable_Id, Material::vegetable); 174 buildMaterial(Material_SPU::egg_Id, Material::egg); 175 buildMaterial(Material_SPU::portal_Id, Material::portal); 176 buildMaterial(Material_SPU::cake_Id, Material::cake); 177 buildMaterial(Material_SPU::web_Id, Material::web); 178 buildMaterial(Material_SPU::piston_Id, Material::piston); 179 buildMaterial(Material_SPU::buildable_glass_Id, Material::buildable_glass); 180 buildMaterial(Material_SPU::heavyMetal_Id, Material::heavyMetal); 181} 182 183int ChunkRebuildData::getMaterialID(Tile* pTile) 184{ 185 Material* m = pTile->material; 186 if(m == Material::air) return Material_SPU::air_Id; 187 if(m == Material::grass) return Material_SPU::grass_Id; 188 if(m == Material::dirt) return Material_SPU::dirt_Id; 189 if(m == Material::wood) return Material_SPU::wood_Id; 190 if(m == Material::stone) return Material_SPU::stone_Id; 191 if(m == Material::metal) return Material_SPU::metal_Id; 192 if(m == Material::water) return Material_SPU::water_Id; 193 if(m == Material::lava) return Material_SPU::lava_Id; 194 if(m == Material::leaves) return Material_SPU::leaves_Id; 195 if(m == Material::plant) return Material_SPU::plant_Id; 196 if(m == Material::replaceable_plant)return Material_SPU::replaceable_plant_Id; 197 if(m == Material::sponge) return Material_SPU::sponge_Id; 198 if(m == Material::cloth) return Material_SPU::cloth_Id; 199 if(m == Material::fire) return Material_SPU::fire_Id; 200 if(m == Material::sand) return Material_SPU::sand_Id; 201 if(m == Material::decoration) return Material_SPU::decoration_Id; 202 if(m == Material::clothDecoration) return Material_SPU::clothDecoration_Id; 203 if(m == Material::glass) return Material_SPU::glass_Id; 204 if(m == Material::explosive) return Material_SPU::explosive_Id; 205 if(m == Material::coral) return Material_SPU::coral_Id; 206 if(m == Material::ice) return Material_SPU::ice_Id; 207 if(m == Material::topSnow) return Material_SPU::topSnow_Id; 208 if(m == Material::snow) return Material_SPU::snow_Id; 209 if(m == Material::cactus) return Material_SPU::cactus_Id; 210 if(m == Material::clay) return Material_SPU::clay_Id; 211 if(m == Material::vegetable) return Material_SPU::vegetable_Id; 212 if(m == Material::egg) return Material_SPU::egg_Id; 213 if(m == Material::portal) return Material_SPU::portal_Id; 214 if(m == Material::cake) return Material_SPU::cake_Id; 215 if(m == Material::web) return Material_SPU::web_Id; 216 if(m == Material::piston) return Material_SPU::piston_Id; 217 if(m == Material::buildable_glass) return Material_SPU::buildable_glass_Id; 218 if(m == Material::heavyMetal) return Material_SPU::heavyMetal_Id; 219 assert(0); 220 return Material_SPU::air_Id; 221} 222 223 224void ChunkRebuildData::createTileData() 225{ 226 // build the material data 227 buildMaterials(); 228 229 // build the tile data 230 for(int i=0;i<256;i++) 231 { 232 m_tileData.mipmapEnable.set(i, Tile::mipmapEnable[i]); 233 m_tileData.solid.set(i, Tile::solid[i]); 234 m_tileData.transculent.set(i, Tile::transculent[i]); 235// m_tileData._sendTileData.set(i, Tile::_sendTileData[i]); 236 m_tileData.propagate.set(i, Tile::propagate[i]); 237 m_tileData.lightBlock[i] = Tile::lightBlock[i]; 238 m_tileData.lightEmission[i] = Tile::lightEmission[i]; 239 if(Tile::tiles[i]) 240 { 241 m_tileData.signalSource.set(i, Tile::tiles[i]->isSignalSource()); 242 m_tileData.cubeShaped.set(i, Tile::tiles[i]->isCubeShaped()); 243 244 m_tileData.xx0[i] = (float)Tile::tiles[i]->getShapeX0(); 245 m_tileData.yy0[i] = (float)Tile::tiles[i]->getShapeY0(); 246 m_tileData.zz0[i] = (float)Tile::tiles[i]->getShapeZ0(); 247 m_tileData.xx1[i] = (float)Tile::tiles[i]->getShapeX1(); 248 m_tileData.yy1[i] = (float)Tile::tiles[i]->getShapeY1(); 249 m_tileData.zz1[i] = (float)Tile::tiles[i]->getShapeZ1(); 250 Icon* pTex = Tile::tiles[i]->icon; 251 if(pTex) 252 { 253 setIconSPUFromIcon(&m_tileData.iconData[i], pTex); 254 } 255 m_tileData.materialIDs[i] = getMaterialID(Tile::tiles[i]); 256 } 257 } 258 m_tileData.leafTile_allowSame = Tile::leaves->allowSame; 259 m_tileData.leafTile_fancyTextureSet = Tile::leaves->fancyTextureSet; 260 261 262 // Custom tile textures 263 // get the width and height of any texture, since everything uses the same texture 264 m_tileData.iconTexWidth = Tile::grass->iconTop->getSourceWidth(); 265 m_tileData.iconTexHeight = Tile::grass->iconTop->getSourceHeight(); 266 // Grass tile 267 setIconSPUFromIcon(&m_tileData.grass_iconTop, Tile::grass->iconTop); 268 setIconSPUFromIcon(&m_tileData.grass_iconSnowSide, Tile::grass->iconSnowSide); 269 setIconSPUFromIcon(&m_tileData.grass_iconSideOverlay, Tile::grass->iconSideOverlay); 270 271 // ThinFence 272 setIconSPUFromIcon(&m_tileData.ironFence_EdgeTexture, ((ThinFenceTile*)Tile::ironFence)->getEdgeTexture()); 273 setIconSPUFromIcon(&m_tileData.thinGlass_EdgeTexture, ((ThinFenceTile*)Tile::thinGlass)->getEdgeTexture()); 274 275 //FarmTile 276 setIconSPUFromIcon(&m_tileData.farmTile_Dry, ((FarmTile*)Tile::farmland)->iconDry); 277 setIconSPUFromIcon(&m_tileData.farmTile_Wet, ((FarmTile*)Tile::farmland)->iconWet); 278 279 // DoorTile 280 for(int i=0;i<8; i++) 281 { 282 setIconSPUFromIcon(&m_tileData.doorTile_Icons[i], ((DoorTile*)Tile::door_wood)->icons[i]); 283 // we're not supporting flipped icons, so manually flip here 284 if(i>=4) 285 m_tileData.doorTile_Icons[i].flipHorizontal(); 286 } 287 288 // TallGrass 289 for(int i=0;i<3; i++) 290 setIconSPUFromIcon(&m_tileData.tallGrass_Icons[i], Tile::tallgrass->icons[i]); 291 292 // SandStoneTile 293 for(int i=0;i<3; i++) 294 setIconSPUFromIcon(&m_tileData.sandStone_icons[i], ((SandStoneTile*)Tile::sandStone)->icons[i]); 295 setIconSPUFromIcon(&m_tileData.sandStone_iconTop, ((SandStoneTile*)Tile::sandStone)->iconTop); 296 setIconSPUFromIcon(&m_tileData.sandStone_iconBottom, ((SandStoneTile*)Tile::sandStone)->iconBottom); 297 298 // WoodTile 299// assert(WoodTile_SPU::WOOD_NAMES_LENGTH == 4); 300 for(int i=0;i<4; i++) 301 setIconSPUFromIcon(&m_tileData.woodTile_icons[i], ((WoodTile*)Tile::wood)->icons[i]); 302 303 // TreeTile 304// assert(TreeTile_SPU::TREE_NAMES_LENGTH == 4); 305 for(int i=0;i<4; i++) 306 setIconSPUFromIcon(&m_tileData.treeTile_icons[i], ((TreeTile*)Tile::treeTrunk)->icons[i]); 307 setIconSPUFromIcon(&m_tileData.treeTile_iconTop, ((TreeTile*)Tile::treeTrunk)->iconTop); 308 309 // LeafTile 310 for(int i=0;i<2; i++) 311 for(int j=0;j<4;j++) 312 setIconSPUFromIcon(&m_tileData.leafTile_icons[i][j], ((LeafTile*)Tile::leaves)->icons[i][j]); 313 314 // CropTile 315 for(int i=0;i<8; i++) 316 setIconSPUFromIcon(&m_tileData.cropTile_icons[i], ((CropTile*)Tile::crops)->icons[i]); 317 318 // FurnaceTile 319 setIconSPUFromIcon(&m_tileData.furnaceTile_iconTop, ((FurnaceTile*)Tile::furnace)->iconTop); 320 setIconSPUFromIcon(&m_tileData.furnaceTile_iconFront, ((FurnaceTile*)Tile::furnace)->iconFront); 321 setIconSPUFromIcon(&m_tileData.furnaceTile_iconFront_lit, ((FurnaceTile*)Tile::furnace_lit)->iconFront); 322 323 //LiquidTile 324 setIconSPUFromIcon(&m_tileData.liquidTile_iconWaterStill, (Tile::water)->icons[0]); 325 setIconSPUFromIcon(&m_tileData.liquidTile_iconWaterFlow, (Tile::water)->icons[1]); 326 setIconSPUFromIcon(&m_tileData.liquidTile_iconLavaStill, (Tile::lava)->icons[0]); 327 setIconSPUFromIcon(&m_tileData.liquidTile_iconLavaFlow, (Tile::lava)->icons[1]); 328 329 //FireTile 330 for(int i=0;i<2;i++) 331 setIconSPUFromIcon(&m_tileData.fireTile_icons[i], (Tile::fire)->icons[i]); 332 333 // Sapling 334 for(int i=0;i<4;i++) 335 setIconSPUFromIcon(&m_tileData.sapling_icons[i], ((Sapling*)Tile::sapling)->icons[i]); 336 337 m_tileData.glassTile_allowSame = ((GlassTile*)Tile::glass)->allowSame; 338 m_tileData.iceTile_allowSame = ((IceTile*)Tile::ice)->allowSame; 339 340 // DispenserTile 341 setIconSPUFromIcon(&m_tileData.dispenserTile_iconTop, ((DispenserTile*)Tile::dispenser)->iconTop); 342 setIconSPUFromIcon(&m_tileData.dispenserTile_iconFront, ((DispenserTile*)Tile::dispenser)->iconFront); 343 setIconSPUFromIcon(&m_tileData.dispenserTile_iconFrontVertical, ((DispenserTile*)Tile::dispenser)->iconFrontVertical); 344 345 // RailTile 346 setIconSPUFromIcon(&m_tileData.railTile_iconTurn, ((RailTile*)Tile::rail)->iconTurn); 347 setIconSPUFromIcon(&m_tileData.railTile_iconTurnGolden, ((RailTile*)Tile::goldenRail)->iconTurn); 348 349 for(int i=0;i<2;i++) 350 setIconSPUFromIcon(&m_tileData.detectorRailTile_icons[i], ((DetectorRailTile*)Tile::detectorRail)->icons[i]); 351 352 // tntTile 353 setIconSPUFromIcon(&m_tileData.tntTile_iconBottom, ((TntTile*)Tile::tnt)->iconBottom); 354 setIconSPUFromIcon(&m_tileData.tntTile_iconTop, ((TntTile*)Tile::tnt)->iconTop); 355 356 // workbenchTile 357 setIconSPUFromIcon(&m_tileData.workBench_iconFront, ((WorkbenchTile*)Tile::workBench)->iconFront); 358 setIconSPUFromIcon(&m_tileData.workBench_iconTop, ((WorkbenchTile*)Tile::workBench)->iconTop); 359 360 // cactusTile 361 setIconSPUFromIcon(&m_tileData.cactusTile_iconTop, ((CactusTile*)Tile::cactus)->iconTop); 362 setIconSPUFromIcon(&m_tileData.cactusTile_iconBottom, ((CactusTile*)Tile::cactus)->iconBottom); 363 364 // recordPlayer 365 setIconSPUFromIcon(&m_tileData.recordPlayer_iconTop, ((RecordPlayerTile*)Tile::recordPlayer)->iconTop); 366 367 // pumpkin 368 setIconSPUFromIcon(&m_tileData.pumpkinTile_iconTop, ((PumpkinTile*)Tile::pumpkin)->iconTop); 369 setIconSPUFromIcon(&m_tileData.pumpkinTile_iconFace, ((PumpkinTile*)Tile::pumpkin)->iconFace); 370 setIconSPUFromIcon(&m_tileData.pumpkinTile_iconFaceLit, ((PumpkinTile*)Tile::litPumpkin)->iconFace); 371 372 // cakeTile 373 setIconSPUFromIcon(&m_tileData.cakeTile_iconTop, ((CakeTile*)Tile::cake)->iconTop); 374 setIconSPUFromIcon(&m_tileData.cakeTile_iconBottom, ((CakeTile*)Tile::cake)->iconBottom); 375 setIconSPUFromIcon(&m_tileData.cakeTile_iconInner, ((CakeTile*)Tile::cake)->iconInner); 376 377 // SmoothStoneBrickTile 378 for(int i=0;i<4;i++) 379 setIconSPUFromIcon(&m_tileData.smoothStoneBrick_icons[i], ((SmoothStoneBrickTile*)Tile::stoneBrickSmooth)->icons[i]); 380 381 // HugeMushroomTile 382 for(int i=0;i<2;i++) 383 setIconSPUFromIcon(&m_tileData.hugeMushroom_icons[i], ((HugeMushroomTile*)Tile::hugeMushroom1)->icons[i]); 384 setIconSPUFromIcon(&m_tileData.hugeMushroom_iconStem, ((HugeMushroomTile*)Tile::hugeMushroom1)->iconStem); 385 setIconSPUFromIcon(&m_tileData.hugeMushroom_iconInside, ((HugeMushroomTile*)Tile::hugeMushroom1)->iconInside); 386 387 388 // MelonTile 389 setIconSPUFromIcon(&m_tileData.melonTile_iconTop, ((MelonTile*)Tile::melon)->iconTop); 390 391 // StemTile 392 setIconSPUFromIcon(&m_tileData.stemTile_iconAngled, ((StemTile*)Tile::melonStem)->iconAngled); 393 394 // MycelTile 395 setIconSPUFromIcon(&m_tileData.mycelTile_iconTop, (Tile::mycel)->iconTop); 396 setIconSPUFromIcon(&m_tileData.mycelTile_iconSnowSide, (Tile::mycel)->iconSnowSide); 397 398 // NetherStalkTile 399 for(int i=0;i<3;i++) 400 setIconSPUFromIcon(&m_tileData.netherStalk_icons[i], ((NetherStalkTile*)Tile::netherStalk)->icons[i]); 401 402 // EnchantmentTableTile 403 setIconSPUFromIcon(&m_tileData.enchantmentTable_iconTop, ((EnchantmentTableTile*)Tile::enchantTable)->iconTop); 404 setIconSPUFromIcon(&m_tileData.enchantmentTable_iconBottom, ((EnchantmentTableTile*)Tile::enchantTable)->iconBottom); 405 406 //BrewingStandTile 407 setIconSPUFromIcon(&m_tileData.brewingStand_iconBase, ((BrewingStandTile*)Tile::brewingStand)->iconBase); 408 409 //RedStoneDust 410 setIconSPUFromIcon(&m_tileData.redStoneDust_iconCross, (Tile::redStoneDust)->iconCross); 411 setIconSPUFromIcon(&m_tileData.redStoneDust_iconCross, (Tile::redStoneDust)->iconLine); 412 setIconSPUFromIcon(&m_tileData.redStoneDust_iconCrossOver, (Tile::redStoneDust)->iconCrossOver); 413 setIconSPUFromIcon(&m_tileData.redStoneDust_iconLineOver, (Tile::redStoneDust)->iconLineOver); 414 415 setIconSPUFromIcon(&m_tileData.stoneSlab_iconSide, ((StoneSlabTile*)(Tile::stoneSlab))->iconSide); 416 417 for(int i=0;i<16;i++) 418 setIconSPUFromIcon(&m_tileData.clothTile_icons[i], ((ClothTile*)Tile::cloth)->icons[i]); 419 420 // CarrotTile 421 for(int i=0;i<4;i++) 422 setIconSPUFromIcon(&m_tileData.carrot_icons[i], ((CarrotTile*)Tile::carrots)->icons[i]); 423 424 // PotatoTile 425 for(int i=0;i<4;i++) 426 setIconSPUFromIcon(&m_tileData.potato_icons[i], ((PotatoTile*)Tile::potatoes)->icons[i]); 427 428 // AnvilTile 429 for(int i=0;i<3;i++) 430 setIconSPUFromIcon(&m_tileData.anvil_icons[i], ((AnvilTile*)Tile::anvil)->icons[i]); 431 432 433 // QuartzBlockTile 434 for(int i=0;i<5;i++) 435 setIconSPUFromIcon(&m_tileData.quartzBlock_icons[i], ((QuartzBlockTile*)Tile::quartzBlock)->icons[i]); 436 437 setIconSPUFromIcon(&m_tileData.quartzBlock_iconChiseledTop, ((QuartzBlockTile*)Tile::quartzBlock)->iconChiseledTop); 438 setIconSPUFromIcon(&m_tileData.quartzBlock_iconLinesTop, ((QuartzBlockTile*)Tile::quartzBlock)->iconLinesTop); 439 setIconSPUFromIcon(&m_tileData.quartzBlock_iconTop, ((QuartzBlockTile*)Tile::quartzBlock)->iconTop); 440 setIconSPUFromIcon(&m_tileData.quartzBlock_iconBottom, ((QuartzBlockTile*)Tile::quartzBlock)->iconBottom); 441} 442 443// extern int g_lastHitBlockX; 444// extern int g_lastHitBlockY; 445// extern int g_lastHitBlockZ; 446 447void ChunkRebuildData::buildForChunk( Region* region, Level* level, int x0, int y0, int z0 ) 448{ 449 static bool bCreatedTileData = false; 450 if(!bCreatedTileData) 451 { 452 createTileData(); 453 bCreatedTileData = true; 454 } 455 456 m_tileData.stemTile_minColour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Tile_StemMin ); 457 m_tileData.stemTile_maxColour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Tile_StemMax ); 458 m_tileData.waterLily_colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Tile_WaterLily ); 459 460 m_tileData.foliageColor_evergreenColor = FoliageColor::getEvergreenColor(); 461 m_tileData.foliageColor_birchColor = FoliageColor::getBirchColor(); 462 463 464// m_lastHitBlockX = g_lastHitBlockX; 465// m_lastHitBlockY = g_lastHitBlockY; 466// m_lastHitBlockZ = g_lastHitBlockZ; 467 468 m_x0 = x0-2; 469 m_y0 = y0-2; 470 m_z0 = z0-2; 471 m_pRegion = region; 472 m_flags = 0;//e_flag_EmptyChunk; 473 474// for(int iX=m_x0; iX<(m_x0+sc_size); iX++) 475// { 476// for(int iY=m_y0; iY<(m_y0+sc_size); iY++) 477// { 478// for(int iZ=m_z0; iZ<(m_z0+sc_size); iZ++) 479// { 480// buildTile(iX, iY, iZ); 481// } 482// } 483// } 484 485 BiomeCache::Block* cacheBlocks[9]; 486 cacheBlocks[0] = region->getBiomeSource()->getBlockAt(m_x0, m_z0); 487 cacheBlocks[1] = region->getBiomeSource()->getBlockAt(m_x0+2, m_z0); 488 cacheBlocks[2] = region->getBiomeSource()->getBlockAt(m_x0+18, m_z0); 489 490 cacheBlocks[3] = region->getBiomeSource()->getBlockAt(m_x0, m_z0+2); 491 cacheBlocks[4] = region->getBiomeSource()->getBlockAt(m_x0+2, m_z0+2); 492 cacheBlocks[5] = region->getBiomeSource()->getBlockAt(m_x0+18, m_z0+2); 493 494 cacheBlocks[6] = region->getBiomeSource()->getBlockAt(m_x0, m_z0+18); 495 cacheBlocks[7] = region->getBiomeSource()->getBlockAt(m_x0+2, m_z0+18); 496 cacheBlocks[8] = region->getBiomeSource()->getBlockAt(m_x0+18, m_z0+18); 497 498 int cacheMap[20] = { 0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2}; 499 500 ColourTable* pColourTable = Minecraft::GetInstance()->getColourTable(); 501 502 for(int iX=m_x0; iX<(m_x0+sc_size); iX++) 503 { 504 for(int iZ=m_z0; iZ<(m_z0+sc_size); iZ++) 505 { 506 int newX = ( iX - m_x0 ); 507 int newZ = ( iZ - m_z0 ); 508 int index = (newX*sc_size) + newZ; 509// assert(index < 400); 510 int cacheBlockIndex = (cacheMap[iZ-m_z0]*3) + cacheMap[iX-m_x0]; 511 BiomeCache::Block* pCacheBlock = cacheBlocks[cacheBlockIndex]; 512// assert(region->getBiomeSource()->getBlockAt(iX, iZ) == pCacheBlock); 513 Biome* pBiome = pCacheBlock->getBiome(iX, iZ); 514 m_grassColor[index] = pColourTable->getColor(pBiome->m_grassColor); 515 m_foliageColor[index] = pColourTable->getColor(pBiome->m_foliageColor); 516 m_waterColor[index] = pColourTable->getColor(pBiome->m_waterColor); 517 } 518 } 519 520 if(isEmptyChunk()) 521 return; 522 523 524 if(level->dimension->hasCeiling) 525 m_flags |= e_flag_HasCeiling; 526 for(int i=0;i<16;i++) 527 m_brightnessRamp[i] = level->dimension->brightnessRamp[i]; 528 m_levelSkyDarken = level->skyDarken; 529} 530 531void ChunkRebuildData::copyFromTesselator() 532{ 533 Tesselator* t = Tesselator::getInstance(); // 4J - added - static initialiser being set at the wrong time 534 535 m_tesselator.m_PPUArray = t->_array->data; 536 assert(t->p == 0); 537 m_tesselator.m_PPUOffset = 0; 538 539 // copy tesselator vars over 540 m_tesselator.vertices = t->vertices; 541 m_tesselator.u = t->u; 542 m_tesselator.v = t->v; 543 m_tesselator._tex2 = t->_tex2; 544 m_tesselator.col = t->col; 545 m_tesselator.hasColor = t->hasColor; 546 m_tesselator.hasTexture = t->hasTexture; 547 m_tesselator.hasTexture2 = t->hasTexture2; 548 m_tesselator.hasNormal = t->hasNormal; 549 m_tesselator.p = t->p; 550 m_tesselator.useCompactFormat360 = t->useCompactFormat360; 551 m_tesselator.useProjectedTexturePixelShader = t->useProjectedTexturePixelShader; 552 m_tesselator.count = t->count; 553 m_tesselator._noColor = t->_noColor; 554 m_tesselator.mode = t->mode; 555 m_tesselator.xo = t->xo; 556 m_tesselator.yo = t->yo; 557 m_tesselator.zo = t->zo; 558 m_tesselator.count = t->count ; 559 m_tesselator._normal = t->_normal; 560 m_tesselator.tesselating = t->tesselating; 561 m_tesselator.mipmapEnable = t->mipmapEnable; // 4J added 562 m_tesselator.vboId = t->vboId; 563 m_tesselator.vboCounts = t->vboCounts; 564 m_tesselator.size = t->size; 565 for(int i=0;i<6;i++) 566 m_tesselator.bounds.boundingBox[i] = t->bounds.boundingBox[i]; 567 568} 569 570 571void ChunkRebuildData::buildTile(int x, int y, int z) 572{ 573 int newX = ( x - m_x0 ); 574 int newY = ( y - m_y0 ); 575 int newZ = ( z - m_z0 ); 576 577 int index = (newX*sc_size*sc_size) + (newY*sc_size) + newZ; 578 579 m_tileIds[index] = m_pRegion->getTile(x, y, z); 580 m_brightness[index] = m_pRegion->getBrightness(LightLayer::Sky, x, y, z); 581 m_brightness[index] |= (m_pRegion->getBrightness(LightLayer::Block, x, y, z)) << 4; 582 m_data_flags[index] = m_pRegion->getData(x,y,z); 583} 584 585 586void ChunkRebuildData::storeInTesselator() 587{ 588 Tesselator* t = Tesselator::getInstance(); // 4J - added - static initialiser being set at the wrong time 589 590 // copy tesselator vars over 591 t->vertices = m_tesselator.vertices; 592 t->u = m_tesselator.u; 593 t->v = m_tesselator.v; 594 t->_tex2 = m_tesselator._tex2; 595 t->col = m_tesselator.col; 596 t->hasColor = m_tesselator.hasColor; 597 t->hasTexture = m_tesselator.hasTexture; 598 t->hasTexture2 = m_tesselator.hasTexture2; 599 t->hasNormal = m_tesselator.hasNormal; 600 t->p = m_tesselator.m_PPUOffset/4; 601 t->useCompactFormat360 = m_tesselator.useCompactFormat360; 602 t->useProjectedTexturePixelShader = m_tesselator.useProjectedTexturePixelShader; 603 t->count = m_tesselator.count; 604 t->_noColor = m_tesselator._noColor; 605 t->mode = m_tesselator.mode; 606 t->xo = m_tesselator.xo; 607 t->yo = m_tesselator.yo; 608 t->zo = m_tesselator.zo; 609 t->count = m_tesselator.count; 610 t->_normal = m_tesselator._normal; 611 t->tesselating = m_tesselator.tesselating; 612 t->mipmapEnable = m_tesselator.mipmapEnable; // 4J added 613 t->vboId = m_tesselator.vboId; 614 t->vboCounts = m_tesselator.vboCounts; 615 t->size = m_tesselator.size; 616 for(int i=0;i<6;i++) 617 t->bounds.boundingBox[i] = m_tesselator.bounds.boundingBox[i]; 618} 619#endif // SN_TARGET_PS3_SPU 620 621 622 623void ChunkRebuildData::tesselateAllTiles(TileRenderer_SPU* pTileRenderer) 624{ 625 Tile_SPU::ms_pTileData = &m_tileData; 626 // 4J - changed loop order here to leave y as the innermost loop for better cache performance 627 bool renderNextLayer = false; 628 bool rendered = false; 629 int numRenderedLayer0 = 0; 630 int startX = m_x0+2; // beginning of the chunk 631 int startY = m_y0+2; // beginning of the chunk 632 int startZ = m_z0+2; // beginning of the chunk 633 634 m_tesselator.beginData(); 635 for (int z = startZ; z < (startZ+16); z++) 636 { 637 for (int x = startX; x < (startX+16); x++) 638 { 639 for (int y = startY; y < (startY+16); y++) 640 { 641 // 4J - get tile from those copied into our local array in earlier optimisation 642 int flags = getFlags(x,y,z); 643 if(flags & ChunkRebuildData::e_flag_NoRender) 644 continue; 645 unsigned char tileId = getTile(x,y,z); 646 if (tileId > 0) 647 { 648// if (m_currentLayer == 0 && m_tileData.isEntityTile[tileId]) 649// { 650// shared_ptr<TileEntity> et = region->getTileEntity(x, y, z); 651// if (TileEntityRenderDispatcher::instance->hasRenderer(et)) 652// { 653// renderableTileEntities.push_back(et); 654// } 655// } 656 TileRef_SPU tile(tileId); 657 int renderLayer = tile->getRenderLayer(); 658 659 if (renderLayer != m_currentLayer) 660 { 661 renderNextLayer = true; 662 } 663 else //if (renderLayer == m_currentLayer) 664 { 665 if(pTileRenderer->hasRenderer(tile.getPtr())) 666 { 667 numRenderedLayer0++; 668 rendered |= pTileRenderer->tesselateInWorld(tile.getPtr(), x, y, z); 669 } 670 else 671 { 672 setFlag(x, y, z, e_flag_SPURenderCodeMissing); 673// #ifdef SN_TARGET_PS3_SPU 674// spu_print("Render code missing for tile ID %d : render shape %d\n", tile->id, tile->getRenderShape()); 675// #endif 676 677 } 678 } 679 } 680 } 681 } 682 } 683 if(rendered) 684 m_flags |= e_flag_Rendered; 685 686// spu_print("(%d,%d,%d) SPU num rendered : %d\n", m_x0+2, m_y0+2, m_z0+2, numRenderedLayer0); 687 688 m_tesselator.endData(); 689} 690 691bool ChunkRebuildData::isEmptyTile(int x, int y, int z) 692{ 693 return getTile(x, y, z) == 0; 694} 695 696bool ChunkRebuildData::isSolidRenderTile(int x, int y, int z) 697{ 698 TileRef_SPU tile(getTile(x,y,z)); 699 if (tile.getPtr() == NULL) return false; 700 701 702 // 4J - addition here to make rendering big blocks of leaves more efficient. Normally leaves never consider themselves as solid, so 703 // blocks of leaves will have all sides of each block completely visible. Changing to consider as solid if this block is surrounded by 704 // other leaves. This is paired with another change in Tile::getTexture which makes such solid tiles actually visibly solid (these 705 // textures exist already for non-fancy graphics). Note: this tile-specific code is here rather than making some new virtual method in the tiles, 706 // for the sake of efficiency - I don't imagine we'll be doing much more of this sort of thing 707 if( tile->id == Tile_SPU::leaves_Id ) 708 { 709 int axo[6] = { 1,-1, 0, 0, 0, 0}; 710 int ayo[6] = { 0, 0, 1,-1, 0, 0}; 711 int azo[6] = { 0, 0, 0, 0, 1,-1}; 712 for( int i = 0; i < 6; i++ ) 713 { 714 int t = getTile(x + axo[i], y + ayo[i] , z + azo[i]); 715 if( ( t != Tile_SPU::leaves_Id ) && ( ( Tile_SPU::m_tiles[t].id == -1) || !Tile_SPU::m_tiles[t].isSolidRender() ) ) 716 { 717 return false; 718 } 719 } 720 return true; 721 } 722 723 return tile->isSolidRender(); 724} 725 726 727bool ChunkRebuildData::isSolidBlockingTile(int x, int y, int z) 728{ 729 TileRef_SPU tile(getTile(x, y, z)); 730 if (tile.getPtr() == NULL) return false; 731 bool ret = tile->getMaterial()->blocksMotion() && tile->isCubeShaped(); 732 return ret; 733} 734 735float ChunkRebuildData::getBrightness(int x, int y, int z, int emitt) 736{ 737 int n = getRawBrightness(x, y, z); 738 if (n < emitt) n = emitt; 739 return m_brightnessRamp[n]; 740} 741 742float ChunkRebuildData::getBrightness(int x, int y, int z) 743{ 744 return m_brightnessRamp[getRawBrightness(x, y, z)]; 745} 746 747// 4J - brought forward from 1.8.2 748int ChunkRebuildData::getBrightness(LightLayer::variety layer, int x, int y, int z) 749{ 750#ifndef SN_TARGET_PS3_SPU 751 assert(Level_MAX_LEVEL_SIZE == Level::MAX_LEVEL_SIZE); 752 assert(Level_maxBuildHeight == Level::maxBuildHeight); 753 assert(Level_MAX_BRIGHTNESS == Level::MAX_BRIGHTNESS); 754#endif 755 756 if (y < 0) y = 0; 757 if (y >= Level_maxBuildHeight) y = Level_maxBuildHeight - 1; 758 if (y < 0 || y >= Level_maxBuildHeight || x < -Level_MAX_LEVEL_SIZE || z < -Level_MAX_LEVEL_SIZE || x >= Level_MAX_LEVEL_SIZE || z > Level_MAX_LEVEL_SIZE) 759 { 760 // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we 761 // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast 762 // it to an int 763 return (int)layer; 764 } 765 766 if(layer == LightLayer::Sky) 767 return getBrightnessSky(x, y, z); 768 return getBrightnessBlock(x, y, z); 769} 770 771// 4J - brought forward from 1.8.2 772int ChunkRebuildData::getBrightnessPropagate(LightLayer::variety layer, int x, int y, int z) 773{ 774 if (y < 0) y = 0; 775 if (y >= Level_maxBuildHeight) y = Level_maxBuildHeight - 1; 776 if (y < 0 || y >= Level_maxBuildHeight || x < -Level_MAX_LEVEL_SIZE || z < -Level_MAX_LEVEL_SIZE || x >= Level_MAX_LEVEL_SIZE || z > Level_MAX_LEVEL_SIZE) 777 { 778 // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we 779 // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast 780 // it to an int 781 return (int)layer; 782 } 783 784 { 785 int id = getTile(x, y, z); 786 if (m_tileData.propagate[getTile(x, y, z)]) 787 { 788 int br = getBrightness(layer, x, y + 1, z); 789 int br1 = getBrightness(layer, x + 1, y, z); 790 int br2 = getBrightness(layer, x - 1, y, z); 791 int br3 = getBrightness(layer, x, y, z + 1); 792 int br4 = getBrightness(layer, x, y, z - 1); 793 if (br1 > br) br = br1; 794 if (br2 > br) br = br2; 795 if (br3 > br) br = br3; 796 if (br4 > br) br = br4; 797 return br; 798 } 799 } 800 801 if(layer == LightLayer::Sky) 802 return getBrightnessSky(x, y, z); 803 return getBrightnessBlock(x, y, z); 804 805} 806int ChunkRebuildData::getLightColor(int x, int y, int z, int emitt) // 4J - change brought forward from 1.8.2 807{ 808 int s = getBrightnessPropagate(LightLayer::Sky, x, y, z); 809 int b = getBrightnessPropagate(LightLayer::Block, x, y, z); 810 if (b < emitt) b = emitt; 811 return s << 20 | b << 4; 812} 813 814 815int ChunkRebuildData::getRawBrightness(int x, int y, int z) 816{ 817 return getRawBrightness(x, y, z, true); 818} 819 820 821int ChunkRebuildData::getRawBrightness(int x, int y, int z, bool propagate) 822{ 823 if (x < -Level_MAX_LEVEL_SIZE || z < -Level_MAX_LEVEL_SIZE || x >= Level_MAX_LEVEL_SIZE || z > Level_MAX_LEVEL_SIZE) 824 { 825 return Level_MAX_BRIGHTNESS; 826 } 827 828 if (propagate) 829 { 830 int id = getTile(x, y, z); 831 switch(id) 832 { 833 case Tile_SPU::stoneSlabHalf_Id: 834 case Tile_SPU::woodSlabHalf_Id: 835 case Tile_SPU::farmland_Id: 836 case Tile_SPU::stairs_stone_Id: 837 case Tile_SPU::stairs_wood_Id: 838 { 839 int br = getRawBrightness(x, y + 1, z, false); 840 int br1 = getRawBrightness(x + 1, y, z, false); 841 int br2 = getRawBrightness(x - 1, y, z, false); 842 int br3 = getRawBrightness(x, y, z + 1, false); 843 int br4 = getRawBrightness(x, y, z - 1, false); 844 if (br1 > br) br = br1; 845 if (br2 > br) br = br2; 846 if (br3 > br) br = br3; 847 if (br4 > br) br = br4; 848 return br; 849 } 850 break; 851 } 852 } 853 854 if (y < 0) return 0; 855 if (y >= Level_maxBuildHeight) 856 { 857 int br = Level_MAX_BRIGHTNESS - m_levelSkyDarken; 858 if (br < 0) br = 0; 859 return br; 860 } 861 862 return LevelChunk_getRawBrightness(x, y, z, m_levelSkyDarken); 863} 864 865int ChunkRebuildData::LevelChunk_getRawBrightness(int x, int y, int z, int skyDampen) 866{ 867 int light = (m_flags & e_flag_HasCeiling) ? 0 : getBrightnessSky(x, y, z); 868 if (light > 0) 869 m_flags |= e_flag_TouchedSky; 870 light -= skyDampen; 871 int block = getBrightnessBlock(x, y, z); 872 if (block > light) light = block; 873 874 /* 875 * int xd = (absFloor(level.player.x-(this->x*16+x))); int yd = 876 * (absFloor(level.player.y-(y))); int zd = 877 * (absFloor(level.player.z-(this->z*16+z))); int dd = xd+yd+zd; if 878 * (dd<15){ int carried = 15-dd; if (carried<0) carried = 0; if 879 * (carried>15) carried = 15; if (carried > light) light = carried; } 880 */ 881 882 return light; 883 884} 885 886 887Material_SPU *ChunkRebuildData::getMaterial(int x, int y, int z) 888{ 889 int t = getTile(x, y, z); 890 int matID = Material_SPU::air_Id; 891 if (t != 0) 892 matID = m_tileData.materialIDs[t]; 893 return &m_tileData.materials[matID]; 894}