123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- import Check from "../Core/Check.js";
- import defined from "../Core/defined.js";
- import DeveloperError from "../Core/DeveloperError.js";
- /**
- * An enum describing the built-in vertex attribute semantics.
- *
- * @enum {string}
- *
- * @private
- */
- const VertexAttributeSemantic = {
- /**
- * Per-vertex position.
- *
- * @type {string}
- * @constant
- */
- POSITION: "POSITION",
- /**
- * Per-vertex normal.
- *
- * @type {string}
- * @constant
- */
- NORMAL: "NORMAL",
- /**
- * Per-vertex tangent.
- *
- * @type {string}
- * @constant
- */
- TANGENT: "TANGENT",
- /**
- * Per-vertex texture coordinates.
- *
- * @type {string}
- * @constant
- */
- TEXCOORD: "TEXCOORD",
- /**
- * Per-vertex color.
- *
- * @type {string}
- * @constant
- */
- COLOR: "COLOR",
- /**
- * Per-vertex joint IDs for skinning.
- *
- * @type {string}
- * @constant
- */
- JOINTS: "JOINTS",
- /**
- * Per-vertex joint weights for skinning.
- *
- * @type {string}
- * @constant
- */
- WEIGHTS: "WEIGHTS",
- /**
- * Per-vertex feature ID.
- *
- * @type {string}
- * @constant
- */
- FEATURE_ID: "_FEATURE_ID",
- };
- function semanticToVariableName(semantic) {
- switch (semantic) {
- case VertexAttributeSemantic.POSITION:
- return "positionMC";
- case VertexAttributeSemantic.NORMAL:
- return "normalMC";
- case VertexAttributeSemantic.TANGENT:
- return "tangentMC";
- case VertexAttributeSemantic.TEXCOORD:
- return "texCoord";
- case VertexAttributeSemantic.COLOR:
- return "color";
- case VertexAttributeSemantic.JOINTS:
- return "joints";
- case VertexAttributeSemantic.WEIGHTS:
- return "weights";
- case VertexAttributeSemantic.FEATURE_ID:
- return "featureId";
- //>>includeStart('debug', pragmas.debug);
- default:
- throw new DeveloperError("semantic is not a valid value.");
- //>>includeEnd('debug');
- }
- }
- /**
- * Returns whether the vertex attribute semantic can have a set index.
- *
- * @param {VertexAttributeSemantic} semantic The semantic.
- *
- * @returns {boolean} Whether the semantic can have a set index.
- *
- * @private
- */
- VertexAttributeSemantic.hasSetIndex = function (semantic) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.string("semantic", semantic);
- //>>includeEnd('debug');
- switch (semantic) {
- case VertexAttributeSemantic.POSITION:
- case VertexAttributeSemantic.NORMAL:
- case VertexAttributeSemantic.TANGENT:
- return false;
- case VertexAttributeSemantic.TEXCOORD:
- case VertexAttributeSemantic.COLOR:
- case VertexAttributeSemantic.JOINTS:
- case VertexAttributeSemantic.WEIGHTS:
- case VertexAttributeSemantic.FEATURE_ID:
- return true;
- //>>includeStart('debug', pragmas.debug);
- default:
- throw new DeveloperError("semantic is not a valid value.");
- //>>includeEnd('debug');
- }
- };
- /**
- * Gets the vertex attribute semantic matching the glTF semantic.
- *
- * @param {string} gltfSemantic The glTF semantic.
- *
- * @returns {VertexAttributeSemantic|undefined} The vertex attribute semantic, or undefined if there is no match.
- *
- * @private
- */
- VertexAttributeSemantic.fromGltfSemantic = function (gltfSemantic) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.string("gltfSemantic", gltfSemantic);
- //>>includeEnd('debug');
- let semantic = gltfSemantic;
- // Strip the set index from the semantic
- const setIndexRegex = /^(\w+)_\d+$/;
- const setIndexMatch = setIndexRegex.exec(gltfSemantic);
- if (setIndexMatch !== null) {
- semantic = setIndexMatch[1];
- }
- switch (semantic) {
- case "POSITION":
- return VertexAttributeSemantic.POSITION;
- case "NORMAL":
- return VertexAttributeSemantic.NORMAL;
- case "TANGENT":
- return VertexAttributeSemantic.TANGENT;
- case "TEXCOORD":
- return VertexAttributeSemantic.TEXCOORD;
- case "COLOR":
- return VertexAttributeSemantic.COLOR;
- case "JOINTS":
- return VertexAttributeSemantic.JOINTS;
- case "WEIGHTS":
- return VertexAttributeSemantic.WEIGHTS;
- case "_FEATURE_ID":
- return VertexAttributeSemantic.FEATURE_ID;
- }
- return undefined;
- };
- /**
- * Gets the vertex attribute semantic matching the pnts semantic.
- *
- * @param {string} pntsSemantic The pnts semantic.
- *
- * @returns {VertexAttributeSemantic|undefined} The vertex attribute semantic, or undefined if there is no match.
- *
- * @private
- */
- VertexAttributeSemantic.fromPntsSemantic = function (pntsSemantic) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.string("pntsSemantic", pntsSemantic);
- //>>includeEnd('debug');
- switch (pntsSemantic) {
- case "POSITION":
- case "POSITION_QUANTIZED":
- return VertexAttributeSemantic.POSITION;
- case "RGBA":
- case "RGB":
- case "RGB565":
- return VertexAttributeSemantic.COLOR;
- case "NORMAL":
- case "NORMAL_OCT16P":
- return VertexAttributeSemantic.NORMAL;
- case "BATCH_ID":
- return VertexAttributeSemantic.FEATURE_ID;
- //>>includeStart('debug', pragmas.debug);
- default:
- throw new DeveloperError("pntsSemantic is not a valid value.");
- //>>includeEnd('debug');
- }
- };
- /**
- * Gets the GLSL type (such as <code>vec3</code> or <code>int</code>) for the
- * given vertex attribute.
- *
- * @param {VertexAttributeSemantic} semantic The semantic.
- *
- * @returns {string} The shader type.
- *
- * @private
- */
- VertexAttributeSemantic.getGlslType = function (semantic) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.string("semantic", semantic);
- //>>includeEnd('debug');
- switch (semantic) {
- case VertexAttributeSemantic.POSITION:
- case VertexAttributeSemantic.NORMAL:
- case VertexAttributeSemantic.TANGENT:
- return "vec3";
- case VertexAttributeSemantic.TEXCOORD:
- return "vec2";
- case VertexAttributeSemantic.COLOR:
- return "vec4";
- case VertexAttributeSemantic.JOINTS:
- return "ivec4";
- case VertexAttributeSemantic.WEIGHTS:
- return "vec4";
- case VertexAttributeSemantic.FEATURE_ID:
- return "int";
- //>>includeStart('debug', pragmas.debug);
- default:
- throw new DeveloperError("semantic is not a valid value.");
- //>>includeEnd('debug');
- }
- };
- /**
- * Gets the variable name for the given semantic and set index.
- *
- * @param {VertexAttributeSemantic} semantic The semantic.
- * @param {number} [setIndex] The set index.
- *
- * @returns {string} The variable name.
- *
- * @private
- */
- VertexAttributeSemantic.getVariableName = function (semantic, setIndex) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.string("semantic", semantic);
- //>>includeEnd('debug');
- let variableName = semanticToVariableName(semantic);
- if (defined(setIndex)) {
- variableName += `_${setIndex}`;
- }
- return variableName;
- };
- export default Object.freeze(VertexAttributeSemantic);
|