Print at Dec 19, 2025, 9:30:56 AM

Posted by zerogravity90 at Mar 5, 2018, 6:54:59 AM
smile   Re: 3D rendering question
Finally, 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!