home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Late Night VRML 2.0 with Java CD-ROM
/
code.zip
/
Ch12
/
VrmlScene.java
< prev
next >
Wrap
Text File
|
1997-01-05
|
12KB
|
493 lines
// VRML Generator
// (c) Justin Couch
//
// From Chapter 13: Late Night VRML 2.0 and Java
//
// The class that contains all the information about the VRML scene.
// information is kept as tree structure identical to the VRML tree that it
// represents.
//
// The top level data is stored in a Vector that is created in the
import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
import vrml.external.Browser;
import VrmlTypes;
import ui.VrmlTree;
import ui.OutputWindow;
import geometry.*;
import exceptions.NoSelectedNodeException;
public class VrmlScene
{
private VrmlTree screen_list;
private VrmlRoot file_root;
private OutputWindow vrml_output;
public VrmlScene(OutputWindow vo)
{
vrml_output = vo;
// now we need to get the root node from the VRML browser that
// we will be adding this stuff to.
file_root = new VrmlRoot();
}
// The kludge method to deal with the static getBrowser method not working
public VrmlScene(OutputWindow vo, Browser b)
{
vrml_output = vo;
// now we need to get the root node from the VRML browser that
// we will be adding this stuff to.
file_root = new VrmlRoot(b);
}
// called to complete the setup of the system. This is called by
// the EditWindow.
public void setScreenHandler(VrmlTree screen)
{
screen_list = screen;
screen_list.setVrmlRoot(file_root);
}
// destructor, force clean up of data
public void finalize()
{
screen_list = null;
file_root = null;
}
// This is for when it prints directly to the text area.
public void writeToFile()
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
file_root.writeToFile(ps);
vrml_output.setContents(os.toString());
try
{
ps.close();
os.close();
}
catch(IOException e)
{
System.out.println("Error closing output streams");
}
}
public void writeToFile(String name)
{
PrintStream fp = null;
// open a file and write to it here.
if(fp != null)
file_root.writeToFile(fp);
}
public void addNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
if(node_type <= VrmlTypes.Switch)
addGroupingNode(node_type, node);
else if(node_type <= VrmlTypes.WorldInfo)
addCommonNode(node_type, node);
else if(node_type <= VrmlTypes.VisibilitySensor)
addSensorNode(node_type, node);
else if(node_type <= VrmlTypes.Text)
addGeometryNode(node_type, node);
else if(node_type <= VrmlTypes.TextureCoordinate)
addGeoPropertyNode(node_type, node);
else if(node_type <= VrmlTypes.TextureTransform)
addAppearanceNode(node_type, node);
else if(node_type <= VrmlTypes.ScalarInterpolator)
addInterpolatorNode(node_type, node);
else
addBindableNode(node_type, node);
}
private void addGroupingNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
// Grouping Nodes
case VrmlTypes.Anchor:
node_name = "Anchor";
break;
case VrmlTypes.BillBoard:
node_name = "Billboard";
break;
case VrmlTypes.Collision:
node_name = "Collision";
break;
case VrmlTypes.Group:
node_name = "Group";
break;
case VrmlTypes.Transform:
node_name = "Transform";
break;
// Special Groups
case VrmlTypes.Inline:
node_name = "Inline";
break;
case VrmlTypes.LOD:
node_name = "LOD";
break;
case VrmlTypes.Switch:
node_name = "Switch";
break;
default:
}
// does this screen add need to be here?
screen_list.addNode(node, node_type, node_name);
((GroupingNode)parent).addChildren(node);
}
private void addCommonNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
// Common Nodes
case VrmlTypes.AudioClip:
node_name = "AudioClip";
break;
case VrmlTypes.DirectionalLight:
node_name = "DirectionalLight";
break;
case VrmlTypes.PointLight:
node_name = "PointLight";
break;
case VrmlTypes.Script:
node_name = "Script";
break;
case VrmlTypes.Shape:
node_name = "Shape";
break;
case VrmlTypes.Sound:
node_name = "Sound";
break;
case VrmlTypes.SpotLight:
node_name = "Spotlight";
break;
case VrmlTypes.WorldInfo:
node_name = "WorldInfo";
break;
default:
}
screen_list.addNode(node, node_type, node_name);
((GroupingNode)parent).addChildren(node);
}
private void addSensorNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
case VrmlTypes.CylinderSensor:
node_name = "CylinderSensor";
break;
case VrmlTypes.PlaneSensor:
node_name = "PlaneSensor";
break;
case VrmlTypes.ProximitySensor:
node_name = "ProximitySensor";
break;
case VrmlTypes.SphereSensor:
node_name = "SphereSensor";
break;
case VrmlTypes.TimeSensor:
node_name = "TimeSensor";
break;
case VrmlTypes.TouchSensor:
node_name = "TouchSensor";
break;
case VrmlTypes.VisibilitySensor:
node_name = "VisibilitySensor";
break;
default:
}
}
private void addGeometryNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
// Geometry
case VrmlTypes.Box:
node_name = "Box";
break;
case VrmlTypes.Cone:
node_name = "Cone";
break;
case VrmlTypes.Cylinder:
node_name = "Cylinder";
break;
case VrmlTypes.ElevationGrid:
node_name = "ElevationGrid";
break;
case VrmlTypes.Extrusion:
node_name = "Extrusion";
break;
case VrmlTypes.IndexedFaceSet:
node_name = "IndexedFaceSet";
break;
case VrmlTypes.IndexedLineSet:
node_name = "IndexedLineSet";
break;
case VrmlTypes.PointSet:
node_name = "PointSet";
break;
case VrmlTypes.Sphere:
node_name = "Sphere";
break;
case VrmlTypes.Text:
node_name = "Text";
break;
default:
}
screen_list.addNode(node, node_type, node_name);
((Shape)parent).set_geometry((Geometry)node);
}
private void addGeoPropertyNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
// this is not a correct test for the geometric properties below.
// need to fix this.
if(!(parent instanceof Geometry))
{
System.out.println("Error not a piece of geometry for a parent");
return;
}
switch(node_type)
{
// Geometric Properties
case VrmlTypes.Color:
node_name = "Color";
// screen_list.addNode(node, node_name);
// ((IndexedNode)parent).set_color(node);
break;
case VrmlTypes.Coordinate:
node_name = "Coordinate";
// screen_list.addNode(node, node_name);
// ((IndexedNode)parent).set_coord(node);
break;
case VrmlTypes.Normal:
node_name = "Normal";
// screen_list.addNode(node, node_name);
// ((IndexedNode)parent).set_normal(node);
break;
case VrmlTypes.TextureCoordinate:
node_name = "TextureCoordinate";
// screen_list.addNode(node, node_name);
// ((IndexedNode)parent).set_textureCoord(node);
break;
default:
}
}
private void addAppearanceNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
// Appearance
case VrmlTypes.Appearance:
node_name = "Appearance";
screen_list.addNode(node, VrmlTypes.Appearance, node_name);
((Shape)parent).set_appearance((Appearance)node);
break;
case VrmlTypes.FontStyle:
node_name = "FontStyle";
break;
case VrmlTypes.ImageTexture:
node_name = "ImageTexture";
screen_list.addNode(node,
VrmlTypes.ImageTexture,
node_name);
((Appearance)parent).set_texture((Texture)node);
break;
case VrmlTypes.Material:
node_name = "Material";
screen_list.addNode(node,
VrmlTypes.Material,
node_name);
((Appearance)parent).set_material((Material)node);
break;
case VrmlTypes.MovieTexture:
node_name = "MovieTexture";
screen_list.addNode(node,
VrmlTypes.MovieTexture,
node_name);
((Appearance)parent).set_texture((Texture)node);
break;
case VrmlTypes.PixelTexture:
node_name = "PixelTexture";
screen_list.addNode(node,
VrmlTypes.PixelTexture,
node_name);
((Appearance)parent).set_texture((Texture)node);
break;
case VrmlTypes.TextureTransform:
node_name = "TextureTransform";
screen_list.addNode(node,
VrmlTypes.TextureTransform,
node_name);
((Appearance)parent).set_textureTransform((TextureTransform)node);
break;
default:
}
}
private void addInterpolatorNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
case VrmlTypes.ColorInterpolator:
node_name = "ColorInterpolator";
break;
case VrmlTypes.CoordinateInterpolator:
node_name = "CoordinateInterpolator";
break;
case VrmlTypes.NormalInterpolator:
node_name = "NormalInterpolator";
break;
case VrmlTypes.OrientationInterpolator:
node_name = "OrientationInterpolator";
break;
case VrmlTypes.PositionInterpolator:
node_name = "PositionInterpolator";
break;
case VrmlTypes.ScalarInterpolator:
node_name = "ScalarInterpolator";
break;
default:
}
}
private void addBindableNode(int node_type, VrmlObject node)
throws NoSelectedNodeException
{
String node_name = null;
VrmlObject parent;
parent = screen_list.getVrmlParent();
switch(node_type)
{
// Bindable nodes
case VrmlTypes.BackGround:
node_name = "BackGround";
break;
case VrmlTypes.Fog:
node_name = "Fog";
break;
case VrmlTypes.NavigationInfo:
node_name = "NavigationInfo";
break;
case VrmlTypes.Viewpoint:
node_name = "Viewpoint";
break;
default:
}
}
public void deleteNode(int parent_type,
VrmlObject parent,
int child_type,
VrmlObject child)
{
// do the quickest and most common cases first: geometry and groups.
if(parent instanceof GroupingNode)
{
((GroupingNode)parent).removeChildren(child);
return;
}
if(child instanceof Geometry)
{
((Shape)parent).set_geometry(null);
return;
}
switch(child_type)
{
case VrmlTypes.Appearance:
((Shape)parent).set_appearance(null);
break;
case VrmlTypes.ImageTexture:
case VrmlTypes.MovieTexture:
case VrmlTypes.PixelTexture:
((Appearance)parent).set_texture(null);
break;
case VrmlTypes.TextureTransform:
((Appearance)parent).set_textureTransform(null);
break;
default:
System.out.println("Deleting node type not implemented yet");
}
}
public void deleteAll()
{
file_root = null;
file_root = new VrmlRoot();
screen_list.setVrmlRoot(file_root);
}
}