ref: e215ef38e157469b503c7322b22d4a80875f8ae9
dir: /src/select.c/
#include "zgl.h" int glRenderMode(GLint mode) { GLContext *c=gl_get_context(); GLint result=0; switch(c->render_mode) { case GL_RENDER: break; case GL_SELECT: if (c->select_overflow) { result=-c->select_hits; } else { result=c->select_hits; } c->select_overflow=0; c->select_ptr=c->select_buffer; c->name_stack_size=0; break; default: assert(0); } switch(mode) { case GL_RENDER: c->render_mode=GL_RENDER; break; case GL_SELECT: c->render_mode=GL_SELECT; assert( c->select_buffer != NULL); c->select_ptr=c->select_buffer; c->select_hits=0; c->select_overflow=0; c->select_hit=NULL; break; default: assert(0); } return result; } void glSelectBuffer(GLint size,GLuint *buf) { GLContext *c=gl_get_context(); assert(c->render_mode != GL_SELECT); c->select_buffer=buf; c->select_size=size; } void glopInitNames(GLContext *c,GLParam *p) { if (c->render_mode == GL_SELECT) { c->name_stack_size=0; c->select_hit=NULL; } } void glopPushName(GLContext *c,GLParam *p) { if (c->render_mode == GL_SELECT) { assert(c->name_stack_size<MAX_NAME_STACK_DEPTH); c->name_stack[c->name_stack_size++]=p[1].i; c->select_hit=NULL; } } void glopPopName(GLContext *c,GLParam *p) { if (c->render_mode == GL_SELECT) { assert(c->name_stack_size>0); c->name_stack_size--; c->select_hit=NULL; } } void glopLoadName(GLContext *c,GLParam *p) { if (c->render_mode == GL_SELECT) { assert(c->name_stack_size>0); c->name_stack[c->name_stack_size-1]=p[1].i; c->select_hit=NULL; } } void gl_add_select(GLContext *c,GLuint zmin,GLuint zmax) { GLuint *ptr; GLint n,i; if (!c->select_overflow) { if (c->select_hit==NULL) { n=c->name_stack_size; if ((c->select_ptr-c->select_buffer+3+n) > c->select_size) { c->select_overflow=1; } else { ptr=c->select_ptr; c->select_hit=ptr; *ptr++=c->name_stack_size; *ptr++=zmin; *ptr++=zmax; for(i=0;i<n;i++) *ptr++=c->name_stack[i]; c->select_ptr=ptr; c->select_hits++; } } else { if (zmin<c->select_hit[1]) c->select_hit[1]=zmin; if (zmax>c->select_hit[2]) c->select_hit[2]=zmax; } } }