123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- import Check from "../../Core/Check.js";
- import clone from "../../Core/clone.js";
- import combine from "../../Core/combine.js";
- import defined from "../../Core/defined.js";
- import Matrix4 from "../../Core/Matrix4.js";
- import BlendingState from "../BlendingState.js";
- import DepthFunction from "../DepthFunction.js";
- import ModelExperimentalUtility from "./ModelExperimentalUtility.js";
- import ModelLightingOptions from "./ModelLightingOptions.js";
- /**
- * Each node may have many mesh primitives. Most model pipeline stages operate
- * at the primitive level. Again, properties are inherited from the parent.
- *
- * @param {NodeRenderResources} nodeRenderResources The node resources to inherit from
- * @param {ModelExperimentalPrimitive} runtimePrimitive The primitive.
- *
- * @private
- */
- export default function PrimitiveRenderResources(
- nodeRenderResources,
- runtimePrimitive
- ) {
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.object("nodeRenderResources", nodeRenderResources);
- Check.typeOf.object("runtimePrimitive", runtimePrimitive);
- //>>includeEnd('debug');
- // Properties inherited from NodeRenderResources.
- /**
- * A reference to the model. Inherited from the node render resources.
- *
- * @type {ModelExperimental}
- * @readonly
- *
- * @private
- */
- this.model = nodeRenderResources.model;
- /**
- * A reference to the runtime node. Inherited from the node render resources.
- *
- * @type {ModelExperimentalNode}
- * @readonly
- *
- * @private
- */
- this.runtimeNode = nodeRenderResources.runtimeNode;
- /**
- * The vertex attributes. This is shallow cloned from the node render
- * resources as the primitive will add additional properties.
- *
- * @type {Object[]}
- *
- * @private
- */
- this.attributes = nodeRenderResources.attributes.slice();
- /**
- * The index to give to the next vertex attribute added to the attributes array. POSITION
- * takes index 0. Inherited from the node render resources.
- *
- * @type {Number}
- * @readonly
- *
- * @private
- */
- this.attributeIndex = nodeRenderResources.attributeIndex;
- /**
- * The set index to assign to feature ID vertex attribute(s) created from the offset/repeat in the feature ID attribute.
- * Inherited from the node render resources.
- *
- * @type {Number}
- *
- * @private
- */
- this.featureIdVertexAttributeSetIndex =
- nodeRenderResources.featureIdVertexAttributeSetIndex;
- /**
- * Whether or not this primitive has a property table for storing metadata.
- * When present, picking and styling can use this
- *
- * @type {Boolean}
- * @default false
- * @readonly
- *
- * @private
- */
- this.hasPropertyTable = false;
- /**
- * A dictionary mapping uniform name to functions that return the uniform
- * values. Inherited from the node render resources.
- *
- * @type {Object.<String, Function>}
- * @readonly
- *
- * @private
- */
- this.uniformMap = clone(nodeRenderResources.uniformMap);
- /**
- * Options for configuring the alpha stage such as pass and alpha mode. Inherited from the node
- * render resources.
- *
- * @type {ModelAlphaOptions}
- * @readonly
- *
- * @private
- */
- this.alphaOptions = clone(nodeRenderResources.alphaOptions);
- /**
- * An object used to build a shader incrementally. This is cloned from the
- * node render resources because each primitive can compute a different shader.
- *
- * @type {ShaderBuilder}
- * @readonly
- *
- * @private
- */
- this.shaderBuilder = nodeRenderResources.shaderBuilder.clone();
- /**
- * The number of instances. Default is 0, if instancing is not used. Inherited from the node render resources.
- *
- * @type {Number}
- * @readonly
- *
- * @private
- */
- this.instanceCount = nodeRenderResources.instanceCount;
- /**
- * A reference to the runtime primitive
- *
- * @type {ModelExperimentalPrimitive}
- * @readonly
- *
- * @private
- */
- this.runtimePrimitive = runtimePrimitive;
- /**
- * The primitive associated with the render resources.
- *
- * @type {ModelComponents.Primitive}
- * @readonly
- *
- * @private
- */
- const primitive = runtimePrimitive.primitive;
- // other properties
- /**
- * The number of indices in the primitive. The interpretation of this
- * depends on the primitive type.
- *
- * @type {Number}
- * @readonly
- *
- * @private
- */
- this.count = defined(primitive.indices)
- ? primitive.indices.count
- : ModelExperimentalUtility.getAttributeBySemantic(primitive, "POSITION")
- .count;
- /**
- * The indices for this primitive
- *
- * @type {ModelComponents.Indices}
- * @readonly
- *
- * @private
- */
- this.indices = primitive.indices;
- /**
- * The primitive type such as TRIANGLES or POINTS
- *
- * @type {PrimitiveType}
- * @readonly
- *
- * @private
- */
- this.primitiveType = primitive.primitiveType;
- /**
- * The bounding sphere that contains all the vertices in this primitive.
- *
- * @type {BoundingSphere}
- */
- this.boundingSphere = ModelExperimentalUtility.createBoundingSphere(
- primitive,
- Matrix4.IDENTITY,
- nodeRenderResources.instancingTranslationMax,
- nodeRenderResources.instancingTranslationMin
- );
- /**
- * Options for configuring the lighting stage such as selecting between
- * unlit and PBR shading.
- *
- * @type {ModelLightingOptions}
- * @readonly
- *
- * @private
- */
- this.lightingOptions = new ModelLightingOptions();
- /**
- * The shader variable to use for picking.
- *
- * @type {String}
- * @readonly
- *
- * @private
- */
- this.pickId = undefined;
- /**
- * An object storing options for creating a {@link RenderState}.
- * the pipeline stages simply set the options, the render state is created
- * when the {@link DrawCommand} is constructed.
- *
- * @type {Object}
- * @readonly
- *
- * @private
- */
- this.renderStateOptions = combine(nodeRenderResources.renderStateOptions, {
- depthTest: {
- enabled: true,
- func: DepthFunction.LESS_OR_EQUAL,
- },
- blending: BlendingState.DISABLED,
- });
- /**
- * An enum describing the types of draw commands needed, based on the style.
- *
- * @type {StyleCommandsNeeded}
- * @readonly
- *
- * @private
- */
- this.styleCommandsNeeded = undefined;
- }
|