image support added for jpg, bmp and ppm

svn path=/trunk/boinc/; revision=2337
This commit is contained in:
Oliver Wang 2003-09-17 23:17:09 +00:00
parent 6ffcc46f96
commit 606e797e25
6 changed files with 256 additions and 191 deletions

View File

@ -108,6 +108,7 @@ int boinc_init_opengl() {
}
int boinc_finish_opengl() {
return 0;
}

View File

@ -35,6 +35,7 @@ GLenum InitGL(GLvoid);
GLenum ReSizeGLScene(GLsizei width, GLsizei height);
extern bool app_render(int xs, int ys, double time_of_day);
extern void app_init_gl(void);
extern void app_unload_gl();
#endif
#endif

View File

@ -129,15 +129,40 @@ void ortho_done()
glPopMatrix();
}
bool get_matrix(float src[16])
bool get_matrix(double src[16])
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX,src);
glGetDoublev(GL_MODELVIEW_MATRIX,src);
glPopMatrix();
return true;
}
bool get_projection(double src[16])
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glGetDoublev(GL_PROJECTION_MATRIX,src);
glPopMatrix();
return true;
}
bool get_viewport(int view[4])
{
glGetIntegerv(GL_VIEWPORT,view);
return true;
}
void get_2d_positions(float p1,float p2,float p3,
double model[16], double proj[16], int viewport[4], double proj_pos[3])
{
gluProject(p1,p2,p3,model,proj,viewport,&proj_pos[0],&proj_pos[1],&proj_pos[2]);
}
bool get_matrix_invert(float src[16])
{
glMatrixMode(GL_MODELVIEW);
@ -712,6 +737,7 @@ void draw_texture(float* p, float* size) {
//pointer to the begining of the list
Star* stars = new Star;
//makes a list of stars that lie on cocentric circles (inefficient, most will be out of sight)
void build_stars()
{
int i=0;
@ -740,7 +766,7 @@ void build_stars()
tmpStar=NULL;
}
//moves stars towards the eye vector, and replaces ones that go behind z=0
void update_stars()
{
float modelview[16];
@ -812,4 +838,108 @@ void replaceStar(Star* star)
star->v=v;
}
//jpg texture support
//this is the array that will contain pointers to texture pixel data
UINT g_Texture[MAX_TEXTURES];
void DecodeJPG(jpeg_decompress_struct* cinfo, tImageJPG *pImageData)
{
jpeg_read_header(cinfo, TRUE);
jpeg_start_decompress(cinfo);
pImageData->rowSpan = cinfo->image_width * cinfo->num_components;
pImageData->sizeX = cinfo->image_width;
pImageData->sizeY = cinfo->image_height;
pImageData->data = new unsigned char[pImageData->rowSpan * pImageData->sizeY];
unsigned char** rowPtr = new unsigned char*[pImageData->sizeY];
for (int i = 0; i < pImageData->sizeY; i++)
rowPtr[i] = &(pImageData->data[i*pImageData->rowSpan]);
int rowsRead = 0;
while (cinfo->output_scanline < cinfo->output_height)
{
rowsRead += jpeg_read_scanlines(cinfo, &rowPtr[rowsRead], cinfo->output_height - rowsRead);
}
delete [] rowPtr;
jpeg_finish_decompress(cinfo);
}
tImageJPG *LoadJPG(const char *filename)
{
struct jpeg_decompress_struct cinfo;
tImageJPG *pImageData = NULL;
FILE *pFile;
if((pFile = fopen(filename, "rb")) == NULL)
{
MessageBox(NULL, "Unable to load JPG File!", "Error", MB_OK);
return NULL;
}
jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, pFile);
pImageData = (tImageJPG*)malloc(sizeof(tImageJPG));
DecodeJPG(&cinfo, pImageData);
jpeg_destroy_decompress(&cinfo);
fclose(pFile);
return pImageData;
}
bool CreateTextureJPG(UINT textureArray[], LPSTR strFileName, int textureID)
{
if(!strFileName) return false;
tImageJPG *pImage = LoadJPG(strFileName); // Load the image and store the data
if(pImage == NULL)
exit(0);
glGenTextures(1, &textureArray[textureID]);
glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
if (pImage)
{
if (pImage->data)
{
free(pImage->data);
}
free(pImage);
}
return true;
}
bool CreateTextureBMP(UINT textureArray[], LPSTR strFileName, int textureID)
{
DIB_BITMAP image;
if(image.loadBMP(strFileName) == false)
return false;
glGenTextures(1, &textureArray[textureID]);
glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);
gluBuild2DMipmaps(GL_TEXTURE_2D, image.get_channels(), image.get_width(),
image.get_height(), GL_BGR_EXT, GL_UNSIGNED_BYTE,
image.getLinePtr(0));
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
return true;
}
bool CreateTexturePPM(UINT textureArray[], LPSTR strFileName, int textureID)
{
unsigned char* pixels;
int width, height;
if(read_ppm_file(strFileName, width, height, &pixels)==-1) return false;
glGenTextures(1, &textureArray[textureID]);
glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,width,height,GL_RGB,GL_UNSIGNED_BYTE,pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
return true;
}

View File

@ -67,7 +67,11 @@ extern void mode_unshaded();
extern void mode_lines();
extern void ortho_done();
extern bool get_matrix_invert(float[16]);
extern bool get_matrix(float[16]);
extern bool get_matrix(double src[16]);
extern bool get_projection(double src[16]);
extern bool get_viewport(int view[4]);
extern void get_2d_positions(float p1,float p2,float p3,
double model[16], double proj[16], int viewport[4], double proj_pos[3]);
// draw a progress bar as an opaque cylinder within a translucent cylinder
//
@ -102,7 +106,6 @@ extern int read_ppm(char* name, int& w, int& h, unsigned char** arrayp);
extern int init_texture(char* filename);
extern void draw_texture(float* pos, float* size);
//stars
struct Star
{
@ -113,3 +116,12 @@ struct Star
extern void build_stars();
extern void update_stars();
extern void replaceStar(Star* tmpStar);
#include "jpeglib.h"
#include "bmplib.h"
#define MAX_TEXTURES 16
extern UINT g_Texture[MAX_TEXTURES];
extern bool CreateTextureJPG(UINT textureArray[], LPSTR strFileName, int textureID);
extern bool CreateTextureBMP(UINT textureArray[], LPSTR strFileName, int textureID);
extern bool CreateTexturePPM(UINT textureArray[], LPSTR strFileName, int textureID);
extern tImageJPG *LoadJPG(const char *filename);

View File

@ -504,55 +504,57 @@ void REDUCED_ARRAY::draw_axis_labels()
}
void REDUCED_ARRAY::draw_axes() {
/* box
float adj=-.18f;
// box
mode_unshaded();
glLineWidth(1.0);
glEnable(GL_LINE_SMOOTH);
glLineWidth(.5);
// glEnable(GL_LINE_SMOOTH);
glBegin(GL_LINES);
glColor4d(1,1,1,.9);
glColor4d(1,1,1,.5);
//base square
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
//top square
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
//connecting lines
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1]+draw_size[1], draw_pos[2]+draw_size[2]+adj);
glEnd();
*/
mode_unshaded();
glLineWidth(1.0);
@ -560,7 +562,7 @@ void REDUCED_ARRAY::draw_axes() {
glBegin(GL_LINES);
glColor4d(1,1,1,1);
float adj=-.18f;
glVertex3f(draw_pos[0], draw_pos[1], draw_pos[2]+adj);
glVertex3f(draw_pos[0]+draw_size[0], draw_pos[1], draw_pos[2]+adj);
@ -589,38 +591,71 @@ void REDUCED_ARRAY::draw_axes() {
void REDUCED_ARRAY::draw_labels()
{
float model[16];
double model[16];
double proj[16];
double z_pos[3];
double x_pos[3];
double xzmin_corner[3];
double zmax_corner[3];
double xmax_corner[3];
int viewport[4];
glMatrixMode(GL_MODELVIEW);
get_matrix_invert(model);
// get_matrix(model);
get_matrix(model);
get_projection(proj);
get_viewport(viewport);
float offset = 0;
char* zlabel = "Time(sec)";
char* xlabel = "Frequency(HZ)";
char* zmax = "107.4";
char* zmin = "0";
char* xmax = "9765.620";
char* xmin = "0.0";
float left_of_z = -0.1f;
float left_of_z2 = -0.04f;
float below_x = -.03f;
float center_x = -.06f;
get_2d_positions(draw_pos[0],draw_pos[1],draw_pos[2]+(draw_size[2]/2.0f),
model, proj, viewport,z_pos);
get_2d_positions(draw_pos[0]+draw_size[0]/2.0f,draw_pos[1],draw_pos[2]+draw_size[2],
model, proj, viewport,x_pos);
get_2d_positions(draw_pos[0],draw_pos[1],draw_pos[2]+draw_size[2],
model, proj, viewport,xzmin_corner);
get_2d_positions(draw_pos[0]+draw_size[0],draw_pos[1],draw_pos[2]+draw_size[2],
model, proj, viewport,xmax_corner);
get_2d_positions(draw_pos[0],draw_pos[1],draw_pos[2],
model, proj, viewport,zmax_corner);
mode_ortho();
float w = .05f;
float pos[3];
pos[0]=draw_pos[0]*model[0]+draw_pos[1]*model[4]+draw_pos[2]*model[8];
pos[1]=draw_pos[0]*model[1]+draw_pos[1]*model[5]+draw_pos[2]*model[9];
pos[2]=draw_pos[0]*model[2]+draw_pos[1]*model[6]+draw_pos[2]*model[10];
//convert to 2d space
if(pos[2]>0)
{
pos[0]=pos[0]/pos[2];
pos[1]=pos[1]/pos[2];
pos[2]=1;
}
//scale to [-1,1]
pos[0]=pos[0]/4.0f;
pos[1]=pos[1]/4.0f;
pos[2]=1;
char buf[512];
sprintf(buf,"%f,%f,%f",pos[0],pos[1],pos[2]);
//MessageBox(NULL,buf,"F",0);
mode_unshaded();
glColor3d(1,1,1);
glLineWidth(2);
draw_text_line(pos, w, 2, "Time");
float w=.015f;
float l=1.0f;
mode_unshaded();
glColor3d(1,1,1);
float zpos[3]={(float)z_pos[0]/(float)(viewport[2]) + left_of_z,(float)z_pos[1]/(float)(viewport[3]),(float)z_pos[2]};
float xpos[3]={(float)x_pos[0]/(float)(viewport[2]) + center_x,(float)x_pos[1]/(float)(viewport[3])+below_x,(float)x_pos[2]};
float xminpos[3]={(float)xzmin_corner[0]/(float)(viewport[2]),(float)xzmin_corner[1]/(float)(viewport[3])+below_x,(float)xzmin_corner[2]};
float xmaxpos[3]={(float)xmax_corner[0]/(float)(viewport[2]),(float)xmax_corner[1]/(float)(viewport[3])+below_x,(float)xmax_corner[2]};
float zminpos[3]={(float)xzmin_corner[0]/(float)(viewport[2])+left_of_z2,(float)xzmin_corner[1]/(float)(viewport[3]),(float)xzmin_corner[2]};
float zmaxpos[3]={(float)zmax_corner[0]/(float)(viewport[2])+left_of_z2,(float)zmax_corner[1]/(float)(viewport[3]),(float)zmax_corner[2]};
draw_text_line(zpos, w, l, zlabel);
draw_text_line(xpos, w, l, xlabel);
// draw_text_line(xminpos, w, l, xmin);
// draw_text_line(xmaxpos, w, l, xmax);
// draw_text_line(zminpos, w, l, zmin);
// draw_text_line(zmaxpos, w, l, zmax);
ortho_done();
}

View File

@ -28,13 +28,9 @@ static int current_graphics_mode = MODE_HIDE_GRAPHICS;
static POINT mousePos;
static UINT m_uEndSSMsg;
BOOL win_loop_done;
HDC myhDC;
void SetupPixelFormat(HDC hDC);
unsigned int CreateFont(char *fontName, int fontSize);
void PrintText(unsigned int base, char *string);
void ClearGLFont(unsigned int base);
unsigned int listBase;
BOOL win_loop_done;
extern bool using_opengl;
extern bool standalone;
@ -67,6 +63,8 @@ bool KillWindow() {
return false;
hWnd=NULL; // Set hWnd To NULL
}
app_unload_gl();
return true;
}
@ -111,16 +109,18 @@ void SetMode(int mode) {
WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,
NULL, NULL, hInstance, NULL);
SetForegroundWindow(hWnd);
GetCursorPos(&mousePos);
//
hDC = GetDC(hWnd);
SetupPixelFormat(hDC);
ClearGLFont(listBase);
listBase = CreateFont("Arial", 24);
// hDC = GetDC(hWnd);
// SetupPixelFormat(hDC);
// ClearGLFont(listBase);
// listBase = CreateFont("Arial", 24);
//
/*
PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
@ -144,10 +144,11 @@ void SetMode(int mode) {
};
hDC = GetDC(hWnd);
myhDC=hDC;
int PixelFormat;
PixelFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, PixelFormat, &pfd);
*/
if(!(hRC = wglCreateContext(hDC))) {
ReleaseDC(hWnd, hDC);
@ -332,118 +333,3 @@ BOOL unreg_win_class() {
return TRUE;
}
//my text drawing functions -<oliver wang>-
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of structure.
1, // always 1.
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGl
PFD_DOUBLEBUFFER, // support double buffering
PFD_TYPE_RGBA, // support RGBA
32, // 32 bit color mode
0, 0, 0, 0, 0, 0, // ignore color bits
0, // no alpha buffer
0, // ignore shift bit
0, // no accumulation buffer
0, 0, 0, 0, // ignore accumulation bits.
16, // number of depth buffer bits.
0, // number of stencil buffer bits.
0, // 0 means no auxiliary buffer
PFD_MAIN_PLANE, // The main drawing plane
0, // this is reserved
0, 0, 0 }; // layer masks ignored.
// this chooses the best pixel format and returns index.
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
// This set pixel format to device context.
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
void PrepareWindow()
{
// Always clear the screen and depth buffer then reset modleview matrix.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clears the screen.
glLoadIdentity(); //Reset modelview matrix for new frame.
}
// There is a lot of new code in our render scene function.
void RenderScene()
{
glTranslatef(0.0f, 0.0f, -1.0f);// Move back 1 into the screen.
glColor3f(1.0f, 1.0f, 1.0f); // Set the color of the text.
// This is the X and Y coordinate that the text will be printed at.
glRasterPos2f(-0.35f, 0.1f);
PrintText(listBase, "www.UltimateGameProgramming.com");// The string to print.
// Print second line
glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2f(-0.35f, 0.0f);
PrintText(listBase, "Created by the Programming Ace!");
// Print third line.
glColor3f(0.0f, 1.0f, 0.0f);
glRasterPos2f(-0.35f, -0.1f);
PrintText(listBase, "Order the CD for more great tutorials!");
}
unsigned int CreateFont(char *fontName, int Size)
{
// windows font
HFONT hFont;
unsigned int base;
// Create space for 96 characters.
base = glGenLists(96);
if(stricmp(fontName, "symbol")==0)
{
hFont = CreateFont(Size, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
SYMBOL_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, fontName);
}
else
{
hFont = CreateFont(Size, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY, FF_DONTCARE | DEFAULT_PITCH, fontName);
}
if(!hFont)
return 0;
hDC = GetDC(hWnd);
SelectObject(hDC, hFont);
wglUseFontBitmaps(hDC, 32, 96, base);
return base;
}
void PrintText(unsigned int base, char *string)
{
if((base == 0 || string == NULL))
return;
glPushAttrib(GL_LIST_BIT);
glListBase(base - 32);
glCallLists(strlen(string), GL_UNSIGNED_BYTE, string);
glPopAttrib();
}
void ClearGLFont(unsigned int base)
{
if(base != 0)
glDeleteLists(base, 96);
}