Skip to content

Commit

Permalink
[+] Torus primitive
Browse files Browse the repository at this point in the history
[~] added convenience methods to other classes

git-svn-id: http://min3d.googlecode.com/svn/trunk@105 470a5c22-fb99-cafe-615f-f07c7e978966
  • Loading branch information
ippeldv committed Nov 3, 2010
1 parent 0b24337 commit fda31b0
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/min3d/core/FacesBufferedList.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ public void add(Face $f)
_numElements++;
}

public void add(int $a, int $b, int $c) {
add((short)$a, (short)$b, (short)$c);
}

public void add(short $a, short $b, short $c)
{
set(_numElements, $a, $b, $c);
Expand Down
2 changes: 1 addition & 1 deletion src/min3d/core/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ protected void drawSetupLights()
light.diffuse.clearDirtyFlag();
}
if (light.specular.isDirty())
{
{Log.d(Min3d.TAG, "specular");
light.specular.commitToFloatBuffer();
_gl.glLightfv(glLightId, GL10.GL_SPECULAR, light.specular.floatBuffer());
light.specular.clearDirtyFlag();
Expand Down
115 changes: 115 additions & 0 deletions src/min3d/objectPrimitives/Torus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
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<steps1; s++, a1a=a1b, a1b+=step1r) {
float a2a = 0;
float a2b = step2r;

for(float s2=0; s2<steps2; s2++, a2a=a2b, a2b+=step2r) {
Vertex3d v0 = getVertex(a1a, r1, a2a, r2);
Vertex3d v1 = getVertex(a1b, r1, a2a, r2);
Vertex3d v2 = getVertex(a1b, r1, a2b, r2);
Vertex3d v3 = getVertex(a1a, r1, a2b, r2);

float ux1 = s/steps1;
float ux0 = (s+1)/steps1;
float uy0 = s2/steps2;
float uy1 = (s2+1)/steps2;

vertices().addVertex(v0.position, new Uv(1-ux1, uy0), v0.normal, defaultColor());
vertices().addVertex(v1.position, new Uv(1-ux0, uy0), v1.normal, defaultColor());
vertices().addVertex(v2.position, new Uv(1-ux0, uy1), v2.normal, defaultColor());
vertices().addVertex(v3.position, new Uv(1-ux1, uy1), v3.normal, defaultColor());

faces().add(vcount, vcount+1, vcount+2);
faces().add(vcount, vcount+2, vcount+3);

vcount += 4;
}
}
}

private Vertex3d getVertex(float a1, float r1, float a2, float r2) {
Vertex3d vertex = new Vertex3d();
vertex.normal = new Number3d();

float ca1 = (float)Math.cos(a1);
float sa1 = (float)Math.sin(a1);
float ca2 = (float)Math.cos(a2);
float sa2 = (float)Math.sin(a2);

float centerX = r1 * ca1;
float centerZ = -r1 * sa1;

vertex.normal.x = ca2 * ca1;
vertex.normal.y = sa2;
vertex.normal.z = -ca2 * sa1;

vertex.position.x = centerX + r2 * vertex.normal.x;
vertex.position.y = r2 * vertex.normal.y;
vertex.position.z = centerZ + r2 * vertex.normal.z;

return vertex;
}
}
12 changes: 11 additions & 1 deletion src/min3d/vos/Color4Managed.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ public void setAll(short $r, short $g, short $b, short $a)
setDirtyFlag();
}

public void setAll(int $r, int $g, int $b, int $a)
{
setAll((short)$r, (short)$g, (short)$b, (short)$a);
}

public Color4 toColor4()
{
return new Color4(_r,_g,_b,_a);
Expand All @@ -96,7 +101,12 @@ public void setAll(long $argb32)
_b = (short) (($argb32) & 0x000000FF);

setDirtyFlag();
}
}

public void setAll(Color4 $color)
{
setAll($color.r, $color.g, $color.b, $color.a);
}

public short r()
{
Expand Down
2 changes: 1 addition & 1 deletion src/min3d/vos/Vertex3d.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class Vertex3d
public Number3d position = new Number3d();
public Uv uv;
public Number3d normal;
public Color4 color;
public Color4 color;


public Vertex3d()
Expand Down

0 comments on commit fda31b0

Please sign in to comment.