71 } |
71 } |
72 |
72 |
73 static void asc_text_destroy(AscSceneNode *node) { |
73 static void asc_text_destroy(AscSceneNode *node) { |
74 AscText *text = (AscText*) node; |
74 AscText *text = (AscText*) node; |
75 AscSprite *sprite = (AscSprite*) node; |
75 AscSprite *sprite = (AscSprite*) node; |
|
76 asc_mesh_destroy(&sprite->mesh); |
76 asc_texture_destroy(sprite->texture, 1); |
77 asc_texture_destroy(sprite->texture, 1); |
77 assert(sprite->texture->refcount == 0); |
78 assert(sprite->texture->refcount == 0); |
78 free(sprite->texture); |
79 free(sprite->texture); |
79 cx_strfree(&text->text); |
80 cx_strfree(&text->text); |
80 } |
81 } |
81 |
82 |
82 AscSceneNode *asc_text_create(struct asc_text_create_args args) { |
83 AscSceneNode *asc_text_create(struct asc_text_create_args args) { |
83 AscText *text = calloc(1, sizeof(AscText)); |
84 AscText *text = calloc(1, sizeof(AscText)); |
84 AscSceneNode *node = (AscSceneNode*) text; |
85 AscSceneNode *node = &text->base.data; |
85 |
86 |
|
87 // node properties |
|
88 asc_scene_node_name(node, args.name); |
86 node->render_group = ASC_RENDER_GROUP_SPRITE_BLEND; |
89 node->render_group = ASC_RENDER_GROUP_SPRITE_BLEND; |
87 node->destroy_func = asc_text_destroy; |
90 node->destroy_func = asc_text_destroy; |
88 node->update_func = asc_text_update; |
91 node->update_func = asc_text_update; |
89 |
|
90 node->flags = args.alignment; |
|
91 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
92 node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET); |
92 node->scale.depth = 1.f; |
93 node->scale.depth = 1.f; |
|
94 |
|
95 // text properties |
|
96 node->flags = args.alignment; // use flags variable to save some space |
93 text->max_width = args.max_width; |
97 text->max_width = args.max_width; |
94 text->font = asc_active_font; |
98 text->font = asc_active_font; |
95 text->color = asc_context.ink; |
99 text->color = asc_context.ink; |
96 if (args.text == NULL) { |
100 if (args.text == NULL) { |
97 text->text = cx_mutstr(strdup(" ")); |
101 text->text = cx_mutstr(strdup(" ")); |
98 } else { |
102 } else { |
99 text->text = cx_mutstr(strdup(args.text)); |
103 text->text = cx_mutstr(strdup(args.text)); |
100 } |
104 } |
101 |
105 |
102 // initialize |
106 // initialize mesh and texture |
103 asc_scene_node_name(node, args.name); |
107 asc_mesh_plane_2d(&text->base.mesh); |
104 text->base.texture = malloc(sizeof(AscTexture)); |
108 text->base.texture = malloc(sizeof(AscTexture)); |
105 asc_texture_init_rectangle(text->base.texture, 1); |
109 asc_texture_init_rectangle(text->base.texture, 1); |
106 asc_text_update(node); |
110 asc_text_update(node); |
107 |
111 |
108 return node; |
112 return node; |