[filax] TerraED Pro

Miscellaneous Forums/Content Creation Tools/[filax] TerraED Pro

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Make Freelook and you see: It is not a bug. This is a feature!

hmpf. okay

double Interpolate (double fA, double fB, double fX)
{
	return (fA * (1 - fX) + fB * fX);
}

double GetHeight (double fx, double fy)
{
	if (fx < 0 || fx > WIDTH)
		return 0.0; // ERROR!


	if (fy < 0 || fy > HEIGHT)
		return 0.0; // ERROR!


	int x = (int) fx;
	int y = (int) fy;

	int x1 = x + 1;
	int y1 = y + 1;

	double dX = fx - (double) x;
	double dY = fy - (double) y;

	double fHeight1 = m_afHeightmap[x + y * WIDTH];
	double fHeight2 = m_afHeightmap[x1 + y * WIDTH];
	double fHeight3 = m_afHeightmap[x + y * WIDTH];
	double fHeight4 = m_afHeightmap[x1 + y1 * WIDTH];

	return Interpolate (Interpolate (fHeight1, fHeight2, dX),
						Interpolate (fHeight3, fHeight4, dX),
						dY);
}


This works like this:

Actual_Height_On_Actual_Camera_Position = Interpolated 1-, 2- 3, or 4- terrain-vertex-height in position of the camera.

If Camera_Y > Actual_Height_On_Actual_Camera_Position Then
... oh my god ...
End If


Here is more information for you: http://www.gamedev.net/community/forums/topic.asp?topic_id=205690


Edit: I think its only fair for posting a optimized sample, too.

//------------------------------------------------------------

//

// example

// -------

//

//      (x0, h0, y0)       (x1, h1, y0)

//          +---------------+         

//          |             ./|         

//          |           . / |         

//          |         .  /  |dy       

//          |       .   /   |         

//          |     .    /    |         

//          |   .     +-----+          ^

//          | .        dx   | (1-dy)   |d_hy =(1-dy)(h1 - h3)

//          +---------------+          v

//     (x0, h2, y1)       (x1, h3, y1)

//

//                     <--->

//                       d_hx = dx(h2-h3)

//

//

//   h = h3 + hx + hy

//

//------------------------------------------------------------


double GetHeight (double fx, double fy)
{	if (fx < 0 || fx > (WIDTH - 1))
		return 0.0; // ERROR!

	if (fy < 0 || fy > (HEIGHT - 1))
		return 0.0; // ERROR!

	int x0 = (int) fx;
	int y0 = (int) fy;
	int x1 = x0 + 1;
	int y1 = y0 + 1;
	double dX = (double) x1 - fx;
	double dY = fy - (double) y0;
	double h0 = g_afHeightMap[x0 + y0 * WIDTH];
	double h1 = g_afHeightMap[x1 + y0 * WIDTH];
	double h2 = g_afHeightMap[x0 + y1 * WIDTH];
	double h3 = g_afHeightMap[x1 + y1 * WIDTH];

 	double h;
	// top left triangle

	// interpolate with origin at (x0), and going towards

	// x1 and x2

	if (dx > dy)
	{
		h = h0 + (1 - dx) * (h1 - h0) + dy * (h2 - h0);
	}
	// bottom right triangle

	// interpolate with origin at (x3), and going towards

	// x2 and x1

	else
	{
		h = h3 + dx * (h3 - h2) + (1 - dy) * (h1 - h3);
	}
	return h;
}