Here is what I'm doing:
(The OpenGl stuff isn't encapsulated yet, as I'm just learning it now)
What seems to be missing ?
Here is the main loop:
while(win.isOpen())
{
draw();
win.display();
std::string input;
std::getline(std::cin,input);
std::cout<<shell(input);
win.pushGLStates();
sf::Font font;
font.getDefaultFont();
sf::Text text;
text.setFont(font);
text.setCharacterSize(20);
text.setStyle(sf::Text::Bold);
text.setColor(sf::Color::Black);
text.setPosition(0,0);
text.setString(input);
win.draw(text);
win.popGLStates();
sf::Event eve;
while(win.pollEvent(eve))
{
if(eve.type==sf::Event::Closed)
win.close();
}
}
And the rest of the main.cpp file, (though everything other than the text gets drawn fine).
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Text.hpp>
#include <GL/glew.h>
#include <iostream>
#include "shader.h"
#include "program.h"
#include "logostate.h"
#include "shell.h"
void setup();
void draw();
namespace global
{
GLuint trail_vao,turtle_vao,trail_vbo,turtle_vbo;
mm::Program* turtle_prog,*trail_prog;
GLint col_ul,theta_ul;
mm::LogoState turtle;
}
using namespace global;
void GlewInit()
{
GLenum err = glewInit();
if (GLEW_OK != err)
std::cerr<<"Error "<<glewGetErrorString(err);
}
int main()
{
sf::RenderWindow win(sf::VideoMode(600,600,32),"Logo");
GlewInit();
setup();
mm::Shell shell(&turtle);
while(win.isOpen())
{
draw();
win.display();
std::string input;
std::getline(std::cin,input);
std::cout<<shell(input);
win.pushGLStates();
sf::Font font;
font.getDefaultFont();
sf::Text text;
text.setFont(font);
text.setCharacterSize(20);
text.setStyle(sf::Text::Bold);
text.setColor(sf::Color::Black);
text.setPosition(0,0);
text.setString(input);
win.draw(text);
win.popGLStates();
sf::Event eve;
while(win.pollEvent(eve))
{
if(eve.type==sf::Event::Closed)
win.close();
}
}
return 0;
}
void setup()
{
turtle_prog = new mm::Program
(
{
mm::Shader(GL_VERTEX_SHADER,"turtle.vert"),
mm::Shader(GL_FRAGMENT_SHADER,"turtle.frag")
}
);
trail_prog = new mm::Program
(
{
mm::Shader(GL_VERTEX_SHADER,"trail.vert"),
mm::Shader(GL_FRAGMENT_SHADER,"trail.frag")
}
);
glGenVertexArrays(1,&trail_vao);
glBindVertexArray(trail_vao);
glGenBuffers(1,&trail_vbo);
glBindBuffer(GL_ARRAY_BUFFER,trail_vbo);
glBufferData(GL_ARRAY_BUFFER,turtle.vdata.size()*sizeof(float),turtle.vdata.data(),GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
glGenVertexArrays(1,&turtle_vao);
glBindVertexArray(turtle_vao);
glGenBuffers(1,&turtle_vbo);
glBindBuffer(GL_ARRAY_BUFFER,turtle_vbo);
glBufferData(GL_ARRAY_BUFFER,6*sizeof(float),turtle.turtle(),GL_DYNAMIC_DRAW);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
}
void draw()
{
float* x=turtle.bgColor();
glClearColor(x[0],x[1],x[2],x[3]);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(trail_prog->getHandle());
float *y = turtle.penColor();
col_ul = glGetUniformLocation(trail_prog->getHandle(),"col");
glUniform4fv(col_ul,1,y);
glBindVertexArray(trail_vao);
glBindBuffer(GL_ARRAY_BUFFER,trail_vbo);
glBufferData(GL_ARRAY_BUFFER,turtle.vdata.size()*sizeof(float),turtle.vdata.data(),GL_DYNAMIC_DRAW);
glDrawArrays(GL_LINE_STRIP,0,turtle.vdata.size()/2);
glUseProgram(0);
glUseProgram(turtle_prog->getHandle());
glBindVertexArray(turtle_vao);
glBindBuffer(GL_ARRAY_BUFFER,turtle_vbo);
glBufferData(GL_ARRAY_BUFFER,6*sizeof(float),turtle.turtle(),GL_DYNAMIC_DRAW);
glDrawArrays(GL_TRIANGLES,0,3);
glUseProgram(0);
}
The ultimate goal here is to get rid of iostream totally and get the input using sf::Event and mirrorring the input to the window in realtime. So, if there is a shortcut to that, please point me to that instead.