fixed font resize ugly appearance

This commit is contained in:
Anselme 2016-12-04 16:15:03 +01:00
parent 2e4af8852d
commit 01e901a0c8
6 changed files with 22 additions and 23 deletions

View File

@ -24,7 +24,7 @@ SparrowShell::SparrowShell(sf::Window* window, Input* input):
sf::Vector2u size = m_window->getSize(); sf::Vector2u size = m_window->getSize();
m_dimension = glm::ivec2(size.x,size.y/2); m_dimension = glm::ivec2(size.x,size.y/2);
Mesh* mesh = new Mesh(); Mesh* mesh = new Mesh();
m_buffer.setFontSize(12.f); m_buffer.setFontSize(16.f);
mesh->addRectangle2D(m_position,m_dimension); mesh->addRectangle2D(m_position,m_dimension);
PhongMaterial *mat = new PhongMaterial(); PhongMaterial *mat = new PhongMaterial();
mat->diffuse = glm::vec3(0.1,0.1,0.1); mat->diffuse = glm::vec3(0.1,0.1,0.1);

View File

@ -40,6 +40,8 @@ private:
SceneNode* operator[](int i){return m_children[(m_zero_offset+i)%m_max_size];} SceneNode* operator[](int i){return m_children[(m_zero_offset+i)%m_max_size];}
void push(TextNode*); void push(TextNode*);
unsigned int size(){return m_children.size();} unsigned int size(){return m_children.size();}
// if this font_size is scaling down, sizes which are power of 2 render better.
void setFontSize(float font_size){m_font_size = font_size;} void setFontSize(float font_size){m_font_size = font_size;}
float getFontSize(){return m_font_size;} float getFontSize(){return m_font_size;}
}; };

View File

@ -62,7 +62,7 @@ int main(){
// utils::rotate2D(mnode, glm::vec2(10,10),0.5); // utils::rotate2D(mnode, glm::vec2(10,10),0.5);
// scene.addObject(scene.getRootObject(),mnode); // scene.addObject(scene.getRootObject(),mnode);
tnode = fonte_des_neiges->getTextNode("Such Text", glm::vec3(0.7, 0.4, 0.2),12.f); tnode = fonte_des_neiges->getTextNode("Such Text", glm::vec3(0.7, 0.4, 0.2), 32.f);
utils::setPosition2D((MeshNode*)tnode,glm::vec2(200, 170)); utils::setPosition2D((MeshNode*)tnode,glm::vec2(200, 170));
utils::rotate2D((MeshNode*)tnode, glm::vec2(0),-0.5); utils::rotate2D((MeshNode*)tnode, glm::vec2(0),-0.5);

View File

@ -12,27 +12,24 @@ TextNode* Font::getTextNode(std::string s, glm::vec3 color, float font_size)
{ {
Mesh* textmesh = new Mesh(); Mesh* textmesh = new Mesh();
glm::vec2 current_pos; glm::vec2 current_pos(0.f);
float sizeRatio = font_size / m_defaultLineHeight; float sizeRatio = font_size / m_defaultLineHeight;
for(char c : s){ for(char c : s){
if(c == '\n') if(c == '\n')
{ {
current_pos.x = 0; // left alignment -> TODO : be able to center or align right current_pos.x = 0.f; // left alignment -> TODO : be able to center or align right
current_pos.y += m_defaultLineHeight; current_pos.y += m_defaultLineHeight;
} }
else else
{ {
CharInfo charInfo = m_charTable[c]; CharInfo charInfo = m_charTable[c];
textmesh->addRectangle2D((current_pos + charInfo.offset)* sizeRatio,
glm::vec2 font_offset = glm::vec2(charInfo.offset) * sizeRatio;
textmesh->addRectangle2D((current_pos + font_offset)* sizeRatio,
charInfo.dim * sizeRatio, charInfo.dim * sizeRatio,
charInfo.pos/m_scale, charInfo.pos * m_scale,
charInfo.dim/m_scale charInfo.dim * m_scale
); );
current_pos.x += (charInfo.xadvance); current_pos.x += charInfo.xadvance;
} }
} }
PhongMaterial *mat = new PhongMaterial(); PhongMaterial *mat = new PhongMaterial();

View File

@ -24,14 +24,14 @@ public:
void setName(std::string name){m_name = name;} void setName(std::string name){m_name = name;}
void addCharInfo(wchar_t character, CharInfo character_info){ m_charTable[character] = character_info; } void addCharInfo(wchar_t character, CharInfo character_info){ m_charTable[character] = character_info; }
void setNbChar(int nbchar){m_nbChar =nbchar;} void setNbChar(int nbchar){m_nbChar =nbchar;}
void setLineHeight(int line_h){m_defaultLineHeight = line_h;} void setLineHeight(float line_h){m_defaultLineHeight = line_h;}
int getLineHeight(){return m_defaultLineHeight;} float getLineHeight(){return m_defaultLineHeight;}
void setBase(int base){m_base = base;} void setBase(float base){m_base = base;}
void setAntiAnliasing(bool antialiasing){m_antiAliasing = antialiasing;} void setAntiAnliasing(bool antialiasing){m_antiAliasing = antialiasing;}
void setScale(glm::vec2 scale){m_scale = scale;} void setScale(glm::vec2 scale){m_scale = scale;}
void setTexture(Texture *tex){m_tex = tex;} void setTexture(Texture *tex){m_tex = tex;}
TextNode* getTextNode(std::string s, glm::vec3 color = glm::vec3(1),float font_size = 0); TextNode* getTextNode(std::string s, glm::vec3 color = glm::vec3(1), float font_size = 64.f);
private: private:
std::string m_name; std::string m_name;
Texture *m_tex; Texture *m_tex;
@ -39,8 +39,8 @@ private:
glm::vec2 m_scale; glm::vec2 m_scale;
bool m_antiAliasing; bool m_antiAliasing;
int m_nbChar; int m_nbChar;
int m_defaultLineHeight; float m_defaultLineHeight;
int m_base; float m_base;
}; };
#endif // FONT_H #endif // FONT_H

View File

@ -75,13 +75,13 @@ Font* Loader::loadFont(const std::string &description_file, const std::string &t
font->setName(font_name); font->setName(font_name);
std::getline(file, line); std::getline(file, line);
int line_h, base; float line_h, base;
glm::ivec2 scale; glm::vec2 scale;
std::sscanf(line.c_str(),"common lineHeight=%d base=%d scaleW=%d scaleH=%d", std::sscanf(line.c_str(),"common lineHeight=%f base=%f scaleW=%f scaleH=%f",
&line_h,&base,&(scale.x),&(scale.y)); &line_h,&base,&(scale.x),&(scale.y));
font->setLineHeight(line_h); font->setLineHeight(line_h);
font->setBase(base); font->setBase(base);
font->setScale(glm::vec2(scale)); font->setScale(1.f/scale);
std::getline(file, line);//ignore 3rd line for now => only use 1 page. std::getline(file, line);//ignore 3rd line for now => only use 1 page.
std::getline(file, line); std::getline(file, line);
@ -92,7 +92,7 @@ Font* Loader::loadFont(const std::string &description_file, const std::string &t
std::getline(file, line); std::getline(file, line);
Font::CharInfo char_info; Font::CharInfo char_info;
int id; int id;
sscanf(line.c_str(),"char id=%f x=%f y=%f width=%f height=%f xoffset=%f yoffset=%f xadvance=%f", sscanf(line.c_str(),"char id=%d x=%f y=%f width=%f height=%f xoffset=%f yoffset=%f xadvance=%f",
&id, &(char_info.pos.x),&(char_info.pos.y),&(char_info.dim.x), &(char_info.dim.y), &id, &(char_info.pos.x),&(char_info.pos.y),&(char_info.dim.x), &(char_info.dim.y),
&(char_info.offset.x), &(char_info.offset.y), &(char_info.xadvance)); &(char_info.offset.x), &(char_info.offset.y), &(char_info.xadvance));
font->addCharInfo(id,char_info); font->addCharInfo(id,char_info);
@ -101,7 +101,7 @@ Font* Loader::loadFont(const std::string &description_file, const std::string &t
Image* fucking_image_of_doom = loadImage(texture_file); Image* fucking_image_of_doom = loadImage(texture_file);
if(fucking_image_of_doom == NULL) if(fucking_image_of_doom == NULL)
printf("can't load \"%s\".\n", texture_file.c_str()); printf("can't load \"%s\".\n", texture_file.c_str());
Texture* texture = new Texture(fucking_image_of_doom); Texture* texture = new Texture(fucking_image_of_doom, false); // mipmaps are doing a very bad job at interpolating alpha component
delete fucking_image_of_doom; delete fucking_image_of_doom;
font->setTexture(texture); font->setTexture(texture);
return font; return font;