void volume_render_brick(GLuint const geometry, Matrix const * inverse_modelview, Brick const * const brick) { Vector size = box_size(brick->box); Vector tex_size = box_size(brick->tex); GLfloat const texture_matrix[4][4] = { {tex_size.x / size.x, 0, 0, 0}, {0, tex_size.y / size.y, 0, 0}, {0, 0, tex_size.z / size.z, 0}, {brick->tex.min.x, brick->tex.min.y, brick->tex.min.z, 1} }; GLdouble const clip_planes[6][4] = { { 1, 0, 0, -brick->box.min.x}, {-1, 0, 0, brick->box.max.x}, { 0, 1, 0, -brick->box.min.y}, { 0,-1, 0, brick->box.max.y}, { 0, 0, 1, -brick->box.min.z}, { 0, 0,-1, brick->box.max.z} }; glBindTexture(GL_TEXTURE_3D, brick->texture); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, brick->level); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, brick->level); glMatrixMode(GL_TEXTURE); glLoadMatrixf(&texture_matrix[0][0]); glTranslatef(-brick->box.min.x, -brick->box.min.y, -brick->box.min.z); // move into texture_matrix glMultMatrixf((GLfloat const *) inverse_modelview); glMatrixMode(GL_MODELVIEW); glClipPlane(GL_CLIP_PLANE0, clip_planes[0]); glClipPlane(GL_CLIP_PLANE1, clip_planes[1]); glClipPlane(GL_CLIP_PLANE2, clip_planes[2]); glClipPlane(GL_CLIP_PLANE3, clip_planes[3]); glClipPlane(GL_CLIP_PLANE4, clip_planes[4]); glClipPlane(GL_CLIP_PLANE5, clip_planes[5]); glCallList(geometry); }
void gspline_update(t_gspline *x) { short oh,ow,nh,nw; ow = x->x_boxwidth; oh = x->x_boxheight; nw = x->x_box.z_box.b_rect.right-x->x_box.z_box.b_rect.left; nh = x->x_box.z_box.b_rect.bottom-x->x_box.z_box.b_rect.top; if(nh != oh || nw != ow) { nw = MIN(MAX(nw, MINWIDTH), MAXWIDTH); // constrain to min and max size nh = MIN(MAX(nh, MINHEIGHT), MAXHEIGHT); box_size(&x->x_box.z_box, nw, nh); x->x_boxwidth = nw; x->x_boxheight = nh; } gspline_redraw(x); }