00001 #include "carol_glsl.h"
00002
00003 GLuint fragmentShader, program;
00004
00005 char* GLSL_textFileRead(char *fn)
00006 {
00007
00008 FILE *fp;
00009 char *content = NULL;
00010
00011 int count=0;
00012
00013 if (fn != NULL) {
00014 fp = fopen(fn,"rt");
00015
00016 if (fp != NULL) {
00017
00018 fseek(fp, 0, SEEK_END);
00019 count = ftell(fp);
00020 rewind(fp);
00021
00022 if (count > 0) {
00023 content = (char *)malloc(sizeof(char) * (count+1));
00024 count = fread(content,sizeof(char),count,fp);
00025 content[count] = '\0';
00026 }
00027 fclose(fp);
00028 }
00029 }
00030 return content;
00031 }
00032
00033 int GLSL_textFileWrite(char *fn, char *s)
00034 {
00035
00036 FILE *fp;
00037 int status = 0;
00038
00039 if (fn != NULL) {
00040 fp = fopen(fn,"w");
00041
00042 if (fp != NULL) {
00043
00044 if (fwrite(s,sizeof(char),strlen(s),fp) == strlen(s))
00045 status = 1;
00046 fclose(fp);
00047 }
00048 }
00049 return(status);
00050 }
00051
00052 void GLSL_texActivate(int numTextureObjects, TextureObject *textureObjects)
00053 {
00054 int i;
00055
00056 for (i = 0; i < numTextureObjects; i++) {
00057 glActiveTexture(GL_TEXTURE0 + textureObjects[i].texUnit);
00058 glEnable(textureObjects[i].texture.target);
00059 glBindTexture(textureObjects[i].texture.target,
00060 textureObjects[i].texture.id);
00061 }
00062 }
00063
00064 void GLSL_texDeactivate(int numTextureObjects, TextureObject *textureObjects)
00065 {
00066 int i;
00067
00068 for (i = 0; i < numTextureObjects; i++) {
00069 glActiveTexture(GL_TEXTURE0 + textureObjects[i].texUnit);
00070 glDisable(textureObjects[i].texture.target);
00071 }
00072 }
00073
00074
00075 void GLSL_activateARBProg(ARBProgram *prog)
00076 {
00077 GLSL_texActivate(prog->numTextureObjects, prog->textureObjects);
00078 glEnable(prog->programType);
00079 glUseProgram(prog->id);
00080 }
00081
00082 void GLSL_deactivateARBProg(ARBProgram *prog)
00083 {
00084 GLSL_texDeactivate(prog->numTextureObjects, prog->textureObjects);
00085 glDisable(prog->programType);
00086 glUseProgram(0);
00087 }
00088
00089
00090 void GLSL_init()
00091 {
00092 char *fragmentShaderContent;
00093
00094 fragmentShaderContent = GLSL_textFileRead("./glsl_volumeShaders/carol_raycasting.fp");
00095 const char *fragContent = fragmentShaderContent;
00096
00097 g.fragProgs[0].id = glCreateProgram();
00098
00099 fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
00100 glShaderSource(fragmentShader, 1, &fragContent,NULL);
00101
00102 free((void*)fragmentShader);
00103
00104 glCompileShader(fragmentShader);
00105
00106 glAttachShader(g.fragProgs[0].id,fragmentShader);
00107
00108 glLinkProgram(g.fragProgs[0].id);
00109 }
00110
00111 void GLSL_raycastBackground(GLenum destinationBuffer)
00112 {
00113 GLdouble modelview[16], projection[16], vertizes[4][3];
00114 GLint viewport[4];
00115 GLdouble x, y, z;
00116 int i;
00117
00118 float texelHeight = 1.0/(float)g.windowHeight;
00119 float texelWidth = 1.0/(float)g.windowWidth;
00120
00121 GLSL_activateARBProg(g.currentFragProg);
00122
00123 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00124 glEnable(GL_CULL_FACE);
00125
00126 glUniform4f(glGetUniformLocation(program, "params2"), g.u.texCoordScale, 0.0, 0.0, 0.0);
00127
00128 glUniform4fv(glGetUniformLocation(program, "center"), 1, g.center);
00129
00130 glUniform4f(glGetUniformLocation(program, "texMax"), g.extents[0] * g.scaleFactors[0],
00131 g.extents[1] * g.scaleFactors[1],
00132 g.extents[2] * g.scaleFactors[2],
00133 0.0);
00134
00135 glUniform4fv(glGetUniformLocation(program, "scaleFactors"), 1, g.scaleFactors);
00136
00137 glGetIntegerv(GL_VIEWPORT, viewport);
00138 glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
00139 glGetDoublev(GL_PROJECTION_MATRIX, projection);
00140
00141 for (i = 0; i < 4; i++) {
00142 x = ((i&1)>>0) * viewport[2];
00143 y = ((i&2)>>1) * viewport[3];
00144 z = .5;
00145
00146 gluUnProject(x, y, z, modelview, projection, viewport,
00147 &vertizes[i][0], &vertizes[i][1], &vertizes[i][2]);
00148 }
00149
00150 glBegin(GL_QUADS);
00151 vertexv(vertizes[0]);
00152 vertexv(vertizes[1]);
00153 vertexv(vertizes[3]);
00154 vertexv(vertizes[2]);
00155 glEnd();
00156
00157 GLSL_deactivateARBProg(g.currentFragProg);
00158
00159 glDrawBuffer(GL_BACK);
00160 }
00161 void GLSL_renderVolume()
00162 {
00163 glUniform4f(glGetUniformLocation(program, "params"), g.u.stepSize,
00164 g.u.gradScale, g.u.gradOffset, -5.0);
00165 glUniform4f(glGetUniformLocation(program, "params2"), g.u.texCoordScale, g.u.numIterations,
00166 g.u.isoValue, 0);
00167 glUniform4fv(glGetUniformLocation(program, "center"), 1, g.center);
00168 glUniform4f(glGetUniformLocation(program, "texMax"), g.extents[0] * g.scaleFactors[0],
00169 g.extents[1] * g.scaleFactors[1],
00170 g.extents[2] * g.scaleFactors[2],
00171 0.0);
00172 glUniform4fv(glGetUniformLocation(program, "scaleFactors"), 1, g.scaleFactors);
00173
00174 drawQuads();
00175 }
00176
00177 void GLSL_raycastVolume()
00178 {
00179
00180 GLSL_activateARBProg(g.currentFragProg);
00181 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00182 glDisable(GL_DEPTH_TEST);
00183
00184 glEnable(GL_CULL_FACE);
00185
00186 GLSL_renderVolume();
00187
00188 GLSL_deactivateARBProg(g.currentFragProg);
00189
00190 }