-- Author:JnJ Modding The Collaboration
-- Name:TerraForming
-- Description:
-- Icon:123
-- Hide:no
-- Version 1.3 (2017-01-12)-- Icon:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAACi0lEQVQokV2RS2yMYRSG3+82t79undJSFKOE0oimTVMqIu4VhIVYEIlm2oWEsCKxkwhhJ5EQG1JNNURalx0b4taimYqoTlVMo1PSVi8z88/3f9+xGCXxbs7mefKenMOICAAAYz3BOYE11DfO5Plg6WVl5QRomZFSRqPRHMb+CWQF44b0rIL8kDfNtdTZ9ZxbcJ/UWkcikf8F7VkuOYdOuoMFrAgMyYFnmTFWsnI9ESmlchjHVLKetgCDJWmlEEKylpuX2PiwlPIvDUDmhgU4QAABDBYgz8q9h6Jsch4MrCAO9sdwichYa9wfmUnPUpbcQa/fZijpfSnZv6+sfu+knXBJ01SkAtI8s/H85rG8kUCVYsKXnjGsRqcZmXS2l3sDDs+O+Hzz/xZIDeLA29hLlPkRchfGl3wP/kw7fY4bYAsTG140kGvgy60May33kBWk5hYW+xX3DzmJK9/SchwCro+q45Eax+35/BHEARBRR2eHDGo/qVRiJCEKZd6MoC6l0PBME3JLvi095lTWNZYy4X7sfmdUqK29vTvWLaE8QjC43Ddd543eSxeXFGcbhkebTCMd3FK5mjPDyLx+dP9R7EuuhLO09WxqtleckqmidfPFAhHePyc8VNTzJBHgv143t5Jrd26qkgx7dtUJWNn75kiktunsonN1Kwp7k/Gag4ezXCnL1p6uYEdrvsbjFUwJlgWZhw/ayBpeaFon+q5/ev+piE1UL45Y+ALEBUxPrJfIOXDmlOT61fsPBpyYEMrPg+TYxIWrNy7qIFmrGQcYwOWdu81PY1+JBHH/7add4MKCVVRWyZ/KC+v+2jXhy7cf79i2e9XUh3bt3Hri+Mmgkjy84NqtloDIXRa/AfS3RCEVjlBtAAAAAElFTkSuQmCCAAAAAACoDUtoAA0AgPiUn4f+fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-- Hide: no
-- Version 1.3 (2017-01-12)




--[[
    setTerrainHeight by spline ( take x,y,z value from spline every 1 meter and set y value at x,z position on the terrain)
    Usage:

        - select spline(s) Note multiple splines must be in the same transform group
		- Adjust line 58 local mHeightOffset to the required height from the spline
		- Adjust line 59 local mSideCount to half the required width
--]]

function crossProduct(ax, ay, az, bx, by, bz)
    return ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx;
end

		
    local mSceneID = getChildAt(getRootNode(), 0);
	local mTerrainID = 0;
    q = 0
	for i = 0, getNumOfChildren(mSceneID) - 1 do
		local mID = getChildAt(mSceneID, i);
		if (getName(mID) == "terrain") then
			mTerrainID = mID;
			break;
		end;
	end;

	if (mTerrainID == 0) then
		print("Error: Terrain node not found. Node needs to be named 'terrain'.");
		return nil;
	end;

	if (getNumSelected() == 0) then
        print("Error: Select one or more splines.");
        return nil;
    end;

	local mSplineIDs = {};
	for i = 0, getNumSelected() - 1 do
		mID = getSelection( i );
        table.insert( mSplineIDs, mID );
	end;

	for _, mSplineID in pairs(mSplineIDs) do
		local mSplineLength = getSplineLength( mSplineID ) ;
		local mSplinePiece = 1; -- real size 1 meter
		local mSplinePiecePoint = mSplinePiece / mSplineLength ; -- relative size [0..1]
		local mHeightOffset = 0;
		local mSideCount = 20;
		local mSplinePos = 0.0;
		while mSplinePos <= 1.0 do
			-- get XYZ at position on spline
			local mPosX, mPosY, mPosZ = getSplinePosition( mSplineID, mSplinePos );
			-- define height value
			local mHeight = mPosY + mHeightOffset;
			-- directional vector at the point
			local mDirX, mDirY,   mDirZ   = worldDirectionToLocal( mSplineID, getSplineDirection ( mSplineID, mSplinePos) );
			local mVecDx, mVecDy, mVecDz = crossProduct( mDirX, mDirY, mDirZ, 0, 1, 0);
			-- set HEIGHT at the center
			setTerrainHeightAtWorldPos( mTerrainID, mPosX, mPosY, mPosZ, mHeight );
			-- define side to side shift in meters
          
			for i = 1, mSideCount, 1 do
			 local mNewPosX1 = mPosX + i * mVecDx;
			 local mNewPosY1 = mPosY + i * mVecDy;
			 local mNewPosZ1 = mPosZ + i * mVecDz;
			 local mNewPosX2 = mPosX  - i * mVecDx;
			 local mNewPosY2 = mPosY  - i * mVecDy;
			 local mNewPosZ2 = mPosZ  - i * mVecDz;
			-- set HEIGHT aon the left and right side from the center
			setTerrainHeightAtWorldPos( mTerrainID, mNewPosX1, mNewPosY1, mNewPosZ1, mHeight );
			setTerrainHeightAtWorldPos( mTerrainID, mNewPosX2, mNewPosY2, mNewPosZ2, mHeight );
			end
			-- goto next point
			mSplinePos = mSplinePos + mSplinePiecePoint;
		end
	end;

print("Finished Transform OK")