@@ -890,16 +890,36 @@ private boolean isBO(final VarType type) {
890
890
return type == VarType .BufferObject ;
891
891
}
892
892
893
- private void updateRenderState (RenderManager renderManager , Renderer renderer , TechniqueDef techniqueDef ) {
893
+ private void updateRenderState (Geometry geometry , RenderManager renderManager , Renderer renderer , TechniqueDef techniqueDef ) {
894
894
if (renderManager .getForcedRenderState () != null ) {
895
- renderer .applyRenderState (renderManager .getForcedRenderState ());
895
+ mergedRenderState .set (renderManager .getForcedRenderState ());
896
+ } else if (techniqueDef .getRenderState () != null ) {
897
+ // copyMergedTo writes to mergedRenderState
898
+ techniqueDef .getRenderState ().copyMergedTo (additionalState , mergedRenderState );
896
899
} else {
897
- if (techniqueDef .getRenderState () != null ) {
898
- renderer .applyRenderState (techniqueDef .getRenderState ().copyMergedTo (additionalState , mergedRenderState ));
899
- } else {
900
- renderer .applyRenderState (RenderState .DEFAULT .copyMergedTo (additionalState , mergedRenderState ));
901
- }
900
+ RenderState .DEFAULT .copyMergedTo (additionalState , mergedRenderState );
902
901
}
902
+ // test if the face cull mode should be flipped before render
903
+ if (mergedRenderState .isFaceCullFlippable () && isNormalsBackward (geometry .getWorldScale ())) {
904
+ mergedRenderState .flipFaceCull ();
905
+ }
906
+ renderer .applyRenderState (mergedRenderState );
907
+ }
908
+
909
+ /**
910
+ * Returns true if the geometry world scale indicates that normals will be backward.
911
+ * @param scalar geometry world scale
912
+ * @return
913
+ */
914
+ private boolean isNormalsBackward (Vector3f scalar ) {
915
+ // count number of negative scalar vector components
916
+ int n = 0 ;
917
+ if (scalar .x < 0 ) n ++;
918
+ if (scalar .y < 0 ) n ++;
919
+ if (scalar .z < 0 ) n ++;
920
+ // An odd number of negative components means the normal vectors
921
+ // are backward to what they should be.
922
+ return n == 1 || n == 3 ;
903
923
}
904
924
905
925
/**
@@ -1028,7 +1048,7 @@ public void render(Geometry geometry, LightList lights, RenderManager renderMana
1028
1048
}
1029
1049
1030
1050
// Apply render state
1031
- updateRenderState (renderManager , renderer , techniqueDef );
1051
+ updateRenderState (geometry , renderManager , renderer , techniqueDef );
1032
1052
1033
1053
// Get world overrides
1034
1054
SafeArrayList <MatParamOverride > overrides = geometry .getWorldMatParamOverrides ();
0 commit comments