int getBiomeDataAt(IBiomeProviderRTG cmr, int cx, int cz) { int cx2 = cx & 15; int cz2 = cz & 15; ChunkLandscape target = this.landscape(cmr, cx - cx2, cz - cz2); return(target.biome[cx2 * 16 + cz2].baseBiome.getBiomeID()); }
/* * All of the 'cx' and 'cz' parameters have been flipped when passing them. * Prior to flipping, the terrain was being XZ-chunk-flipped. - WhichOnesPink */ ChunkLandscape landscape(IBiomeProviderRTG cmr, int cx, int cz) { ChunkPos chunkPos = new ChunkPos(cx, cz); ChunkLandscape preExisting = this.storage[chunkPos]; if (preExisting != null) { return(preExisting); } ChunkLandscape result = new ChunkLandscape(); getNewerNoise(cmr, cx, cz, result); int[] biomeIndices = cmr.getBiomesGens(cx, cz, 16, 16); analyzer.newRepair(biomeIndices, result.biome, this.biomeData, this.sampleSize, result.noise, result.river); //-cmr.getRiverStrength(cx * 16 + 7, cy * 16 + 7)); storage[chunkPos] = result; return(result); }
private void getNewerNoise(IBiomeProviderRTG cmr, int cx, int cz, ChunkLandscape landscape) { // get area biome map for (int i = -sampleSize; i < sampleSize + 5; i++) { for (int j = -sampleSize; j < sampleSize + 5; j++) { biomeData[(i + sampleSize) * sampleArraySize + (j + sampleSize)] = cmr.getBiomeDataAt(cx + ((i * 8)), cz + ((j * 8))).baseBiome.getBiomeID(); } } float river; // fill the old smallRender for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { float totalWeight = 0; for (int mapX = 0; mapX < sampleArraySize; mapX++) { for (int mapZ = 0; mapZ < sampleArraySize; mapZ++) { float weight = weightings[mapX * sampleArraySize + mapZ, i * 16 + j]; if (weight > 0) { totalWeight += weight; weightedBiomes[biomeData[mapX * sampleArraySize + mapZ]] += weight; } } } // normalize biome weights for (int biomeIndex = 0; biomeIndex < weightedBiomes.Length; biomeIndex++) { weightedBiomes[biomeIndex] /= totalWeight; } landscape.noise[i * 16 + j] = 0f; river = cmr.getRiverStrength(cx + i, cz + j); landscape.river[i * 16 + j] = -river; float totalBorder = 0f; for (int k = 0; k < 256; k++) { if (weightedBiomes[k] > 0f) { totalBorder += weightedBiomes[k]; RealisticBiomeBase realisticBiome = RealisticBiomeBase.getBiome(k); // Do we need to patch the biome? if (realisticBiome == null) { realisticBiome = biomePatcher.getPatchedRealisticBiome( "NULL biome (" + k + ") found when getting newer noise."); } landscape.noise[i * 16 + j] += realisticBiome.rNoise(this.rtgWorld, cx + i, cz + j, weightedBiomes[k], river + 1f) * weightedBiomes[k]; // 0 for the next column weightedBiomes[k] = 0f; } } if (totalBorder < .999 || totalBorder > 1.001) { throw new Exception("" + totalBorder); } } } //fill biomes array with biomeData for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { landscape.biome[i * 16 + j] = cmr.getBiomeDataAt(cx + (((i - 7) * 8 + 4)), cz + (((j - 7) * 8 + 4))); } } }