Skip to content

Commit

Permalink
Merge pull request #295 from CesiumGS/double-sided-material
Browse files Browse the repository at this point in the history
New optional parameter `doubleSidedMaterial` to force materials to be rendered on both sides
  • Loading branch information
lilleyse authored Oct 3, 2023
2 parents dc2500a + 0d4facf commit a26858a
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 2 deletions.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change Log

### 3.2.0 - 2023-??-??

- Added `doubleSidedMaterial` option to force materials to be rendered double sided. [#294](https://github.com/CesiumGS/obj2gltf/pull/294)

### 3.1.6 - 2023-02-10

- Update npm module dependencies.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ As a convenience the PBR textures may be supplied directly to the command line.
| `--input-up-axis` | Up axis of the obj. | No |
| `--output-up-axis` | Up axis of the converted glTF. | No |
| `--triangle-winding-order-sanitization` | Apply triangle winding order sanitization. | No |
| `--doubleSidedMaterial` | Allow the material properties to be double-sided | No, default `false` |

## Build Instructions

Expand Down
6 changes: 6 additions & 0 deletions bin/obj2gltf.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,11 @@ const argv = yargs
type: "boolean",
default: defaults.triangleWindingOrderSanitization,
},
doubleSidedMaterial: {
describe: "Allow the material properties to be double-sided",
type: "boolean",
default: defaults.doubleSidedMaterial,
},
})
.parse(args);

Expand Down Expand Up @@ -216,6 +221,7 @@ const options = {
inputUpAxis: argv.inputUpAxis,
outputUpAxis: argv.outputUpAxis,
triangleWindingOrderSanitization: argv.triangleWindingOrderSanitization,
doubleSidedMaterial: argv.doubleSidedMaterial,
};

console.time("Total");
Expand Down
4 changes: 2 additions & 2 deletions lib/loadMtl.js
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,7 @@ function createSpecularGlossinessMaterial(material, options) {
transparent = transparent || diffuseTexture.transparent;
}

const doubleSided = transparent;
const doubleSided = transparent || options.doubleSidedMaterial;
const alphaMode = transparent ? "BLEND" : "OPAQUE";

return {
Expand Down Expand Up @@ -934,7 +934,7 @@ function createMetallicRoughnessMaterial(material, options) {
transparent = transparent || baseColorTexture.transparent;
}

const doubleSided = transparent;
const doubleSided = transparent || options.doubleSidedMaterial;
const alphaMode = transparent ? "BLEND" : "OPAQUE";

return {
Expand Down
11 changes: 11 additions & 0 deletions lib/obj2gltf.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ module.exports = obj2gltf;
* @param {Logger} [options.logger] A callback function for handling logged messages. Defaults to console.log.
* @param {Writer} [options.writer] A callback function that writes files that are saved as separate resources.
* @param {String} [options.outputDirectory] Output directory for writing separate resources when options.writer is not defined.
* @param {Boolean} [options.doubleSidedMaterial=false] Allows materials to be double sided.
* @return {Promise} A promise that resolves to the glTF JSON or glb buffer.
*/
function obj2gltf(objPath, options) {
Expand All @@ -54,6 +55,10 @@ function obj2gltf(objPath, options) {
options.checkTransparency,
defaults.checkTransparency
);
options.doubleSidedMaterial = defaultValue(
options.doubleSidedMaterial,
defaults.doubleSidedMaterial
);
options.secure = defaultValue(options.secure, defaults.secure);
options.packOcclusion = defaultValue(
options.packOcclusion,
Expand Down Expand Up @@ -179,6 +184,12 @@ obj2gltf.defaults = {
* @default false
*/
checkTransparency: false,
/**
* Gets and sets whether a material will be doubleSided or not
* @type Boolean
* @default false
*/
doubleSidedMaterial: false,
/**
* Gets or sets whether the source model can reference paths outside of its directory.
* @type Boolean
Expand Down
16 changes: 16 additions & 0 deletions specs/lib/loadMtlSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,14 @@ describe("loadMtl", () => {
expect(material.alphaMode).toBe("BLEND");
expect(material.doubleSided).toBe(true);
});

it("uses doubleSidedMaterial option", () => {
options.metallicRoughness = true;
options.doubleSidedMaterial = true;

const material = loadMtl._createMaterial(undefined, options);
expect(material.doubleSided).toBe(true);
});
});

describe("specularGlossiness", () => {
Expand Down Expand Up @@ -530,5 +538,13 @@ describe("loadMtl", () => {
expect(material.alphaMode).toBe("BLEND");
expect(material.doubleSided).toBe(true);
});

it("uses doubleSidedMaterial option", () => {
options.specularGlossiness = true;
options.doubleSidedMaterial = true;

const material = loadMtl._createMaterial(undefined, options);
expect(material.doubleSided).toBe(true);
});
});
});

0 comments on commit a26858a

Please sign in to comment.