Jump to content

Terrain Mesh Size or Terrain Diameter


mpatton
 Share

Recommended Posts

Hi all,

I having trouble getting the terrain mesh size in world space which I need to do some distance calculations in the vertex shader.

I have the following code in TerrainRender.cpp which I though would work, but doesn't...

shaderSolid->Uniform("meshSize", (float)(g_Game->GetWorld()->GetTerrain()->GetTilesPerSide() * TERRAIN_TILE_SIZE));

Basically what I need it for is to range the vertices e.g. -1 to 1, or 0 to 1 say.

Any ideas?

Also, is there some kind of radius or diameter used for circular terrain's? if I could grab that information as well that would help me a lot.

thanks in advance

Michael

Link to comment
Share on other sites

That looks like the right calculation to do. But techSolid/shaderSolid are used for the solid black sides of the map, not for the actual terrain tiles - you should specify the uniform inside TerrainRenderer::PrepareShader so that it's available to all the base/blend/decal terrain rendering calls.

Circular terrain is just square terrain with permanent shroud-of-darkness around the corners, so GetTilesPerSide() gives you the diameter.

Link to comment
Share on other sites

Cool thanks for that. My problem must now be with the way I get the camera normal matrix or world origin position for it, though they look correct to me...

I'm going to post my calculations here, if anyone can spot a problem with what I'm doing any help would be greatly appreciated

/*Camera Normal Matrix*/

CMatrix3D cameraInverse;

glGetFloatv(GL_MODELVIEW_MATRIX, cameraInverse._data);

CMatrix3D cameraNormalMatrix = cameraInverse.GetInverse().GetTranspose();

/*World Origin*/

CVector4D worldOrigin;

worldOrigin.X = CVector4D(cameraInverse._11, cameraInverse._12, cameraInverse._13, cameraInverse._14).Dot(CVector4D(0.0, 0.0, 0.0, 1.0));

worldOrigin.Y = CVector4D(cameraInverse._21, cameraInverse._22, cameraInverse._23, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0));

worldOrigin.Z = CVector4D(cameraInverse._31, cameraInverse._32, cameraInverse._33, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0));

worldOrigin.W = CVector4D(cameraInverse._41, cameraInverse._42, cameraInverse._43, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0));

Ideally here I would have like to have just done cameraNormalMatrix * CVector4D(0.0, 0.0, 0.0, 1.0);

however I could not see any function to do this calculation. Is there one?

thanks in advance

Michael

Edited by mpatton
Link to comment
Share on other sites

GL_MODELVIEW_MATRIX might not always be set up correctly - the current version of the renderer tries to do everything with local per-shader transform matrices instead of the global GL state. Better to use g_Renderer.GetViewCamera().GetOrientation().GetTranslation() to get the world-space camera position (or use the g_Renderer.GetViewCamera().GetOrientation() matrix in other ways).

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...