snow-math 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/ext/snow-math/vec3.c CHANGED
@@ -45,7 +45,7 @@ s_float_t vec3_length_squared(const vec3_t v)
45
45
  */
46
46
  s_float_t vec3_length(const vec3_t v)
47
47
  {
48
- return sqrtf((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2]));
48
+ return s_sqrt((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2]));
49
49
  }
50
50
 
51
51
  void vec3_normalize(const vec3_t in, vec3_t out)
@@ -92,6 +92,18 @@ void vec3_inverse(const vec3_t v, vec3_t out)
92
92
  out[0] = (v[0] != 0.0 && v[0] != -0.0) ? (1.0 / v[0]) : v[0];
93
93
  }
94
94
 
95
+ void vec3_project(const vec3_t in, const vec3_t normal, vec3_t out)
96
+ {
97
+ vec3_scale(normal, vec3_dot_product(in, normal), out);
98
+ }
99
+
100
+ void vec3_reflect(const vec3_t in, const vec3_t normal, vec3_t out)
101
+ {
102
+ vec3_t temp;
103
+ vec3_scale(normal, 2 * vec3_dot_product(in, normal), temp);
104
+ vec3_subtract(in, temp, out);
105
+ }
106
+
95
107
  void vec3_cross_product(const vec3_t left, const vec3_t right, vec3_t out)
96
108
  {
97
109
  s_float_t x, y, z;
data/ext/snow-math/vec4.c CHANGED
@@ -48,7 +48,7 @@ s_float_t vec4_length_squared(const vec4_t v)
48
48
  */
49
49
  s_float_t vec4_length(const vec4_t v)
50
50
  {
51
- return sqrtf((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2]) + (v[3] * v[3]));
51
+ return s_sqrt((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2]) + (v[3] * v[3]));
52
52
  }
53
53
 
54
54
  void vec4_normalize(const vec4_t in, vec4_t out)
@@ -101,6 +101,18 @@ void vec4_inverse(const vec4_t v, vec4_t out)
101
101
  out[0] = (v[0] != 0.0 && v[0] != -0.0) ? (1.0 / v[0]) : v[0];
102
102
  }
103
103
 
104
+ void vec4_project(const vec4_t in, const vec4_t normal, vec4_t out)
105
+ {
106
+ vec4_scale(normal, vec4_dot_product(in, normal), out);
107
+ }
108
+
109
+ void vec4_reflect(const vec4_t in, const vec4_t normal, vec4_t out)
110
+ {
111
+ vec4_t temp;
112
+ vec4_scale(normal, 2 * vec4_dot_product(in, normal), temp);
113
+ vec4_subtract(in, temp, out);
114
+ }
115
+
104
116
  s_float_t vec4_dot_product(const vec4_t left, const vec4_t right)
105
117
  {
106
118
  return ((left[0] * right[0]) + (left[1] * right[1]) + (left[2] * right[2]) + (left[3] * right[3]));
data/lib/snow-math.rb CHANGED
@@ -5,6 +5,7 @@
5
5
  require 'snow-math/bindings'
6
6
  require 'snow-math/vec3'
7
7
  require 'snow-math/vec4'
8
+ require 'snow-math/mat3'
8
9
  require 'snow-math/mat4'
9
10
  require 'snow-math/quat'
10
11
  require 'snow-math/swizzle'
@@ -4,17 +4,32 @@
4
4
 
5
5
  require 'snow-math'
6
6
 
7
- module Snow ; end
7
+ module Snow
8
8
 
9
- module Snow::MathInspect
9
+ [:Vec3, :Vec4, :Quat, :Mat3, :Mat4].each {
10
+ |klass_sym|
11
+ if const_defined?(klass_sym)
12
+ const_get(klass_sym).class_exec {
10
13
 
11
- def inspect
12
- "<#{self.class.name}:0x#{self.address.to_s(16)} #{(0 ... self.length).map { |i| self[i] }.join(' ')}>"
13
- end
14
+ def inspect
15
+ "<#{self.class.name}:0x#{self.address.to_s(16)} #{(0 ... self.length).map { |i| self.fetch(i) }.join(' ')}>"
16
+ end
14
17
 
15
- end
18
+ }
19
+ end
20
+ }
21
+
22
+ [:Vec3Array, :Vec4Array, :QuatArray, :Mat3Array, :Mat4Array].each {
23
+ |klass_sym|
24
+ if const_defined?(klass_sym)
25
+ const_get(klass_sym).class_exec {
26
+
27
+ def inspect
28
+ "<#{self.class.name}:0x#{self.address.to_s(16)} #{(0 ... self.length).map { |i| self.fetch(i).inspect }.join(' ')}>"
29
+ end
16
30
 
17
- class Snow::Vec3 ; include Snow::MathInspect ; end
18
- class Snow::Vec4 ; include Snow::MathInspect ; end
19
- class Snow::Quat ; include Snow::MathInspect ; end
20
- class Snow::Mat4 ; include Snow::MathInspect ; end
31
+ }
32
+ end
33
+ }
34
+
35
+ end
@@ -0,0 +1,71 @@
1
+ # This file is part of ruby-snowmath.
2
+ # Copyright (c) 2013 Noel Raymond Cower. All rights reserved.
3
+ # See COPYING for license details.
4
+
5
+ require 'snow-math/bindings'
6
+
7
+ module Snow ; end
8
+
9
+ if Snow.const_defined?(:Mat4Array)
10
+ class Snow::Mat3Array
11
+ class << self ; alias_method :[], :new ; end
12
+
13
+ alias_method :[], :fetch
14
+ alias_method :[]=, :store
15
+ end
16
+ end
17
+
18
+ class Snow::Mat3
19
+
20
+ class << self ; alias_method :[], :new ; end
21
+
22
+ alias_method :[], :fetch
23
+ alias_method :[]=, :store
24
+
25
+ def transpose!
26
+ transpose self
27
+ end
28
+
29
+ def inverse!
30
+ inverse self
31
+ end
32
+
33
+ def adjoint!
34
+ adjoint self
35
+ end
36
+
37
+ def cofactor!
38
+ cofactor self
39
+ end
40
+
41
+ def multiply_mat3!(rhs)
42
+ multiply_mat3 rhs, self
43
+ end
44
+
45
+ def multiply(rhs, out = nil)
46
+ raise "Invalid type for output, must be the same as RHS" if !out.nil? && !out.kind_of?(rhs.class)
47
+ case rhs
48
+ when ::Snow::Mat3 then multiply_mat3(rhs, out)
49
+ when ::Snow::Vec3 then rotate_vec3(rhs, out)
50
+ when Numeric then scale(rhs, rhs, rhs, out)
51
+ else raise TypeError, "Invalid type for RHS"
52
+ end
53
+ end
54
+
55
+ def multiply!(rhs)
56
+ multiply rhs, case rhs
57
+ when Mat3, Numeric then self
58
+ when Vec3 then rhs
59
+ else raise TypeError, "Invalid type for RHS"
60
+ end
61
+ end
62
+
63
+ def scale!(x, y, z)
64
+ scale x, y, z, self
65
+ end
66
+
67
+ alias_method :*, :multiply
68
+ alias_method :**, :scale
69
+ alias_method :~, :transpose
70
+
71
+ end
data/lib/snow-math/ptr.rb CHANGED
@@ -5,34 +5,20 @@
5
5
  require 'snow-math'
6
6
  require 'fiddle'
7
7
 
8
- module Snow ; end
8
+ module Snow
9
9
 
10
- module Snow::MathPointers
10
+ [:Vec3, :Vec4, :Quat, :Mat3, :Mat4,
11
+ :Vec3Array, :Vec4Array, :QuatArray, :Mat3Array, :Mat4Array].each {
12
+ |klass_sym|
13
+ if const_defined?(klass_sym)
14
+ const_get(klass_sym).class_exec {
11
15
 
12
- def to_ptr
13
- Fiddle::Pointer.new(self.address, self.size)
14
- end
16
+ def to_ptr
17
+ Fiddle::Pointer.new(self.address, self.size)
18
+ end
15
19
 
16
- end
17
-
18
- class Snow::Vec3 ; include Snow::MathPointers ; end
19
- class Snow::Vec4 ; include Snow::MathPointers ; end
20
- class Snow::Quat ; include Snow::MathPointers ; end
21
- class Snow::Mat4 ; include Snow::MathPointers ; end
20
+ }
21
+ end
22
+ }
22
23
 
23
- if Snow.const_defined?(:Vec3Array)
24
- class Snow::Vec3Array ; include Snow::MathPointers ; end
25
24
  end
26
-
27
- if Snow.const_defined?(:Vec4Array)
28
- class Snow::Vec4Array ; include Snow::MathPointers ; end
29
- end
30
-
31
- if Snow.const_defined?(:QuatArray)
32
- class Snow::QuatArray ; include Snow::MathPointers ; end
33
- end
34
-
35
- if Snow.const_defined?(:Mat4Array)
36
- class Snow::Mat4Array ; include Snow::MathPointers ; end
37
- end
38
-
@@ -106,7 +106,7 @@ class Snow::Quat
106
106
  alias_method :-, :subtract
107
107
  alias_method :+, :add
108
108
  alias_method :**, :dot_product
109
- alias_method :*, :scale
109
+ alias_method :*, :multiply
110
110
  alias_method :/, :divide
111
111
  alias_method :-@, :negate
112
112
  alias_method :~, :inverse
@@ -6,52 +6,57 @@ require 'snow-math'
6
6
 
7
7
  module Snow ; end
8
8
 
9
- module Snow::Swizzle
10
-
11
- def method_missing(sym, *args)
12
- chars = sym.to_s
13
- if chars =~ self.class.class_variable_get(:@@SWIZZLE_CHARS)
14
- mapping = self.class.class_variable_get(:@@SWIZZLE_MAPPING)
15
- arg_indices = chars.each_char.map {
16
- |char|
17
- index = mapping[char]
18
- if index.nil?
19
- raise ArgumentError, "No index mapping for swizzle character #{char} found"
20
- end
21
- index
22
- }
23
- swizzle_klass = mapping[chars.length]
24
-
25
- if swizzle_klass.nil?
26
- raise ArgumentError, "No swizzle class defined for #{chars.length} components"
27
- end
28
-
29
- self.class.class_exec(arg_indices, swizzle_klass) {
30
- |indices, klass|
31
- define_method(sym) { klass.new(indices.map { |index| self.fetch(index) }) }
32
- }
33
- return self.send(sym)
34
- end
35
-
36
- super sym, *args
37
- end
38
-
39
- end
40
-
41
9
  class Snow::Vec3
42
10
  @@SWIZZLE_CHARS = /^[xyz]{3,4}$/
43
11
  @@SWIZZLE_MAPPING = { 3 => self, 4 => ::Snow::Vec4, 'x' => 0, 'y' => 1, 'z' => 2 }
44
- include ::Snow::Swizzle
45
12
  end
46
13
 
47
14
  class Snow::Vec4
48
15
  @@SWIZZLE_CHARS = /^[xyzw]{3,4}$/
49
16
  @@SWIZZLE_MAPPING = { 3 => ::Snow::Vec3, 4 => self, 'x' => 0, 'y' => 1, 'z' => 2, 'w' => 3 }
50
- include ::Snow::Swizzle
51
17
  end
52
18
 
53
19
  class Snow::Quat
54
20
  @@SWIZZLE_CHARS = /^[xyzw]{3,4}$/
55
21
  @@SWIZZLE_MAPPING = { 3 => ::Snow::Vec3, 4 => self, 'x' => 0, 'y' => 1, 'z' => 2, 'w' => 3 }
56
- include ::Snow::Swizzle
22
+ end
23
+
24
+ module Snow
25
+
26
+ [:Vec3, :Vec4, :Quat].each {
27
+ |klass_sym|
28
+
29
+ const_get(klass_sym).class_exec {
30
+
31
+ def method_missing(sym, *args)
32
+ chars = sym.to_s
33
+ if chars =~ self.class.class_variable_get(:@@SWIZZLE_CHARS)
34
+ mapping = self.class.class_variable_get(:@@SWIZZLE_MAPPING)
35
+ arg_indices = chars.each_char.map {
36
+ |char|
37
+ index = mapping[char]
38
+ if index.nil?
39
+ raise ArgumentError, "No index mapping for swizzle character #{char} found"
40
+ end
41
+ index
42
+ }
43
+ swizzle_klass = mapping[chars.length]
44
+
45
+ if swizzle_klass.nil?
46
+ raise ArgumentError, "No swizzle class defined for #{chars.length} components"
47
+ end
48
+
49
+ self.class.class_exec(arg_indices, swizzle_klass) {
50
+ |indices, klass|
51
+ define_method(sym) { klass.new(indices.map { |index| self.fetch(index) }) }
52
+ }
53
+ return self.send(sym)
54
+ end
55
+
56
+ super sym, *args
57
+ end
58
+
59
+ }
60
+ }
61
+
57
62
  end
@@ -4,48 +4,45 @@
4
4
 
5
5
  require 'snow-math'
6
6
 
7
- module Snow ; end
8
-
9
- module Snow::EnumeratorSupport
10
- include ::Enumerable
11
-
12
- def to_a
13
- (0 ... self.length).each.map { |index| fetch(index) }
14
- end
15
-
16
- def each(&block)
17
- return to_enum(:each) unless block_given?
18
- (0 ... self.length).each {
19
- |index|
20
- yield(fetch(index))
21
- }
22
- self
23
- end
24
-
25
- def map!(&block)
26
- return to_enum(:map!) unless block_given?
27
- (0 ... self.length).each {
28
- |index|
29
- store(index, yield(fetch(index)))
30
- }
31
- self
32
- end
33
-
34
- def map(&block)
35
- return to_enum(:map) unless block_given?
36
- self.dup.map!(&block)
37
- end
7
+ module Snow
8
+
9
+ [:Vec3, :Vec4, :Quat, :Mat3, :Mat4,
10
+ :Vec3Array, :Vec4Array, :QuatArray, :Mat3Array, :Mat4Array].each {
11
+ |klass_sym|
12
+ if const_defined?(klass_sym)
13
+ const_get(klass_sym).class_exec {
14
+
15
+ include ::Enumerable
16
+
17
+ def to_a
18
+ (0 ... self.length).each.map { |index| fetch(index) }
19
+ end
20
+
21
+ def each(&block)
22
+ return to_enum(:each) unless block_given?
23
+ (0 ... self.length).each {
24
+ |index|
25
+ yield(fetch(index))
26
+ }
27
+ self
28
+ end
29
+
30
+ def map!(&block)
31
+ return to_enum(:map!) unless block_given?
32
+ (0 ... self.length).each {
33
+ |index|
34
+ store(index, yield(fetch(index)))
35
+ }
36
+ self
37
+ end
38
+
39
+ def map(&block)
40
+ return to_enum(:map) unless block_given?
41
+ self.dup.map!(&block)
42
+ end
43
+
44
+ }
45
+ end
46
+ }
38
47
 
39
48
  end
40
-
41
- if Snow.const_defined?(:Vec3Array)
42
- class Snow::Vec3Array ; include Snow::EnumeratorSupport ; end
43
- class Snow::Vec4Array ; include Snow::EnumeratorSupport ; end
44
- class Snow::QuatArray ; include Snow::EnumeratorSupport ; end
45
- class Snow::Mat4Array ; include Snow::EnumeratorSupport ; end
46
- end
47
-
48
- class Snow::Vec3 ; include Snow::EnumeratorSupport ; end
49
- class Snow::Vec4 ; include Snow::EnumeratorSupport ; end
50
- class Snow::Quat ; include Snow::EnumeratorSupport ; end
51
- class Snow::Mat4 ; include Snow::EnumeratorSupport ; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snow-math
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noel Raymond Cower
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-25 00:00:00.000000000 Z
11
+ date: 2013-07-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Math types built on the SnowPalm math code
14
14
  email: ncower@gmail.com
@@ -33,6 +33,7 @@ files:
33
33
  - lib/snow-math/vec3.rb
34
34
  - lib/snow-math/vec4.rb
35
35
  - lib/snow-math.rb
36
+ - ext/snow-math/mat3.c
36
37
  - ext/snow-math/mat4.c
37
38
  - ext/snow-math/maths.c
38
39
  - ext/snow-math/quat.c