Implemented Text2D.

This commit is contained in:
Relintai 2024-01-04 17:54:40 +01:00
parent 27e35c6553
commit 12a6cab9e9
7 changed files with 102 additions and 47 deletions

View File

@ -78,6 +78,7 @@ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/mesh_instance_2d.cp
ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/object_2d.cpp -o sfw/render_objects/object_2d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/object_2d.cpp -o sfw/render_objects/object_2d.o
ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/sprite.cpp -o sfw/render_objects/sprite.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/sprite.cpp -o sfw/render_objects/sprite.o
ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/tile_map.cpp -o sfw/render_objects/tile_map.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/tile_map.cpp -o sfw/render_objects/tile_map.o
ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/text_2d.cpp -o sfw/render_objects/text_2d.o
ccache g++ -Wall -D_REENTRANT -g -Isfw -c game_scene.cpp -o game_scene.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c game_scene.cpp -o game_scene.o
ccache g++ -Wall -D_REENTRANT -g -Isfw -c main.cpp -o main.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c main.cpp -o main.o
@ -106,6 +107,7 @@ ccache g++ -Wall -lm -ldl -lpthread -lX11 -D_REENTRANT -g sfw/core/aabb.o sfw/c
sfw/render_objects/object_2d.o \ sfw/render_objects/object_2d.o \
sfw/render_objects/sprite.o sfw/render_objects/tile_map.o \ sfw/render_objects/sprite.o sfw/render_objects/tile_map.o \
sfw/render_objects/camera_2d.o sfw/render_objects/mesh_instance_2d.o \ sfw/render_objects/camera_2d.o sfw/render_objects/mesh_instance_2d.o \
sfw/render_objects/text_2d.o \
game_scene.o main.o \ game_scene.o main.o \
-o game -o game

View File

@ -98,6 +98,8 @@ void GameScene::render() {
_font_test_sprite->render(); _font_test_sprite->render();
_font_test_mi->render(); _font_test_mi->render();
_text_2d->render();
//TextRenderer::get_singleton()->font_init(); //TextRenderer::get_singleton()->font_init();
//TextRenderer::get_singleton()->font_print("test"); //TextRenderer::get_singleton()->font_print("test");
} }
@ -121,7 +123,7 @@ GameScene::GameScene() {
_font_test_sprite = memnew(Sprite); _font_test_sprite = memnew(Sprite);
_font_test_mat = memnew(FontMaterial()); _font_test_mat = memnew(FontMaterial());
_font_test_mat->texture = _font->get_texture().ptr(); _font_test_mat->texture = _font->get_texture();
_font_test_sprite->mesh_instance->material = _font_test_mat; _font_test_sprite->mesh_instance->material = _font_test_mat;
_font_test_sprite->width = _font->get_atlas_width(); _font_test_sprite->width = _font->get_atlas_width();
_font_test_sprite->height = _font->get_atlas_height(); _font_test_sprite->height = _font->get_atlas_height();
@ -255,6 +257,13 @@ GameScene::GameScene() {
mesh->upload(); mesh->upload();
*/ */
_text_2d = memnew(Text2D);
_text_2d->set_font(_font);
_text_2d->set_text("Test Text2D.\n Newline.");
_text_2d->set_text_color(Color(1, 1, 0));
_text_2d->update();
_text_2d->transform.set_origin(Vector2(1200, 250));
} }
GameScene::~GameScene() { GameScene::~GameScene() {

View File

@ -16,6 +16,7 @@
#include "render_objects/mesh_instance_2d.h" #include "render_objects/mesh_instance_2d.h"
#include "render_objects/mesh_instance_3d.h" #include "render_objects/mesh_instance_3d.h"
#include "render_objects/sprite.h" #include "render_objects/sprite.h"
#include "render_objects/text_2d.h"
#include "render_objects/tile_map.h" #include "render_objects/tile_map.h"
class GameScene : public Scene { class GameScene : public Scene {
@ -55,6 +56,8 @@ public:
MeshInstance3D *mi2; MeshInstance3D *mi2;
ColorMaterial *color_material; ColorMaterial *color_material;
Text2D *_text_2d;
//ColoredMaterial *cmaterial; //ColoredMaterial *cmaterial;
}; };

View File

@ -255,18 +255,10 @@ void Font::font_face_from_mem(const void *ttf_data, uint32_t ttf_len, float font
//String pngname = "font_debug" + itos(index) + " .png"; //String pngname = "font_debug" + itos(index) + " .png";
//stbi_write_png(pngname.utf8().get_data(), _width, _height, 1, bitmap, 0); //stbi_write_png(pngname.utf8().get_data(), _width, _height, 1, bitmap, 0);
if (!_image.is_valid()) {
_image.instance();
}
bitmap_data.resize(_width * _height); bitmap_data.resize(_width * _height);
_image->create(_width, _height, false, Image::FORMAT_L8, bitmap_data); _image->create(_width, _height, false, Image::FORMAT_L8, bitmap_data);
if (!_texture.is_valid()) {
_texture.instance();
}
_texture->create_from_image(_image); _texture->create_from_image(_image);
_texture_offsets.resize(_num_glyphs); _texture_offsets.resize(_num_glyphs);
@ -492,6 +484,9 @@ Font::Font() {
_descent = 0; _descent = 0;
_linegap = 0; _linegap = 0;
_linedist = 0; _linedist = 0;
_image.instance();
_texture.instance();
} }
Font::~Font() { Font::~Font() {

View File

@ -16,7 +16,7 @@ public:
set_uniform(projection_matrix_location, RenderState::projection_matrix_2d); set_uniform(projection_matrix_location, RenderState::projection_matrix_2d);
set_uniform(model_view_matrix_location, RenderState::model_view_matrix_2d); set_uniform(model_view_matrix_location, RenderState::model_view_matrix_2d);
if (texture) { if (texture.is_valid()) {
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture->get_gl_texture()); glBindTexture(GL_TEXTURE_2D, texture->get_gl_texture());
glUniform1i(texture_location, 0); glUniform1i(texture_location, 0);
@ -88,7 +88,6 @@ public:
model_view_matrix_location = 0; model_view_matrix_location = 0;
texture_location = 0; texture_location = 0;
texture = NULL;
} }
GLint projection_matrix_location; GLint projection_matrix_location;
@ -96,7 +95,7 @@ public:
GLint texture_location; GLint texture_location;
Texture *texture; Ref<Texture> texture;
}; };
#endif // TEXT_MATERIAL_H #endif // TEXT_MATERIAL_H

View File

@ -1,37 +1,66 @@
#include "render_objects/mesh_instance_2d.h" #include "render_objects/text_2d.h"
#include "render_core/font.h"
#include "render_core/font_material.h"
#include "render_core/mesh.h"
#include "render_objects/camera_2d.h" #include "render_objects/camera_2d.h"
void MeshInstance2D::render() { Color Text2D::get_text_color() const {
if (!mesh) { return _text_color;
}
void Text2D::set_text_color(const Color &p_color) {
_text_color = p_color;
}
String Text2D::get_text() const {
return _text;
}
void Text2D::set_text(const String &p_text) {
_text = p_text;
}
Ref<Font> Text2D::get_font() const {
return _font;
}
void Text2D::set_font(const Ref<Font> &p_font) {
_font = p_font;
if (_font.is_valid()) {
_material->texture = _font->get_texture();
}
}
Vector2 Text2D::get_text_size() {
return _text_size;
}
void Text2D::update() {
_mesh->clear();
if (!_font.is_valid()) {
return; return;
} }
_text_size = _font->generate_mesh(_text, _mesh, _text_color);
_mesh->upload();
}
void Text2D::render() {
Transform2D mat_orig = Camera2D::current_camera->get_model_view_matrix(); Transform2D mat_orig = Camera2D::current_camera->get_model_view_matrix();
Camera2D::current_camera->set_model_view_matrix(mat_orig * transform); Camera2D::current_camera->set_model_view_matrix(mat_orig * transform);
if (material) { _material->bind();
material->bind(); _mesh->render();
}
mesh->render();
for (int i = 0; i < children.size(); ++i) {
MeshInstance2D *c = children[i];
if (c) {
c->render();
}
}
Camera2D::current_camera->set_model_view_matrix(mat_orig); Camera2D::current_camera->set_model_view_matrix(mat_orig);
} }
MeshInstance2D::MeshInstance2D() { Text2D::Text2D() {
material = NULL; _material.instance();
mesh = NULL; _mesh.instance();
_mesh->vertex_dimesions = 2;
} }
MeshInstance2D::~MeshInstance2D() { Text2D::~Text2D() {
children.clear();
} }

View File

@ -1,26 +1,44 @@
#ifndef MESH_INSTACE_2D_H #ifndef TEXT_2D_H
#define MESH_INSTACE_2D_H #define TEXT_2D_H
#include "core/vector.h" #include "core/color.h"
#include "core/ustring.h"
#include "core/vector2.h"
#include "render_core/material.h" #include "object/reference.h"
#include "render_core/mesh.h"
#include "core/transform.h" #include "object_2d.h"
class MeshInstance2D { class Font;
class FontMaterial;
class Mesh;
class Text2D : public Object2D {
public: public:
Color get_text_color() const;
void set_text_color(const Color &p_color);
String get_text() const;
void set_text(const String &p_text);
Ref<Font> get_font() const;
void set_font(const Ref<Font> &p_font);
Vector2 get_text_size();
void update();
void render(); void render();
MeshInstance2D(); Text2D();
~MeshInstance2D(); ~Text2D();
Material *material; protected:
Mesh *mesh; Ref<Font> _font;
Ref<FontMaterial> _material;
Transform2D transform; Ref<Mesh> _mesh;
String _text;
Vector<MeshInstance2D *> children; Color _text_color;
Vector2 _text_size;
}; };
#endif // MESH_INSTACE_H #endif // MESH_INSTACE_H