From: <ma...@us...> - 2004-02-13 06:51:52
|
Update of /cvsroot/jrman/drafts/src/org/jrman/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23606/src/org/jrman/parser Modified Files: Parser.java Log Message: First PatchMesh implementation. Index: Parser.java =================================================================== RCS file: /cvsroot/jrman/drafts/src/org/jrman/parser/Parser.java,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** Parser.java 9 Feb 2004 16:49:32 -0000 1.78 --- Parser.java 13 Feb 2004 06:46:24 -0000 1.79 *************** *** 932,943 **** patch.applyBasis(); renderer.addPrimitive(patch); ! }else { final Transform transform = currentAttributes.getTransform(); currentObjectInstanceList .addPrimitiveCreator(new ObjectInstanceList.PrimitiveCreator() { public Primitive create(Attributes attributes) { ! BicubicPatch patch = new BicubicPatch(parameters, ! createAttributes(transform, ! attributes)); patch.applyBasis(); return patch; --- 932,942 ---- patch.applyBasis(); renderer.addPrimitive(patch); ! } else { final Transform transform = currentAttributes.getTransform(); currentObjectInstanceList .addPrimitiveCreator(new ObjectInstanceList.PrimitiveCreator() { public Primitive create(Attributes attributes) { ! BicubicPatch patch = ! new BicubicPatch(parameters, createAttributes(transform, attributes)); patch.applyBasis(); return patch; *************** *** 947,950 **** --- 946,1066 ---- } + private int evalIndex(int iu, int nu, int iv, int nv) { + return (iv % nv) * nu + (iu % nu); + } + + public void addBilinearPatchMesh( + int nu, + String uWrap, + int nv, + String vWrap, + ParameterList parameters) { + int nU; + if (uWrap.equals("periodic")) + nU = nu; + else if (uWrap.equals("nonperiodic")) + nU = nu - 1; + else + throw new IllegalArgumentException("Unknown u wrap type: " + uWrap); + int nV; + if (vWrap.equals("periodic")) + nV = nv; + else if (uWrap.equals("nonperiodic")) + nV = nv - 1; + else + throw new IllegalArgumentException("Unknown v wrap type: " + vWrap); + VaryingScalarTuple3f pParam = (VaryingScalarTuple3f) parameters.getParameter("P"); + Point3f tmp = new Point3f(); + for (int i = 0; i < nU; i++) + for (int j = 0; j < nV; j++) { + ParameterList nparameters = new ParameterList(parameters); + nparameters.removeParameter("P"); + VaryingScalarTuple3f npParam = + new VaryingScalarTuple3f(pParam.getDeclaration(), new float[4 * 3]); + pParam.getValue(evalIndex(i, nu, j, nv), tmp); + npParam.setValue(0, tmp); + pParam.getValue(evalIndex(i + 1, nu, j, nv), tmp); + npParam.setValue(1, tmp); + pParam.getValue(evalIndex(i, nu, j + 1, nv), tmp); + npParam.setValue(2, tmp); + pParam.getValue(evalIndex(i + 1, nu, j + 1, nv), tmp); + npParam.setValue(3, tmp); + nparameters.addParameter(npParam); + addBilinearPatch(nparameters); + } + } + + public void addBicubicPatchMesh( + int nu, + String uWrap, + int nv, + String vWrap, + ParameterList parameters) { + int uStep = currentAttributes.getUStep(); + int nU; + if (uWrap.equals("periodic")) + nU = nu / uStep; + else if (uWrap.equals("nonperiodic")) + nU = (nu - 4) / uStep + 1; + else + throw new IllegalArgumentException("Unknown u wrap type: " + uWrap); + int vStep = currentAttributes.getVStep(); + int nV; + if (vWrap.equals("periodic")) + nV = nv / vStep; + else if (uWrap.equals("nonperiodic")) + nV = (nv - 4) / vStep + 1; + else + throw new IllegalArgumentException("Unknown v wrap type: " + vWrap); + VaryingScalarTuple3f pParam = (VaryingScalarTuple3f) parameters.getParameter("P"); + Point3f tmp = new Point3f(); + int i = 0; + for (int ii = 0; ii < nU; ii++) { + int j = 0; + for (int jj = 0; jj < nV; jj++) { + ParameterList nparameters = new ParameterList(parameters); + nparameters.removeParameter("P"); + VaryingScalarTuple3f npParam = + new VaryingScalarTuple3f(pParam.getDeclaration(), new float[16 * 3]); + pParam.getValue(evalIndex(i, nu, j, nv), tmp); + npParam.setValue(0, tmp); + pParam.getValue(evalIndex(i + 1, nu, j, nv), tmp); + npParam.setValue(1, tmp); + pParam.getValue(evalIndex(i + 2, nu, j, nv), tmp); + npParam.setValue(2, tmp); + pParam.getValue(evalIndex(i + 3, nu, j, nv), tmp); + npParam.setValue(3, tmp); + pParam.getValue(evalIndex(i, nu, j + 1, nv), tmp); + npParam.setValue(4, tmp); + pParam.getValue(evalIndex(i + 1, nu, j + 1, nv), tmp); + npParam.setValue(5, tmp); + pParam.getValue(evalIndex(i + 2, nu, j + 1, nv), tmp); + npParam.setValue(6, tmp); + pParam.getValue(evalIndex(i + 3, nu, j + 1, nv), tmp); + npParam.setValue(7, tmp); + pParam.getValue(evalIndex(i, nu, j + 2, nv), tmp); + npParam.setValue(8, tmp); + pParam.getValue(evalIndex(i + 1, nu, j + 2, nv), tmp); + npParam.setValue(9, tmp); + pParam.getValue(evalIndex(i + 2, nu, j + 2, nv), tmp); + npParam.setValue(10, tmp); + pParam.getValue(evalIndex(i + 3, nu, j + 2, nv), tmp); + npParam.setValue(11, tmp); + pParam.getValue(evalIndex(i, nu, j + 3, nv) , tmp); + npParam.setValue(12, tmp); + pParam.getValue(evalIndex(i + 1, nu, j + 3, nv), tmp); + npParam.setValue(13, tmp); + pParam.getValue(evalIndex(i + 2, nu, j + 3, nv), tmp); + npParam.setValue(14, tmp); + pParam.getValue(evalIndex(i + 3, nu, j + 3, nv), tmp); + npParam.setValue(15, tmp); + nparameters.addParameter(npParam); + addBicubicPatch(nparameters); + j += vStep; + } + i += uStep; + } + } + public void addPointsPolygons( final int[] nVertices, *************** *** 971,1021 **** } - public void addPointsPolygon( - float[] nVertices, - float[] vertices, - ParameterList parameters) { - VaryingScalarTuple3f pParam = (VaryingScalarTuple3f) parameters.getParameter("P"); - VaryingArrayFloat stParam = (VaryingArrayFloat) parameters.getParameter("st"); - VaryingScalarTuple3f nParam = (VaryingScalarTuple3f) parameters.getParameter("N"); - int offset = 0; - Point3f point = new Point3f(); - for (int i = 0; i < nVertices.length; i++) { - int n = (int) nVertices[i]; - VaryingScalarTuple3f npParam = - new VaryingScalarTuple3f(pParam.getDeclaration(), new float[n * 3]); - VaryingArrayFloat nstParam = null; - if (stParam != null) - nstParam = new VaryingArrayFloat(stParam.getDeclaration(), new float[n * 2]); - VaryingScalarTuple3f nnParam = null; - if (nParam != null) - nnParam = new VaryingScalarTuple3f(nParam.getDeclaration(), new float[n * 3]); - for (int j = 0; j < n; j++) { - pParam.getValue((int) vertices[offset], point); - npParam.setValue(j, point); - if (stParam != null) { - nstParam.setValue(j, 0, stParam.getValue((int) vertices[offset], 0)); - nstParam.setValue(j, 1, stParam.getValue((int) vertices[offset], 1)); - } - if (nParam != null) { - nParam.getValue((int) vertices[offset], point); - nnParam.setValue(j, point); - } - offset += 1; - } - ParameterList newParameters = new ParameterList(parameters); - newParameters.removeParameter(npParam.getDeclaration().getName()); - newParameters.addParameter(npParam); - if (stParam != null) { - newParameters.removeParameter(stParam.getDeclaration().getName()); - newParameters.addParameter(nstParam); - } - if (nParam != null) { - newParameters.removeParameter(nParam.getDeclaration().getName()); - newParameters.addParameter(nnParam); - } - addPolygon(newParameters); - } - } - public void addPolygon(final ParameterList parameters) { VaryingScalarTuple3f pParam = (VaryingScalarTuple3f) parameters.getParameter("P"); --- 1087,1090 ---- |