void cBioGenDistortedVoronoi::GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) { int BaseZ = cChunkDef::Width * a_ChunkZ; int BaseX = cChunkDef::Width * a_ChunkX; // Distortions for linear interpolation: int DistortX[cChunkDef::Width + 1][cChunkDef::Width + 1]; int DistortZ[cChunkDef::Width + 1][cChunkDef::Width + 1]; for (int x = 0; x <= 4; x++) for (int z = 0; z <= 4; z++) { Distort(BaseX + x * 4, BaseZ + z * 4, DistortX[4 * x][4 * z], DistortZ[4 * x][4 * z]); } LinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortX[0][0]); LinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortZ[0][0]); for (int z = 0; z < cChunkDef::Width; z++) { for (int x = 0; x < cChunkDef::Width; x++) { int VoronoiCellValue = m_Voronoi.GetValueAt(DistortX[x][z], DistortZ[x][z]) / 8; cChunkDef::SetBiome(a_BiomeMap, x, z, m_Biomes[VoronoiCellValue % m_BiomesCount]); } // for x } // for z }
void EffectNode::Process(unsigned int bufsize) { if (bufsize>(unsigned int)m_Output.GetLength()) { m_Output.Allocate(bufsize); } ProcessChildren(bufsize); if (ChildExists(0) && !GetChild(0)->IsTerminal() && ChildExists(1)) { if (m_Type==CLIP) { m_Output=GetInput(0); if (GetChild(1)->IsTerminal()) { HardClip(m_Output, GetChild(1)->GetCVValue()); } else { MovingHardClip(m_Output, GetInput(1)); } } else if (m_Type==DISTORT) { m_Output=GetInput(0); if (GetChild(1)->IsTerminal()) { Distort(m_Output, GetChild(1)->GetCVValue()); } else { MovingDistort(m_Output, GetInput(1)); } } else if (ChildExists(2)) { switch (m_Type) { case CRUSH : m_Output=GetInput(0); Crush(m_Output, GetChild(1)->GetCVValue(), GetChild(2)->GetCVValue()); break; case DELAY : { m_Delay.SetDelay(GetChild(1)->GetCVValue()); m_Delay.SetFeedback(GetChild(2)->GetCVValue()); m_Delay.Process(bufsize, GetInput(0), m_Output); break; } default : assert(0); break; } } } }
bool CameraIntrinsics::DirectionToImage(double u_normalized, double v_normalized, double *u_distorted, double *v_distorted) const { CHECK_NOTNULL(u_distorted); CHECK_NOTNULL(v_distorted); // Distort the normalized direction vector; double u = 0.0, v = 0.0; Distort(u_normalized, v_normalized, &u, &v); // Make a homogeneous vector from the output. Vector3d p; p << u, v, 1.0; // Multiply the distorted direction vector by camera intrinsic matrix to get // the image space point. const Vector3d p_out = CameraIntrinsics::K() * p; *u_distorted = p_out(0); *v_distorted = p_out(1); // Make sure that the resulting point is in the image. return PointInImage(*u_distorted, *v_distorted); }
void cBioGenMultiStepMap::DecideOceanLandMushroom(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) { // Distorted Voronoi over 3 biomes, with mushroom having only a special occurence. // Prepare a distortion lookup table, by distorting a 5x5 area and using that as 1:4 zoom (linear interpolate): int BaseZ = cChunkDef::Width * a_ChunkZ; int BaseX = cChunkDef::Width * a_ChunkX; int DistortX[cChunkDef::Width + 1][cChunkDef::Width + 1]; int DistortZ[cChunkDef::Width + 1][cChunkDef::Width + 1]; int DistortSize = m_OceanCellSize / 2; for (int x = 0; x <= 4; x++) for (int z = 0; z <= 4; z++) { Distort(BaseX + x * 4, BaseZ + z * 4, DistortX[4 * x][4 * z], DistortZ[4 * x][4 * z], DistortSize); } LinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortX[0][0]); LinearUpscale2DArrayInPlace<cChunkDef::Width + 1, cChunkDef::Width + 1, 4, 4>(&DistortZ[0][0]); // Prepare a 9x9 area of neighboring cell seeds // (assuming that 7x7 cell area is larger than a chunk being generated) const int NEIGHBORHOOD_SIZE = 4; // How many seeds in each direction to check int CellX = BaseX / m_OceanCellSize; int CellZ = BaseZ / m_OceanCellSize; int SeedX[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1]; int SeedZ[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1]; EMCSBiome SeedV[2 * NEIGHBORHOOD_SIZE + 1][2 * NEIGHBORHOOD_SIZE + 1]; for (int xc = 0; xc < 2 * NEIGHBORHOOD_SIZE + 1; xc++) { int RealCellX = xc + CellX - NEIGHBORHOOD_SIZE; int CellBlockX = RealCellX * m_OceanCellSize; for (int zc = 0; zc < 2 * NEIGHBORHOOD_SIZE + 1; zc++) { int RealCellZ = zc + CellZ - NEIGHBORHOOD_SIZE; int CellBlockZ = RealCellZ * m_OceanCellSize; int OffsetX = (m_Noise2.IntNoise3DInt(RealCellX, 16 * RealCellX + 32 * RealCellZ, RealCellZ) / 8) % m_OceanCellSize; int OffsetZ = (m_Noise4.IntNoise3DInt(RealCellX, 32 * RealCellX - 16 * RealCellZ, RealCellZ) / 8) % m_OceanCellSize; SeedX[xc][zc] = CellBlockX + OffsetX; SeedZ[xc][zc] = CellBlockZ + OffsetZ; SeedV[xc][zc] = (((m_Noise6.IntNoise3DInt(RealCellX, RealCellX - RealCellZ + 1000, RealCellZ) / 11) % 256) > 90) ? biOcean : (biInvalidBiome); } // for z } // for x for (int xc = 1; xc < 2 * NEIGHBORHOOD_SIZE; xc++) for (int zc = 1; zc < 2 * NEIGHBORHOOD_SIZE; zc++) { if ( (SeedV[xc ][zc] == biOcean) && (SeedV[xc - 1][zc] == biOcean) && (SeedV[xc + 1][zc] == biOcean) && (SeedV[xc ][zc - 1] == biOcean) && (SeedV[xc ][zc + 1] == biOcean) && (SeedV[xc - 1][zc - 1] == biOcean) && (SeedV[xc + 1][zc - 1] == biOcean) && (SeedV[xc - 1][zc + 1] == biOcean) && (SeedV[xc + 1][zc + 1] == biOcean) ) { SeedV[xc][zc] = biMushroomIsland; } } // For each column find the nearest distorted cell and use its value as the biome: int MushroomOceanThreshold = m_OceanCellSize * m_OceanCellSize * m_MushroomIslandSize / 1024; int MushroomShoreThreshold = m_OceanCellSize * m_OceanCellSize * m_MushroomIslandSize / 2048; for (int z = 0; z < cChunkDef::Width; z++) { for (int x = 0; x < cChunkDef::Width; x++) { int AbsoluteZ = DistortZ[x][z]; int AbsoluteX = DistortX[x][z]; int MinDist = m_OceanCellSize * m_OceanCellSize * 16; // There has to be a cell closer than this EMCSBiome Biome = biPlains; // Find the nearest cell seed: for (int xs = 1; xs < 2 * NEIGHBORHOOD_SIZE; xs++) for (int zs = 1; zs < 2 * NEIGHBORHOOD_SIZE; zs++) { int Dist = (SeedX[xs][zs] - AbsoluteX) * (SeedX[xs][zs] - AbsoluteX) + (SeedZ[xs][zs] - AbsoluteZ) * (SeedZ[xs][zs] - AbsoluteZ); if (Dist >= MinDist) { continue; } MinDist = Dist; Biome = SeedV[xs][zs]; // Shrink mushroom biome and add a shore: if (Biome == biMushroomIsland) { if (Dist > MushroomOceanThreshold) { Biome = biOcean; } else if (Dist > MushroomShoreThreshold) { Biome = biMushroomShore; } } } // for zs, xs cChunkDef::SetBiome(a_BiomeMap, x, z, Biome); } // for x } // for z }