@@ -890,16 +890,37 @@ private boolean isBO(final VarType type) {
890890 return type == VarType .BufferObject ;
891891 }
892892
893- private void updateRenderState (RenderManager renderManager , Renderer renderer , TechniqueDef techniqueDef ) {
893+ private void updateRenderState (Geometry geometry , RenderManager renderManager , Renderer renderer , TechniqueDef techniqueDef ) {
894894 if (renderManager .getForcedRenderState () != null ) {
895- renderer .applyRenderState (renderManager .getForcedRenderState ());
895+ mergedRenderState .copyFrom (renderManager .getForcedRenderState ());
896+ } else if (techniqueDef .getRenderState () != null ) {
897+ mergedRenderState .copyFrom (RenderState .DEFAULT );
898+ techniqueDef .getRenderState ().copyMergedTo (additionalState , mergedRenderState );
896899 } 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+ mergedRenderState .copyFrom (RenderState .DEFAULT );
901+ RenderState .DEFAULT .copyMergedTo (additionalState , mergedRenderState );
902902 }
903+ // test if the face cull mode should be flipped before render
904+ if (mergedRenderState .isFaceCullFlippable () && isNormalsBackward (geometry .getWorldScale ())) {
905+ mergedRenderState .flipFaceCull ();
906+ }
907+ renderer .applyRenderState (mergedRenderState );
908+ }
909+
910+ /**
911+ * Returns true if the geometry world scale indicates that normals will be backward.
912+ * @param scalar geometry world scale
913+ * @return
914+ */
915+ private boolean isNormalsBackward (Vector3f scalar ) {
916+ // count number of negative scalar vector components
917+ int n = 0 ;
918+ if (scalar .x < 0 ) n ++;
919+ if (scalar .y < 0 ) n ++;
920+ if (scalar .z < 0 ) n ++;
921+ // An odd number of negative components means the normal vectors
922+ // are backward to what they should be.
923+ return n == 1 || n == 3 ;
903924 }
904925
905926 /**
@@ -1028,7 +1049,7 @@ public void render(Geometry geometry, LightList lights, RenderManager renderMana
10281049 }
10291050
10301051 // Apply render state
1031- updateRenderState (renderManager , renderer , techniqueDef );
1052+ updateRenderState (geometry , renderManager , renderer , techniqueDef );
10321053
10331054 // Get world overrides
10341055 SafeArrayList <MatParamOverride > overrides = geometry .getWorldMatParamOverrides ();
0 commit comments