Skip to content

Commit d8da788

Browse files
Copilotriccardobl
andauthored
Fix RenderState hash invalidation in stencil setters and flipFaceCull (#2603)
* Initial plan * Fix RenderState hash invalidation in stencil setters and flipFaceCull Co-authored-by: riccardobl <4943530+riccardobl@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: riccardobl <4943530+riccardobl@users.noreply.github.com>
1 parent 26945e0 commit d8da788

2 files changed

Lines changed: 57 additions & 2 deletions

File tree

jme3-core/src/main/java/com/jme3/material/RenderState.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,7 @@ public TestFunction getBackStencilFunction() {
11651165
*/
11661166
public void setFrontStencilMask(int frontStencilMask) {
11671167
this.frontStencilMask = frontStencilMask;
1168+
cachedHashCode = -1;
11681169
}
11691170

11701171
/**
@@ -1174,6 +1175,7 @@ public void setFrontStencilMask(int frontStencilMask) {
11741175
*/
11751176
public void setBackStencilMask(int backStencilMask) {
11761177
this.backStencilMask = backStencilMask;
1178+
cachedHashCode = -1;
11771179
}
11781180

11791181
/**
@@ -1183,6 +1185,7 @@ public void setBackStencilMask(int backStencilMask) {
11831185
*/
11841186
public void setFrontStencilReference(int frontStencilReference) {
11851187
this.frontStencilReference = frontStencilReference;
1188+
cachedHashCode = -1;
11861189
}
11871190

11881191
/**
@@ -1192,6 +1195,7 @@ public void setFrontStencilReference(int frontStencilReference) {
11921195
*/
11931196
public void setBackStencilReference(int backStencilReference) {
11941197
this.backStencilReference = backStencilReference;
1198+
cachedHashCode = -1;
11951199
}
11961200

11971201
/**
@@ -1789,8 +1793,8 @@ public String toString() {
17891793
*/
17901794
public void flipFaceCull() {
17911795
switch (cullMode) {
1792-
case Back: cullMode = FaceCullMode.Front; break;
1793-
case Front: cullMode = FaceCullMode.Back; break;
1796+
case Back: setFaceCullMode(FaceCullMode.Front); break;
1797+
case Front: setFaceCullMode(FaceCullMode.Back); break;
17941798
}
17951799
}
17961800

jme3-core/src/test/java/com/jme3/material/RenderStateTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,57 @@ public class RenderStateTest {
5353
// *************************************************************************
5454
// new methods exposed
5555

56+
@Test
57+
public void testHashInvalidation() {
58+
/*
59+
* Test that setters properly invalidate the cached hash code.
60+
*/
61+
RenderState state = new RenderState();
62+
63+
// Get initial hash to force caching
64+
int hash1 = state.contentHashCode();
65+
66+
// Test setFrontStencilMask invalidates hash
67+
state.setFrontStencilMask(0x12345678);
68+
int hash2 = state.contentHashCode();
69+
Assert.assertNotEquals("setFrontStencilMask should invalidate hash", hash1, hash2);
70+
71+
// Test setBackStencilMask invalidates hash
72+
hash1 = state.contentHashCode();
73+
state.setBackStencilMask(0x87654321);
74+
hash2 = state.contentHashCode();
75+
Assert.assertNotEquals("setBackStencilMask should invalidate hash", hash1, hash2);
76+
77+
// Test setFrontStencilReference invalidates hash
78+
hash1 = state.contentHashCode();
79+
state.setFrontStencilReference(42);
80+
hash2 = state.contentHashCode();
81+
Assert.assertNotEquals("setFrontStencilReference should invalidate hash", hash1, hash2);
82+
83+
// Test setBackStencilReference invalidates hash
84+
hash1 = state.contentHashCode();
85+
state.setBackStencilReference(99);
86+
hash2 = state.contentHashCode();
87+
Assert.assertNotEquals("setBackStencilReference should invalidate hash", hash1, hash2);
88+
89+
// Test flipFaceCull invalidates hash
90+
state.setFaceCullMode(RenderState.FaceCullMode.Back);
91+
hash1 = state.contentHashCode();
92+
state.flipFaceCull();
93+
hash2 = state.contentHashCode();
94+
Assert.assertNotEquals("flipFaceCull should invalidate hash", hash1, hash2);
95+
Assert.assertEquals("flipFaceCull should flip Back to Front",
96+
RenderState.FaceCullMode.Front, state.getFaceCullMode());
97+
98+
// Test flipFaceCull again (Front to Back)
99+
hash1 = state.contentHashCode();
100+
state.flipFaceCull();
101+
hash2 = state.contentHashCode();
102+
Assert.assertNotEquals("flipFaceCull should invalidate hash (Front to Back)", hash1, hash2);
103+
Assert.assertEquals("flipFaceCull should flip Front to Back",
104+
RenderState.FaceCullMode.Back, state.getFaceCullMode());
105+
}
106+
56107
@Test
57108
public void testCloneRenderState() {
58109
for (RenderState.BlendEquation equation : RenderState.BlendEquation.values()) {

0 commit comments

Comments
 (0)