⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrepaginglandscapetexture_splatting.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	alpha4 = 0.0f;

	// Calculate the current Point position
    int x = j % 256;
	int z = j / 256;

	// Ask for the current height value and the 8 surrounding values
	Real height[9];
	
	height[0] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x - 1, z - 1 );		// Top-Left
	height[1] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x, z - 1 );			// Top-Center
	height[2] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x + 1, z - 1 );		// Top-Right
	height[3] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x - 1, z );			// Left
	height[4] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x, z );				// Current Point
	height[5] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x + 1, z );			// Right
	height[6] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x - 1, z + 1 );		// Botton-Left
	height[7] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x, z + 1 );			// Botton-Center
	height[8] = PagingLandScapeData2DManager::getSingleton().getHeightAtPage( mDataX, mDataZ, x + 1, z + 1 );		// Botton-Right

	// Weight( pt1 , pt2 ) = 1 - DistanceSquared(pt1,pt2) / (1.75)^2

	//The sloppy test
    Real dx = 1.0f / PagingLandScapeOptions::getSingleton().scale.x;
    Real dz = 1.0f / PagingLandScapeOptions::getSingleton().scale.z;
    Real dxdz = dx + dz;

    Real sloppy[8];
    sloppy[0] = Math::Abs ( height[0] - height[4] ) * dxdz;
    sloppy[1] = Math::Abs ( height[1] - height[4] ) * dz;
    sloppy[2] = Math::Abs ( height[2] - height[4] ) * dxdz;
    sloppy[3] = Math::Abs ( height[3] - height[4] ) * dx;
    sloppy[4] = Math::Abs ( height[5] - height[4] ) * dx;
    sloppy[5] = Math::Abs ( height[6] - height[4] ) * dxdz;
    sloppy[6] = Math::Abs ( height[7] - height[4] ) * dz;
    sloppy[7] = Math::Abs ( height[8] - height[4] ) * dxdz;

	//snow  = 0
	//sand  = 1
	//grass = 2
	//rock  = 3
	for ( uint i = 0; i < 7; i++ )
	{
		if ( height[4] < PagingLandScapeOptions::getSingleton().matHeight[0] )
		{
			if ( sloppy[i] < 0.20 )
			{
				// grass-grass
				_InterpolateColour( out, 1.0, 2, 2 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0, 2, 2 );
			}
			if ( sloppy[i] >= 0.15 && sloppy[i] < 0.40 )
			{
				// sand-grass
				_InterpolateColour( out, 0.25, 1, 2 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.25, 1, 2 );
			}
			if ( sloppy[i] >= 0.30 && sloppy[i] < 0.65 )
			{
				// sand-sand
				_InterpolateColour( out, 1.0, 1, 1 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0, 1, 1 );
			}
			if ( sloppy[i] >= 0.55 && sloppy[i] < 0.75 )
			{
				// sand-rock
				_InterpolateColour( out, 0.75, 1, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.75, 1, 3 );
			}
			if ( sloppy[i] >= 0.70 )
			{
				// rock-rock
				_InterpolateColour( out, 1.0, 3, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0, 3, 3 );
			}
		}
		else if ( height[4] >= PagingLandScapeOptions::getSingleton().matHeight[0] && height[4] < PagingLandScapeOptions::getSingleton().matHeight[1] )
		{
			if ( sloppy[i] < 0.15 )
			{
				// grass-snow
				_InterpolateColour( out, 0.25f, 2, 0 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.25f, 2, 0 );
			}
			if ( sloppy[i] >= 0.10f && sloppy[i] < 0.45f )
			{
				// snow-sand
				_InterpolateColour( out, 0.65, 0, 1 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.65f, 0, 1 );
			}
			if ( sloppy[i] >= 0.25f && sloppy[i] < 0.65f )
			{
				// snow-rock
				_InterpolateColour( out, 0.5, 0, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.5f, 0, 3 );
			}
			if ( sloppy[i] >= 0.50f && sloppy[i] < 0.75f )
			{
				// snow-rock
				_InterpolateColour( out, 0.75, 0, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.75f, 0, 3 );
			}
			if ( sloppy[i] >= 0.70f )
			{
				// rock-rock
				_InterpolateColour( out, 1.0, 3, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0f, 3, 3 );
			}
		}
		else
		{
			if ( sloppy[i] < 0.15f )
			{
				// snow-snow
				_InterpolateColour( out, 1.0, 0, 0 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0f, 0, 0 );
			}
			if ( sloppy[i] >= 0.10 && sloppy[i] < 0.45 )
			{
				// snow-sand
				_InterpolateColour( out, 0.35, 0, 1 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.35f, 0, 1 );
			}
			if ( sloppy[i] >= 0.25f && sloppy[i] < 0.65f )
			{
				// snow-rock
				_InterpolateColour( out, 0.5, 0, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.5f, 0, 3 );
			}
			if ( sloppy[i] >= 0.50f && sloppy[i] < 0.75f )
			{
				// snow-rock
				_InterpolateColour( out, 0.75, 0, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 0.75f, 0, 3 );
			}
			if ( sloppy[i] >= 0.70f )
			{
				// rock-rock
				_InterpolateColour( out, 1.0, 3, 3 );
				_InterpolateAlpha( alpha1, alpha2, alpha3, alpha4, 1.0f, 3, 3 );
			}
		}
	}
}

//-----------------------------------------------------------------------
void PagingLandScapeTexture_Splatting::_InterpolateColour(ColourValue& out, const Real percentaje, const int index1, const int index2)
{
	Real tmp = 1 - percentaje;
	out.r = ( out.r + ( percentaje * PagingLandScapeOptions::getSingleton().matColor[index1].r + tmp * PagingLandScapeOptions::getSingleton().matColor[index2].r ) ) / 2;
	out.g = ( out.g + ( percentaje * PagingLandScapeOptions::getSingleton().matColor[index1].g + tmp * PagingLandScapeOptions::getSingleton().matColor[index2].g ) ) / 2;
	out.b = ( out.b + ( percentaje * PagingLandScapeOptions::getSingleton().matColor[index1].b + tmp * PagingLandScapeOptions::getSingleton().matColor[index2].b ) ) / 2;
}

//-----------------------------------------------------------------------
void PagingLandScapeTexture_Splatting::_InterpolateAlpha(Real& alpha1, Real& alpha2, Real& alpha3, Real& alpha4, const Real percentaje, const int index1, const int index2)
{
	if ( index1 == index2 )
	{
		if ( index1 == 0 )
		{
			alpha1 += 1.0f;
		}
		else if ( index1 == 1 )
		{
			alpha2 += 1.0f;
		}
		else if ( index1 == 2 )
		{
			alpha3 += 1.0f;
		}
		else
		{
			alpha4 += 1.0f;
		}
	}
	else
	{
		if ( index2 == 0 )
		{
			alpha1 += percentaje;
		}
		else if ( index2 == 1 )
		{
			alpha2 += percentaje;
		}
		else if ( index2 == 2 )
		{
			alpha3 += percentaje;
		}
		else
		{
			alpha4 += percentaje;
		}

		if ( index1 == 0 )
		{
			alpha1 += 1.0f - percentaje;
		}
		else if ( index1 == 1 )
		{
			alpha2 += 1.0f - percentaje;
		}
		else if ( index1 == 2 )
		{
			alpha3 += 1.0f - percentaje;
		}
		else
		{
			alpha4 += 1.0f - percentaje;
		}
	}

	//snow  = 0
	//sand  = 1
	//grass = 2
	//rock  = 3
        const Real factor = 1.0f / 5.0f;
	alpha1 *= ( 4.0 * factor );
	alpha2 *= ( 3.0 * factor );
	alpha3 *= ( 4.0 * factor );
	alpha4 *= ( 2.0 * factor );

	// Normalize
	const Real total = 1.0f / ( alpha1 + alpha2 + alpha3 + alpha4 ) * 2.0f;
	alpha1 = alpha1 * total;
	alpha2 = alpha2 * total;
	alpha3 = alpha3 * total;
	alpha4 = alpha4 * total;
}

} //namespace

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -