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); } } }
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); }