pbox2d 0.9.1-java → 1.0.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -5
- data/CHANGELOG.md +4 -0
- data/README.md +6 -6
- data/docs/.gitignore +6 -0
- data/docs/_classes/pbox2d.md +375 -0
- data/docs/_classes/world_builder.md +7 -0
- data/docs/_config.yml +32 -0
- data/docs/_includes/footer.html +55 -0
- data/docs/_includes/head.html +18 -0
- data/docs/_includes/header.html +27 -0
- data/docs/_includes/menu.html +8 -0
- data/docs/_includes/navigation.html +24 -0
- data/docs/_layouts/default.html +20 -0
- data/docs/_layouts/page.html +14 -0
- data/docs/_layouts/post.html +15 -0
- data/docs/_methods/init_options.md +28 -0
- data/docs/_methods/processing_to_world.md +29 -0
- data/docs/_methods/scale_to_processing.md +24 -0
- data/docs/_methods/scale_to_world.md +29 -0
- data/docs/_methods/step_options.md +25 -0
- data/docs/_methods/world_to_processing.md +30 -0
- data/docs/_modules/pb.md +25 -0
- data/docs/_modules/world_builder.md +26 -0
- data/docs/_posts/2016-10-14-welcome.md +183 -0
- data/docs/_sass/_base.scss +204 -0
- data/docs/_sass/_layout.scss +236 -0
- data/docs/_sass/_syntax-highlighting.scss +67 -0
- data/docs/about.md +20 -0
- data/docs/classes.html +9 -0
- data/docs/css/main.scss +52 -0
- data/docs/favicon.ico +0 -0
- data/docs/index.html +38 -0
- data/docs/methods.html +9 -0
- data/docs/modules.html +12 -0
- data/lib/pbox2d/version.rb +1 -1
- data/pbox2d.gemspec +4 -7
- data/pom.rb +8 -6
- data/pom.xml +3 -3
- data/src/org/jbox2d/collision/AABB.java +2 -2
- data/src/org/jbox2d/collision/Manifold.java +2 -2
- data/src/org/jbox2d/collision/ManifoldPoint.java +2 -2
- data/src/org/jbox2d/collision/shapes/MassData.java +1 -1
- data/src/org/jbox2d/common/Mat22.java +6 -13
- data/src/org/jbox2d/common/Mat33.java +253 -233
- data/src/org/jbox2d/common/MathUtils.java +5 -5
- data/src/org/jbox2d/common/Rot.java +16 -19
- data/src/org/jbox2d/common/Transform.java +4 -4
- data/src/org/jbox2d/common/Vec2.java +6 -12
- data/src/org/jbox2d/common/Vec3.java +147 -142
- data/src/org/jbox2d/dynamics/joints/DistanceJoint.java +4 -2
- metadata +62 -25
@@ -0,0 +1,67 @@
|
|
1
|
+
/**
|
2
|
+
* Syntax highlighting styles
|
3
|
+
*/
|
4
|
+
.highlight {
|
5
|
+
background: #fff;
|
6
|
+
@extend %vertical-rhythm;
|
7
|
+
|
8
|
+
.c { color: #998; font-style: italic } // Comment
|
9
|
+
.err { color: #a61717; background-color: #e3d2d2 } // Error
|
10
|
+
.k { font-weight: bold } // Keyword
|
11
|
+
.o { font-weight: bold } // Operator
|
12
|
+
.cm { color: #998; font-style: italic } // Comment.Multiline
|
13
|
+
.cp { color: #999; font-weight: bold } // Comment.Preproc
|
14
|
+
.c1 { color: #998; font-style: italic } // Comment.Single
|
15
|
+
.cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
|
16
|
+
.gd { color: #000; background-color: #fdd } // Generic.Deleted
|
17
|
+
.gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
|
18
|
+
.ge { font-style: italic } // Generic.Emph
|
19
|
+
.gr { color: #a00 } // Generic.Error
|
20
|
+
.gh { color: #999 } // Generic.Heading
|
21
|
+
.gi { color: #000; background-color: #dfd } // Generic.Inserted
|
22
|
+
.gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
|
23
|
+
.go { color: #888 } // Generic.Output
|
24
|
+
.gp { color: #555 } // Generic.Prompt
|
25
|
+
.gs { font-weight: bold } // Generic.Strong
|
26
|
+
.gu { color: #aaa } // Generic.Subheading
|
27
|
+
.gt { color: #a00 } // Generic.Traceback
|
28
|
+
.kc { font-weight: bold } // Keyword.Constant
|
29
|
+
.kd { font-weight: bold } // Keyword.Declaration
|
30
|
+
.kp { font-weight: bold } // Keyword.Pseudo
|
31
|
+
.kr { font-weight: bold } // Keyword.Reserved
|
32
|
+
.kt { color: #458; font-weight: bold } // Keyword.Type
|
33
|
+
.m { color: #099 } // Literal.Number
|
34
|
+
.s { color: #d14 } // Literal.String
|
35
|
+
.na { color: #008080 } // Name.Attribute
|
36
|
+
.nb { color: #0086B3 } // Name.Builtin
|
37
|
+
.nc { color: #458; font-weight: bold } // Name.Class
|
38
|
+
.no { color: #008080 } // Name.Constant
|
39
|
+
.ni { color: #800080 } // Name.Entity
|
40
|
+
.ne { color: #900; font-weight: bold } // Name.Exception
|
41
|
+
.nf { color: #900; font-weight: bold } // Name.Function
|
42
|
+
.nn { color: #555 } // Name.Namespace
|
43
|
+
.nt { color: #000080 } // Name.Tag
|
44
|
+
.nv { color: #008080 } // Name.Variable
|
45
|
+
.ow { font-weight: bold } // Operator.Word
|
46
|
+
.w { color: #bbb } // Text.Whitespace
|
47
|
+
.mf { color: #099 } // Literal.Number.Float
|
48
|
+
.mh { color: #099 } // Literal.Number.Hex
|
49
|
+
.mi { color: #099 } // Literal.Number.Integer
|
50
|
+
.mo { color: #099 } // Literal.Number.Oct
|
51
|
+
.sb { color: #d14 } // Literal.String.Backtick
|
52
|
+
.sc { color: #d14 } // Literal.String.Char
|
53
|
+
.sd { color: #d14 } // Literal.String.Doc
|
54
|
+
.s2 { color: #d14 } // Literal.String.Double
|
55
|
+
.se { color: #d14 } // Literal.String.Escape
|
56
|
+
.sh { color: #d14 } // Literal.String.Heredoc
|
57
|
+
.si { color: #d14 } // Literal.String.Interpol
|
58
|
+
.sx { color: #d14 } // Literal.String.Other
|
59
|
+
.sr { color: #009926 } // Literal.String.Regex
|
60
|
+
.s1 { color: #d14 } // Literal.String.Single
|
61
|
+
.ss { color: #990073 } // Literal.String.Symbol
|
62
|
+
.bp { color: #999 } // Name.Builtin.Pseudo
|
63
|
+
.vc { color: #008080 } // Name.Variable.Class
|
64
|
+
.vg { color: #008080 } // Name.Variable.Global
|
65
|
+
.vi { color: #008080 } // Name.Variable.Instance
|
66
|
+
.il { color: #099 } // Literal.Number.Integer.Long
|
67
|
+
}
|
data/docs/about.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
title: About
|
4
|
+
permalink: /about/
|
5
|
+
categories: jruby_art update
|
6
|
+
---
|
7
|
+
|
8
|
+
[JRubyArt][jruby_art] is a ruby wrapper for [processing-3.2.1][processing]. Create processing sketches in ruby using regular ruby-2.3 syntax, and use the magic [JRuby][jruby] to run them. You can use both rubygems and and regular processing libraries in your sketches. Features run, watch and live modes (uses pry).
|
9
|
+
|
10
|
+
In general where there is a choice of using a java (processing) method or a regular ruby method you should choose the ruby method (eg use `rand` in place of `random`). Further you should prefer to use `JRuby` classes `Vec2D` and `Vec3D` instead of processings `PVector` class. Processing has a number of convenience methods which are not needed in ruby (eg 'pow' use `**` in JRubyArt) and some static methods have not been implemented in JRubyArt. For the processing `map` method prefer `map1d` ([see example][map1d]) or use `p5map` if you must. Another thing to watch is `color` which is implemented differently in JRubyArt ([see example][color]).
|
11
|
+
|
12
|
+
See also my [blog][blog] for more code ideas.
|
13
|
+
|
14
|
+
[jruby]: https://jruby.org
|
15
|
+
[processing]: https://processing.org
|
16
|
+
|
17
|
+
[jruby_art]: https://ruby-processing.github.io/index.html
|
18
|
+
[color]: https://github.com/ruby-processing/JRubyArt-examples/blob/master/processing_app/basics/color/creating.rb
|
19
|
+
[map1d]: https://github.com/ruby-processing/JRubyArt-examples/blob/master/processing_app/basics/arrays/array.rb
|
20
|
+
[blog]:https://monkstone.github.io/
|
data/docs/classes.html
ADDED
data/docs/css/main.scss
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
# Only the main Sass file needs front matter (the dashes are enough)
|
3
|
+
---
|
4
|
+
@charset "utf-8";
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
// Our variables
|
9
|
+
$base-font-family: Helvetica, Arial, sans-serif;
|
10
|
+
$base-font-size: 16px;
|
11
|
+
$small-font-size: $base-font-size * 0.875;
|
12
|
+
$base-line-height: 1.5;
|
13
|
+
|
14
|
+
$spacing-unit: 30px;
|
15
|
+
|
16
|
+
$text-color: #111;
|
17
|
+
$background-color: #fdfdfd;
|
18
|
+
$brand-color: #2a7ae2;
|
19
|
+
|
20
|
+
$grey-color: #828282;
|
21
|
+
$grey-color-light: lighten($grey-color, 40%);
|
22
|
+
$grey-color-dark: darken($grey-color, 25%);
|
23
|
+
|
24
|
+
// Width of the content area
|
25
|
+
$content-width: 800px;
|
26
|
+
|
27
|
+
$on-palm: 600px;
|
28
|
+
$on-laptop: 800px;
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
// Using media queries with like this:
|
33
|
+
// @include media-query($on-palm) {
|
34
|
+
// .wrapper {
|
35
|
+
// padding-right: $spacing-unit / 2;
|
36
|
+
// padding-left: $spacing-unit / 2;
|
37
|
+
// }
|
38
|
+
// }
|
39
|
+
@mixin media-query($device) {
|
40
|
+
@media screen and (max-width: $device) {
|
41
|
+
@content;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
// Import partials from `sass_dir` (defaults to `_sass`)
|
48
|
+
@import
|
49
|
+
"base",
|
50
|
+
"layout",
|
51
|
+
"syntax-highlighting"
|
52
|
+
;
|
data/docs/favicon.ico
ADDED
Binary file
|
data/docs/index.html
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
<section role="banner">
|
5
|
+
<svg version="1.1" id="Layer_1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" x="0px" y="0px"
|
6
|
+
width="256px" height="256px" viewBox="10 10 200 200" style="enable-background:new 0 0 200 200;" xml:space="preserve" fill="#380E99">
|
7
|
+
<g>
|
8
|
+
<path d="M56.161,183.028l4.452-43.162l7.904,6.584L56,185.335L56.161,183.028z M70.823,152.055l19.61,39.046l-32.951,4.116
|
9
|
+
L70.823,152.055z M92.739,195.552v0.161V195.552l0.657-0.161v0.161l93.095,3.62l-126.703,0.496L92.739,195.552z M127.997,90.604
|
10
|
+
l-30.645,34.098l-27.186,17.137l-7.743-6.584l10.874-20.435l25.872-28.842l24.711-17.297l11.371,3.138L127.997,90.604z
|
11
|
+
M90.266,182.036l-18.122-36.082l25.375-16.144L90.266,182.036z M154.693,141.181l-61.129,48.271l8.24-59.306L154.693,141.181z
|
12
|
+
M158.152,144.479l38.06,51.569l-98.532-3.795L158.152,144.479z M130.638,94.546l22.734,43.015l-51.241-11.371L130.638,94.546z
|
13
|
+
M171.004,56.332l-34.111,11.035l-6.094-1.649L171.004,56.332z M132.945,90.604l7.576-19.281l42.183,6.758L132.945,90.604z
|
14
|
+
M134.922,94.546l53.875-14.494l-30.973,57.83L134.922,94.546z M194.234,76.257l-45.146-7.897l36.082-11.706L194.234,76.257z
|
15
|
+
M200,195.391l-39.213-53.218l33.943-63.609L200,195.391z"/>
|
16
|
+
</g>
|
17
|
+
</svg>
|
18
|
+
</section>
|
19
|
+
|
20
|
+
<div class="home">
|
21
|
+
|
22
|
+
<h1 class="page-heading">Articles</h1>
|
23
|
+
|
24
|
+
<ul class="post-list">
|
25
|
+
{% for post in site.posts %}
|
26
|
+
<li>
|
27
|
+
<span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
|
28
|
+
|
29
|
+
<h2>
|
30
|
+
<a class="post-link" href="{{ post.url | prepend: site.github.url }}">{{ post.title }}</a>
|
31
|
+
</h2>
|
32
|
+
</li>
|
33
|
+
{% endfor %}
|
34
|
+
</ul>
|
35
|
+
|
36
|
+
<p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | prepend: site.github.url }}">via RSS</a></p>
|
37
|
+
|
38
|
+
</div>
|
data/docs/methods.html
ADDED
data/docs/modules.html
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
title: Modules
|
4
|
+
---
|
5
|
+
|
6
|
+
{% for module in site.modules %}
|
7
|
+
<div class="module">
|
8
|
+
<h2><a href="{{ module.url | prepend: site.github.url }}">{{ module.title }}</a></h2>
|
9
|
+
</div>
|
10
|
+
{% endfor %}
|
11
|
+
|
12
|
+
<p>If you are new to ruby, you can read more about <a href="https://www.tutorialspoint.com/ruby/ruby_modules.htm">modules here</a></p>
|
data/lib/pbox2d/version.rb
CHANGED
data/pbox2d.gemspec
CHANGED
@@ -13,16 +13,13 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.email = ['mamba2928@yahoo.co.uk']
|
14
14
|
spec.summary = %q{jbox2d wrapped in a gem for JRubyArt}
|
15
15
|
spec.description = <<-EOF
|
16
|
-
"An exemplar for making
|
17
|
-
in JRubyArt. Features a polyglot maven build, and also demonstrates how creating
|
18
|
-
an interface can avoid the need for explicit calls to java reflection."
|
16
|
+
"An exemplar for making java libraries available as a gem, for use in JRubyArt /propane. Features a polyglot maven build, and also demonstrates how to create an interface so avoid needing explicit calls to java reflection."
|
19
17
|
EOF
|
20
|
-
spec.homepage = 'https://
|
18
|
+
spec.homepage = 'https://ruby-processing.github.io/jbox2d'
|
21
19
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
20
|
spec.files << 'lib/box2d.jar'
|
23
21
|
spec.require_paths = ['lib']
|
24
|
-
spec.
|
25
|
-
spec.add_development_dependency "
|
26
|
-
spec.add_development_dependency "minitest", "~> 5.8"
|
22
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
23
|
+
spec.add_development_dependency "minitest", "~> 5.10"
|
27
24
|
spec.platform='java'
|
28
25
|
end
|
data/pom.rb
CHANGED
@@ -2,7 +2,7 @@ require 'fileutils'
|
|
2
2
|
project 'pbox2d', 'https://github.com/ruby-processing/jbox2d' do
|
3
3
|
|
4
4
|
model_version '4.0.0'
|
5
|
-
id 'ruby-processing:pbox2d', '0.
|
5
|
+
id 'ruby-processing:pbox2d', '1.0.0'
|
6
6
|
packaging 'jar'
|
7
7
|
|
8
8
|
description 'jbox2d for JRubyArt'
|
@@ -12,7 +12,7 @@ project 'pbox2d', 'https://github.com/ruby-processing/jbox2d' do
|
|
12
12
|
developer 'monkstone' do
|
13
13
|
name 'Martin Prout'
|
14
14
|
email 'mamba2928@yahoo.co.uk'
|
15
|
-
roles 'developer'
|
15
|
+
roles 'developer'
|
16
16
|
end
|
17
17
|
|
18
18
|
license 'BSD-2-clause', 'http://www.opensource.org/licenses/bsd-license.php'
|
@@ -24,7 +24,7 @@ project 'pbox2d', 'https://github.com/ruby-processing/jbox2d' do
|
|
24
24
|
:connection => 'scm:git:git://github.com/ruby-processing/jbox2d.git',
|
25
25
|
:developer_connection => 'scm:git:git@github.com/ruby-processing/jbox2dt.git'
|
26
26
|
)
|
27
|
-
|
27
|
+
|
28
28
|
properties( 'maven.compiler.source' => '1.8',
|
29
29
|
'project.build.sourceEncoding' => 'UTF-8',
|
30
30
|
'maven.compiler.target' => '1.8',
|
@@ -33,12 +33,14 @@ project 'pbox2d', 'https://github.com/ruby-processing/jbox2d' do
|
|
33
33
|
'jruby.api' => "http://jruby.org/apidocs/"
|
34
34
|
)
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
|
37
|
+
pom 'org.jruby:jruby:9.1.8.0'
|
38
|
+
jar 'org.processing:core:3.3.0'
|
39
|
+
|
38
40
|
plugin_management do
|
39
41
|
plugin :resources, '2.6'
|
40
42
|
plugin :dependency, '2.8'
|
41
|
-
plugin(
|
43
|
+
plugin(
|
42
44
|
:compiler, '3.5.1',
|
43
45
|
source: '${maven.compiler.source}',
|
44
46
|
target: '${maven.compiler.target}'
|
data/pom.xml
CHANGED
@@ -11,7 +11,7 @@ DO NOT MODIFIY - GENERATED CODE
|
|
11
11
|
<modelVersion>4.0.0</modelVersion>
|
12
12
|
<groupId>ruby-processing</groupId>
|
13
13
|
<artifactId>pbox2d</artifactId>
|
14
|
-
<version>0.
|
14
|
+
<version>1.0.0</version>
|
15
15
|
<name>pbox2d</name>
|
16
16
|
<description>jbox2d for JRubyArt</description>
|
17
17
|
<url>https://github.com/ruby-processing/jbox2d</url>
|
@@ -56,13 +56,13 @@ DO NOT MODIFIY - GENERATED CODE
|
|
56
56
|
<dependency>
|
57
57
|
<groupId>org.jruby</groupId>
|
58
58
|
<artifactId>jruby</artifactId>
|
59
|
-
<version>9.1.
|
59
|
+
<version>9.1.8.0</version>
|
60
60
|
<type>pom</type>
|
61
61
|
</dependency>
|
62
62
|
<dependency>
|
63
63
|
<groupId>org.processing</groupId>
|
64
64
|
<artifactId>core</artifactId>
|
65
|
-
<version>3.
|
65
|
+
<version>3.3.0</version>
|
66
66
|
</dependency>
|
67
67
|
</dependencies>
|
68
68
|
<build>
|
@@ -69,8 +69,8 @@ public class AABB {
|
|
69
69
|
* @param upperVertex
|
70
70
|
*/
|
71
71
|
public AABB(final Vec2 lowerVertex, final Vec2 upperVertex) {
|
72
|
-
this.lowerBound = lowerVertex
|
73
|
-
this.upperBound = upperVertex
|
72
|
+
this.lowerBound = new Vec2(lowerVertex); // clone to be safe
|
73
|
+
this.upperBound = new Vec2(upperVertex);
|
74
74
|
}
|
75
75
|
|
76
76
|
/**
|
@@ -88,8 +88,8 @@ public class Manifold {
|
|
88
88
|
*/
|
89
89
|
public Manifold(Manifold other) {
|
90
90
|
points = new ManifoldPoint[Settings.maxManifoldPoints];
|
91
|
-
localNormal = other.localNormal
|
92
|
-
localPoint = other.localPoint
|
91
|
+
localNormal = new Vec2(other.localNormal);
|
92
|
+
localPoint = new Vec2(other.localPoint);
|
93
93
|
pointCount = other.pointCount;
|
94
94
|
type = other.type;
|
95
95
|
// djm: this is correct now
|
@@ -57,7 +57,7 @@ import org.jbox2d.common.Vec2;
|
|
57
57
|
* <ul><li>e_circles: the local center of circleB</li>
|
58
58
|
* <li>e_faceA: the local center of cirlceB or the clip point of polygonB</li>
|
59
59
|
* <li>e_faceB: the clip point of polygonA</li></ul>
|
60
|
-
* This structure is stored across time steps, so we keep it small
|
60
|
+
* This structure is stored across time steps, so we keep it small.
|
61
61
|
* Note: the impulses are used for internal caching and may not
|
62
62
|
* provide reliable contact forces, especially for high speed collisions.
|
63
63
|
*/
|
@@ -85,7 +85,7 @@ public class ManifoldPoint {
|
|
85
85
|
* @param cp point to copy from
|
86
86
|
*/
|
87
87
|
public ManifoldPoint(final ManifoldPoint cp) {
|
88
|
-
localPoint = cp.localPoint
|
88
|
+
localPoint = new Vec2(cp.localPoint);
|
89
89
|
normalImpulse = cp.normalImpulse;
|
90
90
|
tangentImpulse = cp.tangentImpulse;
|
91
91
|
id = new ContactID(cp.id);
|
@@ -32,12 +32,15 @@ import java.io.Serializable;
|
|
32
32
|
*/
|
33
33
|
public class Mat22 implements Serializable {
|
34
34
|
|
35
|
-
private static final long serialVersionUID =
|
35
|
+
private static final long serialVersionUID = -3851554186221722070L;
|
36
|
+
|
37
|
+
|
36
38
|
|
37
39
|
public final Vec2 ex, ey;
|
38
40
|
|
39
41
|
/**
|
40
42
|
* Convert the matrix to printable format.
|
43
|
+
* @return
|
41
44
|
*/
|
42
45
|
@Override
|
43
46
|
public String toString() {
|
@@ -63,8 +66,8 @@ public class Mat22 implements Serializable {
|
|
63
66
|
* @param c2 Column 2 of matrix
|
64
67
|
*/
|
65
68
|
public Mat22(final Vec2 c1, final Vec2 c2) {
|
66
|
-
ex = c1
|
67
|
-
ey = c2
|
69
|
+
ex = new Vec2(c1);
|
70
|
+
ey = new Vec2(c2);
|
68
71
|
}
|
69
72
|
|
70
73
|
/**
|
@@ -102,16 +105,6 @@ public class Mat22 implements Serializable {
|
|
102
105
|
return this;
|
103
106
|
}
|
104
107
|
|
105
|
-
/**
|
106
|
-
* Return a clone of this matrix. djm fixed double allocation
|
107
|
-
*
|
108
|
-
* @return
|
109
|
-
*/
|
110
|
-
// @Override // annotation omitted for GWT-compatibility
|
111
|
-
@Override
|
112
|
-
public final Mat22 clone() {
|
113
|
-
return new Mat22(ex, ey);
|
114
|
-
}
|
115
108
|
|
116
109
|
/**
|
117
110
|
* Set as a matrix representing a rotation.
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
1
|
+
/** *****************************************************************************
|
2
2
|
* Copyright (c) 2013, Daniel Murphy
|
3
3
|
* All rights reserved.
|
4
|
-
*
|
4
|
+
*
|
5
5
|
* Redistribution and use in source and binary forms, with or without modification,
|
6
6
|
* are permitted provided that the following conditions are met:
|
7
7
|
* * Redistributions of source code must retain the above copyright notice,
|
@@ -9,7 +9,7 @@
|
|
9
9
|
* * Redistributions in binary form must reproduce the above copyright notice,
|
10
10
|
* this list of conditions and the following disclaimer in the documentation
|
11
11
|
* and/or other materials provided with the distribution.
|
12
|
-
*
|
12
|
+
*
|
13
13
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
14
14
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
15
15
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
@@ -20,271 +20,291 @@
|
|
20
20
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
21
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
22
|
* POSSIBILITY OF SUCH DAMAGE.
|
23
|
-
|
23
|
+
***************************************************************************** */
|
24
24
|
package org.jbox2d.common;
|
25
25
|
|
26
26
|
import java.io.Serializable;
|
27
27
|
|
28
28
|
/**
|
29
29
|
* A 3-by-3 matrix. Stored in column-major order.
|
30
|
-
*
|
30
|
+
*
|
31
31
|
* @author Daniel Murphy
|
32
32
|
*/
|
33
33
|
public class Mat33 implements Serializable {
|
34
|
-
private static final long serialVersionUID = 2L;
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
private static final long serialVersionUID = 536084358893657642L;
|
36
|
+
public static final Mat33 IDENTITY = new Mat33(
|
37
|
+
new Vec3(1, 0, 0),
|
38
|
+
new Vec3(0, 1, 0),
|
39
|
+
new Vec3(0, 0, 1)
|
40
|
+
);
|
38
41
|
|
39
|
-
|
42
|
+
public final Vec3 ex, ey, ez;
|
40
43
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
public Mat33(float exx, float exy, float exz, float eyx, float eyy, float eyz, float ezx,
|
48
|
-
float ezy, float ezz) {
|
49
|
-
ex = new Vec3(exx, exy, exz);
|
50
|
-
ey = new Vec3(eyx, eyy, eyz);
|
51
|
-
ez = new Vec3(ezx, ezy, ezz);
|
52
|
-
}
|
53
|
-
|
54
|
-
public Mat33(Vec3 argCol1, Vec3 argCol2, Vec3 argCol3) {
|
55
|
-
ex = argCol1.clone();
|
56
|
-
ey = argCol2.clone();
|
57
|
-
ez = argCol3.clone();
|
58
|
-
}
|
59
|
-
|
60
|
-
public void setZero() {
|
61
|
-
ex.setZero();
|
62
|
-
ey.setZero();
|
63
|
-
ez.setZero();
|
64
|
-
}
|
65
|
-
|
66
|
-
public void set(float exx, float exy, float exz, float eyx, float eyy, float eyz, float ezx,
|
67
|
-
float ezy, float ezz) {
|
68
|
-
ex.x = exx;
|
69
|
-
ex.y = exy;
|
70
|
-
ex.z = exz;
|
71
|
-
ey.x = eyx;
|
72
|
-
ey.y = eyy;
|
73
|
-
ey.z = eyz;
|
74
|
-
ez.x = eyx;
|
75
|
-
ez.y = eyy;
|
76
|
-
ez.z = eyz;
|
77
|
-
}
|
78
|
-
|
79
|
-
public void set(Mat33 mat) {
|
80
|
-
Vec3 vec = mat.ex;
|
81
|
-
ex.x = vec.x;
|
82
|
-
ex.y = vec.y;
|
83
|
-
ex.z = vec.z;
|
84
|
-
Vec3 vec1 = mat.ey;
|
85
|
-
ey.x = vec1.x;
|
86
|
-
ey.y = vec1.y;
|
87
|
-
ey.z = vec1.z;
|
88
|
-
Vec3 vec2 = mat.ez;
|
89
|
-
ez.x = vec2.x;
|
90
|
-
ez.y = vec2.y;
|
91
|
-
ez.z = vec2.z;
|
92
|
-
}
|
93
|
-
|
94
|
-
public void setIdentity() {
|
95
|
-
ex.x = (float) 1;
|
96
|
-
ex.y = (float) 0;
|
97
|
-
ex.z = (float) 0;
|
98
|
-
ey.x = (float) 0;
|
99
|
-
ey.y = (float) 1;
|
100
|
-
ey.z = (float) 0;
|
101
|
-
ez.x = (float) 0;
|
102
|
-
ez.y = (float) 0;
|
103
|
-
ez.z = (float) 1;
|
104
|
-
}
|
44
|
+
public Mat33() {
|
45
|
+
ex = new Vec3();
|
46
|
+
ey = new Vec3();
|
47
|
+
ez = new Vec3();
|
48
|
+
}
|
105
49
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
50
|
+
public Mat33(float exx, float exy, float exz, float eyx, float eyy, float eyz, float ezx,
|
51
|
+
float ezy, float ezz) {
|
52
|
+
ex = new Vec3(exx, exy, exz);
|
53
|
+
ey = new Vec3(eyx, eyy, eyz);
|
54
|
+
ez = new Vec3(ezx, ezy, ezz);
|
55
|
+
}
|
111
56
|
|
112
|
-
|
113
|
-
|
114
|
-
|
57
|
+
public Mat33(Vec3 argCol1, Vec3 argCol2, Vec3 argCol3) {
|
58
|
+
ex = new Vec3(argCol1);
|
59
|
+
ey = new Vec3(argCol2);
|
60
|
+
ez = new Vec3(argCol3);
|
61
|
+
}
|
115
62
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
63
|
+
public void setZero() {
|
64
|
+
ex.setZero();
|
65
|
+
ey.setZero();
|
66
|
+
ez.setZero();
|
67
|
+
}
|
121
68
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
69
|
+
public void set(float exx, float exy, float exz, float eyx, float eyy, float eyz, float ezx,
|
70
|
+
float ezy, float ezz) {
|
71
|
+
ex.x = exx;
|
72
|
+
ex.y = exy;
|
73
|
+
ex.z = exz;
|
74
|
+
ey.x = eyx;
|
75
|
+
ey.y = eyy;
|
76
|
+
ey.z = eyz;
|
77
|
+
ez.x = eyx;
|
78
|
+
ez.y = eyy;
|
79
|
+
ez.z = eyz;
|
80
|
+
}
|
127
81
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
82
|
+
public void set(Mat33 mat) {
|
83
|
+
Vec3 vec = mat.ex;
|
84
|
+
ex.x = vec.x;
|
85
|
+
ex.y = vec.y;
|
86
|
+
ex.z = vec.z;
|
87
|
+
Vec3 vec1 = mat.ey;
|
88
|
+
ey.x = vec1.x;
|
89
|
+
ey.y = vec1.y;
|
90
|
+
ey.z = vec1.z;
|
91
|
+
Vec3 vec2 = mat.ez;
|
92
|
+
ez.x = vec2.x;
|
93
|
+
ez.y = vec2.y;
|
94
|
+
ez.z = vec2.z;
|
95
|
+
}
|
135
96
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
97
|
+
public void setIdentity() {
|
98
|
+
ex.x = (float) 1;
|
99
|
+
ex.y = (float) 0;
|
100
|
+
ex.z = (float) 0;
|
101
|
+
ey.x = (float) 0;
|
102
|
+
ey.y = (float) 1;
|
103
|
+
ey.z = (float) 0;
|
104
|
+
ez.x = (float) 0;
|
105
|
+
ez.y = (float) 0;
|
106
|
+
ez.z = (float) 1;
|
107
|
+
}
|
142
108
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
* @return
|
149
|
-
*/
|
150
|
-
public final Vec2 solve22(Vec2 b) {
|
151
|
-
Vec2 x = new Vec2();
|
152
|
-
solve22ToOut(b, x);
|
153
|
-
return x;
|
154
|
-
}
|
109
|
+
// / Multiply a matrix times a vector.
|
110
|
+
public static final Vec3 mul(Mat33 A, Vec3 v) {
|
111
|
+
return new Vec3(v.x * A.ex.x + v.y * A.ey.x + v.z + A.ez.x, v.x * A.ex.y + v.y * A.ey.y + v.z
|
112
|
+
* A.ez.y, v.x * A.ex.z + v.y * A.ey.z + v.z * A.ez.z);
|
113
|
+
}
|
155
114
|
|
156
|
-
|
157
|
-
|
158
|
-
* in one-shot cases.
|
159
|
-
*
|
160
|
-
* @param b
|
161
|
-
* @return
|
162
|
-
*/
|
163
|
-
public final void solve22ToOut(Vec2 b, Vec2 out) {
|
164
|
-
final float a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;
|
165
|
-
float det = a11 * a22 - a12 * a21;
|
166
|
-
if (det != 0.0f) {
|
167
|
-
det = 1.0f / det;
|
115
|
+
public static final Vec2 mul22(Mat33 A, Vec2 v) {
|
116
|
+
return new Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y);
|
168
117
|
}
|
169
|
-
out.x = det * (a22 * b.x - a12 * b.y);
|
170
|
-
out.y = det * (a11 * b.y - a21 * b.x);
|
171
|
-
}
|
172
118
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
* @param b
|
179
|
-
* @return
|
180
|
-
*/
|
181
|
-
public final Vec3 solve33(Vec3 b) {
|
182
|
-
Vec3 x = new Vec3();
|
183
|
-
solve33ToOut(b, x);
|
184
|
-
return x;
|
185
|
-
}
|
119
|
+
public static final void mul22ToOut(Mat33 A, Vec2 v, Vec2 out) {
|
120
|
+
final float tempx = A.ex.x * v.x + A.ey.x * v.y;
|
121
|
+
out.y = A.ex.y * v.x + A.ey.y * v.y;
|
122
|
+
out.x = tempx;
|
123
|
+
}
|
186
124
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
* @param b
|
192
|
-
* @param out the result
|
193
|
-
*/
|
194
|
-
public final void solve33ToOut(Vec3 b, Vec3 out) {
|
195
|
-
assert (b != out);
|
196
|
-
Vec3.crossToOutUnsafe(ey, ez, out);
|
197
|
-
float det = Vec3.dot(ex, out);
|
198
|
-
if (det != 0.0f) {
|
199
|
-
det = 1.0f / det;
|
125
|
+
public static final void mul22ToOutUnsafe(Mat33 A, Vec2 v, Vec2 out) {
|
126
|
+
assert (v != out);
|
127
|
+
out.y = A.ex.y * v.x + A.ey.y * v.y;
|
128
|
+
out.x = A.ex.x * v.x + A.ey.x * v.y;
|
200
129
|
}
|
201
|
-
Vec3.crossToOutUnsafe(ey, ez, out);
|
202
|
-
final float x = det * Vec3.dot(b, out);
|
203
|
-
Vec3.crossToOutUnsafe(b, ez, out);
|
204
|
-
final float y = det * Vec3.dot(ex, out);
|
205
|
-
Vec3.crossToOutUnsafe(ey, b, out);
|
206
|
-
float z = det * Vec3.dot(ex, out);
|
207
|
-
out.x = x;
|
208
|
-
out.y = y;
|
209
|
-
out.z = z;
|
210
|
-
}
|
211
130
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
131
|
+
public static final void mulToOut(Mat33 A, Vec3 v, Vec3 out) {
|
132
|
+
final float tempy = v.x * A.ex.y + v.y * A.ey.y + v.z * A.ez.y;
|
133
|
+
final float tempz = v.x * A.ex.z + v.y * A.ey.z + v.z * A.ez.z;
|
134
|
+
out.x = v.x * A.ex.x + v.y * A.ey.x + v.z * A.ez.x;
|
135
|
+
out.y = tempy;
|
136
|
+
out.z = tempz;
|
217
137
|
}
|
218
138
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
M.ez.x = 0.0f;
|
226
|
-
M.ez.y = 0.0f;
|
227
|
-
M.ez.z = 0.0f;
|
228
|
-
}
|
139
|
+
public static final void mulToOutUnsafe(Mat33 A, Vec3 v, Vec3 out) {
|
140
|
+
assert (out != v);
|
141
|
+
out.x = v.x * A.ex.x + v.y * A.ey.x + v.z * A.ez.x;
|
142
|
+
out.y = v.x * A.ex.y + v.y * A.ey.y + v.z * A.ez.y;
|
143
|
+
out.z = v.x * A.ex.z + v.y * A.ey.z + v.z * A.ez.z;
|
144
|
+
}
|
229
145
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
146
|
+
/**
|
147
|
+
* Solve A * x = b, where b is a column vector. This is more efficient than
|
148
|
+
* computing the inverse in one-shot cases.
|
149
|
+
*
|
150
|
+
* @param b
|
151
|
+
* @return
|
152
|
+
*/
|
153
|
+
public final Vec2 solve22(Vec2 b) {
|
154
|
+
Vec2 x = new Vec2();
|
155
|
+
solve22ToOut(b, x);
|
156
|
+
return x;
|
238
157
|
}
|
239
158
|
|
240
|
-
|
241
|
-
|
242
|
-
|
159
|
+
/**
|
160
|
+
* Solve A * x = b, where b is a column vector. This is more efficient than
|
161
|
+
* computing the inverse in one-shot cases.
|
162
|
+
*
|
163
|
+
* @param b
|
164
|
+
* @param out
|
165
|
+
*/
|
166
|
+
public final void solve22ToOut(Vec2 b, Vec2 out) {
|
167
|
+
final float a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y;
|
168
|
+
float det = a11 * a22 - a12 * a21;
|
169
|
+
if (det != 0.0f) {
|
170
|
+
det = 1.0f / det;
|
171
|
+
}
|
172
|
+
out.x = det * (a22 * b.x - a12 * b.y);
|
173
|
+
out.y = det * (a11 * b.y - a21 * b.x);
|
174
|
+
}
|
243
175
|
|
244
|
-
|
245
|
-
|
246
|
-
|
176
|
+
// djm pooling from below
|
177
|
+
/**
|
178
|
+
* Solve A * x = b, where b is a column vector. This is more efficient than
|
179
|
+
* computing the inverse in one-shot cases.
|
180
|
+
*
|
181
|
+
* @param b
|
182
|
+
* @return
|
183
|
+
*/
|
184
|
+
public final Vec3 solve33(Vec3 b) {
|
185
|
+
Vec3 x = new Vec3();
|
186
|
+
solve33ToOut(b, x);
|
187
|
+
return x;
|
188
|
+
}
|
247
189
|
|
248
|
-
|
249
|
-
|
250
|
-
|
190
|
+
/**
|
191
|
+
* Solve A * x = b, where b is a column vector. This is more efficient than
|
192
|
+
* computing the inverse in one-shot cases.
|
193
|
+
*
|
194
|
+
* @param b
|
195
|
+
* @param out the result
|
196
|
+
*/
|
197
|
+
public final void solve33ToOut(Vec3 b, Vec3 out) {
|
198
|
+
assert (b != out);
|
199
|
+
Vec3.crossToOutUnsafe(ey, ez, out);
|
200
|
+
float det = Vec3.dot(ex, out);
|
201
|
+
if (det != 0.0f) {
|
202
|
+
det = 1.0f / det;
|
203
|
+
}
|
204
|
+
Vec3.crossToOutUnsafe(ey, ez, out);
|
205
|
+
final float x = det * Vec3.dot(b, out);
|
206
|
+
Vec3.crossToOutUnsafe(b, ez, out);
|
207
|
+
final float y = det * Vec3.dot(ex, out);
|
208
|
+
Vec3.crossToOutUnsafe(ey, b, out);
|
209
|
+
float z = det * Vec3.dot(ex, out);
|
210
|
+
out.x = x;
|
211
|
+
out.y = y;
|
212
|
+
out.z = z;
|
213
|
+
}
|
251
214
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
215
|
+
public void getInverse22(Mat33 M) {
|
216
|
+
float a = ex.x, b = ey.x, c = ex.y, d = ey.y;
|
217
|
+
float det = a * d - b * c;
|
218
|
+
if (det != 0.0f) {
|
219
|
+
det = 1.0f / det;
|
220
|
+
}
|
221
|
+
|
222
|
+
M.ex.x = det * d;
|
223
|
+
M.ey.x = -det * b;
|
224
|
+
M.ex.z = 0.0f;
|
225
|
+
M.ex.y = -det * c;
|
226
|
+
M.ey.y = det * a;
|
227
|
+
M.ey.z = 0.0f;
|
228
|
+
M.ez.x = 0.0f;
|
229
|
+
M.ez.y = 0.0f;
|
230
|
+
M.ez.z = 0.0f;
|
231
|
+
}
|
256
232
|
|
233
|
+
// / Returns the zero matrix if singular.
|
234
|
+
public void getSymInverse33(Mat33 M) {
|
235
|
+
float bx = ey.y * ez.z - ey.z * ez.y;
|
236
|
+
float by = ey.z * ez.x - ey.x * ez.z;
|
237
|
+
float bz = ey.x * ez.y - ey.y * ez.x;
|
238
|
+
float det = ex.x * bx + ex.y * by + ex.z * bz;
|
239
|
+
if (det != 0.0f) {
|
240
|
+
det = 1.0f / det;
|
241
|
+
}
|
242
|
+
|
243
|
+
float a11 = ex.x, a12 = ey.x, a13 = ez.x;
|
244
|
+
float a22 = ey.y, a23 = ez.y;
|
245
|
+
float a33 = ez.z;
|
246
|
+
|
247
|
+
M.ex.x = det * (a22 * a33 - a23 * a23);
|
248
|
+
M.ex.y = det * (a13 * a23 - a12 * a33);
|
249
|
+
M.ex.z = det * (a12 * a23 - a13 * a22);
|
250
|
+
|
251
|
+
M.ey.x = M.ex.y;
|
252
|
+
M.ey.y = det * (a11 * a33 - a13 * a13);
|
253
|
+
M.ey.z = det * (a13 * a12 - a11 * a23);
|
254
|
+
|
255
|
+
M.ez.x = M.ex.z;
|
256
|
+
M.ez.y = M.ey.z;
|
257
|
+
M.ez.z = det * (a11 * a22 - a12 * a12);
|
258
|
+
}
|
257
259
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
260
|
+
public final static void setScaleTransform(float scale, Mat33 out) {
|
261
|
+
out.ex.x = scale;
|
262
|
+
out.ey.y = scale;
|
263
|
+
}
|
262
264
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
265
|
+
@Override
|
266
|
+
public int hashCode() {
|
267
|
+
final int prime = 31;
|
268
|
+
int result = 1;
|
269
|
+
result = prime * result + ((ex == null) ? 0 : ex.hashCode());
|
270
|
+
result = prime * result + ((ey == null) ? 0 : ey.hashCode());
|
271
|
+
result = prime * result + ((ez == null) ? 0 : ez.hashCode());
|
272
|
+
return result;
|
273
|
+
}
|
272
274
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
275
|
+
@Override
|
276
|
+
public boolean equals(Object obj) {
|
277
|
+
if (this == obj) {
|
278
|
+
return true;
|
279
|
+
}
|
280
|
+
if (obj == null) {
|
281
|
+
return false;
|
282
|
+
}
|
283
|
+
if (getClass() != obj.getClass()) {
|
284
|
+
return false;
|
285
|
+
}
|
286
|
+
Mat33 other = (Mat33) obj;
|
287
|
+
if (ex == null) {
|
288
|
+
if (other.ex != null) {
|
289
|
+
return false;
|
290
|
+
}
|
291
|
+
} else if (!ex.equals(other.ex)) {
|
292
|
+
return false;
|
293
|
+
}
|
294
|
+
if (ey == null) {
|
295
|
+
if (other.ey != null) {
|
296
|
+
return false;
|
297
|
+
}
|
298
|
+
} else if (!ey.equals(other.ey)) {
|
299
|
+
return false;
|
300
|
+
}
|
301
|
+
if (ez == null) {
|
302
|
+
if (other.ez != null) {
|
303
|
+
return false;
|
304
|
+
}
|
305
|
+
} else if (!ez.equals(other.ez)) {
|
306
|
+
return false;
|
307
|
+
}
|
308
|
+
return true;
|
309
|
+
}
|
290
310
|
}
|