rabbit-ear
Version:
origami design library
79 lines (75 loc) • 2.73 kB
JavaScript
/* Rabbit Ear 0.9.4 alpha 2024-04-20 (c) Kraft, GNU GPLv3 License */
import { triangulateConvexFacesVertices } from '../../graph/triangulate.js';
import { resize2 } from '../../math/vector.js';
import { makeCPEdgesVertexData } from './data.js';
const makeCPEdgesVertexArrays = (gl, program, graph, options) => {
if (!graph || !graph.vertices_coords || !graph.edges_vertices) {
return [];
}
const {
vertices_coords,
vertices_color,
verticesEdgesVector,
vertices_vector,
} = makeCPEdgesVertexData(graph, options);
if (!vertices_coords) { return []; }
return [{
location: gl.getAttribLocation(program, "v_position"),
buffer: gl.createBuffer(),
type: gl.FLOAT,
length: 2,
data: new Float32Array(vertices_coords.flat()),
}, {
location: gl.getAttribLocation(program, "v_color"),
buffer: gl.createBuffer(),
type: gl.FLOAT,
length: vertices_color.length ? vertices_color[0].length : 2,
data: new Float32Array(vertices_color.flat()),
}, {
location: gl.getAttribLocation(program, "edge_vector"),
buffer: gl.createBuffer(),
type: gl.FLOAT,
length: verticesEdgesVector.length ? verticesEdgesVector[0].length : 2,
data: new Float32Array(verticesEdgesVector.flat()),
}, {
location: gl.getAttribLocation(program, "vertex_vector"),
buffer: gl.createBuffer(),
type: gl.FLOAT,
length: vertices_vector.length ? vertices_vector[0].length : 2,
data: new Float32Array(vertices_vector.flat()),
}].filter(el => el.location !== -1);
};
const makeCPEdgesElementArrays = (gl, version = 1, graph = {}) => {
if (!graph || !graph.edges_vertices) { return []; }
const edgesTriangles = graph.edges_vertices
.map((_, i) => i * 4)
.flatMap(i => [i + 0, i + 1, i + 2, i + 2, i + 3, i + 0]);
return [{
mode: gl.TRIANGLES,
buffer: gl.createBuffer(),
data: version === 2
? new Uint32Array(edgesTriangles)
: new Uint16Array(edgesTriangles),
}];
};
const makeCPFacesVertexArrays = (gl, program, graph) => {
if (!graph || !graph.vertices_coords) { return []; }
return [{
location: gl.getAttribLocation(program, "v_position"),
buffer: gl.createBuffer(),
type: gl.FLOAT,
length: 2,
data: new Float32Array(graph.vertices_coords.flatMap(resize2)),
}].filter(el => el.location !== -1);
};
const makeCPFacesElementArrays = (gl, version = 1, graph = {}) => {
if (!graph || !graph.vertices_coords || !graph.faces_vertices) { return []; }
return [{
mode: gl.TRIANGLES,
buffer: gl.createBuffer(),
data: version === 2
? new Uint32Array(triangulateConvexFacesVertices(graph).flat())
: new Uint16Array(triangulateConvexFacesVertices(graph).flat()),
}];
};
export { makeCPEdgesElementArrays, makeCPEdgesVertexArrays, makeCPFacesElementArrays, makeCPFacesVertexArrays };