diff options
author | Harvey Harrison <[email protected]> | 2012-01-12 20:38:32 -0800 |
---|---|---|
committer | Harvey Harrison <[email protected]> | 2012-01-12 20:38:32 -0800 |
commit | 4c00dcf9ad239d1b4afbeb97aa1b150a22ca4fe1 (patch) | |
tree | c025b256fa05df167215ac0a5556080036aac3ab | |
parent | d8c07b990e6eafef62a7f6194bdd89bd4e4920b6 (diff) |
j3dcore: use System.arrayCopy and make RenderAtom creation loops common
Unify the two if/else branches into a single loop and expand the Array using
System.arrayCopy.
Signed-off-by: Harvey Harrison <[email protected]>
-rw-r--r-- | src/classes/share/javax/media/j3d/GeometryAtom.java | 79 |
1 files changed, 22 insertions, 57 deletions
diff --git a/src/classes/share/javax/media/j3d/GeometryAtom.java b/src/classes/share/javax/media/j3d/GeometryAtom.java index f9ed4ca..bd43c22 100644 --- a/src/classes/share/javax/media/j3d/GeometryAtom.java +++ b/src/classes/share/javax/media/j3d/GeometryAtom.java @@ -158,76 +158,41 @@ class GeometryAtom extends Object implements BHLeafInterface, NnuId { * Gets a RenderAtom for the given viewIndex. * If it doesn't exist, it creates one. */ - RenderAtom getRenderAtom(View view) { - RenderAtom ra; +RenderAtom getRenderAtom(View view) { synchronized (lockObj) { // If renderAtom is not scoped to this view, don't even // bother creating the renderAtom, just return if (source.viewList != null && !source.viewList.contains(view)) return null; + // Expand the renderAtoms array if needed int index = view.viewIndex; - if (index >= renderAtoms.length) { - RenderAtom[] newList = new RenderAtom[index+1]; - for (int i = 0; i < renderAtoms.length; i++) { - newList[i] = renderAtoms[i]; - } - ra = new RenderAtom(); - newList[index] = ra; - newList[index].geometryAtom = this; - - // Allocate space based on number of geometry in the list - ra.rListInfo = new RenderAtomListInfo[geometryArray.length]; - if (geoType != GeometryRetained.GEO_TYPE_TEXT3D) { - for (int j = 0; j < ra.rListInfo.length; j++) { - ra.rListInfo[j] = new RenderAtomListInfo(); - ra.rListInfo[j].renderAtom = ra; - ra.rListInfo[j].index = j; - } - } - else { - for (int j = 0; j < ra.rListInfo.length; j++) { - ra.rListInfo[j] = new RenderAtomListInfo(); - ra.rListInfo[j].renderAtom = ra; - ra.rListInfo[j].index = j; - ra.rListInfo[j].localToVworld = new Transform3D(); - } + if (index >= renderAtoms.length) { + RenderAtom[] newList = new RenderAtom[index + 1]; + System.arraycopy(renderAtoms, 0, newList, 0, renderAtoms.length); + renderAtoms = newList; } - // Note this must be the last line in synchronized. - // Otherwise the lock is changed to newList and - // another thread can come in modified. This cause - // NullPointerException in - // renderAtoms[index].geometryAtom = this; - // which I encounter. - renderAtoms = newList; - } else { - if (renderAtoms[index] == null) { - ra = new RenderAtom(); - renderAtoms[index] = ra; - renderAtoms[index].geometryAtom = this; - // Allocate space based on number of geometry in the list - ra.rListInfo = new RenderAtomListInfo[geometryArray.length]; - if (geoType != GeometryRetained.GEO_TYPE_TEXT3D) { - for (int j = 0; j < ra.rListInfo.length; j++) { - ra.rListInfo[j] = new RenderAtomListInfo(); - ra.rListInfo[j].renderAtom = ra; - ra.rListInfo[j].index = j; - } - } - else { + RenderAtom ra = renderAtoms[index]; + if (ra == null) { + ra = new RenderAtom(); + renderAtoms[index] = ra; + ra.geometryAtom = this; + + // Allocate space based on number of geometry in the list + boolean isGeoTypeText3D = (geoType == GeometryRetained.GEO_TYPE_TEXT3D); + ra.rListInfo = new RenderAtomListInfo[geometryArray.length]; for (int j = 0; j < ra.rListInfo.length; j++) { - ra.rListInfo[j] = new RenderAtomListInfo(); - ra.rListInfo[j].renderAtom = ra; - ra.rListInfo[j].index = j; - ra.rListInfo[j].localToVworld = new Transform3D(); + ra.rListInfo[j] = new RenderAtomListInfo(); + ra.rListInfo[j].renderAtom = ra; + ra.rListInfo[j].index = j; + if (isGeoTypeText3D) + ra.rListInfo[j].localToVworld = new Transform3D(); } - } } - } - return (renderAtoms[index]); + return ra; } - } +} // If the renderAtom is transparent, then make sure that the // value is up-to-date |