Allegro - otexturovanie kocky zvnutra

Created: 2008-11-11 - 17:33



#include <allegro.h>
#include <alleggl.h>
#include "upjsGl.h"
#include <vector>

using namespace std;

struct BOD{
  float x,y,z;
};

struct STENA{
  int v[4];
};

vector<STENA> stena;
vector<BOD> bod;
int n, m; //pocet vrcholov, stien

int nacitaj(char* subor) {
  FILE *s;
  s = fopen(subor, "r");
  if (s == 0) return 1;
  fscanf(s, "%d", &n);
  for (int i=0; i<n; i++) {
    BOD b;
    fscanf(s, "%f %f %f", &b.x, &b.y, &b.z);
    bod.push_back(b);
  }
  fscanf(s, "%d", &m);
  for (int i = 0; i < m; i++) {
    STENA st;
    fscanf(s, "%d %d %d %d", &st.v[0], &st.v[1], &st.v[2], &st.v[3] );
    for(int j = 0; j < 4; j++) st.v[j]--;
    stena.push_back(st);
  }
  fclose(s);
  return 0;
}

int nacitaj_texturu(char *fname) {
 BITMAP *bmp = load_bitmap(fname, NULL); //funkcia allegra, ktorá do štruktúry BITMAP natiahne obrázok zo súboru formátu bmp, pcx alebo tga
 if (bmp == 0) return 0;
 int tex = allegro_gl_make_texture(bmp); //prevedie allegrovský BITMAP do textúroveho formátu OpenGL a nahrá ho do pamäte grafickej karty, vráti poradové císlo textúry, v prípade chyby 0
 destroy_bitmap(bmp);
 //Spôsob, akým sa mení velkos textúry, MAG_FILTER pri priblížení nad originálnu hodnotu, MIN_FILTER pri oddialení, teda zmenšení textúry
 // GL_LINEAR ... výsledok vznikne lineárnou interpoláciou textúry, je teda kvalitný, ale aj nárocný na výpoctový cas
 // GL_NEAREST je jednoduché zobranie najblizšieho pixelu, rýchle
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 //Spôsob, akým sa bude textúra opakova
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //GL_REPEAT
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 return tex;
}

int main (void) {
  if (upjsGl_init(1024,768,32)!=0) {
    allegro_message("zle je!");
  
    upjsGl_exit();
    return 1;
  }
  clear_keybuf();
  nacitaj("nacitajKocku.txt");
  
  allegro_gl_begin();
  glShadeModel(GL_SMOOTH); //plynuly prechod farebny
  glLoadIdentity(); //nastavi maticu transformacie na jednotkovu

  glTranslatef(0,0,-10.0f);
int t = nacitaj_texturu("tex.bmp"); //naèítanie textúry do pamäte graf. karty, potrebné vykona len raz, vráti poradové èíslo textúry v pamäti
  glDisable(GL_DITHER); //bez dithering-u pri rozdielnej farebnej håbke
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //spôsob 'ovplyvnenia' textúr prostredím.

float tu[4] = {0.0f, 1.0f, 1.0f, 0.0f};
float tv[4] = {0.0f, 0.0f, 1.0f, 1.0f};
char* pole[6] = 
{"Front.bmp",
"Left.bmp",
"Back.bmp",
"Right.bmp",
"Bottom.bmp",
"Top.bmp"
};

int text[6];
for(int x=0;x<6;x++){
    text[x] = nacitaj_texturu(pole[x]);    
}    
   // glBindTexture(GL_TEXTURE_2D, t); //nastavenie aktuálnej textúry
  while(0==0){
//glCullFace(GL_FRONT);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //zmazanie obrazovky
    for (int i = 0; i < m; i++) {
      glBindTexture(GL_TEXTURE_2D, text[i]);  
      glBegin(GL_QUADS);
      for (int j = 3; j >= 0; j--) {
        glTexCoord2f(tu[j], tv[j]);          
        glVertex3f(bod[stena[i].v[j]].x, bod[stena[i].v[j]].y, bod[stena[i].v[j]].z);
      }
      glEnd();
    }
  
  allegro_gl_flip();

  if(key[KEY_ESC]) break;
  if(key[KEY_RIGHT]){
    glRotatef(1,0,-1,0);
    
  }
  if(key[KEY_LEFT]){
    glRotatef(1,0,1,0);
  }
  if(key[KEY_UP]){
    glRotatef(1,1,0,0);
  }
  if(key[KEY_DOWN]){
    glRotatef(1,-1,0,0);
  }
 }  
  allegro_gl_end();
  readkey();
  upjsGl_exit();
  return 0;
}
END_OF_MAIN();