shuishen
2022-11-02 764cb58899b8ca0e9632a5e83c6950569442c41c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
 * Cesium - https://github.com/CesiumGS/cesium
 *
 * Copyright 2011-2020 Cesium Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Columbus View (Pat. Pend.)
 *
 * Portions licensed separately.
 * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
 */
define(['exports', './when-8d13db60', './Check-70bec281', './BoundingSphere-775c5788'], function (exports, when, Check, BoundingSphere) { 'use strict';
 
    /**
         * Geometry instancing allows one {@link Geometry} object to be positions in several
         * different locations and colored uniquely.  For example, one {@link BoxGeometry} can
         * be instanced several times, each with a different <code>modelMatrix</code> to change
         * its position, rotation, and scale.
         *
         * @alias GeometryInstance
         * @constructor
         *
         * @param {Object} options Object with the following properties:
         * @param {Geometry} options.geometry The geometry to instance.
         * @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The model matrix that transforms to transform the geometry from model to world coordinates.
         * @param {Object} [options.id] A user-defined object to return when the instance is picked with {@link Scene#pick} or get/set per-instance attributes with {@link Primitive#getGeometryInstanceAttributes}.
         * @param {Object} [options.attributes] Per-instance attributes like a show or color attribute shown in the example below.
         *
         *
         * @example
         * // Create geometry for a box, and two instances that refer to it.
         * // One instance positions the box on the bottom and colored aqua.
         * // The other instance positions the box on the top and color white.
         * var geometry = Cesium.BoxGeometry.fromDimensions({
         *   vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL,
         *   dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0)
         * });
         * var instanceBottom = new Cesium.GeometryInstance({
         *   geometry : geometry,
         *   modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
         *     Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()),
         *   attributes : {
         *     color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
         *   },
         *   id : 'bottom'
         * });
         * var instanceTop = new Cesium.GeometryInstance({
         *   geometry : geometry,
         *   modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
         *     Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 3000000.0), new Cesium.Matrix4()),
         *   attributes : {
         *     color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
         *   },
         *   id : 'top'
         * });
         *
         * @see Geometry
         */
        function GeometryInstance(options) {
            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
 
            //>>includeStart('debug', pragmas.debug);
            if (!when.defined(options.geometry)) {
                throw new Check.DeveloperError('options.geometry is required.');
            }
            //>>includeEnd('debug');
 
            /**
             * The geometry being instanced.
             *
             * @type Geometry
             *
             * @default undefined
             */
            this.geometry = options.geometry;
 
            /**
             * The 4x4 transformation matrix that transforms the geometry from model to world coordinates.
             * When this is the identity matrix, the geometry is drawn in world coordinates, i.e., Earth's WGS84 coordinates.
             * Local reference frames can be used by providing a different transformation matrix, like that returned
             * by {@link Transforms.eastNorthUpToFixedFrame}.
             *
             * @type Matrix4
             *
             * @default Matrix4.IDENTITY
             */
            this.modelMatrix = BoundingSphere.Matrix4.clone(when.defaultValue(options.modelMatrix, BoundingSphere.Matrix4.IDENTITY));
 
            /**
             * User-defined object returned when the instance is picked or used to get/set per-instance attributes.
             *
             * @type Object
             *
             * @default undefined
             *
             * @see Scene#pick
             * @see Primitive#getGeometryInstanceAttributes
             */
            this.id = options.id;
 
            /**
             * Used for picking primitives that wrap geometry instances.
             *
             * @private
             */
            this.pickPrimitive = options.pickPrimitive;
 
            /**
             * Per-instance attributes like {@link ColorGeometryInstanceAttribute} or {@link ShowGeometryInstanceAttribute}.
             * {@link Geometry} attributes varying per vertex; these attributes are constant for the entire instance.
             *
             * @type Object
             *
             * @default undefined
             */
            this.attributes = when.defaultValue(options.attributes, {});
 
            /**
             * @private
             */
            this.westHemisphereGeometry = undefined;
            /**
             * @private
             */
            this.eastHemisphereGeometry = undefined;
        }
 
    exports.GeometryInstance = GeometryInstance;
 
});