| version 1.29 | | version 1.30 |
|---|
| | |
| #ifdef GL_SGIS_multitexture | | #ifdef GL_SGIS_multitexture |
| int ogl_sgis_multitexture_ok=0; | | int ogl_sgis_multitexture_ok=0; |
| #endif | | #endif |
| | | int ogl_nv_texture_env_combine4_ok=0; |
| | | |
| int sphereh=0; | | int sphereh=0; |
| int cross_lh[2]={0,0}; | | int cross_lh[2]={0,0}; |
| | |
| t->handle=0; | | t->handle=0; |
| t->internalformat=ogl_rgba_format; | | t->internalformat=ogl_rgba_format; |
| t->format=GL_RGBA; | | t->format=GL_RGBA; |
| t->wrapstate=-1; | | t->wrapstate[0]=-1; |
| | | t->wrapstate[1]=-1; |
| t->w=t->h=0; | | t->w=t->h=0; |
| ogl_init_texture_stats(t); | | ogl_init_texture_stats(t); |
| } | | } |
| | |
| glDeleteTextures( 1, &ogl_texture_list[i].handle ); | | glDeleteTextures( 1, &ogl_texture_list[i].handle ); |
| ogl_texture_list[i].handle=0; | | ogl_texture_list[i].handle=0; |
| } | | } |
| ogl_texture_list[i].wrapstate=-1; | | ogl_texture_list[i].wrapstate[0]=-1; |
| | | ogl_texture_list[i].wrapstate[1]=-1; |
| } | | } |
| } | | } |
| void ogl_vivify_texture_list_internal(void){ | | void ogl_vivify_texture_list_internal(void){ |
| | |
| } | | } |
| //gltexture MUST be bound first | | //gltexture MUST be bound first |
| void ogl_texwrap(ogl_texture *gltexture,int state){ | | void ogl_texwrap(ogl_texture *gltexture,int state){ |
| if (gltexture->wrapstate!=state || gltexture->numrend<1){ | | if (gltexture->wrapstate[active_texture_unit]!=state || gltexture->numrend<1){ |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, state); | | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, state); |
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, state); | | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, state); |
| gltexture->wrapstate=state; | | gltexture->wrapstate[active_texture_unit]=state; |
| } | | } |
| } | | } |
| | | |
| | |
| } | | } |
| return 0; | | return 0; |
| } | | } |
| bool g3_draw_tmap_2(int nv,g3s_point **pointlist,g3s_uvl *uvl_list,grs_bitmap *bmbot,grs_bitmap *bm,int orient) | | |
| { | | |
| #if (defined(GL_ARB_multitexture) || defined(GL_SGIS_multitexture)) | | |
| if (ogl_arb_multitexture_ok || ogl_sgis_multitexture_ok){ | | |
| int c; | | |
| float l,u1,v1; | | |
| | | |
| r_tpolyc+=2; | | int active_texture_unit=0; |
| /* if (bm->bm_w !=64||bm->bm_h!=64) | | void ogl_setActiveTexture(int t){ |
| printf("g3_draw_tmap w %i h %i\n",bm->bm_w,bm->bm_h);*/ | | |
| if (ogl_arb_multitexture_ok){ | | if (ogl_arb_multitexture_ok){ |
| #ifdef GL_ARB_multitexture | | #ifdef GL_ARB_multitexture |
| | | if (t==0) |
| glActiveTextureARB(GL_TEXTURE0_ARB); | | glActiveTextureARB(GL_TEXTURE0_ARB); |
| | | else |
| | | glActiveTextureARB(GL_TEXTURE1_ARB); |
| #endif | | #endif |
| }else if (ogl_sgis_multitexture_ok){ | | }else if (ogl_sgis_multitexture_ok){ |
| #ifdef GL_SGIS_multitexture | | #ifdef GL_SGIS_multitexture |
| | | if (t==0) |
| glSelectTextureSGIS(GL_TEXTURE0_SGIS); | | glSelectTextureSGIS(GL_TEXTURE0_SGIS); |
| | | else |
| | | glSelectTextureSGIS(GL_TEXTURE1_SGIS); |
| #endif | | #endif |
| } | | } |
| ogl_bindbmtex(bmbot); | | active_texture_unit=t; |
| OGL_ENABLE(TEXTURE_2D); | | } |
| glEnable(GL_TEXTURE_2D); | | void ogl_MultiTexCoord2f(int t, float u, float v){ |
| ogl_texwrap(bmbot->gltexture,GL_REPEAT); | | |
| glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | | |
| glEnable(GL_BLEND); | | |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | | |
| | | |
| if (ogl_arb_multitexture_ok){ | | if (ogl_arb_multitexture_ok){ |
| #ifdef GL_ARB_multitexture | | #ifdef GL_ARB_multitexture |
| glActiveTextureARB(GL_TEXTURE1_ARB); | | if (t==0) |
| | | glMultiTexCoord2fARB(GL_TEXTURE0_ARB,u,v); |
| | | else |
| | | glMultiTexCoord2fARB(GL_TEXTURE1_ARB,u,v); |
| #endif | | #endif |
| }else if (ogl_sgis_multitexture_ok){ | | }else if (ogl_sgis_multitexture_ok){ |
| #ifdef GL_SGIS_multitexture | | #ifdef GL_SGIS_multitexture |
| glSelectTextureSGIS(GL_TEXTURE1_SGIS); | | if (t==0) |
| | | glMultiTexCoord2fSGIS(GL_TEXTURE0_SGIS,u,v); |
| | | else |
| | | glMultiTexCoord2fSGIS(GL_TEXTURE1_SGIS,u,v); |
| #endif | | #endif |
| } | | } |
| ogl_bindbmtex(bm); | | } |
| // OGL_ENABLE(TEXTURE_2D); | | bool g3_draw_tmap_2(int nv,g3s_point **pointlist,g3s_uvl *uvl_list,grs_bitmap *bmbot,grs_bitmap *bm,int orient) |
| | | { |
| | | #if (defined(GL_NV_texture_env_combine4) && (defined(GL_ARB_multitexture) || defined(GL_SGIS_multitexture))) |
| | | if (ogl_nv_texture_env_combine4_ok && (ogl_arb_multitexture_ok || ogl_sgis_multitexture_ok)){ |
| | | int c; |
| | | float l,u1,v1; |
| | | |
| | | if (tmap_drawer_ptr!=draw_tmap) |
| | | Error("WTFF\n"); |
| | | |
| | | r_tpolyc+=2; |
| | | |
| | | // ogl_setActiveTexture(0); |
| | | OGL_ENABLE(TEXTURE_2D); |
| | | ogl_bindbmtex(bmbot); |
| | | ogl_texwrap(bmbot->gltexture,GL_REPEAT); |
| | | //GL_MODULATE is fine for texture 0 |
| | | |
| | | ogl_setActiveTexture(1); |
| glEnable(GL_TEXTURE_2D); | | glEnable(GL_TEXTURE_2D); |
| | | ogl_bindbmtex(bm); |
| ogl_texwrap(bm->gltexture,GL_REPEAT); | | ogl_texwrap(bm->gltexture,GL_REPEAT); |
| glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | | |
| | | |
| glEnable(GL_BLEND); | | //GL_DECAL works sorta ok but the top texture is fullbright. |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | | //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); |
| | | |
| | | //http://oss.sgi.com/projects/ogl-sample/registry/NV/texture_env_combine4.txt |
| | | //only GL_NV_texture_env_combine4 lets us do what we need: |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); |
| | | |
| | | //multiply top texture by color(vertex lighting) and add bottom texture(where alpha says to) |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD); |
| | | |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_PRIMARY_COLOR_EXT); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, GL_TEXTURE); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_NV, GL_PREVIOUS_EXT); |
| | | |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_SRC_COLOR); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_ONE_MINUS_SRC_ALPHA); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_NV, GL_SRC_COLOR); |
| | | |
| | | //add up alpha channels |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_ADD); |
| | | |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_TEXTURE); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, GL_ZERO); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_EXT, GL_PREVIOUS_EXT); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_NV, GL_ZERO); |
| | | |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, GL_SRC_ALPHA); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, GL_ONE_MINUS_SRC_ALPHA); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_EXT, GL_SRC_ALPHA); |
| | | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_NV, GL_ONE_MINUS_SRC_ALPHA); |
| | | |
| | | //GL_ARB_texture_env_combine comes close, but doesn't quite make it. |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); |
| | | |
| | | ////this gives effect like GL_DECAL: |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE); |
| | | |
| | | |
| | | //this properly shades the top texture, but the bottom texture doesn't get through. |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR_ARB); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); |
| | | |
| | | |
| | | //add up alpha |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_ADD); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); |
| | | //glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_PREVIOUS_ARB); |
| | | |
| | | |
| glBegin(GL_TRIANGLE_FAN); | | glBegin(GL_TRIANGLE_FAN); |
| for (c=0;c<nv;c++){ | | for (c=0;c<nv;c++){ |
| | |
| if (bm->bm_flags&BM_FLAG_NO_LIGHTING){ | | if (bm->bm_flags&BM_FLAG_NO_LIGHTING){ |
| l=1.0; | | l=1.0; |
| }else{ | | }else{ |
| //l=f2fl(uvl_list[c].l)+gr_palette_gamma/63.0; | | |
| l=f2fl(uvl_list[c].l); | | l=f2fl(uvl_list[c].l); |
| } | | } |
| glColor3f(l,l,l); | | glColor3f(l,l,l); |
| // glTexCoord2f(f2glf(uvl_list[c].u),f2glf(uvl_list[c].v)); | | ogl_MultiTexCoord2f(0,f2glf(uvl_list[c].u),f2glf(uvl_list[c].v)); |
| if (ogl_arb_multitexture_ok){ | | ogl_MultiTexCoord2f(1,u1,v1); |
| #ifdef GL_ARB_multitexture | | |
| glMultiTexCoord2fARB(GL_TEXTURE0_ARB,f2glf(uvl_list[c].u),f2glf(uvl_list[c].v)); | | |
| #endif | | |
| }else if (ogl_sgis_multitexture_ok){ | | |
| #ifdef GL_SGIS_multitexture | | |
| glMultiTexCoord2fSGIS(GL_TEXTURE0_SGIS,f2glf(uvl_list[c].u),f2glf(uvl_list[c].v)); | | |
| #endif | | |
| } | | |
| if (ogl_arb_multitexture_ok){ | | |
| #ifdef GL_ARB_multitexture | | |
| glMultiTexCoord2fARB(GL_TEXTURE1_ARB,u1,v1); | | |
| #endif | | |
| }else if (ogl_sgis_multitexture_ok){ | | |
| #ifdef GL_SGIS_multitexture | | |
| glMultiTexCoord2fSGIS(GL_TEXTURE1_SGIS,u1,v1); | | |
| #endif | | |
| } | | |
| //glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),f2glf(pointlist[c]->p3_vec.z)); | | //glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),f2glf(pointlist[c]->p3_vec.z)); |
| //glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),f2glf(pointlist[c]->p3_vec.z)); | | //glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),f2glf(pointlist[c]->p3_vec.z)); |
| glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),-f2glf(pointlist[c]->p3_vec.z)); | | glVertex3f(f2glf(pointlist[c]->p3_vec.x),f2glf(pointlist[c]->p3_vec.y),-f2glf(pointlist[c]->p3_vec.z)); |
| } | | } |
| glEnd(); | | glEnd(); |
| /* if (ogl_arb_multitexture_ok){ | | //ogl_setActiveTexture(1);//still the active texture |
| #ifdef GL_ARB_multitexture | | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |
| glActiveTextureARB(GL_TEXTURE1_ARB); | | |
| #endif | | |
| }else if (ogl_sgis_multitexture_ok){ | | |
| #ifdef GL_SGIS_multitexture | | |
| glSelectTextureSGIS(GL_TEXTURE1_SGIS); | | |
| #endif | | |
| } | | |
| // OGL_ENABLE(TEXTURE_2D);*/ | | |
| glDisable(GL_TEXTURE_2D); | | glDisable(GL_TEXTURE_2D); |
| if (ogl_arb_multitexture_ok){ | | ogl_setActiveTexture(0); |
| #ifdef GL_ARB_multitexture | | |
| glActiveTextureARB(GL_TEXTURE0_ARB); | | |
| #endif | | |
| }else if (ogl_sgis_multitexture_ok){ | | |
| #ifdef GL_SGIS_multitexture | | |
| glSelectTextureSGIS(GL_TEXTURE0_SGIS); | | |
| #endif | | |
| } | | |
| }else | | }else |
| #endif | | #endif |
| { | | { |