public void Reload() { var meshData = Actor.mMesh.mMeshData; var heightMapStream = new FileStream(mHeightMapPath, FileMode.Open, FileAccess.Read); var heightmap = Texture2D.FromStream(mGraphics, heightMapStream); heightMapStream.Close(); if (heightmap.Height == mHeight && heightmap.Width == mWidth) { var textureStream = new FileStream(mTexturePath, FileMode.Open, FileAccess.Read); meshData.mMaterials[0].mDiffuseMap = Texture2D.FromStream(mGraphics, textureStream); textureStream.Close(); LoadVertices(heightmap); Actor.mMesh.UpdateData(); mGrass.Generate(); } }
public Terrain(ContentManager content, GraphicsDevice device, string heightMapPath, string texturePath) { mContent = content; mGraphics = device; mHeightMapPath = heightMapPath; mTexturePath = texturePath; var meshData = new MeshData(); var heightMapStream = new FileStream(heightMapPath, FileMode.Open, FileAccess.Read); var heightmap = Texture2D.FromStream(device, heightMapStream); heightMapStream.Close(); mWidth = heightmap.Width; mHeight = heightmap.Height; meshData.mVertices = new VertexPositionTexture[mWidth * mHeight]; meshData.mIndices = new int[(mWidth * 2 + 2) * (mHeight - 1)]; var subData = new MeshData.SubData(); var material = new Material(); var textureStream = new FileStream(texturePath, FileMode.Open, FileAccess.Read); material.mDiffuseMap = Texture2D.FromStream(device, textureStream); material.DiffuseMapStream = textureStream; material.mGraphicsDevice = device; textureStream.Close(); material.mDiffuseColor = new Vector3(1.0f); subData.mIndicesOffset = 0; subData.mMaterialIndex = 0; subData.mNumPrimitives = (heightmap.Width * 2 + 2) * (heightmap.Height - 1); meshData.mMaterials.Add(material); meshData.mSubDatas.Add(subData); meshData.mPrimitiveType = PrimitiveType.TriangleStrip; meshData.mTotalNumPrimitives = (heightmap.Width * 2 + 2) * (heightmap.Height - 1); meshData.mBoundingSphere.Radius = (float)Math.Sqrt(Math.Pow(heightmap.Width / 2.0f, 2) + Math.Pow(heightmap.Height / 2.0f, 2)); meshData.mIsTerrain = true; Actor = new Actor(new Mesh.Mesh(mGraphics, meshData), null) { mCastShadow = false }; Size = mWidth; LoadVertices(heightmap); LoadIndices(); Actor.mMesh.UpdateData(); mGrass = new Grass(this); mGrass.Generate(); }