snow-math 1.2.4 → 1.3.0pre0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +47 -569
- data/ext/snow-math/mat3.c +1 -1
- data/ext/snow-math/quat.c +3 -3
- data/ext/snow-math/snow-math.c +3794 -709
- data/ext/snow-math/vec3.c +3 -3
- data/ext/snow-math/vec4.c +4 -4
- data/lib/snow-math.rb +12 -2
- data/lib/snow-math/inspect.rb +48 -20
- data/lib/snow-math/marshal.rb +75 -0
- data/lib/snow-math/mat3.rb +66 -1
- data/lib/snow-math/mat4.rb +82 -0
- data/lib/snow-math/ptr.rb +66 -10
- data/lib/snow-math/quat.rb +91 -5
- data/lib/snow-math/swizzle.rb +77 -40
- data/lib/snow-math/to_a.rb +178 -35
- data/lib/snow-math/vec3.rb +67 -4
- data/lib/snow-math/vec4.rb +70 -4
- metadata +7 -5
- data/lib/snow-math/array_cache.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e00066f49ddedf7f84e2d892e7231b9d23ee2f47
|
4
|
+
data.tar.gz: cac62d08c53fcfa26e412b12dc53f5d1d87fa0b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12a03e8858753075b0fa744ce6a76c8d69467e5c3d5f6043b69a84ee5cba6b64090804a86dd4e2bb27f8fce2c6e29501fb8a2cbe0802ebd5190c33e98d767ee7
|
7
|
+
data.tar.gz: bacebc0520dbebcac508fae8ebcdd8811970fb4ebf6395d30c44c47a988ddba832cc025abc892deb0a84f0356f9e46319e868402b71710e22d18de222acf1190
|
data/README.md
CHANGED
@@ -38,29 +38,63 @@ To include the Fiddle support, you'll also need to `require 'snow-math/ptr'`.
|
|
38
38
|
This is to avoid dragging the entirety of Fiddle into your code when you're not
|
39
39
|
using it.
|
40
40
|
|
41
|
-
Because it's difficult to produce useful documentation for these bindings, this
|
42
|
-
is a brief outline of the classes and their functions in Ruby, sans function
|
43
|
-
bodies. Where a description of the functions is missing, the functions do what
|
44
|
-
they say on the tin.
|
45
41
|
|
46
42
|
### Notes
|
47
43
|
|
48
44
|
#### Outputs
|
49
45
|
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
Keep in mind that for any function provides an output argument, that argument
|
47
|
+
is optional. If output is non-nil, the function must write the result of its
|
48
|
+
operation to the output object, assuming the object is a compatible output.
|
53
49
|
|
54
|
-
When nil,
|
55
|
-
argument can be helpful when you want to avoid some unnecessary allocations
|
50
|
+
When nil, functions will always return a new object. Providing an output
|
51
|
+
argument can be helpful when you want to avoid some unnecessary allocations
|
52
|
+
and know that's a performance bottleneck (use a profiler before doing this).
|
56
53
|
|
57
|
-
Combined with the array types, you can either maintain a pool of 3D math
|
58
|
-
or use it to avoid cache misses
|
59
|
-
most-optimized as they allocate a wrapper object per `fetch` -- something to
|
60
|
-
keep in mind).
|
54
|
+
Combined with the array types, you can either maintain a pool of 3D math
|
55
|
+
objects or use it to avoid cache misses.
|
61
56
|
|
62
57
|
In all cases where an output is provided, output may be the the object the
|
63
58
|
function is called on. So, for example, `vec.negate(vec)` is perfectly valid.
|
59
|
+
The SnowPalm code is designed to handle this and will not accidentally trash
|
60
|
+
itself because the input and output refer to the same location in memory.
|
61
|
+
|
62
|
+
|
63
|
+
#### Thread Safety
|
64
|
+
|
65
|
+
Act as though no object is thread-safe. That is, if an object is being modified
|
66
|
+
on one thread, it should not be read from or written to on another. One thread
|
67
|
+
at a time. If possible, don't share objects between threads. The best case
|
68
|
+
scenario is you are passing serializable messages to threads rather than giving
|
69
|
+
objects directly to other threads. That said, as long as only one thread is
|
70
|
+
interacting with a given object at a time, you should be fine. To reiterate
|
71
|
+
that with an example, if you have two threads and they both allocate their own
|
72
|
+
Vec3 object, you're fine. If you have two threads and they're both using the
|
73
|
+
same Vec3 object, you are playing with fire.
|
74
|
+
|
75
|
+
Typed arrays, like Vec3Array and so on, require a little more explanation. When
|
76
|
+
accessing elements of a typed array, the array returns an object that accesses
|
77
|
+
the array's memory. The object does not have its own buffer to play with. As
|
78
|
+
such, arrays and the elements of arrays are both not thread-safe and you should
|
79
|
+
not modify an array or its elements from multiple threads at the same time.
|
80
|
+
Also, never attempt to fetch an element from an array on multiple threads at a
|
81
|
+
time, as the underlying object cache of the array is being modified even if you
|
82
|
+
aren't altering any array elements.
|
83
|
+
|
84
|
+
If you need to pass an array's element to another thread but don't care about
|
85
|
+
it modifying the underlying array data, simply #copy, #clone, or #dup the
|
86
|
+
fetched object and pass ownership of the copy to the other thread -- or pass
|
87
|
+
the object via a deserializable message so that you're not even trying to pass
|
88
|
+
objects directly to threads.
|
89
|
+
|
90
|
+
When in doubt, don't use threads. When you have to use threads and are still in
|
91
|
+
doubt, use a messaging system to pass data between threads, like [ZeroMQ],
|
92
|
+
rather than passing objects directly to threads. Safety first.
|
93
|
+
|
94
|
+
(Further note: all snow-math types work with Marshal.load and Marshal.dump, so
|
95
|
+
make use of that where it's practical and smart to do so.)
|
96
|
+
|
97
|
+
[ZeroMQ]: http://www.zeromq.org
|
64
98
|
|
65
99
|
|
66
100
|
#### Shared by All Types
|
@@ -131,562 +165,6 @@ obvious but are as follows:
|
|
131
165
|
Swizzling four components returns a Quat.
|
132
166
|
|
133
167
|
|
134
|
-
### Types
|
135
|
-
|
136
|
-
#### Snow::Vec3
|
137
|
-
|
138
|
-
class Snow::Vec3
|
139
|
-
|
140
|
-
def self.new() -> Vec3[0, 0, 0]
|
141
|
-
def self.new(x, y, z) -> Vec3[x, y, z]
|
142
|
-
def self.new(other: Vec3 | Vec4 | Quat) -> Vec3[other.x, other.y, other.z]
|
143
|
-
Aliased as :[], so you can use Vec3[0, 1, 2] to call Vec3.new(0, 1, 2).
|
144
|
-
|
145
|
-
self == rhs
|
146
|
-
Compares whether two Vec3s are equivalent. rhs may also be a Quat or Vec4,
|
147
|
-
in which case the first three components of either will be compared with
|
148
|
-
self.
|
149
|
-
|
150
|
-
def set() -> self [no-op]
|
151
|
-
def set(x, y, z) -> self
|
152
|
-
def set(other) -> self
|
153
|
-
Set takes the same arguments as self.new(...) and will call the same initialize
|
154
|
-
function as new(). If no arguments are provided to set, it does nothing.
|
155
|
-
|
156
|
-
def copy(output = nil) -> new vec3 or output
|
157
|
-
If output is nil, this is equivalent to calling o.dup or o.class.new(o).
|
158
|
-
With an output, the method copies self's components to other. For the most
|
159
|
-
part, you probably only want to use this with an output.
|
160
|
-
|
161
|
-
def inverse(output = nil) -> new vec3 or output
|
162
|
-
def inverse! -> self
|
163
|
-
~vec3 -> new vec3
|
164
|
-
Returns a vector whose components are the multiplicative inverse of the
|
165
|
-
vector's components.
|
166
|
-
|
167
|
-
def negate(output = nil) -> new vec3 or output
|
168
|
-
def negate! -> self
|
169
|
-
-vec3 -> new vec3
|
170
|
-
Returns a vector whose components are the negated form of the vector's
|
171
|
-
components. Beware of -0.0 here.
|
172
|
-
|
173
|
-
def normalize(output = nil) -> new vec3 or output
|
174
|
-
def normalize!() -> self
|
175
|
-
|
176
|
-
def multiply_vec3(rhs, output = nil) -> new vec3 or output
|
177
|
-
Multiplies both vector's components together and returns the result.
|
178
|
-
|
179
|
-
def multiply(vec3, output = nil) -> same as multiply_vec3
|
180
|
-
def multiply(scalar, output = nil) -> same as scale
|
181
|
-
def multiply!(rhs) -> same as multiply(rhs, self)
|
182
|
-
vec3 * rhs -> vec3.multiply(rhs)
|
183
|
-
|
184
|
-
def add(rhs, output = nil) -> new vec3 or output
|
185
|
-
def add!(rhs)
|
186
|
-
vec3 + vec3
|
187
|
-
|
188
|
-
def subtract(rhs, output = nil) -> new vec3 or output
|
189
|
-
def subtract!(rhs) -> self
|
190
|
-
vec3 - vec3
|
191
|
-
|
192
|
-
def project(normal, output = nil) -> new vec4 or output
|
193
|
-
def reflect(normal, output = nil) -> new vec4 or output
|
194
|
-
Returns either the projected or reflected vector, respectively. These
|
195
|
-
methods expect the 'normal' argument to be normalized -- that is, they
|
196
|
-
will not normalize their input for you.
|
197
|
-
|
198
|
-
def cross_product(rhs, output = nil) -> new vec3 or output
|
199
|
-
def cross_product!(rhs) -> self
|
200
|
-
vec3 ^ vec3 -> new vec3
|
201
|
-
|
202
|
-
def dot_product(rhs) -> Float
|
203
|
-
vec3 ** vec3 -> float
|
204
|
-
|
205
|
-
def magnitude_squared -> Float
|
206
|
-
def magnitude -> Float
|
207
|
-
Returns the squared magnitude and the magnitude, respectively. To give you
|
208
|
-
an idea of the difference, magnitude == Math.sqrt(magnitude_squared). So
|
209
|
-
if you don't need the exact magnitude and only want to compare the magnitude
|
210
|
-
of two things, you can skip a call to sqrt and use the squared magnitude.
|
211
|
-
|
212
|
-
def scale(scalar, output = nil) -> new vec3 or output
|
213
|
-
vec3 * scalar
|
214
|
-
def divide(scalar, output = nil) -> new vec3 or output
|
215
|
-
vec3 / scalar
|
216
|
-
Multiplies or divides all components of the vector by a scalar. In the case
|
217
|
-
of divide, a scalar of 0 is undefined behaviour.
|
218
|
-
|
219
|
-
def size -> size in bytes
|
220
|
-
def length -> length in floats
|
221
|
-
size is either 24 or 12, depending on whether the gem was built to use
|
222
|
-
floats or doubles. length is always 3.
|
223
|
-
|
224
|
-
def x
|
225
|
-
def x=(new_x)
|
226
|
-
Same as fetch(0) and store(0, new_x) respectively
|
227
|
-
|
228
|
-
def y
|
229
|
-
def y=(new_y)
|
230
|
-
Same as fetch(1) and store(1, new_y) respectively
|
231
|
-
|
232
|
-
def z
|
233
|
-
def z=(new_z)
|
234
|
-
Same as fetch(2) and store(2, new_z) respectively
|
235
|
-
|
236
|
-
end
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
#### Snow::Vec4
|
241
|
-
|
242
|
-
Vec4 is fundamentally the same as Vec3, except it lacks a `cross_product`
|
243
|
-
function, has four components, and provides a `w` accessor for the fourth
|
244
|
-
component. In addition, it is at times interchangeable with Quat.
|
245
|
-
|
246
|
-
class Snow::Vec4
|
247
|
-
|
248
|
-
def self.new() -> Vec4[0, 0, 0, 1]
|
249
|
-
def self.new(x, y, z, w = 1) -> Vec4[x, y, z, w]
|
250
|
-
def self.new(other: Vec3 | Vec4 | Quat) -> Vec4[other.x, other.y, other.z, other.w | 1]
|
251
|
-
Aliased as :[], so you can use Vec4[0, 1, 2, 3] to call Vec4.new(0, 1, 2, 3).
|
252
|
-
When calling Vec4.new and supplying a Vec3 to copy from, the fourth component,
|
253
|
-
w, will be set to 1.
|
254
|
-
|
255
|
-
self == rhs
|
256
|
-
Compares whether two Vec4s are equivalent. rhs may also be a Quat.
|
257
|
-
|
258
|
-
def set() -> self [no-op]
|
259
|
-
def set(x, y, z, w = 1) -> self
|
260
|
-
def set(other) -> self
|
261
|
-
Set takes the same arguments as self.new(...) and will call the same initialize
|
262
|
-
function as new(). If no arguments are provided to set, it does nothing.
|
263
|
-
|
264
|
-
def copy(output = nil) -> new vec4 or output
|
265
|
-
If output is nil, this is equivalent to calling o.dup or o.class.new(o).
|
266
|
-
With an output, the method copies self's components to other. For the most
|
267
|
-
part, you probably only want to use this with an output.
|
268
|
-
|
269
|
-
def inverse(output = nil) -> new vec4 or output
|
270
|
-
def inverse! -> self
|
271
|
-
~vec4 -> new vec4
|
272
|
-
Returns a vector whose components are the multiplicative inverse of the
|
273
|
-
vector's components.
|
274
|
-
|
275
|
-
def negate(output = nil) -> new vec4 or output
|
276
|
-
def negate! -> self
|
277
|
-
-vec4 -> new vec4
|
278
|
-
Returns a vector whose components are the negated form of the vector's
|
279
|
-
components. Beware of -0.0 here.
|
280
|
-
|
281
|
-
def normalize(output = nil) -> new vec4 or output
|
282
|
-
def normalize!() -> self
|
283
|
-
|
284
|
-
def multiply_vec4(rhs, output = nil) -> new vec4 or output
|
285
|
-
def multiply_vec4!(rhs) -> self
|
286
|
-
vec4 * vec4 -> new vec4
|
287
|
-
Multiplies both vector's components together and returns the result.
|
288
|
-
|
289
|
-
def multiply(vec4, output = nil) -> same as multiply_vec4
|
290
|
-
def multiply(numeric, output = nil) -> same as scale
|
291
|
-
def multiply!(rhs) -> same as multiply(rhs, self)
|
292
|
-
vec4 * rhs -> vec4.multiply(rhs)
|
293
|
-
|
294
|
-
def add(rhs, output = nil) -> new vec4 or output
|
295
|
-
def add!(rhs) -> self
|
296
|
-
vec4 + vec4 -> new vec4
|
297
|
-
|
298
|
-
def subtract(rhs, output = nil) -> new vec4 or output
|
299
|
-
def subtract!(rhs) -> self
|
300
|
-
vec4 - vec4 -> new vec4
|
301
|
-
|
302
|
-
def project(normal, output = nil) -> new vec4 or output
|
303
|
-
def reflect(normal, output = nil) -> new vec4 or output
|
304
|
-
Returns either the projected or reflected vector, respectively. These
|
305
|
-
methods expect the 'normal' argument to be normalized -- that is, they
|
306
|
-
will not normalize their input for you.
|
307
|
-
|
308
|
-
def dot_product(rhs) -> Float
|
309
|
-
vec4 ** vec4 -> Float
|
310
|
-
|
311
|
-
def magnitude_squared -> Float
|
312
|
-
def magnitude -> Float
|
313
|
-
Returns the squared magnitude and the magnitude, respectively. To give you
|
314
|
-
an idea of the difference, magnitude == Math.sqrt(magnitude_squared). So
|
315
|
-
if you don't need the exact magnitude and only want to compare the magnitude
|
316
|
-
of two things, you can skip a call to sqrt and use the squared magnitude.
|
317
|
-
|
318
|
-
def scale(scalar, output = nil) -> new vec4 or output
|
319
|
-
vec4 * scalar -> new vec4
|
320
|
-
def divide(scalar, output = nil) -> new vec4 or output
|
321
|
-
vec4 / scalar -> new vec4
|
322
|
-
Multiplies or divides all components of the vector by a scalar. In the case
|
323
|
-
of divide, a scalar of 0 is undefined behaviour.
|
324
|
-
|
325
|
-
def size -> size in bytes
|
326
|
-
def length -> length in floats
|
327
|
-
size is either 32 or 16. depending on whether the gem was built to use
|
328
|
-
floats or doubles. length is always 4.
|
329
|
-
|
330
|
-
def x
|
331
|
-
def x=(new_x)
|
332
|
-
Same as fetch(0) and store(0, new_x) respectively
|
333
|
-
|
334
|
-
def y
|
335
|
-
def y=(new_y)
|
336
|
-
Same as fetch(1) and store(1, new_y) respectively
|
337
|
-
|
338
|
-
def z
|
339
|
-
def z=(new_z)
|
340
|
-
Same as fetch(2) and store(2, new_z) respectively
|
341
|
-
|
342
|
-
def w
|
343
|
-
def w=(new_w)
|
344
|
-
Same as fetch(3) and store(3, new_w) respectively
|
345
|
-
|
346
|
-
end
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
#### Snow::Quat
|
351
|
-
|
352
|
-
Quat is functionally similar to Vec4, except it provides some functions specific
|
353
|
-
to quaternions. Why these aren't just part of Vec4 is a mystery for the ages
|
354
|
-
and an attempt to make code more readable.
|
355
|
-
|
356
|
-
class Snow::Quat
|
357
|
-
|
358
|
-
def self.new() -> Quat[0, 0, 0, 1]
|
359
|
-
def self.new(x, y, z, w = 1) -> Quat[x, y, z, w]
|
360
|
-
def self.new(Mat4) -> Quat from Mat4
|
361
|
-
def self.new(other: Vec3 | Quat | Quat) -> Quat[other.x, other.y, other.z, other.w | 1]
|
362
|
-
Aliased as :[], so you can use Quat[0, 1, 2, 3] to call Quat.new(0, 1, 2, 3).
|
363
|
-
When calling Quat.new and supplying a Vec3 to copy from, the fourth component,
|
364
|
-
w, will be set to 1. If provided a Mat4, it will be converted to a Quat. Without
|
365
|
-
arguments, Quat.new will return an identity quaternion.
|
366
|
-
|
367
|
-
self == rhs
|
368
|
-
Compares whether two Quats are equivalent. rhs may be either a Quat or
|
369
|
-
Vec4.
|
370
|
-
|
371
|
-
def set() -> self [no-op]
|
372
|
-
def set(x, y, z, w = 1) -> self
|
373
|
-
def set(Mat4) -> self
|
374
|
-
def set(other) -> self
|
375
|
-
This takes the same arguments as self.new and in fact just calls the Quat's
|
376
|
-
initializer with the new arguments. The only difference is that calling set()
|
377
|
-
without arguments will not set this quaternion to the identity quaternion,
|
378
|
-
because the allocator is the one responsible for that. (To do that, use
|
379
|
-
load_identity)
|
380
|
-
|
381
|
-
load_identity() -> self
|
382
|
-
Resets self to the identity quaternion.
|
383
|
-
|
384
|
-
def copy(output = nil) -> new quat or output
|
385
|
-
If output is nil, this is equivalent to calling o.dup or o.class.new(o).
|
386
|
-
With an output, the method copies self's components to other. For the most
|
387
|
-
part, you probably only want to use this with an output.
|
388
|
-
|
389
|
-
def inverse(output = nil) -> new quat or output
|
390
|
-
def inverse! -> self
|
391
|
-
~quat -> new quat
|
392
|
-
Returns the inverse of this quaternion (or writes the inverse to an output
|
393
|
-
or itself). This is not the same as a vector's inverse -- keep that in mind.
|
394
|
-
|
395
|
-
def negate(output = nil) -> new quat or output
|
396
|
-
def negate! -> self
|
397
|
-
-quat -> new quat
|
398
|
-
Returns a quaternion whose components are the negated form of the vector's
|
399
|
-
components. Beware of -0.0 here. This is the same as negating a vector.
|
400
|
-
|
401
|
-
def normalize(output = nil) -> new quat or output
|
402
|
-
def normalize!() -> self
|
403
|
-
|
404
|
-
def multiply_quat(rhs: Quat, output = nil) -> new quat or output
|
405
|
-
def multiply!(rhs: Quat) -> self
|
406
|
-
quat * quat -> new quat
|
407
|
-
The first form, multiply_quat, multiplies two quaternions and returns the
|
408
|
-
resulting quaternion. The second form, multiply!, is the same as calling
|
409
|
-
multiply_quat(rhs, self).
|
410
|
-
|
411
|
-
def mutliply_vec3(rhs: Vec3, output = nil) -> new vec3 or output
|
412
|
-
quat * vec3 -> new vec3
|
413
|
-
Multiplies a vec3 by a quat and returns the resulting vec3.
|
414
|
-
|
415
|
-
def multiply(vec3, output = nil) -> new vec3 or output
|
416
|
-
def multiply(quat, output = nil) -> new quat or output
|
417
|
-
def multiply(numeric, output = nil) -> new quat or output
|
418
|
-
quat * rhs -> quat.multiply(rhs)
|
419
|
-
In its first form, it's the same as #multiply_vec3. In its second, it's the
|
420
|
-
same as #multiply_quat. In its third, it's the same as #scale.
|
421
|
-
|
422
|
-
def add(rhs, output = nil) -> new quat or output
|
423
|
-
def add!(rhs)
|
424
|
-
quat + quat -> new quat
|
425
|
-
Same as Vec4#add and Vec4#add!.
|
426
|
-
|
427
|
-
def subtract(rhs, output = nil) -> new quat or output
|
428
|
-
def subtract!(rhs) -> self
|
429
|
-
quat - quat -> new quat
|
430
|
-
Same as Vec4#subtract and Vec4#subtract!.
|
431
|
-
|
432
|
-
def dot_product(rhs) -> Float
|
433
|
-
quat ** quat -> new quat
|
434
|
-
Same as Vec4#dot_product.
|
435
|
-
|
436
|
-
def magnitude_squared -> Float
|
437
|
-
def magnitude -> Float
|
438
|
-
Returns the squared magnitude and the magnitude, respectively. To give you
|
439
|
-
an idea of the difference, magnitude == Math.sqrt(magnitude_squared). So
|
440
|
-
if you don't need the exact magnitude and only want to compare the magnitude
|
441
|
-
of two things, you can skip a call to sqrt and use the squared magnitude.
|
442
|
-
|
443
|
-
def scale(scalar, output = nil) -> new quat or output
|
444
|
-
quat * scalar -> new quat
|
445
|
-
def divide(scalar, output = nil) -> new quat or output
|
446
|
-
quat / scalar -> new quat
|
447
|
-
Multiplies or divides all components of the quaternion by a scalar. In the
|
448
|
-
case of divide, a scalar of 0 is undefined behaviour.
|
449
|
-
|
450
|
-
def size -> size in bytes
|
451
|
-
def length -> length in floats
|
452
|
-
size is either 32 or 16. depending on whether the gem was built to use
|
453
|
-
floats or doubles. length is always 4.
|
454
|
-
|
455
|
-
def x
|
456
|
-
def x=(new_x)
|
457
|
-
Same as fetch(0) and store(0, new_x) respectively
|
458
|
-
|
459
|
-
def y
|
460
|
-
def y=(new_y)
|
461
|
-
Same as fetch(1) and store(1, new_y) respectively
|
462
|
-
|
463
|
-
def z
|
464
|
-
def z=(new_z)
|
465
|
-
Same as fetch(2) and store(2, new_z) respectively
|
466
|
-
|
467
|
-
def w
|
468
|
-
def w=(new_w)
|
469
|
-
Same as fetch(3) and store(3, new_w) respectively
|
470
|
-
|
471
|
-
end
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
#### Snow::Mat3
|
476
|
-
|
477
|
-
class Snow::Mat3
|
478
|
-
|
479
|
-
def self.new() -> identity mat3
|
480
|
-
def self.new(m1, m2, m3, ..., m9) -> mat3 with the given components
|
481
|
-
def self.new([Vec3, Vec3, Vec3]) -> mat3 with rows defined by the given Vec3s
|
482
|
-
def self.new(Quat) -> Mat3 from Quat
|
483
|
-
def self.new(Mat3) -> copy of the given Mat3
|
484
|
-
def self.new(Mat4) -> copy of the given Mat4 as a Mat3
|
485
|
-
Aliased as `[]`, so you can use Mat3[...] to create a new Mat3.
|
486
|
-
|
487
|
-
def self.angle_axis(angle_degrees, axis: Vec3, output = nil) -> new mat3 or output
|
488
|
-
Returns a new rotation matrix for the given angle and axis. The angle is in
|
489
|
-
degrees.
|
490
|
-
|
491
|
-
def set(...) -> self
|
492
|
-
Same variations and arguments as self.new(...)
|
493
|
-
|
494
|
-
def load_identity() -> self
|
495
|
-
Resets self to the identity matrix.
|
496
|
-
|
497
|
-
def to_mat4(output = nil) -> new mat4 or output
|
498
|
-
|
499
|
-
def copy(output = nil) -> new mat3 or output
|
500
|
-
Copies self to the given output matrix.
|
501
|
-
|
502
|
-
def transpose(output = nil) -> new mat3 or output
|
503
|
-
def transpose!() -> self
|
504
|
-
|
505
|
-
def inverse(output = nil) -> new mat3 or output
|
506
|
-
def inverse!() -> self on success, nil on failure
|
507
|
-
|
508
|
-
def multiply_mat3(rhs, output = nil) -> new mat3 or output
|
509
|
-
def multiply_mat3!(rhs) -> self
|
510
|
-
Multiplies this and the rhs matrix and returns the result.
|
511
|
-
|
512
|
-
def rotate_vec3(rhs, output = nil) -> new vec3 or output
|
513
|
-
Rotates a vec3 by the matrix and returns the result.
|
514
|
-
|
515
|
-
def inverse_rotate_vec3(vec3, output = nil) -> new vec3 or output
|
516
|
-
Essentially just a convenience function.
|
517
|
-
|
518
|
-
def multiply(mat3, output = nil) -> same as mutliply_mat3
|
519
|
-
def multiply(vec3, output = nil) -> same as mutliply_vec3
|
520
|
-
def multiply(numeric, output = nil) -> same as scale(N, N, N, output)
|
521
|
-
def multiply!(rhs) -> same as multiply(rhs, self)
|
522
|
-
The fourth form, multiply!, will fail if attempting to multiply a vec3.
|
523
|
-
|
524
|
-
def adjoint(output = nil) -> new mat3 or output
|
525
|
-
def adjoint!() -> new mat3 or output
|
526
|
-
|
527
|
-
def cofactor(output = nil) -> new mat3 or output
|
528
|
-
def cofactor!() -> new mat3 or output
|
529
|
-
|
530
|
-
def determinant -> Float
|
531
|
-
|
532
|
-
def scale(x, y, z, output = nil) -> new mat3 or output
|
533
|
-
def scale!(x, y, z) -> new mat3 or output
|
534
|
-
Returns a matrix with its columns scaled by the given components.
|
535
|
-
|
536
|
-
def set_row3, set_column3(index, V) -> self
|
537
|
-
V is a vector with the number of components in the function name. Sets the
|
538
|
-
Mat3's row or column to the components of the given Vec3.
|
539
|
-
|
540
|
-
def get_row3, get_column3(index, output = nil) -> new vec3 for row/column
|
541
|
-
Returns a Vec3 for the given row or column in the Mat3.
|
542
|
-
|
543
|
-
end
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
#### Snow::Mat4
|
548
|
-
|
549
|
-
class Snow::Mat4
|
550
|
-
|
551
|
-
def self.new() -> identity mat4
|
552
|
-
def self.new(m1, m2, m3, ..., m16) -> mat4 with the given components
|
553
|
-
def self.new([Vec4, Vec4, Vec4, Vec4]) -> mat4 with rows defined by the given Vec4s
|
554
|
-
def self.new(Quat) -> Mat4 from Quat
|
555
|
-
def self.new(Mat3) -> copy of the given Mat3 as a Mat4
|
556
|
-
def self.new(Mat4) -> copy of the given Mat4
|
557
|
-
Aliased as `[]`, so you can use Mat4[...] to create a new Mat4.
|
558
|
-
|
559
|
-
def self.translation(x, y, z, output = nil) -> new mat4 or output
|
560
|
-
def self.translation(Vec3, output = nil) -> new mat4 or output
|
561
|
-
Returns a translation matrix.
|
562
|
-
|
563
|
-
def self.angle_axis(angle_degrees, axis: Vec3, output = nil) -> new mat4 or output
|
564
|
-
Returns a new rotation matrix for the given angle and axis. The angle is in
|
565
|
-
degrees. This might offend some people, but I assure you, your sanity will
|
566
|
-
be preserved by doing this.
|
567
|
-
|
568
|
-
def self.frustum(left, right, bottom, top, z_near, z_far, output = nil) -> new mat4 or output
|
569
|
-
def self.orthographic(left, right, bottom, top, z_near, z_far, output = nil) -> new mat4 or output
|
570
|
-
def self.perspective(fov_y, aspect, z_near, z_far, output = nil) -> new mat4 or output
|
571
|
-
Returns the given kinds of projection matrices. In the case of perspective,
|
572
|
-
fov_y is specified in degrees. Again, your sanity will thank you.
|
573
|
-
|
574
|
-
def self.look_at(eye: Vec3, center: Vec3, up: Vec3, output = nil) -> new mat4 or output
|
575
|
-
Returns a look-at matrix.
|
576
|
-
|
577
|
-
def set(...)
|
578
|
-
Same variations and arguments as self.new(...)
|
579
|
-
|
580
|
-
def load_identity() -> self
|
581
|
-
Resets self to the identity matrix.
|
582
|
-
|
583
|
-
def to_mat3(output = nil) -> new mat3 or output
|
584
|
-
|
585
|
-
def copy(output = nil) -> new mat4 or output
|
586
|
-
Copies self to the given output matrix.
|
587
|
-
|
588
|
-
def transpose(output = nil) -> new mat4 or output
|
589
|
-
def transpose!() -> self
|
590
|
-
|
591
|
-
def inverse_orthogonal(output = nil) -> new mat4 or output
|
592
|
-
def inverse_affine(output = nil) -> new mat4 or output on success, nil on failure
|
593
|
-
def inverse_general(output = nil) -> new mat4 or output on success, nil on failure
|
594
|
-
def inverse_orthogonal!() -> self
|
595
|
-
def inverse_affine!() -> self on success, nil on failure
|
596
|
-
def inverse_general!() -> self on success, nil on failure
|
597
|
-
|
598
|
-
def translate(x, y, z, output = nil) -> new mat4 or output
|
599
|
-
def translate(vec3, output = nil) -> new mat4 or output
|
600
|
-
def translate!(x, y, z) -> self
|
601
|
-
def translate!(vec3) -> self
|
602
|
-
Essentially multiplies this matrix by a translation matrix with the given
|
603
|
-
translation and returns it.
|
604
|
-
|
605
|
-
def multiply_mat4(rhs, output = nil) -> new mat4 or output
|
606
|
-
def multiply_mat4!(rhs) -> self
|
607
|
-
Multiplies this and the rhs matrix and returns the result.
|
608
|
-
|
609
|
-
def multiply_vec4(rhs, output = nil) -> new vec4 or output
|
610
|
-
Transforms a vec4 by the matrix and returns the result.
|
611
|
-
|
612
|
-
def multiply_vec3(rhs, output = nil) -> new vec3 or output
|
613
|
-
def rotate_vec3(rhs, output = nil) -> new vec3 or output
|
614
|
-
In the first form, transforms a vec3 by the matrix and returns the result.
|
615
|
-
In the second form, rotates a vec3 by the matrix, ignoring any translation,
|
616
|
-
and returns the result.
|
617
|
-
|
618
|
-
def inverse_rotate_vec3(vec3, output = nil) -> new vec3 or output
|
619
|
-
Essentially just a convenience function.
|
620
|
-
|
621
|
-
def multiply(mat4, output = nil) -> same as mutliply_mat4
|
622
|
-
def multiply(vec3, output = nil) -> same as mutliply_vec3
|
623
|
-
def multiply(numeric, output = nil) -> same as scale(N, N, N, output)
|
624
|
-
def multiply!(rhs) -> same as multiply(rhs, self)
|
625
|
-
The fourth form, multiply!, will fail if attempting to multiply a vec3.
|
626
|
-
Aliased as `*`
|
627
|
-
|
628
|
-
def adjoint(output = nil) -> new mat4 or output
|
629
|
-
def adjoint!() -> new mat4 or output
|
630
|
-
|
631
|
-
def determinant -> Float
|
632
|
-
|
633
|
-
def scale(x, y, z, output = nil) -> new mat4 or output
|
634
|
-
def scale!(x, y, z) -> new mat4 or output
|
635
|
-
Returns a matrix with its inner 3x3 matrix's columns scaled by the given
|
636
|
-
components.
|
637
|
-
|
638
|
-
def set_row3, set_column3, set_row4, set_column4(index, V) -> self
|
639
|
-
Sets the Mat4's row or column to the components of the given vec3 or vec4.
|
640
|
-
V must be a vector with the number of components specified by the function
|
641
|
-
name.
|
642
|
-
|
643
|
-
def get_row3, get_column3, get_row4, get_column4(index, output = nil) -> new vec3 or vec4 for row/column
|
644
|
-
Returns a vector with the number of components as specified by the name for
|
645
|
-
the given row or column in the Mat4.
|
646
|
-
|
647
|
-
end
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
#### Snow::Vec3Array, Snow::Vec4Array, Snow::QuatArray, Snow::Mat3Array, Snow::Mat4Array
|
652
|
-
|
653
|
-
All typed arrays have the same interface and differ only in the kind of object
|
654
|
-
they contain. As such, this applies to all typed arrays.
|
655
|
-
|
656
|
-
class Snow::Vec3Array, Snow::Vec4Array, Snow::QuatArray, Snow::Mat3Array, Snow::Mat4Array
|
657
|
-
|
658
|
-
def self.new(length) -> new array
|
659
|
-
def self.new(array) -> copy of array
|
660
|
-
Aliased as `[]`, so you can create an array, for example, by writing
|
661
|
-
`Vec3Array[16]`. The length provided must be greater than zero, otherwise
|
662
|
-
the returned array is nil.
|
663
|
-
|
664
|
-
Array elements are always uninitialized on allocation, so they will often
|
665
|
-
contain garbage values. It is your responsibility to initialize them as
|
666
|
-
needed.
|
667
|
-
|
668
|
-
def fetch(index) -> object of array element type
|
669
|
-
Returns an object that references the array's internal data. Manipulating
|
670
|
-
this object manipulates the data in the array -- it is not simply a copy of
|
671
|
-
the array's data. The returned object is cached, so subsequent calls to
|
672
|
-
fetch will return the same object (unless resized, in which case the cache
|
673
|
-
is destroyed and objects previously bound to the array are invalid -- use
|
674
|
-
of those objects following a resize is considered undefined behaviour).
|
675
|
-
|
676
|
-
def store(index, value) -> value
|
677
|
-
Copies a value object's data into the array's data. If the value object is
|
678
|
-
already part of the array -- that is, it was created using the array's
|
679
|
-
fetch function, this is a no-op.
|
680
|
-
|
681
|
-
def resize!(new_length) -> self
|
682
|
-
def resize(new_length) -> new array
|
683
|
-
Resizes the array and returns the value. In the first form, the underlying
|
684
|
-
buffer for the array is resized. In the second form, a new array is
|
685
|
-
allocated and returned.
|
686
|
-
|
687
|
-
end
|
688
|
-
|
689
|
-
|
690
168
|
|
691
169
|
## License
|
692
170
|
|