OpenGTA/tools/display_slopes.cpp

448 lines
12 KiB
C++
Raw Normal View History

2015-12-03 00:37:02 +00:00
#include <iostream>
#include <cmath>
#include <SDL_image.h>
#include <SDL_opengl.h>
#include "common_sdl_gl.h"
#include "opengta.h"
extern SDL_Surface* screen;
GLfloat mapPos[2] = {0.0f, 0.0f};
OpenGTA::Map *map = NULL;
float slope_raw_data[45][5][4][3] = {
#include "slope1_data.h"
};
float lid_normal_data[45][3] = {
#include "lid_normal_data.h"
};
int slope_idx = 0;
float angle = 0;
GLuint north, south, west, east, lid;
void on_exit() {
SDL_Quit();
if (map)
delete map;
PHYSFS_deinit();
if (global_EC)
std::cerr << "Exiting after fatal problem - please see output above" << std::endl;
else
std::cout << "Goodbye" << std::endl;
}
void handleKeyPress( SDL_keysym *keysym ) {
switch ( keysym->sym ) {
case SDLK_ESCAPE:
global_Done = 1;
break;
case SDLK_LEFT:
mapPos[0] -= 1.0f;
break;
case SDLK_RIGHT:
mapPos[0] += 1.0f;
break;
case SDLK_UP:
mapPos[1] += 1.0f;
break;
case SDLK_DOWN:
mapPos[1] -= 1.0f;
break;
case 'a':
glEnable(GL_CULL_FACE);
printf("backfaces culled\n");
break;
case 'b':
glDisable(GL_CULL_FACE);
printf("all faces drawn\n");
break;
case '.':
angle += 1.0f;
break;
case ',':
angle -= 1.0f;
break;
case '+':
slope_idx++;
if (slope_idx > 44)
slope_idx = 44;
printf("now %i\n", slope_idx);
break;
case '-':
slope_idx--;
if (slope_idx < 0)
slope_idx = 0;
printf("now %i\n", slope_idx);
break;
default:
break;
}
}
void draw_slope(float size, int which) {
float red = 0.4;
float green = 0.7;
float blue = 0.3;
#if 0
float x1,x2,y1,y2,z1,z2 = 0.0f;
x1 = slope_raw_data[which][0][0][0] - slope_raw_data[which][0][1][0];
y1 = slope_raw_data[which][0][0][1] - slope_raw_data[which][0][1][1];
z1 = slope_raw_data[which][0][0][2] - slope_raw_data[which][0][1][2];
x2 = slope_raw_data[which][0][1][0] - slope_raw_data[which][0][2][0];
y2 = slope_raw_data[which][0][1][1] - slope_raw_data[which][0][2][1];
z2 = slope_raw_data[which][0][1][2] - slope_raw_data[which][0][2][2];
float nx,ny,nz,vLen = 0.0f;
nx = (y1 * z2) - (z1 * y2);
ny = (z1 * x2) - (x1 * z2);
nz = (x1 * y2) - (y1 * x2);
vLen = sqrt( (nx * nx) + (ny * ny) + (nz * nz) );
nx /= vLen;
ny /= vLen;
nz /= vLen;
//std::cout << nx << " " << ny << " " << nz << std::endl;
#endif
float nx = lid_normal_data[which][0];
float ny = lid_normal_data[which][1];
float nz = lid_normal_data[which][2];
GLfloat lidTex[8] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f};
//GLfloat lidTex[8] = {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
#ifdef GLTEX_HELPER
#undef GLTEX_HELPER
#endif
#define GLTEX_HELPER \
glTexCoord2f(lidTex[jj], lidTex[jj+1]); jj += 2; if (jj > 6) { jj = 0; }
for (int i=0; i<5; i++) {
if (i == 0) {
red = green = 0.0f;
blue = 1.0f;
}
else if (i == 1) {
red = blue = 0.0f;
green = 1.0f;
}
else if (i == 2) {
red = 1.0f;
blue = green = 0.0f;
}
else if (i == 3) {
red = 0.0f;
blue = green = 1.0f;
}
else if (i == 4) {
red = green = 1.0f;
blue = 0.0f;
}
if (which == 41 && i == 1)
continue;
if (which == 42 && i == 2)
continue;
if (which == 43 && i == 4)
continue;
if (which == 44 && i == 3)
continue;
/*
if (i == 0)
glBindTexture(GL_TEXTURE_2D, lid);
if (i == 1)
glBindTexture(GL_TEXTURE_2D, north);
if (i == 2)
glBindTexture(GL_TEXTURE_2D, south);
if (i == 3)
glBindTexture(GL_TEXTURE_2D, east); // FIXME: flipped west<->east ???
if (i == 4)
glBindTexture(GL_TEXTURE_2D, west);
*/
glBegin(GL_QUADS);
glColor3f(red, green, blue);
switch(i) {
case 0:
glNormal3f(nx, ny, nz);
break;
case 1:
glNormal3f(0.0f, 0.0f, 1.0f);
break;
case 2:
glNormal3f(0.0f, 0.0f, -1.0f);
break;
case 3:
glNormal3f(-1.0f, 0.0f, 0.0f);
break;
case 4:
glNormal3f(1.0f, 0.0f, 0.0f);
break;
}
int jj = 0;
for (int j=0; j < 4; j++) {/*
switch(j) {
case 0:
//glNormal3f(0.0f, 0.0f, 1.0f);
break;
case 1:
//glNormal3f(0.0f, -1.0f, 0.0f);
break;
case 2:
//glNormal3f(0.0f, 1.0f, 0.0f);
break;
}*/
//GLTEX_HELPER;
glVertex3f(slope_raw_data[which][i][j][0],
slope_raw_data[which][i][j][1],
slope_raw_data[which][i][j][2]);
}
glEnd();
#if 0
if (i == 0) {
glBegin(GL_LINES);
glColor3f(0.0f, 0.0f, 0.5f);
glVertex3f(0.5f, 1.0f, -0.5f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.5f+nx, 1.0f+ny, -0.5f+nz);
glEnd();
}
if (i == 1) {
glBegin(GL_LINES);
glColor3f(0.0f, 0.5f, 0.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.5f, 0.5f, 1.0f);
glEnd();
}
if (i == 2) {
glBegin(GL_LINES);
glColor3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.5f, -1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.5f, 0.5f, -2.0f);
glEnd();
}
if (i == 3) {
glBegin(GL_LINES);
glColor3f(0.0f, 0.5f, 0.5f);
glVertex3f(0.0f, 0.5f, -0.5f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 0.5f, -0.5f);
glEnd();
}
if (i == 4) {
glBegin(GL_LINES);
glColor3f(0.5f, 0.5f, 0.0f);
glVertex3f(1.0f, 0.5f, -0.5f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(2.0f, 0.5f, -0.5f);
glEnd();
}
#endif
}
}
#if 0
void draw_cube(float size) {
/* thanks to lesson 6 at Nehe */
glDisable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 1.0f);
// Front Face
glTexCoord2f(0.0f, 0.0f);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(-size, -size, size);// Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f);
glVertex3f( size, -size, size);// Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f);
glVertex3f( size, size, size);// Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-size, size, size);// Top Left Of The Texture and Quad
glColor3f(1.0f, 0.0f, 0.0f);
// Back Face
glTexCoord2f(1.0f, 0.0f);
glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(-size, -size, -size);// Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size, size, -size);// Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size, size, -size);// Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, -size, -size);// Bottom Left Of The Texture and Quad
glColor3f(1.0f, 1.0f, 1.0f);
// Top Face
glTexCoord2f(0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-size, size, -size);// Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-size, size, size);// Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f);
glVertex3f( size, size, size);// Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f);
glVertex3f( size, size, -size);// Top Right Of The Texture and Quad
// Bottom Face
glColor3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f);
glNormal3f(0.0f, 0.0f, -1.0f);
glVertex3f(-size, -size, -size);// Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size, -size, -size);// Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, -size, size);// Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size, -size, size);// Bottom Right Of The Texture and Quad
// Right face
glColor3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f);
glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f( size, -size, -size);// Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f);
glVertex3f( size, size, -size);// Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f);
glVertex3f( size, size, size);// Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f);
glVertex3f( size, -size, size);// Bottom Left Of The Texture and Quad
// Left Face
glColor3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(-size, -size, -size);// Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-size, -size, size);// Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-size, size, size);// Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-size, size, -size);// Top Left Of The Texture and Quad
glEnd();
}
#endif
void drawScene() {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glTranslatef(mapPos[0], mapPos[1], 0.0f);
/*
for (int i=0; i<50; i++) {
glPushMatrix();
glTranslatef(0.0f, float(i), 0.0f);
for (int j=0; j<50; j++) {
glTranslatef(1.0f, 0.0f, 0.0f);
float step_col = 0.0f;
glColor3f(0.2f+step_col, 0.2f+step_col, 1.0f-step_col);
PHYSFS_uint16 emptycount = map->getNumBlocksAt(j,i);
glPushMatrix();
for(int c=0; c < 6 - emptycount; c++) {
draw_cube(0.5f);
glTranslatef(0.0f, 0.0f, 1.0f);
step_col += 0.2;
glColor3f(0.2f+step_col, 0.1f+step_col, 1.0f-step_col);
}
glPopMatrix();
}
glPopMatrix();
}*/
//draw_cube(1.0f);
glRotatef(angle, 0, 1, 0);
glEnable(GL_TEXTURE_2D);
draw_slope(1.0f, slope_idx);
SDL_GL_SwapBuffers();
}
GLuint createGLTexture(GLsizei w, GLsizei h, const void* pixels) {
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glEnable(GL_COLOR_MATERIAL);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, param);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, param);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// GL_LINEAR_MIPMAP_LINEAR);
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, w,
h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
*/
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
return tex;
}
void run_main() {
SDL_Event event;
int paused = 0;
PHYSFS_init("mapview");
PHYSFS_addToSearchPath(PHYSFS_getBaseDir(), 1);
/*
SDL_Surface * tex = IMG_Load("lid.jpg");
SDL_LockSurface(tex);
lid = createGLTexture(tex->w, tex->h, tex->pixels);
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
tex = IMG_Load("north.jpg");
SDL_LockSurface(tex);
north = createGLTexture(tex->w, tex->h, tex->pixels);
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
tex = IMG_Load("south.jpg");
SDL_LockSurface(tex);
south = createGLTexture(tex->w, tex->h, tex->pixels);
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
tex = IMG_Load("west.jpg");
SDL_LockSurface(tex);
west = createGLTexture(tex->w, tex->h, tex->pixels);
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
tex = IMG_Load("east.jpg");
SDL_LockSurface(tex);
east = createGLTexture(tex->w, tex->h, tex->pixels);
SDL_UnlockSurface(tex);
SDL_FreeSurface(tex);
*/
//glDisable(GL_COLOR_MATERIAL);
glCullFace(GL_BACK);
//glEnable(GL_CULL_FACE);
//map = new OpenGTA::Map("NYC.CMP");
while(!global_Done && !global_EC) {
while (SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_ACTIVEEVENT:
if (event.active.gain == 0)
paused = 1;
else
paused = 0;
break;
case SDL_KEYDOWN:
handleKeyPress(&event.key.keysym);
break;
case SDL_VIDEORESIZE:
screen = SDL_SetVideoMode( event.resize.w,
event.resize.h, 32, videoFlags );
if (!screen)
ERROR("Failed to set video mode after resize event");
resize(event.resize.w, event.resize.h);
break;
case SDL_QUIT:
global_Done = 1;
break;
default:
break;
}
}
if (!paused)
drawScene();
}
glDeleteTextures(1, &lid);
glDeleteTextures(1, &north);
glDeleteTextures(1, &south);
glDeleteTextures(1, &west);
glDeleteTextures(1, &east);
}