package min3d.objectPrimitives; import min3d.core.Object3dContainer; import min3d.vos.Color4; import min3d.vos.Number3d; import min3d.vos.Uv; import min3d.vos.Vertex3d; /** * @author Dennis Ippel * @author Thomas Pfeiffer * @author Tim Knip * * Torus primitive. * This is an adaptation from Sandy's ActionScript 3 class which was adapted from Tim Knip's * ActionScript 2 class. All credits go to Tim Knip. * Original sources available at: http://www.suite75.net/svn/papervision3d/tim/as2/org/papervision3d/objects/Torus.as * Sandy source available at: http://code.google.com/p/sandy/source/browse/trunk/sandy/as3/trunk/src/sandy/primitive/Torus.as * */ public class Torus extends Object3dContainer { private final int MIN_SEGMENTSW = 3; private final int MIN_SEGMENTSH = 2; private float largeRadius; private float smallRadius; private int segmentsW; private int segmentsH; public Torus() { this(2, 1, 12, 8, new Color4()); } public Torus(Color4 color) { this(2, 1, 12, 8, color); } public Torus(float largeRadius, float smallRadius, int segmentsW, int segmentsH) { this(largeRadius, smallRadius, segmentsW, segmentsH, new Color4()); } public Torus(float largeRadius, float smallRadius, int segmentsW, int segmentsH, Color4 color) { super(segmentsW * segmentsH * 2 * 3, segmentsW * segmentsH * 2); this.largeRadius = largeRadius; this.smallRadius = smallRadius; this.segmentsW = Math.max(MIN_SEGMENTSW, segmentsW); this.segmentsH = Math.max(MIN_SEGMENTSH, segmentsH); this.defaultColor(color); build(); } private void build() { float r1 = largeRadius; float r2 = smallRadius; int steps1 = segmentsW; int steps2 = segmentsH; float step1r = (float) ((2.0 * Math.PI) / steps1); float step2r = (float) ((2.0 * Math.PI) / steps2); float a1a = 0; float a1b = step1r; int vcount = 0; for(float s=0; s