Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
#include "zgl.h"
2
 
3
int glRenderMode(int mode)
4
{
5
  GLContext *c=gl_get_context();
6
  int result=0;
7
 
8
  switch(c->render_mode) {
9
  case GL_RENDER:
10
    break;
11
  case GL_SELECT:
12
    if (c->select_overflow) {
13
      result=-c->select_hits;
14
    } else {
15
      result=c->select_hits;
16
    }
17
    c->select_overflow=0;
18
    c->select_ptr=c->select_buffer;
19
    c->name_stack_size=0;
20
    break;
21
  default:
22
    assert(0);
23
  }
24
  switch(mode) {
25
  case GL_RENDER:
26
    c->render_mode=GL_RENDER;
27
    break;
28
  case GL_SELECT:
29
    c->render_mode=GL_SELECT;
30
    assert( c->select_buffer != NULL);
31
    c->select_ptr=c->select_buffer;
32
    c->select_hits=0;
33
    c->select_overflow=0;
34
    c->select_hit=NULL;
35
    break;
36
  default:
37
    assert(0);
38
  }
39
  return result;
40
}
41
 
42
void glSelectBuffer(int size,unsigned int *buf)
43
{
44
  GLContext *c=gl_get_context();
45
 
46
  assert(c->render_mode != GL_SELECT);
47
 
48
  c->select_buffer=buf;
49
  c->select_size=size;
50
}
51
 
52
 
53
void glopInitNames(GLContext *c,GLParam *p)
54
{
55
  if (c->render_mode == GL_SELECT) {
56
    c->name_stack_size=0;
57
    c->select_hit=NULL;
58
  }
59
}
60
 
61
void glopPushName(GLContext *c,GLParam *p)
62
{
63
  if (c->render_mode == GL_SELECT) {
64
    assert(c->name_stack_size
65
    c->name_stack[c->name_stack_size++]=p[1].i;
66
    c->select_hit=NULL;
67
  }
68
}
69
 
70
void glopPopName(GLContext *c,GLParam *p)
71
{
72
  if (c->render_mode == GL_SELECT) {
73
    assert(c->name_stack_size>0);
74
    c->name_stack_size--;
75
    c->select_hit=NULL;
76
  }
77
}
78
 
79
void glopLoadName(GLContext *c,GLParam *p)
80
{
81
  if (c->render_mode == GL_SELECT) {
82
   assert(c->name_stack_size>0);
83
   c->name_stack[c->name_stack_size-1]=p[1].i;
84
   c->select_hit=NULL;
85
  }
86
}
87
 
88
void gl_add_select(GLContext *c,unsigned int zmin,unsigned int zmax)
89
{
90
  unsigned int *ptr;
91
  int n,i;
92
 
93
  if (!c->select_overflow) {
94
    if (c->select_hit==NULL) {
95
      n=c->name_stack_size;
96
      if ((c->select_ptr-c->select_buffer+3+n) >
97
	  c->select_size) {
98
	c->select_overflow=1;
99
      } else {
100
	ptr=c->select_ptr;
101
	c->select_hit=ptr;
102
	*ptr++=c->name_stack_size;
103
	*ptr++=zmin;
104
	*ptr++=zmax;
105
	for(i=0;iname_stack[i];
106
	c->select_ptr=ptr;
107
	c->select_hits++;
108
      }
109
    } else {
110
      if (zminselect_hit[1]) c->select_hit[1]=zmin;
111
      if (zmax>c->select_hit[2]) c->select_hit[2]=zmax;
112
    }
113
  }
114
}