mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	started work on shaders.cpp
This commit is contained in:
		| @@ -157,7 +157,6 @@ bool cameraangle_on; | ||||
|  | ||||
| void setcameraangle(bool b) { | ||||
|   if(cameraangle_on != b) { | ||||
|     glMatrixMode(GL_PROJECTION); | ||||
|     cameraangle_on = b; | ||||
|     ld cam = vid.camera_angle * M_PI / 180; | ||||
|  | ||||
| @@ -170,24 +169,22 @@ void setcameraangle(bool b) { | ||||
|       0, -ss, cc, 0, | ||||
|       0, 0, 0, 1 | ||||
|       }; | ||||
|    | ||||
|     glMultMatrixf(yzspin); | ||||
|      | ||||
|     glhr::projection_multiply(glhr::as_glmatrix(yzspin)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| void start_projection(int ed) { | ||||
|   glMatrixMode(GL_PROJECTION); | ||||
|   glLoadIdentity(); | ||||
|    | ||||
|   glTranslatef((vid.xcenter*2.)/vid.xres - 1, 1 - (vid.ycenter*2.)/vid.yres, 0); | ||||
|   glhr::new_projection(); | ||||
|   glhr::projection_multiply(glhr::translate((vid.xcenter*2.)/vid.xres - 1, 1 - (vid.ycenter*2.)/vid.yres, 0)); | ||||
|  | ||||
|   if(ed) { | ||||
|     if(stereo::mode == stereo::sLR) {    | ||||
|       glTranslatef(ed * (stereo::eyewidth() - .5) * 4, 0, 0); | ||||
|       glScalef(2, 1, 1); | ||||
|     if(stereo::mode == stereo::sLR) { | ||||
|       glhr::projection_multiply(glhr::translate(ed * (stereo::eyewidth() - .5) * 4, 0, 0)); | ||||
|       glhr::projection_multiply(glhr::scale(2, 1, 1)); | ||||
|       } | ||||
|     else { | ||||
|       glTranslatef(-ed * stereo::eyewidth(), 0, 0); | ||||
|       glhr::projection_multiply(glhr::translate(-ed * stereo::eyewidth(), 0, 0)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| @@ -205,11 +202,8 @@ void stereo::set_projection(int ed) { | ||||
|       0, GLfloat(-2. / vid.yres), 0, 0,  | ||||
|       0, 0, GLfloat(.4 / stereo::scrdist), 0, | ||||
|       0, 0, 0, 1}; | ||||
|    | ||||
|     glMultMatrixf(ortho); | ||||
|  | ||||
|     glMatrixMode(GL_MODELVIEW); | ||||
|     glLoadIdentity(); | ||||
|        | ||||
|     glhr::projection_multiply(glhr::as_glmatrix(ortho)); | ||||
|     } | ||||
|   else if(pmodel) { | ||||
|  | ||||
| @@ -226,15 +220,12 @@ void stereo::set_projection(int ed) { | ||||
|       0, 0, -(hidepth+lowdepth)/(hidepth-lowdepth), -1, | ||||
|       0, 0, -2*lowdepth*hidepth/(hidepth-lowdepth), 0}; | ||||
|  | ||||
|     glMultMatrixf(frustum); | ||||
|     glhr::projection_multiply(glhr::as_glmatrix(frustum)); | ||||
|      | ||||
|     glMatrixMode(GL_MODELVIEW); | ||||
|     glLoadIdentity(); | ||||
|     if(ed) glhr::projection_multiply(glhr::translate(stereo::ipd * vid.radius * ed/2, 0, 0)); | ||||
|  | ||||
|     if(ed) glTranslatef(stereo::ipd * vid.radius * ed/2, 0, 0); | ||||
|  | ||||
|     glScalef(1, 1, -1); | ||||
|     glTranslatef(0, 0, stereo::scrdist); | ||||
|     glhr::projection_multiply(glhr::scale(1, 1, -1)); | ||||
|     glhr::projection_multiply(glhr::translate(0, 0, stereo::scrdist)); | ||||
|  | ||||
|     stereo::scrdist_text = 0; | ||||
|     } | ||||
| @@ -249,17 +240,14 @@ void stereo::set_projection(int ed) { | ||||
|       0, 0, -(hidepth+lowdepth)/(hidepth-lowdepth), -1, | ||||
|       0, 0, -2*lowdepth*hidepth/(hidepth-lowdepth), 0}; | ||||
|    | ||||
|     glMultMatrixf(frustum); | ||||
|  | ||||
|     glMatrixMode(GL_MODELVIEW); | ||||
|     glLoadIdentity(); | ||||
|     glhr::projection_multiply(glhr::as_glmatrix(frustum)); | ||||
|  | ||||
|     GLfloat sc = vid.radius / (vid.yres/2.); | ||||
|     GLfloat mat[16] = {sc,0,0,0, 0,-sc,0,0, 0,0,-1,0, 0,0, 0,1}; | ||||
|  | ||||
|     glMultMatrixf(mat); | ||||
|     glhr::projection_multiply(glhr::as_glmatrix(mat)); | ||||
|      | ||||
|     if(ed) glTranslatef(stereo::ipd*ed/2, 0, 0); | ||||
|     if(ed) glhr::projection_multiply(glhr::translate(stereo::ipd * ed/2, 0, 0)); | ||||
|    | ||||
|     stereo::scrdist_text = vid.yres * sc / 2; | ||||
|     } | ||||
| @@ -291,9 +279,6 @@ void stereo::set_viewport(int ed) { | ||||
| void setGLProjection(int col) { | ||||
|   DEBB(DF_GRAPH, (debugfile,"setGLProjection\n")); | ||||
|  | ||||
|   glMatrixMode(GL_PROJECTION); | ||||
|   glLoadIdentity(); | ||||
|    | ||||
|   unsigned char *c = (unsigned char*) (&col); | ||||
|   glClearColor(c[2] / 255.0, c[1] / 255.0, c[0]/255.0, 1); | ||||
|   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
| @@ -516,9 +501,8 @@ bool gl_print(int x, int y, int shift, int size, const char *s, int color, int a | ||||
|   glDisable(GL_LIGHTING); | ||||
|    | ||||
|   glEnable(GL_TEXTURE_2D); | ||||
|   glhr::be_textured(); | ||||
|  | ||||
|   glMatrixMode(GL_MODELVIEW); | ||||
|    | ||||
|   glcolor2((color << 8) | 0xFF); | ||||
|  | ||||
|   int tsize = 0; | ||||
| @@ -533,22 +517,8 @@ bool gl_print(int x, int y, int shift, int size, const char *s, int color, int a | ||||
|  | ||||
|   bool clicked = (mousex >= x && mousey <= y && mousex <= x+tsize && mousey >= y-ysiz); | ||||
|  | ||||
|   /* extern bool markcorner; | ||||
|   if(clicked && markcorner) { | ||||
|     markcorner = false; | ||||
|     int w = tsize, h = -ysiz; | ||||
|     displaystr(x, y, 1, 10, "X", 0xFFFFFF, 8); | ||||
|     displaystr(x+w, y, 1, 10, "X", 0xFFFFFF, 8); | ||||
|     displaystr(x, y+h, 1, 10, "X", 0xFFFFFF, 8); | ||||
|     displaystr(x+w, y+h, 1, 10, "X", 0xFFFFFF, 8); | ||||
|     markcorner = true; | ||||
|     } */ | ||||
|  | ||||
|   for(int i=0; s[i];) { | ||||
|    | ||||
|     // glListBase(f.list_base); | ||||
|     // glCallList(s[i]); // s[i]); | ||||
|      | ||||
|     int tabid = getnext(s,i); | ||||
|     float fx=f.tx[tabid]; | ||||
|     float fy=f.ty[tabid]; | ||||
| @@ -558,12 +528,10 @@ bool gl_print(int x, int y, int shift, int size, const char *s, int color, int a | ||||
|     GLERR("pre-print"); | ||||
|  | ||||
|     for(int ed = (stereo::active() && shift)?-1:0; ed<2; ed+=2) { | ||||
|       glPushMatrix(); | ||||
|       glTranslatef(x-ed*shift-vid.xcenter,y-vid.ycenter, stereo::scrdist_text); | ||||
|       glhr::set_modelview(glhr::translate(x-ed*shift-vid.xcenter,y-vid.ycenter, stereo::scrdist_text)); | ||||
|       stereo::set_mask(ed); | ||||
|       glBindTexture(GL_TEXTURE_2D, f.textures[tabid]); | ||||
|  | ||||
| #if 1 | ||||
|       tver[1] = tver[10] = -hi; | ||||
|       tver[6] = tver[9] = wi; | ||||
|       tver[12+4] = tver[12+7] = fy; | ||||
| @@ -573,30 +541,13 @@ bool gl_print(int x, int y, int shift, int size, const char *s, int color, int a | ||||
|       glTexCoordPointer(3, GL_FLOAT, 0, &tver[12]); | ||||
|       glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | ||||
|       glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| #else | ||||
|       glBegin(GL_QUADS); | ||||
|       glTexCoord2d(0,0); glVertex2f(0, -hi); | ||||
|       glTexCoord2d(0,fy); glVertex2f(0, 0); | ||||
|       glTexCoord2d(fx,fy); glVertex2f(wi, 0); | ||||
|       glTexCoord2d(fx,0); glVertex2f(wi, -hi); | ||||
|       glEnd(); | ||||
| #endif | ||||
|       glPopMatrix(); | ||||
|       } | ||||
|      | ||||
|     if(stereo::active() && shift) stereo::set_mask(0); | ||||
|      | ||||
|     GLERR("print"); | ||||
|      | ||||
|     // int tabid = s[i]; | ||||
|     x += wi; | ||||
|      | ||||
| /*   | ||||
|     printf("point %d,%d\n", x, y); | ||||
|     glBegin(GL_POINTS); | ||||
|     glVertex3f(rand() % 100 - rand() % 100, rand() % 100 - rand() % 100, 100); | ||||
|     glEnd(); */ | ||||
|  | ||||
|     x += wi;     | ||||
|     } | ||||
|   | ||||
|   glDisable(GL_TEXTURE_2D); | ||||
| @@ -943,6 +894,8 @@ void drawCircle(int x, int y, int size, int color) { | ||||
|   if(size < 0) size = -size; | ||||
|   #if CAP_GL | ||||
|   if(vid.usingGL) { | ||||
|     glhr::be_nontextured(); | ||||
|     glhr::set_modelview(glhr::id()); | ||||
|     qglcoords = 0; | ||||
|     glcolor2(color); | ||||
|     x -= vid.xcenter; y -= vid.ycenter; | ||||
| @@ -1029,11 +982,6 @@ hookset<void(renderbuffer*)> *hooks_hqshot; | ||||
| #if CAP_SDL | ||||
| void saveHighQualityShot(const char *fname, const char *caption, int fade) { | ||||
|  | ||||
| #if !CAP_SDLGFX | ||||
|   addMessage(XLAT("High quality shots not available on this platform")); | ||||
|   return; | ||||
| #endif | ||||
|  | ||||
|   int maxrange = getDistLimit() * 3/2; | ||||
|  | ||||
|   dynamicval<int> v3(sightrange, (cheater && sightrange < maxrange) ? maxrange : sightrange); | ||||
| @@ -1168,6 +1116,7 @@ void setvideomode() { | ||||
|       glDisable(GL_MULTISAMPLE); | ||||
|    | ||||
|     glViewport(0, 0, vid.xres, vid.yres); | ||||
|     glhr::init(); | ||||
|     resetGL(); | ||||
|     } | ||||
| #endif | ||||
|   | ||||
| @@ -22,6 +22,7 @@ | ||||
| #endif | ||||
|  | ||||
| #if IN_CU(0) | ||||
| #include "shaders.cpp" | ||||
| #include "util.cpp" | ||||
| #include "hyperpoint.cpp" | ||||
| #include "patterns.cpp" | ||||
|   | ||||
| @@ -2268,6 +2268,8 @@ void drawaura() { | ||||
| #endif | ||||
|  | ||||
| #if CAP_GL | ||||
|   glhr::be_nontextured(); | ||||
|   glhr::set_modelview(glhr::id()); | ||||
|   setcameraangle(true); | ||||
|    | ||||
|   glEnableClientState(GL_COLOR_ARRAY); | ||||
| @@ -2287,6 +2289,7 @@ void drawaura() { | ||||
|     facs[d] = .99999 +  .00001 * exp(dd); | ||||
|     } | ||||
|   facs[10] = 10; | ||||
|   cmul[1] = cmul[0]; | ||||
|  | ||||
|   for(int r=0; r<=AURA; r++) for(int z=0; z<11; z++) { | ||||
|     float rr = (M_PI * 2 * r) / AURA; | ||||
| @@ -2307,9 +2310,9 @@ void drawaura() { | ||||
|       int bz = (c == 3 || c == 2) ? z+1 : z; | ||||
|       glcoords[c][0] = cx[br][bz][0];  | ||||
|       glcoords[c][1] = cx[br][bz][1];    | ||||
|       coltab[c][0] = cx[br][bz][2];  | ||||
|       coltab[c][1] = cx[br][bz][3];  | ||||
|       coltab[c][2] = cx[br][bz][4];  | ||||
|       coltab[c][0] = min<float>(cx[br][bz][2], 1); | ||||
|       coltab[c][1] = min<float>(cx[br][bz][3], 1);  | ||||
|       coltab[c][2] = min<float>(cx[br][bz][4], 1);  | ||||
|       } | ||||
|        | ||||
|     glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | ||||
|   | ||||
							
								
								
									
										3
									
								
								init.cpp
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								init.cpp
									
									
									
									
									
								
							| @@ -17,6 +17,9 @@ | ||||
|  | ||||
| #define VER "10.3g" | ||||
| #define VERNUM 10307 | ||||
|  | ||||
| #define CAP_SHADER CAP_GL | ||||
|  | ||||
| #define VERNUM_HEX 0xA0A7 | ||||
|  | ||||
| #define GEN_M 0 | ||||
|   | ||||
							
								
								
									
										39
									
								
								polygons.cpp
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								polygons.cpp
									
									
									
									
									
								
							| @@ -312,7 +312,7 @@ void glapplymatrix(const transmatrix& V) { | ||||
|       mat[j+i] = -mat[j+i]; | ||||
|     } | ||||
|    | ||||
|   glMultMatrixf(mat); | ||||
|   glhr::set_modelview(glhr::as_glmatrix(mat)); | ||||
|   } | ||||
|  | ||||
| int tinfshift; | ||||
| @@ -321,10 +321,12 @@ void gldraw(int useV, const transmatrix& V, int ps, int pq, int col, int outline | ||||
|  | ||||
|   if(tinf) { | ||||
|     glEnable(GL_TEXTURE_2D); | ||||
|     glhr::be_textured(); | ||||
|     glBindTexture(GL_TEXTURE_2D, tinf->texture_id); | ||||
|     glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
|     glTexCoordPointer(3, GL_FLOAT, 0, &tinf->tvertices[tinfshift]); | ||||
|     } | ||||
|   else glhr::be_nontextured(); | ||||
|    | ||||
|   for(int ed = stereo::active() ? -1 : 0; ed<2; ed+=2) { | ||||
|     if(ed) stereo::set_projection(ed), stereo::set_viewport(ed); | ||||
| @@ -332,38 +334,11 @@ void gldraw(int useV, const transmatrix& V, int ps, int pq, int col, int outline | ||||
|     again: | ||||
|      | ||||
|     if(useV == 1) { | ||||
|       glMatrixMode(GL_MODELVIEW); | ||||
|       glPushMatrix(); | ||||
|       glapplymatrix(V); | ||||
|       } | ||||
|     else | ||||
|       glhr::set_modelview(glhr::id()); | ||||
|  | ||||
| /*       | ||||
|     if(useV == 2) { | ||||
|       glMatrixMode(GL_MODELVIEW); | ||||
|       glPushMatrix(); | ||||
|       GLfloat mat[16] = { | ||||
|         1, 0, 0, 0, | ||||
|         0, 1, 0, 0, | ||||
|         0, 0, 1, 0, | ||||
|         0, 0, 0, 1 | ||||
|         }; | ||||
|       // EYETODO mat[8] += ed * vid.eye; | ||||
|       glMultMatrixf(mat); | ||||
|       } | ||||
|        | ||||
|     if(useV == 3) { | ||||
|       glMatrixMode(GL_MODELVIEW); | ||||
|       glPushMatrix(); | ||||
|       GLfloat mat[16] = { | ||||
|         1, 0, 0, 0, | ||||
|         0, 1, 0, 0, | ||||
|         0, 0, 0, 0, | ||||
|         0, 0, stereo::scrdist, 1 | ||||
|         }; | ||||
|       // EYETODO mat[8] += ed * vid.eye; | ||||
|       glMultMatrixf(mat); | ||||
|       } */ | ||||
|        | ||||
|     if(draw) { | ||||
|       glEnable(GL_STENCIL_TEST); | ||||
|   | ||||
| @@ -386,7 +361,7 @@ void gldraw(int useV, const transmatrix& V, int ps, int pq, int col, int outline | ||||
|           }; | ||||
|         GLfloat *cur = currentvertices; | ||||
|         activateVertexArray(scr, 4); | ||||
|         if(useV) glPopMatrix(); | ||||
|         glhr::set_modelview(glhr::id()); | ||||
|         glDrawArrays(tinf ? GL_TRIANGLES : GL_TRIANGLE_FAN, 0, 4); | ||||
|         activateVertexArray(cur, 0); | ||||
|         draw = false; goto again; | ||||
| @@ -406,8 +381,6 @@ void gldraw(int useV, const transmatrix& V, int ps, int pq, int col, int outline | ||||
|       glcolor2(outline); | ||||
|       glDrawArrays(GL_LINE_STRIP, ps, pq); | ||||
|       } | ||||
|   | ||||
|     if(useV) glPopMatrix(); | ||||
|     } | ||||
|    | ||||
|   if(stereo::active()) stereo::set_projection(0), stereo::set_viewport(0), stereo::set_mask(0); | ||||
|   | ||||
							
								
								
									
										14
									
								
								rug.cpp
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								rug.cpp
									
									
									
									
									
								
							| @@ -1147,6 +1147,7 @@ void drawRugScene() { | ||||
|    | ||||
|   glDisable(GL_BLEND); | ||||
|   glEnable(GL_TEXTURE_2D); | ||||
|   glhr::be_textured(); | ||||
|   glEnable(GL_DEPTH_TEST); | ||||
|   glDepthFunc(GL_LESS); | ||||
|    | ||||
| @@ -1179,14 +1180,13 @@ void drawRugScene() { | ||||
|         0, GLfloat(vnear / sca / vid.yres), 0, 0, | ||||
|         0, 0, GLfloat(-(vnear+vfar)/(vfar-vnear)), -1, | ||||
|         0, 0, GLfloat(-2*vnear*vfar/(vfar-vnear)), 1}; | ||||
|       glMultMatrixf(frustum); | ||||
|       glhr::projection_multiply(glhr::as_glmatrix(frustum)); | ||||
|  | ||||
|       glMatrixMode(GL_MODELVIEW); | ||||
|       glLoadIdentity(); | ||||
|       if(!rug_perspective) glTranslatef(0, 0, -model_distance); | ||||
|       if(!rug_perspective)  | ||||
|         glhr::projection_multiply(glhr::translate(0, 0, -model_distance)); | ||||
|       if(ed) { | ||||
|         if(gwhere == gEuclid) | ||||
|           glTranslatef(stereo::ipd*ed/2, 0, 0); | ||||
|           glhr::projection_multiply(glhr::translate(stereo::ipd*ed/2, 0, 0)); | ||||
|         else { | ||||
|           use_precompute = true; | ||||
|           for(auto p: points) { | ||||
| @@ -1206,7 +1206,7 @@ void drawRugScene() { | ||||
|         0, GLfloat(1/yview), 0, 0,  | ||||
|         0, 0, GLfloat(.001), 0, | ||||
|         0, 0, 0, 1}; | ||||
|       glMultMatrixf(ortho); | ||||
|       glhr::projection_multiply(glhr::as_glmatrix(ortho)); | ||||
|       } | ||||
|     glColor4f(1.f, 1.f, 1.f, 1.f); | ||||
|    | ||||
| @@ -1221,6 +1221,8 @@ void drawRugScene() { | ||||
|       glFogf(GL_FOG_END, gwhere == gSphere ? 10 : 4); | ||||
|       } | ||||
|  | ||||
|     glhr::set_modelview(glhr::id()); | ||||
|  | ||||
|     for(int t=0; t<size(triangles); t++) | ||||
|       drawTriangle(triangles[t]); | ||||
|  | ||||
|   | ||||
							
								
								
									
										267
									
								
								shaders.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								shaders.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,267 @@ | ||||
| // gl matrices | ||||
| //------------- | ||||
|  | ||||
| // #undef CAP_SHADER | ||||
| // #define CAP_SHADER 0 | ||||
|  | ||||
| namespace glhr { | ||||
|  | ||||
| enum mode { gmColored, gmTextured, gmMAX}; | ||||
|  | ||||
| struct glmatrix { | ||||
|   GLfloat a[4][4]; | ||||
|   GLfloat* operator[] (int i) { return a[i]; } | ||||
|   GLfloat* as_array() { return a[0]; } | ||||
|   const GLfloat* as_array() const { return a[0]; } | ||||
|   }; | ||||
|  | ||||
| glmatrix operator * (glmatrix m1, glmatrix m2) { | ||||
|   glmatrix res; | ||||
|   for(int i=0; i<4; i++) | ||||
|   for(int j=0; j<4; j++) { | ||||
|     res[i][j] = 0; | ||||
|     for(int k=0; k<4; k++) | ||||
|       res[i][j] += m1[i][k] * m2[k][j]; | ||||
|     } | ||||
|   return res; | ||||
|   } | ||||
|  | ||||
| glmatrix id() { | ||||
|   glmatrix M; | ||||
|   for(int i=0; i<4; i++) | ||||
|   for(int j=0; j<4; j++) | ||||
|     M[i][j] = (i == j); | ||||
|   return M; | ||||
|   } | ||||
|  | ||||
| glmatrix scale(ld x, ld y, ld z) { | ||||
|   glmatrix tmp; | ||||
|   for(int i=0; i<4; i++) | ||||
|   for(int j=0; j<4; j++) | ||||
|     tmp[i][j] = (i==j); | ||||
|   tmp[0][0] = x; | ||||
|   tmp[1][1] = y; | ||||
|   tmp[2][2] = z; | ||||
|   return tmp; | ||||
|   } | ||||
|  | ||||
| glmatrix translate(ld x, ld y, ld z) { | ||||
|   glmatrix tmp; | ||||
|   for(int i=0; i<4; i++) | ||||
|   for(int j=0; j<4; j++) | ||||
|     tmp[i][j] = (i==j); | ||||
|   tmp[3][0] = x; | ||||
|   tmp[3][1] = y; | ||||
|   tmp[3][2] = z; | ||||
|   return tmp; | ||||
|   } | ||||
|  | ||||
| glmatrix& as_glmatrix(GLfloat o[16]) { | ||||
|   glmatrix& tmp = (glmatrix&) (o[0]); | ||||
|   return tmp; | ||||
|   } | ||||
|  | ||||
| // ** legacy ** | ||||
|  | ||||
| #if !CAP_SHADER | ||||
|  | ||||
| void new_projection() { | ||||
|   glMatrixMode(GL_MODELVIEW); | ||||
|   glLoadIdentity(); | ||||
|   glMatrixMode(GL_PROJECTION); | ||||
|   glLoadIdentity(); | ||||
|   } | ||||
|  | ||||
| void projection_multiply(const glmatrix& m) { | ||||
|   glMultMatrixf(m.as_array()); | ||||
|   } | ||||
|  | ||||
| void set_modelview(const glmatrix& m) { | ||||
|   glMatrixMode(GL_MODELVIEW); | ||||
|   glLoadMatrixf(m.as_array()); | ||||
|   } | ||||
|  | ||||
| void be_nontextured() { } | ||||
| void be_textured() { } | ||||
| void init() { } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| // /* shaders */ | ||||
|  | ||||
| #if CAP_SHADER | ||||
|  | ||||
| glmatrix projection; | ||||
|  | ||||
| void new_projection() { | ||||
|   projection = id(); | ||||
|   } | ||||
|  | ||||
| void projection_multiply(const glmatrix& m) { | ||||
|   projection = m * projection;   | ||||
|   } | ||||
|  | ||||
| #define glMatrixMode DISABLED | ||||
| #define glLoadIdentity DISABLED | ||||
| #define glMultMatrixf DISABLED | ||||
| #define glScalef DISABLED | ||||
| #define glTranslatef DISABLED | ||||
| #define glPushMatrix DISABLED | ||||
| #define glPopMatrix DISABLED | ||||
|  | ||||
| void init(); | ||||
|  | ||||
| int compileShader(int type, const char* s) { | ||||
|   GLint status; | ||||
|    | ||||
|   GLint shader = glCreateShader(type); | ||||
|   glShaderSource(shader, 1, &s, NULL); | ||||
|   glCompileShader(shader); | ||||
|    | ||||
|   GLint logLength; | ||||
|   glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); | ||||
|   if (logLength > 0) { | ||||
|     char log[logLength]; | ||||
|     glGetShaderInfoLog(shader, logLength, &logLength, log); | ||||
|     if(logLength > 0) | ||||
|       printf("compiler log (%d): '%s'\n", logLength, log); | ||||
|     } | ||||
|    | ||||
|   glGetShaderiv(shader, GL_COMPILE_STATUS, &status); | ||||
|   if (status == 0) { | ||||
|     glDeleteShader(shader); | ||||
|     printf("failed to compile shader\n"); | ||||
|     shader = 0; | ||||
|     } | ||||
|    | ||||
|   return shader; | ||||
|   } | ||||
|  | ||||
| // https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php | ||||
|  | ||||
| struct GLprogram *current = NULL; | ||||
|  | ||||
| enum { | ||||
|   UNIFORM_MODELVIEWPROJECTION_MATRIX, | ||||
|   UNIFORM_NORMAL_MATRIX, | ||||
|   NUM_UNIFORMS | ||||
|   }; | ||||
|  | ||||
| struct GLprogram { | ||||
|   GLuint _program; | ||||
|   GLuint vertShader, fragShader; | ||||
|  | ||||
|   GLint uniforms[NUM_UNIFORMS]; | ||||
|    | ||||
|   GLprogram(string vsh, string fsh) { | ||||
|     _program = glCreateProgram(); | ||||
|     printf("creating program %d\n", _program); | ||||
|     vertShader = compileShader(GL_VERTEX_SHADER, vsh.c_str()); | ||||
|     fragShader = compileShader(GL_FRAGMENT_SHADER, fsh.c_str()); | ||||
|    | ||||
|     // Attach vertex shader to program. | ||||
|     glAttachShader(_program, vertShader); | ||||
|      | ||||
|     // Attach fragment shader to program. | ||||
|     glAttachShader(_program, fragShader); | ||||
|      | ||||
|     GLint status; | ||||
|     glLinkProgram(_program); | ||||
|        | ||||
|     GLint logLength; | ||||
|     glGetProgramiv(_program, GL_INFO_LOG_LENGTH, &logLength); | ||||
|     if (logLength > 0) { | ||||
|       char log[logLength]; | ||||
|       glGetProgramInfoLog(_program, logLength, &logLength, log); | ||||
|       if(logLength > 0) | ||||
|         printf("linking log (%d): %s\n", logLength, log); | ||||
|       } | ||||
|       | ||||
|     glGetProgramiv(_program, GL_LINK_STATUS, &status); | ||||
|     if (status == 0) { | ||||
|       printf("failed to link shader\n"); | ||||
|       exit(1); | ||||
|       } | ||||
|      | ||||
|     // glBindAttribLocation(_program, GLKVertexAttribPosition, "position"); ?? | ||||
|     // glBindAttribLocation(_program, GLKVertexAttribNormal, "normal"); ?? | ||||
|    | ||||
|     uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix"); | ||||
|     uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, "normalMatrix");     | ||||
|     printf("uniforms: %d %d\n", uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], uniforms[UNIFORM_NORMAL_MATRIX]); | ||||
|     } | ||||
|    | ||||
|   ~GLprogram() { | ||||
|     glDeleteProgram(_program); | ||||
|     if(vertShader) glDeleteShader(vertShader), vertShader = 0; | ||||
|     if(fragShader) glDeleteShader(fragShader), fragShader = 0; | ||||
|     current = NULL; | ||||
|     } | ||||
|    | ||||
|   void enable() { | ||||
|     if(this != current) { | ||||
|       glUseProgram(_program);     | ||||
|       current = this; | ||||
|       } | ||||
|     } | ||||
|    | ||||
|   }; | ||||
|  | ||||
| GLprogram *textured, *nontextured; | ||||
|  | ||||
| void init() { | ||||
|   projection = id(); | ||||
|      | ||||
|   for(int i=0; i<2; i++) { | ||||
|     auto texture_only = [=] (string s) -> string { if(i) return s; else return ""; }; | ||||
|     auto not_texture_only = [=] (string s) -> string { if(!i) return s; else return ""; }; | ||||
|     | ||||
|     (i==1?textured:nontextured) = new GLprogram( | ||||
|       // "attribute vec4 position;" | ||||
|       // "attribute vec3 normal;" | ||||
|        | ||||
|       "varying vec4 vColor;" | ||||
|       + texture_only( "varying vec2 vTexCoord;" ) + | ||||
|        | ||||
|       "uniform mat4 modelViewProjectionMatrix;" | ||||
|       "uniform mat3 normalMatrix;" | ||||
|        | ||||
|       "void main() {" | ||||
|   //      "vec3 eyeNormal = normalize(normalMatrix * normal);" | ||||
|   //      "vec3 lightPosition = vec3(0.0, 0.0, 1.0);" | ||||
|   //      "vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0);" | ||||
|            | ||||
|   //      "float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));" | ||||
|                         | ||||
|   //      "vColor = diffuseColor * nDotVP;" | ||||
|         + texture_only("vTexCoord = gl_MultiTexCoord0.xy;") + | ||||
|         "vColor = gl_Color;" | ||||
|            | ||||
|         "gl_Position = modelViewProjectionMatrix * gl_Vertex;" | ||||
|         "}", | ||||
|    | ||||
|       "uniform sampler2D myTexture;" | ||||
|       "varying vec4 vColor;" | ||||
|       + texture_only( "varying vec2 vTexCoord;" ) + | ||||
|       "void main() {" | ||||
|       + texture_only("  gl_FragColor = vColor * texture2D(myTexture, vTexCoord);") | ||||
|       + not_texture_only("  gl_FragColor = vColor;") + | ||||
|       "  }" | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|   nontextured->enable(); | ||||
|   } | ||||
|  | ||||
| void set_modelview(const glmatrix& modelview) { | ||||
|   glmatrix mvp = modelview * projection; | ||||
|   glUniformMatrix4fv(current->uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, mvp.as_array()); | ||||
|   // glmatrix nm = modelview; | ||||
|   // glUniformMatrix3fv(current->uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, nm[0]); | ||||
|   } | ||||
|  | ||||
| void be_nontextured() { nontextured->enable(); } | ||||
| void be_textured() { textured->enable(); } | ||||
|  | ||||
| #endif | ||||
| } | ||||
| @@ -462,12 +462,10 @@ void saveFullTexture() { | ||||
| bool newmove = false; | ||||
|  | ||||
| void drawRawTexture() { | ||||
|   glDisable(GL_LIGHTING);   | ||||
|   glEnable(GL_TEXTURE_2D); | ||||
|   glMatrixMode(GL_MODELVIEW); | ||||
|   glhr::be_textured(); | ||||
|   glcolor2(0xFFFFFF20); | ||||
|   glPushMatrix(); | ||||
|   glTranslatef(0, 0, stereo::scrdist); | ||||
|   glhr::set_modelview(glhr::translate(0, 0, stereo::scrdist)); | ||||
|   glBindTexture(GL_TEXTURE_2D, textureid); | ||||
|   vector<GLfloat> tver, sver; | ||||
|   for(int i=0; i<4; i++) { | ||||
| @@ -489,8 +487,7 @@ void drawRawTexture() { | ||||
|   glTexCoordPointer(3, GL_FLOAT, 0, &tver[0]); | ||||
|   glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | ||||
|   glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
|   glPopMatrix();  | ||||
|   glDisable(GL_TEXTURE_2D);     | ||||
|   glDisable(GL_TEXTURE_2D); | ||||
|   } | ||||
|  | ||||
| struct magicmapper_point { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue