You must transverse the scene graph and set the proper capability bit.
I have some code about Scene object transverse. Test,debug and change to meet
your needs.
Good Luck
Alessandro
//*************************************************
/**
* Transverse not compiled not live Scene, setting
* a CapabilityBit in all Shape3D in the Scene.
* CapabilityBit <b>can not</b> be ORed or XORed. Apply one by one, in
sucessive calls to this method.
* Valid CapabilityBit are:
* <pre>
* ALLOW_APPEARANCE_OVERRIDE_READ - Specifies that this node allows reading
its appearance override enable flag.
* ALLOW_APPEARANCE_OVERRIDE_WRITE - Specifies that this node allows writing
its appearance override enable flag.
* ALLOW_APPEARANCE_READ - Specifies that the node allows read access to its
appearance information.
* ALLOW_APPEARANCE_WRITE - Specifies that the node allows write access to its
appearance information.
* ALLOW_COLLISION_BOUNDS_READ - Specifies that the node allows reading its
collision Bounds
* ALLOW_COLLISION_BOUNDS_WRITE - Specifies the node allows writing its
collision Bounds
* ALLOW_GEOMETRY_READ - Specifies that the node allows read access to its
geometry information.
* ALLOW_GEOMETRY_WRITE - Specifies that the node allows write access to its
geometry information.
* </pre>
*
* @param scene A loaded scene graph, not live and not compiled
* @param capBit the capability bit to be set
*
* @throws
* CapabilityNotSetException - if the capaility is not one of the above
list
**/
public void setCapabilityBitToShape3D(Scene scene, int capBit)
{
if (capBit != Shape3D.ALLOW_APPEARANCE_OVERRIDE_READ ||
capBit != Shape3D.ALLOW_APPEARANCE_OVERRIDE_WRITE ||
capBit != Shape3D.ALLOW_APPEARANCE_READ ||
capBit != Shape3D.ALLOW_APPEARANCE_WRITE||
capBit != Shape3D.ALLOW_COLLISION_BOUNDS_WRITE ||
capBit != Shape3D.ALLOW_COLLISION_BOUNDS_READ ||
capBit != Shape3D.ALLOW_GEOMETRY_READ ||
capBit != Shape3D.ALLOW_GEOMETRY_WRITE )
{
new CapabilityNotSetException("This is not a valid CapabilityBit value
for a
Shape3D");
}
Hashtable table=scene.getNamedObjects();
// bug - transverse the same node several times
Enumeration enum=table.elements();
while (enum.hasMoreElements())
{
Object item= (Object)enum.nextElement();
if (item instanceof Shape3D)
{
Shape3D shp= (Shape3D)item;
shp.setCapability(capBit);
}
else
if (item instanceof TransformGroup)
{
TransformGroup tgRoot= (TransformGroup)item;
Vector vec=new Vector();
getShape3D(vec, tgRoot);
Enumeration en = vec.elements();
while(en.hasMoreElements())
{
Shape3D shp = (Shape3D) en.nextElement();
shp.setCapability(capBit);
}
}
}
}
/**
* recursively takes all Shape 3D from a a TG
**/
private void getShape3D(Vector vec, TransformGroup tg)
{
Enumeration enum=tg.getAllChildren();
while (enum.hasMoreElements())
{
Object item= (Object)enum.nextElement();
if (item instanceof Shape3D)
{
vec.add(item);
}
else if (item instanceof TransformGroup)
{
TransformGroup temp= (TransformGroup)item;
getShape3D(vec, temp);
}
}
}
/**
* Transverse not compiled not live Scene, setting
* a CapabilityBit in all Geometry objects in the Scene.
* CapabilityBit <b>can not</b> be ORed or XORed.
* Apply one by one, in sucessive calls to this method.
*
* @param scene A loaded scene graph, not live and not compiled
* @param capBit the capability bit to be set
**/
public void setCapabilityBitToGeometries(Scene scene, int capBit)
{
if ()
{
new CapabilityNotSetException("This is not a valid CapabilityBit value
for
a Shape3D");
}
Hashtable table=scene.getNamedObjects();
// bug - transverse the same node several times
Enumeration enum=table.elements();
while (enum.hasMoreElements())
{
Object item= (Object)enum.nextElement();
if (item instanceof Shape3D)
{
Shape3D shp= (Shape3D)item;
for (Enumeration e = shp.getAllGeometries(); e.hasMoreElements(); )
{
((Geometry)e.nextElement()).setCapability(capBit);
}
}
else
if (item instanceof TransformGroup)
{
TransformGroup tgRoot= (TransformGroup)item;
Vector vec=new Vector();
getShape3D(vec, tgRoot);
Enumeration en = vec.elements();
while(en.hasMoreElements())
{
Shape3D shp = (Shape3D) en.nextElement();
for (Enumeration e = shp.getAllGeometries();
e.hasMoreElements(); )
{
((Geometry)e.nextElement()).setCapability(capBit);
}
}
}
}
}
// END CODE **********************************************************
--- Rolf Gabler-Mieck <[EMAIL PROTECTED]> escreveu:
Hi again,
there's another problem I got with geometry-picking....
I load geometry from an OBJ-File (some polygones...)
after the BranchGroup is filled up with the data from the file I'm doing
this:
public BranchGroup getLoadedFile(){
BranchGroup sceneRoot = new BranchGroup();
TransformGroup szeneScale = new TransformGroup();
sceneRoot.addChild(szeneScale);
TransformGroup szeneTrans = new TransformGroup();
szeneScale.addChild(szeneTrans);
//for all above read and write caps are set...
...load the obj-file...
Enumeration e=loadedBG.getAllChildren();
setS3dCaps(e);
szeneTrans.addChild(loadedBG);
return sceneRoot;
}
public void setS3dCaps(Enumeration e){
while(e.hasMoreElements()){
Object o = e.nextElement();
if (o instanceof Shape3D){
Shape3D S = (Shape3D) o;
S.setCapability(Geometry.ALLOW_INTERSECT);
}
if (o instanceof Group) {
Group g = (Group) o;
g.setCapability(Group.ALLOW_CHILDREN_WRITE); //could not be
needed ?
g.setCapability(Group.ALLOW_CHILDREN_READ); //could not be
needed ?
g.setCapability(Geometry.ALLOW_INTERSECT);
this.setS3dCaps(g.getAllChildren());
}
}
}
OK, then I add the loaded BG into my BranchGraph as a child of a BranchGroup
which has also my PickiningBehavior as a child.
The PickingBehavior know the "loaded BG" since the construction, where
pickCanvas.setMode(PickTool.GEOMETRY); is set.
when I click to the Geometry the capabilityNotSet Error hit me, that
Shape3D has no Capability of "allow intersect" but would not be
recognized....
if I generate some Text3D objects and
gave them
txt3d.setCapability(Geometry.ALLOW_INTERSECT);
and construct the PickingBehavior with the parent-BranchGroup of the text3D
instead of BG which is the loadedBG
all is working fine without any errors.....
has anybody an idea in how to solve this???
sad but true with the identical results...nothing is detectable...so if
anybody find any weirdness in this code
please let me know....
best regards
rolf
--
Rolf Gabler-Mieck
c/o
LGI-Geographisches Institut der CAU-Kiel
Ludewig-Meyen Str. 14
24098 Kiel
Tel: +49 431-880.2955
FAX: +49 431-880.4658
e-mail: [EMAIL PROTECTED]
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
===========================================================================
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".