/* ------------------------------------------- */ /* ------- Texture Generation ---------------- */ /* ------------------------------------------- */ static void glsl_cb_add_tex(GLSL_ColorBand colorband, short type) { float texels[4]; ColorBand *cb = colorband->colorband; int i; if(colorband->tex_set) glDeleteTextures(1, &colorband->texid); for(i = 0; i < 512; i++){ do_colorband(cb, (float) i / 511, texels); colorband->tex[i][0] = texels[0]; colorband->tex[i][1] = texels[1]; colorband->tex[i][2] = texels[2]; colorband->tex[i][3] = texels[3]; } glGenTextures(1, &colorband->texid); glActiveTexture(GL_TEXTURE0 + type); glBindTexture(GL_TEXTURE_1D, colorband->texid); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, COLORBAND_WIDTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, colorband->tex); glEnable(GL_TEXTURE_1D); colorband->tex_set = 1; glActiveTexture(GL_TEXTURE0); } /* -------------------------------------------- */ /* ---- Uniforms sent by frame ---------------- */ /* -------------------------------------------- */ void glsl_update_colorband_uniforms(GLuint program, Material *mat, int index) { char *diff_fac, *spec_fac; char *diff_tex, *spec_tex; GLSL_Material material = BLI_ghash_lookup(matHash, mat); if(!material) return; if(mat->mode & MA_RAMP_COL){ GLSL_ColorBand colorband = material->diff_ramp; diff_fac = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 0, 0, "_fac"); glUniform1f(glsl_uniform_location(program, diff_fac), mat->rampfac_col); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_1D, colorband->texid); diff_tex = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 0, 0, "_tex"); glUniform1i(glsl_uniform_location(program, diff_tex), 1); glEnable(GL_TEXTURE_1D); MEM_freeN(diff_fac); MEM_freeN(diff_tex); printf("\nGLSL Diffuse Colorband Uniform sent\n"); } if(mat->mode & MA_RAMP_SPEC){ GLSL_ColorBand colorband = material->spec_ramp; spec_fac = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 1, 0, "_fac"); glUniform1f(glsl_uniform_location(program, spec_fac), mat->rampfac_spec); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_1D, colorband->texid); spec_tex = glsl_string(5, 0, "u_mat_", GINT, index, 0, "_ramp_", GINT, 1, 0, "_tex"); glUniform1i(glsl_uniform_location(program, spec_tex), 2); glEnable(GL_TEXTURE_1D); MEM_freeN(spec_fac); MEM_freeN(spec_tex); printf("\nGLSL Specular Colorband Uniform sent\n"); } glActiveTexture(GL_TEXTURE0); }