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.
117 lines
3.7 KiB
JavaScript
117 lines
3.7 KiB
JavaScript
import ColorGeometryInstanceAttribute from "../Core/ColorGeometryInstanceAttribute.js";
|
|
import defaultValue from "../Core/defaultValue.js";
|
|
import defined from "../Core/defined.js";
|
|
import DeveloperError from "../Core/DeveloperError.js";
|
|
import GeometryInstance from "../Core/GeometryInstance.js";
|
|
import GeometryPipeline from "../Core/GeometryPipeline.js";
|
|
import Matrix4 from "../Core/Matrix4.js";
|
|
import PerInstanceColorAppearance from "./PerInstanceColorAppearance.js";
|
|
import Primitive from "./Primitive.js";
|
|
|
|
/**
|
|
* Creates a {@link Primitive} to visualize well-known vector vertex attributes:
|
|
* <code>normal</code>, <code>tangent</code>, and <code>bitangent</code>. Normal
|
|
* is red; tangent is green; and bitangent is blue. If an attribute is not
|
|
* present, it is not drawn.
|
|
*
|
|
* @function
|
|
*
|
|
* @param {Object} options Object with the following properties:
|
|
* @param {Geometry} options.geometry The <code>Geometry</code> instance with the attribute.
|
|
* @param {Number} [options.length=10000.0] The length of each line segment in meters. This can be negative to point the vector in the opposite direction.
|
|
* @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The model matrix that transforms to transform the geometry from model to world coordinates.
|
|
* @returns {Primitive} A new <code>Primitive</code> instance with geometry for the vectors.
|
|
*
|
|
* @example
|
|
* scene.primitives.add(Cesium.createTangentSpaceDebugPrimitive({
|
|
* geometry : instance.geometry,
|
|
* length : 100000.0,
|
|
* modelMatrix : instance.modelMatrix
|
|
* }));
|
|
*/
|
|
function createTangentSpaceDebugPrimitive(options) {
|
|
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
|
|
var instances = [];
|
|
var geometry = options.geometry;
|
|
|
|
//>>includeStart('debug', pragmas.debug);
|
|
if (!defined(geometry)) {
|
|
throw new DeveloperError("options.geometry is required.");
|
|
}
|
|
//>>includeEnd('debug');
|
|
|
|
if (!defined(geometry.attributes) || !defined(geometry.primitiveType)) {
|
|
// to create the debug lines, we need the computed attributes.
|
|
// compute them if they are undefined.
|
|
geometry = geometry.constructor.createGeometry(geometry);
|
|
}
|
|
|
|
var attributes = geometry.attributes;
|
|
var modelMatrix = Matrix4.clone(
|
|
defaultValue(options.modelMatrix, Matrix4.IDENTITY)
|
|
);
|
|
var length = defaultValue(options.length, 10000.0);
|
|
|
|
if (defined(attributes.normal)) {
|
|
instances.push(
|
|
new GeometryInstance({
|
|
geometry: GeometryPipeline.createLineSegmentsForVectors(
|
|
geometry,
|
|
"normal",
|
|
length
|
|
),
|
|
attributes: {
|
|
color: new ColorGeometryInstanceAttribute(1.0, 0.0, 0.0, 1.0),
|
|
},
|
|
modelMatrix: modelMatrix,
|
|
})
|
|
);
|
|
}
|
|
|
|
if (defined(attributes.tangent)) {
|
|
instances.push(
|
|
new GeometryInstance({
|
|
geometry: GeometryPipeline.createLineSegmentsForVectors(
|
|
geometry,
|
|
"tangent",
|
|
length
|
|
),
|
|
attributes: {
|
|
color: new ColorGeometryInstanceAttribute(0.0, 1.0, 0.0, 1.0),
|
|
},
|
|
modelMatrix: modelMatrix,
|
|
})
|
|
);
|
|
}
|
|
|
|
if (defined(attributes.bitangent)) {
|
|
instances.push(
|
|
new GeometryInstance({
|
|
geometry: GeometryPipeline.createLineSegmentsForVectors(
|
|
geometry,
|
|
"bitangent",
|
|
length
|
|
),
|
|
attributes: {
|
|
color: new ColorGeometryInstanceAttribute(0.0, 0.0, 1.0, 1.0),
|
|
},
|
|
modelMatrix: modelMatrix,
|
|
})
|
|
);
|
|
}
|
|
|
|
if (instances.length > 0) {
|
|
return new Primitive({
|
|
asynchronous: false,
|
|
geometryInstances: instances,
|
|
appearance: new PerInstanceColorAppearance({
|
|
flat: true,
|
|
translucent: false,
|
|
}),
|
|
});
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
export default createTangentSpaceDebugPrimitive;
|