<?xml version="1.0" encoding="utf-8"?>

<CustomShader version="5">
    <Parameters>
        <Parameter name="tailAmpSpeed"                   target="tailAmpSpeed"                   type="float4" defaultValue = "-1.5 0.15 5.0 0.0"/>
        <Parameter name="rotAmpRotSpeedWindSpeedWindAmp" target="rotAmpRotSpeedWindSpeedWindAmp" type="float4" defaultValue = "0.1 0.5 5.0 0.004"/>
        <Parameter name="animOffset"                     target="animOffset"                     type="float4" defaultValue = "0.0 0.0 0.0 0.0"/>
        <Parameter name="blend"                          target="blend"                          type="float4" defaultValue = "0.0 0.0 0.0 0.0"/>
    </Parameters>
    <UvUsages/>
    <VertexAttributes>
        <VertexAttribute name="uv1" group="base"/>
        <VertexAttribute name="uv2" group="base"/>
        <VertexAttribute name="uv3" group="base"/>
    </VertexAttributes>
    <LodLevel startDistance="0">
        <CodeInjections>
            <CodeInjection position="OBJECT_PARAMETERS">
<![CDATA[
float4 tailAmpSpeed;
float4 rotAmpRotSpeedWindSpeedWindAmp;
float4 animOffset;
float4 blend;
]]>
            </CodeInjection>
            <CodeInjection position="GET_POSITION_VS">
<![CDATA[
    float pIndex = convertDefaultTexCoords( In, object, In.texCoords1.xy ).x;
    float mFlap  = convertDefaultTexCoords( In, object, In.texCoords2.xy ).x;
    float mGlide = convertDefaultTexCoords( In, object, In.texCoords3.xy ).x;
    float mAnimOffset = object.animOffset.x;

    float3 mDeformFlap  = In.position.xyz;
    float3 mDeformGlide = In.position.xyz;
    float3 mDeformLanding = In.position.xyz;
    float3 mResult = In.position.xyz;
    // -- Flap animation
    mDeformFlap.y += mFlap * sin( object.tailAmpSpeed.z*cTime_s + mFlap*object.tailAmpSpeed.x + mAnimOffset)*object.tailAmpSpeed.y;
    // -- Glide animation
    float mSpeed = object.rotAmpRotSpeedWindSpeedWindAmp.x * sin( object.animOffset + cTime_s * object.rotAmpRotSpeedWindSpeedWindAmp.y );
    float mSin = sin(mSpeed);
    float mCos = cos(mSpeed);
    float3 v1 = float3(mCos,-mSin,0);
    float3 v2 = float3(mSin,mCos,0);
    mDeformGlide.x = dot(In.position.xyz,v1);
    mDeformGlide.y = dot(In.position.xyz,v2);
    mSpeed = In.position.x + object.rotAmpRotSpeedWindSpeedWindAmp.z * cTime_s;
    mDeformGlide.y += mGlide * object.rotAmpRotSpeedWindSpeedWindAmp.w * (sin(5*mSpeed + object.animOffset)+sin(2*mSpeed +2*object.animOffset));
    // -- Landing animation

    // -- blending animations
    mResult = lerp(mDeformFlap,mDeformGlide,object.blend.x);
    mResult = lerp(mResult,mDeformLanding,object.blend.y);
    return mResult;
]]>
            </CodeInjection>
        </CodeInjections>
    </LodLevel>
</CustomShader>
