329 Commits

Author SHA1 Message Date
Colby Klein
c84a8e07c0 add mat4.mul_vec3_perspective, fix doc typo 2022-04-21 12:12:02 -07:00
Colby Klein
d83b4c71ce fix doc typo 2022-04-21 12:10:28 -07:00
Colby Klein
0bff69f3ba add vec3.normalize_len, fix some doc typos 2022-04-21 12:10:04 -07:00
Colby Klein
919900fea2 add utils.sign 2022-04-21 11:53:00 -07:00
Colby Klein
f11cea9588 fix whitespace 2022-04-21 11:25:58 -07:00
Colby Klein
9f57a1a939 remove unused a parameter from mat4.look_at 2022-04-21 11:22:55 -07:00
Colby Klein
13cd41770f fix formatting 2022-04-21 11:22:18 -07:00
shakesoda
3b90354910
Merge pull request #63 from semyon422/master
Minor fixes
2022-04-21 11:08:52 -07:00
shakesoda
4350c25d0c
Merge pull request #72 from idbrii/color
Overhaul color: fix bugs, change to 0-1
2022-04-21 10:47:54 -07:00
shakesoda
9b4b6e7fa7
Merge pull request #76 from xiejiangzhi/xjz
Add Vec3.angle_to
2022-04-21 10:46:01 -07:00
shakesoda
ab0132a6ac
Merge pull request #66 from aki-cat/master
Implement scale to mat4.from_transform method
2022-04-20 15:56:31 -07:00
jiangzhi.xie
6bc7ec7718 Add testing code for vec3.angle_to 2022-04-20 20:05:52 +08:00
xiejiangzhi
02d7604b17 Add vec3.angle_to 2022-04-20 19:13:08 +08:00
David Briscoe
7d99a08134 [Breaking] color: Convert hue [0,359] -> [0,1]
imgui [uses 0-1 for everything internally](
https://github.com/ocornut/imgui/blob/master/imgui.cpp#L2045).

[Both Unity](https://docs.unity3d.com/ScriptReference/Color.RGBToHSV.html)
[and Godot](https://docs.godotengine.org/en/stable/classes/class_color.html#class-color-property-h)
use H, S, and V in the range 0.0 to 1.0

Since we're switching colours out of 0,255 we should also switch hue out
of 0,359. Now all of our r,g,b,a,h,s,v values are all in 0,1.
2022-04-01 21:55:40 -07:00
David Briscoe
0c12f17805 color: Linear alpha in linear<->gamma conversions
Maintain linear alpha when converting to gamma.

Update to latest wikipedia links.

Add simple test that does the round trip conversion.
2022-04-01 21:55:40 -07:00
David Briscoe
aec3b9fd7f Prevent nan when using color_to_hsv(white)
When r,g,b are equal, delta will be zero and hue will be nan due to
divide by zero.

This is also an issue with the reference C++ code:
https://tio.run/##Sy4o0E3OScxL//9fOTMvOac0JVXBJjO/uKQoNTHXjiszr0QhNzEzT0NToZqLs7gkxcoqOb@0RMHGRkHJIzUnJ19HITy/KCdFUQkkBJZPzUvJseaq/f8fAA

An alternative approach is to always add epsilon or use a different hue
calculation:
    http://web.archive.org/web/20210515082154/http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv
2022-04-01 21:55:32 -07:00
David Briscoe
41b1f0b5b9 color: Add more tests 2022-04-01 21:47:56 -07:00
David Briscoe
343f320e2f [Breaking] color: Convert 0-255 -> 0-1 range
Our hsv logic assumes 0-1 (cs.rit.edu says "r,g,b values are from 0 to
1") and it makes more sense to provide __mul for multiplying in 0-1
since the result will stay in that range. Additionally, love switched to
0-1 color since 11.0.

Included an as_255() function to unpack the color in 0-255 for some
amount of backwards compatibility. Doesn't make sense to provide any
kind of color object for it since most of our functions won't work
correctly.

Add tests for hue(), saturation(), value() that fail (even with /255
removed) for the old code, but pass on the new 0-1 range because the hsv
logic outputs colors in 0-1. Test comparisons use reduced precision
because my input data has limited precision.
2022-04-01 21:47:56 -07:00
David Briscoe
df92f0c5cd [Breaking] color: Make expected range match docs
lighten/darken: documented range is 0-255, so we don't need to multiply.
Makes more sense to work with colors in the same range that we're
incrementing by, but this changes behaviour.

saturation/value: we use a percent, so it's 0-1. It's clamped so that's
obviously expected.

Add tests to validate this new behaviour.
2022-04-01 21:47:09 -07:00
David Briscoe
509594aec2 color: Use color_mt and normal indexing
Fix #34.

Set color_mt on new colors so add, subtract, multiply, is_color work.

We don't use ffi for color (32cf0e8), so remove cdata check for 0-based
offset indexing.

Add tests for creating colours and using operators.
2022-04-01 19:55:55 -07:00
shakesoda
ea79f346f6
Merge pull request #75 from idbrii/precond
Include offending type in precondition failure msg
2022-03-31 06:05:54 -07:00
shakesoda
36dfd97429
Merge pull request #74 from idbrii/atan
vec2: Fallback to math.atan
2022-03-27 14:37:52 -07:00
David Briscoe
be10073156 vec2: Fallback to math.atan
Lua 5.3+ use a two-argument version of math.atan instead of math.atan2.
atan2 exists but is deprecated, so if you use cpml in a lua build that
strips deprecated functions vec2.angle_to will fail.
2022-03-27 09:56:44 -07:00
David Briscoe
c26cc1a508 Include offending type in precondition failure msg
Output the type that was incorrect to make it more obvious what the user
is doing wrong without them adding logging.

To avoid string building during lots of vector math, introduced a
private precond module that only builds the strings when an error
occurs. It uses error() to put the resulting error message at the caller
to cpml.

Before:

  lua: ~/cpml/modules/vec2.lua:52: new: Wrong argument type for x (<number> expected)
  lua: ~/cpml/modules/vec2.lua:424: __add: Wrong argument type for right hand operand. (<cpml.vec2> expected)

  example stack traceback:
  	[C]: in function 'assert'
  	~/cpml/modules/vec2.lua:424: in metamethod '__add'
  	test_cpml.lua:32: in main chunk
  	[C]: in ?

After:

  lua: test_cpml.lua:31: new: Wrong argument type for x: string (<number> expected)
  lua: test_cpml.lua:32: __add: Wrong argument type 'string' for right hand operand. (<cpml.vec2> expected)

  example stack traceback:
  	[C]: in function 'error'
  	~/cpml/modules/_private_precond.lua:13: in function 'modules._private_precond.assert'
  	~/cpml/modules/vec2.lua:425: in metamethod '__add'
  	test_cpml.lua:32: in main chunk
  	[C]: in ?

The tracebacks are longer, but the initial error is at the location of
the mistake and the output includes the input type.
2022-03-27 09:56:15 -07:00
shakesoda
c50d292cb6
Merge pull request #69 from idbrii/mat-cleanup
mat4: minor cleanup of globals and unused variables
2022-03-27 03:48:54 -07:00
shakesoda
eb5eaf6961
Merge pull request #68 from idbrii/nan
vec: Add nan checking functions
2022-03-27 03:47:08 -07:00
shakesoda
6b526d53c4
Merge pull request #70 from idbrii/comment-vec
(minor) vec: Add more comments to clarify operations
2022-03-27 03:46:06 -07:00
shakesoda
1da3e99eb7
Merge pull request #71 from idbrii/badge
Switch build badge to github actions
2022-03-27 03:45:50 -07:00
David Briscoe
b793d24e52 Switch build badge to github actions
We don't use travis anymore, so point the readme to the right badge.

(Missed in 84ff1b315e691069389ebbd7e1abcc054e1987ab.)
2022-03-27 01:11:29 -07:00
David Briscoe
320f895759 mat4: minor cleanup of globals and unused variables
forward, side, new_up are unused but are shadowed in many functions.
Doesn't seem like they're intended to be used.

No reason for variables in CreateNDCScaleAndOffsetFromFov to be global.
Don't try running this change, but I'm just making them local.
2022-03-26 23:35:04 -07:00
David Briscoe
e245f24ca1 vec: Add more comments to clarify operations
Clarify order and behaviour so you can use these functions without
looking up the meaning of vector arithmetic.
2022-03-26 23:34:38 -07:00
David Briscoe
29954aa60e vec: Add nan checking functions
Add:
* vec2.has_nan + test
* vec3.has_nan + test
* quat.has_nan
* mat4.has_nan
* utils.is_nan + test
2022-03-26 23:33:13 -07:00
aki-cat
d7c257387d Implement scale to mat4.from_transform method 2021-12-10 00:31:57 -03:00
shakesoda
a3aacc354c
Merge pull request #65 from idbrii/fix-round
Fix index nil error in private.round
2021-11-24 12:08:57 -08:00
David Briscoe
4dc773865e Reference private.round instead of util.round
Fix "Error: src/lib/cpml/modules/_private_utils.lua:8: attempt to index
    global 'utils' (a nil value)"

Looks like when round was moved to _private_utils, this didn't get
replaced. There is no utils defined and utils.round just points to
private.round.

Add a test. This never triggered test failures because test don't pass
precision.

Test
A love2d program with main.lua:
    local Vec2 = require "cpml.modules.vec2"
    local v = Vec2(1.234, 3.5326)
    print(v:round(0.1))
2021-11-24 09:55:57 -08:00
semyon422
f22c9e09cc Fix incorrect out of mat4.invert when out = a 2021-08-11 18:12:58 +05:00
semyon422
54d9a578e1 Use local variables 2021-08-11 17:08:30 +05:00
Colby Klein
002fabb6bb
Merge pull request #62 from idbrii/actions-busted
Run tests on gh actions
2021-06-23 16:35:33 -07:00
David Briscoe
84ff1b315e Remove travis
Testing setup is now on github actions (which works) instead of travis
(which mysteriously isn't building anything).
2021-06-23 16:33:04 -07:00
David Briscoe
1b2aeffe00 Allow coveralls failure
Fails like this even though we explicitly pass the token:
```
Upload error: Couldn't find a repository matching this job.
Upload error: Couldn't find a repository matching this job.
Upload error: Couldn't find a repository matching this job.
Error: Process completed with exit code 255.
```
2021-06-23 16:28:47 -07:00
David Briscoe
dbc8d7cf85 Add coveralls repo token to gh action 2021-06-23 16:25:21 -07:00
David Briscoe
6bc8193a5a Run tests on gh actions
Related #60.

Can't figure out what's wrong with travis, but gh actions seem to work.
Migrated travis.yml to runtest.yml.

coveralls fails for me because I don't have the account there, but it's
reporting coverage amounts before it fails to upload.

Tests against multiple versions of lua using leafo's matrix.luaversion
with roughly the same versions as travis.yml.

What's missing
==============

Notification setup from travis is missing. Github sends email
notifications. You can choose:
 * Email
 * Web
 * Send notifications for failed workflows only
There are third-party irc gh actions, but I don't see how you'd do
`on_success: change` in an action.

luacheck was disabled in travis.yml, so it's disabled here too.
2021-06-23 16:21:21 -07:00
Colby Klein
7a7e748430
Merge pull request #61 from idbrii/automate-docs
Automate ldoc generation
2021-06-23 15:49:44 -07:00
David Briscoe
5d303a22e2 Automate ldoc generation
Related #11.

Builds docs to the gh-pages branch on every push to master. Also updates
all dead links to point to live ones (or ones that will be live after
this is merged).

Uses three third-party gh actions:

* leafo/gh-actions-lua@v8
* leafo/gh-actions-luarocks@v4
* peaceiris/actions-gh-pages@v3
 * This receives secrets.GITHUB_TOKEN

Also switches to the new ldoc css and moves doc output folder to
./doc/out which is less confusing when configuring than ./doc/doc.

Once merged, docs will be available on https://excessive.github.io/cpml/

Currently, you can see the built docs on https://idbrii.github.io/love-cpml/
2021-06-23 14:33:46 -07:00
Colby Klein
ff8ba77b7a
Update README.md
arbitrary change to kick travis separate from the build trigger
2021-06-17 11:44:37 -07:00
Colby Klein
43f100a12d
Update README.md 2021-06-17 11:26:25 -07:00
mcclure
85988fc7c6
Merge pull request #59 from idbrii/fix-angleto
Fix angle_to to produce signed angle instead of incorrect results
2021-06-17 11:25:16 -04:00
David Briscoe
39aee9a421 Fix angle_to to produce signed angle
angle_to was producing the angle from +x to the difference between a,b
which is unexpected. Instead, it should produce the smallest absolute
angle between the two vectors and be signed to indicate the direction of
rotation.

By using the old angle_to implementation and modifying equal() to print
out the failures, you can see the numbers that it was producing before
didn't make much sense:

    right:angle_to(down) = 45.0
    right:angle_to(left) = 0.0
    right:angle_to(up)   = -45.0
    down:angle_to(right) = -135.0
    down:angle_to(left)  = -45.0
    down:angle_to(up)    = -90.0
    left:angle_to(down)  = 135.0
    left:angle_to(up)    = -135.0
    up:angle_to(right)   = 135.0
    up:angle_to(down)    = 90.0
    up:angle_to(left)    = 45.0

Now it produces numbers you'd expect:

    right:angle_to(down) = -90.0
    right:angle_to(left) = 180.0
    right:angle_to(up)   = 90.0
    down:angle_to(right) = 90.0
    down:angle_to(left)  = -90.0
    down:angle_to(up)    = 180.0
    left:angle_to(down)  = 90.0
    left:angle_to(up)    = -90.0
    up:angle_to(right)   = -90.0
    up:angle_to(down)    = 180.0
    up:angle_to(left)    = 90.0

See also https://stackoverflow.com/questions/21483999/using-atan2-to-find-angle-between-two-vectors

Also added tests for angle_between.
2021-06-15 11:56:04 -07:00
mcc
0d8daf0536 Fix typo breaking round() calls 2020-05-21 23:39:14 -04:00
mcc
ddb80f48e6 Compatibility note for 1.0 release and PR#48 test 2020-05-03 13:36:26 -04:00