Esempio n. 1
0
water::water()
  : material_(float4(0.4f, 0.4f, 0.4f, 1.0f),
							float4(0.1f, 0.1f, 0.1f, 1.0f),
							float4(0.6f, 0.6f, 0.6f, 1.0f),
							0.9f) {
  render_prog_ = ShaderProgram("Water.vert", "Water.frag");
  sim_prog_ = ShaderProgram("Quad.vert", "WaterSimStep.frag");
  normal_prog_ = ShaderProgram("Quad.vert", "WaterNormal.frag");

  water_mesh_ = new SimpleMesh(render_prog_.program, 256, SimpleMesh::PLANE, 0.999999f);
  
  full_screen_quad_ = new FullScreenQuad();

  grid_size_x_ = 256;
  grid_size_z_ = 256;

  for(int i = 0; i < 3; i++)
    pos_tex_[i] = new RenderableTexture2D(GL_R32F, grid_size_x_, grid_size_z_);

	norm_tex_ = new RenderableTexture2D(GL_RGB16F, grid_size_x_, grid_size_z_);
  a_ = 0; 
  b_ = 1; 
  c_ = 2;

  GLint old_viewport[4];
  glGetIntegerv(GL_VIEWPORT, old_viewport);
  glViewport(0, 0, grid_size_x_, grid_size_z_);
  
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  for(int i = 0; i < 3; i++) {
    pos_tex_[i]->BeginRenderingToThisTexture();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    pos_tex_[i]->EndRenderingToThisTexture();
  }
	norm_tex_->BeginRenderingToThisTexture();
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  norm_tex_->EndRenderingToThisTexture();


  glViewport(old_viewport[0], old_viewport[1], old_viewport[2], old_viewport[3]);

	float4x4 rotation_matrix, scale_matrix, translate_matrix;
  float4x4 transform_matrix1;

  glusScalef(scale_matrix.L(), 10, 10, 10);
  glusTranslatef(translate_matrix.L(), 0,0,0);
  glusMultMatrixf(object_matrix_.L(), translate_matrix.L(), scale_matrix.L());
	//glusMultMatrixf(object_matrix_.L(), scale_matrix.L(), translate_matrix.L());

	glusInverseMatrixf(inversed_object_matrix_.L(), object_matrix_.L());
}
Esempio n. 2
0
void pool::init_object_matrix(int num_obj, GLfloat scale_coeff_x, GLfloat scale_coeff_y, GLfloat scale_coeff_z,
                              GLfloat translate_coeff_x, GLfloat translate_coeff_y, GLfloat translate_coeff_z,
                              GLfloat rotate_coeff_x, GLfloat rotate_coeff_z) {
    float4x4 rotationMatrix, scaleMatrix, translateMatrix;
    float4x4 transformMatrix1, transformMatrix2;

    glusRotateRzRyRxf(rotationMatrix.L(), rotate_coeff_x, 0.0f, rotate_coeff_z);
    glusScalef(scaleMatrix.L(), scale_coeff_x, scale_coeff_y, scale_coeff_z);
    glusTranslatef(translateMatrix.L(), translate_coeff_x, translate_coeff_y, translate_coeff_z);
    glusMultMatrixf(transformMatrix1.L(), rotationMatrix.L(), scaleMatrix.L());
    glusMultMatrixf(object_matrix_[num_obj].L(), translateMatrix.L(), transformMatrix1.L());
    glusInverseMatrixf(inversed_object_matrix_[num_obj].L(), object_matrix_[num_obj].L());

    size_x_[num_obj] = (int) scale_coeff_x;
    size_z_[num_obj] = (int) scale_coeff_z;
}
Esempio n. 3
0
GLUSboolean update(GLUSfloat time)
{
  try 
  {
    static float elaspedTimeFromStart = 0;
    elaspedTimeFromStart += 10*time;

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // make our program current
    //
    glUseProgram(g_program.program);  CHECK_GL_ERRORS;  

    // Set shader variables.
    // Note, that you can only assign shader variables (bind or set uiforms) 
    // if appropriate program was bind as current by glUseProgram.
    //
    setUniform(g_program.program, "g_screenWidth",  g_width);
    setUniform(g_program.program, "g_screenHeight", g_height);

    setUniform(g_program.program, "g_bBoxMin",  g_boxMin);
    setUniform(g_program.program, "g_bBoxMax",  g_boxMax);
 
    setUniform(g_program.program, "g_bgColor",  float4(0,0,1,0));
   
    
    // Calc ray matrix. You should notice that rayMatrix is actually inverse of worldMatrix. 
    // Because if you do some transform with an object, you need to do inverse transform with the rays. 
    // Do not forget it please!
    //
    float4x4 rayMatrix;
    float4x4 camRotMatrix, camTransMatrix;

    glusLoadIdentityf(camRotMatrix.L());
    glusLoadIdentityf(camTransMatrix.L());
    glusRotateRzRyRxf(camRotMatrix.L(), -input.cam_rot[0], -input.cam_rot[1], 0.0f);
    glusTranslatef(camTransMatrix.L(), g_camPos.x, g_camPos.y, g_camPos.z);
    glusMultMatrixf(rayMatrix.L(), camRotMatrix.L(), camTransMatrix.L());
    setUniform(g_program.program, "g_rayMatrix", rayMatrix);


    // Now finally draw something
    // disable depth and cull tests, because we just want to draw full screen quad
    //
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);

    glViewport(0, 0, g_width, g_height);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    
    g_pFullScreenQuad->Draw();
  
    return GLUS_TRUE;
  }
  catch(std::runtime_error e)
  {
    std::cerr << e.what() << std::endl;
    exit(-1);
  }
  catch(...)
  {
    std::cerr << "Unexpected Exception(render)!" << std::endl;
    exit(-1);
  }
}