Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2010, 17:06   #1
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию glut, linux и мыша

Значит, написал я простенькое приложение с использованием glut...
Инструментарий:
vim, g++, make
Библиотеки:
Все не помню, но примерно:
libgl-mesa libglut-mesa, libglu-mesa плюс их дев'ки
код:
Код:
#ifdef WIN32 //if using windows then do windows specific stuff.
#define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h witch can cause slowness
#define WIN32_EXTRA_LEAN

#include <windows.h>
#endif

#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glu.h>

void setup()
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(0.0f, 0.0f, 0.0f);
	glBegin(GL_QUADS);
		glVertex2f(0.5f, 0.5f); 
		glVertex2f(-0.5f, 0.5f); 
		glVertex2f(-0.5f, -0.5f); 
		glVertex2f(0.5f, -0.5f); 
	glEnd();
	glutSwapBuffers();
}

int main(int argc, char *argv[])
{
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
       glutInitWindowSize(800,600);
       glutCreateWindow("Quad");

       setup();
       glutDisplayFunc(display);

       glutMainLoop();

       return 0;
}
Рисовать просто в программе не интересно, хочу научиться для начала точки ставить мышью, дальше и рисовать в окне...
Я, думаю разберусь, но не знаю куда копать насчёт мыши... Как работать с мышью в таких окнах? Где почитать, статьи, или скажите хоть примерно, как мышь обрабатывать? Какие либы может ещё нужны?

Последний раз редактировалось Kill-All-N-Thrash; 07.10.2010 в 17:18.
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 07.10.2010, 20:02   #2
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

У глута есть такие вот возможности обрабатывать события:
Код:
void main(...){
...
glutMouseFunc(mouse);
glutMotionFunc(mouseMotion);
...
end;

void mouseMotion(int x, int y){
	///вызывается при движении указателя
}

void mouse(int button, int state, int x, int y){
           // вызывается при нажатии
	if(button==GLUT_RIGHT_BUTTON && state==GLUT_DOWN){...}
	if(button == GLUT_LEFT_BUTTON && state == GLUT_UP){...}
	
}
blob вне форума Ответить с цитированием
Старый 07.10.2010, 20:07   #3
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

Спасибо! Я правильно понимаю, int x, int y поставляются глутом? То-есть, автоматически устанавливаются?
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 08.10.2010, 10:46   #4
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

правильно. в них уже хранятся необходимые данные положения указателя на момент вызова
blob вне форума Ответить с цитированием
Старый 08.10.2010, 19:49   #5
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

Не ставит точки... хотя компилит и запускает... что сделать ещё нужно?

Код:
#ifdef WIN32 //if using windows then do windows specific stuff.
#define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h witch can cause slowness
#define WIN32_EXTRA_LEAN

#include <windows.h>
#endif

#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glu.h>

void setup()
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_QUADS);
        glVertex2f(0.4f, 0.5f); 
        glVertex2f(-0.5f, 0.5f); 
        glVertex2f(-0.5f, -0.5f); 
        glVertex2f(0.5f, -0.5f); 
    glEnd();
    glutSwapBuffers();
}

void reSize(int w, int h)
{
    if(h==0)
        h = 1;
    float ratio = 1.0*w/h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0,w, h);
    gluPerspective(45, ratio, 1, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,0.0,5.0,
              0.0,0.0,-1.0,
              0.0f,1.0f,0.0f);
}


void mouseFunc(int button, int state, int x, int y)
{

    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {
        glColor3f(0.0f, 0.0f, 0.0f);
        glBegin(GL_POINTS);
            glVertex2f((GLfloat)x, (GLfloat)y);
        glEnd();
        glutSwapBuffers();
    }
}

int main(int argc, char *argv[])
{
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
       glutInitWindowSize(800,600);
       glutCreateWindow("Holy Crap");

       setup();
       glutDisplayFunc(display);
       glutReshapeFunc(reSize);    
       glutMouseFunc(mouseFunc);
       glutMainLoop();

       return 0;
}
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 08.10.2010, 21:59   #6
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Не... прорисовка сцены идёт в display().. Если ты хочешь ставить точки, то тебе нужно, скажем, в дисплее рисовать массив точек, который будет формироваться в mouseFunc.
blob вне форума Ответить с цитированием
Старый 08.10.2010, 22:39   #7
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

Не, я тут понял, что я идиот))) Точки рисуются, если вручную прописать, просто там разница в системе координат))) В маус передаются координаты в пикселях от верхнего левого угла (или от нижнего... надо точно глянуть), а в гл'е от центра, и с другим масштабом.... короче пошёл разбираться с этим делом)))
Кстати, я для начала это всё под xlib перепишу-ка... для опыта.
Щас по этому вот разбираю:
http://www.opengl.org/wiki/Programmi...:_GLX_and_Xlib

Последний раз редактировалось Kill-All-N-Thrash; 08.10.2010 в 22:42.
Kill-All-N-Thrash вне форума Ответить с цитированием
Старый 09.10.2010, 00:04   #8
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Да... в маус вроде от нижнего, а вот точки в сцене не обязательно от центра. Всё зависит от матрицы вида. Ты можешь камеру перевернуть так, что начало координат вообще будет за спиной Основная сложность гл'а именно в матрице вида, в том, что перемещается начало координат, а не объект
blob вне форума Ответить с цитированием
Старый 09.10.2010, 00:12   #9
Kill-All-N-Thrash
Пользователь
 
Аватар для Kill-All-N-Thrash
 
Регистрация: 28.07.2010
Сообщений: 43
По умолчанию

Ну как-бы, да. Сейчас читаю про это...
Кстати, генерик под xlib: (может кому сгодится...)
Код:
#include<stdio.h>
#include<stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
#include<GL/glu.h>

// Global Variables
Display                    *dpy;
Window                    root;
GLint                    att[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
XVisualInfo                *vi;
Colormap                cmap;
XSetWindowAttributes    swa;
Window                    win;
GLXContext                glc;
XWindowAttributes        gwa;
XEvent                    xev;

void DrawAQuad()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1., 1., -1., 1., 1., 20.);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.);

    glBegin(GL_QUADS);
        glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.);
        glColor3f(0., 1., 0.); glVertex3f(.75, -.75, 0.);
        glColor3f(0., 0., 1.); glVertex3f(.75, .75, 0.);
        glColor3f(1., 1., 0.); glVertex3f(-.75, .75, 0.);
    glEnd();
}

int main(int argc, char *argv[])
{
    dpy = XOpenDisplay(NULL);
    if(dpy == NULL)
    {
        printf("\n\tcannot connect to X server\n\n");
        exit(0);
    }
    root = DefaultRootWindow(dpy);
    vi = glXChooseVisual(dpy, 0, att);

    if(vi == NULL)
    {
        printf("\n\tno appropriate visual found\n\n");
        exit(0);
    } else
    {
        printf("\n\tvisual %p selected\n", vi->visualid);
    }

    cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);

    swa.colormap = cmap;
    swa.event_mask = ExposureMask | KeyPressMask;

    win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);

    XMapWindow(dpy, win);
    XStoreName(dpy, win, "Very Simple Application");

    glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
    glXMakeCurrent(dpy, win, glc);

    glEnable(GL_DEPTH_TEST);

    while(1)
    {
        XNextEvent(dpy, &xev);
    
        if(xev.type == Expose)
        {
            XGetWindowAttributes(dpy, win, &gwa);
            glViewport(0, 0, gwa.width, gwa.height);
            DrawAQuad();
            glXSwapBuffers(dpy, win);
        } else if(xev.type == KeyPress)
        {
            glXMakeCurrent(dpy, None, NULL);
            glXDestroyContext(dpy, glc);
            XDestroyWindow(dpy, win);
            XCloseDisplay(dpy);
            exit(0);
        }
    }
    return 0;
}
... и Makefile на всякий...
Код:
gl: gl.cpp
    g++ -o gl gl.cpp -lX11 -lglut -lGLU

clean:
    rm -f *.o *.a gl
Kill-All-N-Thrash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dev-cpp и glut.h Izbassar Общие вопросы C/C++ 0 26.06.2010 20:02
Инициализация Glut windzor Общие вопросы .NET 2 07.02.2010 12:17
MinGW + библиотека GLUT Darth.Vader Общие вопросы C/C++ 5 11.01.2010 15:25
изменение цвета Panel при наведении мыша Kashp Компоненты Delphi 8 08.09.2007 10:18