public static SceneGraphComponent getSkyBox(JrScene scene) { Appearance rootApp = scene.getSceneRoot().getAppearance(); if (rootApp == null || rootApp.getAttribute(SKY_BOX) == INHERITED) { return null; } CubeMap skyBox = (CubeMap) createAttributeEntity(CubeMap.class, SKY_BOX, rootApp, true); if (skyBox == null) return null; if (skyBox.getFront() == null || skyBox.getBack() == null || skyBox.getLeft() == null || skyBox.getRight() == null || skyBox.getTop() == null || skyBox.getBottom() == null) return null; SceneGraphComponent r = new SceneGraphComponent(); IndexedFaceSetFactory ifsf = new IndexedFaceSetFactory(); ifsf.setVertexCount(4); ifsf.setFaceCount(1); ifsf.setVertexCoordinates(new double[][] {{1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {-1, 1, 0}}); ifsf.setFaceIndices(new int[][] {{0, 1, 2, 3}}); double o = 0.005; ifsf.setVertexTextureCoordinates( new double[][] {{1 - o, 1 - o}, {1 - o, o}, {o, o}, {o, 1 - o}}); ifsf.update(); SceneGraphComponent front = new SceneGraphComponent(); Appearance frontApp = new Appearance(); createTexture(frontApp, POLYGON_SHADER, skyBox.getFront()); front.setAppearance(frontApp); front.setGeometry(ifsf.getGeometry()); front.setName("front"); euclidean().translate(0, 0, 1.0).rotate(PI, 0, 1, 0).assignTo(front); SceneGraphComponent back = new SceneGraphComponent(); Appearance backApp = new Appearance(); createTexture(backApp, POLYGON_SHADER, skyBox.getBack()); back.setAppearance(backApp); back.setGeometry(ifsf.getGeometry()); back.setName("back"); euclidean().translate(0, 0, -1.0).assignTo(back); SceneGraphComponent top = new SceneGraphComponent(); Appearance topApp = new Appearance(); createTexture(topApp, POLYGON_SHADER, skyBox.getTop()); top.setAppearance(topApp); top.setGeometry(ifsf.getGeometry()); top.setName("bottom"); euclidean().translate(0, 1.0, 0).rotate(PI / 2, 1, 0, 0).rotate(-PI / 2, 0, 0, 1).assignTo(top); SceneGraphComponent bottom = new SceneGraphComponent(); Appearance bottomApp = new Appearance(); createTexture(bottomApp, POLYGON_SHADER, skyBox.getBottom()); bottom.setAppearance(bottomApp); bottom.setGeometry(ifsf.getGeometry()); bottom.setName("top"); euclidean() .translate(0, -1.0, 0) .rotate(-PI / 2, 1, 0, 0) .rotate(PI / 2, 0, 0, 1) .assignTo(bottom); SceneGraphComponent left = new SceneGraphComponent(); Appearance leftApp = new Appearance(); createTexture(leftApp, POLYGON_SHADER, skyBox.getLeft()); left.setAppearance(leftApp); left.setGeometry(ifsf.getGeometry()); left.setName("left"); euclidean().translate(-1.0, 0, 0).rotate(PI / 2, 0, 1, 0).assignTo(left); SceneGraphComponent right = new SceneGraphComponent(); Appearance rightApp = new Appearance(); createTexture(rightApp, POLYGON_SHADER, skyBox.getRight()); right.setAppearance(rightApp); right.setGeometry(ifsf.getGeometry()); right.setName("right"); euclidean().translate(1.0, 0, 0).rotate(-PI / 2, 0, 1, 0).assignTo(right); r.addChildren(front, back, top, bottom, left, right); r.setName("skybox"); euclidean().rotate(PI / 2, 0, 1, 0).rotate(PI, 1, 0, 0).scale(1000.0).assignTo(r); Appearance skyBoxApp = new Appearance(); skyBoxApp.setAttribute(POLYGON_SHADER + "." + LIGHTING_ENABLED, false); skyBoxApp.setAttribute(POLYGON_SHADER + "." + AMBIENT_COLOR, WHITE); skyBoxApp.setAttribute(POLYGON_SHADER + "." + AMBIENT_COEFFICIENT, 1.0); skyBoxApp.setAttribute(POLYGON_SHADER + "." + DIFFUSE_COEFFICIENT, 0.0); skyBoxApp.setAttribute(POLYGON_SHADER + "." + SPECULAR_COEFFICIENT, 0.0); r.setAppearance(skyBoxApp); return r; }