Exemple #1
0
			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;
}