bool VolShader::emit_f(string& s) { ostringstream z; if (poly_) { z << ShaderProgram::glsl_version_; z << FRG_SHADER_CODE_CORE_PROFILE; //output s = z.str(); return false; } //version info z << ShaderProgram::glsl_version_; z << VOL_INPUTS; if (fog_) z << VOL_INPUTS_FOG; z << VOL_OUTPUTS; //the common uniforms z << VOL_UNIFORMS_COMMON; //2d map location if (peel_ != 0 || color_mode_ == 2) z << VOL_UNIFORMS_2DMAP_LOC; //color modes switch (color_mode_) { case 0://normal z << VOL_UNIFORMS_SIN_COLOR; break; case 1://colormap z << VOL_UNIFORMS_COLORMAP; break; case 2://depth map z << VOL_UNIFORMS_SIN_COLOR; z << VOL_UNIFORMS_DEPTHMAP; break; } // add uniform for depth peeling if (peel_ != 0) z << VOL_UNIFORMS_DP; // add uniforms for clipping if (clip_) { z << VOL_UNIFORMS_CLIP; z << VOL_UNIFORMS_MATRICES; } // add uniforms for masking switch (mask_) { case 1: case 2: z << VOL_UNIFORMS_MASK; break; case 3: z << VOL_UNIFORMS_LABEL; break; case 4: z << VOL_UNIFORMS_MASK; z << VOL_UNIFORMS_LABEL; break; } //uniform for fog if (fog_) z << VOL_UNIFORMS_FOG_LOC; //functions if (clip_) z << VOL_CLIP_FUNC; //the common head z << VOL_HEAD; if (peel_ != 0 || color_mode_ == 2) z << VOL_HEAD_2DMAP_LOC; //head for depth peeling if (peel_ == 1)//draw volume before 15 z << VOL_HEAD_DP_1; else if (peel_ == 2 || peel_ == 5)//draw volume after 15 z << VOL_HEAD_DP_2; else if (peel_ == 3 || peel_ == 4)//draw volume after 14 and before 15 z << VOL_HEAD_DP_3; //head for clipping planes if (clip_) z << VOL_HEAD_CLIP_FUNC; // Set up light variables and input parameters. z << VOL_HEAD_LIT; // Set up fog variables and input parameters. if (fog_) z << VOL_HEAD_FOG; //bodies if (shading_) { //no gradient volume, need to calculate in real-time z << VOL_DATA_VOLUME_LOOKUP; if (hiqual_) z << VOL_GRAD_COMPUTE_HI; else z << VOL_GRAD_COMPUTE_LO; z << VOL_BODY_SHADING; if (channels_ == 1) z << VOL_COMPUTED_GM_LOOKUP; else z << VOL_TEXTURE_GM_LOOKUP; switch (color_mode_) { case 0://normal if (solid_) z << VOL_TRANSFER_FUNCTION_SIN_COLOR_SOLID; else z << VOL_TRANSFER_FUNCTION_SIN_COLOR; break; case 1://colormap if (solid_) { z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID; z << get_colormap_proj(); z << get_colormap_code(); z << VOL_COMMON_TRANSFER_FUNCTION_CALC; z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID_RESULT; } else { z << VOL_TRANSFER_FUNCTION_COLORMAP; z << get_colormap_proj(); z << get_colormap_code(); z << VOL_COMMON_TRANSFER_FUNCTION_CALC; z << VOL_TRANSFER_FUNCTION_COLORMAP_RESULT; } break; } z << VOL_COLOR_OUTPUT; } else // No shading { z << VOL_DATA_VOLUME_LOOKUP; if (channels_ == 1) { // Compute Gradient magnitude and use it. if (hiqual_) z << VOL_GRAD_COMPUTE_HI; else z << VOL_GRAD_COMPUTE_LO; z << VOL_COMPUTED_GM_LOOKUP; } else { z << VOL_TEXTURE_GM_LOOKUP; } if (mip_ && colormap_proj_) { z << VOL_TRANSFER_FUNCTION_MIP_COLOR_PROJ; z << get_colormap_proj(); z << VOL_TRANSFER_FUNCTION_MIP_COLOR_PROJ_RESULT; z << VOL_RASTER_BLEND_SOLID; } else { switch (color_mode_) { case 0://normal if (solid_) z << VOL_TRANSFER_FUNCTION_SIN_COLOR_SOLID; else z << VOL_TRANSFER_FUNCTION_SIN_COLOR; break; case 1://colormap if (solid_) { z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID; z << get_colormap_proj(); z << get_colormap_code(); z << VOL_COMMON_TRANSFER_FUNCTION_CALC; z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID_RESULT; } else { z << VOL_TRANSFER_FUNCTION_COLORMAP; z << get_colormap_proj(); z << get_colormap_code(); z << VOL_COMMON_TRANSFER_FUNCTION_CALC; z << VOL_TRANSFER_FUNCTION_COLORMAP_RESULT; } break; case 2://depth map z << VOL_TRANSFER_FUNCTION_DEPTHMAP; break; } } } if (!(mip_ && colormap_proj_)) { // fog if (fog_) { z << VOL_FOG_BODY; } //final blend switch (mask_) { case 0: if (color_mode_ == 2) z << VOL_RASTER_BLEND_DMAP; else { if (solid_) z << VOL_RASTER_BLEND_SOLID; else z << VOL_RASTER_BLEND; } break; case 1: if (color_mode_ == 2) z << VOL_RASTER_BLEND_MASK_DMAP; else { if (solid_) z << VOL_RASTER_BLEND_MASK_SOLID; else z << VOL_RASTER_BLEND_MASK; } break; case 2: if (color_mode_ == 2) z << VOL_RASTER_BLEND_NOMASK_DMAP; else { if (solid_) z << VOL_RASTER_BLEND_NOMASK_SOLID; else z << VOL_RASTER_BLEND_NOMASK; } break; case 3: z << VOL_RASTER_BLEND_LABEL; break; case 4: z << VOL_RASTER_BLEND_LABEL_MASK; break; } } //the common tail z << VOL_TAIL; //output s = z.str(); return false; }
bool ImgShader::emit_f(string& s) { ostringstream z; z << ShaderProgram::glsl_version_; switch (type_) { case IMG_SHDR_DRAW_GEOMETRY: z << IMG_FRG_CODE_DRAW_GEOMETRY; break; case IMG_SHDR_DRAW_GEOMETRY_COLOR3: z << IMG_FRG_CODE_DRAW_GEOMETRY_COLOR3; break; case IMG_SHDR_DRAW_GEOMETRY_COLOR4: z << IMG_FRG_CODE_DRAW_GEOMETRY_COLOR4; break; case IMG_SHADER_TEXTURE_LOOKUP: z << IMG_SHADER_CODE_TEXTURE_LOOKUP; break; case IMG_SHDR_BRIGHTNESS_CONTRAST: z << IMG_SHADER_CODE_BRIGHTNESS_CONTRAST; break; case IMG_SHDR_BRIGHTNESS_CONTRAST_HDR: z << IMG_SHADER_CODE_BRIGHTNESS_CONTRAST_HDR; break; case IMG_SHDR_GRADIENT_MAP: z << IMG_SHADER_CODE_GRADIENT_MAP; z << get_colormap_code(); z << IMG_SHADER_CODE_GRADIENT_MAP_RESULT; break; case IMG_SHDR_FILTER_BLUR: z << IMG_SHADER_CODE_FILTER_BLUR; break; case IMG_SHDR_FILTER_MAX: z << IMG_SHADER_CODE_FILTER_MAX; break; case IMG_SHDR_FILTER_SHARPEN: z << IMG_SHADER_CODE_FILTER_SHARPEN; break; case IMG_SHDR_DEPTH_TO_OUTLINES: z << IMG_SHADER_CODE_DEPTH_TO_OUTLINES; break; case IMG_SHDR_DEPTH_TO_GRADIENT: z << IMG_SHADER_CODE_DEPTH_TO_GRADIENT; break; case IMG_SHDR_GRADIENT_TO_SHADOW: z << IMG_SHADER_CODE_GRADIENT_TO_SHADOW; break; case IMG_SHDR_GRADIENT_TO_SHADOW_MESH: z << IMG_SHADER_CODE_GRADIENT_TO_SHADOW_MESH; break; case IMG_SHDR_BLEND_BRIGHT_BACKGROUND: z << IMG_SHADER_CODE_BLEND_BRIGHT_BACKGROUND; break; case IMG_SHDR_BLEND_BRIGHT_BACKGROUND_HDR: z << IMG_SHADER_CODE_BLEND_BRIGHT_BACKGROUND_HDR; break; case IMG_SHDR_PAINT: z << PAINT_SHADER_CODE; break; default: z << IMG_SHADER_CODE_TEXTURE_LOOKUP; } s = z.str(); //std::cerr << s << std::endl; return false; }