[1097] | 1 | /************************************************************************
|
---|
| 2 |
|
---|
| 3 | MxGLUtils
|
---|
| 4 |
|
---|
| 5 | Copyright (C) 1998 Michael Garland. See "COPYING.txt" for details.
|
---|
| 6 |
|
---|
| 7 | $Id: MxGLUtils.cxx,v 1.1 2002/09/24 16:53:54 wimmer Exp $
|
---|
| 8 |
|
---|
| 9 | ************************************************************************/
|
---|
| 10 |
|
---|
| 11 | #include "stdmix.h"
|
---|
| 12 | #include "MxGLUtils.h"
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | void mxgl_default_texinit(MxRaster *tex, bool will_draw_texture)
|
---|
| 16 | {
|
---|
| 17 | if( tex )
|
---|
| 18 | {
|
---|
| 19 | if( will_draw_texture ) glEnable(GL_TEXTURE_2D);
|
---|
| 20 | // glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
---|
| 21 | glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
---|
| 22 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
---|
| 23 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
---|
| 24 | // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
---|
| 25 | // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
---|
| 26 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
---|
| 27 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
---|
| 28 |
|
---|
| 29 | glTexImage(tex);
|
---|
| 30 | // gluMipmaps(tex);
|
---|
| 31 | }
|
---|
| 32 | }
|
---|
| 33 |
|
---|
| 34 | void mxgl_default_init()
|
---|
| 35 | {
|
---|
| 36 | glEnable(GL_DEPTH_TEST);
|
---|
| 37 | glEnable(GL_LIGHTING);
|
---|
| 38 | glEnable(GL_NORMALIZE);
|
---|
| 39 | glShadeModel(GL_SMOOTH);
|
---|
| 40 |
|
---|
| 41 | glMatrixMode(GL_PROJECTION);
|
---|
| 42 | glLoadIdentity();
|
---|
| 43 | glMatrixMode(GL_MODELVIEW);
|
---|
| 44 |
|
---|
| 45 | GLfloat mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
---|
| 46 | GLfloat mat_diffuse[] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
---|
| 47 | GLfloat mat_specular[] = { 0.1f, 0.1f, 0.1f, 1.0f };
|
---|
| 48 | glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
|
---|
| 49 | glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
|
---|
| 50 | glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
|
---|
| 51 | glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 40);
|
---|
| 52 |
|
---|
| 53 | GLfloat light_pos[] = {0.0f, 0.0f, 1.0f, 0.0f};
|
---|
| 54 | glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
|
---|
| 55 | glEnable(GL_LIGHT0);
|
---|
| 56 |
|
---|
| 57 | glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
|
---|
| 58 | glEnable(GL_COLOR_MATERIAL);
|
---|
| 59 | glColor3f(0.5f, 0.5f, 0.5f);
|
---|
| 60 | glClearColor(0.3f, 0.3f, 1.0f, 0.0f);
|
---|
| 61 |
|
---|
| 62 | CAREFUL(mxgl_check_errors("at end of mxgl_default_init()"));
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 |
|
---|
| 66 | GLenum mxgl_matrix_for_mode(GLenum mode)
|
---|
| 67 | {
|
---|
| 68 | switch( mode )
|
---|
| 69 | {
|
---|
| 70 | case GL_MODELVIEW: return GL_MODELVIEW_MATRIX;
|
---|
| 71 | case GL_PROJECTION: return GL_PROJECTION_MATRIX;
|
---|
| 72 | case GL_TEXTURE: return GL_TEXTURE_MATRIX;
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | return GL_FALSE;
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | #define pick_zmax MXID_NIL
|
---|
| 79 |
|
---|
| 80 |
|
---|
| 81 | MxGLPicker::MxGLPicker(int x, int y, double window)
|
---|
| 82 | : buffer(128)
|
---|
| 83 | {
|
---|
| 84 | GLint vp[4];
|
---|
| 85 |
|
---|
| 86 | glMatrixMode(GL_PROJECTION);
|
---|
| 87 | glGetIntegerv(GL_VIEWPORT, vp);
|
---|
| 88 | glSelectBuffer(128, buffer);
|
---|
| 89 | glRenderMode(GL_SELECT);
|
---|
| 90 |
|
---|
| 91 | gluPickMatrix(x, vp[3] - y, window, window, vp);
|
---|
| 92 | glInitNames();
|
---|
| 93 | glPushName(MXID_NIL);
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | uint MxGLPicker::complete()
|
---|
| 97 | {
|
---|
| 98 | glFlush();
|
---|
| 99 |
|
---|
| 100 | GLint nhits = glRenderMode(GL_RENDER);
|
---|
| 101 | GLuint hit = MXID_NIL;
|
---|
| 102 | GLuint zmin = pick_zmax;
|
---|
| 103 | GLuint *ptr = buffer;
|
---|
| 104 |
|
---|
| 105 | for(uint i=0; i<nhits; i++)
|
---|
| 106 | {
|
---|
| 107 | GLuint nnames = *ptr++;
|
---|
| 108 | assert( nnames==1 ); // assume name stack is always 1 deep
|
---|
| 109 |
|
---|
| 110 | GLuint cur_zmin = *ptr++;
|
---|
| 111 | GLuint cur_zmax = *ptr++;
|
---|
| 112 |
|
---|
| 113 | if( cur_zmin < zmin )
|
---|
| 114 | {
|
---|
| 115 | zmin = cur_zmin;
|
---|
| 116 | hit = *ptr;
|
---|
| 117 | }
|
---|
| 118 | ptr++;
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | glMatrixMode(GL_PROJECTION);
|
---|
| 122 | glLoadIdentity(); // get rid of the pick matrix
|
---|
| 123 |
|
---|
| 124 | return hit;
|
---|
| 125 | }
|
---|