|
Sweet Home 3D Forum » List all forums » » Forum: Developers » » » Thread: 3D rendering question » » » » Post: Re: 3D rendering question |
Print at Dec 19, 2025, 9:30:56 AM |
| Posted by zerogravity90 at Mar 5, 2018, 6:54:59 AM |
Re: 3D rendering questionFinally, I solved it by modify Piece of Cabinet on UpdatePieceOfFurnitureModelNode funcion. But it's a bit slower Any idea or improve that code. /** * Updates transform group children with <code>modelMode</code>. */ public void updatePieceOfFurnitureModelNode(Node modelNode, TransformGroup normalization, boolean ignoreDrawingMode, boolean waitTextureLoadingEnd) { HomePieceOfFurniture piece = (HomePieceOfFurniture)getUserData(); try { float originalWidth = piece.getFloatValueFromMiscDataString("OriginalWidth"); //Get original define width float scaleRatioW = (float)(originalWidth / piece.getWidth()); //Get current width float originalHeight = piece.getFloatValueFromMiscDataString("OriginalHeight"); //Get original define height float scaleRatioH = (float)(originalHeight / piece.getHeight());//Get current height if (!piece.getReloaded())//If Piece need reload { for (int k = 0; k < ((Group)modelNode).numChildren(); k++) { Node t = ((Group)modelNode).getChild(k).cloneNode(false); if (scaleRatioW != 1 || scaleRatioH != 1) { if (scaleRatioW != 1.0 && !t.getUserData().toString().contains("angle")) { if (t.getUserData().toString().contains("Shaker_fl")) { //Left piece Shape3D shape = (Shape3D)t.cloneNode(false); for (int c = 0, n = shape.numGeometries(); c < n; c++) { Geometry geometry = shape.getGeometry(c); if (geometry instanceof GeometryArray) { GeometryArray geometryArray = (GeometryArray)geometry; int vertexCount = geometryArray.getVertexCount(); if ((geometryArray.getVertexFormat() & GeometryArray.BY_REFERENCE) != 0) { if ((geometryArray.getVertexFormat() & GeometryArray.INTERLEAVED) != 0) { float [] vertexData = geometryArray.getInterleavedVertices(); int vertexSize = vertexData.length / vertexCount; float leftMostValue = 1000; float rightMostValue = -1000; for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j] < leftMostValue) { leftMostValue = vertexData [j]; } if (vertexData [j] > rightMostValue) { rightMostValue = vertexData [j]; } } for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j] == rightMostValue) { vertexData [j] = (float)(leftMostValue + 0.7 * scaleRatioW); } } geometryArray.setInterleavedVertices(vertexData); shape.setCapability(ALLOW_AUTO_COMPUTE_BOUNDS_WRITE); shape.setCapability(ALLOW_BOUNDS_WRITE); shape.setCapability(ALLOW_CHILDREN_WRITE); shape.setGeometry(geometryArray, c); } } } } } else if (t.getUserData().toString().contains("Shaker_fr")) { //Right piece Shape3D shape = (Shape3D)t.cloneNode(false); for (int c = 0, n = shape.numGeometries(); c < n; c++) { Geometry geometry = shape.getGeometry(c); if (geometry instanceof GeometryArray) { GeometryArray geometryArray = (GeometryArray)geometry; int vertexCount = geometryArray.getVertexCount(); if ((geometryArray.getVertexFormat() & GeometryArray.BY_REFERENCE) != 0) { if ((geometryArray.getVertexFormat() & GeometryArray.INTERLEAVED) != 0) { float [] vertexData = geometryArray.getInterleavedVertices(); int vertexSize = vertexData.length / vertexCount; float leftMostValue = 1000; float rightMostValue = -1000; for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j] < leftMostValue) { leftMostValue = vertexData [j]; } if (vertexData [j] > rightMostValue) { rightMostValue = vertexData [j]; } } for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j] == leftMostValue) { vertexData [j] = (float)(rightMostValue - 0.7 * scaleRatioW); } } geometryArray.setInterleavedVertices(vertexData); shape.setCapability(ALLOW_AUTO_COMPUTE_BOUNDS_WRITE); shape.setCapability(ALLOW_BOUNDS_WRITE); shape.setCapability(ALLOW_CHILDREN_WRITE); shape.setGeometry(geometryArray, c); // System.out.println("fr1"); } } } } } } else if (scaleRatioH != 1.0) { if (t.getUserData().toString().contains("Shaker_fb")) { // System.out.println("ft"); Shape3D shape = (Shape3D)t.cloneNode(false); for (int c = 0, n = shape.numGeometries(); c < n; c++) { Geometry geometry = shape.getGeometry(c); if (geometry instanceof GeometryArray) { GeometryArray geometryArray = (GeometryArray)geometry; int vertexCount = geometryArray.getVertexCount(); if ((geometryArray.getVertexFormat() & GeometryArray.BY_REFERENCE) != 0) { if ((geometryArray.getVertexFormat() & GeometryArray.INTERLEAVED) != 0) { float [] vertexData = geometryArray.getInterleavedVertices(); int vertexSize = vertexData.length / vertexCount; float topMostValue = 1000; float bottomMostValue = -1000; for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j + 1] < topMostValue) { topMostValue = vertexData [j + 1]; } if (vertexData [j + 1] > bottomMostValue) { bottomMostValue = vertexData [j + 1]; } } for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j + 1] == bottomMostValue) { if (t.getUserData().toString().contains("Drawer_Small")) { vertexData [j + 1] = (float)(topMostValue + 0.37 * scaleRatioH); } else { vertexData [j + 1] = (float)(topMostValue + 0.7 * scaleRatioH); } } } geometryArray.setInterleavedVertices(vertexData); shape.setCapability(ALLOW_AUTO_COMPUTE_BOUNDS_WRITE); shape.setCapability(ALLOW_BOUNDS_WRITE); shape.setCapability(ALLOW_CHILDREN_WRITE); shape.setGeometry(geometryArray, c); // System.out.println("ft1"); } } } } } else if (t.getUserData().toString().contains("Shaker_ft")) { Shape3D shape = (Shape3D)t.cloneNode(false); for (int c = 0, n = shape.numGeometries(); c < n; c++) { Geometry geometry = shape.getGeometry(c); if (geometry instanceof GeometryArray) { GeometryArray geometryArray = (GeometryArray)geometry; int vertexCount = geometryArray.getVertexCount(); if ((geometryArray.getVertexFormat() & GeometryArray.BY_REFERENCE) != 0) { if ((geometryArray.getVertexFormat() & GeometryArray.INTERLEAVED) != 0) { float [] vertexData = geometryArray.getInterleavedVertices(); int vertexSize = vertexData.length / vertexCount; float topMostValue = 1000; float bottomMostValue = -1000; for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j + 1] < topMostValue) { topMostValue = vertexData [j + 1]; } if (vertexData [j + 1] > bottomMostValue) { bottomMostValue = vertexData [j + 1]; } } for (int index = 0, j = vertexSize - 3; index < vertexCount; j += vertexSize, index++) { if (vertexData [j + 1] == topMostValue) { if (t.getUserData().toString().contains("Drawer_Small")) { vertexData [j + 1] = (float)(bottomMostValue - 0.37 * scaleRatioH); } else { vertexData [j + 1] = (float)(bottomMostValue - 0.7 * scaleRatioH); } } } geometryArray.setInterleavedVertices(vertexData); shape.setCapability(ALLOW_AUTO_COMPUTE_BOUNDS_WRITE); shape.setCapability(ALLOW_BOUNDS_WRITE); shape.setCapability(ALLOW_CHILDREN_WRITE); shape.setGeometry(geometryArray, c); } } } } } } } } } normalization.addChild(modelNode); setModelCapabilities(normalization); // Add model node to branch group BranchGroup modelBranch = new BranchGroup(); modelBranch.setCapability(BranchGroup.ALLOW_CHILDREN_READ); modelBranch.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); modelBranch.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); modelBranch.setCapability(BranchGroup.ALLOW_DETACH); modelBranch.addChild(normalization); if (!ignoreDrawingMode) { // Add outline model node modelBranch.addChild(createOutlineModelNode(normalization)); } // TransformGroup transformGroup = (TransformGroup)modelNode; TransformGroup transformGroup = (TransformGroup)getChild(0); // Remove previous nodes transformGroup.removeAllChildren(); // Add model branch to live scene transformGroup.addChild(modelBranch); if (piece instanceof HomeLight) { BranchGroup lightBranch = new BranchGroup(); lightBranch.setCapability(ALLOW_CHILDREN_READ); HomeLight light = (HomeLight)piece; for (int i = light.getLightSources().length; i > 0; i--) { PointLight pointLight = new PointLight(new Color3f(), new Point3f(), new Point3f(0.25f, 0, 0.0000025f)); pointLight.setCapability(PointLight.ALLOW_POSITION_WRITE); pointLight.setCapability(PointLight.ALLOW_COLOR_WRITE); pointLight.setCapability(PointLight.ALLOW_STATE_WRITE); BoundingLeaf bounds = (BoundingLeaf)getChild(1); pointLight.setInfluencingBoundingLeaf(bounds); lightBranch.addChild(pointLight); } addChild(lightBranch); } // Flip normals if back faces of model are shown if (piece.isBackFaceShown()) { setBackFaceNormalFlip(getFilledModelNode(), true); } } catch (Exception ex) { } // Update piece color, visibility and model mirror in dispatch thread as // these attributes may be changed in that thread updatePieceOfFurnitureModelMirrored(); updatePieceOfFurnitureColorAndTexture(waitTextureLoadingEnd); updateLight(); updatePieceOfFurnitureVisibility(); // Manage light sources visibility if (this.home != null && getUserData() instanceof Light) { this.home.addSelectionListener(new LightSelectionListener(this)); } } p/s : Shaker_fl : is fix left, same with ft, fr, fb. Thanks for all of your comment! |
|
|
Current timezone is GMT Dec 19, 2025, 9:30:56 AM |