diff --git a/jme3-core/src/main/java/com/jme3/material/RenderState.java b/jme3-core/src/main/java/com/jme3/material/RenderState.java index 2e93a4e1f3..246ba258e9 100644 --- a/jme3-core/src/main/java/com/jme3/material/RenderState.java +++ b/jme3-core/src/main/java/com/jme3/material/RenderState.java @@ -1165,6 +1165,7 @@ public TestFunction getBackStencilFunction() { */ public void setFrontStencilMask(int frontStencilMask) { this.frontStencilMask = frontStencilMask; + cachedHashCode = -1; } /** @@ -1174,6 +1175,7 @@ public void setFrontStencilMask(int frontStencilMask) { */ public void setBackStencilMask(int backStencilMask) { this.backStencilMask = backStencilMask; + cachedHashCode = -1; } /** @@ -1183,6 +1185,7 @@ public void setBackStencilMask(int backStencilMask) { */ public void setFrontStencilReference(int frontStencilReference) { this.frontStencilReference = frontStencilReference; + cachedHashCode = -1; } /** @@ -1192,6 +1195,7 @@ public void setFrontStencilReference(int frontStencilReference) { */ public void setBackStencilReference(int backStencilReference) { this.backStencilReference = backStencilReference; + cachedHashCode = -1; } /** @@ -1789,8 +1793,8 @@ public String toString() { */ public void flipFaceCull() { switch (cullMode) { - case Back: cullMode = FaceCullMode.Front; break; - case Front: cullMode = FaceCullMode.Back; break; + case Back: setFaceCullMode(FaceCullMode.Front); break; + case Front: setFaceCullMode(FaceCullMode.Back); break; } } diff --git a/jme3-core/src/test/java/com/jme3/material/RenderStateTest.java b/jme3-core/src/test/java/com/jme3/material/RenderStateTest.java index 431ce9008c..e3c13eba52 100644 --- a/jme3-core/src/test/java/com/jme3/material/RenderStateTest.java +++ b/jme3-core/src/test/java/com/jme3/material/RenderStateTest.java @@ -53,6 +53,57 @@ public class RenderStateTest { // ************************************************************************* // new methods exposed + @Test + public void testHashInvalidation() { + /* + * Test that setters properly invalidate the cached hash code. + */ + RenderState state = new RenderState(); + + // Get initial hash to force caching + int hash1 = state.contentHashCode(); + + // Test setFrontStencilMask invalidates hash + state.setFrontStencilMask(0x12345678); + int hash2 = state.contentHashCode(); + Assert.assertNotEquals("setFrontStencilMask should invalidate hash", hash1, hash2); + + // Test setBackStencilMask invalidates hash + hash1 = state.contentHashCode(); + state.setBackStencilMask(0x87654321); + hash2 = state.contentHashCode(); + Assert.assertNotEquals("setBackStencilMask should invalidate hash", hash1, hash2); + + // Test setFrontStencilReference invalidates hash + hash1 = state.contentHashCode(); + state.setFrontStencilReference(42); + hash2 = state.contentHashCode(); + Assert.assertNotEquals("setFrontStencilReference should invalidate hash", hash1, hash2); + + // Test setBackStencilReference invalidates hash + hash1 = state.contentHashCode(); + state.setBackStencilReference(99); + hash2 = state.contentHashCode(); + Assert.assertNotEquals("setBackStencilReference should invalidate hash", hash1, hash2); + + // Test flipFaceCull invalidates hash + state.setFaceCullMode(RenderState.FaceCullMode.Back); + hash1 = state.contentHashCode(); + state.flipFaceCull(); + hash2 = state.contentHashCode(); + Assert.assertNotEquals("flipFaceCull should invalidate hash", hash1, hash2); + Assert.assertEquals("flipFaceCull should flip Back to Front", + RenderState.FaceCullMode.Front, state.getFaceCullMode()); + + // Test flipFaceCull again (Front to Back) + hash1 = state.contentHashCode(); + state.flipFaceCull(); + hash2 = state.contentHashCode(); + Assert.assertNotEquals("flipFaceCull should invalidate hash (Front to Back)", hash1, hash2); + Assert.assertEquals("flipFaceCull should flip Front to Back", + RenderState.FaceCullMode.Back, state.getFaceCullMode()); + } + @Test public void testCloneRenderState() { for (RenderState.BlendEquation equation : RenderState.BlendEquation.values()) {