|
@@ -4,8 +4,9 @@ import { normalView, transformNormalToView } from '../accessors/Normal.js';
|
|
|
import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
|
|
import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
|
|
|
import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
|
|
import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
|
|
|
|
|
|
|
|
-import { TangentSpaceNormalMap, ObjectSpaceNormalMap } from '../../constants.js';
|
|
|
|
|
|
|
+import { TangentSpaceNormalMap, ObjectSpaceNormalMap, NoNormalPacking, NormalRGPacking, NormalGAPacking } from '../../constants.js';
|
|
|
import { directionToFaceDirection } from './FrontFacingNode.js';
|
|
import { directionToFaceDirection } from './FrontFacingNode.js';
|
|
|
|
|
+import { unpackNormal } from '../utils/Packing.js';
|
|
|
import { error } from '../../utils.js';
|
|
import { error } from '../../utils.js';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -58,14 +59,48 @@ class NormalMapNode extends TempNode {
|
|
|
*/
|
|
*/
|
|
|
this.normalMapType = TangentSpaceNormalMap;
|
|
this.normalMapType = TangentSpaceNormalMap;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Controls how to unpack the sampled normal map values.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @type {string}
|
|
|
|
|
+ * @default NoNormalPacking
|
|
|
|
|
+ */
|
|
|
|
|
+ this.unpackNormalMode = NoNormalPacking;
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
setup( { material } ) {
|
|
setup( { material } ) {
|
|
|
|
|
|
|
|
- const { normalMapType, scaleNode } = this;
|
|
|
|
|
|
|
+ const { normalMapType, scaleNode, unpackNormalMode } = this;
|
|
|
|
|
|
|
|
let normalMap = this.node.mul( 2.0 ).sub( 1.0 );
|
|
let normalMap = this.node.mul( 2.0 ).sub( 1.0 );
|
|
|
|
|
|
|
|
|
|
+ if ( normalMapType === TangentSpaceNormalMap ) {
|
|
|
|
|
+
|
|
|
|
|
+ if ( unpackNormalMode == NormalRGPacking ) {
|
|
|
|
|
+
|
|
|
|
|
+ normalMap = unpackNormal( normalMap.xy );
|
|
|
|
|
+
|
|
|
|
|
+ } else if ( unpackNormalMode == NormalGAPacking ) {
|
|
|
|
|
+
|
|
|
|
|
+ normalMap = unpackNormal( normalMap.yw );
|
|
|
|
|
+
|
|
|
|
|
+ } else if ( unpackNormalMode != NoNormalPacking ) {
|
|
|
|
|
+
|
|
|
|
|
+ console.error( `THREE.NodeMaterial: Unexpected unpack normal mode: ${ unpackNormalMode }` );
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+
|
|
|
|
|
+ if ( unpackNormalMode != NoNormalPacking ) {
|
|
|
|
|
+
|
|
|
|
|
+ console.error( `THREE.NodeMaterial: Normal map type '${ normalMapType }' is not compatible with unpack normal mode '${ unpackNormalMode }'` );
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if ( scaleNode !== null ) {
|
|
if ( scaleNode !== null ) {
|
|
|
|
|
|
|
|
let scale = scaleNode;
|
|
let scale = scaleNode;
|