Programação com OpenGL/Classe GLXWindow: diferenças entre revisões

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 6:
 
A estrutura da classe SimpleGLXWindow é muito parecido com uma Win32 Api. Este classe herda a classe BOGLGPWindow e então implementa os métodos virtuais. Mostraremos as definições da classe:
<sourcesyntaxhighlight lang="cpp">
class SimpleGLXWindow : public BOGLGPWindow
{
Linha 52:
MouseInterface* m_mouse;
};
</syntaxhighlight>
</source>
 
== Criação da Janela ==
Linha 58:
A parte mais importante e complicado de uma classe de janela é código que cria a janela OpenGL, A primeira coisa que pegaremos uma manipulador(handle) de tela usando <code>XopenDisplay</code>, que passaremos o valor zero(ou NULL) isto vai pegar qualquer display, que é configurado no ambiente de variável de DISPLAY( que normalmente é que você esta usando para ver sua Area de trabalho!)
 
<sourcesyntaxhighlight lang="cpp">
m_display = XOpenDisplay(0); //Open default display
if (m_display == NULL)
Linha 65:
return false;
}
</syntaxhighlight>
</source>
 
Assim, tornamos ela o padrão da tela, e se haver algum erro não registrado é retornado falso para indicar um erro na criação da janela. Depois, nós pegaremos um manipulador que identificara o padrão de exibição na tela.
 
<sourcesyntaxhighlight lang="cpp">
m_screenID = DefaultScreen(m_display); //Get the default screen id
</syntaxhighlight>
</source>
 
Agora vamos pegar uma lista de modos de tela disponíveis, e veremos se algum é o que queremos. se não teremos que recorrer a um erro:
<sourcesyntaxhighlight lang="cpp">
XF86VidModeModeInfo **modes;
if (!XF86VidModeGetAllModeLines(m_display, m_screenID, &modeNum, &modes))
Linha 97:
return false;
}
</syntaxhighlight>
</source>
 
Depois, nós guardaremos o modo de tela que melhor combina, nós pediremos um double buffer de janela com 16 bit depthbuffer:
<sourcesyntaxhighlight lang="cpp">
int doubleBufferedAttribList [] = {
GLX_RGBA, GLX_DOUBLEBUFFER,
Linha 119:
return false;
}
</syntaxhighlight>
</source>
 
O próximo passo é a criação de um contexto OpenGL 2.1, assim possamos em vez de solicitar uma GL3. Estes são alguns passos que temos que dar em janelas:
<sourcesyntaxhighlight lang="cpp">
//Create a GL 2.1 context
GLXContext gl2Context = glXCreateContext(m_display, vi, 0, GL_TRUE);
Linha 155:
m_GL3Supported = true;
}
</syntaxhighlight>
</source>
 
Se o OpenGL 3.0 não for suportados, nós vamos setar uma flag assim podemos usar um substituto com shader 2.1
 
Agora nós temos informaçãoes suficentes para criar uma janela, lembre que nós guardaremos o melhor modo de tela que podemos encontrar? Usamos essa abaixo depois de configurar algumas definições de configuração da janela:
<sourcesyntaxhighlight lang="cpp">
Colormap cmap = XCreateColormap(m_display, RootWindow(m_display, vi->screen),vi->visual, AllocNone);
m_XSetAttr.colormap = cmap;
Linha 183:
0, 0, width, height, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &m_XSetAttr);
</syntaxhighlight>
</source>
 
Finalmente, vamos colocar um titulo na janela, e se estiver em tela cheia colocaremos um cursor:
<sourcesyntaxhighlight lang="cpp">
if (fullscreen)
{
Linha 207:
XFree(modes);
</syntaxhighlight>
</source>
 
Na ultima linha acima libera a memoria para os modos de tela que nós encontramos por ultimo.
Linha 214:
 
É muito simples aqui está o código:
<sourcesyntaxhighlight lang="cpp">
void SimpleGLXWindow::destroy()
{
Linha 233:
XCloseDisplay(m_display);
}
</syntaxhighlight>
</source>
 
Basicamente nós garantimos que o cursos está visível,depois nós destruímos o contexto OpenGL e finalmente voltamos a modo de tela que esta antes. Nós liberamos nosso manipulador na tela e destruímos complemente a janela.