Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Generate vertex tangents using mikktspace #3872

Closed
wants to merge 106 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
f7ea63c
cargo new
bwasty Jun 30, 2017
91eb412
add original MikktSpace C implentation
bwasty Jun 30, 2017
329c76b
WIP make c code compatible with corrode
bwasty Jul 2, 2017
2424342
Add reference implementation
alteous Jul 8, 2017
92fe7b7
Add CMake build script for reference implementation
alteous Jul 8, 2017
1763012
Add mikktspace-sys library
alteous Jul 8, 2017
7100ed9
Added stub FFI
alteous Jul 9, 2017
b450533
Add libmikktspace.a to .gitignore
alteous Jul 9, 2017
9bbd34b
Add Context abstraction
alteous Jul 9, 2017
dc8fe97
Add closures interface
alteous Aug 29, 2017
4f7c63a
Add generation example
alteous Aug 30, 2017
94705b0
Fixed incorrect foreign function signature
alteous Aug 30, 2017
99918f6
Remove debug moduli
alteous Aug 30, 2017
3d19ed6
Make @bwasty the author
alteous Aug 30, 2017
a94c513
Merge pull request #1 from alteous/pr
bwasty Aug 30, 2017
5a51803
add travis config + readme
bwasty Aug 30, 2017
2543663
Test the interface
alteous Sep 3, 2017
7aeab71
Cleanup
alteous Sep 3, 2017
7f0b70d
Set libmikktspace version to crate version
alteous Sep 3, 2017
18fdec6
Merge pull request #3 from alteous/libmikktspace-version
bwasty Sep 4, 2017
b49958f
Merge pull request #2 from alteous/pr
bwasty Sep 6, 2017
6265eb4
remove original corrode experiment
bwasty Sep 6, 2017
76ea78a
Move cgmath to dev-dependencies
alteous Sep 6, 2017
04d7bdd
Add description field
alteous Sep 6, 2017
e0bacd9
Set documentation, repository, and homepage fields
alteous Sep 6, 2017
41adcc2
Add readme field
alteous Sep 6, 2017
40142d0
Add some keywords
alteous Sep 6, 2017
0048ac1
Add dual Apache-2.0 / MIT licence
alteous Sep 6, 2017
80329ed
Exclude C example
alteous Sep 6, 2017
96fea5b
Add Travis CI badge
alteous Sep 6, 2017
9b44031
Add @alteous to authors list
alteous Sep 7, 2017
dca0473
Merge pull request #8 from gltf-rs/remove-corrode
bwasty Sep 12, 2017
ec5aa73
generate -> generate_tangents
alteous Sep 12, 2017
a4b7821
Exclude everything in the examples directory
alteous Sep 12, 2017
18fab51
Update README
alteous Sep 12, 2017
e9573cc
Update Rust generate example
alteous Sep 12, 2017
2f0bddd
Merge pull request #7 from alteous/cargo-config
alteous Sep 12, 2017
7feb189
Fix README
alteous Sep 12, 2017
bd43082
Fix travis badge in readme
bwasty Sep 12, 2017
95ac6cf
Merge pull request #9 from gltf-rs/bwasty-patch-1
bwasty Sep 12, 2017
ede02d9
CMake: replace -c11 with -c1x for GCC 4.6
bwasty Sep 24, 2017
da59f42
Merge pull request #12 from gltf-rs/cmake_fix_old_gcc
alteous Sep 24, 2017
37763b0
Build mikktspace using cc instead of cmake
randomPoison Jul 18, 2018
b3ae27e
Remove redundant rustc link directive
randomPoison Jul 18, 2018
0c37e5d
Fix typo in build.rs
randomPoison Jul 18, 2018
64352c2
Fix build.rs to work on Linux
randomPoison Jul 19, 2018
9a0a981
Merge pull request #13 from randomPoison/use-cc
alteous Jul 24, 2018
2f79db3
Version 0.1.1
alteous Jul 29, 2018
af3b93d
Merge pull request #14 from gltf-rs/v0.1.1
alteous Jul 29, 2018
dffcb0a
fix link to blender wiki
bwasty Jan 13, 2019
43ec58f
Replace bindings with Rust equivalent
May 4, 2019
c778526
Simplify memset calls, preparation for replacement
May 4, 2019
9132a97
Replace psTspace with vec
May 4, 2019
3c90f72
Replace piHashCount and piHashcount2 with vec
May 4, 2019
16ad3f1
Remove memset as it's no longer used
May 4, 2019
54a4a4e
Replace piTriListIn and pTriInfos with vec
May 4, 2019
e0d086d
Change GenerateInitialVerticesIndexList to slices
May 4, 2019
324c9a7
Replace pGroups, piGroupTrianglesBuffer with vec
May 4, 2019
2c1a59d
Replace pSubGroupTspace pUniSubGroups pTmpMembers
May 4, 2019
042ca9a
Remove memset
May 4, 2019
8390d57
Remove remaining malloc and free
May 4, 2019
49a6c4e
Remove remaining libc types
May 4, 2019
144467e
Remove remaining repr(C)
May 4, 2019
1edb548
Final documentation touches
May 4, 2019
f9a5d92
Remove get_ prefix from accessors
May 12, 2019
dbd69b6
Change nalgebra types in public API to arrays
May 12, 2019
f3f2c68
Add 2018 edition minimum Rust version requirement
May 12, 2019
cec2d7c
Fix example not compiling
May 12, 2019
abbae9b
Merge pull request #15 from LaylConway/master
alteous Jun 1, 2019
3502535
Bumped `nalgebra` to `0.19.0`.
azriel91 Jan 7, 2020
c327d80
Merge pull request #18 from azriel91/maintenance/bump-nalgebra
alteous Jan 9, 2020
95d76ff
Add a regression test on the example cube
MilanVasko Jan 12, 2020
d03f65d
Merge pull request #19 from MilanVasko/regression-test
alteous Jan 15, 2020
43d2802
Rename generate_tangents_default as generate_tangents
alteous Feb 1, 2020
99a235d
Version 0.2.0
alteous Feb 1, 2020
d028fb3
Include example code in release
alteous Feb 1, 2020
fa8e685
add glam feature
jakobhellermann Apr 1, 2021
ee3fd02
Merge pull request #21 from jakobhellermann/glam-feature
alteous May 19, 2021
7d08f8f
update glam and nalgebra
jakobhellermann May 19, 2021
a96883c
Merge pull request #22 from jakobhellermann/update-vec-libraries
alteous May 22, 2021
89f36ea
Add acknowledgement to original source code
alteous Feb 12, 2022
c1e6f16
Version 0.3
alteous Feb 12, 2022
b34fbc4
Merge pull request #24 from alteous/master
alteous Feb 12, 2022
f8b5bd9
updated nalgebra and glam
mockersf Feb 19, 2022
6275cc4
Merge pull request #25 from mockersf/update-libs
alteous Feb 27, 2022
55fa265
Add Bevy fork info
cart Apr 8, 2022
978e687
generate tangents if missing and a normal map exists
jakobhellermann Mar 31, 2021
c0eaf75
Add validated support for vertex tangent generation using mikktspace
superdump Feb 5, 2022
66338ec
Add 'crates/bevy_mikktspace/' from commit '55fa2650056f0c6163cb8b238b…
superdump Apr 9, 2022
ef70164
bevy_mikktspace: Remove travis.yml, conform Cargo.toml, and cargo fmt
superdump Apr 9, 2022
0f5b2a0
bevy_render: Use bevy_mikktspace
superdump Apr 9, 2022
a29ad02
bevy_mikktspace: Only support glam, and suppress clippy
superdump Apr 9, 2022
e6b284e
tools: Publish bevy_mikktspace
superdump Apr 9, 2022
04ac134
Merge branch 'main' into generate-tangents
superdump May 1, 2022
c910b33
Appease markdownlint
superdump May 1, 2022
0b8e0d6
Appease rustdoc
superdump May 1, 2022
572a0d9
bevy_mikktspace: Note Zlib license for mikktspace
superdump May 30, 2022
611231d
bevy_gltf: Check all dependencies for normal mapping before generatin…
superdump May 30, 2022
ca1b1e6
bevy_mikktspace: Clean up cruft in the readme and conform it to bevy
superdump May 30, 2022
edce219
Merge branch 'main' into generate-tangents
superdump May 30, 2022
0278521
bevy_mikktspace: Remove .gitignore that duplicates top-level .gitigno…
superdump May 30, 2022
d9db789
bevy_mikktspace: Remove unneeded APPENDIX section from license file
superdump May 30, 2022
b195cfa
bevy_mikktspace: Document that parts are covered by the Zlib license
superdump May 30, 2022
1705cf6
bevy_mikktspace: Fix docs link in Cargo.toml
superdump May 30, 2022
964b1ab
bevy_mikktspace: Fix vendored link
superdump May 30, 2022
d8827f1
suppress custom bevy lints
cart May 31, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions crates/bevy_gltf/src/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ pub enum GltfError {
AssetIoError(#[from] AssetIoError),
#[error("Missing sampler for animation {0}")]
MissingAnimationSampler(usize),
#[error("failed to generate tangents: {0}")]
GenerateTangentsError(#[from] bevy_render::mesh::GenerateTangentsError),
}

/// Loads glTF files with all of their data as their corresponding bevy representations.
Expand Down Expand Up @@ -250,13 +252,6 @@ async fn load_gltf<'a, 'b>(
mesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, vertex_attribute);
}

if let Some(vertex_attribute) = reader
.read_tangents()
.map(|v| VertexAttributeValues::Float32x4(v.collect()))
{
mesh.insert_attribute(Mesh::ATTRIBUTE_TANGENT, vertex_attribute);
}

if let Some(vertex_attribute) = reader
.read_tex_coords(0)
.map(|v| VertexAttributeValues::Float32x2(v.into_f32().collect()))
Expand Down Expand Up @@ -309,6 +304,25 @@ async fn load_gltf<'a, 'b>(
}
}

if let Some(vertex_attribute) = reader
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For future reviewers, this reordering is done to make sure that all the data has been added to the mesh before bevy_mikktspace is run.

.read_tangents()
.map(|v| VertexAttributeValues::Float32x4(v.collect()))
{
mesh.insert_attribute(Mesh::ATTRIBUTE_TANGENT, vertex_attribute);
} else if mesh.attribute(Mesh::ATTRIBUTE_NORMAL).is_some()
&& primitive.material().normal_texture().is_some()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how meshes work here, but why do we need to know that the material has a normal_texture? It doesn't look like the material is passed into generate_tangents.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The shader code needs the normal vertex attribute, a normal map texture, and tangent vertex attribute in order to apply normal mapping. The normal map texture is in tangent space, the combination of the vertex normal and vertex tangent can then be used to transform the tangent space normal to a world space normal. So, if we don't have both a normal map texture and normal attribute, there is no need to generate tangents.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recognise all of those words.

I'll defer to your judgement here :)

{
bevy_log::debug!(
"Missing vertex tangents, computing them using the mikktspace algorithm"
);
if let Err(err) = mesh.generate_tangents() {
bevy_log::warn!(
"Failed to generate vertex tangents using the mikktspace algorithm: {:?}",
err
);
}
}

let mesh = load_context.set_labeled_asset(&primitive_label, LoadedAsset::new(mesh));
primitives.push(super::GltfPrimitive {
mesh,
Expand All @@ -318,6 +332,7 @@ async fn load_gltf<'a, 'b>(
.and_then(|i| materials.get(i).cloned()),
});
}

let handle = load_context.set_labeled_asset(
&mesh_label(&mesh),
LoadedAsset::new(super::GltfMesh { primitives }),
Expand Down
17 changes: 17 additions & 0 deletions crates/bevy_mikktspace/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "bevy_mikktspace"
version = "0.8.0-dev"
edition = "2021"
authors = ["Benjamin Wasty <benny.wasty@gmail.com>", "David Harvey-Macaulay <alteous@outlook.com>", "Layl Bongers <LaylConway@users.noreply.github.com>"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could consider removing the authors field here. I don't want to make that call one way or another.

One reason we may want to do so is that it's no longer recommended practise to have it. OTOH I don't think it hurts anything to leave it here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we ever meaningfully diverge from the current impl, I'm more comfortable considering removing this. Until then, I'd prefer to leave it in as a form of credit.

description = "Mikkelsen tangent space algorithm"
documentation = "https://docs.rs/bevy"
homepage = "https://bevyengine.org"
repository = "https://github.com/bevyengine/bevy"
license = "Zlib AND (MIT OR Apache-2.0)"
keywords = ["bevy", "3D", "graphics", "algorithm", "tangent"]

[dependencies]
glam = "0.20.0"

[[example]]
name = "generate"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally we should have this tested end-to-end somewhere higher up the tree - or at least a visual example. I can't say that we should be blocked on that, and I don't understand what tangents are enough to say what form that should take.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a fair point. There are Khronos glTF example models for testing that could be used and they are freely-licensed. I don't like adding binary blobs into the repo though. @cart what do you think about this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are already regression tests elsewhere in the project that will be run via cargo test. I'm cool with leaving it at that for now.

176 changes: 176 additions & 0 deletions crates/bevy_mikktspace/LICENSE-APACHE
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS
26 changes: 26 additions & 0 deletions crates/bevy_mikktspace/LICENSE-MIT
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Copyright (c) 2017 The mikktspace Library Developers

Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

35 changes: 35 additions & 0 deletions crates/bevy_mikktspace/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# bevy_mikktspace

This is a fork of [https://github.com/gltf-rs/mikktspace](https://github.com/gltf-rs/mikktspace), which in turn is a port of the Mikkelsen Tangent Space Algorithm reference implementation to Rust. It has been forked for use in the bevy game engine to be able to update maths crate dependencies in lock-step with bevy releases. It is vendored in the bevy repository itself as [crates/bevy_mikktspace](https://github.com/bevyengine/bevy/tree/main/crates/bevy_mikktspace).

Port of the [Mikkelsen Tangent Space Algorithm](https://en.blender.org/index.php/Dev:Shading/Tangent_Space_Normal_Maps) reference implementation.

Requires at least Rust 1.52.1.

## Examples

### generate

Demonstrates generating tangents for a cube with 4 triangular faces per side.

```sh
cargo run --example generate
```

## License agreement

Licensed under either of
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably mention that there are sections licensed under the original zlib license of upstream mikktspace here, but contributions don't have that license.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added. See if you think the approach is ok. It's a little tricky to cover this AND either of these in a clear way.


* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))
* MIT license
([LICENSE-MIT](LICENSE-MIT) or [http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT))

at your option. AND parts of the code are licensed under:

* Zlib license
[https://opensource.org/licenses/Zlib](https://opensource.org/licenses/Zlib)

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
Loading