You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.6 KiB
70 lines
1.6 KiB
function clip(quads) { |
|
if (config.show_texture) { |
|
return quads; |
|
} |
|
|
|
const tl = screen_to_canvas({'x': 0, 'y': 0}); |
|
const br = screen_to_canvas({'x': 0, 'y': canvas.height}); |
|
|
|
const x1 = tl.x; |
|
const y1 = tl.y; |
|
|
|
const x2 = br.x; |
|
const y2 = br.y; |
|
|
|
const result = { |
|
'count': 0, |
|
}; |
|
|
|
if (quads.count === 0) { |
|
return result; |
|
} |
|
|
|
let i0 = -1; |
|
let i1 = -1; |
|
|
|
for (let i = 0; i < quads.start.length - 1; ++i) { |
|
const index = quads.start[i]; |
|
const next = quads.start[i + 1]; |
|
|
|
const left = quads.pos[index]; |
|
const top = quads.pos[index + 1]; |
|
const bottom = top + quads.size[index + 1]; |
|
const right = quads.pos[next - 2] + quads.size[next - 2]; |
|
|
|
if (bottom < y1) { |
|
if (i < quads.start.length / 2 - 2) { |
|
const index_ahead = quads.start[i * 2]; |
|
const top_ahead = quads.pos[index_ahead + 1]; |
|
const bottom_ahead = top_ahead + quads.size[index_ahead + 1]; |
|
|
|
if (bottom_ahead < y1) { |
|
i *= 2; |
|
continue; |
|
} |
|
} |
|
} |
|
|
|
if (bottom < y1 || right < x1) { |
|
continue; |
|
} |
|
|
|
if (top > y2) { |
|
i1 = quads.start[i + 1]; |
|
break; |
|
} |
|
|
|
if (i0 === -1) { |
|
i0 = index; |
|
} |
|
} |
|
|
|
result.pos = quads.pos.subarray(i0, i1); |
|
result.size = quads.size.subarray(i0, i1); |
|
result.color = quads.color.subarray(i0 * 2, i1 * 2); |
|
result.uv = quads.uv.subarray(i0, i1); |
|
result.count = (i1 - i0) / 2; |
|
result.uploaded = false; |
|
|
|
return result; |
|
}
|
|
|