void alien::draw()
{
   glUseProgram(p);
   glEnable(GL_LIGHTING);
   glColor3f(1.0f, 1.0f, 1.0f);

   for (std::vector<alienParam>::iterator it = aliens.begin(); it != aliens.end(); it++)
   {
      glPushMatrix();
      glColor3f(1.0f, 1.0f, 1.0f);
      glTranslated(it->position.x, it->position.y,  it->position.z );
      glScalef(0.007f, 0.007f, 0.01f);

      if (it->type == 0) glUniform1f(getUniLoc(p, "type"), 0.0);
      else if (it->type == 1) glUniform1f(getUniLoc(p, "type"), 1.0);
      else glUniform1f(getUniLoc(p, "type"), 2.0);

      glUniform1f(getUniLoc(p, "time"), glutGet(GLUT_ELAPSED_TIME));
      int temp = it->position.x + 40; //some random offset so no artifacts at x = -1,0,1 

      if (it->type == 0)
      {
         if (temp % 2 == 0)
            al1->batchDraw();
         else
            al1_1->batchDraw();
      }
      else if (it->type == 1)
      {
         if (temp % 2 == 0)
            al2->batchDraw();
         else
            al2_1->batchDraw();
      }
      else
      {
         if (temp % 2 == 0)
            al3->batchDraw();
         else
            al3_1->batchDraw();
      }
             
      glColor3f(1.0f, 1.0f, 1.0f);
      glPopMatrix();
   }

   glColor3f(1.0f, 1.0f, 1.0f);
   glDisable(GL_LIGHTING);
   glUseProgram(0);
}
/*
 * sendUniform4iv
 *
 * parameter name - char*
 * parameter count - GLsizei
 * parameter values - GLint*
 * return - bool
 */
bool ShaderObject::sendUniform4iv(const char * name, GLsizei count, GLint* values) {
    GLint location = getUniLoc(name);
    if (location == -1)
        return false;
    glUniform4ivARB(location, count, values);
    return true;
} // end sendUniform4iv()
/*
 * sendUniformMatrix4fv
 *
 * parameter name - char*
 * parameter count - GLsizei
 * parameter transpose - GLboolean
 * parameter values - GLfloat*
 * return - bool
 */
bool ShaderObject::sendUniformMatrix4fv(const char * name, GLsizei count, GLboolean transpose, GLfloat* values) {
    GLint location = getUniLoc(name);
    if (location == -1)
        return false;
    glUniformMatrix4fvARB(location, count, transpose, values);
    return true;
} // end sendUniformMatrix4fv()
/*
 * sendUniform4i
 *
 * parameter name - char*
 * parameter value0 - GLint
 * parameter value1 - GLint
 * parameter value2 - GLint
 * parameter value3 - GLint
 * return - bool
 */
bool ShaderObject::sendUniform4i(const char * name, GLint value0, GLint value1, GLint value2, GLint value3) {
    GLint location = getUniLoc(name);
    if (location == -1)
        return false;
    glUniform4iARB(location, value0, value1, value2, value3);
    return true;
} // end sendUniform4i()
/*
 * sendUniform2f
 *
 * parameter name - char*
 * parameter value0 - GLfloat
 * parameter value1 - GLfloat
 * return - bool
 */
bool ShaderObject::sendUniform2f(const char * name, GLfloat value0, GLfloat value1) {
    GLint location = getUniLoc(name);
    if (location == -1)
        return false;
    glUniform2fARB(location, value0, value1);
    return true;
} // end sendUniform2f()
void updateShader() {

  glUseProgram(currentShader);

  glUniform1i(getUniLoc(currentShader,"uGpuGenShape")   ,uGpuGenShape);
  glUniform1i(getUniLoc(currentShader,"uInnerShapeType"),uInnerShapeType);
  glUniform1i(getUniLoc(currentShader,"uLocalViewer")   ,uLocalViewer);

  if(options[OPT_SHADER_BUMPMAP] == TRUE || options[OPT_SHADER_DISPMAP] == TRUE)
  {
    glUniform1i(getUniLoc(currentShader,"uNumOfBumps")  ,uNumOfBumps);
    glUniform1i(getUniLoc(currentShader,"uCurrBumpSize"),uCurrBumpSize);
  }
//  glUniform1i(getUniLoc(currentShader,"uTessellation"),uTessellation);

}
Exemple #7
0
void updateAnim()
{
    int location;

    location = getUniLoc(ProgramObject, "currentTime"); 
    ParticleTime += 0.002f;

    if (ParticleTime > 15.0)
        ParticleTime = 0.0;

    glUniform1fARB(location, ParticleTime);

    printOpenGLError();
}
Exemple #8
0
void XGLShader::setUniFloat( const char *name, float fV ) {
    glUniform1fARB( getUniLoc(this->sp, name), fV );
    //printf("set uni float %s to: %f\n", name, fV);
}
Exemple #9
0
void Shader::SetUniVar(char* sVarName, int nValue0)
{
	//设置初始一致变量值
	glUniform1i(getUniLoc(m_Program, sVarName), nValue0);
}
Exemple #10
0
void Shader::SetUniVar(char* sVarName, float fValue0)
{
	//设置初始一致变量值
	glUniform1f(getUniLoc(m_Program, sVarName), fValue0);
}
Exemple #11
0
void Shader::SetUniVar(char* sVarName, float fValue0, float fValue1, float fValue2)
{
	//设置初始一致变量值
	glUniform3fARB(getUniLoc(m_Program, sVarName), fValue0, fValue1, fValue2); 

}
Exemple #12
0
/*public*/
int installBrickShaders(const GLchar *brickVertex,
                        const GLchar *brickFragment)
{
    GLuint brickVS, brickFS, brickProg;   // handles to objects
    GLint  vertCompiled, fragCompiled;    // status values
    GLint  linked;

    // Create a vertex shader object and a fragment shader object

    brickVS = glCreateShader(GL_VERTEX_SHADER);
    brickFS = glCreateShader(GL_FRAGMENT_SHADER);

    // Load source code strings into shaders

    glShaderSource(brickVS, 1, &brickVertex, NULL);
    glShaderSource(brickFS, 1, &brickFragment, NULL);

    // Compile the brick vertex shader, and print out
    // the compiler log file.

    glCompileShader(brickVS);
    printOpenGLError();  // Check for OpenGL errors
    glGetShaderiv(brickVS, GL_COMPILE_STATUS, &vertCompiled);
    printShaderInfoLog(brickVS);

    // Compile the brick vertex shader, and print out
    // the compiler log file.

    glCompileShader(brickFS);
    printOpenGLError();  // Check for OpenGL errors
    glGetShaderiv(brickFS, GL_COMPILE_STATUS, &fragCompiled);
    printShaderInfoLog(brickFS);

    if (!vertCompiled || !fragCompiled)
        return 0;

    // Create a program object and attach the two compiled shaders

    brickProg = glCreateProgram();
    glAttachShader(brickProg, brickVS);
    glAttachShader(brickProg, brickFS);

    // Link the program object and print out the info log

    glLinkProgram(brickProg);
    printOpenGLError();  // Check for OpenGL errors
    glGetProgramiv(brickProg, GL_LINK_STATUS, &linked);
    printProgramInfoLog(brickProg);

    if (!linked)
        return 0;

    // Install program object as part of current state

    glUseProgram(brickProg);

    // Set up initial uniform values

    glUniform3f(getUniLoc(brickProg, "BrickColor"), 1.0, 0.3, 0.2);
    glUniform3f(getUniLoc(brickProg, "MortarColor"), 0.85, 0.86, 0.84);
    glUniform2f(getUniLoc(brickProg, "BrickSize"), 0.30, 0.15);
    glUniform2f(getUniLoc(brickProg, "BrickPct"), 0.90, 0.85);
    glUniform3f(getUniLoc(brickProg, "LightPosition"), 0.0, 0.0, 4.0);

    return 1;
}
/// Set up view matrices, then draw scene
void OculusAppSkeleton::display(bool useOculus) const
{
    /// This may save us some frame rate
    if (!useOculus && !m_displaySceneInControl)
    {
        glClearColor(0,0,0,0);
        glClear(GL_COLOR_BUFFER_BIT);
        return;
    }

    glEnable(GL_DEPTH_TEST);

    m_ok.BindRenderBuffer();
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        const int fboWidth = m_ok.GetRenderBufferWidth();
        const int fboHeight = m_ok.GetRenderBufferHeight();
        const int halfWidth = fboWidth/2;
        if (useOculus)
        {
            const OVR::HMDInfo& hmd = m_ok.GetHMD();
            // Compute Aspect Ratio. Stereo mode cuts width in half.
            float aspectRatio = float(hmd.HResolution * 0.5f) / float(hmd.VResolution);

            // Compute Vertical FOV based on distance.
            float halfScreenDistance = (hmd.VScreenSize / 2);
            float yfov = 2.0f * atan(halfScreenDistance/hmd.EyeToScreenDistance);

            // Post-projection viewport coordinates range from (-1.0, 1.0), with the
            // center of the left viewport falling at (1/4) of horizontal screen size.
            // We need to shift this projection center to match with the lens center.
            // We compute this shift in physical units (meters) to correct
            // for different screen sizes and then rescale to viewport coordinates.
            float viewCenterValue = hmd.HScreenSize * 0.25f;
            float eyeProjectionShift = viewCenterValue - hmd.LensSeparationDistance * 0.5f;
            float projectionCenterOffset = 4.0f * eyeProjectionShift / hmd.HScreenSize;

            // Projection matrix for the "center eye", which the left/right matrices are based on.
            OVR::Matrix4f projCenter = OVR::Matrix4f::PerspectiveRH(yfov, aspectRatio, 0.3f, 1000.0f);
            OVR::Matrix4f projLeft   = OVR::Matrix4f::Translation(projectionCenterOffset, 0, 0) * projCenter;
            OVR::Matrix4f projRight  = OVR::Matrix4f::Translation(-projectionCenterOffset, 0, 0) * projCenter;
        
            // m_oculusView transformation translation in world units.
            float halfIPD = hmd.InterpupillaryDistance * 0.5f;
            OVR::Matrix4f viewLeft = OVR::Matrix4f::Translation(halfIPD, 0, 0) * m_oculusView;
            OVR::Matrix4f viewRight= OVR::Matrix4f::Translation(-halfIPD, 0, 0) * m_oculusView;

            glViewport(0        ,0,(GLsizei)halfWidth, (GLsizei)fboHeight);
            glScissor (0        ,0,(GLsizei)halfWidth, (GLsizei)fboHeight);
            m_scene.RenderForOneEye(viewLeft, projLeft);

            glViewport(halfWidth,0,(GLsizei)halfWidth, (GLsizei)fboHeight);
            glScissor (halfWidth,0,(GLsizei)halfWidth, (GLsizei)fboHeight);
            m_scene.RenderForOneEye(viewRight, projRight);
        }
        else
        {
            /// Set up our 3D transformation matrices
            /// Remember DX and OpenGL use transposed conventions. And doesn't DX use left-handed coords?
            OVR::Matrix4f mview = m_controlView;
            OVR::Matrix4f persp = OVR::Matrix4f::PerspectiveRH(
                m_viewAngleDeg * M_PI / 180.0f,
                (float)m_windowWidth/(float)m_windowHeight,
                0.004f,
                500.0f);

            glViewport(0,0,(GLsizei)fboWidth, (GLsizei)fboHeight);
            m_scene.RenderForOneEye(mview, persp);


            /// Render avatar of Oculus user
            //if (UseFollowCam)
            const GLuint prog = m_avatarProg;
            glUseProgram(prog);
            {
                OVR::Matrix4f rollPitchYaw = GetRollPitchYaw();
                OVR::Matrix4f eyetx = mview
                    * OVR::Matrix4f::Translation(EyePos.x, EyePos.y, EyePos.z)
                    * rollPitchYaw;

                glUniformMatrix4fv(getUniLoc(prog, "mvmtx"), 1, false, &eyetx.Transposed().M[0][0]);
                glUniformMatrix4fv(getUniLoc(prog, "prmtx"), 1, false, &persp.Transposed().M[0][0]);

                glLineWidth(4.0f);
                DrawOrigin2();
                const float aspect = (float)GetOculusWidth() / (float)GetOculusHeight();
                DrawViewFrustum(aspect);
                glLineWidth(1.0f);
            }
        }
    }
    m_ok.UnBindRenderBuffer();

    glDisable(GL_LIGHTING);
    glDisable(GL_DEPTH_TEST);

    const OVRkill::PostProcessType post = useOculus ? OVRkill::PostProcess_Distortion : OVRkill::PostProcess_None;
    m_ok.PresentFbo(post);
}