Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions jme3-core/src/main/java/com/jme3/material/RenderState.java
Original file line number Diff line number Diff line change
Expand Up @@ -1165,6 +1165,7 @@ public TestFunction getBackStencilFunction() {
*/
public void setFrontStencilMask(int frontStencilMask) {
this.frontStencilMask = frontStencilMask;
cachedHashCode = -1;
}

/**
Expand All @@ -1174,6 +1175,7 @@ public void setFrontStencilMask(int frontStencilMask) {
*/
public void setBackStencilMask(int backStencilMask) {
this.backStencilMask = backStencilMask;
cachedHashCode = -1;
}

/**
Expand All @@ -1183,6 +1185,7 @@ public void setBackStencilMask(int backStencilMask) {
*/
public void setFrontStencilReference(int frontStencilReference) {
this.frontStencilReference = frontStencilReference;
cachedHashCode = -1;
}

/**
Expand All @@ -1192,6 +1195,7 @@ public void setFrontStencilReference(int frontStencilReference) {
*/
public void setBackStencilReference(int backStencilReference) {
this.backStencilReference = backStencilReference;
cachedHashCode = -1;
}

/**
Expand Down Expand Up @@ -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;
}
}

Expand Down
51 changes: 51 additions & 0 deletions jme3-core/src/test/java/com/jme3/material/RenderStateTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down