| 1 | #include "zgl.h" | 
|---|
| 2 | #include "msghandling.h" | 
|---|
| 3 |  | 
|---|
| 4 | void glopViewport(GLContext *c,GLParam *p) | 
|---|
| 5 | { | 
|---|
| 6 |   int xsize,ysize,xmin,ymin,xsize_req,ysize_req; | 
|---|
| 7 |    | 
|---|
| 8 |   xmin=p[1].i; | 
|---|
| 9 |   ymin=p[2].i; | 
|---|
| 10 |   xsize=p[3].i; | 
|---|
| 11 |   ysize=p[4].i; | 
|---|
| 12 |  | 
|---|
| 13 |   /* we may need to resize the zbuffer */ | 
|---|
| 14 |  | 
|---|
| 15 |   if (c->viewport.xmin != xmin || | 
|---|
| 16 |       c->viewport.ymin != ymin || | 
|---|
| 17 |       c->viewport.xsize != xsize || | 
|---|
| 18 |       c->viewport.ysize != ysize) { | 
|---|
| 19 |  | 
|---|
| 20 |     xsize_req=xmin+xsize; | 
|---|
| 21 |     ysize_req=ymin+ysize; | 
|---|
| 22 |  | 
|---|
| 23 |     if (c->gl_resize_viewport &&  | 
|---|
| 24 |         c->gl_resize_viewport(c,&xsize_req,&ysize_req) != 0) { | 
|---|
| 25 |       gl_fatal_error("glViewport: error while resizing display"); | 
|---|
| 26 |     } | 
|---|
| 27 |  | 
|---|
| 28 |     xsize=xsize_req-xmin; | 
|---|
| 29 |     ysize=ysize_req-ymin; | 
|---|
| 30 |     if (xsize <= 0 || ysize <= 0) { | 
|---|
| 31 |       gl_fatal_error("glViewport: size too small"); | 
|---|
| 32 |     } | 
|---|
| 33 |  | 
|---|
| 34 |     tgl_trace("glViewport: %d %d %d %d\n", | 
|---|
| 35 |               xmin, ymin, xsize, ysize); | 
|---|
| 36 |     c->viewport.xmin=xmin; | 
|---|
| 37 |     c->viewport.ymin=ymin; | 
|---|
| 38 |     c->viewport.xsize=xsize; | 
|---|
| 39 |     c->viewport.ysize=ysize; | 
|---|
| 40 |      | 
|---|
| 41 |     c->viewport.updated=1; | 
|---|
| 42 |   } | 
|---|
| 43 | } | 
|---|
| 44 |  | 
|---|
| 45 | void glopEnableDisable(GLContext *c,GLParam *p) | 
|---|
| 46 | { | 
|---|
| 47 |   int code=p[1].i; | 
|---|
| 48 |   int v=p[2].i; | 
|---|
| 49 |  | 
|---|
| 50 |   switch(code) { | 
|---|
| 51 |   case GL_CULL_FACE: | 
|---|
| 52 |     c->cull_face_enabled=v; | 
|---|
| 53 |     break; | 
|---|
| 54 |   case GL_LIGHTING: | 
|---|
| 55 |     c->lighting_enabled=v; | 
|---|
| 56 |     break; | 
|---|
| 57 |   case GL_COLOR_MATERIAL: | 
|---|
| 58 |     c->color_material_enabled=v; | 
|---|
| 59 |       break; | 
|---|
| 60 |   case GL_TEXTURE_2D: | 
|---|
| 61 |     c->texture_2d_enabled=v; | 
|---|
| 62 |     break; | 
|---|
| 63 |   case GL_NORMALIZE: | 
|---|
| 64 |     c->normalize_enabled=v; | 
|---|
| 65 |     break; | 
|---|
| 66 |   case GL_DEPTH_TEST: | 
|---|
| 67 |     c->depth_test = v; | 
|---|
| 68 |     break; | 
|---|
| 69 |   case GL_POLYGON_OFFSET_FILL: | 
|---|
| 70 |     if (v) c->offset_states |= TGL_OFFSET_FILL; | 
|---|
| 71 |     else c->offset_states &= ~TGL_OFFSET_FILL; | 
|---|
| 72 |     break;  | 
|---|
| 73 |   case GL_POLYGON_OFFSET_POINT: | 
|---|
| 74 |     if (v) c->offset_states |= TGL_OFFSET_POINT; | 
|---|
| 75 |     else c->offset_states &= ~TGL_OFFSET_POINT; | 
|---|
| 76 |     break;  | 
|---|
| 77 |   case GL_POLYGON_OFFSET_LINE: | 
|---|
| 78 |     if (v) c->offset_states |= TGL_OFFSET_LINE; | 
|---|
| 79 |     else c->offset_states &= ~TGL_OFFSET_LINE; | 
|---|
| 80 |     break;  | 
|---|
| 81 |   default: | 
|---|
| 82 |     if (code>=GL_LIGHT0 && code<GL_LIGHT0+MAX_LIGHTS) { | 
|---|
| 83 |       gl_enable_disable_light(c,code - GL_LIGHT0, v); | 
|---|
| 84 |     } else { | 
|---|
| 85 |       /* | 
|---|
| 86 |       fprintf(stderr,"glEnableDisable: 0x%X not supported.\n",code); | 
|---|
| 87 |       */ | 
|---|
| 88 |     } | 
|---|
| 89 |     break; | 
|---|
| 90 |   } | 
|---|
| 91 | } | 
|---|
| 92 |  | 
|---|
| 93 | void glopShadeModel(GLContext *c,GLParam *p) | 
|---|
| 94 | { | 
|---|
| 95 |   int code=p[1].i; | 
|---|
| 96 |   c->current_shade_model=code; | 
|---|
| 97 | } | 
|---|
| 98 |  | 
|---|
| 99 | void glopCullFace(GLContext *c,GLParam *p) | 
|---|
| 100 | { | 
|---|
| 101 |   int code=p[1].i; | 
|---|
| 102 |   c->current_cull_face=code; | 
|---|
| 103 | } | 
|---|
| 104 |  | 
|---|
| 105 | void glopFrontFace(GLContext *c,GLParam *p) | 
|---|
| 106 | { | 
|---|
| 107 |   int code=p[1].i; | 
|---|
| 108 |   c->current_front_face=code; | 
|---|
| 109 | } | 
|---|
| 110 |  | 
|---|
| 111 | void glopPolygonMode(GLContext *c,GLParam *p) | 
|---|
| 112 | { | 
|---|
| 113 |   int face=p[1].i; | 
|---|
| 114 |   int mode=p[2].i; | 
|---|
| 115 |    | 
|---|
| 116 |   switch(face) { | 
|---|
| 117 |   case GL_BACK: | 
|---|
| 118 |     c->polygon_mode_back=mode; | 
|---|
| 119 |     break; | 
|---|
| 120 |   case GL_FRONT: | 
|---|
| 121 |     c->polygon_mode_front=mode; | 
|---|
| 122 |     break; | 
|---|
| 123 |   case GL_FRONT_AND_BACK: | 
|---|
| 124 |     c->polygon_mode_front=mode; | 
|---|
| 125 |     c->polygon_mode_back=mode; | 
|---|
| 126 |     break; | 
|---|
| 127 |   default: | 
|---|
| 128 |     assert(0); | 
|---|
| 129 |   } | 
|---|
| 130 | } | 
|---|
| 131 |  | 
|---|
| 132 | void glopHint(GLContext *c,GLParam *p) | 
|---|
| 133 | { | 
|---|
| 134 | #if 0 | 
|---|
| 135 |   int target=p[1].i; | 
|---|
| 136 |   int mode=p[2].i; | 
|---|
| 137 |  | 
|---|
| 138 |   /* do nothing */ | 
|---|
| 139 | #endif | 
|---|
| 140 | } | 
|---|
| 141 |  | 
|---|
| 142 | void  | 
|---|
| 143 | glopPolygonOffset(GLContext *c, GLParam *p) | 
|---|
| 144 | { | 
|---|
| 145 |   c->offset_factor = p[1].f; | 
|---|
| 146 |   c->offset_units = p[2].f; | 
|---|
| 147 | } | 
|---|