-
Notifications
You must be signed in to change notification settings - Fork 3
/
element.js
202 lines (181 loc) · 7.05 KB
/
element.js
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*
* Copyright 2010, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* An Element manages DrawElements for classes inherited from Element.
*
* @param {!o3d.Material} opt_material The Material used by this Element.
* @param {!o3d.BoundingBox} opt_boundingBox The BoundingBox used by this
* Element for culling.
* @param {!o3d.Point3} opt_zSortPoint The point to sort by when rendering
* this Element in a z ordered DrawPass.
* @param {boolean} opt_cull Whether or not to attempt to cull this
* Element based on whether or not its bounding box is in the view
* frustum.
* @constructor
*/
o3d.Element =
function(opt_material, opt_boundingBox, opt_zSortPoint, opt_cull) {
o3d.ParamObject.call(this);
/**
* The Material for this element.
* @type {o3d.Material}
*/
this.material = opt_material;
/**
* The BoundingBox for this element. If culling is on this bounding
* box will be tested against the view frustum of any draw context
* used to render this Element.
* @type {o3d.BoundingBox}
*/
this.boundingBox = opt_boundingBox ||
new o3d.BoundingBox([-1, -1, -1], [1, 1, 1]);
/**
* The z sort point for this element. If this Element is drawn by a DrawPass
* that is set to sort by z order this value will be multiplied by the
* worldViewProjection matrix to compute a z value to sort by.
* @type {o3d.Point3}
*/
this.zSortPoint = opt_zSortPoint || [0, 0, 0];
/**
* The priority for this element. Used to sort if this Element is drawn by a
* DrawPass that is set to sort by priority.
* @type {number}
*/
this.priority = 0;
/**
* The cull settings for this element. If true this Element will be
* culled by the bounding box above compared to the view frustum it
* is being rendered with.
*
* @type {boolean}
*/
this.cull = opt_cull || false;
/**
* The current owner of this Draw Element. Pass in null to stop
* being owned.
*
* Note: Elements are referenced by the Pack they are created in and
* their owner. If the Element is removed from its Pack, then
* setting the owner to null will free the Element. Or, visa versa,
* if you set the Element's owner to null then removing it from its
* Pack will free the Element.
*
* @type {o3d.Element}
*/
this.owner_ = null;
/**
* Gets all the DrawElements under this Element.
*
* Each access to this field gets the entire list so it is best to get it
* just once. For example:
*
* var drawElements = element.drawElements;
* for (var i = 0; i < drawElements.length; i++) {
* var drawElement = drawElements[i];
* }
*
*
* Note that modifications to this array [e.g. push()] will not affect
* the underlying Element, while modifications to the members of the array.
* will affect them.
*
* @type {!Array.<!o3d.DrawElement>}
*/
this.drawElements = [];
};
o3d.inherit('Element', 'ParamObject');
o3d.ParamObject.setUpO3DParam_(o3d.Element, 'material', 'ParamMaterial');
o3d.ParamObject.setUpO3DParam_(o3d.Element, 'boundingBox', 'ParamBoundingBox');
o3d.ParamObject.setUpO3DParam_(o3d.Element, 'zSortPoint', 'ParamFloat3');
o3d.ParamObject.setUpO3DParam_(o3d.Element, 'priority', 'ParamFloat');
o3d.ParamObject.setUpO3DParam_(o3d.Element, 'cull', 'ParamBoolean');
o3d.Element.prototype.__defineSetter__('owner',
function(o) {
this.owner_ = o;
o.addElement(this);
}
);
o3d.Element.prototype.__defineGetter__('owner',
function() {
return this.owner_;
}
);
/**
* Creates a DrawElement for this Element. Note that unlike
* Shape.createDrawElements and Transform.createDrawElements this one will
* create more than one element for the same material.
*
* @param {!o3d.Pack} pack pack used to manage created DrawElement.
* @param {!o3d.Material} material material to use for DrawElement.
* Note: When a DrawElement with a material of null is rendered, the
* material on the corresponding Element will get used instead.
* This allows you to easily setup the default (just draw as is) by passing
* null or setup a shadow pass by passing in a shadow material.
* @return {!o3d.DrawElement} The created draw element.
*/
o3d.Element.prototype.createDrawElement =
function(pack, material) {
drawElement = pack.createObject('DrawElement');
drawElement.owner = this;
drawElement.material = material;
this.drawElements.push(drawElement);
return drawElement;
};
/**
* Computes the intersection of a ray in the same coordinate system as
* the specified POSITION stream.
* @param {number} position_stream_index Index of POSITION stream.
* @param {o3d.Cull} cull which side of the triangles to ignore.
* @param {!o3d.math.Point3} start position of start of ray in local space.
* @param {!o3d.math.Point3} end position of end of ray. in local space.
* @return {!o3d.RayIntersectionInfo} RayIntersectionInfo class. If valid()
* is false then something was wrong, Check GetLastError(). If
* intersected() is true then the ray intersected a something. position()
* is the exact point of intersection.
*/
o3d.Element.prototype.intersectRay =
function(position_stream_index, cull, start, end) {
o3d.notImplemented();
};
/**
* Computes the bounding box in same coordinate system as the specified
* POSITION stream.
* @param {number} position_stream_index Index of POSITION stream.
* @return {!o3d.BoundingBox} The boundingbox for this element in local space.
*/
o3d.Element.prototype.getBoundingBox =
function(position_stream_index) {
return this.boundingBox;
};
/**
* Virtual function that renders the element.
*/
o3d.Element.prototype.render = function() { };