GLuint GenNoiseTexture(unsigned int Width, unsigned int Height, unsigned int Octaves, float Persistance, float Scale, glm::vec4 Origin) { float* ImageData = (float*)calloc(Width*Height,sizeof(float)); for (unsigned int Y = 0; Y < Height; Y++) { for (unsigned int X = 0; X < Width; X++) { unsigned int PixelIndex = (Y*Width)+X; ImageData[PixelIndex] = scaled_octave_noise_4d( Octaves, Persistance, Scale, 0.0f,1.0f, Origin.x + cos(((float)X/(float)Width)*2.0f*M_PI), Origin.y + cos(((float)Y/(float)Height)*2.0f*M_PI), Origin.z + sin(((float)X/(float)Width)*2.0f*M_PI), Origin.w + sin(((float)Y/(float)Height)*2.0f*M_PI) ); } } GLuint TextureHandle; glGenTextures(1,&TextureHandle); glBindTexture(GL_TEXTURE_2D,TextureHandle); glTexImage2D( GL_TEXTURE_2D, 0, GL_R16, Width,Height, 0, GL_RED,GL_FLOAT, ImageData ); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glBindTexture(GL_TEXTURE_2D,0); free(ImageData); return TextureHandle; }
int simplexnoise(int32_t seed, float* map, int width, int height, float persistence) { float inv_width = 1 / (float)width; float inv_height = 1 / (float)height; float noiseScale = 0.593f; float ka = (float)(256 / seed); float kb = (float)(seed * 567 % 256); float kc = (float)((seed*seed) % 256); float kd = (float)((567 - seed) % 256); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { float fNX = x * inv_width; // we let the x-offset define the circle float fNY = y * inv_height; // we let the x-offset define the circle float fRdx = (float)(fNX * 2 * PI); // a full circle is two pi radians float fRdy = (float)(fNY * 4 * PI); // a full circle is two pi radians float a = sinf(fRdx); float b = cosf(fRdx); float c = sinf(fRdy); float d = cosf(fRdy); float v = scaled_octave_noise_4d(16.0f, persistence, 0.5f, 0.0f, 1.0f, ka + a*noiseScale, kb + b*noiseScale, kc + c*noiseScale, kd + d*noiseScale); map[y * width + x] = v; } } return 0; }
void SimplexSphereGenerator::generateStep() { if (spherePoints.size() == 0 || sphereComplexity != oldSphereComplexity) { int c = sphereComplexity; spherePoints.clear(); initialize_sphere(spherePoints, c); for (int i = 0; i < spherePoints.size(); i++) D3DXVec3Normalize(&spherePoints[i], &spherePoints[i]); verticesCount = spherePoints.size(); oldSphereComplexity = c; if (tarrtriangle != null) { delete[] parrtriangle; delete[] narrtriangle; delete[] carrtriangle; delete[] tarrtriangle; delete[] parrline; delete[] narrline; delete[] carrline; delete[] tarrline; tarrtriangle = null; } } if (tarrtriangle == NULL) { //triangles parrtriangle = new D3DXVECTOR3[verticesCount]; narrtriangle = new D3DXVECTOR3[verticesCount]; carrtriangle = new D3DXVECTOR4[verticesCount]; tarrtriangle = new D3DXVECTOR2[verticesCount]; for (int i = 0; i < verticesCount; i++) { tarrtriangle[i] = D3DXVECTOR2(0, 0); narrtriangle[i] = spherePoints[i]; } //lines parrline = new D3DXVECTOR3[verticesCount * 2]; narrline = new D3DXVECTOR3[verticesCount * 2]; carrline = new D3DXVECTOR4[verticesCount * 2]; tarrline = new D3DXVECTOR2[verticesCount * 2]; for (int i = 0; i < verticesCount * 2; i++) tarrline[i] = D3DXVECTOR2(0, 0); for (int i = 0; i < verticesCount; i += 3) { narrline[i * 2] = spherePoints[i]; narrline[i * 2 + 1] = spherePoints[i + 1]; narrline[i * 2 + 2] = spherePoints[i + 1]; narrline[i * 2 + 3] = spherePoints[i + 2]; narrline[i * 2 + 4] = spherePoints[i + 2]; narrline[i * 2 + 5] = spherePoints[i]; } } simplexw += 0.001f; static float s1, s2, s3; static int i2; static D3DXVECTOR3 v1, v2, v3; for (int i = 0; i < verticesCount; i += 3) { i2 = i * 2; v1 = spherePoints[i]; v2 = spherePoints[i+1]; v3 = spherePoints[i+2]; s1 = scaled_octave_noise_4d(3, .5f, 1.3f, 0, 1, v1.x, v1.y, v1.z, simplexw); s2 = scaled_octave_noise_4d(3, .5f, 1.3f, 0, 1, v2.x, v2.y, v2.z, simplexw); s3 = scaled_octave_noise_4d(3, .5f, 1.3f, 0, 1, v3.x, v3.y, v3.z, simplexw); parrtriangle[i] = parrline[i2] = parrline[i2 + 5] = v1 * (1.5f + s1 * 3); parrtriangle[i + 1] = parrline[i2 + 1] = parrline[i2 + 2] = v2 * (1.5f + s2 * 3); parrtriangle[i + 2] = parrline[i2 + 3] = parrline[i2 + 4] = v3 * (1.5f + s3 * 3); carrtriangle[i] = carrline[i2] = carrline[i2 + 5] = D3DXVECTOR4(s1, s1, s1, 1); carrtriangle[i + 1] = carrline[i2 + 1] = carrline[i2 + 2] = D3DXVECTOR4(s2, s2, s2, 1); carrtriangle[i + 2] = carrline[i2 + 3] = carrline[i2 + 4] = D3DXVECTOR4(s3, s3, s3, 1); } mutex.lock(); finishedGenerating = false; mutex.unlock(); if (triangles.meshSwap == NULL) triangles.meshSwap = Mesh::CreateFromVertices(parrtriangle, narrtriangle, carrtriangle, tarrtriangle, verticesCount, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, false); else triangles.meshSwap->SetVertices(parrtriangle, narrtriangle, carrtriangle, tarrtriangle, verticesCount, false); if (lines.meshSwap == NULL) lines.meshSwap = Mesh::CreateFromVertices(parrline, narrline, carrline, tarrline, verticesCount * 2, D3D11_PRIMITIVE_TOPOLOGY_LINELIST, false); else lines.meshSwap->SetVertices(parrline, narrline, carrline, tarrline, verticesCount * 2, false); finishedGenerating = true; }