//----------------------------------------------------------------------------------------------------------------------
void grassHair::createShader(){
    //create our shader program
    m_shaderProgram = new ShaderProgram();
    Shader *vert = new Shader("shaders/grassHairVert.glsl", GL_VERTEX_SHADER);
    Shader *geom = new Shader("shaders/grassHairGeom.glsl", GL_GEOMETRY_SHADER);
    Shader *frag = new Shader("shaders/grassHairFrag.glsl", GL_FRAGMENT_SHADER);

    //attach and link our shaders to our program
    m_shaderProgram->attachShader(vert);
    m_shaderProgram->attachShader(geom);
    m_shaderProgram->attachShader(frag);
    m_shaderProgram->link();
    m_shaderProgram->use();


    //get rid of the junk
    delete vert;
    delete geom;
    delete frag;

    glEnable(GL_DEPTH_TEST); // for removal of hidden surfaces

    //set up our light

    GLuint lightPosGrassLoc = m_shaderProgram->getUniformLoc("light.position");
    GLuint lightIntGrassLoc = m_shaderProgram->getUniformLoc("light.intensity");
    GLuint kdGrassLoc = m_shaderProgram->getUniformLoc("Kd");
    GLuint kaGrassLoc = m_shaderProgram->getUniformLoc("Ka");
    GLuint ksGrassLoc = m_shaderProgram->getUniformLoc("Ks");
    GLuint shininessGrassLoc = m_shaderProgram->getUniformLoc("shininess");

    glm::vec4 lightPositon(1.0, 1.0, 1.0, 1.0);
    glm::vec3 lightIntensity(0.8, 0.8, 0.8);
    glUniform4f(lightPosGrassLoc, lightPositon.x, lightPositon.y, lightPositon.z, lightPositon.w);
    glUniform3f(lightIntGrassLoc, lightIntensity.x, lightIntensity.y, lightIntensity.z);
    glUniform3f(kdGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(kaGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(ksGrassLoc, 0.5, 0.5, 0.5);
    glUniform1f(shininessGrassLoc, 100.0);

    //set our grass size
    GLuint grassSizeLoc = m_shaderProgram->getUniformLoc("grassSize");
    glUniform1f(grassSizeLoc,m_grassSize);

    //set up our grass texture
    m_grassTexture = new Texture("textures/grassBlade.png");
    m_grassTexture->bind(10);
    GLuint grassBladeTexLoc = m_shaderProgram->getUniformLoc("grassTexture");
    glUniform1i(grassBladeTexLoc, 10);

}
//----------------------------------------------------------------------------------------------------------------------
void grassHairClipmap::createShader(){
    //create our shader program
    m_shaderProgram = new ShaderProgram();
    Shader *vert = new Shader("shaders/grassHairClipmapVert.glsl", GL_VERTEX_SHADER);
    Shader *geom = new Shader("shaders/grassHairClipmapGeom.glsl", GL_GEOMETRY_SHADER);
    Shader *frag = new Shader("shaders/grassHairClipmapFrag.glsl", GL_FRAGMENT_SHADER);

    //attach and link our shaders to our program
    m_shaderProgram->attachShader(vert);
    m_shaderProgram->attachShader(geom);
    m_shaderProgram->attachShader(frag);
    m_shaderProgram->link();
    m_shaderProgram->use();


    //get rid of the junk
    delete vert;
    delete geom;
    delete frag;

    glEnable(GL_DEPTH_TEST); // for removal of hidden surfaces

    //set up our light

    GLuint lightPosGrassLoc = m_shaderProgram->getUniformLoc("light.position");
    GLuint lightIntGrassLoc = m_shaderProgram->getUniformLoc("light.intensity");
    GLuint kdGrassLoc = m_shaderProgram->getUniformLoc("Kd");
    GLuint kaGrassLoc = m_shaderProgram->getUniformLoc("Ka");
    GLuint ksGrassLoc = m_shaderProgram->getUniformLoc("Ks");
    GLuint shininessGrassLoc = m_shaderProgram->getUniformLoc("shininess");

    glm::vec4 lightPositon(1.0, 1.0, 1.0, 1.0);
    glm::vec3 lightIntensity(0.8, 0.8, 0.8);
    glUniform4f(lightPosGrassLoc, lightPositon.x, lightPositon.y, lightPositon.z, lightPositon.w);
    glUniform3f(lightIntGrassLoc, lightIntensity.x, lightIntensity.y, lightIntensity.z);
    glUniform3f(kdGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(kaGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(ksGrassLoc, 0.5, 0.5, 0.5);
    glUniform1f(shininessGrassLoc, 100.0);

    //set our grass size
    GLuint grassSizeLoc = m_shaderProgram->getUniformLoc("grassSize");
    GLuint grassHeightLoc = m_shaderProgram->getUniformLoc("grassHeight");
    GLuint heightMapLoc = m_shaderProgram->getUniformLoc("geoTexture");
    GLuint heightScaleLoc = m_shaderProgram->getUniformLoc("heightScale");
    m_timeLoc = m_shaderProgram->getUniformLoc("time");
    GLuint windDirLoc = m_shaderProgram->getUniformLoc("windDir");
    GLuint windStrengthLoc = m_shaderProgram->getUniformLoc("windStrength");
    GLuint scaleLoc = m_shaderProgram->getUniformLoc("scale");

    glUniform1f(heightScaleLoc,4);
    glUniform4f(scaleLoc, 2, 2, 2, 1.0);
    glUniform1f(windStrengthLoc,0.01);
    glUniform3f(windDirLoc,1.0,0.0,0.0);
    glUniform1f(m_timeLoc,clock()/CLOCKS_PER_SEC);
    glUniform1f(grassHeightLoc,m_grassHeight);
    glUniform1f(grassSizeLoc,m_grassSize);

    //set up our grass texture
    m_grassTexture = new Texture("textures/grassBlade.png");
    m_grassTexture->bind(10);
    GLuint grassBladeTexLoc = m_shaderProgram->getUniformLoc("grassTexture");
    glUniform1i(grassBladeTexLoc, 10);
    m_heightmapTex->bind(2);
    glUniform1i(heightMapLoc,2);

    // fog uniforms
    GLuint fogMaxLoc = m_shaderProgram->getUniformLoc("fogMax");
    GLuint fogMinLoc = m_shaderProgram->getUniformLoc("fogMin");

    glUniform1f(fogMaxLoc, 4.0);
    glUniform1f(fogMinLoc, 3.0);

}