Cylinder.cpp

Christof Elbrechter, 2012-10-10 17:30

Download (3.974 KB)

 
1
#include <Cylinder.h>
2

    
3
CylinderObject::CylinderObject() {
4
  setTransformation(Mat::id());
5
}
6

    
7
void CylinderObject::setupGeometry(int _steps) {
8
  steps = _steps;
9

    
10
  m_lineColorsFromVertices = true;
11
  m_triangleColorsFromVertices = true;
12
  m_quadColorsFromVertices = true;
13
  m_polyColorsFromVertices = true;
14

    
15
  m_primitives.clear();
16
  m_vertices.clear();
17
  m_vertexColors.clear();
18
  m_normals.clear();
19

    
20
  for( int i = 0; i < steps; i++ ) {
21
    int upper_center_vertex = 0;
22
    int lower_center_vertex = 2*steps+1;
23
    
24
    int upper_a_vertex = i*2+1;
25
    int lower_a_vertex = i*2+2;
26
    int upper_b_vertex = i*2+3;
27
    int lower_b_vertex = i*2+4;
28

    
29
    int upper_center_normal = 0;
30
    int lower_center_normal = 3*steps+1;
31

    
32
    int upper_a_normal = i*3+1;
33
    int lower_a_normal = i*3+2;
34
    int radius_a_normal = i*3+3;
35

    
36
    int upper_b_normal = i*3+4;
37
    int lower_b_normal = i*3+5;
38
    int radius_b_normal = i*3+6;
39

    
40
    if( i == steps-1 ) {
41
      upper_b_vertex = 1;
42
      lower_b_vertex = 2;
43

    
44
      upper_b_normal = 1;
45
      lower_b_normal = 2;
46
      radius_b_normal = 3;      
47
    }
48
      
49
    addTriangle(upper_center_vertex, upper_a_vertex, upper_b_vertex,
50
                upper_center_normal, upper_a_normal, upper_b_normal,
51
                GeomColor(0,100,200,255));
52
    addLine(upper_a_vertex, upper_b_vertex, GeomColor(0,100,200,255));
53
      
54
    addQuad(upper_a_vertex, lower_a_vertex, lower_b_vertex, upper_b_vertex,
55
            radius_a_normal, radius_a_normal, radius_b_normal, radius_b_normal,
56
            GeomColor(0,100,200,255));
57
    addLine(upper_a_vertex, lower_a_vertex, GeomColor(0,100,200,255));
58
      
59
    addTriangle(lower_center_vertex, lower_b_vertex, lower_a_vertex,
60
                lower_center_normal, lower_b_normal, lower_a_normal,
61
                GeomColor(0,100,200,255));
62
    addLine(lower_a_vertex, lower_b_vertex, GeomColor(0,100,200,255));
63
  }
64
                                     
65
  m_vertices.resize(2*steps+2, Vec(0.0, 0.0, 0.0, 1.0));
66
  m_vertexColors.resize(2*steps+2, GeomColor(0, 100, 200, 200));
67
  m_normals.resize(3*steps+2, Vec(0.0, 0.0, 0.0, 1.0));
68
}
69

    
70
void CylinderObject::updateGeometry(float height, float radius, GeomColor color) {
71
      
72
  float da = (2*M_PI)/steps;
73
  height = fabs(height);
74
      
75
  m_vertices[0][0] = 0.0;
76
  m_vertices[0][1] = 0.0;
77
  m_vertices[0][2] = height/2;
78

    
79
  m_vertexColors[0][0] = color[0] / 255.0;
80
  m_vertexColors[0][1] = color[1] / 255.0;
81
  m_vertexColors[0][2] = color[2] / 255.0;
82
  m_vertexColors[0][3] = color[3] / 255.0;
83

    
84
  m_normals[0][0] = 0.0;
85
  m_normals[0][1] = 0.0;
86
  m_normals[0][2] = 1.0;
87

    
88
  for(int i=0;i<steps;++i){
89
    float a = i*da;
90
    float cx = radius*cos(a);
91
    float cy = radius*sin(a);
92
      
93
    m_vertices[i*2+1][0] = cx;
94
    m_vertices[i*2+1][1] = cy;
95
    m_vertices[i*2+1][2] = height/2;
96

    
97
    m_vertices[i*2+2][0] = cx;
98
    m_vertices[i*2+2][1] = cy;
99
    m_vertices[i*2+2][2] = -height/2;
100

    
101
    m_vertexColors[i*2+1][0] = color[0] / 255.0;
102
    m_vertexColors[i*2+1][1] = color[1] / 255.0;
103
    m_vertexColors[i*2+1][2] = color[2] / 255.0;
104
    m_vertexColors[i*2+1][3] = color[3] / 255.0;
105

    
106
    m_vertexColors[i*2+2][0] = color[0] / 255.0;
107
    m_vertexColors[i*2+2][1] = color[1] / 255.0;
108
    m_vertexColors[i*2+2][2] = color[2] / 255.0;
109
    m_vertexColors[i*2+2][3] = color[3] / 255.0;
110

    
111
    m_normals[i*3+1][0] = 0.0;
112
    m_normals[i*3+1][1] = 0.0;
113
    m_normals[i*3+1][2] = 1.0;
114

    
115
    m_normals[i*3+2][0] = 0.0;
116
    m_normals[i*3+2][1] = 0.0;
117
    m_normals[i*3+2][2] = -1.0;
118

    
119
    m_normals[i*3+3][0] = cx / sqrt(cx*cx + cy*cy);
120
    m_normals[i*3+3][1] = cy / sqrt(cx*cx + cy*cy);
121
    m_normals[i*3+3][2] = 0.0;
122
    m_normals[i*3+3][3] = 1.0;
123
  }
124

    
125
  m_vertices[2*steps+1][0] = 0.0;
126
  m_vertices[2*steps+1][1] = 0.0;
127
  m_vertices[2*steps+1][2] = -height/2;
128

    
129
  m_vertexColors[2*steps+1][0] = color[0] / 255.0;
130
  m_vertexColors[2*steps+1][1] = color[1] / 255.0;
131
  m_vertexColors[2*steps+1][2] = color[2] / 255.0;
132
  m_vertexColors[2*steps+1][3] = color[3] / 255.0;
133

    
134
  m_normals[3*steps+1][0] = 0.0;
135
  m_normals[3*steps+1][1] = 0.0;
136
  m_normals[3*steps+1][2] = -1.0;
137
}