aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/tinygl-0.4-ugfx/src/select.c
blob: 46134dbc8e2f719d3c1e057abfa94484b0e196e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "zgl.h"

int glRenderMode(int mode)
{
  GLContext *c=gl_get_context();
  int 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:
    gl_assert(0);
  }
  switch(mode) {
  case GL_RENDER:
    c->render_mode=GL_RENDER;
    break;
  case GL_SELECT:
    c->render_mode=GL_SELECT;
    gl_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:
    gl_assert(0);
  }
  return result;
}

void glSelectBuffer(int size,unsigned int *buf)
{
  GLContext *c=gl_get_context();

  gl_assert(c->render_mode != GL_SELECT);
  
  c->select_buffer=buf;
  c->select_size=size;
}


void glopInitNames(GLContext *c,GLParam *p)
{
	  (void)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) {
    gl_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)
{
	  (void)p;
  if (c->render_mode == GL_SELECT) {
    gl_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) {
   gl_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,unsigned int zmin,unsigned int zmax)
{
  unsigned int *ptr;
  int 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;
    }
  }
}