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

Add support for KHR_materials_dispersion #215

Merged
merged 12 commits into from
May 31, 2024
1 change: 1 addition & 0 deletions ISSUES.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
|INVALID_EXTENSION_NAME_FORMAT|Extension name has invalid format.|Warning|
|INVALID_GL_VALUE|Invalid value `%1` for GL type '`%2`'.|Error|
|KHR_LIGHTS_PUNCTUAL_LIGHT_SPOT_ANGLES|outerConeAngle (`%2`) is less than or equal to innerConeAngle (`%1`).|Error|
|KHR_MATERIALS_DISPERSION_NO_VOLUME|The dispersion extension needs to be combined with the volume extension.|Warning|
|KHR_MATERIALS_EMISSIVE_STRENGTH_ZERO_FACTOR|Emissive strength has no effect when the emissive factor is zero or undefined.|Warning|
|KHR_MATERIALS_IRIDESCENCE_THICKNESS_RANGE_INVALID|Thickness maximum must be greater than or equal to the thickness minimum.|Error|
|KHR_MATERIALS_IRIDESCENCE_THICKNESS_RANGE_WITHOUT_TEXTURE|Thickness minimum has no effect when a thickness texture is not defined.|Information|
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ NuGet package [Third-party contribution]: https://www.nuget.org/packages/GltfVal
- EXT_texture_webp
- KHR_lights_punctual
- KHR_materials_clearcoat
- KHR_materials_dispersion
- KHR_materials_emissive_strength
- KHR_materials_ior
- KHR_materials_iridescence
Expand Down Expand Up @@ -116,6 +117,10 @@ To publish an npm package, follow these steps after installation:
1. Run `dart run grinder npm-publish`.
2. `gltf-validator` npm package will be built to `build/node` and published to npm registry using `npm publish`.

### Post-Build Steps
1. To auto-format all source files, from the root folder run: `dart format --fix .`
2. To run the tests, use: `dart test`

### Validation Issues List
To generate [ISSUES.md](ISSUES.md), follow these steps after installation:
1. Run `dart run grinder issues`.
Expand Down
6 changes: 6 additions & 0 deletions lib/src/errors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,12 @@ class SemanticError extends IssueType {
(args) => 'outerConeAngle (${args[1]}) is less than or equal to '
'innerConeAngle (${args[0]}).');

static final SemanticError khrMaterialsDispersionNoVolume = SemanticError._(
'KHR_MATERIALS_DISPERSION_NO_VOLUME',
(args) => 'The dispersion extension needs to be combined with '
'the volume extension.',
Severity.Warning);

static final SemanticError khrMaterialsEmissiveStrengthZeroFactor =
SemanticError._(
'KHR_MATERIALS_EMISSIVE_STRENGTH_ZERO_FACTOR',
Expand Down
62 changes: 62 additions & 0 deletions lib/src/ext/KHR_materials_dispersion/khr_materials_dispersion.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 2024 The Khronos Group Inc.
//
// SPDX-License-Identifier: Apache-2.0

library gltf.extensions.khr_materials_dispersion;

import 'package:gltf/src/base/gltf_property.dart';
import 'package:gltf/src/ext/extensions.dart';

const String KHR_MATERIALS_DISPERSION = 'KHR_materials_dispersion';

const String DISPERSION = 'dispersion';

const List<String> KHR_MATERIALS_DISPERSION_MEMBERS = <String>[
DISPERSION,
];

class KhrMaterialsDispersion extends GltfProperty {
final double dispersion;

KhrMaterialsDispersion._(
this.dispersion, Map<String, Object> extensions, Object extras)
: super(extensions, extras);

static KhrMaterialsDispersion fromMap(
Map<String, Object> map, Context context) {
if (context.validate) {
checkMembers(map, KHR_MATERIALS_DISPERSION_MEMBERS, context);
}

final dispersion = getFloat(map, DISPERSION, context, min: 0, def: 0);

final extensions = getExtensions(map, KhrMaterialsDispersion, context);

return KhrMaterialsDispersion._(
dispersion, extensions, getExtras(map, context));
}

@override
void link(Gltf gltf, Context context) {
if (!context.validate) {
return;
}

Object o = this;
while (o != null) {
o = context.owners[o];
if (o is Material) {
// The dispersion extension needs to be combined with KHR_materials_volume.
if (!o.extensions.containsKey(KHR_MATERIALS_VOLUME)) {
context.addIssue(SemanticError.khrMaterialsDispersionNoVolume);
}
break;
}
}
}
}

const Extension khrMaterialsDispersionExtension = Extension(
KHR_MATERIALS_DISPERSION, <Type, ExtensionDescriptor>{
Material: ExtensionDescriptor(KhrMaterialsDispersion.fromMap)
});
3 changes: 3 additions & 0 deletions lib/src/ext/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import 'package:gltf/src/base/gltf_property.dart';
import 'package:gltf/src/ext/EXT_texture_webp/ext_texture_webp.dart';
import 'package:gltf/src/ext/KHR_lights_punctual/khr_lights_punctual.dart';
import 'package:gltf/src/ext/KHR_materials_clearcoat/khr_materials_clearcoat.dart';
import 'package:gltf/src/ext/KHR_materials_dispersion/khr_materials_dispersion.dart';
import 'package:gltf/src/ext/KHR_materials_emissive_strength/khr_materials_emissive_strength.dart';
import 'package:gltf/src/ext/KHR_materials_ior/khr_materials_ior.dart';
import 'package:gltf/src/ext/KHR_materials_iridescence/khr_materials_iridescence.dart';
Expand All @@ -38,6 +39,7 @@ import 'package:meta/meta.dart';
export 'package:gltf/src/ext/EXT_texture_webp/ext_texture_webp.dart';
export 'package:gltf/src/ext/KHR_lights_punctual/khr_lights_punctual.dart';
export 'package:gltf/src/ext/KHR_materials_clearcoat/khr_materials_clearcoat.dart';
export 'package:gltf/src/ext/KHR_materials_dispersion/khr_materials_dispersion.dart';
export 'package:gltf/src/ext/KHR_materials_emissive_strength/khr_materials_emissive_strength.dart';
export 'package:gltf/src/ext/KHR_materials_ior/khr_materials_ior.dart';
export 'package:gltf/src/ext/KHR_materials_iridescence/khr_materials_iridescence.dart';
Expand Down Expand Up @@ -100,6 +102,7 @@ const List<Extension> kDefaultExtensions = <Extension>[
extTextureWebPExtension,
khrLightsPunctualExtension,
khrMaterialsClearcoatExtension,
khrMaterialsDispersionExtension,
khrMaterialsEmissiveStrengthExtension,
khrMaterialsIorExtension,
khrMaterialsIridescenceExtension,
Expand Down
12 changes: 12 additions & 0 deletions test/ext/KHR_materials_dispersion/assets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"material": {
"name": "material.KHR_materials_dispersion",
"tests": {
"custom_property.gltf": "Custom property",
"no_volume.gltf": "No volume extension",
"out_of_range.gltf": "Out of range values",
"unexpected_extension.gltf": "Unexpected extension object location",
"valid.gltf": "Valid"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"asset": {
"version": "2.0"
},
"extensionsUsed": [
"KHR_materials_dispersion",
"KHR_materials_volume",
"KHR_materials_transmission"
],
"materials": [
{
"extensions": {
"KHR_materials_dispersion": {
"customProperty": true
},
"KHR_materials_volume": {
"thicknessFactor": 1
},
"KHR_materials_transmission": {}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"uri": "test/ext/KHR_materials_dispersion/data/material/custom_property.gltf",
"mimeType": "model/gltf+json",
"validatorVersion": "2.0.0-dev.3.9",
"issues": {
"numErrors": 0,
"numWarnings": 1,
"numInfos": 1,
"numHints": 0,
"messages": [
{
"code": "UNEXPECTED_PROPERTY",
"message": "Unexpected property.",
"severity": 1,
"pointer": "/materials/0/extensions/KHR_materials_dispersion/customProperty"
},
{
"code": "UNUSED_OBJECT",
"message": "This object may be unused.",
"severity": 2,
"pointer": "/materials/0"
}
],
"truncated": false
},
"info": {
"version": "2.0",
"extensionsUsed": [
"KHR_materials_dispersion",
"KHR_materials_volume",
"KHR_materials_transmission"
],
"animationCount": 0,
"materialCount": 1,
"hasMorphTargets": false,
"hasSkins": false,
"hasTextures": false,
"hasDefaultScene": false,
"drawCallCount": 0,
"totalVertexCount": 0,
"totalTriangleCount": 0,
"maxUVs": 0,
"maxInfluences": 0,
"maxAttributes": 0
}
}
17 changes: 17 additions & 0 deletions test/ext/KHR_materials_dispersion/data/material/no_volume.gltf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"asset": {
"version": "2.0"
},
"extensionsUsed": [
"KHR_materials_dispersion"
],
"materials": [
{
"extensions": {
"KHR_materials_dispersion": {
"dispersion": 1.0
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"uri": "test/ext/KHR_materials_dispersion/data/material/no_volume.gltf",
"mimeType": "model/gltf+json",
"validatorVersion": "2.0.0-dev.3.9",
"issues": {
"numErrors": 0,
"numWarnings": 1,
"numInfos": 1,
"numHints": 0,
"messages": [
{
"code": "KHR_MATERIALS_DISPERSION_NO_VOLUME",
"message": "The dispersion extension needs to be combined with the volume extension.",
"severity": 1,
"pointer": "/materials/0/extensions/KHR_materials_dispersion"
},
{
"code": "UNUSED_OBJECT",
"message": "This object may be unused.",
"severity": 2,
"pointer": "/materials/0"
}
],
"truncated": false
},
"info": {
"version": "2.0",
"extensionsUsed": [
"KHR_materials_dispersion"
],
"animationCount": 0,
"materialCount": 1,
"hasMorphTargets": false,
"hasSkins": false,
"hasTextures": false,
"hasDefaultScene": false,
"drawCallCount": 0,
"totalVertexCount": 0,
"totalTriangleCount": 0,
"maxUVs": 0,
"maxInfluences": 0,
"maxAttributes": 0
}
}
23 changes: 23 additions & 0 deletions test/ext/KHR_materials_dispersion/data/material/out_of_range.gltf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"asset": {
"version": "2.0"
},
"extensionsUsed": [
"KHR_materials_dispersion",
"KHR_materials_volume",
"KHR_materials_transmission"
],
"materials": [
{
"extensions": {
"KHR_materials_dispersion": {
"dispersion": -0.5
},
"KHR_materials_volume": {
"thicknessFactor": 1
},
"KHR_materials_transmission": {}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"uri": "test/ext/KHR_materials_dispersion/data/material/out_of_range.gltf",
"mimeType": "model/gltf+json",
"validatorVersion": "2.0.0-dev.3.9",
"issues": {
"numErrors": 1,
"numWarnings": 0,
"numInfos": 1,
"numHints": 0,
"messages": [
{
"code": "VALUE_NOT_IN_RANGE",
"message": "Value -0.5 is out of range.",
"severity": 0,
"pointer": "/materials/0/extensions/KHR_materials_dispersion/dispersion"
},
{
"code": "UNUSED_OBJECT",
"message": "This object may be unused.",
"severity": 2,
"pointer": "/materials/0"
}
],
"truncated": false
},
"info": {
"version": "2.0",
"extensionsUsed": [
"KHR_materials_dispersion",
"KHR_materials_volume",
"KHR_materials_transmission"
],
"animationCount": 0,
"materialCount": 1,
"hasMorphTargets": false,
"hasSkins": false,
"hasTextures": false,
"hasDefaultScene": false,
"drawCallCount": 0,
"totalVertexCount": 0,
"totalTriangleCount": 0,
"maxUVs": 0,
"maxInfluences": 0,
"maxAttributes": 0
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"asset": {
"version": "2.0"
},
"extensionsUsed": [
"KHR_materials_dispersion"
],
"materials": [
{
"pbrMetallicRoughness": {
"extensions": {
"KHR_materials_dispersion": {
}
}
}
}
]
}
Loading
Loading