Right…let me show u my code…
=========================================
#include <windows.h> /* Windows Library /
#include <gl\gl.h> / OpenGL Library /
#include <gl\glu.h> / OpenGL Utility Library /
#include <gl\glut.h> / Glut Library /
#include <math.h> / Maths Library */
int down = 0;
int true = 1;
int false = 0;
int brush = 5;
int mx,my = 0;
void line(int x1, int y1, int x2, int y2){
glBegin(GL_LINES);
glColor3f(0.0,0.0,0.0);
glLineWidth(5.0); //set the line width
glVertex2f(x1,y1); //draw point A
glVertex2f(x2,y2); //draw point B
glEnd();
}
void square(int x, int y, int z, float c1, float c2, float c3){ //x and y are top left co-ordinates z is the size and c is the color
glBegin(GL_POLYGON);
glColor3f(c1,c2,c3);
glVertex3f(x,y,0);
glVertex3f(x+z,y,0);
glVertex3f(x+z,y-z,0);
glVertex3f(x,y-z,0);
glEnd();
}
void whitesquare(int x, int y, int z, float c1, float c2, float c3){ //x and y are top left co-ordinates z is the size and c is the color of the perimeter
glBegin(GL_LINE_LOOP);
glColor3f(c1,c2,c3);
glVertex3f(x,y,0);
glVertex3f(x+z,y,0);
glVertex3f(x+z,y-z,0);
glVertex3f(x,y-z,0);
glEnd();
}
void plussquare(int x, int y, int z, float c1, float c2, float c3){ //x and y are top left co-ordinates z is the size and c is the color of the perimeter
glBegin(GL_LINE_LOOP);
glColor3f(c1,c2,c3);
glVertex3f(x,y,0);
glVertex3f(x+z,y,0);
glVertex3f(x+z,y-z,0);
glVertex3f(x,y-z,0);
glEnd();
line(x+(z3/10),y-(z/2),x+(z8/10),y-(z/2)); //this draws the plus sign within an empty square
line(x+5,y-(z8/10),x+5,y-(z2/10));
}
void minussquare(int x, int y, int z, float c1, float c2, float c3){ //x and y are top left co-ordinates z is the size and c is the color of the perimeter
glBegin(GL_LINE_LOOP);
glColor3f(c1,c2,c3);
glVertex3f(x,y,0);
glVertex3f(x+z,y,0);
glVertex3f(x+z,y-z,0);
glVertex3f(x,y-z,0);
glEnd();
line(x+(z3/10),y-(z/2),x+(z8/10),y-(z/2)); //this draws the minus sign within an empty square
}
void circle(int xcentre, int ycentre, float size){
float radius = size;
float angle, angle_increment;
float next_x, next_y;
int i;
angle_increment=(3.14159*2/100);
angle = 0;
glBegin(GL_POLYGON);
for(i=0;i<=100;i++){
angle = angle + angle_increment;
next_x = radius * cos(angle);
next_y = radius * sin(angle);
next_x = next_x + xcentre;
next_y = next_y + ycentre;
glVertex2f(next_x,next_y);
}
glEnd();
}
void mouse(int button, int state, int x, int y){
if(button!=GLUT_LEFT_BUTTON | | state==GLUT_UP)
down=false;
else
down=true;
if(x <= 20 && x >= 10 && (399-y) <= 370 && (400-y) >= 360){
glColor3f(1.0,1.0,1.0);
square(10,10,10,1.0,1.0,1.0);
}else if(x <= 20 && x >= 10 && (399-y) <= 350 && (399-y) >= 340){
glColor3f(1.0,0.0,0.0);
square(10,10,10,1.0,0.0,0.0);
}else if(x <= 20 && x >= 10 && (399-y) <= 330 && (399-y) >= 320){
glColor3f(0.0,1.0,0.0);
square(10,10,10,0.0,1.0,0.0);
}else if(x <= 20 && x >= 10 && (400-y) <= 310 && (399-y) >= 300){
glColor3f(0.0,0.0,1.0);
square(10,10,10,0.0,0.0,1.0);
}else if(x <= 20 && x >= 10 && (400-y) <= 290 && (399-y) >= 280){
brush = brush + 1;
}else if(x <= 20 && x >= 10 && (400-y) <= 270 && (399-y) >= 260){
if(brush>1)
brush = brush - 1;
}else circle(x,399-y,brush);
}
void motion(int x, int y){
if(down==true){
if(x <= 20 && x >= 10 && (399-y) <= 370 && (400-y) >= 360){
glColor3f(1.0,1.0,1.0);
square(10,10,10,1.0,1.0,1.0);
}else if(x <= 20 && x >= 10 && (399-y) <= 350 && (399-y) >= 340){
glColor3f(1.0,0.0,0.0);
square(10,10,10,1.0,0.0,0.0);
}else if(x <= 20 && x >= 10 && (399-y) <= 330 && (399-y) >= 320){
glColor3f(0.0,1.0,0.0);
square(10,10,10,0.0,1.0,0.0);
}else if(x <= 20 && x >= 10 && (400-y) <= 310 && (399-y) >= 300){
glColor3f(0.0,0.0,1.0);
square(10,10,10,0.0,0.0,1.0);
}else if(x <= 20 && x >= 10 && (400-y) <= 290 && (399-y) >= 280){
brush = brush + 1;
}else if(x <= 20 && x >= 10 && (400-y) <= 270 && (399-y) >= 260){
if(brush>1)
brush = brush - 1;
}else circle(x,399-y,brush);
mx=x;
my=y;
}
}
void keyboard(unsigned char key, int x, int y){ //change the size of the brush, clear the display from all drawings and exit the program
if(key==‘c’)
display();
else if(key==27)
exit(0);
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
line(25,0,25,399);
whitesquare(10,370,10,0.0,0.0,0.0);
square(10,350,10,1.0,0.0,0.0);
square(10,330,10,0.0,1.0,0.0);
square(10,310,10,0.0,0.0,1.0);
plussquare(10,290,10,0.0,0.0,0.0);
minussquare(10,270,10,0.0,0.0,0.0);
square(10,10,10,0.0,0.0,1.0); //shows the selected colour at the time
glFlush();
}
//-------------------------------------------------------------------------------------------------------------------------------------
void init(void){
glClearColor(0.5,0.5,0.5,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,399.0,0.0,399.0,-100.0,100.0);
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(200,200);
glutCreateWindow(“Vas’ Paint Program”);
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0 ;
}
=========================================
This is a painting program, one of my first ones, and you can choose some colours to paint with, as well as adjust the size of the brush…
My problem is that when I resize the window, the brush is not where the actual mouse pointer is. I did try to implement the resize function as seen in your tutorial, but I had no luck.
Also, can anyone suggest how to prevent painting over the left hand side of the black line??
The way I tried to calculate it, was to say if the x(where the mouse points) + the radius of the brush is greater than the x co-ordinate of the black line do nothing, else draw…but it still won’t work…ay other way?
Thanks for your help and time…and patience…
Vasilis