Просмотр исходного кода

SpriteNodeMaterial: Add sizeAttenuation (#29394)

* SpriteNodeMaterial: Add sizeAttenuation

* Regenerate screenshot

* revert mat4 mul with vec4(,1)?

* revert

* using let and toVar fixes the issue?

* merge upstream/dev

* revert screenshot

* does reverting SpriteNode even fix?

* revert fix

* revert everything fix tsl galaxy?

* checkout dev SpriteNodeMaterial.js...

* smaller change test

* convert scale to var

* convert scale to var

* simply adding toVar breaks tsl_galaxy?

* fix multiple spritematerial with different center position

* feedbacks

* cleanup

* feedbacks

* cleanup

* cleanup

---------

Co-authored-by: sunag <sunagbrasil@gmail.com>
Renaud Rohlinger 1 год назад
Родитель
Сommit
cd1d4a5d79
1 измененных файлов с 32 добавлено и 3 удалено
  1. 32 3
      src/materials/nodes/SpriteNodeMaterial.js

+ 32 - 3
src/materials/nodes/SpriteNodeMaterial.js

@@ -1,5 +1,4 @@
 import NodeMaterial from './NodeMaterial.js';
 import NodeMaterial from './NodeMaterial.js';
-import { uniform } from '../../nodes/core/UniformNode.js';
 import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
 import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
 import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
 import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
 import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
 import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
@@ -8,6 +7,7 @@ import { rotate } from '../../nodes/utils/RotateNode.js';
 import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
 import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
 
 
 import { SpriteMaterial } from '../SpriteMaterial.js';
 import { SpriteMaterial } from '../SpriteMaterial.js';
+import { reference } from '../../nodes/accessors/ReferenceBaseNode.js';
 
 
 const _defaultValues = /*@__PURE__*/ new SpriteMaterial();
 const _defaultValues = /*@__PURE__*/ new SpriteMaterial();
 
 
@@ -26,6 +26,7 @@ class SpriteNodeMaterial extends NodeMaterial {
 		this.isSpriteNodeMaterial = true;
 		this.isSpriteNodeMaterial = true;
 
 
 		this.lights = false;
 		this.lights = false;
+		this._useSizeAttenuation = true;
 
 
 		this.positionNode = null;
 		this.positionNode = null;
 		this.rotationNode = null;
 		this.rotationNode = null;
@@ -37,7 +38,9 @@ class SpriteNodeMaterial extends NodeMaterial {
 
 
 	}
 	}
 
 
-	setupPosition( { object, context } ) {
+	setupPosition( { object, camera, context } ) {
+
+		const sizeAttenuation = this.sizeAttenuation;
 
 
 		// < VERTEX STAGE >
 		// < VERTEX STAGE >
 
 
@@ -55,11 +58,20 @@ class SpriteNodeMaterial extends NodeMaterial {
 
 
 		}
 		}
 
 
+
+		if ( ! sizeAttenuation && camera.isPerspectiveCamera ) {
+
+			scale = scale.mul( mvPosition.z.negate() );
+
+		}
+
 		let alignedPosition = vertex.xy;
 		let alignedPosition = vertex.xy;
 
 
 		if ( object.center && object.center.isVector2 === true ) {
 		if ( object.center && object.center.isVector2 === true ) {
 
 
-			alignedPosition = alignedPosition.sub( uniform( object.center ).sub( 0.5 ) );
+			const center = reference( 'center', 'vec2' );
+
+			alignedPosition = alignedPosition.sub( center.sub( 0.5 ) );
 
 
 		}
 		}
 
 
@@ -89,6 +101,23 @@ class SpriteNodeMaterial extends NodeMaterial {
 
 
 	}
 	}
 
 
+	get sizeAttenuation() {
+
+		return this._useSizeAttenuation;
+
+	}
+
+	set sizeAttenuation( value ) {
+
+		if ( this._useSizeAttenuation !== value ) {
+
+			this._useSizeAttenuation = value;
+			this.needsUpdate = true;
+
+		}
+
+	}
+
 }
 }
 
 
 export default SpriteNodeMaterial;
 export default SpriteNodeMaterial;

粤ICP备19079148号