Hi !

I'm using jdk 1.3.0beta_refresh on linux, blackdown java3d 1.2.
In my application I'm trying to change the view. But after doing so, the
following exception occurs :

# # An unexpected exception has been detected in native code outside the
VM.# Program counter=0x48d0f31f
#
# Problematic Thread: prio=1 tid=0x8226070 nid=0xdb5 runnable
#
(it IS formatted this way).

This in none of my threads, so I guess it's the rendering thread running
into problems.

I have attached a little sample program, that reproduces this bug (on my
machine). Can anybody please test this code and
tell me if this is platform/blackdown specific ?

Is anything wrong with my code ? Perhaps this is just some missing check
for developer sanity in java3d ? ;)

thanks,
  Niklas
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.GraphicsConfigTemplate3D;
import javax.media.j3d.Group;
import javax.media.j3d.Locale;
import javax.media.j3d.PhysicalBody;
import javax.media.j3d.PhysicalEnvironment;
import javax.media.j3d.View;
import javax.media.j3d.ViewPlatform;
import javax.media.j3d.VirtualUniverse;

import javax.swing.JWindow;

public class Test {

  public void run() {
    GraphicsConfigTemplate3D tmpl = new GraphicsConfigTemplate3D();
    GraphicsEnvironment env       = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice device         = env.getDefaultScreenDevice();
    GraphicsConfiguration config  = device.getBestConfiguration(tmpl);
    Canvas3D canvas3d = new Canvas3D(config);
    VirtualUniverse vr = new VirtualUniverse();
    BranchGroup world_object_group = new BranchGroup();
    world_object_group.setCapability(Group.ALLOW_CHILDREN_READ);
    world_object_group.setCapability(Group.ALLOW_CHILDREN_WRITE);
    world_object_group.setCapability(Group.ALLOW_CHILDREN_EXTEND);

    Locale locale = new Locale(vr);
    locale.addBranchGraph(world_object_group);

    MyWorld world1 = new MyWorld();
    MyWorld world2 = new MyWorld();

    JWindow window = new JWindow();
    window.getContentPane().add(canvas3d);
    window.pack();
    window.validate();
    window.setSize(new Dimension(400, 400));
    window.show();

    View view1 =  world1.getView();
    BranchGroup worldGroup1 = world1.getWorldObjects();

    world_object_group.addChild(worldGroup1);
    view1.addCanvas3D(canvas3d);
    System.out.println("Added first world");

    synchronized(this) {
      try {wait(10000);} catch (Exception e) {e.printStackTrace();}
    }

    View view2 =  world1.getView();
    BranchGroup worldGroup2 = world1.getWorldObjects();

    view1.removeCanvas3D(canvas3d);
    world_object_group.removeChild(0);

    world_object_group.addChild(worldGroup2);
    view2.addCanvas3D(canvas3d);
    System.out.println("Added second world");
  }

  public static void main(String[] args) {
    new Test().run();
  }

  private class MyWorld {
    View view;
    BranchGroup worldobjects;

    public MyWorld() {
      view     = new View();
      ViewPlatform platform = new ViewPlatform();
      PhysicalBody body     = new PhysicalBody();
      PhysicalEnvironment env      = new PhysicalEnvironment();
      view.attachViewPlatform(platform);
      view.setPhysicalBody(body);
      view.setPhysicalEnvironment(env);
      worldobjects = new BranchGroup();
      worldobjects.setCapability(BranchGroup.ALLOW_DETACH);
      worldobjects.addChild(platform);
    }

    public View getView() {
      return view;
    }

    public BranchGroup getWorldObjects() {
      return worldobjects;
    }
  }
}

Reply via email to