surface fancy( ) { FB = environment("flowers.rgb"); FB *= color(.5,.2,.0,0); FB = under(texture("marblebirds.rgba", scale(2.,2.,2.))); }
/* Draw Shader: fancy */ GLint draw_fancy_shader (void (*draw_geometry) (void*), void *geometry, GLsizei win_w, GLsizei win_h, GLint x_lower_left, GLint y_lower_left, GLint x_upper_right, GLint y_upper_right) { GLsizei bounding_rect_w, bounding_rect_h; GLenum light_id; GLfloat light_position[4]; GLfloat light_ambient[4]; GLfloat light_diffuse[4]; GLfloat light_specular[4]; GLfloat mat_emission[4]; GLfloat mat_ambient[4]; GLfloat mat_diffuse[4]; GLfloat mat_specular[4]; GLfloat curr_matrix[16]; GLfloat texgen_plane[4]; GLfloat tex_w_scale, tex_h_scale; if (setup_done == GL_FALSE) { return 0; } /* Error check bounding box x coords */ if ((bounding_rect_w = x_upper_right - x_lower_left + 1) <= 0) { return -1; } /* Error check bounding box y coords */ if ((bounding_rect_h = y_upper_right - y_lower_left + 1) <= 0) { return -1; } /* Error check window dimensions */ if ((win_w <= 0) || (win_h <= 0)) { return -1; } /* Error check temporary texture dimensions */ if ((tmp_tex_w <= 0) || (tmp_tex_h <= 0)) { return -1; } tex_w_scale = (GLfloat) win_w / (GLfloat) tmp_tex_w; tex_h_scale = (GLfloat) win_h / (GLfloat) tmp_tex_h; #if 1 /********************************* * Start Geom Pass. Pass: 0 ********************************/ /* Save Default State */ glPushAttrib (GL_ALL_ATTRIB_BITS); glMatrixMode (GL_TEXTURE); glPushMatrix (); glMatrixMode (GL_COLOR); glPushMatrix (); light_id = GL_LIGHT0; /* IPF_Colormask_Attribute */ glColorMask (1, 1, 1, 1); /* IPF_Stencil_Attribute */ glEnable (GL_STENCIL_TEST); glStencilFunc (GL_ALWAYS, 0x1, 0xff); glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); glStencilMask (0xff); /* IPF_Depth_Attribute */ glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); /* IPF_Texture_Attribute */ glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, texture_ids[0]); /* flowers.rgb */ /* IPF_Texgen_Attribute */ glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glEnable (GL_TEXTURE_GEN_S); glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable (GL_TEXTURE_GEN_T); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glPopMatrix (); /* Draw Geometry */ /* Always set the matrix mode to modelview. This could be a problem if the callback expects the mode to be something else. */ glMatrixMode (GL_MODELVIEW); draw_geometry (geometry); /* Restore Default State */ glMatrixMode (GL_TEXTURE); glPopMatrix (); glMatrixMode (GL_COLOR); glPopMatrix (); glPopAttrib (); #endif #if 1 /********************************* * Start Geom Pass. Pass: 1 ********************************/ /* Save Default State */ glPushAttrib (GL_ALL_ATTRIB_BITS); glMatrixMode (GL_TEXTURE); glPushMatrix (); glMatrixMode (GL_COLOR); glPushMatrix (); light_id = GL_LIGHT0; /* IPF_Colormask_Attribute */ glColorMask (1, 1, 1, 1); /* IPF_Stencil_Attribute */ glEnable (GL_STENCIL_TEST); glStencilFunc (GL_LEQUAL, 0x1, 0xff); glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); glStencilMask (0x7fffffff); /* IPF_Blend_Attribute */ glEnable (GL_BLEND); glBlendEquationEXT (GL_FUNC_ADD_EXT); glBlendFunc (GL_DST_COLOR, GL_ZERO); /* IPF_Depth_Attribute */ glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); /* IPF_Color_Attribute */ glColor4f (0.500000, 0.200000, 0.000000, 0.000000); /* Draw Geometry */ /* Always set the matrix mode to modelview. This could be a problem if the callback expects the mode to be something else. */ glMatrixMode (GL_MODELVIEW); draw_geometry (geometry); /* Restore Default State */ glMatrixMode (GL_TEXTURE); glPopMatrix (); glMatrixMode (GL_COLOR); glPopMatrix (); glPopAttrib (); #endif #if 1 /********************************* * Start Geom Pass. Pass: 2 ********************************/ /* Save Default State */ glPushAttrib (GL_ALL_ATTRIB_BITS); glMatrixMode (GL_TEXTURE); glPushMatrix (); glMatrixMode (GL_COLOR); glPushMatrix (); light_id = GL_LIGHT0; /* IPF_Colormask_Attribute */ glColorMask (1, 1, 1, 1); /* IPF_Stencil_Attribute */ glEnable (GL_STENCIL_TEST); glStencilFunc (GL_LEQUAL, 0x1, 0xff); glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); glStencilMask (0x7fffffff); /* IPF_Blend_Attribute */ glEnable (GL_BLEND); glBlendEquationEXT (GL_FUNC_ADD_EXT); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* IPF_Depth_Attribute */ glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); /* IPF_Texture_Attribute */ glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, texture_ids[1]); /* marblebirds.rgba */ /* IPF_Matrix_Attribute */ glMatrixMode (GL_TEXTURE); curr_matrix[0] = 2.000000; curr_matrix[1] = 0.000000; curr_matrix[2] = 0.000000; curr_matrix[3] = 0.000000; curr_matrix[4] = 0.000000; curr_matrix[5] = 2.000000; curr_matrix[6] = 0.000000; curr_matrix[7] = 0.000000; curr_matrix[8] = 0.000000; curr_matrix[9] = 0.000000; curr_matrix[10] = 2.000000; curr_matrix[11] = 0.000000; curr_matrix[12] = 0.000000; curr_matrix[13] = 0.000000; curr_matrix[14] = 0.000000; curr_matrix[15] = 1.000000; glLoadMatrixf (curr_matrix); /* Draw Geometry */ /* Always set the matrix mode to modelview. This could be a problem if the callback expects the mode to be something else. */ glMatrixMode (GL_MODELVIEW); draw_geometry (geometry); /* Restore Default State */ glMatrixMode (GL_TEXTURE); glPopMatrix (); glMatrixMode (GL_COLOR); glPopMatrix (); glPopAttrib (); #endif return 0; }