Hi
Am a student started with openGL programming recently in Linux.I find this code telling me to include GLaux library whenever I compile it.I tried adding the library file in my home directory but still doesnt work.Can anyone suggest me how to make it working.When i went on into some stuffs i found i need Dyalog APL/W Version 8.1 to make my GLaux working.Kindly Guide.Or can I use some other texture loading techniques??
By the way this is the code for Simulating a fountain.
#include <GL\glut.h> //includes gl.h and glu.h
#include <GL\glaux.h> //load the texture
#include <stdlib.h> //random function
#include <math.h> //sine and cosine functions
#define PI 3.1415265359
#define RandomFactor 2.0 //cannot be variable, because it is only use in InitFountain(),
//zero for perfect physical
GLint ListNum; //The number of the diplay list
GLfloat OuterRadius = 1.2;
GLfloat InnerRadius = 1.0;
GLint NumOfVerticesStone = 32; //only a quarter of the finally used vertices
GLfloat StoneHeight = 0.5;
GLfloat WaterHeight = 0.45;
GLint Turned = 0;
bool DoTurn = true;
bool DoMoveUp = true;
bool DoUpdateScene = true;
GLfloat MoveUp = 0.8;
GLfloat ChangeMoveUp = 0.01;
//The variables for the fountain are below
struct SVertex
{
GLfloat x,y,z;
};
//It's not the best style to put classes into the main file,
//but here it is easier for you and me!
class CDrop
{
private:
GLfloat time; //How many steps the drop was "outside", when it falls into the water, time is set back to 0
SVertex ConstantSpeed; //See the doc for explanation of the physics
GLfloat AccFactor;
public:
void SetConstantSpeed (SVertex NewSpeed);
void SetAccFactor(GLfloat NewAccFactor);
void SetTime(GLfloat NewTime);
void GetNewPosition(SVertex * PositionVertex); //increments time, gets the new position
};
void CDrop::SetConstantSpeed(SVertex NewSpeed)
{
ConstantSpeed = NewSpeed;
}
void CDrop::SetAccFactor (GLfloat NewAccFactor)
{
AccFactor = NewAccFactor;
}
void CDrop::SetTime(GLfloat NewTime)
{
time = NewTime;
}
void CDrop::GetNewPosition(SVertex * PositionVertex)
{
SVertex Position;
time += 1.0;
Position.x = ConstantSpeed.x * time;
Position.y = ConstantSpeed.y * time - AccFactor * time * time;
Position.z = ConstantSpeed.z * time;
PositionVertex->x = Position.x;
PositionVertex->y = Position.y + WaterHeight;
PositionVertex->z = Position.z;
if (Position.y < 0.0)
{
/*the drop has fallen into the water. The problem is now, that we cannot
set time to 0.0, because if there are more "DropsPerRay" than "TimeNeeded" (See InitFountain())
several drops would be seen as one. Check it out.
*/
time = time - int(time);
if (time > 0.0) time -= 1.0;
}
}
CDrop * FountainDrops;
SVertex * FountainVertices;
GLint Steps = 3; //a fountain has several steps, each with its own height
GLint RaysPerStep = 8;
GLint DropsPerRay = 50;
GLfloat DropsComplete = Steps * RaysPerStep * DropsPerRay;
GLfloat AngleOfDeepestStep = 80;
GLfloat AccFactor = 0.011;
////////////////////////////////////////////////////////////////////////////////
void CreateList(void)
{
GLuint ID;
_AUX_RGBImageRec *Image;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1,&ID);
glBindTexture( GL_TEXTURE_2D, ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
Image = auxDIBImageLoadA( "water.bmp" );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3,
Image->sizeX,
Image->sizeY,
GL_RGB,
GL_UNSIGNED_BYTE,
Image->data);
delete Image;
SVertex * Vertices = new SVertex[NumOfVerticesStone*4]; //allocate mem for the required vertices
ListNum = glGenLists(1);
for (GLint i = 0; i<NumOfVerticesStone; i++)
{
Vertices.x = cos(2.0 * PI / NumOfVerticesStone * i) * OuterRadius;
Vertices.y = StoneHeight; //Top
Vertices.z = sin(2.0 * PI / NumOfVerticesStone * i) * OuterRadius;
}
for (i = 0; i<NumOfVerticesStone; i++)
{
Vertices.x = cos(2.0 * PI / NumOfVerticesStone * i) * InnerRadius;
Vertices.y = StoneHeight; //Top
Vertices.z = sin(2.0 * PI / NumOfVerticesStone * i) * InnerRadius;
}
for (i = 0; i<NumOfVerticesStone; i++)
{
Vertices.x = cos(2.0 * PI / NumOfVerticesStone * i) * OuterRadius;
Vertices.y = 0.0; //Bottom
Vertices.z = sin(2.0 * PI / NumOfVerticesStone * i) * OuterRadius;
}
for (i = 0; i<NumOfVerticesStone; i++)
{
Vertices.x = cos(2.0 * PI / NumOfVerticesStone * i) * InnerRadius;
Vertices.y = 0.0; //Bottom
Vertices.z = sin(2.0 * PI / NumOfVerticesStone * i) * InnerRadius;
}
glNewList(ListNum, GL_COMPILE);
glBegin(GL_QUADS);
//ground quad:
glColor3f(0.6,0.6,0.6);
glVertex3f(-OuterRadius*1.3,0.0,OuterRadius*1.3);
glVertex3f(-OuterRadius*1.3,0.0,-OuterRadius*1.3);
glVertex3f(OuterRadius*1.3,0.0,-OuterRadius*1.3);
glVertex3f(OuterRadius*1.3,0.0,OuterRadius*1.3);
//stone:
for (int j = 1; j < 3; j++)
{
if (j == 1) glColor3f(0.8,0.4,0.4);
if (j == 2) glColor3f(0.4,0.2,0.2);
for (i = 0; i<NumOfVerticesStone-1; i++)
{
glVertex3fv(&Vertices[i+NumOfVerticesStone*j].x);
glVertex3fv(&Vertices<span style="font-weight:bold;">.x);
glVertex3fv(&Vertices[i+1].x);
glVertex3fv(&Vertices[i+NumOfVerticesStone*j+1].x);
}
glVertex3fv(&Vertices[i+NumOfVerticesStone*j].x);
glVertex3fv(&Vertices<span style="font-weight:bold;">.x);
glVertex3fv(&Vertices[0].x);
glVertex3fv(&Vertices[NumOfVerticesStone*j].x);
}
glColor3f(0.4,0.2,0.2);
for (i = 0; i<NumOfVerticesStone-1; i++)
{
glVertex3fv(&Vertices[i+NumOfVerticesStone*3].x);
glVertex3fv(&Vertices[i+NumOfVerticesStone].x);
glVertex3fv(&Vertices[i+NumOfVerticesStone+1].x);
glVertex3fv(&Vertices[i+NumOfVerticesStone*3+1].x);
}
glVertex3fv(&Vertices[i+NumOfVerticesStone*3].x);
glVertex3fv(&Vertices[i+NumOfVerticesStone].x);
glVertex3fv(&Vertices[NumOfVerticesStone].x);
glVertex3fv(&Vertices[NumOfVerticesStone*3].x);
glEnd();
//The "water":
glTranslatef(0.0,WaterHeight - StoneHeight, 0.0);
glBindTexture(GL_TEXTURE_2D, ID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_POLYGON);
for (i = 0; i<NumOfVerticesStone; i++)
{
glTexCoord2f( 0.5+cos(i/GLfloat(NumOfVerticesStone)*360.0*PI/180.0)/2.0,
0.5-sin(i/GLfloat(NumOfVerticesStone)*360.0*PI/180.0)/2.0);
glVertex3fv(&Vertices[i+NumOfVerticesStone].x);
}
glEnd();
glDisable(GL_TEXTURE_2D);
glEndList();
}
GLfloat GetRandomFloat(GLfloat range)
{
return (GLfloat)rand() / (GLfloat)RAND_MAX * range * RandomFactor;
}
void InitFountain(void)
{
//This function needn't be and isn't speed optimized
FountainDrops = new CDrop [ DropsComplete ];
FountainVertices = new SVertex [ DropsComplete ];
SVertex NewSpeed;
GLfloat DropAccFactor; //different from AccFactor because of the random change
GLfloat TimeNeeded;
GLfloat StepAngle; //Angle, which the ray gets out of the fountain with
GLfloat RayAngle; //Angle you see when you look down on the fountain
GLint i,j,k;
for (k = 0; k <Steps; k++)
{
for (j = 0; j < RaysPerStep; j++)
{
for (i = 0; i < DropsPerRay; i++)
{
DropAccFactor = AccFactor + GetRandomFloat(0.0005);
StepAngle = AngleOfDeepestStep + (90.0-AngleOfDeepestStep)
* GLfloat(k) / (Steps-1) + GetRandomFloat(0.2+0.8*(Steps-k-1)/(Steps-1));
//This is the speed caused by the step:
NewSpeed.x = cos ( StepAngle * PI / 180.0) * (0.2+0.04*k);
NewSpeed.y = sin ( StepAngle * PI / 180.0) * (0.2+0.04*k);
//This is the speed caused by the ray:
RayAngle = (GLfloat)j / (GLfloat)RaysPerStep * 360.0;
//for the next computations "NewSpeed.x" is the radius. Care! Dont swap the two
//lines, because the second one changes NewSpeed.x!
NewSpeed.z = NewSpeed.x * sin ( RayAngle * PI /180.0);
NewSpeed.x = NewSpeed.x * cos ( RayAngle * PI /180.0);
//Calculate how many steps are required, that a drop comes out and falls down again
TimeNeeded = NewSpeed.y/ DropAccFactor;
FountainDrops[i+j*DropsPerRay+k*DropsPerRay*RaysPerStep].SetConstantSpeed ( NewSpeed );
FountainDrops[i+j*DropsPerRay+k*DropsPerRay*RaysPerStep].SetAccFactor (DropAccFactor);
FountainDrops[i+j*DropsPerRay+k*DropsPerRay*RaysPerStep].SetTime(TimeNeeded * i / DropsPerRay);
}
}
}
//Tell OGL that we'll use the vertex array function
glEnableClientState(GL_VERTEX_ARRAY);
//Pass the date position
glVertexPointer( 3, //x,y,z-components
GL_FLOAT, //data type of SVertex
0, //the vertices are tightly packed
FountainVertices);
}
void DrawFountain(void)
{
glColor4f(0.8,0.8,0.8,0.8);
if (DoUpdateScene)
for (int i = 0; i < DropsComplete; i++)
{
FountainDrops<span style="font-weight:bold;">.GetNewPosition(&FountainVertices<span style="font-weight:bold;">);
}
glDrawArrays( GL_POINTS,
0,
DropsComplete);
}
void Display(void)
{
if (DoTurn) Turned += 2;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //Load a new modelview matrix -> we can apply new transformations
glTranslatef(0.0,0.0,-5.0);
//glRotatef(90.0,1.0,0.0,0.0); //Enable this line to look down on the fountain
glRotatef((GLfloat)Turned,0.0,1.0,0.0);
if (DoMoveUp)
{
MoveUp += ChangeMoveUp;
if (MoveUp>= 1.5 || MoveUp<=0.8) ChangeMoveUp = -ChangeMoveUp;
}
glTranslatef(0.0,-MoveUp,0.0);
glPushMatrix();
glCallList(ListNum);
glPopMatrix();
DrawFountain();
glFlush(); //Finish rendering
glutSwapBuffers(); //Swap the buffers ->make the result of rendering visible
}
void Reshape(int x, int y)
{
if (y == 0 || x == 0) return; //Nothing is visible then, so return
//Set a new projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//Angle of view:40 degrees
//Near clipping plane distance: 0.5
//Far clipping plane distance: 20.0
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y); //Use the whole window for rendering
//Adjust point size to window size
glPointSize(GLfloat(x)/200.0);
}
void KeyDown(unsigned char key, int x, int y)
{
switch(key)
{
case 27: //ESC
exit(0);
break;
case 't':
DoTurn = !DoTurn;
break;
case 'm':
DoMoveUp = !DoMoveUp;
break;
case 'u':
DoUpdateScene = !DoUpdateScene;
break;
}
}
int main(int argc, char **argv)
{
//Initialize GLUT
glutInit(&argc, argv);
//Lets use doublebuffering, RGB(A)-mode and a depth buffer
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(300,300);
//Create a window with rendering context and everything else we need
glutCreateWindow("Fountain");
//Init some state variables:
glEnable(GL_DEPTH_TEST);
glClearColor(0.1,0.1,0.1,0.0);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //also try GL_LINE
//Init the foundtain
InitFountain();
//Create the display list
CreateList();
//Assign the event-handling routines
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(KeyDown);
glutIdleFunc(Display); //If there is no msg, we have to repaint
//Let GLUT get the msgs and tell us the ones we need
glutMainLoop();
return 0;
}
Thanks in advance.
Wow, thats really gay, you posted all your code. You could have at least posted with a code tag.
At any point, what is the error? What is the compiler telling you? Did you include glaux.lib to your project?
At any point, what is the error? What is the compiler telling you? Did you include glaux.lib to your project?
Ya i did include the Glaux Library but is still not working.It says that file or directory named <GL/glaux.h> doesnot exist.It included the library file in my home directory .It doesnot work.Is there a alternative to make the aux methods work other than GLaux.
By the way it is not gay ,it is gayu (should be pronounced as Gha-u) ,name of a goddess in Hindu religion.
By the way it is not gay ,it is gayu (should be pronounced as Gha-u) ,name of a goddess in Hindu religion.
forget glaux it is a crappy and outdated library.
goto nehe website, they have glaux replacement that you may find better ;-)
better yet try using a library like devil or freeimage.
There is actually alot of code on the web to load in simple bmp and other format's too, fire up google and you will be amazed at what you will find
goto nehe website, they have glaux replacement that you may find better ;-)
better yet try using a library like devil or freeimage.
There is actually alot of code on the web to load in simple bmp and other format's too, fire up google and you will be amazed at what you will find
I used glaux and thought it was fine.
So I suggest you download glaux.h if you havent already....... and just put it in your project directory and use:
#include "gl/glaux.h"
Sometimes its a pain finding your compilers include directory. You either don't have the file, or never copied it to your compiler directory.
So I suggest you download glaux.h if you havent already....... and just put it in your project directory and use:
#include "gl/glaux.h"
Sometimes its a pain finding your compilers include directory. You either don't have the file, or never copied it to your compiler directory.
i just noticed u r using linux,there ain't no glaux under linux. Check the texture loading tutorial on nehe as there is a linux port there.
So will it be fine with Windows if not Linux.And I couldnot find a Link to download GLaux.h and its dll.
Thanks a lot for that link...It helps me in progressing in my work..Can u plz tell me wat kind of error is this..Is it something related to the linkers??
C:\Dev-Cpp\Makefile.win [Build Error] [Final.exe] Error1.
I use the following Linkers -lglut32 -lglu32 -lopengl32 -lwinmm -lgdii32.What more should I add..?
Thanks for the support..
C:\Dev-Cpp\Makefile.win [Build Error] [Final.exe] Error1.
I use the following Linkers -lglut32 -lglu32 -lopengl32 -lwinmm -lgdii32.What more should I add..?
Thanks for the support..
Ok theres this nice thing in DevC++:
Tools->check For updates
Select devpaks.org for the server
Select opengl for the groups
You will see "glaux". Download that and everything should run fine. Go to your linker and below everything else type "-glaux"
Tools->check For updates
Select devpaks.org for the server
Select opengl for the groups
You will see "glaux". Download that and everything should run fine. Go to your linker and below everything else type "-glaux"
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement