001: /*
002: * $RCSfile: PolylistProcessor.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.1 $
041: * $Date: 2007/08/28 16:44:33 $
042: * $State: Exp $
043: */
044:
045: package org.jdesktop.j3d.loaders.collada.xml_walker;
046:
047: import java.math.BigInteger;
048: import java.util.ArrayList;
049: import java.util.List;
050: import java.util.logging.Logger;
051: import javax.vecmath.Point3f;
052: import javax.vecmath.Vector3f;
053: import org.collada.colladaschema.InputLocalOffset;
054: import org.collada.colladaschema.Polylist;
055:
056: /**
057: *
058: * @author paulby
059: */
060: public class PolylistProcessor extends Processor {
061:
062: private Logger logger = Logger.getLogger("collada.processor");
063:
064: private int[] vertexCount = null;
065: private int[] prim = null;
066:
067: private ArrayList<Point3f> vertices = null;
068: private ArrayList<Vector3f> normals = null;
069:
070: /** Creates a new instance of PolylistProcessor */
071: public PolylistProcessor(Polylist polylist, Processor parent) {
072: super (polylist, parent);
073: logger.info("Polylist " + polylist.getName());
074:
075: List<InputLocalOffset> inputs = polylist.getInputs();
076: List<BigInteger> vcountList = polylist.getVcount();
077: List<BigInteger> pList = polylist.getP();
078:
079: if (vcountList != null) {
080: vertexCount = new int[vcountList.size()];
081: int i = 0;
082: for (BigInteger vcount : vcountList)
083: vertexCount[i++] = vcount.intValue();
084: }
085:
086: if (pList != null) {
087: prim = new int[pList.size()];
088: int i = 0;
089: for (BigInteger p : pList)
090: prim[i++] = p.intValue();
091: }
092:
093: int maxOffset = 0;
094: for (InputLocalOffset in : inputs) {
095: maxOffset = Math.max(in.getOffset().intValue(), maxOffset);
096: }
097:
098: for (InputLocalOffset in : inputs) {
099: logger.info("Inputs " + in.getSemantic() + " source "
100: + in.getSource() + " offset " + in.getOffset());
101:
102: if (in.getSemantic().equalsIgnoreCase("VERTEX")) {
103: processVertices(in, maxOffset);
104: } else if (in.getSemantic().equalsIgnoreCase("NORMAL")) {
105: processNormals(in, maxOffset);
106: } else if (in.getSemantic().equalsIgnoreCase("TEXCOORD")) {
107: } else {
108: logger.warning("UNIMPLEMENTED SEMANTIC "
109: + in.getSemantic());
110: }
111:
112: }
113:
114: }
115:
116: private void processVertices(InputLocalOffset in, int maxOffset) {
117: VerticesProcessor source = ElementCache.cache().getVertices(
118: in.getSource());
119: int offset = in.getOffset().intValue();
120:
121: if (source == null) {
122: logger.warning("Failed to get Vertices " + in.getSource());
123: } else {
124: vertices = new ArrayList();
125: for (int i = offset; i < prim.length; i += maxOffset + 1) {
126: Point3f vertex = (Point3f) source.getTuple3f(
127: new javax.vecmath.Point3f(), prim[i]);
128: System.out.println("Vertex " + vertex);
129: vertices.add(vertex);
130: }
131: }
132: }
133:
134: private void processNormals(InputLocalOffset in, int maxOffset) {
135: SourceProcessor source = ElementCache.cache().getSource(
136: in.getSource());
137:
138: int offset = in.getOffset().intValue();
139:
140: if (source == null) {
141: logger.warning("Failed to get Normals " + in.getSource());
142: } else {
143: normals = new ArrayList();
144: for (int i = offset; i < prim.length; i += maxOffset + 1) {
145: Vector3f normal = (Vector3f) source.getTuple3f(
146: new javax.vecmath.Vector3f(), prim[i]);
147: System.out.println("Normal " + normal);
148: normals.add(normal);
149: }
150: }
151: }
152:
153: }
|