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()); }
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; }
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); } }