|
@@ -165,6 +165,7 @@ void RasterizerCanvasGLES3::canvas_begin() {
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false);
|
|
|
|
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, false);
|
|
|
|
|
|
state.canvas_shader.set_custom_shader(0);
|
|
state.canvas_shader.set_custom_shader(0);
|
|
state.canvas_shader.bind();
|
|
state.canvas_shader.bind();
|
|
@@ -179,6 +180,7 @@ void RasterizerCanvasGLES3::canvas_begin() {
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, state.canvas_item_ubo);
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, state.canvas_item_ubo);
|
|
glBindVertexArray(data.canvas_quad_array);
|
|
glBindVertexArray(data.canvas_quad_array);
|
|
state.using_texture_rect = true;
|
|
state.using_texture_rect = true;
|
|
|
|
+ state.using_ninepatch = false;
|
|
}
|
|
}
|
|
|
|
|
|
void RasterizerCanvasGLES3::canvas_end() {
|
|
void RasterizerCanvasGLES3::canvas_end() {
|
|
@@ -187,6 +189,7 @@ void RasterizerCanvasGLES3::canvas_end() {
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0);
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0);
|
|
|
|
|
|
state.using_texture_rect = false;
|
|
state.using_texture_rect = false;
|
|
|
|
+ state.using_ninepatch = false;
|
|
}
|
|
}
|
|
|
|
|
|
RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
|
|
RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
|
|
@@ -259,9 +262,9 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con
|
|
return tex_return;
|
|
return tex_return;
|
|
}
|
|
}
|
|
|
|
|
|
-void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) {
|
|
|
|
|
|
+void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable, bool p_ninepatch) {
|
|
|
|
|
|
- if (state.using_texture_rect == p_enable)
|
|
|
|
|
|
+ if (state.using_texture_rect == p_enable && state.using_ninepatch == p_ninepatch)
|
|
return;
|
|
return;
|
|
|
|
|
|
if (p_enable) {
|
|
if (p_enable) {
|
|
@@ -273,6 +276,7 @@ void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) {
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, p_ninepatch && p_enable);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_TEXTURE_RECT, p_enable);
|
|
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_TEXTURE_RECT, p_enable);
|
|
state.canvas_shader.bind();
|
|
state.canvas_shader.bind();
|
|
state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate);
|
|
state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate);
|
|
@@ -280,6 +284,7 @@ void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) {
|
|
state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix);
|
|
state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix);
|
|
|
|
|
|
state.using_texture_rect = p_enable;
|
|
state.using_texture_rect = p_enable;
|
|
|
|
+ state.using_ninepatch = p_ninepatch;
|
|
}
|
|
}
|
|
|
|
|
|
void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
|
|
void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
|
|
@@ -494,79 +499,41 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur
|
|
|
|
|
|
Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(c);
|
|
Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(c);
|
|
|
|
|
|
- _set_texture_rect_mode(true);
|
|
|
|
|
|
+ _set_texture_rect_mode(true, true);
|
|
|
|
|
|
glVertexAttrib4f(VS::ARRAY_COLOR, np->color.r, np->color.g, np->color.b, np->color.a);
|
|
glVertexAttrib4f(VS::ARRAY_COLOR, np->color.r, np->color.g, np->color.b, np->color.a);
|
|
|
|
|
|
RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(np->texture, np->normal_map);
|
|
RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(np->texture, np->normal_map);
|
|
|
|
|
|
- if (!texture) {
|
|
|
|
-
|
|
|
|
- glVertexAttrib4f(1, np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y);
|
|
|
|
- glVertexAttrib4f(2, 0, 0, 1, 1);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
|
|
|
|
-
|
|
|
|
- state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
|
|
|
|
- state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false);
|
|
|
|
-
|
|
|
|
-#define DSTRECT(m_x, m_y, m_w, m_h) state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(m_x, m_y, m_w, m_h))
|
|
|
|
-#define SRCRECT(m_x, m_y, m_w, m_h) state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color((m_x)*texpixel_size.x, (m_y)*texpixel_size.y, (m_w)*texpixel_size.x, (m_h)*texpixel_size.y))
|
|
|
|
-
|
|
|
|
- //top left
|
|
|
|
- DSTRECT(np->rect.position.x, np->rect.position.y, np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]);
|
|
|
|
- SRCRECT(np->source.position.x, np->source.position.y, np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ Size2 texpixel_size;
|
|
|
|
|
|
- //top right
|
|
|
|
- DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y, np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]);
|
|
|
|
- SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y, np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ if (!texture) {
|
|
|
|
|
|
- //bottom right
|
|
|
|
- DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]);
|
|
|
|
- SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ texpixel_size = Size2(1, 1);
|
|
|
|
|
|
- //bottom left
|
|
|
|
- DSTRECT(np->rect.position.x, np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_LEFT], np->margin[MARGIN_BOTTOM]);
|
|
|
|
- SRCRECT(np->source.position.x, np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_LEFT], np->margin[MARGIN_BOTTOM]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1));
|
|
|
|
|
|
- //top
|
|
|
|
- DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y, np->rect.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]);
|
|
|
|
- SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y, np->source.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ } else {
|
|
|
|
|
|
- //bottom
|
|
|
|
- DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->rect.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]);
|
|
|
|
- SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->source.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ if (np->source != Rect2()) {
|
|
|
|
+ texpixel_size = Size2(1.0 / np->source.size.width, 1.0 / np->source.size.height);
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(np->source.position.x / texture->width, np->source.position.y / texture->height, np->source.size.x / texture->width, np->source.size.y / texture->height));
|
|
|
|
+ } else {
|
|
|
|
+ texpixel_size = Size2(1.0 / texture->width, 1.0 / texture->height);
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- //left
|
|
|
|
- DSTRECT(np->rect.position.x, np->rect.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_LEFT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
- SRCRECT(np->source.position.x, np->source.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_LEFT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false);
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_H, int(np->axis_x));
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_V, int(np->axis_y));
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_DRAW_CENTER, np->draw_center);
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_MARGINS, Color(np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]));
|
|
|
|
+ state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y));
|
|
|
|
|
|
- //right
|
|
|
|
- DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
- SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
|
|
- if (np->draw_center) {
|
|
|
|
-
|
|
|
|
- //center
|
|
|
|
- DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y + np->margin[MARGIN_TOP], np->rect.size.x - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
- SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y + np->margin[MARGIN_TOP], np->source.size.x - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]);
|
|
|
|
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-#undef SRCRECT
|
|
|
|
-#undef DSTRECT
|
|
|
|
-
|
|
|
|
storage->frame.canvas_draw_commands++;
|
|
storage->frame.canvas_draw_commands++;
|
|
} break;
|
|
} break;
|
|
|
|
|