| 52 ); |
52 ); |
| 53 if (surface == NULL) { |
53 if (surface == NULL) { |
| 54 asc_error("Rendering TTF surface failed: %s", SDL_GetError()); |
54 asc_error("Rendering TTF surface failed: %s", SDL_GetError()); |
| 55 return; |
55 return; |
| 56 } |
56 } |
| 57 // TODO: don't use scale - create an own fitting mesh |
|
| 58 asc_set_scale(node, (float)surface->w, (float)surface->h, 1.f); |
|
| 59 if (asc_test_flag(text->base.data.flags, ASC_TEXT_CENTERED_FLAG)) { |
57 if (asc_test_flag(text->base.data.flags, ASC_TEXT_CENTERED_FLAG)) { |
| 60 unsigned short newoffx = surface->w / 2; |
58 unsigned short newoffx = surface->w / 2; |
| 61 asc_vec2i pos = asc_get_position2d(node); |
59 node->position.x = node->position.x + (float)(text->offx - newoffx); |
| 62 asc_set_position2d(node, pos.x + text->offx - newoffx, pos.y); |
|
| 63 text->offx = newoffx; |
60 text->offx = newoffx; |
| |
61 } |
| |
62 |
| |
63 // If dimensions changed, update the mesh |
| |
64 if (text->dimension.x != (unsigned)surface->w || text->dimension.y != (unsigned)surface->h) { |
| |
65 text->dimension.x = surface->w; |
| |
66 text->dimension.y = surface->h; |
| |
67 asc_mesh_plane_2d(&text->base.mesh, .size = asc_vec2f_new(surface->w, surface->h)); |
| 64 } |
68 } |
| 65 |
69 |
| 66 // Transfer Image Data |
70 // Transfer Image Data |
| 67 asc_texture_from_surface(sprite->texture, surface); |
71 asc_texture_from_surface(sprite->texture, surface); |
| 68 |
72 |
| 69 // Free the surface |
73 // Free the surface |
| 70 SDL_FreeSurface(surface); |
74 SDL_FreeSurface(surface); |
| |
75 |
| |
76 // Schedule for transform update |
| |
77 asc_node_update_transform(node); |
| 71 } |
78 } |
| 72 |
79 |
| 73 static void asc_text_destroy(AscSceneNode *node) { |
80 static void asc_text_destroy(AscSceneNode *node) { |
| 74 AscText *text = (AscText*) node; |
81 AscText *text = (AscText*) node; |
| 75 AscSprite *sprite = (AscSprite*) node; |
82 AscSprite *sprite = (AscSprite*) node; |
| 88 asc_scene_node_name(node, args.name); |
95 asc_scene_node_name(node, args.name); |
| 89 node->render_group = ASC_RENDER_GROUP_SPRITE_BLEND; |
96 node->render_group = ASC_RENDER_GROUP_SPRITE_BLEND; |
| 90 node->destroy_func = asc_text_destroy; |
97 node->destroy_func = asc_text_destroy; |
| 91 node->update_func = asc_text_update; |
98 node->update_func = asc_text_update; |
| 92 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
99 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
| 93 node->scale.depth = 1.f; |
100 node->scale = asc_vec3f_one; |
| 94 |
101 |
| 95 // text properties |
102 // text properties |
| 96 node->flags = args.alignment; // use flags variable to save some space |
103 node->flags = args.alignment; // use flags variable to save some space |
| 97 text->max_width = args.max_width; |
104 text->max_width = args.max_width; |
| 98 text->font = asc_active_font; |
105 text->font = asc_active_font; |
| 101 text->text = cx_mutstr(strdup(" ")); |
108 text->text = cx_mutstr(strdup(" ")); |
| 102 } else { |
109 } else { |
| 103 text->text = cx_mutstr(strdup(args.text)); |
110 text->text = cx_mutstr(strdup(args.text)); |
| 104 } |
111 } |
| 105 |
112 |
| 106 // initialize mesh and texture |
113 // initialize texture |
| 107 asc_mesh_plane_2d(&text->base.mesh); |
114 // mesh will be created in the update func |
| 108 text->base.texture = malloc(sizeof(AscTexture)); |
115 text->base.texture = malloc(sizeof(AscTexture)); |
| 109 asc_texture_init_rectangle(text->base.texture, 1); |
116 asc_texture_init_rectangle(text->base.texture, 1); |
| 110 asc_text_update(node); |
117 asc_text_update(node); |
| 111 |
118 |
| 112 return node; |
119 return node; |