Glen Whitney
fb1d2a020c
Set VRML97 translation of IndexedFaceSets to specify `solid false` unless the faces were explicitly indicated to have CLOCKWISE or COUNTERCLOCKWISE vertex ordering. This is conservative, but otherwise shapes may be "see-through" in undesirable ways, if the original VRML 1 vertices are not ordered consistently with the VRML97 default. Also fixes a typo/bug in picking up numerical values of parameters, and ensures that fields in the output VRML97 are always separated by at least a space, comma, or parenthesis. Also updates dependencies to their latest versions Reviewed-on: #17 Co-authored-by: Glen Whitney <glen@studioinfinity.org> Co-committed-by: Glen Whitney <glen@studioinfinity.org>
77 lines
2.8 KiB
Markdown
77 lines
2.8 KiB
Markdown
# vrml1to97
|
|
|
|
JavaScript converter from VRML 1.0 to VRML97 file format, based on Wings 3D
|
|
conversion logic.
|
|
|
|
Essentially, this is a JavaScript reimplementation of the algorithm of the
|
|
"token rearranger" found in the
|
|
[Wings 3D x3d importer](https://github.com/dgud/wings/blob/master/plugins_src/import_export/x3d_import.erl)
|
|
(which was written in Erlang).
|
|
|
|
## Usage
|
|
|
|
From an es6 module under Node (for example)
|
|
|
|
```js
|
|
import {convert} from 'vrml1to97'
|
|
const vrml1spec = '# VRML 1.0 ....'
|
|
const vrml97spec = convert(vrml1spec)
|
|
```
|
|
|
|
or from a script in a webpage
|
|
|
|
```js
|
|
(async () => {
|
|
const vrml1to97 = await import('./dist/vrml1to97/index.js')
|
|
const vrml1spec = '# VRML 1.0 ....'
|
|
const vrml97spec = vrml1to97.convert(vrml1spec)
|
|
})()
|
|
```
|
|
|
|
or from the command line via node
|
|
|
|
```shell
|
|
npx vrml1to97 < old.wrl > shinynew.wrl
|
|
```
|
|
|
|
## API
|
|
|
|
Currently this package exports just two functions:
|
|
|
|
* convert(vrml1: string, source?: string): string
|
|
|
|
The main function, takes in VRML 1 syntax (note that it does not
|
|
actually check that its input is VRML 1, so its behavior is undefined
|
|
if given anything but valid VRML 1 syntax). Returns VRML 97 syntax for
|
|
the same scene, as nearly as it can translate. Note that not all of
|
|
VRML 1 is recognized, and some of the translations may be somewhat
|
|
approximate.
|
|
|
|
If the optional second argument `source` is supplied, `convert` adds
|
|
a comment indicating that the original vrml1 came from the specified
|
|
source, before conversion to VRML97.
|
|
|
|
* tree97(vrml1: string): Tree
|
|
|
|
Takes the same input as convert, but rather than returning a string, it
|
|
returns a very rough syntax tree for the converted VRML97 scene. The
|
|
returned Tree data structure is an object whose keys are property names
|
|
and whose values are lists of either strings or sub-Trees. Note however
|
|
that this syntax tree does not represent a complete parse; since VRML 1
|
|
and VRML97 are close, whole blocks of syntax are left as strings rather
|
|
than broken into node names and property values. If there is a need to
|
|
generate XML syntax output, for example, the code would need to be
|
|
modified to break the tree down further to be ready for conversion to XML.
|
|
|
|
## Conversion notes
|
|
|
|
One sort of geometry common to VRML 1 and VRML97 is the IndexedFaceSet. These
|
|
often used to render solids. Indeed, the default in VRML97 is to assume they
|
|
do represent a solid, with the normals pointing outward. Unusual visual effects
|
|
ensue if the normals are not properly directed (basically, you see through the
|
|
"front" of the solid and see the "backs" of the faces on the opposite side).
|
|
As a result, unless the input VRML 1 explicitly includes an explicit
|
|
vertexOrdering of CLOCKWISE or COUNTERCLOCKWISE, the default solid treatment
|
|
will be turned off in the VRML97 output, meaning that all faces will be
|
|
rendered opaque in both directions.
|