When i try to use this code in two times or i call the class "MapaAltura"
in two times, i receive the OutOfMemory message. I dont know what to do,
to clean up or clear the SimpleUniverse when i call the class for second
time.
this is the code. Urgent please!!!
//Main Class
public class MainMapa {
public static void main(String args[]){
FrameMapa f = new FrameMapa();
}
}
//Frame
import com.sun.j3d.utils.applet.JMainFrame;
import java.awt.*;
import java.awt.event.*;
public class FrameMapa {
private MapaAltura m;
public FrameMapa() {
Frame frame = new Frame();
frame.setSize(100,100);
Button a = new Button("Apply");
Button r = new Button("Remove");
a.addActionListener
(new ActionListener() {
public void actionPerformed(ActionEvent e){
execute();
}});
r.addActionListener
(new ActionListener() {
public void actionPerformed(ActionEvent e){
remove();
}});
frame.add("North", a);
frame.add("Center", r);
frame.setVisible(true);
}
public void execute(){
try{
m = new MapaAltura();
JMainFrame j = new JMainFrame(m,400,400);}
catch(Exception e){e.printStackTrace();}
}
public void remove(){
m.killAll();
}
}
//Class where i create the 3D image
import javax.media.j3d.*;
import javax.vecmath.*;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.behaviors.vp.*;
import com.sun.j3d.utils.universe.ViewingPlatform;
public class MapaAltura extends Applet {
private OrbitBehavior orbit = null;
public Shape3D shape = null;
public DirectionalLight light= null;
public Color3f lightColor=null;
public Bounds banda=null;
public BranchGroup branch = null;
public Material mat = null;
private Transform3D mov, rotarX, rotarZ;
private TransformGroup rotatingGroup=null;
public SimpleUniverse simpleU=null;
public AlternateAppearance altApp;
public MapaAltura() {
branch = new BranchGroup();
branch.setCapability(BranchGroup.ALLOW_DETACH);
shape = new MatrizMapa();
shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
Color3f objColor = new Color3f(1f, 1f, 1f);
Color3f black = new Color3f(0f, 0f, 0f);
Appearance app = new Appearance();
mat = new Material(objColor, black, objColor, black, 1f);
mat.setCapability(Material.ALLOW_COMPONENT_WRITE);
app.setMaterial(mat);
shape.setAppearance(app);
banda = new BoundingBox(new Point3d(-10, -10, -10),
new Point3d(10, 10, 10));
Appearance otherApp = new Appearance();
Material altMat = new Material();
altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
otherApp.setMaterial(altMat);
altApp = new AlternateAppearance();
altApp.setAppearance(otherApp);
altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_WRITE);
altApp.setCapability(AlternateAppearance.ALLOW_SCOPE_READ);
altApp.setInfluencingBounds(banda);
branch.addChild(altApp);
Background bg = new Background(new Color3f(1f, 1f, 1f));
bg.setApplicationBounds(banda);
branch.addChild(bg);
rotarZ = new Transform3D();
rotarZ.rotZ(Math.PI);
rotarX = new Transform3D();
rotarX.rotX(Math.PI / 180 * -30);
rotarX.mul(rotarZ);
mov = new Transform3D();
mov.set(new Vector3f(0f, 0f, 0f));
rotarX.mul(mov);
rotatingGroup = new TransformGroup(rotarX);
rotatingGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
rotatingGroup.addChild(shape);
branch.addChild(rotatingGroup);
lightColor = new Color3f(.5f, .5f, .5f);
Vector3f lightDirection = new Vector3f(0f, -.5f, -1f);
light = new DirectionalLight(lightColor, lightDirection);
light.setCapability
(DirectionalLight.ALLOW_INFLUENCING_BOUNDS_WRITE );
light.setCapability(DirectionalLight.ALLOW_BOUNDS_WRITE );
light.setCapability(DirectionalLight.ALLOW_COLOR_WRITE);
light.setInfluencingBounds(banda);
branch.addChild(light);
branch.compile();
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
simpleU = new SimpleUniverse(canvas3D);
ViewingPlatform viewingPlatform = new ViewingPlatform();
viewingPlatform.setCapability(ViewingPlatform.ALLOW_DETACH);
viewingPlatform = simpleU.getViewingPlatform();
viewingPlatform.setNominalViewingTransform();
orbit = new OrbitBehavior(canvas3D, OrbitBehavior.REVERSE_ALL);
orbit.setRotationCenter(new Point3d(-1.0, -1.0, -1.0));
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0, -1.0, -1.0), 0.0);
orbit.setSchedulingBounds(banda);
viewingPlatform.setViewPlatformBehavior(orbit);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(branch);
}
// i try to clean the SimpleUniverse with this code, but is not working
public void killAll(){
shape.setGeometry(null);
// branch.detach();
// simpleU.getViewer().clearViewerMap();
// simpleU.getViewer().getUniverse().cleanup();
// simpleU.getViewingPlatform().detach();
// simpleU.getLocale().removeBranchGraph(branch);
simpleU.removeAllLocales();
simpleU.cleanup();
System.gc();
System.gc();
System.gc();
System.gc();
System.gc();
System.gc();
}
}
//Here i create the Geometry. IndexedTriangleArray
import javax.media.j3d.*;
import javax.vecmath.*;
import java.util.Random;
public class MatrizMapa extends Shape3D {
private Vector3f v1 = new Vector3f();
private Vector3f v2 = new Vector3f();
public Material mat;
public IndexedTriangleArray tria;
private Vector3f getNormal(Point3f p0, Point3f p1, Point3f p2) {
v1.sub(p1, p0);
v2.sub(p2, p0);
Vector3f normal = new Vector3f();
normal.cross(v1, v2);
normal.normalize();
return normal;
}
public MatrizMapa() {
int imagenEs[][] = new int[500][500];
int tamX = imagenEs.length;
int tamY = imagenEs[0].length;
int rectas = (tamX - 1) * (tamY -1);
int puntos = tamX * tamY;
setCapability(Shape3D.ALLOW_GEOMETRY_WRITE );
tria = new IndexedTriangleArray(puntos,
IndexedTriangleArray.COORDINATES |
IndexedTriangleArray.NORMALS, 6 * rectas);
float sX = 2f / (float)(tamX - 1) ;
float sY = 2f / (float)(tamY - 1);
int punto = 0;
int max = 5000;
for (int y = 0; y < tamY ; y++ ){
for(int x = 0; x < tamX ; x++){
tria.setCoordinate(punto,
new Point3f((float) x * sX - 1f,
(float) y * sY - 1f,
(float) imagenEs[x][y]));
punto++;
}
}
Point3f p0 = new Point3f();
Point3f p1 = new Point3f();
Point3f p2 = new Point3f();
Point3f p3 = new Point3f();
Vector3f triNormals[] = new Vector3f[2 * rectas];
int pointCounter = 0;
int triCounter = 0;
int i = 0;
for (int y = 0; y < tamY - 1; y++) {
for (int x = 0; x < tamX - 1; x++) {
tria.setCoordinateIndex(i, pointCounter);
tria.setNormalIndex(i++, pointCounter);
tria.setCoordinateIndex(i, pointCounter +
1);
tria.setNormalIndex(i++, pointCounter + 1);
tria.setCoordinateIndex(i, pointCounter +
tamX + 1);
tria.setNormalIndex(i++, pointCounter +
tamX + 1);
tria.setCoordinateIndex(i, pointCounter);
tria.setNormalIndex(i++, pointCounter);
tria.setCoordinateIndex(i, pointCounter +
tamX + 1);
tria.setNormalIndex(i++, pointCounter +
tamX + 1);
tria.setCoordinateIndex(i, pointCounter +
tamX);
tria.setNormalIndex(i++, pointCounter +
tamX);
tria.getCoordinate(pointCounter, p0);
tria.getCoordinate(pointCounter + 1, p1);
tria.getCoordinate(pointCounter + tamX +
1, p2);
tria.getCoordinate(pointCounter + tamX,
p3);
triNormals[triCounter++] = getNormal(p0,
p1, p2);
triNormals[triCounter++] = getNormal(p0,
p2, p3);
pointCounter++;
}
pointCounter++;
}
triCounter = pointCounter = 0;
int triOfsX[] = { 0, 1, -2, -1, -2, 1 };
int triOfsY[] =
{ 0, 0, 0, -2 * tamX + 2, -2 * tamX + 2, -2 * tamX
+ 2 };
for (int y = 0; y < tamY; y++) {
for (int x = 0; x < tamX; x++) {
Vector3f normal = new Vector3f(0f, 0f, 0f);
int div = 0;
for (int t = 0; t < 6; t++) {
if (triOfsX[t] < 0 && x == 0)
continue;
if (triOfsX[t] >= 0 && x == tamX -
1)
continue;
if (triOfsY[t] < 0 && y == 0)
continue;
if (triOfsY[t] >= 0 && y == tamY -
1)
continue;
normal.add(triNormals[triCounter +
triOfsX[t] + triOfsY[t]]);
div++;
}
normal.scale(1f / ((float) div));
normal.normalize();
tria.setNormal(pointCounter, normal);
triCounter += 2;
pointCounter++;
}
triCounter -= 2;
}
setGeometry(tria);
}
}
Thanks
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".