| 223 | } |
| 224 | |
| 225 | void TriLineSet::AddCone( const Vector3& start, const Vector3& end, float radius, int segments, uint32_t color ) |
| 226 | { |
| 227 | Vector3 z = start - end; |
| 228 | float length = Length( z ); |
| 229 | z /= length; |
| 230 | |
| 231 | Vector3 up( 0.0f, 1.0f, 0.0f ); |
| 232 | if( fabs( z.y ) > 0.99f ) |
| 233 | { |
| 234 | up = Vector3( 1.0f, 0.0f, 0.0f ); |
| 235 | } |
| 236 | |
| 237 | Vector3 x = Normalize( Cross( up, z ) ); |
| 238 | |
| 239 | Vector3 y = Cross( z, x ); |
| 240 | |
| 241 | Matrix m; |
| 242 | m._11 = x.x; |
| 243 | m._12 = x.y; |
| 244 | m._13 = x.z; |
| 245 | m._14 = 0.0f; |
| 246 | |
| 247 | m._21 = y.x; |
| 248 | m._22 = y.y; |
| 249 | m._23 = y.z; |
| 250 | m._24 = 0.0f; |
| 251 | |
| 252 | m._31 = z.x; |
| 253 | m._32 = z.y; |
| 254 | m._33 = z.z; |
| 255 | m._34 = 0.0f; |
| 256 | |
| 257 | m._41 = end.x; |
| 258 | m._42 = end.y; |
| 259 | m._43 = end.z; |
| 260 | m._44 = 1.0f; |
| 261 | |
| 262 | Matrix scale = ScalingMatrix( radius, radius, length ); |
| 263 | m = scale * m; |
| 264 | |
| 265 | if( segments < 4 ) |
| 266 | { |
| 267 | segments = 4; |
| 268 | } |
| 269 | |
| 270 | if( segments % 2 == 1 ) |
| 271 | { |
| 272 | ++segments; |
| 273 | } |
| 274 | |
| 275 | float step = ( XM_PI * 2.0f ) / (float)segments; |
| 276 | for( int i = 0; i < segments; ++i ) |
| 277 | { |
| 278 | float x = cosf( i * step ); |
| 279 | float y = sinf( i * step ); |
| 280 | |
| 281 | Vector3 from( x, y, 0.0f ); |
| 282 | Vector3 to( 0.0f, 0.0f, 1.0f ); |