Difference for arch/ogl/ogl.c from version 1.1 to 1.2


version 1.1 version 1.2
Line 1
 
Line 1
 #include <stdio.h>  //#include <stdio.h>
 #include <GL/gl.h>  #include <GL/gl.h>
 #include <GL/glu.h>  #include <GL/glu.h>
 #include "3d.h"  #include "3d.h"
Line 8
 
Line 8
 #include "palette.h"  #include "palette.h"
 #include "rle.h"  #include "rle.h"
 #include "ogl_init.h"  #include "ogl_init.h"
   #include "mono.h"
   
 GLfloat tempmatrix[16];  GLfloat tempmatrix[16];
 int r_polyc,r_tpolyc,r_bitmapc;  int r_polyc,r_tpolyc,r_bitmapc,r_ubitmapc;
 int r_simc;  
 int r_texcount=0;  int r_texcount=0;
 #define f2glf(x) (f2fl(x))  #define f2glf(x) (f2fl(x))
   
 /*#define fillmatrixrow(dest,source) dest[0]=f2glf(source.x);dest[1]=f2glf(source.y);dest[2]=f2glf(source.z);//printf("%f,%f,%f/",f2glf(source.x),f2glf(source.y),f2glf(source.z));  
   
 #define ogl_load_matrix(tempmatrix,matrix)\  
  fillmatrixrow(tempmatrix,matrix ## rvec);\  
  fillmatrixrow((tempmatrix+4),matrix ## uvec);\  
  fillmatrixrow((tempmatrix+8),matrix ## fvec);*/  
   
 #define fillmatrixrow(dest,source) dest[0]=f2glf(source.x);dest[4]=f2glf(source.y);dest[8]=f2glf(source.z);//printf("%f,%f,%f/",f2glf(source.x),f2glf(source.y),f2glf(source.z));  
   
 #define ogl_load_matrix(tempmatrix,matrix){\  
  fillmatrixrow(tempmatrix,matrix ## rvec);\  
  fillmatrixrow((tempmatrix+1),matrix ## uvec);\  
  fillmatrixrow((tempmatrix+2),matrix ## fvec);}  
   
 #define ogl_mult_vms_matrix(matrix){\  
  ogl_load_matrix(tempmatrix,matrix)\  
  tempmatrix[3]=tempmatrix[7]=tempmatrix[11]=0;\  
  tempmatrix[12]=tempmatrix[13]=tempmatrix[14]=0;\  
  tempmatrix[15]=1.0;\  
  glMultMatrixf(tempmatrix);}  
   
 //#define ogl_start_instance_matrix(p,o) g3_start_instance_matrix(p,o)  
 void ogl_start_instance_matrix(vms_vector *pos,vms_matrix *orient){  
  r_simc++;  
  glPushMatrix();  
  //glTranslatef(f2glf(pos->x),f2glf(pos->y),f2glf(pos->z));  
  glTranslatef(f2glf(pos->x),f2glf(pos->y),-f2glf(pos->z));  
  if (orient){  
  ogl_mult_vms_matrix(orient->);  
  }  
 }  
 //#define ogl_done_instance() g3_done_instance()  
 void ogl_done_instance(void){  
  r_simc--;  
  glPopMatrix();  
 }  
   
 #ifdef OGL_TRANSFORM   
 void ogl_set_view_matrix(void){  
 // printf("ogl_set_view_matrix:");  
  glMatrixMode(GL_PROJECTION);  
  glLoadIdentity();//clear matrix  
  //gluPerspective(90.0,f2fl(fixmuldiv(grd_curscreen->sc_aspect,Canvas_height,Canvas_width)),1.0,1000000.0);  
  gluPerspective(65.0,(GLfloat)Canvas_width/(GLfloat)Canvas_height,1.0,1000000.0);  
  //glScalef(1.0,1.0,-1.0);  
  //glRotatef(180.0,0,1,0);  
  //glScalef(1.0,1.0,-1.0);  
 // glRotatef(180.0,1,0,1);  
 /* glRotatef(180.0,0,1,0);  
  glRotatef(180.0,0,0,1);  
 // glScalef(1.0,-1.0,1.0);  
  glScalef(1.0,-1.0,1.0);*/  
 // gluLookAt(0,0,0,0,0,1,0,1,0);   
 // glScalef(-1.0,-1.0,-1.0);  
   
 // glScalef(1.0,-1.0,1.0);  
 // glScalef(-1.0,-1.0,1.0);  
 // glScalef(1.0,-1.0,1.0);  
  //glTranslatef(f2glf(View_position.x),-f2glf(View_position.y),-f2glf(View_position.z));  
 // glScalef(-1.0,-1.0,1.0);  
  glScalef(1.0,1.0,-1.0);  
  ogl_mult_vms_matrix(View_matrix.);  
  //glTranslatef(-f2glf(View_position.x),-f2glf(View_position.y),-f2glf(View_position.z));  
  glTranslatef(-f2glf(View_position.x),-f2glf(View_position.y),-f2glf(View_position.z));  
 // glScalef(-1.0,-1.0,1.0);  
 // glScalef(1.0,1.0,-1.0);  
  glMatrixMode(GL_MODELVIEW);  
 }  
 #endif  
 bool g3_draw_poly(int nv,g3s_point **pointlist)  bool g3_draw_poly(int nv,g3s_point **pointlist)
 {  {
  int c;   int c;
Line 104
 
Line 35
  int c;   int c;
  float l;   float l;
  r_tpolyc++;   r_tpolyc++;
   /* if (bm->bm_w !=64||bm->bm_h!=64)
    printf("g3_draw_tmap w %i h %i\n",bm->bm_w,bm->bm_h);*/
  glEnable(GL_TEXTURE_2D);   glEnable(GL_TEXTURE_2D);
  if (bm->gltexture<0)   if (bm->gltexture<0)
  ogl_loadbmtexture(bm);   ogl_loadbmtexture(bm);
Line 115
 
Line 48
  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)+gr_palette_gamma/63.0;
    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));   glTexCoord2f(f2glf(uvl_list[c].u),f2glf(uvl_list[c].v));
Line 186
 
Line 120
  glDisable(GL_TEXTURE_2D);   glDisable(GL_TEXTURE_2D);
 // printf("\n");  // printf("\n");
   
    return 0;
   }
   bool ogl_ubitmapm(int x, int y,grs_bitmap *bm)
   {
    GLfloat xo,yo,xs,ys;
    r_ubitmapc++;
   
    xo=x/(float)grd_curscreen->sc_w;
    xs=bm->bm_w/(float)grd_curscreen->sc_w;
    yo=1.0-y/(float)grd_curscreen->sc_h;
    ys=bm->bm_h/(float)grd_curscreen->sc_h;
   // 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));
   
   /* glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER,0.0);*/
    
 #if 0   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);
   
  //ogl_start_instance_matrix(pos,NULL);   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  //ogl_start_instance_matrix(pos,&View_matrix);   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  g3_start_instance_matrix(pos,&View_matrix);  
  //glColor3f(l,l,l);  
  //glScalef(f2fl(width)/64.0,f2fl(height)/64.0,1.0);  
  glScalef(f2fl(width)*2,f2fl(height)*2,1.0);  
  glBegin(GL_QUADS);   glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, -0.5, 0.0);   glColor3f(1.5,1.5,1.5);
  glTexCoord2f(1.0, 0.0); glVertex3f(0.5, -0.5, 0.0);   glTexCoord2f(0.0, 0.0); glVertex2f(xo, yo);
  glTexCoord2f(1.0, 1.0); glVertex3f(0.5, 0.5, 0.0);   glTexCoord2f(1.0, 0.0); glVertex2f(xo+xs, yo);
  glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, 0.5, 0.0);   glTexCoord2f(1.0, 1.0); glVertex2f(xo+xs, yo-ys);
    glTexCoord2f(0.0, 1.0); glVertex2f(xo, yo-ys);
  glEnd();   glEnd();
  ogl_done_instance();   glDisable(GL_TEXTURE_2D);
 #endif  // glDisable(GL_ALPHA_TEST);
   
  return 0;   return 0;
 }  }
   
 vms_vector aoeupos={0,0,-1000*f1_0};  vms_vector aoeupos={0,0,-1000*f1_0};
 vms_matrix aoeuorient=IDENTITY_MATRIX;  vms_matrix aoeuorient=IDENTITY_MATRIX;
 void ogl_start_frame(void){  void ogl_start_frame(void){
  r_simc=0;r_polyc=0;r_tpolyc=0;r_bitmapc=0;   r_polyc=0;r_tpolyc=0;r_bitmapc=0;r_ubitmapc=0;
  glClearColor(0.0, 0.0, 0.0, 0.0);   glClearColor(0.0, 0.0, 0.0, 0.0);
 // glEnable(GL_ALPHA_TEST);  // glEnable(GL_ALPHA_TEST);
 // glAlphaFunc(GL_GREATER,0.0);  // glAlphaFunc(GL_GREATER,0.0);
Line 231
 
Line 180
 }  }
 void ogl_end_frame(void){  void ogl_end_frame(void){
   
  printf("ogl_end_frame: rendered %i flat polys, %i tmapped polys, %i bitmaps, simc=%i\n",r_polyc,r_tpolyc,r_bitmapc,r_simc);   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));
  glMatrixMode(GL_PROJECTION);   glMatrixMode(GL_PROJECTION);
  glLoadIdentity();//clear matrix   glLoadIdentity();//clear matrix
  glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);   glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
  glMatrixMode(GL_MODELVIEW);   glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();//clear matrix   glLoadIdentity();//clear matrix
  glDisable(GL_BLEND);  // glDisable(GL_BLEND);
  //glDisable(GL_ALPHA_TEST);   //glDisable(GL_ALPHA_TEST);
  //gluPerspective(90.0,(GLfloat)(grd_curscreen->sc_w*3)/(GLfloat)(grd_curscreen->sc_h*4),1.0,1000000.0);   //gluPerspective(90.0,(GLfloat)(grd_curscreen->sc_w*3)/(GLfloat)(grd_curscreen->sc_h*4),1.0,1000000.0);
 // ogl_swap_buffers();//platform specific code  // ogl_swap_buffers();//platform specific code
Line 253
 
Line 202
 // texp=texbuf;  // texp=texbuf;
  if (width*height>sizeof(texbuf))   if (width*height>sizeof(texbuf))
  Error("toobig");   Error("toobig");
  printf("ogl_loadtexture(%p,%i,%i,%p):",data,width,height,texid);  
  for (i=0;i<width*height;i++){   for (i=0;i<width*height;i++){
  c=data[i];   c=data[i];
  if (c==255){   if (c==255){
  (*(texp++))=0;   (*(texp++))=0;
  (*(texp++))=0;   (*(texp++))=0;
  (*(texp++))=0;   (*(texp++))=0;
  (*(texp++))=0;   (*(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++))=255;   (*(texp++))=255;//not transparent
  }   }
  }   }
    
Line 281
 
Line 229
   
  glBindTexture(GL_TEXTURE_2D, *texid);   glBindTexture(GL_TEXTURE_2D, *texid);
   
 // glTexParameterf(GL_TEXTiURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  //TODO: make texturing mode an option
   // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   //    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
 //GL_UNSIGNED_INT_8_8_8_8  
 /* glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, // RGBA textures.  /* glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, // RGBA textures.
  width, height, 0, GL_RGBA,   width, height, 0, GL_RGBA,
  GL_UNSIGNED_BYTE, // imageData is a GLubyte pointer.   GL_UNSIGNED_BYTE, // imageData is a GLubyte pointer.
Line 292
 
Line 244
  gluBuild2DMipmaps( GL_TEXTURE_2D, 4, width,   gluBuild2DMipmaps( GL_TEXTURE_2D, 4, width,
  height, GL_RGBA, GL_UNSIGNED_BYTE, texbuf);   height, GL_RGBA, GL_UNSIGNED_BYTE, texbuf);
  r_texcount++;   r_texcount++;
  printf("%i (%i)\n",*texid,r_texcount);   mprintf((0,"ogl_loadtexture(%p,%i,%i,%p):%i (%i)\n",data,width,height,texid,*texid,r_texcount));
   
 }  }
 unsigned char decodebuf[512*512];  unsigned char decodebuf[512*512];
 void ogl_loadbmtexture(grs_bitmap *bm){  void ogl_loadbmtexture(grs_bitmap *bm){
  unsigned char *buf=bm->bm_data;   unsigned char *buf=bm->bm_data;
  if (bm->bm_flags&&BM_FLAG_RLE){   if (bm->bm_flags & BM_FLAG_RLE){
  unsigned char * dbits;   unsigned char * dbits;
  unsigned char * sbits;   unsigned char * sbits;
  int i;   int i;
Line 317
 
Line 269
 void ogl_freebmtexture(grs_bitmap *bm){  void ogl_freebmtexture(grs_bitmap *bm){
  if (bm->gltexture>=0){   if (bm->gltexture>=0){
  r_texcount--;   r_texcount--;
  printf("ogl_freebmtexture(%p,%p):%i (%i left)\n",bm->bm_data,&bm->gltexture,bm->gltexture,r_texcount);   mprintf((0,"ogl_freebmtexture(%p,%p):%i (%i left)\n",bm->bm_data,&bm->gltexture,bm->gltexture,r_texcount));
  glDeleteTextures( 1, &bm->gltexture );   glDeleteTextures( 1, &bm->gltexture );
  bm->gltexture=-1;   bm->gltexture=-1;
  }   }

Legend:
line(s) removed in v.1.1 
line(s) changed
 line(s) added in v.1.2