Skip to content

Commit 84e632f

Browse files
committed
NodeMaterialObserver: Improve skinnedmesh and morph supports
1 parent 5b778d0 commit 84e632f

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

src/materials/nodes/manager/NodeMaterialObserver.js

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class NodeMaterialObserver {
5757

5858
this.renderObjects = new WeakMap();
5959
this.hasNode = this.containsNode( builder );
60+
this.hasAnimation = builder.object.isSkinnedMesh === true;
6061
this.refreshUniforms = refreshUniforms;
6162
this.renderId = 0;
6263

@@ -89,6 +90,12 @@ class NodeMaterialObserver {
8990
worldMatrix: renderObject.object.matrixWorld.clone()
9091
};
9192

93+
if ( renderObject.object.morphTargetInfluences ) {
94+
95+
data.morphTargetInfluences = renderObject.object.morphTargetInfluences.slice();
96+
97+
}
98+
9299
if ( renderObject.bundle !== null ) {
93100

94101
data.version = renderObject.bundle.version;
@@ -158,13 +165,15 @@ class NodeMaterialObserver {
158165

159166
equals( renderObject ) {
160167

168+
const { object, material } = renderObject;
169+
161170
const renderObjectData = this.getRenderObjectData( renderObject );
162171

163172
// world matrix
164173

165-
if ( renderObjectData.worldMatrix.equals( renderObject.object.matrixWorld ) !== true ) {
174+
if ( renderObjectData.worldMatrix.equals( object.matrixWorld ) !== true ) {
166175

167-
renderObjectData.worldMatrix.copy( renderObject.object.matrixWorld );
176+
renderObjectData.worldMatrix.copy( object.matrixWorld );
168177

169178
return false;
170179

@@ -173,7 +182,6 @@ class NodeMaterialObserver {
173182
// material
174183

175184
const materialData = renderObjectData.material;
176-
const material = renderObject.material;
177185

178186
for ( const property in materialData ) {
179187

@@ -211,6 +219,26 @@ class NodeMaterialObserver {
211219

212220
}
213221

222+
// morph targets
223+
224+
if ( renderObjectData.morphTargetInfluences ) {
225+
226+
let morphChanged = false;
227+
228+
for ( let i = 0; i < renderObjectData.morphTargetInfluences.length; i ++ ) {
229+
230+
if ( renderObjectData.morphTargetInfluences[ i ] !== object.morphTargetInfluences[ i ] ) {
231+
232+
morphChanged = true;
233+
234+
}
235+
236+
}
237+
238+
if ( morphChanged ) return true;
239+
240+
}
241+
214242
// bundle
215243

216244
if ( renderObject.bundle !== null ) {
@@ -225,7 +253,7 @@ class NodeMaterialObserver {
225253

226254
needsRefresh( renderObject, nodeFrame ) {
227255

228-
if ( this.hasNode || this.firstInitialization( renderObject ) )
256+
if ( this.hasNode || this.hasAnimation || this.firstInitialization( renderObject ) )
229257
return true;
230258

231259
const { renderId } = nodeFrame;

0 commit comments

Comments
 (0)