⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textobj.c

📁 这是一个相当棒的Linux下的台球游戏
💻 C
字号:
/* textobj.c****    quad with text as texture using OpenGL**    Copyright (C) 2001  Florian Berger**    Email: harpin_floh@yahoo.de, florian.berger@jk.uni-linz.ac.at****    This program is free software; you can redistribute it and/or modify**    it under the terms of the GNU General Public License Version 2 as**    published by the Free Software Foundation;****    This program is distributed in the hope that it will be useful,**    but WITHOUT ANY WARRANTY; without even the implied warranty of**    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the**    GNU General Public License for more details.****    You should have received a copy of the GNU General Public License**    along with this program; if not, write to the Free Software**    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***/#include"options.h"#include"font.h"#include"textobj.h"#include <GL/gl.h>#include <GL/glu.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef options_use_freetypevoid bulb_font( char * data, int w, int h ){    int x,y,i,w2,h2,index;    double d;    w2=5; h2=5;    for ( y=0 ; y<h ; y++ ) {        for ( x=0 ; x<w ; x++ ) {            d=0;            for ( i=0 ; i<w2*h2 ; i++ ) {                index = (y-h2/2+i/w2)*w+x-w2/2+i%w2;                if( index>0 && index<w*h ){                    d += (unsigned char)data[index];                }            }            if(data[y*w+x]!=0)            data[y*w+x] = (double)((unsigned char)data[y*w+x])*d/(double)w2/(double)h2/255.0;        }    }}void diff_x_font( char * data, int w, int h ){    int x,y,w2,h2;    double d;    w2=5; h2=5;    for ( y=0 ; y<h ; y++ ) {        for ( x=0 ; x<w ; x++ ) {            d=(unsigned char)data[y*w+x]-(unsigned char)data[y*w+x+1];            data[y*w+x] = (double)((unsigned char)data[y*w+x])*(200.0-d)/255.0;        }    }}void diff_xy_font( char * data, int w, int h ){    int x,y,w2,h2;    double d;    w2=5; h2=5;    for ( y=0 ; y<h ; y++ ) {        for ( x=0 ; x<w ; x++ ) {            d=(unsigned char)data[y*w+x]-(unsigned char)data[(y+1)*w+x+1];            data[y*w+x] = (double)((unsigned char)data[y*w+x])*(200.0-d)/255.0;        }    }}int create_string_quad( char * str, char * fontname, int h, int * quad_id, int * tex_id, double * quad_w, double * quad_h ){    int    quad_obj;    int    texbind;    int    texw,texh, width,height;    char * texdata;    double fact;    int    w1,w2, h1,h2, nx,ny;#define MAX_TEXW 256#define MAX_TEXH 256    getStringPixmapFT( str, fontname, h, &texdata, &texw, &texh, &width, &height );    glGenTextures(1,&texbind);/*    nx=(width+MAX_TEX_W-1)/MAX_TEX_W;    ny=(width+MAX_TEX_H-1)/MAX_TEX_H;    w1 = MAX_TEX_W;    w2 = NEXT_POW_OF_2(MAX_TEX_W & (MAX_TEX_W-1));    h1 = MAX_TEX_H;    h2 = NEXT_POW_OF_2(MAX_TEX_H & (MAX_TEX_H-1));*//*    texnr++;    texnr=nx*ny    for(iy=0;iy<ny;iy++){        for(ix=0;ix<nx;ix++){            glGenTextures(1,&texbind[texnr]);        }    }*///    bulb_font(texdata, texw, texh);//    diff_xy_font(texdata, texw, texh);//    fprintf(stderr,"texw=%d,texh=%d,w=%d,h=%d\n",texw,texh,width,height);    glBindTexture(GL_TEXTURE_2D,texbind);    gluBuild2DMipmaps(GL_TEXTURE_2D, 1, texw, texh, GL_LUMINANCE,                      GL_UNSIGNED_BYTE, texdata);//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, options_tex_min_filter);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, options_tex_mag_filter);    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);    free(texdata);//    fprintf(stderr,"-texbind=%d\n",texbind);//    fprintf(stderr,"texx=%f,texy=%f\n",(double)texw/(double)width,(double)texh/(double)height);    fact=(double)h;    quad_obj = glGenLists(1);    glNewList(quad_obj, GL_COMPILE);//    glBindTexture(GL_TEXTURE_2D,lightflaretexbind);    glBindTexture(GL_TEXTURE_2D,texbind);    glBegin(GL_QUADS);    glNormal3f(0,0,1);    glTexCoord2f(0,0);    glVertex3f(0,1.0*fact,0);    glTexCoord2f((double)width/(double)texw,0);//    glTexCoord2f(1,0);//    glTexCoord2f((double)texw/(double)width,0);    glVertex3f((double)width/(double)height*fact,1.0*fact,0);    glTexCoord2f((double)width/(double)texw,(double)height/(double)texh);//    glTexCoord2f(1,1);//    glTexCoord2f((double)texw/(double)width,(double)texh/(double)height);    glVertex3f((double)width/(double)height*fact,0,0);    glTexCoord2f(0,(double)height/(double)texh);//    glTexCoord2f(0,1);//    glTexCoord2f(0,(double)texh/(double)height);    glVertex3f(0,0,0);    glEnd();    glEndList();    *quad_h=fact*1.0;    *quad_w=(double)width/(double)height*fact;    if(quad_id!=0) *quad_id=quad_obj;    if(tex_id!=0) *tex_id=texbind;    return(quad_obj);}textObj * textObj_new(char * str, char * fontname, int height ){    textObj * obj;    obj=malloc(sizeof(textObj));    obj->height=height;    obj->depth3D=0.0;  /* for toggling to 3D */    obj->is_3D=0;    strcpy(obj->str,str);    strcpy(obj->fontname,fontname);    create_string_quad( obj->str, obj->fontname, obj->height, &(obj->quad_id), &(obj->tex_id), &(obj->quad_w), &(obj->quad_h) );    return obj;}textObj * textObj3D_new(char * str, char * fontname, double height, float depth,  int ppspline){    textObj * obj;    obj=malloc(sizeof(textObj));    obj->height=height;    obj->depth3D=depth;    obj->is_3D=1;    strcpy(obj->str,str);    strcpy(obj->fontname,fontname);    obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );    return obj;}void textObj_toggle3D( textObj * obj ){    if(! obj->is_3D){        obj->is_3D=1;        glDeleteLists( obj->quad_id, 1 );        obj->quad_id=0;        glDeleteTextures( 1, &(obj->tex_id) );        obj->tex_id=0;        obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );    } else {        obj->is_3D=0;        glDeleteLists( obj->obj3D_id, 1 );        obj->obj3D_id=0;        create_string_quad( obj->str, obj->fontname, obj->height, &(obj->quad_id), &(obj->tex_id), &(obj->quad_w), &(obj->quad_h) );    }}void textObj_setText( textObj * obj, char * str ){    if( strcmp(str,obj->str)!=0 ){        if(! obj->is_3D){            DPRINTF("textObj_setText: obj=%p, text=%s\n",obj, str);            DPRINTF("textObj_setText 0\n");            glDeleteLists( obj->quad_id, 1 );            DPRINTF("textObj_setText 0.5\n");            obj->quad_id=0;            DPRINTF("obj->tex_id=%d\n",obj->tex_id);            if( glIsTexture(obj->tex_id) == GL_TRUE )                glDeleteTextures( 1, &(obj->tex_id) );            DPRINTF("textObj_setText 0.75\n");            obj->tex_id=0;            strcpy(obj->str,str);            DPRINTF("textObj_setText 1\n");            create_string_quad( obj->str, obj->fontname, obj->height, &(obj->quad_id), &(obj->tex_id), &(obj->quad_w), &(obj->quad_h) );            DPRINTF("textObj_setText 2\n");        } else {            glDeleteLists( obj->obj3D_id, 1 );            obj->obj3D_id=0;            strcpy(obj->str,str);            obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );        }    }}void textObj_delete_last( textObj * obj ){    char str[256];    int slen;    strcpy(str,obj->str);    slen = strlen(str);    str[slen-1]=0;    textObj_setText(obj,str);}void textObj_append_char( textObj * obj, int c ){    char str[256];    int slen;    strcpy(str,obj->str);    slen = strlen(str);    str[slen+1]=0;    str[slen]=c;    textObj_setText(obj,str);}void textObj_setHeight( textObj * obj, int height ){    if(! obj->is_3D){        glDeleteLists( obj->quad_id, 1 );        obj->quad_id=0;        glDeleteTextures( 1, &(obj->tex_id) );        obj->tex_id=0;        obj->height=height;        create_string_quad( obj->str, obj->fontname, obj->height, &(obj->quad_id), &(obj->tex_id), &(obj->quad_w), &(obj->quad_h) );    } else {        glDeleteLists( obj->obj3D_id, 1 );        obj->obj3D_id=0;        obj->height=height;        obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );    }}void textObj_setDepth( textObj * obj, int depth ){    if(! obj->is_3D){        obj->depth3D=depth;    } else {        glDeleteLists( obj->obj3D_id, 1 );        obj->obj3D_id=0;        obj->depth3D=depth;        obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );    }}void textObj_setFont( textObj * obj, char * fontname ){    if(! obj->is_3D){        glDeleteLists( obj->quad_id, 1 );        obj->quad_id=0;        glDeleteTextures( 1, &(obj->tex_id) );        obj->tex_id=0;        strcpy(obj->fontname,fontname);        create_string_quad( obj->str, obj->fontname, obj->height, &(obj->quad_id), &(obj->tex_id), &(obj->quad_w), &(obj->quad_h) );    } else {        glDeleteLists( obj->obj3D_id, 1 );        obj->obj3D_id=0;        strcpy(obj->fontname,fontname);        obj->obj3D_id=getStringGLListFT( obj->str, obj->fontname, obj->height, obj->depth3D, &(obj->obj3D_w), &(obj->obj3D_h) );    }}void textObj_draw( textObj * obj ){    if(! obj->is_3D){        if( obj->quad_id != 0 )            glCallList( obj->quad_id );    } else {        if( obj->obj3D_id != 0 ){//            glDisable(GL_TEXTURE_2D);            glCallList( obj->obj3D_id );//            glEnable(GL_TEXTURE_2D);        }    }}void textObj_draw_centered( textObj * obj ){    if(! obj->is_3D){        glPushMatrix();        glTranslatef( -(double)(obj->quad_w)/2.0, -(double)(obj->quad_h)/2.0, 0.0 );        if( obj->quad_id != 0 )            glCallList( obj->quad_id );        glPopMatrix();    } else {        glPushMatrix();        glTranslatef( -(double)(obj->obj3D_w)/2.0, -(double)(obj->obj3D_h)/2.0, (double)(obj->depth3D)/2.0 );        if( obj->obj3D_id != 0 ){//            glDisable(GL_TEXTURE_2D);            glCallList( obj->obj3D_id );//            glEnable(GL_TEXTURE_2D);        }        glPopMatrix();    }}void textObj_draw_bound( textObj * obj, int hbound, int vbound ){    double x,y;    if(! obj->is_3D){        x=0.0;        y=0.0;        if( hbound == HBOUND_CENTER )  x=-(double)(obj->quad_w)/2.0;        if( hbound == HBOUND_RIGHT  )  x=-(double)(obj->quad_w);        if( hbound == HBOUND_LEFT   )  x=0.0;        if( vbound == VBOUND_CENTER )  y=-(double)(obj->quad_h)/2.0;        if( vbound == VBOUND_TOP    )  y=-(double)(obj->quad_h);        if( vbound == VBOUND_BOTTOM )  y=0.0;        glPushMatrix();        glTranslatef( x, y, 0.0 );        if( obj->quad_id != 0 )            glCallList( obj->quad_id );        glPopMatrix();    } else {        x=0.0;        y=0.0;        if( hbound == HBOUND_CENTER )  x=-(double)(obj->obj3D_w)/2.0;        if( hbound == HBOUND_RIGHT  )  x=-(double)(obj->obj3D_w);        if( hbound == HBOUND_LEFT   )  x=0.0;        if( vbound == VBOUND_CENTER )  y=-(double)(obj->obj3D_h)/2.0;        if( vbound == VBOUND_TOP    )  y=-(double)(obj->obj3D_h);        if( vbound == VBOUND_BOTTOM )  y=0.0;        glPushMatrix();        glTranslatef( x, y, 0.0 );        if( obj->obj3D_id != 0 ){//            glDisable(GL_TEXTURE_2D);            glCallList( obj->obj3D_id );//            glEnable(GL_TEXTURE_2D);        }        glPopMatrix();    }}void textObj_delete( textObj * obj ){    if(! obj->is_3D){        glDeleteLists( obj->quad_id, 1 );        obj->quad_id=0;        glDeleteTextures( 1, &(obj->tex_id) );        obj->tex_id=0;    } else {        glDeleteLists( obj->obj3D_id, 1 );        obj->obj3D_id=0;    }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -