Jump to content
  • Advertisement
Sign in to follow this  
SirOnion

MDX - BaseMesh's LockVertexBuffer() Problem

This topic is 4411 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to Morph one mesh(a teapot) and another(the skull that came with the occlusion factor lighting tutorial). So I wrote this method that would take the teapot and access its Vertex Data then loop through all vertices and use its normal as the rayDir for use as a parameter in the skull's Intersect method. The problem is, the teapot.LockVertexBuffer(...) returns an array of size 1, then I tried using GraphicsStream way, but its unsafe code so I used the modifyer in the method header and that didn't work and I tried using it as a block and that didn't work. I have another mesh that clones the teapot but uses a Vertex structure I've made that has 2 Positions and a Normal(I have its format like Position | Position | Normal, not sure if thats right since the LockBertexBuffer isn't returning what I want) I have a VertexDeclaration though that has a Position0 and Position1 and a Normal0. So the shader just takes in a variable from the main program that goes between 0 and 1 and I lerp() the 2 positions(the original and where the vertex morphs to) based on that, so when it runs the teapot has 1 vertex out of place(I guess the one vertex I replace by calling morph.SetVertexBufferData()) and all its points go to zero. And in all this I just want to know how to access a Mesh's VertexData, all of it!
private void ComputeTransPosition()
		{
			CustomVertex.PositionNormal[] verts = (CustomVertex.PositionNormal[])teapot.LockVertexBuffer(typeof(CustomVertex.PositionNormal),LockFlags.None,new int[]{1});

			Vector3 rayPos = new Vector3(0.0f,0.0f,0.0f);
			Vector3 rayDir = new Vector3(0.0f,0.0f,0.0f);

			int length = verts.Length;
			IntersectInformation inter = new IntersectInformation();

			Vector3[] info = new Vector3[length]; 

			for(int i = 0; i < length; i++)
			{
				rayDir = new Vector3(verts.Nx,verts.Ny,verts.Nz);
				bool b = skull.Intersect(rayPos,rayDir,out inter);
				if(b)
				{
					rayDir = (inter.Dist * rayDir) + rayPos;
					info = new Vector3(rayDir.X,rayDir.Y,rayDir.Z);
				}
				else
				{
					info = new Vector3(verts.X,verts.Y,verts.Z);
				}
			}
			
			morpher = teapot.Clone(MeshFlags.SystemMemory,fmt,device);
			Vertex[] nVerts = new Vertex[length];

			for(int i = 0; i < length; i++)
			{
				nVerts = new Vertex(verts.X,verts.Y,verts.Z,
					info.X,info.Y,info.Z,			   
					verts.Nx,verts.Ny,verts.Nz);
			}
			morpher.SetVertexBufferData(nVerts,LockFlags.None);

			teapot.UnlockVertexBuffer();
		}

Share this post


Link to post
Share on other sites
Advertisement
Yeah sorry I got it, the last parameter is the DIMENSION of the array, I thought it meant I want it 1 Dimensional so I put in one, so I just put teapot.NumberVertices instead and got what I wanted.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!