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".