Commit Graph

518 Commits

Author SHA1 Message Date
Pär Winzell cc0a6e5b89
Merge pull request #48 from davilovick/fix_normal_issues 2017-12-03 11:58:09 -08:00
David Ávila Membrives 1a46ccf7ff Include meshScaling in normal transform 2017-12-03 20:47:41 +01:00
David Ávila Membrives 9c2e485cfc Apply the correct transform on normals (remove transform & scaling components) 2017-12-03 15:32:53 +01:00
Pär Winzell a9c4fb1bd0 Fix for Windows. (And generally a good idea.) 2017-11-30 23:15:13 -08:00
Par Winzell 21305baa93 NPM-publish of patch release 0.9.3. 2017-11-30 23:02:22 -08:00
Pär Winzell fdf7bb3336 Support for Stingray PBS material definitions (#47)
This adds the first FBX PBR import path. Materials that have been
exported via the Stingray PBS preset should be picked up as native
metallic/roughness, and exported essentially 1:1 to the glTF output.

In more detail, this commit:
- (Re)introduces the STB header libraries as a dependency. We currently
use it for reading and writing images. In time we may need a more
dedicated PNG compression library.
- Generalizes FbxMaterialAccess to return different subclasses of
  FbxMaterialInfo; currently FbxRoughMetMaterialInfo and
  FbxTraditionalMaterialInfo.
  - FbxTraditionalMaterialInfo is populated from the canonical
    FbxSurfaceMaterial classes.
  - FbxRoughMetMaterialInfo is currently populated through the Stingray
    PBS set of properties, further documented in the code.
- RawMaterial was in turn generalized to feature a pluggable,
  type-specific RawMatProps struct; current implementations are,
  unsurprisingly, RawTraditionalMatProps and RawMetRoughMatProps. These
  are basically just lists of per-surface constants, e.g. diffuseFactor or
  roughness.
- In the third phase, glTF generation, the bulk of the changes are
  concerned with creating packed textures of the type needed by e.g. the
  metallic-roughness struct, where one colour channel holds roughness and
  the other metallic. This is done with a somewhat pluggable "map source
  pixels to destination pixel" mechanism. More work will likely be needed
  here in the future to accomodate more demanding mappings.

There's also a lot of code to convert from one representation to
another. The most useful, but also the least well-supported conversion,
is from old workflow (diffuse, specular, shininess) to
metallic/roughness. Going from PBR spec/gloss to PBR met/rough is hard
enough, but we go one step sillier and treat shininess as if it were
glossiness, which it certainly isn't. More work is needed here! But it's
still a fun proof of concept of sorts, and perhaps for some people it's
useful to just get *something* into the PBR world.
2017-11-30 22:23:50 -08:00
Par Winzell e2e0d741a2 Style tweaks. 2017-11-28 01:22:43 -08:00
David Ávila fada9e45ee Modify FBX2glTF to allow that several nodes share the same mesh. (#46) 2017-11-28 01:16:01 -08:00
Pär Winzell f61814f7c9
Pin Draco at 1.2.0, for now
As @robertlong discovered, there are compilation errors in newer Draco patch releases under Win/VS 2017.
2017-11-21 19:10:45 -08:00
Par Winzell 423458a841 Construct JSON with explicit key order.
We are at liberty to order our JSON any way we like (by spec) and we can
improve readability a lot by doing so. By default, this JSON library
uses an unordered map for objects, but it's relatively easy to switch in
a FiFo map that keeps track of the insertion order.
2017-11-17 11:37:19 -08:00
Par Winzell c70ded31d5 Explicit versions of dependencies.
As we approach 1.0.0 we can't just download whatever someone's slammed
into the master branch of our various open source dependencies.
2017-11-16 18:19:52 -08:00
Par Winzell bcbfdae6be Drop misleading warning.
It's perfectly fine for materials to have neither diffuse texture nor
vertex colours. This dates back to a time when the tool had more limited
use cases.

To compensate: https://github.com/facebookincubator/FBX2glTF/issues/43
2017-11-16 14:10:30 -08:00
Pär Winzell 5eb36702b5
Make blend shape normals/tangents opt-in. (#40)
The FBX SDK absolutely claims that there is a normal layer to each
FbxShape, with non-trivial data, even when the corresponding FBX file,
upon visual inspection, explicitly contains nothing but zeroes. The only
conclusion I can draw is that the SDK is computing normals from
geometry, without being asked to, which seems kind of sketchy.

These computed normals are often not at all what the artist wanted, they
take up a lot of space -- often pointlessly, since if they're computed,
we could just as well compute them on the client -- and at least in the
case of three.js their inclusion uses up many of the precious 8 morph
target slots in the shader.

So, they are now opt-in, at least until we can solve the mystery of just
what goes on under the hood in the SDK.
2017-11-14 14:36:44 -08:00
Par Winzell e73c2f46e2 Only use vertex alpha if color layer is present.
This was previously flagging far too many materials as transparent.
2017-11-14 13:47:34 -08:00
Pär Winzell 7f8746f56e
Minor README tweaks. 2017-11-09 20:15:00 -08:00
Par Winzell 412b98b9ab Cope with animation edge case, don't NPE. 2017-11-08 11:25:55 -08:00
Par Winzell 145f0d84a1 Minor normal/tangent cleanup. 2017-11-07 13:59:13 -08:00
Pär Winzell 3eeebf4599
Blendshape tangets & normals, cleanup. (#35)
Turns out Maya was always including normals in the FBX export, they were just a bit trickier to get to than originally surmised. We need to go through the proper element access formalities that takes mapping and reference modes into account.

Luckily we already have a helper class for this, so let's lean on that.
2017-11-07 13:32:54 -08:00
Pär Winzell 5786fc9f0b One more dynamic_cast to drop. 2017-11-06 23:14:35 -08:00
Par Winzell 4f8ddffdf7 Better calculation of glTF opacity.
At the glTF level, transparency is a scalar; we just throw away any
color information in FBX TransparentColor. We still need to calculate
our total opacity from it, however. This is the right formula, which
additionally matches the deprecated (but still populated, by the Maya
exporter) 'Opacity' property.
2017-11-06 14:48:16 -08:00
Par Winzell 3b7872f4f1 NPM-publish of patch release 0.9.2. 2017-11-06 13:26:12 -08:00
Par Winzell d2a20ee5cb Fixes for Linux/GCC.
Between Linux, Darwin and Windows keeping me honest, I am slowly learning C++.
2017-11-06 12:20:15 -08:00
Pär Winzell 5eb3779ad8 Don't use dynamic_cast, it needs RTTI. 2017-11-06 00:17:39 -08:00
Pär Winzell 60f18ae635 Diffuse texture transparency takes priority.
If the diffuse texture is opaque, it doesn't matter if a couple of
vertexes are semi-transparent.
2017-11-05 23:09:59 -08:00
Pär Winzell 7ecc6e5743 Fix build on Windows.
No vectors of const objects. Got it. Makes sense.
2017-11-05 23:08:32 -08:00
Pär Winzell 9ae36088b4
Blend Shape / Morph Target Support (#33)
This adds blend shape / morph target functionality.

At the FBX level, a mesh can have a number of deformers associated with it. One such deformer type is the blend shape. A blend shape is a collection of channels, which do all the work. A channel can consist of a single target shape (the simple case) or multiple (a progressive morph). In the latter case, the artist has created in-between shapes, the assumption being that linear interpolation between a beginning shape and an end shape would be too crude. Each such target shape contains a complete set of new positions for each vertex of the deformed base mesh.

(It's also supposed to be optionally a complete set of normals and tangents, but I've yet to see that work right; they always come through as zeroes. This is something to investigate in the future.)

So the number of glTF morph targets in a mesh is the total number of FBX target shapes associated with channels associated with blend shape deformers associated with that mesh! Yikes.

The per-vertex data of each such target shape is added to a vector in RawVertex. A side effect of this is that vertices that participate in blend shapes must be made unique to the mesh in question, as opposed to general vertices which are shared across multiple surfaces.

Blend Shape based animations become identical glTF morph target animations..

Fixes #17.
2017-11-05 00:06:24 -07:00
Pär Winzell 5e0f05261c
Sort triangles with vertex transparency separately. (#32)
Lean on the excellent pre-existing support for creating multiple glTF
meshes from a single FBX mesh based on material type. All the triangles
with (at least one) non-opaque vertex get flagged as transparent
material. They will all go separately in their own mesh after the
CreateMaterialModels() gauntlet.

Fixes #25.
2017-11-04 20:10:28 -07:00
Par Winzell 14150269a0 Switch FbxDouble4 uses to FbxVector4, clean up. 2017-11-03 21:48:41 -07:00
Par Winzell 0fcd00cb5b Get rid of some pointless copying. 2017-10-31 20:18:14 -07:00
Pär Winzell 21138b6eff
Merge pull request #30 from facebookincubator/check-for-exe
Use .exe suffix on Windows.
2017-10-31 11:49:10 -07:00
Michael Bayne 7f9aa3318a Use .exe suffix on Windows. 2017-10-31 11:33:32 -07:00
Par Winzell 58518f5e00 Tiny log string fix. 2017-10-29 00:34:20 -07:00
Pär Winzell 34800d056a
Merge pull request #28 from facebookincubator/bug-fix-einherit-warning
Fix and improve inheritance warnings.
2017-10-27 15:52:35 -07:00
Par Winzell 075dc4a8c3 Fix and improve inheritance warnings.
We were warnings against eInheritRSrs, which is actually the one type of
ineritance we're good with. It's eInheritRrSs we should freak out about.

That said, no need to do it for the root node -- at that point there is
no global transform to worry about.
2017-10-27 15:47:49 -07:00
Par Winzell 22354fd7ce Use standard library log2f. 2017-10-27 15:31:32 -07:00
Par Winzell 1829f6d6a6 RawSurface.skinRigid not used. 2017-10-27 15:31:32 -07:00
Pär Winzell 6137694595
Merge pull request #26 from facebookincubator/error-fix
Fix error reporting.
2017-10-27 12:28:15 -07:00
Michael Bayne a03e252866 Fix error reporting. 2017-10-27 12:21:13 -07:00
Par Winzell b1076fa373 Default opts to empty array if it's not supplied.
Fixes a NPE on line 33 for a common case.
2017-10-25 13:24:30 -07:00
Par Winzell 91d11c88b7 Do the right thing with empty directory path.
When we convert a file that's in our CWD, on Unix the folder component
of the path will simply be "", whereas opendir() wants ".".

I want to take another more substantial pass at texture resolution, once
we're out of urgent bugfix mode.
2017-10-25 12:02:25 -07:00
Par Winzell db3f232fc9 Cope with geometry opting out of geometry.
Some FBX files have index arrays that contain -1 (indeed, that are
nothing but negative ones). Presumably the intention is to specify "no
material". In any case, let's not segfault.
2017-10-24 20:57:55 -07:00
Pär Winzell 4e0f5e4fcf Merge pull request #15 from robertlong/master
Skip invalid animations with 0 channels.
2017-10-24 11:32:48 -07:00
Par Winzell fb7dae380b Actually initialize the dracoMesh pointer. 2017-10-24 09:15:59 -07:00
Par Winzell e417fbe90e Fix the --keep-attribute option. 2017-10-24 08:50:46 -07:00
Par Winzell f535effb8b NPM-publish of patch release 0.9.1. 2017-10-23 20:13:17 -07:00
Pär Winzell 72eb620d87 Copy texture files to output dir when appropriate. (#23)
When we've successfully located a referenced texture image on the local
filesystem and we're generating non-binary, non-embedded output, copy
the source folder wholesale into the destination directory.

This means the output folder is always a full, free-standing deployment,
one that can be dragged into e.g. https://gltf-viewer.donmccurdy.com/
2017-10-23 19:30:51 -07:00
Par Winzell 5580dcfa92 Whitespace tweaks in log output. 2017-10-23 18:59:32 -07:00
Par Winzell 5a4959d86c Don't mention texture here.
This is a general-purpose function now.
2017-10-23 17:29:00 -07:00
Pär Winzell dfb026033d Document the new v-flipping default. (#22)
The READMEs need updating, too.
2017-10-22 16:43:20 -07:00
Pär Winzell d46aeb3d46 Merge pull request #21 from zellski/feat-default-to-flipped-textures
Default to vertically flipping texture coordinates.
2017-10-22 16:32:50 -07:00