mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Implement 2D Meshes and MultiMeshes in GLES3 backend
This commit is contained in:
parent
3e20c1347d
commit
fb860265e0
7 changed files with 282 additions and 236 deletions
|
@ -29,3 +29,102 @@
|
|||
/*************************************************************************/
|
||||
|
||||
#include "renderer_canvas_render.h"
|
||||
#include "servers/rendering/rendering_server_globals.h"
|
||||
|
||||
const Rect2 &RendererCanvasRender::Item::get_rect() const {
|
||||
if (custom_rect || (!rect_dirty && !update_when_visible)) {
|
||||
return rect;
|
||||
}
|
||||
|
||||
//must update rect
|
||||
|
||||
if (commands == nullptr) {
|
||||
rect = Rect2();
|
||||
rect_dirty = false;
|
||||
return rect;
|
||||
}
|
||||
|
||||
Transform2D xf;
|
||||
bool found_xform = false;
|
||||
bool first = true;
|
||||
|
||||
const Item::Command *c = commands;
|
||||
|
||||
while (c) {
|
||||
Rect2 r;
|
||||
|
||||
switch (c->type) {
|
||||
case Item::Command::TYPE_RECT: {
|
||||
const Item::CommandRect *crect = static_cast<const Item::CommandRect *>(c);
|
||||
r = crect->rect;
|
||||
|
||||
} break;
|
||||
case Item::Command::TYPE_NINEPATCH: {
|
||||
const Item::CommandNinePatch *style = static_cast<const Item::CommandNinePatch *>(c);
|
||||
r = style->rect;
|
||||
} break;
|
||||
|
||||
case Item::Command::TYPE_POLYGON: {
|
||||
const Item::CommandPolygon *polygon = static_cast<const Item::CommandPolygon *>(c);
|
||||
r = polygon->polygon.rect_cache;
|
||||
} break;
|
||||
case Item::Command::TYPE_PRIMITIVE: {
|
||||
const Item::CommandPrimitive *primitive = static_cast<const Item::CommandPrimitive *>(c);
|
||||
for (uint32_t j = 0; j < primitive->point_count; j++) {
|
||||
if (j == 0) {
|
||||
r.position = primitive->points[0];
|
||||
} else {
|
||||
r.expand_to(primitive->points[j]);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case Item::Command::TYPE_MESH: {
|
||||
const Item::CommandMesh *mesh = static_cast<const Item::CommandMesh *>(c);
|
||||
AABB aabb = RSG::mesh_storage->mesh_get_aabb(mesh->mesh, RID());
|
||||
|
||||
r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y);
|
||||
|
||||
} break;
|
||||
case Item::Command::TYPE_MULTIMESH: {
|
||||
const Item::CommandMultiMesh *multimesh = static_cast<const Item::CommandMultiMesh *>(c);
|
||||
AABB aabb = RSG::mesh_storage->multimesh_get_aabb(multimesh->multimesh);
|
||||
|
||||
r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y);
|
||||
|
||||
} break;
|
||||
case Item::Command::TYPE_PARTICLES: {
|
||||
const Item::CommandParticles *particles_cmd = static_cast<const Item::CommandParticles *>(c);
|
||||
if (particles_cmd->particles.is_valid()) {
|
||||
AABB aabb = RendererRD::ParticlesStorage::get_singleton()->particles_get_aabb(particles_cmd->particles);
|
||||
r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y);
|
||||
}
|
||||
|
||||
} break;
|
||||
case Item::Command::TYPE_TRANSFORM: {
|
||||
const Item::CommandTransform *transform = static_cast<const Item::CommandTransform *>(c);
|
||||
xf = transform->xform;
|
||||
found_xform = true;
|
||||
[[fallthrough]];
|
||||
}
|
||||
default: {
|
||||
c = c->next;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_xform) {
|
||||
r = xf.xform(r);
|
||||
}
|
||||
|
||||
if (first) {
|
||||
rect = r;
|
||||
first = false;
|
||||
} else {
|
||||
rect = rect.merge(r);
|
||||
}
|
||||
c = c->next;
|
||||
}
|
||||
|
||||
rect_dirty = false;
|
||||
return rect;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue