Difference for arch/ogl/ogl.c from version 1.11 to 1.12


version 1.11 version 1.12
Line 22
 
Line 22
 #include "powerup.h"  #include "powerup.h"
 #include "polyobj.h"  #include "polyobj.h"
   
   unsigned char *ogl_pal=gr_palette;
   
 int GL_texmagfilt=GL_NEAREST;  int GL_texmagfilt=GL_NEAREST;
 int GL_texminfilt=GL_NEAREST;  int GL_texminfilt=GL_NEAREST;
Line 165
 
Line 166
  mprintf((0,"finished caching\n"));   mprintf((0,"finished caching\n"));
 }  }
   
 int r_polyc,r_tpolyc,r_bitmapc,r_ubitmapc;  int r_polyc,r_tpolyc,r_bitmapc,r_ubitmapc,r_ubitbltc,r_upixelc;
 int r_texcount=0;  int r_texcount=0;
 #define f2glf(x) (f2fl(x))  #define f2glf(x) (f2fl(x))
 /*  
 bool g3_draw_line(g3s_point *p0,g3s_point *p1)  bool g3_draw_line(g3s_point *p0,g3s_point *p1)
 {  {
  int c;   int c;
   
  if (p0->p3_codes & p1->p3_codes)  
  return 0;  
    
 // r_polyc++;  
  c=grd_curcanv->cv_color;   c=grd_curcanv->cv_color;
    OGL_DISABLE(GL_TEXTURE_2D);
  glColor3f(PAL2Tr(c),PAL2Tg(c),PAL2Tb(c));   glColor3f(PAL2Tr(c),PAL2Tg(c),PAL2Tb(c));
  glBegin(GL_LINES);   glBegin(GL_LINES);
  glVertex2f(p0->p3_sx/(float)grd_curscreen->sc_w,p0->p3_sy/(float)grd_curscreen->sc_h);   glVertex3f(f2glf(p0->p3_vec.x),f2glf(p0->p3_vec.y),-f2glf(p0->p3_vec.z));
  glVertex2f(p1->p3_sx/(float)grd_curscreen->sc_w,p1->p3_sy/(float)grd_curscreen->sc_h);   glVertex3f(f2glf(p1->p3_vec.x),f2glf(p1->p3_vec.y),-f2glf(p1->p3_vec.z));
  glEnd();   glEnd();
  return 1;   return 1;
 }  }
 */  
 /*  
 int g3_draw_sphere(g3s_point *pnt,fix rad){  int g3_draw_sphere(g3s_point *pnt,fix rad){
  if (! (pnt->p3_codes & CC_BEHIND)) {   int c;
  if (! (pnt->p3_flags & PF_PROJECTED))   c=grd_curcanv->cv_color;
  g3_project_point(pnt);   OGL_DISABLE(GL_TEXTURE_2D);
  }   glPointSize(f2glf(rad));
    glColor3f(CPAL2Tr(c),CPAL2Tg(c),CPAL2Tb(c));
    glBegin(GL_POINTS);
    glVertex3f(f2glf(pnt->p3_vec.x),f2glf(pnt->p3_vec.y),-f2glf(pnt->p3_vec.z));
    glEnd();
  return 0;   return 0;
   
 }*/  }
   
 bool g3_draw_poly(int nv,g3s_point **pointlist)  bool g3_draw_poly(int nv,g3s_point **pointlist)
 {  {
  int c;   int c;
Line 218
 
Line 219
  r_tpolyc++;   r_tpolyc++;
 /* if (bm->bm_w !=64||bm->bm_h!=64)  /* if (bm->bm_w !=64||bm->bm_h!=64)
  printf("g3_draw_tmap w %i h %i\n",bm->bm_w,bm->bm_h);*/   printf("g3_draw_tmap w %i h %i\n",bm->bm_w,bm->bm_h);*/
  //glEnable(GL_TEXTURE_2D);  
  OGL_ENABLE(GL_TEXTURE_2D);   OGL_ENABLE(GL_TEXTURE_2D);
  if (bm->gltexture<0)   if (bm->gltexture<0)
  ogl_loadbmtexture(bm);   ogl_loadbmtexture(bm);
  glBindTexture(GL_TEXTURE_2D, bm->gltexture);   glBindTexture(GL_TEXTURE_2D, bm->gltexture);
 // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
 // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
  OGL_TEXREPEAT();   OGL_TEXREPEAT();
  glBegin(GL_TRIANGLE_FAN);   glBegin(GL_TRIANGLE_FAN);
  for (c=0;c<nv;c++){   for (c=0;c<nv;c++){
Line 241
 
Line 239
  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();
 // glDisable(GL_TEXTURE_2D);  
  return 0;   return 0;
 }  }
   
Line 255
 
Line 252
 // printf("g3_draw_bitmap: %f,%f,%f - ",f2glf(pos->x),f2glf(pos->y),-f2glf(pos->z));  // printf("g3_draw_bitmap: %f,%f,%f - ",f2glf(pos->x),f2glf(pos->y),-f2glf(pos->z));
 // printf("(%f,%f,%f) ",f2glf(View_position.x),f2glf(View_position.y),-f2glf(View_position.z));  // printf("(%f,%f,%f) ",f2glf(View_position.x),f2glf(View_position.y),-f2glf(View_position.z));
   
  //glEnable(GL_TEXTURE_2D);  
  OGL_ENABLE(GL_TEXTURE_2D);   OGL_ENABLE(GL_TEXTURE_2D);
  if (bm->gltexture<0)   if (bm->gltexture<0)
  ogl_loadbmtexture(bm);   ogl_loadbmtexture(bm);
  glBindTexture(GL_TEXTURE_2D, bm->gltexture);   glBindTexture(GL_TEXTURE_2D, bm->gltexture);
    
  //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);  
  //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);  
  OGL_TEXCLAMP();   OGL_TEXCLAMP();
   
  glBegin(GL_QUADS);   glBegin(GL_QUADS);
Line 304
 
Line 298
 // printf("%f,%f,%f ",f2glf(v1.x),f2glf(v1.y),-f2glf(v1.z));  // printf("%f,%f,%f ",f2glf(v1.x),f2glf(v1.y),-f2glf(v1.z));
  }   }
  glEnd();   glEnd();
 // glDisable(GL_TEXTURE_2D);  
 // printf("\n");  // printf("\n");
   
  return 0;   return 0;
 }  }
 bool ogl_ubitmapm_c(int x, int y,grs_bitmap *bm,int c)  bool ogl_ubitmapm_c(int x, int y,grs_bitmap *bm,int c)
 {  {
  GLfloat xo,yo,xs,ys;   GLfloat xo,yo,xf,yf;
  r_ubitmapc++;   r_ubitmapc++;
     x+=grd_curcanv->cv_bitmap.bm_x;
    y+=grd_curcanv->cv_bitmap.bm_y;
  xo=x/(float)last_width;   xo=x/(float)last_width;
  xs=bm->bm_w/(float)last_width;   xf=(bm->bm_w+x)/(float)last_width;
  yo=1.0-y/(float)last_height;   yo=1.0-y/(float)last_height;
  ys=bm->bm_h/(float)last_height;   yf=1.0-(bm->bm_h+y)/(float)last_height;
 // printf("g3_draw_bitmap: %f,%f,%f - ",f2glf(pos->x),f2glf(pos->y),-f2glf(pos->z));  // printf("g3_draw_bitmap: %f,%f,%f - ",f2glf(pos->x),f2glf(pos->y),-f2glf(pos->z));
 // printf("(%f,%f,%f) ",f2glf(View_position.x),f2glf(View_position.y),-f2glf(View_position.z));  // printf("(%f,%f,%f) ",f2glf(View_position.x),f2glf(View_position.y),-f2glf(View_position.z));
   
Line 325
 
Line 319
  glAlphaFunc(GL_GREATER,0.0);*/   glAlphaFunc(GL_GREATER,0.0);*/
   
  OGL_ENABLE(GL_TEXTURE_2D);   OGL_ENABLE(GL_TEXTURE_2D);
  //glEnable(GL_TEXTURE_2D);  
  if (bm->gltexture<0)   if (bm->gltexture<0)
  ogl_loadbmtexture(bm);   ogl_loadbmtexture(bm);
  glBindTexture(GL_TEXTURE_2D, bm->gltexture);   glBindTexture(GL_TEXTURE_2D, bm->gltexture);
    
 // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);  
 // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);  
  OGL_TEXCLAMP();   OGL_TEXCLAMP();
   
  glBegin(GL_QUADS);   glBegin(GL_QUADS);
  if (c<0)   if (c<0)
  glColor3f(1.0,1.0,1.0);   glColor3f(1.0,1.0,1.0);
  else   else
  glColor3f(PAL2Tr(c),PAL2Tg(c),PAL2Tb(c));   glColor3f(CPAL2Tr(c),CPAL2Tg(c),CPAL2Tb(c));
  glTexCoord2f(0.0, 0.0); glVertex2f(xo, yo);   glTexCoord2f(0.0, 0.0); glVertex2f(xo, yo);
  glTexCoord2f(bm->glu, 0.0); glVertex2f(xo+xs, yo);   glTexCoord2f(bm->glu, 0.0); glVertex2f(xf, yo);
  glTexCoord2f(bm->glu, bm->glv); glVertex2f(xo+xs, yo-ys);   glTexCoord2f(bm->glu, bm->glv); glVertex2f(xf, yf);
  glTexCoord2f(0.0, bm->glv); glVertex2f(xo, yo-ys);   glTexCoord2f(0.0, bm->glv); glVertex2f(xo, yf);
  glEnd();   glEnd();
 // glDisable(GL_TEXTURE_2D);  
 // glDisable(GL_ALPHA_TEST);  // glDisable(GL_ALPHA_TEST);
    
  return 0;   return 0;
Line 352
 
Line 342
 bool ogl_ubitmapm(int x, int y,grs_bitmap *bm){  bool ogl_ubitmapm(int x, int y,grs_bitmap *bm){
  return ogl_ubitmapm_c(x,y,bm,-1);   return ogl_ubitmapm_c(x,y,bm,-1);
 }  }
   #if 0
   //also upsidedown, currently.
   bool ogl_ubitblt_notrans(int w,int h,int dx,int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
   {
    GLfloat xo,yo,xs,ys;
   
    xo=dx/(float)last_width;
    xs=w/(float)last_width;
    //yo=1.0-dy/(float)last_height;
    yo=dy/(float)last_height;
    ys=h/(float)last_height;
   
   // OGL_ENABLE(GL_TEXTURE_2D);
   
    OGL_DISABLE(GL_TEXTURE_2D);
    glRasterPos2f(xo,yo);
    ogl_filltexbuf(src->bm_data,texbuf,src->bm_w,w,h,sx,sy,w,h);
    glDrawPixels(w,h,GL_RGBA,GL_UNSIGNED_BYTE,texbuf);
    glRasterPos2f(0,0);
   
    return 0;
   }
   #endif
   bool ogl_ubitblt(int w,int h,int dx,int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest)
   {
   // r_ubitbltc++;
   // return 0;
   //#if 0
    GLfloat xo,yo,xs,ys;
    GLfloat u1,v1,u2,v2;
    int gltexture=0;
   // unsigned char *oldpal;
    r_ubitbltc++;
   
   /* if (w==src->bm_w && sx==0){
    u1=0;u2=src->glu;
    }else{
    u1=sx/(float)src->bm_w*src->glu;
    u2=w/(float)src->bm_w*src->glu+u1;
    }
    if (h==src->bm_h && sy==0){
    v1=0;v2=src->glv;
    }else{
    v1=sy/(float)src->bm_h*src->glv;
    v2=h/(float)src->bm_h*src->glv+v1;
    }*/
    u1=v1=0;
   
    dx+=grd_curcanv->cv_bitmap.bm_x;
    dy+=grd_curcanv->cv_bitmap.bm_y;
    xo=dx/(float)last_width;
    xs=w/(float)last_width;
    yo=1.0-dy/(float)last_height;
    ys=h/(float)last_height;
   
    OGL_ENABLE(GL_TEXTURE_2D);
   
   // if (src->gltexture<0)
   // oldpal=ogl_pal;
    ogl_pal=gr_current_pal;
    ogl_loadtexture(src->bm_data,w,h,sx,sy,&gltexture,&u2,&v2,0);
   // ogl_pal=oldpal;
    ogl_pal=gr_palette;
   // ogl_loadbmtexture(src);
   // else
   // alreadygl=1;
    glBindTexture(GL_TEXTURE_2D, gltexture);
   
    OGL_TEXCLAMP();
   
    glBegin(GL_QUADS);
    glColor3f(1.0,1.0,1.0);
    glTexCoord2f(u1, v1); glVertex2f(xo, yo);
    glTexCoord2f(u2, v1); glVertex2f(xo+xs, yo);
    glTexCoord2f(u2, v2); glVertex2f(xo+xs, yo-ys);
    glTexCoord2f(u1, v2); glVertex2f(xo, yo-ys);
    glEnd();
   // if(!alreadygl)
   // ogl_freebmtexture(src);
    ogl_freetexture(&gltexture);
    return 0;
   //#endif
   }
   
 void ogl_start_frame(void){  void ogl_start_frame(void){
  r_polyc=0;r_tpolyc=0;r_bitmapc=0;r_ubitmapc=0;   r_polyc=0;r_tpolyc=0;r_bitmapc=0;r_ubitmapc=0;r_ubitbltc=0;r_upixelc=0;
   
  OGL_VIEWPORT(grd_curcanv->cv_bitmap.bm_x,grd_curcanv->cv_bitmap.bm_y,Canvas_width,Canvas_height);   OGL_VIEWPORT(grd_curcanv->cv_bitmap.bm_x,grd_curcanv->cv_bitmap.bm_y,Canvas_width,Canvas_height);
  glClearColor(0.0, 0.0, 0.0, 0.0);   glClearColor(0.0, 0.0, 0.0, 0.0);
Line 387
 
Line 460
 // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 }  }
 void ogl_end_frame(void){  void ogl_end_frame(void){
   // OGL_VIEWPORT(grd_curcanv->cv_bitmap.bm_x,grd_curcanv->cv_bitmap.bm_y,);
  mprintf((0,"ogl_end_frame: rendered %i flat polys, %i tmapped polys, %i sprites, %i ubitmaps\n",r_polyc,r_tpolyc,r_bitmapc,r_ubitmapc));   OGL_VIEWPORT(0,0,grd_curscreen->sc_w,grd_curscreen->sc_h);
    mprintf((0,"ogl_end_frame: %i polys, %i tmaps, %i sprites, %i bitmaps, %i bitblts, %i pixels\n",r_polyc,r_tpolyc,r_bitmapc,r_ubitmapc,r_ubitbltc,r_upixelc));
 // glViewport(0,0,grd_curscreen->sc_w,grd_curscreen->sc_h);  // glViewport(0,0,grd_curscreen->sc_w,grd_curscreen->sc_h);
  glMatrixMode(GL_PROJECTION);   glMatrixMode(GL_PROJECTION);
  glLoadIdentity();//clear matrix   glLoadIdentity();//clear matrix
Line 410
 
Line 484
  return i;   return i;
 }  }
   
 GLubyte texbuf[512*512*4];  //GLubyte texbuf[512*512*4];
 //loads a palettized bitmap into a ogl RGBA texture.  GLubyte texbuf[OGLTEXBUFSIZE];
 //Sizes and pads dimensions to multiples of 2 if necessary.  void ogl_filltexbuf(unsigned char *data,GLubyte *texp,int truewidth,int width,int height,int dxo,int dyo,int twidth,int theight)
 //In theory this could be a problem for repeating textures, but all real  {
 //textures (not sprites, etc) in descent are 64x64, so we are ok.  
 //stores OpenGL textured id in *texid and u/v values required to get only the real data in *u/*v  
 void ogl_loadtexture(unsigned char * data, int width, int height, int *texid,float *u,float *v,int domipmap){  
  int x,y,c,i;   int x,y,c,i;
  GLubyte *texp=texbuf;  
  int twidth=pow2ize(width),theight=pow2ize(height);//calculate smallest texture size that can accomodate us (must be multiples of 2)  
   
  if (twidth*theight*4>sizeof(texbuf))//shouldn't happen, descent never uses textures that big.   if (twidth*theight*4>sizeof(texbuf))//shouldn't happen, descent never uses textures that big.
  Error("texture toobig");   Error("texture toobig %i %i",twidth,theight);
   
  //calculate u/v values that would make the resulting texture correctly sized  
  *u=(float)width/(float)twidth;  
  *v=(float)height/(float)theight;  
   
  // if (width!=twidth || height!=theight)  
  // mprintf((0,"sizing %ix%i texture up to %ix%i\n",width,height,twidth,theight));  
  i=0;   i=0;
  for (y=0;y<theight;y++){   for (y=0;y<theight;y++){
    i=dxo+truewidth*(y+dyo);
  for (x=0;x<twidth;x++){   for (x=0;x<twidth;x++){
  if (x<width && y<height)   if (x<width && y<height)
  c=data[i++];   c=data[i++];
Line 443
 
Line 506
  (*(texp++))=0;   (*(texp++))=0;
  (*(texp++))=0;//transparent pixel   (*(texp++))=0;//transparent pixel
  }else{   }else{
  (*(texp++))=gr_palette[c*3]*4;   //(*(texp++))=gr_palette[c*3]*4;
  (*(texp++))=gr_palette[c*3+1]*4;   //(*(texp++))=gr_palette[c*3+1]*4;
  (*(texp++))=gr_palette[c*3+2]*4;   //(*(texp++))=gr_palette[c*3+2]*4;
    (*(texp++))=ogl_pal[c*3]*4;
    (*(texp++))=ogl_pal[c*3+1]*4;
    (*(texp++))=ogl_pal[c*3+2]*4;
  (*(texp++))=255;//not transparent   (*(texp++))=255;//not transparent
  }   }
  }   }
  }   }
   }
   //loads a palettized bitmap into a ogl RGBA texture.
   //Sizes and pads dimensions to multiples of 2 if necessary.
   //In theory this could be a problem for repeating textures, but all real
   //textures (not sprites, etc) in descent are 64x64, so we are ok.
   //stores OpenGL textured id in *texid and u/v values required to get only the real data in *u/*v
   void ogl_loadtexture(unsigned char * data, int width, int height,int dxo,int dyo, int *texid,float *u,float *v,int domipmap){
    int twidth=pow2ize(width),theight=pow2ize(height);//calculate smallest texture size that can accomodate us (must be multiples of 2)
   
    //calculate u/v values that would make the resulting texture correctly sized
    *u=(float)width/(float)twidth;
    *v=(float)height/(float)theight;
   
    // if (width!=twidth || height!=theight)
    // mprintf((0,"sizing %ix%i texture up to %ix%i\n",width,height,twidth,theight));
    ogl_filltexbuf(data,texbuf,width,width,height,dxo,dyo,twidth,theight);
   
  // Generate OpenGL texture IDs.   // Generate OpenGL texture IDs.
  glGenTextures(1, texid);   glGenTextures(1, texid);
Line 473
 
Line 555
  GL_UNSIGNED_BYTE, // imageData is a GLubyte pointer.   GL_UNSIGNED_BYTE, // imageData is a GLubyte pointer.
  texbuf);   texbuf);
  r_texcount++;   r_texcount++;
  mprintf((0,"ogl_loadtexture(%p,%i,%i,%p):%i u=%f v=%f (%i)\n",data,twidth,theight,texid,*texid,*u,*v,r_texcount));   mprintf((0,"ogl_loadtexture(%p,%i,%i,%ix%i,%p):%i u=%f v=%f (%i)\n",data,twidth,theight,dxo,dyo,texid,*texid,*u,*v,r_texcount));
   
 }  }
 unsigned char decodebuf[512*512];  unsigned char decodebuf[512*512];
Line 495
 
Line 577
  }   }
  buf=decodebuf;   buf=decodebuf;
  }   }
  ogl_loadtexture(buf,bm->bm_w,bm->bm_h,&bm->gltexture,&bm->glu,&bm->glv,domipmap);   ogl_loadtexture(buf,bm->bm_w,bm->bm_h,0,0,&bm->gltexture,&bm->glu,&bm->glv,domipmap);
 }  }
 void ogl_loadbmtexture(grs_bitmap *bm){  void ogl_loadbmtexture(grs_bitmap *bm){
  ogl_loadbmtexture_m(bm,1);   ogl_loadbmtexture_m(bm,1);
   }
   void ogl_freetexture(int *gltexture){
    if (*gltexture>=0){
    r_texcount--;
    mprintf((0,"ogl_freetexture(%p):%i (%i left)\n",gltexture,*gltexture,r_texcount));
    glDeleteTextures( 1, gltexture );
    *gltexture=-1;
    }
 }  }
 void ogl_freebmtexture(grs_bitmap *bm){  void ogl_freebmtexture(grs_bitmap *bm){
  if (bm->gltexture>=0){   if (bm->gltexture>=0){

Legend:
line(s) removed in v.1.11 
line(s) changed
 line(s) added in v.1.12