Пример #1
0
void FieldSector::generateHeights()
{
	if(m_heights)
		return;
	m_heights = new D3DXFLOAT16[g_grassSectorSize * g_grassSectorSize];
	TerrainVertex *terrainVertices = core.game->getWorld()->getTerrainManager()->m_vertices;
	int terrainWidth = core.game->getWorld()->getTerrainManager()->m_size;
	float coordinatesModifier = g_grassTileSize / core.game->getWorld()->getTerrainManager()->m_hmGeoStep;
	for(int y = 0; y < g_grassSectorSize; y++)
	{
		for(int x = 0; x < g_grassSectorSize; x++)
		{
			float terrainGrassProportion = g_grassTileSize / core.game->getWorld()->getTerrainManager()->m_hmGeoStep;
			//terrainGrassProportion = 0.5f;
			/// filling heightmap with data up
			D3DXPLANE plane;

			int X = x + m_posX;
			int Y = y + m_posY;
			Vec3 p1 = terrainVertices[(int)(Y*terrainGrassProportion)*terrainWidth+(int)(X*terrainGrassProportion)].pos;
			Vec3 p2 = terrainVertices[(int)((Y*terrainGrassProportion)+1)*terrainWidth+(int)(X*terrainGrassProportion)].pos;
			Vec3 p3 = terrainVertices[(int)(Y*terrainGrassProportion)*terrainWidth+(int)(X*terrainGrassProportion)+1].pos;
			Vec3 p4 = terrainVertices[(int)(Y*terrainGrassProportion+1)*terrainWidth+(int)(X*terrainGrassProportion)+1].pos;

			Vec3 resultPos;
			Vec3 upPoint = Vec3((X)*g_grassTileSize, 2000, (Y)*g_grassTileSize);
			Vec3 downPoint = Vec3((X)*g_grassTileSize, -2000, (Y)*g_grassTileSize);

			f32 pU, pV, pDist;

			if(D3DXIntersectTri(&p1, &p2, &p3, &upPoint, &Vec3(0,-1,0), &pU, &pV, &pDist))
				D3DXPlaneFromPoints(&plane, &p1, &p2, &p3);
			else if(D3DXIntersectTri(&p2, &p3, &p4, &upPoint, &Vec3(0,-1,0), &pU, &pV, &pDist))
				D3DXPlaneFromPoints(&plane, &p2, &p3, &p4);	

			D3DXPlaneIntersectLine(&resultPos, &plane, &upPoint, &downPoint);
			D3DXFloat32To16Array(&m_heights[y * g_grassSectorSize + x], &resultPos.y, 1);
		}
	}
}
Пример #2
0
void dx103DFluidRenderer::CreateHHGGTexture()
{
//	static const int iNumSamples = 256;
	static const int iNumSamples = 16;
//	static const int iNumSamples = 1;
	float data[4*iNumSamples];
	D3DXFLOAT16 converted[4*iNumSamples];

//	Fvector4 mmin;
//	Fvector4 mmax;

//	mmin.set(10000, 10000, 10000, 10000);
//	mmax.set(-10000, -10000, -10000, -10000);

	for (int i = 0; i < iNumSamples; i++)
	{
		float a = i / (float)(iNumSamples-1);
		data[4*i] = -h0texels(a);
		data[4*i+1] = h1texels(a);
		data[4*i+2] = 1.0f-g0(a);
		data[4*i+3] = g0(a);

//		for ( int j=0; j < 4; ++j )
//		{
//			mmin[j] = _min(mmin[j], data[4*i+j]);
//			mmax[j] = _max(mmax[j], data[4*i+j]);
//		}
	}

	//	Min value is -1
	//	Max value is +1

	D3DXFloat32To16Array( converted, data, 4*iNumSamples );

	D3D10_TEXTURE1D_DESC desc;
	desc.Width = iNumSamples;
	desc.MipLevels = 1;
	desc.ArraySize = 1;
	//desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
	desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
	//desc.Usage = D3D10_USAGE_IMMUTABLE;
	desc.Usage = D3D10_USAGE_DEFAULT;
	desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
	desc.CPUAccessFlags = 0;
	desc.MiscFlags = 0;

	D3D10_SUBRESOURCE_DATA dataDesc;
	//dataDesc.pSysMem = data;
	//dataDesc.SysMemPitch = sizeof(data);
	dataDesc.pSysMem = converted;
	dataDesc.SysMemPitch = sizeof(converted);

	ID3D10Texture1D* HHGGTexture = NULL;

	CHK_DX( HW.pDevice->CreateTexture1D(&desc, &dataDesc, &HHGGTexture));

	m_HHGGTexture = dxRenderDeviceRender::Instance().Resources->_CreateTexture("$user$NVHHGGTex");
	m_HHGGTexture->surface_set(HHGGTexture);

	_RELEASE(HHGGTexture);
}