//-----------------------------------------------------------------------
    PagingLandScapeData2D_HeightFieldTC::PagingLandScapeData2D_HeightFieldTC(PagingLandScapeData2DManager *dataMgr)
    : PagingLandScapeData2D(dataMgr)
    {
	    mImage = 0;
	    input_max = 3000.0f;
        input_min = 0.0f;
        mMaxheight = _decodeTC (1.0f) * mParent->getOptions()->scale.y;
    }
    //-----------------------------------------------------------------------
    PagingLandScapeData2D_HeightFieldNTC::PagingLandScapeData2D_HeightFieldNTC()
    : PagingLandScapeData2D()
    {
	    mImage = 0;
	    input_max = 3000.0f;
        input_min = 0.0f;
        mMaxheight = _decodeTC (1.0f) * PagingLandScapeOptions::getSingleton().scale.y;
    }
    //-----------------------------------------------------------------------
    void PagingLandScapeData2D_HeightFieldTC::_load()
    {
	  mImage = new Image();
        mImage->load (mParent->getOptions()->LandScape_filename +
                "." + mParent->getOptions()->LandScape_extension, mParent->getOptions()->groupName);
        mBpp = PixelUtil::getNumElemBytes (mImage->getFormat ());
		if (mBpp != 1)
		{
			OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Error: Image is not a greyscale image.(1 byte, 8 bits)",
                "PagingLandScapeData2D_HeightField::_load");
		}

        mXDimension = mImage->getWidth();
        mZDimension = mImage->getHeight();

        const size_t sourceHeight = mZDimension;
        const size_t sourceWidth = mXDimension;

        computePowerof2PlusOneSize ();     

		mSize = mXDimension;
        mMaxArrayPos = static_cast <unsigned int> (mXDimension * mZDimension);
        mMax = static_cast <unsigned int> (mMaxArrayPos * mBpp);
        mHeightData = new Real[mMaxArrayPos];

        const Real divider = 1.0f / 65535.0f;
        const Real scale  = mParent->getOptions()->scale.y;
        mMaxheight = 0.0f;
        const unsigned int shift_fill = static_cast <unsigned int> (mXDimension - sourceWidth);
        uchar *imagedata = mImage->getData();
        unsigned int dest_pos = 0;
        for (unsigned int i = 0; i < sourceHeight; ++i)
        {
            for (unsigned int j = 0; j < sourceWidth; ++j)
            {   
                const Real h = _decodeTC(*imagedata++ * divider)* scale;
                mMaxheight = std::max (h, mMaxheight);
                mHeightData[dest_pos++] = h;
            }
            memset (&mHeightData[dest_pos], 0, shift_fill);
            dest_pos += shift_fill; 
        }       	    

	   
    }
    //-----------------------------------------------------------------------
    void PagingLandScapeData2D_HeightFieldNTC::_load( )
    {
	   
		    mImage = new Image();

		    mImage -> load( PagingLandScapeOptions::getSingleton().landscape_filename + 
                "." + PagingLandScapeOptions::getSingleton().landscape_extension, 
                    PagingLandScapeOptions::getSingleton().groupName);

		    //check to make sure it's 2^n size.
		    if ( !_checkSize( mImage->getHeight() ) ||	!_checkSize( mImage->getWidth() ) )
		    {
			    String err = "Error: Invalid heightmap size : " +
				    StringConverter::toString( static_cast <uint> (mImage->getWidth() )) +
				    "," + StringConverter::toString( static_cast <uint> (mImage->getHeight()) ) +
				    ". Should be 2^n, 2^n";
			    OGRE_EXCEPT( Exception::ERR_INVALIDPARAMS, err, "PagingLandScapeData2D_HeightFieldNTC::_load" );
		    }

            mBpp = PixelUtil::getNumElemBytes (mImage->getFormat ());
            if (mBpp != 1)
		    {
			    OGRE_EXCEPT( Exception::ERR_INVALIDPARAMS, "Error: Image is not a grayscale image.(1 byte, 8 bits)", 
                    "PagingLandScapeData2D_HeightFieldNTC::_load" );
		    }

            mSize = static_cast <uint> (mImage->getWidth());
            mMax = static_cast <uint> (mSize * mImage->getHeight() * mBpp + 1);

            mMaxArrayPos = static_cast <uint> (mSize * mImage->getHeight());
            mHeightData = new Real[mMaxArrayPos];
            uint j = 0;
            const double divider = 1.0 / 255;
            const Real scale  = PagingLandScapeOptions::getSingleton().scale.y;
            uchar *data = mImage->getData();
            mMaxheight = 0.0f;
            const uint bpp = static_cast <uint> (mBpp);
            for (uint i = 0; i < mMax - 1;  i += bpp )
            {  
                const Real h = _decodeTC(data[ i + (mBpp - 1)] * divider)* scale;
                mMaxheight = std::max ( h, mMaxheight);
                mHeightData[j++] = h;
            }
	    
    }
 //-------------------------------------------------------------------
 const Real PagingLandScapeData2D_HeightFieldTC::getMaxAbsoluteHeight(void) const
 { 
     return _decodeTC (1.0f) * mParent->getOptions()->scale.y;
 }
    //-----------------------------------------------------------------------
    bool PagingLandScapeData2D_HeightFieldTC::_load(const unsigned int mX, const unsigned int mZ)
    {
        const String strFileName = mParent->getOptions()->LandScape_filename + "." + 
                            StringConverter::toString(mZ) + "." +
			                StringConverter::toString(mX) + ".";
        
        String finalName = strFileName + 
                        "modif." + 
                        mParent->getOptions()->LandScape_extension;
        if (!(mParent->getOptions()->Deformable && 
            ResourceGroupManager::getSingleton().resourceExists(mParent->getOptions()->groupName, 
            finalName)))
        {
            finalName = strFileName + 
                mParent->getOptions()->LandScape_extension;   
            if (!ResourceGroupManager::getSingleton().resourceExists(mParent->getOptions()->groupName,
                finalName))
            {
            
                LogManager::getSingleton().logMessage(LML_CRITICAL, String("PLSM2 : Cannot find map named ") + finalName);
                return false;
            }
        }
        mImage = new Image();
        mImage->load (finalName,  mParent->getOptions()->groupName); 

        //check to make sure it's 2^n + 1 size.
        if (mImage->getWidth() != mImage->getHeight() ||	
            !_checkSize(mImage->getWidth()))
        {
            String err = "Error: Invalid heightmap size : " +
                StringConverter::toString(static_cast<int>(mImage->getWidth())) +
                "," + StringConverter::toString(static_cast<int>(mImage->getHeight())) +
                ". Should be 2^n+1, 2^n+1";
            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, err, "PagingLandScapeData2D_HeightField::_load");
        }

        mBpp = PixelUtil::getNumElemBytes (mImage->getFormat ());
        if (mBpp != 1)
        {
            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Error: Image is not a gray image.(1 bytes, 8 bits)", 
                "PagingLandScapeData2D_HeightField::_load");
        }

        if (mSize != mImage->getWidth())
        {
            OGRE_EXCEPT (Exception::ERR_INVALIDPARAMS, "Error: Declared World size <> Height Map Size.", "PagingLandScapeData2D_HeightField::_load");
        }

        mXDimension = mImage->getWidth();
        mZDimension = mImage->getHeight();
        mMax = static_cast <unsigned int> (mSize * mImage->getHeight() + 1);

        mMaxArrayPos = mMax - 1;
        mHeightData = new Real[mMaxArrayPos];
        unsigned int j = 0;
        const double divider = 1.0 / 255;
        const Real scale  = mParent->getOptions()->scale.y;
        uchar *data = mImage->getData();
        mMaxheight = 0.0f;
        for (unsigned int i = 0; i < mMax - 1;  i++)
            {  
                const Real h = _decodeTC(data[ i ] * divider)* scale;
                mMaxheight = std::max (h, mMaxheight);
                mHeightData[j++] = h;
            }
        return true;
    }