123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- import defined from "./defined.js";
- import IndexDatatype from "./IndexDatatype.js";
- import PrimitiveType from "./PrimitiveType.js";
- /**
- * Functions for generating indices for model wireframes. The indices are
- * outputted as typed arrays, which can then be put into buffers for rendering.
- *
- * @namespace WireframeIndexGenerator
- * @private
- */
- const WireframeIndexGenerator = {};
- function createWireframeFromTriangles(vertexCount) {
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- vertexCount * 2
- );
- const length = vertexCount;
- let index = 0;
- for (let i = 0; i < length; i += 3) {
- wireframeIndices[index++] = i;
- wireframeIndices[index++] = i + 1;
- wireframeIndices[index++] = i + 1;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = i;
- }
- return wireframeIndices;
- }
- function createWireframeFromTriangleIndices(vertexCount, originalIndices) {
- const originalIndicesCount = originalIndices.length;
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- originalIndicesCount * 2
- );
- let index = 0;
- for (let i = 0; i < originalIndicesCount; i += 3) {
- const point0 = originalIndices[i];
- const point1 = originalIndices[i + 1];
- const point2 = originalIndices[i + 2];
- wireframeIndices[index++] = point0;
- wireframeIndices[index++] = point1;
- wireframeIndices[index++] = point1;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = point0;
- }
- return wireframeIndices;
- }
- function createWireframeFromTriangleStrip(vertexCount) {
- const numberOfTriangles = vertexCount - 2;
- const wireframeIndicesCount = 2 + numberOfTriangles * 4;
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- wireframeIndicesCount
- );
- let index = 0;
- // Handle the first edge
- wireframeIndices[index++] = 0;
- wireframeIndices[index++] = 1;
- // Add two edges for every triangle in the strip
- for (let i = 0; i < numberOfTriangles; i++) {
- wireframeIndices[index++] = i + 1;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = i;
- }
- return wireframeIndices;
- }
- function createWireframeFromTriangleStripIndices(vertexCount, originalIndices) {
- const originalIndicesCount = originalIndices.length;
- const numberOfTriangles = originalIndicesCount - 2;
- const wireframeIndicesCount = 2 + numberOfTriangles * 4;
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- wireframeIndicesCount
- );
- let index = 0;
- // Handle the first edge
- wireframeIndices[index++] = originalIndices[0];
- wireframeIndices[index++] = originalIndices[1];
- // Add two edges for every triangle in the strip
- for (let i = 0; i < numberOfTriangles; i++) {
- const point0 = originalIndices[i];
- const point1 = originalIndices[i + 1];
- const point2 = originalIndices[i + 2];
- wireframeIndices[index++] = point1;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = point0;
- }
- return wireframeIndices;
- }
- function createWireframeFromTriangleFan(vertexCount) {
- const numberOfTriangles = vertexCount - 2;
- const wireframeIndicesCount = 2 + numberOfTriangles * 4;
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- wireframeIndicesCount
- );
- let index = 0;
- // Handle the first edge
- wireframeIndices[index++] = 0;
- wireframeIndices[index++] = 1;
- // Add two edges for every triangle in the fan
- for (let i = 0; i < numberOfTriangles; i++) {
- wireframeIndices[index++] = i + 1;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = i + 2;
- wireframeIndices[index++] = 0;
- }
- return wireframeIndices;
- }
- function createWireframeFromTriangleFanIndices(vertexCount, originalIndices) {
- const originalIndicesCount = originalIndices.length;
- const numberOfTriangles = originalIndicesCount - 2;
- const wireframeIndicesCount = 2 + numberOfTriangles * 4;
- const wireframeIndices = IndexDatatype.createTypedArray(
- vertexCount,
- wireframeIndicesCount
- );
- let index = 0;
- // Handle the first edge
- const firstPoint = originalIndices[0];
- wireframeIndices[index++] = firstPoint;
- wireframeIndices[index++] = originalIndices[1];
- // Add two edges for every triangle in the fan
- for (let i = 0; i < numberOfTriangles; i++) {
- const point1 = originalIndices[i + 1];
- const point2 = originalIndices[i + 2];
- wireframeIndices[index++] = point1;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = point2;
- wireframeIndices[index++] = firstPoint;
- }
- return wireframeIndices;
- }
- /**
- * Generates a wireframe index buffer for a primitive, either by reindexing the existing indices
- * or creating them from scratch if the model had none.
- *
- * @param {PrimitiveType} primitiveType The primitive type.
- * @param {Number} vertexCount The number of vertices in the primitive.
- * @param {Uint8Array|Uint16Array|Uint32Array} [originalIndices] A typed array containing the original indices of the primitive.
- *
- * @return {Uint16Array|Uint32Array} A typed array with the wireframe indices, or undefined if the primitive type does not use triangles.
- *
- * @private
- */
- WireframeIndexGenerator.createWireframeIndices = function (
- primitiveType,
- vertexCount,
- originalIndices
- ) {
- const hasOriginalIndices = defined(originalIndices);
- if (primitiveType === PrimitiveType.TRIANGLES) {
- return hasOriginalIndices
- ? createWireframeFromTriangleIndices(vertexCount, originalIndices)
- : createWireframeFromTriangles(vertexCount);
- }
- if (primitiveType === PrimitiveType.TRIANGLE_STRIP) {
- return hasOriginalIndices
- ? createWireframeFromTriangleStripIndices(vertexCount, originalIndices)
- : createWireframeFromTriangleStrip(vertexCount);
- }
- if (primitiveType === PrimitiveType.TRIANGLE_FAN) {
- return hasOriginalIndices
- ? createWireframeFromTriangleFanIndices(vertexCount, originalIndices)
- : createWireframeFromTriangleFan(vertexCount);
- }
- return undefined;
- };
- /**
- * Gets the number of indices in the wireframe index buffer of a primitive type.
- *
- * @param {PrimitiveType} primitiveType The primitive type.
- * @param {Number} originalCount The original number of vertices or indices in the primitive.
- * @return {Number} The number of indices in the primitive's wireframe.
- *
- * @private
- */
- WireframeIndexGenerator.getWireframeIndicesCount = function (
- primitiveType,
- originalCount
- ) {
- // For TRIANGLES, the wireframe takes every triangle (i.e. three of the original
- // indices) and turns it into lines. Each triangle has three lines, and each line
- // requires two indices, so the final count is twice the original.
- if (primitiveType === PrimitiveType.TRIANGLES) {
- return originalCount * 2;
- }
- // For TRIANGLE_STRIP and TRIANGLE_FAN, the number of triangles in the primitive
- // is equal to the total number of vertices minus two. This is because after the
- // first edge is specified by the first two indices, every point afterwards
- // contributes two more edges with two of the previous points, forming a new triangle.
- // Each of these edges requires two indices, so each triangle in the primitive
- // results in four indices in addition to the first two.
- if (
- primitiveType === PrimitiveType.TRIANGLE_STRIP ||
- primitiveType === PrimitiveType.TRIANGLE_FAN
- ) {
- const numberOfTriangles = originalCount - 2;
- return 2 + numberOfTriangles * 4;
- }
- return originalCount;
- };
- export default WireframeIndexGenerator;
|