Commit Graph

34 Commits

Author SHA1 Message Date
Pär Winzell dc8f199d54
Support occlusion texture all the way. (#81)
By oversight we had not included occlusionTexture in the core
MaterialData. While we're at it, bake occlusion into the red channel of
the merged metallic/roughness texture.
2018-02-25 18:35:04 -08:00
Pär Winzell a8f194f793
better texture transparency test (#78)
Previous to this, a PNG that was on RGBA format would cause its
corresponding texture to be flagged as transparent. This is very
silly. We now iterate over the bytes, and if any is not 255, THEN
there's alpha.
2018-02-25 17:28:26 -08:00
Pär Winzell a984f7bf37
Drop the Gltf:: namespace prefix. (#77) 2018-02-25 17:19:19 -08:00
Pär Winzell 3f796dd90f
Use a tiny PNG for a fallback texture image, not a GIF (#74) 2018-02-23 19:39:08 -08:00
Par Winzell 608c6f1797 Add support for 32-bit indices.
This was way overdue. Breaking up large meshes into many 65535-vertex
primitives can save a few bytes, but it's really a lot of complication
for minor benefit.

With this change the user can force short or long indices, and the
default is to use shorts for smaller meshes and longs for longer.
2018-02-19 13:58:09 -08:00
Par Winzell 7c0715c4ad Clean house in material extensions.
- KHR_materials_common never had a real life in the glTF 2.0 world. One
day we may see a new extension for Phong/Blinn/Lambert.
- PBR_specular_glossiness is a poor fit for PBS StingRay (the only real
source of PBR we have) and has no advantage over PBR_metallic_roughness.
- The conversion we were doing for traditional materials to PBR made no
sense. Revert to a very simple formula: diffuse -> baseColor, simple
reasonable constants for metallic & roughness.
2018-02-19 08:57:19 -08:00
Par Winzell 20b1bd7051 Semi-randomly tweak Phong->PBR conversion.
I stole expressions from Gary Hsu's PBR conversion routines here:

3606e79717/extensions/Khronos/KHR_materials_pbrSpecularGlossiness/examples/convert-between-workflows/js/three.pbrUtilities.js

which is experimental enough as it is, but I had gone further into the
domain of madness and uses this with *old* diffuse/specular values, not
PBR specular/glossness.

As a result a lot of old content was coming up with 100% metal values
quite often, which in turn means completely ignoring diffuse when
assembling a new base colour...

I should rip out this whole conversion. But not just now...
2018-02-04 14:42:57 -08:00
Par Winzell a3989249f3 Consistent naming of unlit extension use. 2018-02-02 07:08:00 -08:00
Par Winzell 8ab9459d6a Don't override encoder's best guess. 2018-02-02 06:58:47 -08:00
Robert Long 74479426a7 KHR_materials_unlit (#61)
KHR_materials_unlit support.
2018-02-02 06:57:36 -08:00
Par Winzell 41f8a5ef03 Improvements in texture merging.
Be more flexible about reading various input formats (most especially
varying numbers of channels), and stop outputting RGBA PNGs for textures
that don't need it.

I'm not sure JPG generation ever worked right. But now it does.
2017-12-22 16:02:48 -08:00
David Ávila a2d5c7d87b Fix duplicate name issues (#51)
Fix the naming issues. Now the nodes are identified by pNode->GetUniqueID(), instead of its name. All dictionaries and references to nodes are replaced by its id, instead of its name.
2017-12-06 10:43:18 -08:00
Mike Feldstein 9d1096f3ff Properly pass camera data through 2017-12-04 14:35:57 -08:00
Pär Winzell a9c4fb1bd0 Fix for Windows. (And generally a good idea.) 2017-11-30 23:15:13 -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
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 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 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 58518f5e00 Tiny log string fix. 2017-10-29 00:34:20 -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
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 5a4959d86c Don't mention texture here.
This is a general-purpose function now.
2017-10-23 17:29:00 -07:00
Pär Winzell 8cf7f446b7 Further improvemens to texture resolution. (#16)
* Further improvemens to texture resolution.

- Move towards std::string over char * and FbxString where convenient,
- Make a clear distinction between textures whose image files have been
  located and those who haven't; warn early in the latter case.
- Extend RawTexture so we always know logical name in FBX, original file
  name in FBX, and inferred location in local filesystem.
- In non-binary mode, simply output the inferred local file basename as
  the URI; this will be the correct relative path as long as the texture
  files are located next to the .gltf and .bin files.

Primary remaining urge for a follow-up PR:

- We should be copying texture image files into the .gltf output folder,
  but before that we should switch to an off-the-shelf cross-platform
  file manipulation library like https://github.com/cginternals/cppfs.
  When we make that transition, all this texture resolution code will
  undergo another refactoring.
2017-10-20 09:42:39 -07:00
Robert Long 454cb7c864 Skip animations with 0 channels. 2017-10-19 16:27:47 -07:00
Par Winzell 443243a52c Only ever create one BufferViewData per file.
It is not uncommon for multiple logical textures in an FBX to reference
the same filename. Each such filename should yield one buffer view only,
and all sharing textures should reference it.
2017-10-18 21:49:45 -07:00
Par Winzell bf28c29f50 Multiple fixes for transparency.
- alphaMode is only BLEND for transparent materials.
- We use RawMaterial.type to figure out what's transparent.
- FBX TransparencyFactor is not opacity, but 1.0-opacity.
- Treat vertex coloured materials as transparent
  - We should at least iterate over vertices here and see if any of them
    actually are transparent
- Sort triangles properly: transparent ones render last!
2017-10-17 21:14:52 -07:00
Par Winzell d4ac174023 Don't include empty extension info. 2017-10-17 20:37:40 -07:00
Par Winzell f2a057d783 Do a better job resolving texture files.
- Nix GetFileFolder(). It was not helping. Always search for textures
- near the FBX file.
- Use RawTexture::name for the texture name and ::fileName for the
  inferred local filename path.
2017-10-16 23:31:19 -07:00
Par Winzell 276a0dfb86 Initial commit. 2017-10-13 01:55:11 -07:00