Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

After three weeks of toil, I have finally decided to share my misery with you. I have gone through several Algorithms, consisting of my own C#-ized ROAM, two quadtree algorithms, and a point rendering algorithm (this one worked, but only render points and lines). My last, and final hope, the following quad-based algorithm.

 

(The code is in C#)

public QuadHeightMap(ref Device d, ref Caps c, ref HeightMap hm) : base(ref d, ref c)
	{
		int sideLength = (int)Common.FSqrt(hm.height.Length);
		quadsX = sideLength-1;
		quadsY = sideLength-1;

		//Vector3 scale = new Vector3(1.0f, 1.0f, 1.0f);
		int byteOffset = 0;

		Vector3[] v = new Vector3[quadsX*quadsY];

		byte h = 0;

		for (int y=0;y<quadsY;y++) 
		{
			for (int x=0;x<quadsX;x++) 
			{
				byteOffset = (y*quadsY) + x;
				h = hm.height[byteOffset].Value;

				v[(y*quadsY)+x] = Vector3.Scale(new Vector3(x - (quadsX*0.5f),h, y - (quadsY*0.5f)), 1.0f);
			}
		}

		int[] ind = new int[(quadsX*quadsY)*6];
		int offset = 0;

		for (int y=0;y<quadsY;y++)
		{
			for (int x=0;x<quadsX;x++)
				{
				ind[offset] = (x + y*quadsY);
				ind[offset+1] = (x + 1 + y*quadsY);
				ind[offset+2] = (x + (y+1)*quadsY);
				ind[offset+3] = (x + 1 + y*quadsY);
				ind[offset+4] = (x + 1 + ((y+1)*quadsY));
				ind[offset+5] = (x + ((y+1)*quadsY));
				LogFile.WriteLine(ind[offset] + ", " + ind[offset+1] + ", " + ind[offset+2] + "\r\n" +
					ind[offset+3] + ", " + ind[offset+4] + ", " + ind[offset+5]);
				offset += 6;
			}
		}
		//LogFile.Close();

		//Mesh m = new Mesh((quadsX*quadsY)*2, (quadsX*quadsY)*6, MeshFlags.Managed, CustomVertex.PositionNormal.Format, device);

		LogFile.WriteLine("Initializing index buffer...");
		LogFile.Close();

		ib = new IndexBuffer(typeof(int), ind.Length+1, device, Usage.None, Pool.Managed);
		ib.SetData(ind, 0, LockFlags.None);

		LogFile.WriteLine("Initializing vertex buffer...");
		vb = new VertexBuffer(typeof(CustomVertex.PositionOnly), quadsX*quadsY*6, device, Usage.Dynamic, CustomVertex.PositionOnly.Format, Pool.Default);

		LogFile.WriteLine("Filling vertex buffer data...");
		GraphicsStream data = vb.Lock(0, 0, LockFlags.None);
		for (int y=0;y<quadsY;y++)
		{
			for (int x=0;x<quadsX;x++)
			{
				data.Write(new CustomVertex.PositionOnly(v[(y*quadsY)+x]));
			}
		}
		vb.Unlock();
	}

 

This algorithm worked for me once, but now does not. I have no idea why it stopped, but I believe that it has something to do with memory corruption/lack thereof. Currently, my computer hangs on me on the vb.Unlock() call. Wondering if there was a problem, I switched the IndexBuffer.SetData call and the vb.Unlock call and it froze on the SetData call.

 

Any help will be GREATLY appreciated.

~David

 

Computer Info:

DirectX 9c, October 2005 SDK

MOBILITY Radeon 7500 (this is a laptop)

Pentium 4, 2.0ghz SpeedStep Processor

 

If you need anymore information please let me know.

Edited by PlausiblyDamp

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...