You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.1 KiB
JavaScript

import defined from "../Core/defined.js";
import DeveloperError from "../Core/DeveloperError.js";
/**
* A model's material with modifiable parameters. A glTF material
* contains parameters defined by the material's technique with values
* defined by the technique and potentially overridden by the material.
* This class allows changing these values at runtime.
* <p>
* Use {@link Model#getMaterial} to create an instance.
* </p>
*
* @alias ModelMaterial
* @internalConstructor
* @class
*
* @see Model#getMaterial
*/
function ModelMaterial(model, material, id) {
this._name = material.name;
this._id = id;
this._uniformMap = model._uniformMaps[id];
this._technique = undefined;
this._program = undefined;
this._values = undefined;
}
Object.defineProperties(ModelMaterial.prototype, {
/**
* The value of the <code>name</code> property of this material.
*
* @memberof ModelMaterial.prototype
*
* @type {String}
* @readonly
*/
name: {
get: function () {
return this._name;
},
},
/**
* The index of the material.
*
* @memberof ModelMaterial.prototype
*
* @type {String}
* @readonly
*/
id: {
get: function () {
return this._id;
},
},
});
/**
* Assigns a value to a material parameter. The type for <code>value</code>
* depends on the glTF type of the parameter. It will be a floating-point
* number, Cartesian, or matrix.
*
* @param {String} name The name of the parameter.
* @param {*} [value] The value to assign to the parameter.
*
* @exception {DeveloperError} name must match a parameter name in the material's technique that is targetable and not optimized out.
*
* @example
* material.setValue('diffuse', new Cesium.Cartesian4(1.0, 0.0, 0.0, 1.0)); // vec4
* material.setValue('shininess', 256.0); // scalar
*/
ModelMaterial.prototype.setValue = function (name, value) {
//>>includeStart('debug', pragmas.debug);
if (!defined(name)) {
throw new DeveloperError("name is required.");
}
//>>includeEnd('debug');
var uniformName = "u_" + name;
var v = this._uniformMap.values[uniformName];
//>>includeStart('debug', pragmas.debug);
if (!defined(v)) {
throw new DeveloperError(
"name must match a parameter name in the material's technique that is targetable and not optimized out."
);
}
//>>includeEnd('debug');
v.value = v.clone(value, v.value);
};
/**
* Returns the value of the parameter with the given <code>name</code>. The type of the
* returned object depends on the glTF type of the parameter. It will be a floating-point
* number, Cartesian, or matrix.
*
* @param {String} name The name of the parameter.
* @returns {*} The value of the parameter or <code>undefined</code> if the parameter does not exist.
*/
ModelMaterial.prototype.getValue = function (name) {
//>>includeStart('debug', pragmas.debug);
if (!defined(name)) {
throw new DeveloperError("name is required.");
}
//>>includeEnd('debug');
var uniformName = "u_" + name;
var v = this._uniformMap.values[uniformName];
if (!defined(v)) {
return undefined;
}
return v.value;
};
export default ModelMaterial;