Subversion Repository Public Repository

Nextrek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package min3d.objectPrimitives;

import android.util.FloatMath;
import min3d.core.Object3dContainer;
import min3d.vos.Color4;
//import min3d.vos.Face;
import min3d.vos.Number3d;
import min3d.vos.Uv;

/**
 * Example of a more complex programmatically-drawn object.
 * 
 * Unfortunately, because the object's faces share as many vertices as possible,
 * shading is incorrect on the cylinder surfaces.
 *  
 * To fix would require duplicating vertices, adding new normals, 
 * and generally reworking algorithm. Yek.
 */
public class HollowCylinder extends Object3dContainer 
{
	private double DEG = Math.PI / 180;
	
	private int _segs;
	private float _radiusOuter;
	private float _radiusInner;
	private float _height;
	

	public HollowCylinder(float $radiusOuter, float $radiusInner, float $height, int $segs)
	{
		super($segs * 4, $segs * 8);
		
		_segs = $segs;
		_height = $height;
		_radiusOuter = $radiusOuter;
		_radiusInner = $radiusInner;
		
		addHorizontalSurface(false, _height / +2);
		addHorizontalSurface(true, _height / -2);
		addVerticalSurface(true);
		addVerticalSurface(false);
	}
	
	private void addHorizontalSurface(boolean $isTopSide, float $zOffset)
	{
		int indexOffset = _vertices.size();
		float step = (float)((360.0 / _segs) * DEG);

		// verts
		
		Color4 col = $isTopSide ? new Color4(255,0,0,255) : new Color4(0,255,0,255);
		
		for (int i = 0; i < _segs; i++)
		{
			float angle = (float)i * step;

			// outer 
			float x1 		= (float) FloatMath.sin(angle) * _radiusOuter;
			float y1 		= (float) FloatMath.cos(angle) * _radiusOuter;
			float z1 		= $zOffset; 
			Uv uv1 			= new Uv(x1,y1);
			Number3d n1 	= new Number3d(0,0, $isTopSide ? -1 : +1);
			this.vertices().addVertex(new Number3d(x1,y1,z1), uv1, n1, col);

			// inner 
			float x2 		= (float) FloatMath.sin(angle) * _radiusInner;
			float y2 		= (float) FloatMath.cos(angle) * _radiusInner;
			float z2 		= $zOffset; 
			Uv uv2			= new Uv(x2,y2);
			Number3d n2	= new Number3d(0,0, $isTopSide ? -1 : +1);
			this.vertices().addVertex(new Number3d(x2,y2,z2), uv2, n2, col);
		}
		
		// indicies
		
		for (int i = 2; i <= _segs; i++)
		{
			int a = indexOffset  +  i*2 - 3 - 1;
			int b = indexOffset  +  i*2 - 2 - 1;
			int c = indexOffset  +  i*2 - 1 - 1;
			int d = indexOffset  +  i*2 - 0 - 1;
			addQuad(a,b,c,d, $isTopSide);
		}		
	
		int a = indexOffset  +  _segs*2 - 1 - 1; // ... connect last segment
		int b = indexOffset  +  _segs*2 - 0 - 1;
		int c = indexOffset  +  0;
		int d = indexOffset  +  1;
		addQuad(a,b,c,d, $isTopSide);
	}
	
	// 
	private void addVerticalSurface(boolean $isOuter)
	{
		int off = (int)(_vertices.size() / 2); 
		
		for (int i = 0; i < _segs - 1; i++)
		{
			int ul = i*2;
			int bl = ul + off;
			int ur = i*2 + 2;
			int br = ur + off;
			
			if (!$isOuter) {
				ul++;
				bl++;
				ur++;
				br++;
			}
			addQuad(ul,bl,ur,br, $isOuter);
		}
		
		int ul = (_segs-1)*2;
		int bl = ul + off;
		int ur = 0*2;
		int br = ur + off;

		if (!$isOuter) {
			ul++;
			bl++;
			ur++;
			br++;
		}

		addQuad(ul,bl,ur,br, $isOuter);
	}
	
	private void addQuad(int ul, int bl, int ur, int br, boolean $flipped)
	{
		//Face t;
		
		if (! $flipped)
		{
			_faces.add((short)ul,(short)bl,(short)ur);
			_faces.add((short)bl,(short)br,(short)ur);
		}
		else
		{
			_faces.add((short)ur,(short)br,(short)ul);
			_faces.add((short)br,(short)bl,(short)ul);
		}
	}
}

Commits for Nextrek/Android/LibrerieNextrek/src/min3d/objectPrimitives/HollowCylinder.java

Diff revisions: vs.
Revision Author Commited Message
4 FMMortaroli picture FMMortaroli Fri 19 Apr, 2013 16:54:38 +0000