diff options
Diffstat (limited to 'src/GeometryCompression')
-rw-r--r-- | src/GeometryCompression/ObjectFileCompressor.html | 437 | ||||
-rw-r--r-- | src/GeometryCompression/ObjectFileCompressor.java | 247 | ||||
-rw-r--r-- | src/GeometryCompression/README | 62 | ||||
-rw-r--r-- | src/GeometryCompression/build.xml | 66 | ||||
-rw-r--r-- | src/GeometryCompression/cgview.java | 212 | ||||
-rw-r--r-- | src/GeometryCompression/obj2cg.java | 71 |
6 files changed, 1095 insertions, 0 deletions
diff --git a/src/GeometryCompression/ObjectFileCompressor.html b/src/GeometryCompression/ObjectFileCompressor.html new file mode 100644 index 0000000..7540a8f --- /dev/null +++ b/src/GeometryCompression/ObjectFileCompressor.html @@ -0,0 +1,437 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd"> +<!--NewPage--> +<HTML> +<HEAD> +<!-- Generated by javadoc on Sat May 22 22:02:52 PDT 1999 --> +<TITLE> +: Class ObjectFileCompressor +</TITLE> +<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style"> +</HEAD> +<BODY BGCOLOR="white"> + +<!-- ========== START OF NAVBAR ========== --> +<A NAME="navbar_top"><!-- --></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0"> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_top_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3"> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT ID="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT ID="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT ID="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT ID="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> +</EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV CLASS + NEXT CLASS</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> + <A HREF="ObjectFileCompressor.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD> +</TR> +<TR> +<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> + SUMMARY: INNER | <A HREF="#fields_inherited_from_class_com.sun.j3d.loaders.objectfile.ObjectFile">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD> +<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> +DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD> +</TR> +</TABLE> +<!-- =========== END OF NAVBAR =========== --> + +<HR> +<!-- ======== START OF CLASS DATA ======== --> +<H2> +Class ObjectFileCompressor</H2> +<PRE> +java.lang.Object + | + +--com.sun.j3d.loaders.objectfile.ObjectFile + | + +--<B>ObjectFileCompressor</B> +</PRE> +<HR> +<DL> +<DT>public class <B>ObjectFileCompressor</B><DT>extends com.sun.j3d.loaders.objectfile.ObjectFile</DL> + +<P> +This extension of ObjectFile provides the methods setQuantization() and + compress() to compress Wavefront .obj files into the format described by + appendix B of the Java 3D specification. +<P> +<HR> + +<P> +<!-- ======== INNER CLASS SUMMARY ======== --> + + +<!-- =========== FIELD SUMMARY =========== --> + +<A NAME="fields_inherited_from_class_com.sun.j3d.loaders.objectfile.ObjectFile"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> +<TD><B>Fields inherited from class com.sun.j3d.loaders.objectfile.ObjectFile</B></TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE>RESIZE, +REVERSE, +STRIPIFY, +TRIANGULATE</CODE></TD> +</TR> +</TABLE> + +<!-- ======== CONSTRUCTOR SUMMARY ======== --> + +<A NAME="constructor_summary"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<TD COLSPAN=2><FONT SIZE="+2"> +<B>Constructor Summary</B></FONT></TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#ObjectFileCompressor()">ObjectFileCompressor</A></B>()</CODE> + +<BR> + </TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#ObjectFileCompressor(int)">ObjectFileCompressor</A></B>(int flags)</CODE> + +<BR> + </TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#ObjectFileCompressor(int, float)">ObjectFileCompressor</A></B>(int flags, + float radians)</CODE> + +<BR> + </TD> +</TR> +</TABLE> + +<!-- ========== METHOD SUMMARY =========== --> + +<A NAME="method_summary"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<TD COLSPAN=2><FONT SIZE="+2"> +<B>Method Summary</B></FONT></TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> javax.media.j3d.CompressedGeometry</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.io.Reader)">compress</A></B>(java.io.Reader reader)</CODE> + +<BR> + Compress the specified .obj file into a CompressedGeometry node + component.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> void</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.io.Reader, com.sun.j3d.utils.compression.CompressedGeometryFile)">compress</A></B>(java.io.Reader reader, + com.sun.j3d.utils.compression.CompressedGeometryFile file)</CODE> + +<BR> + Compress the specified .obj file and add it to the end of an open + compressed geometry file.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> javax.media.j3d.CompressedGeometry</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.lang.String)">compress</A></B>(java.lang.String objFileName)</CODE> + +<BR> + Compress the specified .obj file into a CompressedGeometry node + component.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> void</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.lang.String, com.sun.j3d.utils.compression.CompressedGeometryFile)">compress</A></B>(java.lang.String objFileName, + com.sun.j3d.utils.compression.CompressedGeometryFile file)</CODE> + +<BR> + Compress the specified .obj file and add it to the end of an open + compressed geometry file.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> javax.media.j3d.CompressedGeometry</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.net.URL)">compress</A></B>(java.net.URL url)</CODE> + +<BR> + Compress the specified .obj file into a CompressedGeometry node + component.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> void</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#compress(java.net.URL, com.sun.j3d.utils.compression.CompressedGeometryFile)">compress</A></B>(java.net.URL url, + com.sun.j3d.utils.compression.CompressedGeometryFile file)</CODE> + +<BR> + Compress the specified .obj file and add it to the end of an open + compressed geometry file.</TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> void</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#setFlags(int)">setFlags</A></B>(int flags)</CODE> + +<BR> + </TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"> +<CODE> void</CODE></FONT></TD> +<TD><CODE><B><A HREF="ObjectFileCompressor.html#setQuantization(int, int, int)">setQuantization</A></B>(int positionQuant, + int colorQuant, + int normalQuant)</CODE> + +<BR> + Set the position, normal, and color quantization values for compression.</TD> +</TR> +</TABLE> + <A NAME="methods_inherited_from_class_com.sun.j3d.loaders.objectfile.ObjectFile"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> +<TD><B>Methods inherited from class com.sun.j3d.loaders.objectfile.ObjectFile</B></TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE>getBasePath, +getBaseUrl, +getFlags, +load, +load, +load, +setBasePath, +setBaseUrl</CODE></TD> +</TR> +</TABLE> + <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"> +<TD><B>Methods inherited from class java.lang.Object</B></TD> +</TR> +<TR BGCOLOR="white" CLASS="TableRowColor"> +<TD><CODE>clone, +equals, +finalize, +getClass, +hashCode, +notify, +notifyAll, +toString, +wait, +wait, +wait</CODE></TD> +</TR> +</TABLE> + +<P> + +<!-- ============ FIELD DETAIL =========== --> + + +<!-- ========= CONSTRUCTOR DETAIL ======== --> + +<A NAME="constructor_detail"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<TD COLSPAN=1><FONT SIZE="+2"> +<B>Constructor Detail</B></FONT></TD> +</TR> +</TABLE> + +<A NAME="ObjectFileCompressor()"><!-- --></A><H3> +ObjectFileCompressor</H3> +<PRE> +public <B>ObjectFileCompressor</B>()</PRE> +<DL> +</DL> +<HR> + +<A NAME="ObjectFileCompressor(int)"><!-- --></A><H3> +ObjectFileCompressor</H3> +<PRE> +public <B>ObjectFileCompressor</B>(int flags)</PRE> +<DL> +</DL> +<HR> + +<A NAME="ObjectFileCompressor(int, float)"><!-- --></A><H3> +ObjectFileCompressor</H3> +<PRE> +public <B>ObjectFileCompressor</B>(int flags, + float radians)</PRE> +<DL> +</DL> + +<!-- ============ METHOD DETAIL ========== --> + +<A NAME="method_detail"><!-- --></A> +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<TD COLSPAN=1><FONT SIZE="+2"> +<B>Method Detail</B></FONT></TD> +</TR> +</TABLE> + +<A NAME="setFlags(int)"><!-- --></A><H3> +setFlags</H3> +<PRE> +public void <B>setFlags</B>(int flags)</PRE> +<DL> +<DD><DL> +<DT><B>Overrides:</B><DD>setFlags in class com.sun.j3d.loaders.objectfile.ObjectFile</DL> +</DD> +</DL> +<HR> + +<A NAME="setQuantization(int, int, int)"><!-- --></A><H3> +setQuantization</H3> +<PRE> +public void <B>setQuantization</B>(int positionQuant, + int colorQuant, + int normalQuant)</PRE> +<DL> +<DD>Set the position, normal, and color quantization values for compression.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>positionQuant</CODE> - number of bits to quantize each position's X, Y, + and Z components, ranging from 1 to 16 with a default of 10<DD><CODE>colorQuant</CODE> - number of bits to quantize each color's R, G, B, and + alpha components, ranging from 2 to 16 with a default of 8<DD><CODE>normalQuant</CODE> - number of bits for quantizing each normal's U and V + components, ranging from 0 to 6 with a default of 3</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.lang.String)"><!-- --></A><H3> +compress</H3> +<PRE> +public javax.media.j3d.CompressedGeometry <B>compress</B>(java.lang.String objFileName)</PRE> +<DL> +<DD>Compress the specified .obj file into a CompressedGeometry node + component.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>objFileName</CODE> - String object representing the path to a .obj file<DT><B>Returns:</B><DD>a CompressedGeometry node component</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.lang.String, com.sun.j3d.utils.compression.CompressedGeometryFile)"><!-- --></A><H3> +compress</H3> +<PRE> +public void <B>compress</B>(java.lang.String objFileName, + com.sun.j3d.utils.compression.CompressedGeometryFile file) + throws java.io.IOException</PRE> +<DL> +<DD>Compress the specified .obj file and add it to the end of an open + compressed geometry file.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>objFileName</CODE> - String object representing the path to a .obj file<DD><CODE>file</CODE> - a currently open CompressedGeometryFile object<DT><B>Throws:</B><DD>java.io.IOException - - if write fails</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.io.Reader)"><!-- --></A><H3> +compress</H3> +<PRE> +public javax.media.j3d.CompressedGeometry <B>compress</B>(java.io.Reader reader)</PRE> +<DL> +<DD>Compress the specified .obj file into a CompressedGeometry node + component.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>reader</CODE> - an open .obj file<DT><B>Returns:</B><DD>a CompressedGeometry node component</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.io.Reader, com.sun.j3d.utils.compression.CompressedGeometryFile)"><!-- --></A><H3> +compress</H3> +<PRE> +public void <B>compress</B>(java.io.Reader reader, + com.sun.j3d.utils.compression.CompressedGeometryFile file) + throws java.io.IOException</PRE> +<DL> +<DD>Compress the specified .obj file and add it to the end of an open + compressed geometry file.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>reader</CODE> - an open .obj file<DD><CODE>file</CODE> - an open CompressedGeometryFile object<DT><B>Throws:</B><DD>java.io.IOException - - if write fails</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.net.URL)"><!-- --></A><H3> +compress</H3> +<PRE> +public javax.media.j3d.CompressedGeometry <B>compress</B>(java.net.URL url)</PRE> +<DL> +<DD>Compress the specified .obj file into a CompressedGeometry node + component.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>url</CODE> - Uniform Resource Locator for the .obj file<DT><B>Returns:</B><DD>a CompressedGeometry node component</DL> +</DD> +</DL> +<HR> + +<A NAME="compress(java.net.URL, com.sun.j3d.utils.compression.CompressedGeometryFile)"><!-- --></A><H3> +compress</H3> +<PRE> +public void <B>compress</B>(java.net.URL url, + com.sun.j3d.utils.compression.CompressedGeometryFile file) + throws java.io.IOException</PRE> +<DL> +<DD>Compress the specified .obj file and add it to the end of an open + compressed geometry file.<DD><DL> +<DT><B>Parameters:</B><DD><CODE>url</CODE> - Uniform Resource Locator for the .obj file<DD><CODE>file</CODE> - a currently open CompressedGeometryFile object<DT><B>Throws:</B><DD>java.io.IOException - - if write fails</DL> +</DD> +</DL> +<!-- ========= END OF CLASS DATA ========= --> +<HR> + +<!-- ========== START OF NAVBAR ========== --> +<A NAME="navbar_bottom"><!-- --></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0"> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_bottom_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3"> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT ID="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT ID="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT ID="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT ID="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> +</EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV CLASS + NEXT CLASS</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> + <A HREF="ObjectFileCompressor.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD> +</TR> +<TR> +<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> + SUMMARY: INNER | <A HREF="#fields_inherited_from_class_com.sun.j3d.loaders.objectfile.ObjectFile">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD> +<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> +DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD> +</TR> +</TABLE> +<!-- =========== END OF NAVBAR =========== --> + +<HR> + +</BODY> +</HTML> diff --git a/src/GeometryCompression/ObjectFileCompressor.java b/src/GeometryCompression/ObjectFileCompressor.java new file mode 100644 index 0000000..d889ead --- /dev/null +++ b/src/GeometryCompression/ObjectFileCompressor.java @@ -0,0 +1,247 @@ +/* + * $RCSfile$ + * + * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL + * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF + * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR + * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or + * intended for use in the design, construction, operation or + * maintenance of any nuclear facility. + * + * $Revision$ + * $Date$ + * $State$ + */ + +import com.sun.j3d.utils.compression.* ; +import com.sun.j3d.loaders.objectfile.ObjectFile ; +import com.sun.j3d.loaders.ParsingErrorException ; +import com.sun.j3d.loaders.IncorrectFormatException ; +import com.sun.j3d.loaders.Scene ; +import javax.media.j3d.* ; +import java.util.* ; +import java.net.* ; +import java.io.* ; + +/** + * This extension of ObjectFile provides the methods setQuantization() and + * compress() to compress Wavefront .obj files into the format described by + * appendix B of the Java 3D specification. + */ +public class ObjectFileCompressor extends ObjectFile { + private GeometryCompressor compressor = null ; + + public ObjectFileCompressor() { + super(STRIPIFY | TRIANGULATE) ; + compressor = new GeometryCompressor() ; + } + + public ObjectFileCompressor(int flags) { + super(flags | STRIPIFY | TRIANGULATE) ; + compressor = new GeometryCompressor() ; + } + + public ObjectFileCompressor(int flags, float radians) { + super(flags | STRIPIFY | TRIANGULATE, radians) ; + compressor = new GeometryCompressor() ; + } + + public void setFlags(int flags) { + super.setFlags(flags | STRIPIFY | TRIANGULATE) ; + } + + private int positionQuant = 10 ; + private int colorQuant = 8 ; + private int normalQuant = 3 ; + + /** + * Set the position, normal, and color quantization values for compression. + * @param positionQuant number of bits to quantize each position's X, Y, + * and Z components, ranging from 1 to 16 with a default of 10 + * @param colorQuant number of bits to quantize each color's R, G, B, and + * alpha components, ranging from 2 to 16 with a default of 8 + * @param normalQuant number of bits for quantizing each normal's U and V + * components, ranging from 0 to 6 with a default of 3 + */ + public void setQuantization(int positionQuant, + int colorQuant, + int normalQuant) { + + this.positionQuant = positionQuant ; + this.colorQuant = colorQuant ; + this.normalQuant = normalQuant ; + } + + /** + * Compress the specified .obj file into a CompressedGeometry node + * component. + * @param objFileName String object representing the path to a .obj file + * @return a CompressedGeometry node component + */ + public CompressedGeometry compress(String objFileName) { + return compressScene(getScene(objFileName)) ; + } + + /** + * Compress the specified .obj file and add it to the end of an open + * compressed geometry file. + * @param objFileName String object representing the path to a .obj file + * @param file a currently open CompressedGeometryFile object + * @exception IOException - if write fails + */ + public void compress(String objFileName, CompressedGeometryFile file) + throws IOException { + compressScene(getScene(objFileName), file) ; + } + + /** + * Compress the specified .obj file into a CompressedGeometry node + * component. + * @param reader an open .obj file + * @return a CompressedGeometry node component + */ + public CompressedGeometry compress(Reader reader) { + return compressScene(getScene(reader)) ; + } + + /** + * Compress the specified .obj file and add it to the end of an open + * compressed geometry file. + * @param reader an open .obj file + * @param file an open CompressedGeometryFile object + * @exception IOException - if write fails + */ + public void compress(Reader reader, CompressedGeometryFile file) + throws IOException { + compressScene(getScene(reader), file) ; + } + + /** + * Compress the specified .obj file into a CompressedGeometry node + * component. + * @param url Uniform Resource Locator for the .obj file + * @return a CompressedGeometry node component + */ + public CompressedGeometry compress(URL url) { + return compressScene(getScene(url)) ; + } + + /** + * Compress the specified .obj file and add it to the end of an open + * compressed geometry file. + * @param url Uniform Resource Locator for the .obj file + * @param file a currently open CompressedGeometryFile object + * @exception IOException - if write fails + */ + public void compress(URL url, CompressedGeometryFile file) + throws IOException { + compressScene(getScene(url), file) ; + } + + private CompressedGeometry compressScene(Scene scene) { + return compressor.compress(getStream(scene)) ; + } + + private void compressScene(Scene scene, CompressedGeometryFile file) + throws IOException { + compressor.compress(getStream(scene), file) ; + } + + private CompressionStream getStream(Scene scene) { + Hashtable objs = scene.getNamedObjects() ; + Shape3D shapes[] = new Shape3D[objs.size()] ; + + objs.values().toArray(shapes) ; + return new CompressionStream(positionQuant, colorQuant, normalQuant, + shapes) ; + } + + private Scene getScene(String objFileName) { + Scene scene = null ; + try { + scene = load(objFileName) ; + } + catch (FileNotFoundException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (ParsingErrorException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (IncorrectFormatException e) { + System.err.println(e) ; + System.exit(1) ; + } + return scene ; + } + + private Scene getScene(Reader reader) { + Scene scene = null ; + try { + scene = load(reader) ; + } + catch (FileNotFoundException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (ParsingErrorException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (IncorrectFormatException e) { + System.err.println(e) ; + System.exit(1) ; + } + return scene ; + } + + private Scene getScene(URL url) { + Scene scene = null ; + try { + scene = load(url) ; + } + catch (FileNotFoundException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (ParsingErrorException e) { + System.err.println(e) ; + System.exit(1) ; + } + catch (IncorrectFormatException e) { + System.err.println(e) ; + System.exit(1) ; + } + return scene ; + } +} diff --git a/src/GeometryCompression/README b/src/GeometryCompression/README new file mode 100644 index 0000000..23611dc --- /dev/null +++ b/src/GeometryCompression/README @@ -0,0 +1,62 @@ +/* + * @(#)README 1.4 01/06/20 16:18:13 + * + * Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES + * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN + * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR + * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF + * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that Software is not designed,licensed or intended + * for use in the design, construction, operation or maintenance of + * any nuclear facility. + */ + +This directory contains example code for using compressed geometry in +Java 3D through the com.sun.j3d.utils.compression package. + +Applications: + + obj2cg -- takes the names of .obj files to compress followed by the name + of a .cg compressed geometry resource file. If the .cg file + doesn't exist, then an attempt is made to create it; otherwise, + new compressed geometry objects are appended to the end. + + The .obj files are compressed and stored into the .cg file in + the order in which they appear in the command line, and can be + accessed through indices [0 .. fileCount-1] + + cgview -- takes the name of a .cg file and the index of the object to + display, which can range from [0 .. objectCount-1]. The object + may rotated, scaled, and translated in response to mouse drags. + + +Utility classes: + + ObjectFileCompressor.java -- + Extends ObjectFile with compression methods. diff --git a/src/GeometryCompression/build.xml b/src/GeometryCompression/build.xml new file mode 100644 index 0000000..cbf53a8 --- /dev/null +++ b/src/GeometryCompression/build.xml @@ -0,0 +1,66 @@ +<?xml version="1.0"?> + +<!-- +/* + * $RCSfile$ + * + * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL + * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF + * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR + * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or + * intended for use in the design, construction, operation or + * maintenance of any nuclear facility. + * + * $Revision$ + * $Date$ + * $State$ + */ + --> + +<project basedir="." default="compile"> + <target name="compile"> + <javac debug="true" deprecation="true" destdir="." srcdir="."> + </javac> + </target> + + <target name="all" depends="compile"> + </target> + + <target description="Clean all build products." name="clean"> + <delete> + <fileset dir="."> + <include name="**/*.class"/> + </fileset> + </delete> + </target> + +</project> diff --git a/src/GeometryCompression/cgview.java b/src/GeometryCompression/cgview.java new file mode 100644 index 0000000..7ec319f --- /dev/null +++ b/src/GeometryCompression/cgview.java @@ -0,0 +1,212 @@ +/* + * $RCSfile$ + * + * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL + * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF + * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR + * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or + * intended for use in the design, construction, operation or + * maintenance of any nuclear facility. + * + * $Revision$ + * $Date$ + * $State$ + */ + +import com.sun.j3d.utils.compression.* ; +import com.sun.j3d.utils.behaviors.vp.* ; +import com.sun.j3d.utils.applet.MainFrame ; +import com.sun.j3d.utils.universe.* ; +import javax.media.j3d.* ; +import javax.vecmath.* ; +import java.applet.Applet ; +import java.awt.BorderLayout ; +import java.awt.event.* ; +import java.io.* ; + +public class cgview extends Applet { + + private SimpleUniverse u = null; + + public BranchGroup createSceneGraph(CompressedGeometry cg) { + // Create the root of the branch graph + BranchGroup objRoot = new BranchGroup() ; + + // Create a Transformgroup to scale all objects so they + // appear in the scene. + TransformGroup objScale = new TransformGroup() ; + Transform3D t3d = new Transform3D() ; + t3d.setScale(0.7) ; + objScale.setTransform(t3d) ; + objRoot.addChild(objScale) ; + + // Create the transform group node and initialize it to the + // identity. Enable the TRANSFORM_WRITE capability so that + // our behavior code can modify it at runtime. Add it to the + // root of the subgraph. + TransformGroup objTrans = new TransformGroup() ; + objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE) ; + objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ) ; + objScale.addChild(objTrans) ; + + // Add compressed geometry to the scene graph. + CompressedGeometryHeader hdr = new CompressedGeometryHeader() ; + cg.getCompressedGeometryHeader(hdr) ; + + // There isn't really enough information in the compressed geometry + // header to unamiguously determine the proper rendering attributes. + // The bufferDataPresent field specifies whether or not normals are + // bundled with vertices, but the compressed buffer can still contain + // normals that should be lit. Assume that any surface geometry + // should be lit and that lines and points should not unless the + // header contains the NORMAL_IN_BUFFER bit. + Material m = new Material() ; + if ((hdr.bufferType == hdr.TRIANGLE_BUFFER) || + ((hdr.bufferDataPresent & hdr.NORMAL_IN_BUFFER) == 1)) + m.setLightingEnable(true) ; + else + m.setLightingEnable(false) ; + + Appearance a = new Appearance() ; + a.setMaterial(m) ; + + objTrans.addChild(new Shape3D(cg, a)) ; + + // Create mouse behavior scheduling bounds. + BoundingSphere bounds = + new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0) ; + + // Set up the background + Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f); + Background bgNode = new Background(bgColor) ; + bgNode.setApplicationBounds(bounds) ; + objRoot.addChild(bgNode) ; + + // Set up the ambient light + Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f) ; + AmbientLight ambientLightNode = new AmbientLight(ambientColor) ; + ambientLightNode.setInfluencingBounds(bounds) ; + objRoot.addChild(ambientLightNode) ; + + // Set up the directional lights + Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f) ; + Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f) ; + Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f) ; + Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -0.9f) ; + + DirectionalLight light1 + = new DirectionalLight(light1Color, light1Direction) ; + light1.setInfluencingBounds(bounds) ; + objRoot.addChild(light1) ; + + DirectionalLight light2 + = new DirectionalLight(light2Color, light2Direction) ; + light2.setInfluencingBounds(bounds) ; + objRoot.addChild(light2) ; + + return objRoot ; + } + + private void usage() { + System.out.println("Usage: cgview <.cg file> <object index>") ; + System.exit(0) ; + } + + public cgview(String args[]) { + if (args.length < 1) + usage() ; + + int index ; + if (args.length < 2) + index = 0 ; + else + index = Integer.parseInt(args[1]) ; + + String filename = args[0] ; + if (filename == null) + usage() ; + + // Read the compressed geometry. + CompressedGeometry cg = null ; + try { + CompressedGeometryFile cgf ; + cgf = new CompressedGeometryFile(filename, false) ; + + if (cgf.getObjectCount() == 0) { + System.out.println("no objects were found in " + filename) ; + System.exit(0) ; + } + + cg = cgf.read(index) ; + cgf.close() ; + + } catch (IOException e) { + System.out.println(e) ; + System.exit(0) ; + } + + setLayout(new BorderLayout()) ; + Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); + add("Center", c) ; + + // Create a simple scene and attach it to the virtual universe + BranchGroup scene = createSceneGraph(cg) ; + u = new SimpleUniverse(c) ; + + // add mouse behaviors to the ViewingPlatform + ViewingPlatform viewingPlatform = u.getViewingPlatform(); + + // This will move the ViewPlatform back a bit so the + // objects in the scene can be viewed. + viewingPlatform.setNominalViewingTransform(); + + OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL); + BoundingSphere bounds = + new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); + orbit.setSchedulingBounds(bounds); + viewingPlatform.setViewPlatformBehavior(orbit); + + u.addBranchGraph(scene) ; + } + + public void destroy() { + u.cleanup(); + } + + // + // The following allows cgview to be run as an application + // as well as an applet. + // + public static void main(String[] args) { + new MainFrame(new cgview(args), 700, 700) ; + } +} diff --git a/src/GeometryCompression/obj2cg.java b/src/GeometryCompression/obj2cg.java new file mode 100644 index 0000000..5aac88c --- /dev/null +++ b/src/GeometryCompression/obj2cg.java @@ -0,0 +1,71 @@ +/* + * $RCSfile$ + * + * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any + * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL + * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF + * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR + * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or + * intended for use in the design, construction, operation or + * maintenance of any nuclear facility. + * + * $Revision$ + * $Date$ + * $State$ + */ + +import com.sun.j3d.utils.compression.* ; +import javax.media.j3d.* ; +import java.io.* ; + +class obj2cg { + + public static void main(String args[]) throws IOException { + if (args.length < 2) { + System.out.println + ("obj2cg wants the names of .obj files to compress,\n" + + "followed by the name of a .cg file to create or to\n" + + "which to append.") ; + System.exit(0) ; + } + + CompressedGeometryFile file ; + file = new CompressedGeometryFile(args[args.length-1], true) ; + + ObjectFileCompressor compressor ; + compressor = new ObjectFileCompressor() ; + + for (int i = 0 ; i < args.length-1 ; i++) + compressor.compress(args[i], file) ; + + file.close() ; + } +} |