package jogamp.opengl.glu.nurbs;
/*
** License Applicability. Except to the extent portions of this file are
** made subject to an alternative license as permitted in the SGI Free
** Software License B, Version 2.0 (the "License"), the contents of this
** file are subject only to the provisions of the License. You may not use
** this file except in compliance with the License. You may obtain a copy
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
**
** http://oss.sgi.com/projects/FreeB
**
** Note that, as provided in the License, the Software is distributed on an
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
**
** Original Code. The Original Code is: OpenGL Sample Implementation,
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
** Copyright in any portions created by third parties is as indicated
** elsewhere herein. All Rights Reserved.
**
** Additional Notice Provisions: The application programming interfaces
** established by SGI in conjunction with the Original Code are The
** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
** Window System(R) (Version 1.3), released October 19, 1998. This software
** was created using the OpenGL(R) version 1.2.1 Sample Implementation
** published by SGI, but has not been independently verified as being
** compliant with the OpenGL(R) version 1.2.1 Specification.
*/
/**
* Class working with curves and surfaces
* @author Tomas Hrasky
*
*/
public class Subdivider {
/**
* Cull type
*/
public static final int CULL_TRIVIAL_REJECT = 0;
/**
* Cull type
*/
public static final int CULL_ACCEPT = 1;
/**
* Maximum trimming arcs
*/
private static final int MAXARCS = 10;
/**
* Linked list of Quilts
*/
Quilt qlist;
/**
* Object holding rendering honts information
*/
private Renderhints renderhints;
/**
* Backend object
*/
private Backend backend;
/**
* Number of subdivisions
*/
private int subdivisions;
/**
* U step when using domain distance sampling
*/
private float domain_distance_u_rate;
/**
* Use domain distance sampling
*/
private int is_domain_distance_sampling;
/**
* Initial class holding trimming arcs
*/
private Bin initialbin;
/**
* Not used
*/
private boolean showDegenerate;
/**
* Is triming arc type bezier arc
*/
private boolean isArcTypeBezier;
/**
* Breakpoints in v direction
*/
private Flist tpbrkpts;
/**
* Breakpoints in u direction
*/
private Flist spbrkpts;
/**
* Unused
*/
private int s_index;
/**
* Head of linked list of trimming arcs
*/
private Arc pjarc;
/**
* Class tesselating trimming arcs
*/
private ArcTesselator arctesselator;
/**
* Unused
*/
private int t_index;
/**
* Breakpoints
*/
private final Flist smbrkpts = new Flist();
/**
* Not used
* private float[] stepsizes;
*/
/**
* Domain distance in V direction
*/
private float domain_distance_v_rate;
/**
* Initializes quilt list
*/
public void beginQuilts(final Backend backend) {
// DONE
qlist = null;
renderhints = new Renderhints();
this.backend = backend;
initialbin = new Bin();
arctesselator = new ArcTesselator();
}
/**
* Adds quilt to linked list
* @param quilt added quilt
*/
public void addQuilt(final Quilt quilt) {
// DONE
if (qlist == null)
qlist = quilt;
else {
quilt.next = qlist;
qlist = quilt;
}
}
/**
* Empty method
*/
public void endQuilts() {
// DONE
}
/**
* Draws a surface
*/
public void drawSurfaces() {
renderhints.init();
if (qlist == null) {
// System.out.println("qlist is null");
return;
}
for (Quilt q = qlist; q != null; q = q.next) {
if (q.isCulled() == CULL_TRIVIAL_REJECT) {
freejarcs(initialbin);
return;
}
}
final float[] from = new float[2];
final float[] to = new float[2];
spbrkpts = new Flist();
tpbrkpts = new Flist();
qlist.getRange(from, to, spbrkpts, tpbrkpts);
boolean optimize = (is_domain_distance_sampling > 0 && (renderhints.display_method != NurbsConsts.N_OUTLINE_PATCH));
// TODO decide whether to optimize (when there is gluNurbsProperty implemented)
optimize = true;
if (!initialbin.isnonempty()) {
if (!optimize) {
makeBorderTrim(from, to);
}
} else {
final float[] rate = new float[2];
qlist.findRates(spbrkpts, tpbrkpts, rate);
// System.out.println("subdivider.drawsurfaces decompose");
}
backend.bgnsurf(renderhints.wiretris, renderhints.wirequads);
// TODO partition test
if (!initialbin.isnonempty() && optimize) {
int i, j;
int num_u_steps;
int num_v_steps;
for (i = spbrkpts.start; i < spbrkpts.end - 1; i++) {
for (j = tpbrkpts.start; j < tpbrkpts.end - 1; j++) {
final float[] pta = new float[2];
final float[] ptb = new float[2];
pta[0] = spbrkpts.pts[i];
ptb[0] = spbrkpts.pts[i + 1];
pta[1] = tpbrkpts.pts[j];
ptb[1] = tpbrkpts.pts[j + 1];
qlist.downloadAll(pta, ptb, backend);
num_u_steps = (int) (domain_distance_u_rate * (ptb[0] - pta[0]));
num_v_steps = (int) (domain_distance_v_rate * (ptb[1] - pta[1]));
if (num_u_steps <= 0)
num_u_steps = 1;
if (num_v_steps <= 0)
num_v_steps = 1;
backend.surfgrid(pta[0], ptb[0], num_u_steps, ptb[1],
pta[1], num_v_steps);
backend.surfmesh(0, 0, num_u_steps, num_v_steps);
}
}
} else
subdivideInS(initialbin);
backend.endsurf();
}
/**
* Empty method
* @param initialbin2
*/
private void freejarcs(final Bin initialbin2) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.freejarcs");
}
/**
* Subdivide in U direction
* @param source Trimming arcs source
*/
private void subdivideInS(final Bin source) {
// DONE
if (renderhints.display_method == NurbsConsts.N_OUTLINE_PARAM) {
outline(source);
freejarcs(source);
} else {
setArcTypeBezier();
setNonDegenerate();
splitInS(source, spbrkpts.start, spbrkpts.end);
}
}
/**
* Split in U direction
* @param source Trimming arcs source
* @param start breakpoints start
* @param end breakpoints end
*/
private void splitInS(final Bin source, final int start, final int end) {
// DONE
if (source.isnonempty()) {
if (start != end) {
final int i = start + (end - start) / 2;
final Bin left = new Bin();
final Bin right = new Bin();
split(source, left, right, 0, spbrkpts.pts[i]);
splitInS(left, start, i);
splitInS(right, i + 1, end);
} else {
if (start == spbrkpts.start || start == spbrkpts.end) {
freejarcs(source);
} else if (renderhints.display_method == NurbsConsts.N_OUTLINE_PARAM_S) {
outline(source);
freejarcs(source);
} else {
setArcTypeBezier();
setNonDegenerate();
s_index = start;
splitInT(source, tpbrkpts.start, tpbrkpts.end);
}
}
} else{
// System.out.println("Source is empty - subdivider.splitins");
}
}
/**
* Split in V direction
* @param source
* @param start
* @param end
*/
private void splitInT(final Bin source, final int start, final int end) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.splitint");
if (source.isnonempty()) {
if (start != end) {
final int i = start + (end - start) / 2;
final Bin left = new Bin();
final Bin right = new Bin();
split(source, left, right, 1, tpbrkpts.pts[i + 1]);
splitInT(left, start, i);
splitInT(right, i + 1, end);
} else {
if (start == tpbrkpts.start || start == tpbrkpts.end) {
freejarcs(source);
} else if (renderhints.display_method == NurbsConsts.N_OUTLINE_PARAM_ST) {
outline(source);
freejarcs(source);
} else {
t_index = start;
setArcTypeBezier();
setDegenerate();
final float[] pta = new float[2];
final float[] ptb = new float[2];
pta[0] = spbrkpts.pts[s_index - 1];
pta[1] = tpbrkpts.pts[t_index - 1];
ptb[0] = spbrkpts.pts[s_index];
ptb[1] = tpbrkpts.pts[t_index];
qlist.downloadAll(pta, ptb, backend);
final Patchlist patchlist = new Patchlist(qlist, pta, ptb);
samplingSplit(source, patchlist,
renderhints.maxsubdivisions, 0);
setNonDegenerate();
setArcTypeBezier();
}
}
}
}
/**
* Sample
* @param source
* @param patchlist
* @param subdivisions
* @param param
*/
private void samplingSplit(final Bin source, final Patchlist patchlist,
final int subdivisions, int param) {
// DONE
if (!source.isnonempty())
return;
if (patchlist.cullCheck() == CULL_TRIVIAL_REJECT) {
freejarcs(source);
return;
}
patchlist.getstepsize();
if (renderhints.display_method == NurbsConsts.N_OUTLINE_PATCH) {
tesselation(source, patchlist);
outline(source);
freejarcs(source);
return;
}
tesselation(source, patchlist);
if (patchlist.needsSamplingSubdivision() && subdivisions > 0) {
if (!patchlist.needsSubdivision(0)) {
param = 1;
} else if (patchlist.needsSubdivision(1))
param = 0;
else
param = 1 - param;
final Bin left = new Bin();
final Bin right = new Bin();
final float mid = (float) ((patchlist.pspec[param].range[0] + patchlist.pspec[param].range[1]) * .5);
split(source, left, right, param, mid);
final Patchlist subpatchlist = new Patchlist(patchlist, param, mid);
samplingSplit(left, subpatchlist, subdivisions - 1, param);
samplingSplit(right, subpatchlist, subdivisions - 1, param);
} else {
setArcTypePwl();
setDegenerate();
nonSamplingSplit(source, patchlist, subdivisions, param);
setDegenerate();
setArcTypeBezier();
}
}
/**
* Not used
* @param source
* @param patchlist
* @param subdivisions
* @param param
*/
private void nonSamplingSplit(final Bin source, final Patchlist patchlist,
final int subdivisions, int param) {
// DONE
if (patchlist.needsNonSamplingSubdivision() && subdivisions > 0) {
param = 1 - param;
final Bin left = new Bin();
final Bin right = new Bin();
final float mid = (float) ((patchlist.pspec[param].range[0] + patchlist.pspec[param].range[1]) * .5);
split(source, left, right, param, mid);
final Patchlist subpatchlist = new Patchlist(patchlist, param, mid);
if (left.isnonempty()) {
if (subpatchlist.cullCheck() == CULL_TRIVIAL_REJECT)
freejarcs(left);
else
nonSamplingSplit(left, subpatchlist, subdivisions - 1,
param);
}
if (right.isnonempty()) {
if (patchlist.cullCheck() == CULL_TRIVIAL_REJECT)
freejarcs(right);
else
nonSamplingSplit(right, subpatchlist, subdivisions - 1,
param);
}
} else {
patchlist.bbox();
backend.patch(patchlist.pspec[0].range[0],
patchlist.pspec[0].range[1], patchlist.pspec[1].range[0],
patchlist.pspec[1].range[1]);
if (renderhints.display_method == NurbsConsts.N_OUTLINE_SUBDIV) {
outline(source);
freejarcs(source);
} else {
setArcTypePwl();
setDegenerate();
findIrregularS(source);
monosplitInS(source, smbrkpts.start, smbrkpts.end);
}
}
}
/**
* Not used
* @param source
* @param start
* @param end
*/
private void monosplitInS(final Bin source, final int start, final int end) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.monosplitins");
}
/**
* Not used
* @param source
*/
private void findIrregularS(final Bin source) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.findIrregularS");
}
/**
* Not used
*/
private void setArcTypePwl() {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.setarctypepwl");
}
/**
* Not used
* @param source
* @param patchlist
*/
private void tesselation(final Bin source, final Patchlist patchlist) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.tesselation");
}
/**
* Not used
*/
private void setDegenerate() {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.setdegenerate");
}
/**
* Not used
* @param bin
* @param left
* @param right
* @param param
* @param value
*/
private void split(final Bin bin, final Bin left, final Bin right, final int param, final float value) {
// DONE
final Bin intersections = new Bin();
final Bin unknown = new Bin();
partition(bin, left, intersections, right, unknown, param, value);
final int count = intersections.numarcs();
// TODO jumpbuffer ??
if (count % 2 == 0) {
final Arc[] arclist = new Arc[MAXARCS];
CArrayOfArcs list;
if (count >= MAXARCS) {
list = new CArrayOfArcs(new Arc[count]);
} else {
list = new CArrayOfArcs(arclist);
}
CArrayOfArcs last, lptr;
Arc jarc;
for (last = new CArrayOfArcs(list); (jarc = intersections
.removearc()) != null; last.pp())
last.set(jarc);
if (param == 0) {// sort into incrasing t order
final ArcSdirSorter sorter = new ArcSdirSorter(this);
sorter.qsort(list, count);
for (lptr = new CArrayOfArcs(list); lptr.getPointer() < last
.getPointer(); lptr.raisePointerBy(2))
check_s(lptr.get(), lptr.getRelative(1));
for (lptr = new CArrayOfArcs(list); lptr.getPointer() < last
.getPointer(); lptr.raisePointerBy(2))
join_s(left, right, lptr.get(), lptr.getRelative(1));
for (lptr = new CArrayOfArcs(list); lptr.getPointer() != last
.getPointer(); lptr.pp()) {
if (lptr.get().head()[0] <= value
&& lptr.get().tail()[0] <= value)
left.addarc(lptr.get());
else
right.addarc(lptr.get());
}
} else {// sort into decreasing s order
final ArcTdirSorter sorter = new ArcTdirSorter(this);
sorter.qsort(list, count);
for (lptr = new CArrayOfArcs(list); lptr.getPointer() < last
.getPointer(); lptr.raisePointerBy(2))
check_t(lptr.get(), lptr.getRelative(1));
for (lptr = new CArrayOfArcs(list); lptr.getPointer() < last
.getPointer(); lptr.raisePointerBy(2))
join_t(left, right, lptr.get(), lptr.getRelative(1));
for (lptr = new CArrayOfArcs(list); lptr.getPointer() != last
.getPointer(); lptr.raisePointerBy(2)) {
if (lptr.get().head()[0] <= value
&& lptr.get().tail()[0] <= value)
left.addarc(lptr.get());
else
right.addarc(lptr.get());
}
}
unknown.adopt();
}
}
/**
* Not used
* @param left
* @param right
* @param arc
* @param relative
*/
private void join_t(final Bin left, final Bin right, final Arc arc, final Arc relative) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.join_t");
}
/**
* Not used
* @param arc
* @param relative
*/
private void check_t(final Arc arc, final Arc relative) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.check_t");
}
/**
* Not used
* @param left
* @param right
* @param jarc1
* @param jarc2
*/
private void join_s(final Bin left, final Bin right, Arc jarc1, Arc jarc2) {
// DONE
if (!jarc1.getitail())
jarc1 = jarc1.next;
if (!jarc2.getitail())
jarc2 = jarc2.next;
final float s = jarc1.tail()[0];
final float t1 = jarc1.tail()[1];
final float t2 = jarc2.tail()[1];
if (t1 == t2) {
simplelink(jarc1, jarc2);
} else {
final Arc newright = new Arc(Arc.ARC_RIGHT);
final Arc newleft = new Arc(Arc.ARC_LEFT);
if (isBezierArcType()) {
arctesselator.bezier(newright, s, s, t1, t2);
arctesselator.bezier(newleft, s, s, t2, t1);
} else {
arctesselator.pwl_right(newright, s, t1, t2, 0 /* stepsizes[0] */);
arctesselator.pwl_left(newright, s, t2, t1, 0 /* stepsizes[2] */);
}
link(jarc1, jarc2, newright, newleft);
left.addarc(newright);
right.addarc(newleft);
}
}
/**
* Not used
* @param jarc1
* @param jarc2
* @param newright
* @param newleft
*/
private void link(final Arc jarc1, final Arc jarc2, final Arc newright, final Arc newleft) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.link");
}
/**
* Not used
* @return true
*/
private boolean isBezierArcType() {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.isbezierarc");
return true;
}
/**
* Not used
* @param jarc1
* @param jarc2
*/
private void simplelink(final Arc jarc1, final Arc jarc2) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.simplelink");
}
/**
* Not used
* @param arc
* @param relative
*/
private void check_s(final Arc arc, final Arc relative) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.check_s");
}
/**
* Not used
* @param bin
* @param left
* @param intersections
* @param right
* @param unknown
* @param param
* @param value
*/
private void partition(final Bin bin, final Bin left, final Bin intersections, final Bin right,
final Bin unknown, final int param, final float value) {
final Bin headonleft = new Bin();
final Bin headonright = new Bin();
final Bin tailonleft = new Bin();
final Bin tailonright = new Bin();
for (Arc jarc = bin.removearc(); jarc != null; jarc = bin.removearc()) {
final float tdiff = jarc.tail()[param] - value;
final float hdiff = jarc.head()[param] - value;
if (tdiff > 0) {
if (hdiff > 0) {
right.addarc(jarc);
} else if (hdiff == 0) {
tailonright.addarc(jarc);
} else {
switch (arc_split(jarc, param, value, 0)) {
case 2:
tailonright.addarc(jarc);
headonleft.addarc(jarc.next);
break;
// TODO rest cases
default:
System.out
.println("TODO subdivider.partition rest cases");
break;
}
}
} else if (tdiff == 0) {
if (hdiff > 0) {
headonright.addarc(jarc);
} else if (hdiff == 0) {
unknown.addarc(jarc);
} else {
headonright.addarc(jarc);
}
} else {
if (hdiff > 0) {
// TODO rest
// System.out.println("TODO subdivider.partition rest of else");
} else if (hdiff == 0) {
tailonleft.addarc(jarc);
} else {
left.addarc(jarc);
}
}
}
if (param == 0) {
classify_headonleft_s(headonleft, intersections, left, value);
classify_tailonleft_s(tailonleft, intersections, left, value);
classify_headonright_s(headonright, intersections, right, value);
classify_tailonright_s(tailonright, intersections, right, value);
} else {
classify_headonleft_t(headonleft, intersections, left, value);
classify_tailonleft_t(tailonleft, intersections, left, value);
classify_headonright_t(headonright, intersections, right, value);
classify_tailonright_t(tailonright, intersections, right, value);
}
}
/**
* Not used
* @param tailonright
* @param intersections
* @param right
* @param value
*/
private void classify_tailonright_t(final Bin tailonright, final Bin intersections,
final Bin right, final float value) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.classify_tailonright_t");
}
/**
* Not used
* @param bin
* @param in
* @param out
* @param val
*/
private void classify_tailonleft_s(final Bin bin, final Bin in, final Bin out, final float val) {
// DONE
Arc j;
while ((j = bin.removearc()) != null) {
j.clearitail();
final float diff = j.next.head()[0] - val;
if (diff > 0) {
in.addarc(j);
} else if (diff < 0) {
if (ccwTurn_sl(j, j.next))
out.addarc(j);
else
in.addarc(j);
} else {
if (j.next.tail()[1] > j.next.head()[1])
in.addarc(j);
else
out.addarc(j);
}
}
}
/**
* Not used
* @param bin
* @param in
* @param out
* @param val
*/
private void classify_headonright_s(final Bin bin, final Bin in, final Bin out, final float val) {
// DONE
Arc j;
while ((j = bin.removearc()) != null) {
j.setitail();
final float diff = j.prev.tail()[0] - val;
if (diff > 0) {
if (ccwTurn_sr(j.prev, j))
out.addarc(j);
else
in.addarc(j);
} else if (diff < 0) {
out.addarc(j);
} else {
if (j.prev.tail()[1] > j.prev.head()[1])
out.addarc(j);
else
in.addarc(j);
}
}
}
/**
* Not used
* @param prev
* @param j
* @return false
*/
private boolean ccwTurn_sr(final Arc prev, final Arc j) {
// TODO Auto-generated method stub
// System.out.println("TODO ccwTurn_sr");
return false;
}
/**
* Not used
* @param headonright
* @param intersections
* @param right
* @param value
*/
private void classify_headonright_t(final Bin headonright, final Bin intersections,
final Bin right, final float value) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.classify_headonright_t");
}
/**
* Not used
* @param tailonleft
* @param intersections
* @param left
* @param value
*/
private void classify_tailonleft_t(final Bin tailonleft, final Bin intersections,
final Bin left, final float value) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.classify_tailonleft_t");
}
/**
* Not used
* @param bin
* @param in
* @param out
* @param val
*/
private void classify_headonleft_t(final Bin bin, final Bin in, final Bin out, final float val) {
// DONE
Arc j;
while ((j = bin.removearc()) != null) {
j.setitail();
final float diff = j.prev.tail()[1] - val;
if (diff > 0) {
out.addarc(j);
} else if (diff < 0) {
if (ccwTurn_tl(j.prev, j))
out.addarc(j);
else
in.addarc(j);
} else {
if (j.prev.tail()[0] > j.prev.head()[0])
out.addarc(j);
else
in.addarc(j);
}
}
}
/**
* Not used
* @param prev
* @param j
* @return false
*/
private boolean ccwTurn_tl(final Arc prev, final Arc j) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.ccwTurn_tl");
return false;
}
/**
* Not used
* @param bin
* @param in
* @param out
* @param val
*/
private void classify_tailonright_s(final Bin bin, final Bin in, final Bin out, final float val) {
// DONE
Arc j;
while ((j = bin.removearc()) != null) {
j.clearitail();
final float diff = j.next.head()[0] - val;
if (diff > 0) {
if (ccwTurn_sr(j, j.next))
out.addarc(j);
else
in.addarc(j);
} else if (diff < 0) {
in.addarc(j);
} else {
if (j.next.tail()[1] > j.next.head()[1])
out.addarc(j);
else
in.addarc(j);
}
}
}
/**
* Not used
* @param bin
* @param in
* @param out
* @param val
*/
private void classify_headonleft_s(final Bin bin, final Bin in, final Bin out, final float val) {
// DONE
Arc j;
while ((j = bin.removearc()) != null) {
j.setitail();
final float diff = j.prev.tail()[0] - val;
if (diff > 0) {
out.addarc(j);
} else if (diff < 0) {
if (ccwTurn_sl(j.prev, j))
out.addarc(j);
else
in.addarc(j);
} else {
if (j.prev.tail()[1] > j.prev.head()[1])
in.addarc(j);
else
out.addarc(j);
}
}
}
/**
* Not used
* @param prev
* @param j
* @return false
*/
private boolean ccwTurn_sl(final Arc prev, final Arc j) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.ccwTurn_sl");
return false;
}
/**
* Not used
* @param jarc
* @param param
* @param value
* @param i
* @return 0
*/
private int arc_split(final Arc jarc, final int param, final float value, final int i) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.arc_split");
return 0;
}
/**
* Not used
*/
private void setNonDegenerate() {
// DONE
this.showDegenerate = false;
}
/**
* sets trimming arc default type to bezier
*/
private void setArcTypeBezier() {
// DONE
isArcTypeBezier = true;
}
/**
* Not used
* @param source
*/
private void outline(final Bin source) {
// TODO Auto-generated method stub
// System.out.println("TODO subdivider.outline");
}
/**
* Makes default trim along surface borders
* @param from range beginnings
* @param to range ends
*/
private void makeBorderTrim(final float[] from, final float[] to) {
// DONE
final float smin = from[0];
final float smax = to[0];
final float tmin = from[1];
final float tmax = to[1];
pjarc = null;
Arc jarc = null;
jarc = new Arc(Arc.ARC_BOTTOM);
arctesselator.bezier(jarc, smin, smax, tmin, tmin);
initialbin.addarc(jarc);
pjarc = jarc.append(pjarc);
jarc = new Arc(Arc.ARC_RIGHT);
arctesselator.bezier(jarc, smax, smax, tmin, tmax);
initialbin.addarc(jarc);
pjarc = jarc.append(pjarc);
jarc = new Arc(Arc.ARC_TOP);
arctesselator.bezier(jarc, smax, smin, tmax, tmax);
initialbin.addarc(jarc);
pjarc = jarc.append(pjarc);
jarc = new Arc(Arc.ARC_LEFT);
arctesselator.bezier(jarc, smin, smin, tmax, tmin);
initialbin.addarc(jarc);
jarc = jarc.append(pjarc);
// assert (jarc.check() == true);
}
/**
* Draws NURBS curve
*/
public void drawCurves() {
// DONE
final float[] from = new float[1];
final float[] to = new float[1];
final Flist bpts = new Flist();
qlist.getRange(from, to, bpts);
renderhints.init();
backend.bgncurv();
for (int i = bpts.start; i < bpts.end - 1; i++) {
final float[] pta = new float[1];
final float[] ptb = new float[1];
pta[0] = bpts.pts[i];
ptb[0] = bpts.pts[i + 1];
qlist.downloadAll(pta, ptb, backend);
final Curvelist curvelist = new Curvelist(qlist, pta, ptb);
samplingSplit(curvelist, renderhints.maxsubdivisions);
}
backend.endcurv();
}
/**
* Samples a curve in case of need, or sends curve to backend
* @param curvelist list of curves
* @param maxsubdivisions maximum number of subdivisions
*/
private void samplingSplit(final Curvelist curvelist, final int maxsubdivisions) {
if (curvelist.cullCheck() == CULL_TRIVIAL_REJECT)
return;
curvelist.getstepsize();
if (curvelist.needsSamplingSubdivision() && (subdivisions > 0)) {
// TODO kód
// System.out.println("TODO subdivider-needsSamplingSubdivision");
} else {
final int nu = (int) (1 + curvelist.range[2] / curvelist.stepsize);
backend.curvgrid(curvelist.range[0], curvelist.range[1], nu);
backend.curvmesh(0, nu);
}
}
/**
* Sets new domain_distance_u_rate value
* @param d new domain_distance_u_rate value
*/
public void set_domain_distance_u_rate(final double d) {
// DONE
domain_distance_u_rate = (float) d;
}
/**
* Sets new domain_distance_v_rate value
* @param d new domain_distance_v_rate value
*/
public void set_domain_distance_v_rate(final double d) {
// DONE
domain_distance_v_rate = (float) d;
}
/**
* Sets new is_domain_distance_sampling value
* @param i new is_domain_distance_sampling value
*/
public void set_is_domain_distance_sampling(final int i) {
// DONE
this.is_domain_distance_sampling = i;
}
}