diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/README.md b/extensions/2.0/Khronos/KHR_lights_punctual/README.md new file mode 100644 index 0000000000..cfb9c4e8e5 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/README.md @@ -0,0 +1,160 @@ +# KHR\_lights\_punctual + +## Contributors + +* Norbert Nopper, UX3D, +* Don McCurdy, Google, [@donrmccurdy](https://twitter.com/donrmccurdy) +* Gary Hsu, Microsoft, [@bghgary](https://twitter.com/bghgary) +* Mike Bond, Adobe, [@MiiBond](https://twitter.com/MiiBond) + +## Status + +Draft (not ratified yet) + +## Dependencies + +Written against the glTF 2.0 spec. + +## Overview + +This extension defines a set of lights for use with glTF 2.0. Lights define light sources within a scene. + +Many 3D tools and engines support built-in implementations of light types. Using this extension, tools can export and engines can import these lights. + +This extension defines three "punctual" light types: `directional`, `point` and `spot`. Punctual lights are defined as parameterized, infinitely small points that emit light in well-defined directions and intensities. + +These lights are referenced by nodes and inherit the transform of that node. + +A conforming implementation of this extension must be able to load light data defined in the asset and has to render the asset using those lights. + +## Defining Lights + +Lights are defined within a dictionary property in the glTF scene description file, by adding an `extensions` property to the top-level glTF 2.0 object and defining a `KHR_lights_punctual` property with a `lights` array inside it. + +Each light defines a mandatory `type` property that designates the type of light (`directional`, `point` or `spot`). The following example defines a white-colored directional light. + +```javascript +"extensions": { + "KHR_lights_punctual" : { + "lights": [ + { + "color": [ + 1.0, + 1.0, + 1.0 + ], + "type": "directional" + } + ] + } +} +``` + +## Adding Light Instances to Nodes + +Lights must be attached to a node by defining the `extensions.KHR_lights_punctual` property and, within that, an index into the `lights` array using the `light` property. + +```javascript +"nodes" : [ + { + "extensions" : { + "KHR_lights_punctual" : { + "light" : 0 + } + } + } +] +``` + +The light will inherit the transform of the node. For light types that have a position (`point` and `spot` lights), the light's position is defined as the node's world location. +For light types that have a direction (`directional` and `spot` lights), the light's direction is defined as the 3-vector `(0.0, 0.0, -1.0)` and the rotation of the node orients the light accordingly. That is, an untransformed light points down the -Z axis. The light's transform is affected by the node's world scale, but all properties of the light (such as `range` and `intensity`) are unaffected. + +## Light Types + +All light types share the common set of properties listed below. + +### Light Shared Properties + +| Property | Description | Required | +|:-----------------------|:------------------------------------------| :--------------------------| +| `name` | Name of the light. | No, Default: `""` | +| `color` | RGB value for light's color in linear space. | No, Default: `[1.0, 1.0, 1.0]` | +| `intensity` | Brightness of light in. The units that this is defined in depend on the type of light. `point` and `spot` lights use luminous intensity in candela (lm/sr) while `directional` lights use illuminance in lux (lm/m2) | No, Default: `1.0` | +| `type` | Declares the type of the light. | :white_check_mark: Yes | +| `range` | Hint defining a distance cutoff at which the light's intensity may be considered to have reached zero. Supported only for `point` and `spot` lights. Must be > 0. When undefined, range is assumed to be infinite. | No | + +Light properties are unaffected by node transforms — for example, `range` and `intensity` do not change with scale. + +## Range Property + +The range property (allowed only on point and spot lights) defines a distance cutoff at which the light's intensity must be considered zero, meaning the light no longer affects the surrounding area. This can be useful to cull geometry that a light may not visibly affect, potentially having a significant positive impact on rendering performance. It is required that, when given a non-zero value, rendering engines ignore the light beyond this range. + +Within the range of the light, attenuation should follow the inverse square law as closely as possible, although some non-quadratic falloff near the edge of the range may be used to avoid a hard cutoff. When undefined, `range` is assumed to be infinite and the light should attenuate according to inverse square law. + +A recommended implementation for this attenuation with a cutoff range is as follows: + +**attenuation = max( min( 1.0 - ( current_distance / range )4, 1 ), 0 ) / current_distance2** + +### Directional + +Directional lights are light sources that act as though they are infinitely far away and emit light in the direction of the local -z axis. This light type inherits the orientation of the node that it belongs to; position and scale are ignored except for their effect on the inherited node orientation. Because it is at an infinite distance, the light is not attenuated. Its intensity is defined in lumens per metre squared, or lux (lm/m2). + +### Point + +Point lights emit light in all directions from their position in space; rotation and scale are ignored except for their effect on the inherited node position. The brightness of the light attenuates in a physically correct manner as distance increases from the light's position (i.e. brightness goes like the inverse square of the distance). Point light intensity is defined in candela, which is lumens per square radian (lm/sr). + +### Spot + +Spot lights emit light in a cone in the direction of the local -z axis. The angle and falloff of the cone is defined using two numbers, the `innerConeAngle` and `outerConeAngle`. As with point lights, the brightness also attenuates in a physically correct manner as distance increases from the light's position (i.e. brightness goes like the inverse square of the distance). Spot light intensity refers to the brightness inside the `innerConeAngle` (and at the location of the light) and is defined in candela, which is lumens per square radian (lm/sr). Engines that don't support two angles for spotlights should use `outerConeAngle` as the spotlight angle (leaving `innerConeAngle` to implicitly be `0`). + +A spot light's position and orientation are inherited from its node transform. Inherited scale does not affect cone shape, and is ignored except for its effect on position and orientation. + +When a light's `type` is `spot`, the `spot` property on the light is required. Its properties (below) are optional. + +| Property | Description | Required | +|:-----------------------|:------------------------------------------| :--------------------------| +| `innerConeAngle` | Angle, in radians, from centre of spotlight where falloff begins. Must be greater than or equal to `0` and less than `outerConeAngle`. | No, Default: `0` | +| `outerConeAngle` | Angle, in radians, from centre of spotlight where falloff ends. Must be greater than `innerConeAngle` and less than or equal to `PI / 2.0`. | No, Default: `PI / 4.0` | + +```javascript +"extensions": { + "KHR_lights_punctual" : { + "lights": [ + { + "spot": { + "innerConeAngle": 0.785398163397448, + "outerConeAngle": 1.57079632679, + }, + "color": [ + 1.0, + 1.0, + 1.0 + ], + "type": "spot" + } + ] + } +} +``` + +## Inner and Outer Cone Angles + +There should be a smooth attenuation of brightness between the `innerConeAngle` and `outerConeAngle` angles. In reality, this "angular" attenuation is very complex as it depends on the physical size of the spotlight and the shape of the sheath around the bulb. + +Conforming implementations will model this angular attenuation with a curve that follows a steeper decline in brightness before leveling off when moving from the inner to the outer angle. + +It is common to model this falloff by interpolating between the cosine of each angle. This is an efficient approximation that provides decent results. + +Reference code: + +```c++ +// These two values can be calculated on the CPU and passed into the shader +float lightAngleScale = 1.0f / max(0.001f, cos(innerConeAngle) - cos(outerConeAngle)); +float lightAngleOffset = -cos(outerConeAngle) * lightAngleScale; + +// Then, in the shader: +float cd = dot(spotlightDir, normalizedLightVector); +float angularAttenuation = saturate(cd * lightAngleScale + lightAngleOffset); +angularAttenuation *= angularAttenuation; +``` + diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/indices.bin b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/indices.bin new file mode 100644 index 0000000000..f178d8db9c Binary files /dev/null and b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/indices.bin differ diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/normals.bin b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/normals.bin new file mode 100644 index 0000000000..bdbda393f8 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/normals.bin @@ -0,0 +1,385 @@ +~;Ϡ,e};Ϡ,e}~Ϡ,e};vu6v;vu6vϠ,e}vu6v;ʋԾhk;ʋԾhkvu6vʋԾhk;\ +bWSM;\ +bWSMʋԾhk\ +bWSM;'B{AL?;'B{AL?\ +bWSM'B{AL?;B{A'L?;B{A'L?'B{AL?B{A'L?;bW\ +SM;bW\ +SMB{A'L?bW\ +SM;hԾk;hԾkbW\ +SMhԾk;uv6v;uv6vhԾkuv6v;,e}Ϡ;,e}Ϡuv6v,e}Ϡ;~;~,e}Ϡ~?Ϡ,e}?;Ϡ,e}?;~?Ϡ,e}?6vvu?6v;vu?;Ϡ,e}?6vvu?kԾh?k;Ծh?6v;vu?kԾh?SM\ +bW?SM;\ +bW?k;Ծh?SM\ +bW?L?'B{A?L?;'B{A?SM;\ +bW?L?'B{A?L?B{A'?L?;B{A'?L?;'B{A?L?B{A'?SMbW\ +?SM;bW\ +?L?;B{A'?SMbW\ +?kh>k;h>SM;bW\ +?kh>6vuv>6v;uv>k;h>6vuv>,e}Ϡ>;,e}Ϡ>6v;uv>,e}Ϡ>~;;~;;,e}Ϡ>~;,e}Ϡ>,e};Ϡ>~;;,e}Ϡ>u6vv>u6v;v>,e};Ϡ>u6vv>hk>hk;>u6v;v>hk>bWSM\ +?bWSM;\ +?hk;>bWSM\ +?B{AL?'?B{AL?;'?bWSM;\ +?B{AL?'?'L?B{A?'L?;B{A?B{AL?;'?'L?B{A?\ +SMbW?\ +SM;bW?'L?;B{A?\ +SMbW?Ծkh?Ծk;h?\ +SM;bW?Ծkh?v6vu?v6v;u?Ծk;h?v6vu?,e}?;,e}?v6v;u?,e}?~?;~?;,e}?~?;,e}?Ϡ;,e}?Ϡ~?,e}?Ϡ;u?v6v;u?v6v,e}?Ϡu?v6v;h?Ծk;h?Ծku?v6vh?Ծk;bW?\ +SM;bW?\ +SMh?ԾkbW?\ +SM;B{A?'L?;B{A?'L?bW?\ +SMB{A?'L?;'?B{AL?;'?B{AL?B{A?'L?'?B{AL?;\ +?bWSM;\ +?bWSM'?B{AL?\ +?bWSM;ʋ>hk;ʋ>hk\ +?bWSMʋ>hk;v>u6v;v>u6vʋ>hkv>u6v;Ϡ>,e};Ϡ>,e}v>u6vϠ>,e};;~;;~Ϡ>,e};~?>,e}?>;,e}?;;~?>,e}?v>6vu?v>6v;u?>;,e}?v>6vu?>kh?>k;h?v>6v;u?>kh?\ +?SMbW?\ +?SM;bW?>k;h?\ +?SMbW?'?L?B{A?'?L?;B{A?\ +?SM;bW?'?L?B{A?B{A?L?'?B{A?L?;'?'?L?;B{A?B{A?L?'?bW?SM\ +?bW?SM;\ +?B{A?L?;'?bW?SM\ +?h?k>h?k;>bW?SM;\ +?h?k>u?6vv>u?6v;v>h?k;>u?6vv>,e}?Ϡ>,e}?;Ϡ>u?6v;v>,e}?Ϡ>~?;~?;;,e}?;Ϡ>~;;,e}Ϡ>;,e}Ϡ>~;,e}Ϡ>;uv>6v;uv>6v,e}Ϡ>uv>6v;h>k;h>kuv>6vh>k;bW\ +?SM;bW\ +?SMh>kbW\ +?SM;B{A'?L?;B{A'?L?bW\ +?SMB{A'?L?;¡'1{A?L?;¡'1{A?L?B{A'?L?¡'1{A?L?;\ +bW?SM;\ +bW?SM¡'1{A?L?\ +bW?SM;Ծh?k;Ծh?k\ +bW?SMԾh?k;Uu?6v;Uu?6vԾh?kUu?6v;Ϡ,e}?;Ϡ,e}?Uu?6vϠ,e}?;~?;~?Ϡ,e}?~?;,e}?Ϡ>;,e}?Ϡ>;~?;,e}?Ϡ>6vu?U>6v;u?U>;,e}?Ϡ>6vu?U>kh?>k;h?>6v;u?U>kh?>SMbW?\ +?SM;bW?\ +?k;h?>SMbW?\ +?L?1{A?¡'?L?;1{A?¡'?SM;bW?\ +?L?1{A?¡'?L?'?B{A?L?;'?B{A?L?;1{A?¡'?L?'?B{A?SM\ +?bW?SM;\ +?bW?L?;'?B{A?SM\ +?bW?k>h?k;>h?SM;\ +?bW?k>h?6vv>u?6v;v>u?k;>h?6vv>u?Ϡ>,e}?;Ϡ>,e}?6v;v>u?Ϡ>,e}?;~?;;~?;Ϡ>,e}?;~?;Ϡ>,e}?;Ϡ>,e}?;~?Ϡ>,e}?;U>u?6v;U>u?6vϠ>,e}?U>u?6v;>h?k;>h?kU>u?6v>h?k;\ +?bW?SM;\ +?bW?SM>h?k\ +?bW?SM;¡'?1{A?L?;¡'?1{A?L?\ +?bW?SM¡'?1{A?L?;B{A?'?L?;B{A?'?L?¡'?1{A?L?B{A?'?L?;bW?\ +?SM;bW?\ +?SMB{A?'?L?bW?\ +?SM;h?>k;h?>kbW?\ +?SMh?>k;u?v>6v;u?v>6vh?>ku?v>6v;,e}?Ϡ>;,e}?Ϡ>u?v>6v,e}?Ϡ>;~?;;~?;,e}?Ϡ>~;,e};Ϡ,e}Ϡ~,e};Ϡu6v;vu6vv,e}Ϡu6v;vhk;ԾhkԾu6vvhk;ԾbWSM;\ +bWSM\ +hkԾbWSM;\ +B{AL?;'B{AL?'bWSM\ +B{AL?;''L?;B{A'L?B{AB{AL?''L?;B{A\ +SM;bW\ +SMbW'L?B{A\ +SM;bWԾk;hԾkh\ +SMbWԾk;hv6v;uv6vuԾkhv6v;u;,e},e}v6vu;,e};~~,e};~Ϡ>,e};Ϡ>,e};;~Ϡ>,e}6vv>u6v;v>u;Ϡ>,e}6vv>uk>hk;>h6v;v>uk>hSM\ +?bWSM;\ +?bWk;>hSM\ +?bWL?'?B{AL?;'?B{ASM;\ +?bWL?'?B{AL?1{A?¡'L?;1{A?¡'L?;'?B{AL?1{A?¡'SMbW?\ +SM;bW?\ +L?;1{A?¡'SMbW?\ +kh?Ծk;h?ԾSM;bW?\ +kh?Ծ6vu?U6v;u?Uk;h?Ծ6vu?U,e}?Ϡ;,e}?Ϡ6v;u?U,e}?Ϡ~?;~?;,e}?Ϡ;;~>;,e}>,e};~>;,e}v>6v;uv>6vu>,e}v>6v;u>k;h>khv>6vu>k;h\ +?SM;bW\ +?SMbW>kh\ +?SM;bW'?L?;B{A'?L?B{A\ +?SMbW'?L?;B{AB{A?L?;'B{A?L?''?L?B{AB{A?L?;'bW?SM;\ +bW?SM\ +B{A?L?'bW?SM;\ +h?k;Ծh?kԾbW?SM\ +h?k;Ծu?6v;vu?6vvh?kԾu?6v;v,e}?;Ϡ,e}?Ϡu?6vv,e}?;Ϡ~?;~?,e}?Ϡ~,e}Ϡ;,e}Ϡ;~,e}Ϡ6vuv6v;uv;,e}Ϡ6vuvkhԾk;hԾ6v;uvkhԾSMbW\ +SM;bW\ +k;hԾSMbW\ +L?B{A'L?;B{A'SM;bW\ +L?B{A'L?'B{AL?;'B{AL?;B{A'L?'B{ASM\ +bWSM;\ +bWL?;'B{ASM\ +bWkԾhk;ԾhSM;\ +bWkԾh6vvu6v;vuk;Ծh6vvuϠ,e};Ϡ,e}6v;vuϠ,e}~;~;Ϡ,e}~?;~?;;~?;~?~?;;~?;;~?~?;~;;~;~~~;~;~;~;~?;~?~?;~?;;~~;~;;~;,e}Ϡ>~;,e}Ϡ;zd;;>zd;;>,e}Ϡ;uv6v;sy >sy >uv6v;hԾk;g{оJ=g{оJ=hԾk;bW\ +SM;V?;B"=V?;B"=bW\ +SM;B{A'L?;U@$&;=U@$&;=B{A'L?;'B{AL?;$&U@;=$&U@;='B{AL?;\ +bWSM;.;VB"=.;VB"=\ +bWSM;ʋԾhk;оgJ=оgJ=ʋԾhk;vu6v;zs >zs >vu6v;Ϡ,e};;zd;>Ϡ,e};~;,e}Ϡ>;zd;>;zd;>,e}Ϡ>6vuv> sz> sz>6vuv>kh>Jg{>Jg{>kh>SMbW\ +?B"V.;?B"V.;?SMbW\ +?L?B{A'?;U@$&?;U@$&?L?B{A'?L?'B{A?;$&U@?;$&U@?L?'B{A?SM\ +bW?B".;V?B".;V?SM\ +bW?kԾh?Jоg?Jоg?kԾh?6vvu? zs? zs?6vvu?Ϡ,e}?d;;z?Ϡ,e}?~?,e}?d;;z?d;;z?,e}?v6vu?z s?z s?v6vu?Ծkh?оJg?оJg?Ծkh?\ +SMbW?.;B"V?.;B"V?\ +SMbW?'L?B{A?$&;U@?$&;U@?'L?B{A?B{AL?'?U@;$&?U@;$&?B{AL?'?bWSM\ +?VB".;?VB".;?bWSM\ +?hk>gJ>gJ>hk>u6vv>s z>s z>u6vv>,e}Ϡ>zd;;>s z>zd;;>sy >OYmr>OYmr>sy >g{оJ=#bshɾ^|>#bshɾ^|>g{оJ=V?;B"=lR l>lR l>V?;B"=U@$&;=Na="3b>Na="3b>U@$&;=$&U@;="Na=3b>"Na=3b>$&U@;=.;VB"=lR l>lR l>.;VB"=оgJ=shɾ#b^|>shɾ#b^|>оgJ=zs >OYmr>zs >;zd;> sz>OYmr>OYmr> sz>Jg{>^|#bsh>^|#bsh>Jg{>B"V.;? llR? llR?B"V.;?;U@$&?3bNa="?3bNa="?;U@$&?;$&U@?3b"Na=?3b"Na=?;$&U@?B".;V? llR? llR?B".;V?Jоg?^|shɾ#b?^|shɾ#b?Jоg? zs?r>Ym? zs?d;;z?z s?r>Ym?r>Ym?z s?оJg?shɾ^|#b?shɾ^|#b?оJg?.;B"V? llR? llR?.;B"V?$&;U@?"3bNa=?"3bNa=?$&;U@?U@;$&?Na=3b"?Na=3b"?U@;$&?VB".;?lR l?lR l?VB".;?gJ>#b^|sh>#b^|sh>gJ>s z>OYmr>#b^|sh>OYmr>#bshɾ^|>Y==>Y==>#bshɾ^|>lR l>rLƯ>rLƯ>lR l>Na="3b>8W>8W>Na="3b>"Na=3b>85>85>"Na=3b>lR l>rLƯ>rLƯ>lR l>shɾ#b^|>=Y=>shɾ#b^|>OYmr>^|#bsh>=Y=>=Y=>^|#bsh> llR?ƯrL>ƯrL> llR?3bNa="?W짾8?W짾8?3bNa="?3b"Na=?5짾8?5짾8?3b"Na=? llR?ǯrL?ǯrL? llR?^|shɾ#b?==Y?^|shɾ#b?r>Ym?shɾ^|#b?==Y?==Y?shɾ^|#b? llR?ƯrL?ƯrL? llR?"3bNa=?W짾8?W짾8?"3bNa=?Na=3b"?85짾?85짾?Na=3b"?lR l?rLƯ>rLƯ>lR l?#b^|sh>Y==>rLƯ>Y==>rLƯ>"B뾋>"B뾋>rLƯ>8W>-z/x>-z/x>8W>85>x-z/>x-z/>85>rLƯ>뾒"B>rLƯ>=Y=>ƯrL>뾒"B>뾒"B>ƯrL>W짾8?޾-z/x?޾-z/x?W짾8?5짾8?޾x-z/?޾x-z/?5짾8?ǯrL?뾋뾒"B?ǯrL?==Y?ƯrL?뾋뾒"B?뾋뾒"B?ƯrL?W짾8?x޾-z/?x޾-z/?W짾8?85짾?-z/޾-x?-z/޾-x?85짾?rLƯ>"B뾋>-z/޾-x?"B뾋>-z/x>% + +?% + +?-z/x>x-z/> + % +?x-z/>뾒"B>޾-z/x? + % +? + % +?޾-z/x?޾x-z/? + +%?޾x-z/?뾋뾒"B?x޾-z/? + +%? + +%?x޾-z/?-z/޾-x?% + +?% + +? + % +? + +%?;,e}Ϡ>;~;Ϡ>,e};;>zd;>;>zd;>Ϡ>,e};v>u6v;z>s >z>s >v>u6v;ʋ>hk;>gJ=>gJ=ʋ>hk;\ +?bWSM;.;?VB"=.;?VB"=\ +?bWSM;'?B{AL?;$&?U@;=$&?U@;='?B{AL?;B{A?'L?;U@?$&;=U@?$&;=B{A?'L?;bW?\ +SM;V?.;B"=V?.;B"=bW?\ +SM;h?Ծk;g?{оJ=g?{оJ=h?Ծk;u?v6v;s?z >s?z >u?v6v;,e}?Ϡ;z?d;d;>,e}?Ϡ;~?;,e}?Ϡ>z?d;d;>z?d;d;>,e}?Ϡ>u?6vv>s? z>s? z>u?6vv>h?k>g?J>g?J>h?k>bW?SM\ +?V?B".;?V?B".;?bW?SM\ +?B{A?L?'?U@?;$&?U@?;$&?B{A?L?'?'?L?B{A?$&?;U@?$&?;U@?'?L?B{A?\ +?SMbW?.;?B"V?.;?B"V?\ +?SMbW?>kh?>Jg?>Jg?>kh?v>6vu?z> s?z> s?v>6vu?>,e}?d;>;z?>,e}?;~?;Ϡ,e}?d;>;z?d;>;z?;Ϡ,e}?6v;vu? >zs? >zs?6v;vu?k;Ծh?J=оg?J=оg?k;Ծh?SM;\ +bW?B"=.;V?B"=.;V?SM;\ +bW?L?;'B{A?;=$&U@?;=$&U@?L?;'B{A?L?;B{A'?;=U@$&?;=U@$&?L?;B{A'?SM;bW\ +?B"=V.;?B"=V.;?SM;bW\ +?k;h>J=g{>J=g{>k;h>6v;uv> >sz> >sz>6v;uv>;,e}Ϡ>;>zd;> >sz>;>zd;>z>s >>OYmr>>OYmr>z>s >>gJ=sh>#b^|>sh>#b^|>>gJ=.;?VB"=?lR l>?lR l>.;?VB"=$&?U@;="?Na=3b>"?Na=3b>$&?U@;=U@?$&;=Na=?"3b>Na=?"3b>U@?$&;=V?.;B"=lR? l>lR? l>V?.;B"=g?{оJ=#b?shɾ^|>#b?shɾ^|>g?{оJ=s?z >OYm?r>s?z >z?d;d;>s? z>OYm?r>OYm?r>s? z>g?J>#b?^|sh>#b?^|sh>g?J>V?B".;?lR? l?lR? l?V?B".;?U@?;$&?Na=?3b"?Na=?3b"?U@?;$&?$&?;U@?"?3bNa=?"?3bNa=?$&?;U@?.;?B"V?? llR?? llR?.;?B"V?>Jg?sh>^|#b?sh>^|#b?>Jg?z> s?r>OYm?z> s?d;>;z? >zs?r>OYm?r>OYm? >zs?J=оg?^|>shɾ#b?^|>shɾ#b?J=оg?B"=.;V? l>lR? l>lR?B"=.;V?;=$&U@?3b>"Na=?3b>"Na=?;=$&U@?;=U@$&?3b>Na="?3b>Na="?;=U@$&?B"=V.;? l>lR? l>lR?B"=V.;?J=g{>^|>#bsh>^|>#bsh>J=g{> >sz>>OYmr>^|>#bsh>>OYmr>sh>#b^|>=>Y=>=>Y=>sh>#b^|>?lR l>>rLƯ>>rLƯ>?lR l>"?Na=3b>?85>?85>"?Na=3b>Na=?"3b>8?W>8?W>Na=?"3b>lR? l>rL?ǯ>rL?ǯ>lR? l>#b?shɾ^|>Y?==>#b?shɾ^|>OYm?r>#b?^|sh>Y?==>Y?==>#b?^|sh>lR? l?rL?ǯ>rL?ǯ>lR? l?Na=?3b"?8?5짾?8?5짾?Na=?3b"?"?3bNa=??W짾8??W짾8?"?3bNa=?? llR?>ǯrL?>ǯrL?? llR?sh>^|#b?=>=Y?sh>^|#b?r>OYm?^|>shɾ#b?=>=Y?=>=Y?^|>shɾ#b? l>lR?ǯ>rL?ǯ>rL? l>lR?3b>"Na=?5>8?5>8?3b>"Na=?3b>Na="?W>8?W>8?3b>Na="? l>lR?ǯ>rL>ǯ>rL> l>lR?^|>#bsh>=>Y=>ǯ>rL>=>Y=>>rLƯ>>"B>>"B>>rLƯ>?85>-x?-z/>-x?-z/>?85>8?W>-z/?x>-z/?x>8?W>rL?ǯ>"B?뾋>rL?ǯ>Y?==>rL?ǯ>"B?뾋>"B?뾋>rL?ǯ>8?5짾?-z/?޾-x?-z/?޾-x?8?5짾??W짾8?x?޾-z/?x?޾-z/??W짾8?>ǯrL?>뾒"B?>ǯrL?=>=Y?ǯ>rL?>뾒"B?>뾒"B?ǯ>rL?5>8?>-x-z/?>-x-z/?5>8?W>8?>-z/x?>-z/x?W>8?ǯ>rL>>"B>>-z/x?>"B>-x?-z/> +?%- +? +?%- +?-x?-z/>-z/?x>%?- + +?-z/?x>"B?뾋>-z/?޾-x?%?- + +?%?- + +?-z/?޾-x?x?޾-z/?- +? +%?x?޾-z/?>뾒"B?>-x-z/?- +? +%?- +? +%?>-x-z/?>-z/x? +?%- +? +?%- +?%?- + +?- +? +%?,e}?Ϡ>~?;Ϡ,e}?;d;z?d;>d;z?d;>Ϡ,e}?;Uu?6v;zs? >zs? >Uu?6v;Ծh?k;{оg?J={оg?J=Ծh?k;\ +bW?SM;.;V?"=.;V?"=\ +bW?SM;¡'1{A?L?;$&D@?;=$&D@?;=¡'1{A?L?;B{A'?L?;U@$&?;=U@$&?;=B{A'?L?;bW\ +?SM;V.;?B"=V.;?B"=bW\ +?SM;h>k;g{>J=g{>J=h>k;uv>6v;sz> >sz> >uv>6v;,e}Ϡ>;zd;>;>,e}Ϡ>;~;;,e};Ϡ>zd;>;>zd;>;>,e};Ϡ>u6v;v>s >z>s >z>u6v;v>hk;>gJ=>gJ=>hk;>bWSM;\ +?VB"=.;?VB"=.;?bWSM;\ +?B{AL?;'?U@;=$&?U@;=$&?B{AL?;'?'L?;B{A?$&;=U@?$&;=U@?'L?;B{A?\ +SM;bW??;B"=V??;B"=V?\ +SM;bW?Ծk;h?оJ=g?оJ=g?Ծk;h?v6v;u?y >s?y >s?v6v;u?;,e}?d;;>z?;,e}?;~?Ϡ>,e}?d;;>z?d;;>z?Ϡ>,e}?6vv>u? z>s? z>s?6vv>u?k>h?J{>g?J{>g?k>h?SM\ +?bW?!.;?V?!.;?V?SM\ +?bW?L?'?B{A?;$&?U@?;$&?U@?L?'?B{A?L?1{A?¡'?;U@?$&?;U@?$&?L?1{A?¡'?SMbW?\ +?B"V?.;?B"V?.;?SMbW?\ +?kh?>g?{>g?{>kh?>6vu?U> s?z> s?z>6vu?U>,e}?Ϡ>d;z?d;> s?z>d;z?d;>zs? >>Ym?r>>Ym?r>zs? >{оg?J=shɾ#b?^|>shɾ#b?^|>{оg?J=.;V?"=lR? l>lR? l>.;V?"=$&D@?;="Na=?3b>"Na=?3b>$&D@?;=U@$&?;=Na="?3b>Na="?3b>U@$&?;=V.;?B"=lR? l>lR? l>V.;?B"=g{>J=#bsh>^|>#bsh>^|>g{>J=sz> >OYmr>>sz> >zd;>;>s >z>OYmr>>OYmr>>s >z>gJ=>#b^|>sh>#b^|>sh>gJ=>VB"=.;?lR l>?lR l>?VB"=.;?U@;=$&?Na=3b>"?Na=3b>"?U@;=$&?$&;=U@?"3b>Na=?"3b>Na=?$&;=U@??;B"=V? l>lR? l>lR??;B"=V?оJ=g?shɾ^|>#b?shɾ^|>#b?оJ=g?y >s?r>OYm?y >s?d;;>z? z>s?r>OYm?r>OYm? z>s?J{>g?^|sh>#b?^|sh>#b?J{>g?!.;?V? l?lR? l?lR?!.;?V?;$&?U@?3b"?Na=?3b"?Na=?;$&?U@?;U@?$&?3bNa=?"?3bNa=?"?;U@?$&?B"V?.;? llR?? llR??B"V?.;?g?{>^|#b?sh>^|#b?sh>g?{> s?z>>Ym?r>^|#b?sh>>Ym?r>shɾ#b?^|>=Y?=>=Y?=>shɾ#b?^|>lR? l>rL?Ư>rL?Ư>lR? l>"Na=?3b>8?5>8?5>"Na=?3b>Na="?3b>8?W>8?W>Na="?3b>lR? l>rL>ǯ>rL>ǯ>lR? l>#bsh>^|>Y=>=>#bsh>^|>OYmr>>#b^|>sh>Y=>=>Y=>=>#b^|>sh>lR l>?rLǯ>>rLǯ>>lR l>?Na=3b>"?85>?85>?Na=3b>"?"3b>Na=?5>8?5>8?"3b>Na=? l>lR?ǯ>rL?ǯ>rL? l>lR?shɾ^|>#b?==>Y?shɾ^|>#b?r>OYm?^|sh>#b?==>Y?==>Y?^|sh>#b? l?lR?ǯ>rL?ǯ>rL? l?lR?3b"?Na=?5짾?8?5짾?8?3b"?Na=?3bNa=?"?W짾8??W짾8??3bNa=?"? llR??ǯrL?>ǯrL?> llR??^|#b?sh>=Y?=>ǯrL?>=Y?=>rL?Ư>뾒"B?>뾒"B?>rL?Ư>8?5>-x-z/?>-x-z/?>8?5>8?W>-z/x?>-z/x?>8?W>rL>ǯ>"B>>rL>ǯ>Y=>=>rLǯ>>"B>>"B>>rLǯ>>85>?-z/>x?-z/>x?85>?5>8?x>-z/?x>-z/?5>8?ǯ>rL?뾋>"B?ǯ>rL?==>Y?ǯ>rL?뾋>"B?뾋>"B?ǯ>rL?5짾?8?޾-x?-z/?޾-x?-z/?5짾?8?W짾8??޾-z/?x?޾-z/?x?W짾8??ǯrL?>뾒"B?>޾-z/?x?뾒"B?>-x-z/?> +%?- +? +%?- +?-x-z/?>-z/x?>%- +? +?-z/x?>"B>>-z/>x?%- +? +?%- +? +?-z/>x?x>-z/?- +- +?%?x>-z/?뾋>"B?޾-x?-z/?- +- +?%?- +- +?%?޾-x?-z/?޾-z/?x? +%?- +? +%?- +?%- +? +?- +- +?%?,e}?;Ϡ>~?;;,e}?Ϡ>;z?d;>;>z?d;>;>,e}?Ϡ>;u?v>6v;s?y> >s?y> >u?v>6v;h?>k;g?{>J=g?{>J=h?>k;bW?\ +?SM;V?.;?B"=V?.;?B"=bW?\ +?SM;B{A?'?L?;U@?$&?;=U@?$&?;=B{A?'?L?;¡'?1{A?L?;$&?D@?;=$&?D@?;=¡'?1{A?L?;\ +?bW?SM;.;?V?"=.;?V?"=\ +?bW?SM;>h?k;{>g?={>g?=>h?k;U>u?6v;z>s? >z>s? >U>u?6v;Ϡ>,e}?;d;>z?d;>Ϡ>,e}?;;~?;;,e}?Ϡ>d;>z?d;>d;>z?d;>;,e}?Ϡ>6v;u?U> >s?z> >s?z>6v;u?U>k;h?>=g?{>=g?{>k;h?>SM;bW?\ +?B"=V?.;?B"=V?.;?SM;bW?\ +?L?;1{A?¡'?;=D@?$&?;=D@?$&?L?;1{A?¡'?L?;'?B{A?;=$&?U@?;=$&?U@?L?;'?B{A?SM;\ +?bW?!=.;?V?!=.;?V?SM;\ +?bW?k;>h?J=>g?J=>g?k;>h?6v;v>u? >z>s? >z>s?6v;v>u?;Ϡ>,e}?d;>;>z?;Ϡ>,e}?;;~?>;,e}?d;>;>z?d;>;>z?>;,e}?v>6v;u?z> >s?z> >s?v>6v;u?>k;h?>J=g?>J=g?>k;h?\ +?SM;bW?.;?B"=V?.;?B"=V?\ +?SM;bW?'?L?;B{A?$&?;=U@?$&?;=U@?'?L?;B{A?B{A?L?;'?U@?;=$&?U@?;=$&?B{A?L?;'?bW?SM;\ +?V?B"=.;?V?B"=.;?bW?SM;\ +?h?k;>g?J=>g?J=>h?k;>u?6v;v>s? >z>s? >z>u?6v;v>,e}?;Ϡ>z?d;>;>s? >z>z?d;>;>s?y> >OYm?r>>OYm?r>>s?y> >g?{>J=#b?sh>^|>#b?sh>^|>g?{>J=V?.;?B"=lR?? l>lR?? l>V?.;?B"=U@?$&?;=Na=?"?3b>Na=?"?3b>U@?$&?;=$&?D@?;="?Na=?3b>"?Na=?3b>$&?D@?;=.;?V?"=?lR? l>?lR? l>.;?V?"={>g?=sh>#b?^|>sh>#b?^|>{>g?=z>s? >>OYm?r>z>s? >d;>z?d;> >s?z>>OYm?r>>OYm?r> >s?z>=g?{>^|>#b?sh>^|>#b?sh>=g?{>B"=V?.;? l>lR?? l>lR??B"=V?.;?;=D@?$&?3b>Na=?"?3b>Na=?"?;=D@?$&?;=$&?U@?3b>"?Na=?3b>"?Na=?;=$&?U@?!=.;?V? l>?lR? l>?lR?!=.;?V?J=>g?^|>sh>#b?^|>sh>#b?J=>g? >z>s?r>>OYm? >z>s?d;>;>z?z> >s?r>>OYm?r>>OYm?z> >s?>J=g?sh>^|>#b?sh>^|>#b?>J=g?.;?B"=V?? l>lR?? l>lR?.;?B"=V?$&?;=U@?"?3b>Na=?"?3b>Na=?$&?;=U@?U@?;=$&?Na=?3b>"?Na=?3b>"?U@?;=$&?V?B"=.;?lR? l>?lR? l>?V?B"=.;?g?J=>#b?^|>sh>#b?^|>sh>g?J=>s? >z>OYm?r>>#b?^|>sh>OYm?r>>#b?sh>^|>Y?=>=>Y?=>=>#b?sh>^|>lR?? l>rL?>ǯ>rL?>ǯ>lR?? l>Na=?"?3b>8??W>8??W>Na=?"?3b>"?Na=?3b>?8?5>?8?5>"?Na=?3b>?lR? l>>rL?Ư>>rL?Ư>?lR? l>sh>#b?^|>=>Y?=>sh>#b?^|>>OYm?r>^|>#b?sh>=>Y?=>=>Y?=>^|>#b?sh> l>lR??Ư>rL?>Ư>rL?> l>lR??3b>Na=?"?W>8??W>8??3b>Na=?"?3b>"?Na=?5>?8?5>?8?3b>"?Na=? l>?lR?Ư>>rL?Ư>>rL? l>?lR?^|>sh>#b?=>=>Y?^|>sh>#b?r>>OYm?sh>^|>#b?=>=>Y?=>=>Y?sh>^|>#b?? l>lR?>Ư>*rL?>Ư>*rL?? l>lR?"?3b>Na=??5>8??5>8?"?3b>Na=?Na=?3b>"?8?5>?8?5>?Na=?3b>"?lR? l>?rL?Ư>>rL?Ư>>lR? l>?#b?^|>sh>Y?=>=>rL?Ư>>Y?=>=>rL?>ǯ>"B?>>"B?>>rL?>ǯ>8??W>-z/?x?>-z/?x?>8??W>?8?5>-x?-z/?>-x?-z/?>?8?5>>rL?Ư>>"B?>>rL?Ư>=>Y?=>Ư>rL?>>"B?>>"B?>Ư>rL?>W>8??>-z/?x?>-z/?x?W>8??5>?8?>x?-z/?>x?-z/?5>?8?Ư>>rL?>>"B?Ư>>rL?=>=>Y?>Ư>*rL?>>"B?>>"B?>Ư>*rL??5>8?x?>-z/?x?>-z/??5>8?8?5>?-z/?>x?-z/?>x?8?5>?rL?Ư>>"B?>>-z/?>x?"B?>>-z/?x?>%? +? +?%? +? +?-z/?x?>-x?-z/?>- +?%? +?-x?-z/?>>"B?>>-z/?x?- +?%? +?- +?%? +?>-z/?x?>x?-z/?- +? +?%?>x?-z/?>>"B?x?>-z/?- +? +?%?- +? +?%?x?>-z/?-z/?>x?%? +? +?%? +? +?- +?%? +?- +? +?%?Ϡ>,e};~;,e}d;;>zd;;>z;,e}v6v;uy >sy >sv6v;uԾk;hоJ=gоJ=gԾk;h\ +SM;bW.;B"=V.;B"=V\ +SM;bW'L?;B{A$&;=U@$&;=U@'L?;B{AB{AL?;'U@;=$&U@;=$&B{AL?;'bWSM;\ +VB"=.;VB"=.;bWSM;\ +hk;ԾgJ=оgJ=оhk;Ծu6v;vs >zs >zu6v;v,e};Ϡzd;>;,e};Ϡ~;,e}Ϡ>zd;>;zd;>;,e}Ϡ>uv>6vsy> sy> uv>6vh>kg{>Jg{>Jh>kbW\ +?SMV.;?B"V.;?B"bW\ +?SMB{A'?L?U@$&?;U@$&?;B{A'?L?¡'1{A?L?$&D@?;$&D@?;¡'1{A?L?\ +bW?SM.;V?".;V?"\ +bW?SMԾh?k{оg?{оg?Ծh?kUu?6vzs? zs? Uu?6vϠ,e}?d;z?d;Ϡ,e}?~?,e}?Ϡd;z?d;d;z?d;,e}?Ϡ6vu?U s?z s?z6vu?Ukh?Ծg?{оg?{оkh?ԾSMbW?\ +B"V?.;B"V?.;SMbW?\ +L?1{A?¡';D@?$&;D@?$&L?1{A?¡'L?'?B{A;$&?U@;$&?U@L?'?B{ASM\ +?bW!.;?V!.;?VSM\ +?bWk>hJ>gJ>gk>h6vv>u z>s z>s6vv>uϠ>,e}d;;>z z>sd;;>zy >sr>OYmr>OYmy >sоJ=gshɾ^|>#bshɾ^|>#bоJ=g.;B"=V l>lR l>lR.;B"=V$&;=U@"3b>Na="3b>Na=$&;=U@U@;=$&Na=3b>"Na=3b>"U@;=$&VB"=.;lR l>lR l>VB"=.;gJ=о#b^|>shɾ#b^|>shɾgJ=оs >zOYmr>s >zzd;>;sy> OYmr>OYmr>sy> g{>J#bsh>^|#bsh>^|g{>JV.;?B"lR? llR? lV.;?B"U@$&?;Na="?3bNa="?3bU@$&?;$&D@?;彷"Na=?3b"Na=?3b$&D@?;.;V?"lR? llR? l.;V?"{оg?shɾ#b?^|shɾ#b?^|{оg?zs? OYm?rzs? d;z?d; s?zOYm?rOYm?r s?zg?{о^|#b?shɾ^|#b?shɾg?{оB"V?.; llR? llR?B"V?.;;D@?$&3bNa=?"3bNa=?";D@?$&;$&?U@3b"?Na=3b"?Na=;$&?U@!.;?V l?lR l?lR!.;?VJ>g^|sh>#b^|sh>#bJ>g z>sr>OYm^|sh>#br>OYmshɾ^|>#b==>Y==>Yshɾ^|>#b l>lRƯ>rLƯ>rL l>lR"3b>Na=W>8W>8"3b>Na=Na=3b>"85>85>Na=3b>"lR l>*rLƯ>*rLƯ>lR l>#b^|>shɾY=>=#b^|>shɾOYmr>#bsh>^|Y=>=Y=>=#bsh>^|lR? lrL>ǯrL>ǯlR? lNa="?3b8?W짾8?W짾Na="?3b"Na=?3b8?5짾8?5짾"Na=?3blR? lrL?ƯrL?ƯlR? lshɾ#b?^|=Y?=shɾ#b?^|OYm?r^|#b?shɾ=Y?==Y?=^|#b?shɾ llR?ƯrL?ƯrL? llR?3bNa=?"W짾8?W짾8?3bNa=?"3b"?Na=5짾?85짾?83b"?Na= l?lRƯ>*rLƯ>*rL l?lR^|sh>#b==>YƯ>*rL==>YƯ>rL뾋>"B뾋>"BƯ>rLW>8x>-z/x>-z/W>885>-z/>x-z/>x85>*rLƯ>"B>*rLƯ>Y=>=rL>ǯ"B>뾒"B>rL>ǯ8?W짾-z/x?޾-z/x?޾8?W짾8?5짾-x-z/?޾-x-z/?޾8?5짾rL?Ư뾒"B?뾹rL?Ư=Y?=ƯrL?뾒"B?뾋뾒"B?ƯrL?W짾8?޾-z/?x޾-z/?xW짾8?5짾?8޾x?-z/޾x?-z/5짾?8Ư>*rL뾋>"B޾x?-z/뾋>"Bx>-z/- + +?%- + +?%x>-z/-z/>x%- +?- +-z/>x"B>-z/x?޾%- +?- +%- +?- +-z/x?޾-x-z/?޾- +%? +-x-z/?޾뾒"B?޾-z/?x- +%? +- +%? +޾-z/?x޾x?-z/- + +?%- + +?%%- +?- +- +%? +,e}?Ϡ>~?;,e}?;Ϡz?d;>;z?d;>;,e}?;Ϡu?6v;vs? >zs? >zu?6v;vh?k;Ծg?J=оg?J=оh?k;ԾbW?SM;\ +V?B"=.;V?B"=.;bW?SM;\ +B{A?L?;'U@?;=$&U@?;=$&B{A?L?;''?L?;B{A$&?;=U@$&?;=U@'?L?;B{A\ +?SM;bW?;?B"=V?;?B"=V\ +?SM;bW>k;h>J=g>J=g>k;hv>6v;uy> >sy> >sv>6v;u>;,e}d;>;>z>;,e};;~;Ϡ>,e}d;>;>zd;>;>z;Ϡ>,e}6v;v>u >z>s >z>s6v;v>uk;>hJ={>gJ={>gk;>hSM;\ +?bW!=.;?V!=.;?VSM;\ +?bWL?;'?B{A;=$&?U@;=$&?U@L?;'?B{AL?;1{A?¡';=U@?$&;=U@?$&L?;1{A?¡'SM;bW?\ +B"=V?.;B"=V?.;SM;bW?\ +k;h?Ծ=g?{о=g?{оk;h?Ծ6v;u?U >s?z >s?z6v;u?U;,e}?Ϡd;>z?d;;,e}?Ϡ;~?Ϡ>,e}?d;>z?d;d;>z?d;Ϡ>,e}?U>u?6vz>s? z>s? U>u?6v>h?k{>g?J{>g?J>h?k\ +?bW?SM.;?V?".;?V?"\ +?bW?SM¡'?1{A?L?$&?D@?;$&?D@?;¡'?1{A?L?B{A?'?L?U@?$&?;U@?$&?;B{A?'?L?bW?\ +?SMV?.;?B"V?.;?B"bW?\ +?SMh?>kg?{>Jg?{>Jh?>ku?v>6vs?z> s?z> u?v>6v,e}?Ϡ>z?d;>;s?z> z?d;>;s? >zOYm?r>OYm?r>s? >zg?J=о#b?^|>shɾ#b?^|>shɾg?J=оV?B"=.;lR? l>lR? l>V?B"=.;U@?;=$&Na=?3b>"Na=?3b>"U@?;=$&$&?;=U@"?3b>Na="?3b>Na=$&?;=U@?;?B"=V? l>lR? l>lR?;?B"=V>J=gsh>^|>#bsh>^|>#b>J=gy> >sr>>OYmy> >sd;>;>z >z>sr>>OYmr>>OYm >z>sJ={>g^|>sh>#b^|>sh>#bJ={>g!=.;?V l>?lR l>?lR!=.;?V;=$&?U@3b>"?Na=3b>"?Na=;=$&?U@;=U@?$&3b>Na=?"3b>Na=?";=U@?$&B"=V?.; l>lR? l>lR?B"=V?.;=g?{о^|>#b?shɾ^|>#b?shɾ=g?{о >s?z>OYm?r >s?zd;>z?d;z>s? >OYm?r>OYm?rz>s? {>g?Jsh>#b?^|sh>#b?^|{>g?J.;?V?"?lR? l?lR? l.;?V?"$&?D@?;彷"?Na=?3b"?Na=?3b$&?D@?;U@?$&?;Na=?"?3bNa=?"?3bU@?$&?;彖V?.;?B"lR?? llR?? lV?.;?B"g?{>J#b?sh>^|#b?sh>^|g?{>Js?z> OYm?r>#b?sh>^|OYm?r>#b?^|>shɾY?=>=Y?=>=#b?^|>shɾlR? l>rL?Ư>rL?Ư>lR? l>Na=?3b>"8?5>8?5>Na=?3b>""?3b>Na=?5>8?5>8"?3b>Na=? l>lR>ǯ>rL>ǯ>rL? l>lRsh>^|>#b=>=>Ysh>^|>#br>>OYm^|>sh>#b=>=>Y=>=>Y^|>sh>#b l>?lRǯ>>rLǯ>>rL l>?lR3b>"?Na=5>?85>?83b>"?Na=3b>Na=?"W>8?W>8?3b>Na=?" l>lR?ǯ>rL?ǯ>rL? l>lR?^|>#b?shɾ=>Y?=^|>#b?shɾ>OYm?rsh>#b?^|=>Y?==>Y?=sh>#b?^|?lR? l>rL?ǯ>rL?ǯ?lR? l"?Na=?3b?8?5짾?8?5짾"?Na=?3bNa=?"?3b8??W짾8??W짾Na=?"?3blR?? lrL?>ǯrL?>ǯlR?? l#b?sh>^|Y?=>=rL?>ǯY?=>=rL?Ư>"B?>뾒"B?>rL?Ư>8?5>-z/?>-x-z/?>-x8?5>?5>8x?>-z/x?>-z/?5>8>ǯ>rL>>"B>ǯ>rL=>=>Yǯ>>rL>>"B>>"Bǯ>>rL5>?8>-x?-z/>-x?-z/5>?8W>8?>-z/?x>-z/?xW>8?ǯ>rL?>"B?ǯ>rL?=>Y?=>rL?ǯ>"B?뾋>"B?뾹>rL?ǯ?8?5짾-x?-z/?޾-x?-z/?޾?8?5짾8??W짾-z/?x?޾-z/?x?޾8??W짾rL?>ǯ"B?>-z/?x?޾"B?>-z/?>-x%?- +?- +%?- +?- +-z/?>-xx?>-z/- +?- +?%x?>-z/>>"B>-x?-z/- +?- +?%- +?- +?%>-x?-z/>-z/?x +?%?- +>-z/?x>"B?-x?-z/?޾ +?%?- + +?%?- +-x?-z/?޾-z/?x?޾%?- +?- +%?- +?- +- +?- +?% +?%?- +,e}Ϡ~Ϡ,e};zd;;zd;Ϡ,e}vu6vzs zs vu6vʋԾhkоgJоgJʋԾhk\ +bWSM.;VB".;VB"\ +bWSM'B{AL?$&U@;$&U@;彲'B{AL?B{A'L?U@$&;U@$&;B{A'L?bW\ +SMV.;B"V.;B"bW\ +SMhԾkg{оJg{оJhԾkuv6vsz sz uv6v,e}Ϡzd;d;,e}Ϡ~,e}Ϡzd;d;zd;d;,e}Ϡu6vvs zs zu6vvhkԾgJоgJоhkԾbWSM\ +VB".;VB".;bWSM\ +B{AL?'U@;$&U@;$&B{AL?''L?B{A$&;U@$&;U@'L?B{A\ +SMbW.;B"V.;B"V\ +SMbWԾkhоJgоJgԾkhv6vuz sz sv6vu,e}d;;z,e}~Ϡ,e}d;;zd;;zϠ,e}6vvu zs zs6vvukԾhJоgJоgkԾhSM\ +bWB".;VB".;VSM\ +bWL?'B{A;$&U@;$&U@L?'B{AL?B{A';U@$&;U@$&L?B{A'SMbW\ +B"V.;B"V.;SMbW\ +khԾJg{оJg{оkhԾ6vuv sz sz6vuv,e}Ϡ;zd; sz;zd;zs OYmrOYmrzs оgJshɾ#b^|shɾ#b^|оgJ.;VB"lR llR l.;VB"$&U@;彷"Na=3b"Na=3b$&U@;U@$&;Na="3bNa="3bU@$&;彖V.;B"lR llR lV.;B"g{оJ#bshɾ^|#bshɾ^|g{оJsz OYmrsz zd;d;s zOYmrOYmrs zgJо#b^|shɾ#b^|shɾgJоVB".;lR llR lVB".;U@;$&Na=3b"Na=3b"U@;$&$&;U@"3bNa="3bNa=$&;U@.;B"V llR llR.;B"VоJgshɾ^|#bshɾ^|#bоJgz srOYmz sd;;z zsrOYmrOYm zsJоg^|shɾ#b^|shɾ#bJоgB".;V llR llRB".;V;$&U@3b"Na=3b"Na=;$&U@;U@$&3bNa="3bNa=";U@$&B"V.; llR llRB"V.;Jg{о^|#bshɾ^|#bshɾJg{о szOYmr^|#bshɾOYmrshɾ#b^|=Y==Y=shɾ#b^|lR lrLƯrLƯlR l"Na=3b85짾85짾"Na=3bNa="3b8W짾8W짾Na="3blR lrLǯrLǯlR l#bshɾ^|Y==#bshɾ^|OYmr#b^|shɾY==Y==#b^|shɾlR lrLǯrLǯlR lNa=3b"85짾85짾Na=3b""3bNa=W짾8W짾8"3bNa= llRǯrLǯrL llRshɾ^|#b==Yshɾ^|#brOYm^|shɾ#b==Y==Y^|shɾ#b llRǯrLǯrL llR3b"Na=5짾85짾83b"Na=3bNa="W짾8W짾83bNa=" llRǯrLǯrL llR^|#bshɾ=Y=ǯrL=Y=rLƯ뾒"B뾋뾒"B뾹rLƯ85짾-x-z/޾-x-z/޾85짾8W짾-z/x޾-z/x޾8W짾rLǯ"B뾋rLǯY==rLǯ"B뾋뾒"B뾋rLǯ85짾-z/޾-x-z/޾-x85짾W짾8x޾-z/x޾-z/W짾8ǯrL뾋뾒"BǯrL==YǯrL뾋뾒"B뾋뾒"BǯrL5짾8޾-x-z/޾-x-z/5짾8W짾8޾-z/x޾-z/xW짾8ǯrL뾒"B޾-z/x뾒"B-x-z/޾ +%- + +%- +-x-z/޾-z/x޾%- + +-z/x޾"B뾋-z/޾-x%- + +%- + +-z/޾-xx޾-z/- + +%x޾-z/뾋뾒"B޾-x-z/- + +%- + +%޾-x-z/޾-z/x +%- + +%- +%- + +- + +%,e}?Ϡ~?,e}?Ϡz?d;;z?d;;,e}?Ϡu?v6vs?y s?y u?v6vh?Ծkg?{оJg?{оJh?ԾkbW?\ +SMV??;B"V??;B"bW?\ +SMB{A?'L?U@?$&;U@?$&;B{A?'L?'?B{AL?$&?U@;$&?U@;彲'?B{AL?\ +?bWSM.;?VB".;?VB"\ +?bWSMʋ>hk>gJ>gJʋ>hkv>u6vz>s z>s v>u6vϠ>,e};>zd;Ϡ>,e};~;,e}Ϡ;>zd;;>zd;;,e}Ϡ6v;uv >sz >sz6v;uvk;hԾJ=g{оJ=g{оk;hԾSM;bW\ +B"=V.;B"=V.;SM;bW\ +L?;B{A';=U@$&;=U@$&L?;B{A'L?;'B{A;=$&U@;=$&U@L?;'B{ASM;\ +bWB"=.;VB"=.;VSM;\ +bWk;ԾhJ=оgJ=оgk;Ծh6v;vu >zs >zs6v;vu;Ϡ,e}d;>;z;Ϡ,e};~>,e}d;>;zd;>;z>,e}v>6vuz> sz> sv>6vu>kh>Jg>Jg>kh\ +?SMbW.;?B"V.;?B"V\ +?SMbW'?L?B{A$&?;U@$&?;U@'?L?B{AB{A?L?'U@?;$&U@?;$&B{A?L?'bW?SM\ +V?B".;V?B".;bW?SM\ +h?kԾg?Jоg?Jоh?kԾu?6vvs? zs? zu?6vv,e}?Ϡz?d;;s? zz?d;;s?y OYm?rOYm?rs?y g?{оJ#b?shɾ^|#b?shɾ^|g?{оJV??;B"lR? llR? lV??;B"U@?$&;Na=?"3bNa=?"3bU@?$&;$&?U@;彷"?Na=3b"?Na=3b$&?U@;.;?VB"?lR l?lR l.;?VB">gJsh>#b^|sh>#b^|>gJz>s >OYmrz>s ;>zd; >sz>OYmr>OYmr >szJ=g{о^|>#bshɾ^|>#bshɾJ=g{оB"=V.; l>lR l>lRB"=V.;;=U@$&3b>Na="3b>Na=";=U@$&;=$&U@3b>"Na=3b>"Na=;=$&U@B"=.;V l>lR l>lRB"=.;VJ=оg^|>shɾ#b^|>shɾ#bJ=оg >zsr>>Ym >zsd;>;zz> sr>>Ymr>>Ymz> s>Jgsh>^|#bsh>^|#b>Jg.;?B"V? llR? llR.;?B"V$&?;U@"?3bNa="?3bNa=$&?;U@U@?;$&Na=?3b"Na=?3b"U@?;$&V?B".;lR? llR? lV?B".;g?Jо#b?^|shɾ#b?^|shɾg?Jоs? zOYm?r#b?^|shɾOYm?r#b?shɾ^|Y?==Y?==#b?shɾ^|lR? lrL?ƯrL?ƯlR? lNa=?"3b8?W짾8?W짾Na=?"3b"?Na=3b?85짾?85짾"?Na=3b?lR l>rLƯ>rLƯ?lR lsh>#b^|=>Y=sh>#b^|>OYmr^|>#bshɾ=>Y==>Y=^|>#bshɾ l>lRƯ>rLƯ>rL l>lR3b>Na="W>8W>83b>Na="3b>"Na=5>85>83b>"Na= l>lRǯ>rLǯ>rL l>lR^|>shɾ#b=>=Y^|>shɾ#br>>Ymsh>^|#b=>=Y=>=Ysh>^|#b? llR>ƯrL>ƯrL? llR"?3bNa=?W짾8?W짾8"?3bNa=Na=?3b"8?5짾8?5짾Na=?3b"lR? lrL?ƯrL?ƯlR? l#b?^|shɾY?==rL?ƯY?==rL?Ư"B?뾋뾒"B?뾋rL?Ư8?W짾-z/?x޾-z/?x޾8?W짾?85짾x?-z/޾x?-z/޾?85짾>rLƯ>"B뾹>rLƯ=>Y=Ư>rL>"B뾋>"BƯ>rLW>8>-z/x>-z/xW>85>8>x-z/>x-z/5>8ǯ>rL>뾒"Bǯ>rL=>=Y>ƯrL>뾒"B>뾒"B>ƯrL?W짾8x?޾-z/x?޾-z/?W짾88?5짾-z/?޾-x-z/?޾-x8?5짾rL?Ư"B?뾋-z/?޾-x"B?뾋-z/?x޾%? + +%? + +-z/?x޾x?-z/޾ +? % +x?-z/޾>"B>-z/x +? % + +? % +>-z/x>x-z/ +? +%>x-z/>뾒"Bx?޾-z/ +? +% +? +%x?޾-z/-z/?޾-x%? + +%? + + +? % + +? +% \ No newline at end of file diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/positions.bin b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/positions.bin new file mode 100644 index 0000000000..96c2a4e1b9 Binary files /dev/null and b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/MODEL_ROUNDED_CUBE_PART_1/positions.bin differ diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/lights.gltf b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/lights.gltf new file mode 100644 index 0000000000..1fb7ee2ba8 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/examples/lights.gltf @@ -0,0 +1,226 @@ +{ + "extensionsUsed": [ + "KHR_lights_punctual" + ], + "extensions": { + "KHR_lights_punctual": { + "lights": [ + { + "color": [ + 1.0, + 0.9, + 0.7 + ], + "name": "Directional", + "intensity": 3.0, + "type": "directional" + }, + { + "color": [ + 1.0, + 0.0, + 0.0 + ], + "name": "Point", + "intensity": 20.0, + "type": "point" + }, + { + "color": [ + 0.3, + 0.7, + 1.0 + ], + "name": "Spot", + "intensity": 40.0, + "type": "spot", + "spot": { + "innerConeAngle": 0.785398163397448, + "outerConeAngle": 1.57079632679 + } + } + ] + } + }, + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 3456, + "max": [ + 10, + 19.949111938476562, + 10 + ], + "min": [ + -10, + -0.050886999815702438, + -10 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 3456, + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5125, + "count": 5172, + "max": [ + 3455 + ], + "min": [ + 0 + ], + "type": "SCALAR" + } + ], + "asset": { + "copyright": "2017 (c) Adobe Corp", + "minVersion": "2.0", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 41472, + "byteOffset": 0 + }, + { + "buffer": 1, + "byteLength": 41472, + "byteOffset": 0 + }, + { + "buffer": 2, + "byteLength": 20688, + "byteOffset": 0, + "target": 34963 + } + ], + "buffers": [ + { + "byteLength": 41472, + "uri": "MODEL_ROUNDED_CUBE_PART_1/positions.bin" + }, + { + "byteLength": 41472, + "uri": "MODEL_ROUNDED_CUBE_PART_1/normals.bin" + }, + { + "byteLength": 20688, + "uri": "MODEL_ROUNDED_CUBE_PART_1/indices.bin" + } + ], + "cameras": [ + { + "name": "render_camera", + "perspective": { + "aspectRatio": 1.3333333730697632, + "yfov": 0.58904862403869629, + "zfar": 100, + "znear": 9.9999997473787516e-05 + }, + "type": "perspective" + }, + { + "name": "render_camera2", + "perspective": { + "aspectRatio": 1.3333333730697632, + "yfov": 0.58904862403869629, + "zfar": 100, + "znear": 9.9999997473787516e-05 + }, + "type": "perspective" + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Rounded Cube Material", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.63075679540634155, + 0.63075679540634155, + 0.63075679540634155, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 0.50300002098083496 + } + } + ], + "meshes": [ + { + "name": "MODEL_ROUNDED_CUBE_PART_1", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0 + }, + "indices": 2, + "material": 0, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "extensions": { + "KHR_lights_punctual": { + "light": 1 + } + }, + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 22, + 0, + 1 + ], + "name": "point_light" + }, + { + "name": "directional_light", + "extensions": { + "KHR_lights_punctual": { + "light": 0 + } + } + }, + { + "mesh": 0, + "name": "MODEL_ROUNDED_CUBE_PART_1model_N3D" + } + ], + "scene": 0, + "scenes": [ + { + "name": "scene", + "nodes": [ + 0, + 1, + 2 + ] + } + ] +} \ No newline at end of file diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/glTF.KHR_lights_punctual.schema.json b/extensions/2.0/Khronos/KHR_lights_punctual/schema/glTF.KHR_lights_punctual.schema.json new file mode 100644 index 0000000000..4aad41f6f6 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/glTF.KHR_lights_punctual.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "title": "KHR_lights_punctual glTF extension", + "type": "object", + "allOf" : [ { "$ref" : "../../../../specification/2.0/schema/glTFChildOfRootProperty.schema.json" } ], + "properties": { + "lights": { + "type": "array", + "items": { + "type": "object", + "$ref": "light.schema.json" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "lights" + ] +} diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.schema.json b/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.schema.json new file mode 100644 index 0000000000..eeb8b9f475 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "title": "light", + "type": "object", + "description": "A directional, point, or spot light.", + "allOf": [ { "$ref": "glTFProperty.schema.json" } ], + "properties": { + "color": { + "type": "array", + "items": { + "type": "number", + "minimum": 0.0, + "maximum": 1.0 + }, + "minItems": 3, + "maxItems": 3, + "description": "Color of the light source.", + "default": [1, 1, 1] + }, + "intensity": { + "type": "number", + "description": "Intensity of the light source. `point` and `spot` lights use luminous intensity in candela (lm/sr) while `directional` lights use illuminance in lux (lm/m^2)", + "default": 1.0 + }, + "spot": { + "type": "object", + "dependencies": { + "type": ["spot"] + }, + "$ref": "light.spot.schema.json" + }, + "type": { + "type": "string", + "description": "Specifies the light type.", + "enum": [ + "directional", + "point", + "spot" + ] + }, + "range": { + "type": "number", + "description": "A distance cutoff at which the light's intensity may be considered to have reached zero.", + "minimum": 0, + "dependencies": { + "type": ["spot", "point"] + } + }, + "name": { }, + "extensions": { }, + "extras": { } + }, + "additionalProperties": false, + "required": [ + "type" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.spot.schema.json b/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.spot.schema.json new file mode 100644 index 0000000000..c2c7f4a081 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/light.spot.schema.json @@ -0,0 +1,19 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema", + "title" : "light/spot", + "type" : "object", + "allOf" : [ { "$ref" : "light.schema.json" } ], + "properties" : { + "innerConeAngle" : { + "type" : "number", + "description" : "Angle in radians from centre of spotlight where falloff begins.", + "default" : 0.0 + }, + "outerConeAngle" : { + "type" : "number", + "description" : "Angle in radians from centre of spotlight where falloff ends.", + "default" : 0.785398163397448 + } + }, + "additionalProperties" : false +} diff --git a/extensions/2.0/Khronos/KHR_lights_punctual/schema/node.KHR_lights_punctual.schema.json b/extensions/2.0/Khronos/KHR_lights_punctual/schema/node.KHR_lights_punctual.schema.json new file mode 100644 index 0000000000..cf07cbca09 --- /dev/null +++ b/extensions/2.0/Khronos/KHR_lights_punctual/schema/node.KHR_lights_punctual.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "title": "KHR_lights_punctual node extension", + "type": "object", + "allOf": [ { "$ref": "glTFProperty.schema.json" } ], + "properties": { + "light": { + "allOf": [ + { + "$ref": "glTFid.schema.json" + } + ], + "description": "The id of the light referenced by this node." + } + }, + "additionalProperties": false, + "required": [ + "light" + ] +}