dxrubynd 1.4.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1221 @@
1
+ #define WINVER 0x0500 /* �o�[�W������` Windows2000�ȏ� */
2
+ #define _WIN32_WINNT WINVER
3
+
4
+ #include "ruby.h"
5
+ #ifndef RUBY_ST_H
6
+ #include "st.h"
7
+ #endif
8
+
9
+ #define DXRUBY_EXTERN 1
10
+ #include "dxruby.h"
11
+ #include "matrix.h"
12
+
13
+ VALUE cMatrix; /* �s��N���X */
14
+ VALUE cVector; /* �x�N�g���N���X */
15
+
16
+ #ifdef DXRUBY_USE_TYPEDDATA
17
+ const rb_data_type_t Matrix_data_type;
18
+ const rb_data_type_t Vector_data_type;
19
+ #endif
20
+
21
+ static float pi = 3.141592653589793115997963468544185161590576171875f;
22
+
23
+ /*********************************************************************
24
+ * Matrix�N���X
25
+ *
26
+ * �s���\������B
27
+ *********************************************************************/
28
+
29
+ /*--------------------------------------------------------------------
30
+ �Q�Ƃ���Ȃ��Ȃ����Ƃ���GC����Ă΂��֐�
31
+ ---------------------------------------------------------------------*/
32
+ void Matrix_release( struct DXRubyMatrix* mat )
33
+ {
34
+ free( mat );
35
+ }
36
+
37
+ #ifdef DXRUBY_USE_TYPEDDATA
38
+ const rb_data_type_t Matrix_data_type = {
39
+ "Matrix",
40
+ {
41
+ 0,
42
+ Matrix_release,
43
+ 0,
44
+ },
45
+ NULL, NULL
46
+ };
47
+ #endif
48
+
49
+ /*--------------------------------------------------------------------
50
+ Matrix�N���X��allocate�B���������m�ۂ���ׂ�initialize�O�ɌĂ΂��B
51
+ ---------------------------------------------------------------------*/
52
+ static VALUE Matrix_allocate( VALUE klass )
53
+ {
54
+ VALUE obj;
55
+ struct DXRubyMatrix *mat;
56
+
57
+ /* DXRubyMatrix�̃������擾��Matrix�I�u�W�F�N�g���� */
58
+ mat = malloc( sizeof( struct DXRubyMatrix ) );
59
+ if( mat == NULL ) rb_raise( eDXRubyError, "�������̎擾�Ɏ��s���܂��� - Matrix_allocate" );
60
+ #ifdef DXRUBY_USE_TYPEDDATA
61
+ obj = TypedData_Wrap_Struct( klass, &Matrix_data_type, mat );
62
+ #else
63
+ obj = Data_Wrap_Struct( klass, 0, Matrix_release, mat );
64
+ #endif
65
+ mat->x = 0;
66
+ mat->y = 0;
67
+ ZeroMemory( mat->m, sizeof( float ) * 16 );
68
+
69
+ return obj;
70
+ }
71
+
72
+ /*--------------------------------------------------------------------
73
+ Matrix�N���X��Initialize
74
+ ---------------------------------------------------------------------*/
75
+ static VALUE Matrix_initialize( int argc, VALUE *argv, VALUE self )
76
+ {
77
+ struct DXRubyMatrix *mat = DXRUBY_GET_STRUCT( Matrix, self );
78
+ VALUE ary, *ary_p;
79
+ int i, j, count;
80
+
81
+ if( argc == 0 )
82
+ {
83
+ mat->m11 = 1;mat->m22 = 1;mat->m33 = 1;mat->m44 = 1;
84
+ mat->x = mat->y = 4;
85
+ return self;
86
+ }
87
+
88
+ if( argc == 1 )
89
+ {
90
+ ary = argv[0];
91
+ Check_Type( ary, T_ARRAY );
92
+ if( RARRAY_LEN( ary ) > 4 || RARRAY_LEN( ary ) < 1 ) rb_raise( eDXRubyError, "�z��̐�������������܂���B - Matrix_initialize");
93
+ ary_p = RARRAY_PTR( ary );
94
+ count = RARRAY_LEN( ary );
95
+ }
96
+ else
97
+ {
98
+ if( argc > 4 ) rb_raise( eDXRubyError, "�����̐�������������܂���B - Matrix_initialize");
99
+ ary_p = argv;
100
+ count = argc;
101
+ }
102
+
103
+ mat->y = count;
104
+ for( i = 0; i < count; i++ )
105
+ {
106
+ VALUE ary2 = ary_p[i];
107
+ Check_Type( ary2, T_ARRAY );
108
+ if( RARRAY_LEN( ary2 ) > 4 || RARRAY_LEN( ary2 ) < 1 || RARRAY_LEN( ary2 ) != mat->y ) rb_raise( eDXRubyError, "�z��̐�������������܂���B - Matrix_initialize");
109
+
110
+ for( j = 0; j < RARRAY_LEN( ary2 ); j++ )
111
+ {
112
+ mat->m[i][j] = NUM2FLOAT( RARRAY_PTR( ary2 )[j] );
113
+ }
114
+ }
115
+ mat->x = RARRAY_LEN( ary_p[0] );
116
+
117
+ return self;
118
+ }
119
+
120
+ static VALUE Matrix_mul( VALUE self, VALUE varg )
121
+ {
122
+ struct DXRubyMatrix *mat_d = DXRUBY_GET_STRUCT( Matrix, self );
123
+ struct DXRubyMatrix *result;
124
+ VALUE vresult;
125
+
126
+ if( FIXNUM_P( varg ) || TYPE( varg ) == T_FLOAT || TYPE( varg ) == T_BIGNUM )
127
+ {
128
+ int i, j;
129
+
130
+ vresult = Matrix_allocate( cMatrix );
131
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
132
+ result->x = mat_d->x;
133
+ result->y = mat_d->y;
134
+ for( i = 0; i < mat_d->y; i++ )
135
+ {
136
+ for( j = 0; j < mat_d->x; j++ )
137
+ {
138
+ result->m[i][j] = mat_d->m[i][j] * NUM2FLOAT( varg );
139
+ }
140
+ }
141
+ }
142
+ else
143
+ {
144
+ int i, j, k;
145
+ struct DXRubyMatrix *mat_s;
146
+
147
+ DXRUBY_CHECK_TYPE( Matrix, varg );
148
+ mat_s = DXRUBY_GET_STRUCT( Matrix, varg );
149
+
150
+ if( mat_d->x != mat_s->y || mat_d->y != mat_s->x ) rb_raise( eDXRubyError, "�v�f������v���Ă��܂���B - Matrix_*");
151
+ vresult = Matrix_allocate( cMatrix );
152
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
153
+ result->x = mat_s->x;
154
+ result->y = mat_d->y;
155
+
156
+ for( i = 0; i < mat_d->y; i++ )
157
+ {
158
+ for( j = 0; j < mat_s->x; j++ )
159
+ {
160
+ for( k = 0; k < mat_s->x; k++ )
161
+ {
162
+ result->m[i][j] += mat_d->m[i][k] * mat_s->m[k][j];
163
+ }
164
+ }
165
+ }
166
+ }
167
+ return vresult;
168
+ }
169
+
170
+
171
+ static VALUE Matrix_to_s( VALUE self )
172
+ {
173
+ struct DXRubyMatrix *mat = DXRUBY_GET_STRUCT( Matrix, self );
174
+ char buf[1024];
175
+ char temp[256];
176
+ int i;
177
+
178
+ sprintf( buf, "size = %d,%d ", mat->x, mat->y );
179
+
180
+ for( i = 0; i < mat->y; i++ )
181
+ {
182
+ switch( mat->x ) {
183
+ case 1:
184
+ sprintf( temp, "(%f)", mat->m[i][0] );
185
+ strcat( buf, temp );
186
+ break;
187
+ case 2:
188
+ sprintf( temp, "(%f, %f)", mat->m[i][0], mat->m[i][1] );
189
+ strcat( buf, temp );
190
+ break;
191
+ case 3:
192
+ sprintf( temp, "(%f, %f, %f)", mat->m[i][0], mat->m[i][1], mat->m[i][2] );
193
+ strcat( buf, temp );
194
+ break;
195
+ default:
196
+ sprintf( temp, "(%f, %f, %f, %f)", mat->m[i][0], mat->m[i][1], mat->m[i][2], mat->m[i][3] );
197
+ strcat( buf, temp );
198
+ break;
199
+ }
200
+ }
201
+
202
+ return rb_str_new2( buf );
203
+ }
204
+
205
+ /* �r���[�s��쐬 */
206
+ static VALUE Matrix_look_at( VALUE klass, VALUE veye, VALUE vat, VALUE vup )
207
+ {
208
+ struct DXRubyMatrix *result;
209
+ D3DVECTOR eye, at, up;
210
+ struct DXRubyVector *vec_eye, *vec_at, *vec_up;
211
+ VALUE vresult;
212
+
213
+ DXRUBY_CHECK_TYPE( Vector, veye );
214
+ vec_eye = DXRUBY_GET_STRUCT( Vector, veye );
215
+ DXRUBY_CHECK_TYPE( Vector, vat );
216
+ vec_at = DXRUBY_GET_STRUCT( Vector, vat );
217
+ DXRUBY_CHECK_TYPE( Vector, vup );
218
+ vec_up = DXRUBY_GET_STRUCT( Vector, vup );
219
+
220
+ vresult = Matrix_allocate( cMatrix );
221
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
222
+
223
+ // memcpy( &matrix, mat->m, sizeof( float ) * 16 );
224
+ // D3DXMatrixInverse( (D3DMATRIX *)result->m, 0, (D3DMATRIX *)mat->m);
225
+
226
+ eye.x = vec_eye->v1;
227
+ eye.y = vec_eye->v2;
228
+ eye.z = vec_eye->v3;
229
+ at.x = vec_at->v1;
230
+ at.y = vec_at->v2;
231
+ at.z = vec_at->v3;
232
+ up.x = vec_up->v1;
233
+ up.y = vec_up->v2;
234
+ up.z = vec_up->v3;
235
+ D3DXMatrixLookAtLH( (D3DMATRIX *)result->m, &eye, &at, &up );
236
+
237
+ result->x = 4;
238
+ result->y = 4;
239
+ return vresult;
240
+ }
241
+
242
+
243
+ /* �ˉe�ϊ��s��쐬 */
244
+ static VALUE Matrix_create_projection( VALUE klass, VALUE vwidth, VALUE vheight, VALUE vzn, VALUE vzf )
245
+ {
246
+ struct DXRubyMatrix *result;
247
+ VALUE vresult;
248
+ vresult = Matrix_allocate( cMatrix );
249
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
250
+ result->x = result->y = 4;
251
+
252
+ D3DXMatrixPerspectiveLH( (D3DMATRIX*)result->m, NUM2FLOAT( vwidth ), NUM2FLOAT( vheight ), NUM2FLOAT( vzn ), NUM2FLOAT( vzf ) );
253
+
254
+ return vresult;
255
+ }
256
+
257
+
258
+ /* �ˉe�ϊ��s��쐬(��p�w��) */
259
+ static VALUE Matrix_create_projection_fov( VALUE klass, VALUE vfov, VALUE vaspect, VALUE vzn, VALUE vzf )
260
+ {
261
+ struct DXRubyMatrix *result;
262
+ D3DMATRIX matrix;
263
+ VALUE vresult;
264
+ float angle;
265
+ vresult = Matrix_allocate( cMatrix );
266
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
267
+ result->x = result->y = 4;
268
+
269
+ angle = pi / 180.0f * NUM2FLOAT( vfov );
270
+ D3DXMatrixPerspectiveFovLH( (D3DMATRIX*)result->m, angle, NUM2FLOAT( vaspect ), NUM2FLOAT( vzn ), NUM2FLOAT( vzf ) );
271
+
272
+ return vresult;
273
+ }
274
+
275
+
276
+ /* ���ˉe�ϊ��s��쐬 */
277
+ static VALUE Matrix_create_projection_ortho( VALUE klass, VALUE vwidth, VALUE vheight, VALUE vzn, VALUE vzf )
278
+ {
279
+ struct DXRubyMatrix *result;
280
+ D3DMATRIX matrix;
281
+ VALUE vresult;
282
+ vresult = Matrix_allocate( cMatrix );
283
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
284
+ result->x = result->y = 4;
285
+
286
+ D3DXMatrixOrthoLH( (D3DMATRIX*)result->m, NUM2FLOAT( vwidth ), NUM2FLOAT( vheight ), NUM2FLOAT( vzn ), NUM2FLOAT( vzf ) );
287
+
288
+ return vresult;
289
+ }
290
+
291
+
292
+ /* 2D��]�s��쐬 */
293
+ static VALUE Matrix_create_rot( VALUE klass, VALUE vangle )
294
+ {
295
+ struct DXRubyMatrix *result;
296
+ VALUE vresult;
297
+ float angle;
298
+
299
+ vresult = Matrix_allocate( cMatrix );
300
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
301
+
302
+ result->x = 3;
303
+ result->y = 3;
304
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
305
+ result->m11 = cos( angle );
306
+ result->m12 = sin( angle );
307
+ result->m21 = -result->m12;
308
+ result->m22 = result->m11;
309
+ result->m33 = 1;
310
+
311
+ return vresult;
312
+ }
313
+ /* x����]�s��쐬 */
314
+ static VALUE Matrix_create_rot_x( VALUE klass, VALUE vangle )
315
+ {
316
+ struct DXRubyMatrix *result;
317
+ VALUE vresult;
318
+ float angle;
319
+
320
+ vresult = Matrix_allocate( cMatrix );
321
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
322
+
323
+ result->x = 4;
324
+ result->y = 4;
325
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
326
+ result->m11 = 1;
327
+ result->m22 = cos( angle );
328
+ result->m23 = sin( angle );
329
+ result->m32 = -result->m23;
330
+ result->m33 = result->m22;
331
+ result->m44 = 1;
332
+
333
+ return vresult;
334
+ }
335
+ /* y����]�s��쐬 */
336
+ static VALUE Matrix_create_rot_y( VALUE klass, VALUE vangle )
337
+ {
338
+ struct DXRubyMatrix *result;
339
+ VALUE vresult;
340
+ float angle;
341
+
342
+ vresult = Matrix_allocate( cMatrix );
343
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
344
+
345
+ result->x = 4;
346
+ result->y = 4;
347
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
348
+ result->m11 = cos( angle );
349
+ result->m13 = -sin( angle );
350
+ result->m22 = 1;
351
+ result->m31 = -result->m13;
352
+ result->m33 = result->m11;
353
+ result->m44 = 1;
354
+
355
+ return vresult;
356
+ }
357
+ /* z����]�s��쐬 */
358
+ static VALUE Matrix_create_rot_z( VALUE klass, VALUE vangle )
359
+ {
360
+ struct DXRubyMatrix *result;
361
+ VALUE vresult;
362
+ float angle;
363
+
364
+ vresult = Matrix_allocate( cMatrix );
365
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
366
+
367
+ result->x = 4;
368
+ result->y = 4;
369
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
370
+ result->m11 = cos( angle );
371
+ result->m12 = sin( angle );
372
+ result->m21 = -result->m12;
373
+ result->m22 = result->m11;
374
+ result->m33 = 1;
375
+ result->m44 = 1;
376
+
377
+ return vresult;
378
+ }
379
+ /* ���s�ړ��s��쐬 */
380
+ static VALUE Matrix_create_trans( int argc, VALUE *argv, VALUE self )
381
+ {
382
+ struct DXRubyMatrix *result;
383
+ VALUE vresult;
384
+
385
+ if( argc < 1 || argc > 3 ) rb_raise( eDXRubyError, "�����̐�������������܂���B - Matrix_create_trans");
386
+
387
+ vresult = Matrix_allocate( cMatrix );
388
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
389
+
390
+ if( argc == 1 )
391
+ {
392
+ result->x = 2;
393
+ result->y = 2;
394
+ result->m11 = 1;
395
+ result->m21 = NUM2FLOAT( argv[0] );
396
+ result->m22 = 1;
397
+ }
398
+ else if( argc == 2 )
399
+ {
400
+ result->x = 3;
401
+ result->y = 3;
402
+ result->m11 = 1;
403
+ result->m22 = 1;
404
+ result->m31 = NUM2FLOAT( argv[0] );
405
+ result->m32 = NUM2FLOAT( argv[1] );
406
+ result->m33 = 1;
407
+ }
408
+ else if( argc == 3)
409
+ {
410
+ result->x = 4;
411
+ result->y = 4;
412
+ result->m11 = 1;
413
+ result->m22 = 1;
414
+ result->m33 = 1;
415
+ result->m41 = NUM2FLOAT( argv[0] );
416
+ result->m42 = NUM2FLOAT( argv[1] );
417
+ result->m43 = NUM2FLOAT( argv[2] );
418
+ result->m44 = 1;
419
+ }
420
+
421
+ return vresult;
422
+ }
423
+ /* �X�P�[�����O�s��쐬 */
424
+ static VALUE Matrix_create_scale( int argc, VALUE *argv, VALUE self )
425
+ {
426
+ struct DXRubyMatrix *result;
427
+ VALUE vresult;
428
+
429
+ if( argc < 1 || argc > 3 ) rb_raise( eDXRubyError, "�����̐�������������܂���B - Matrix_create_scale");
430
+
431
+ vresult = Matrix_allocate( cMatrix );
432
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
433
+
434
+ if( argc == 1 )
435
+ {
436
+ result->x = 2;
437
+ result->y = 2;
438
+ result->m11 = NUM2FLOAT( argv[0] );
439
+ result->m22 = 1;
440
+ }
441
+ else if( argc == 2 )
442
+ {
443
+ result->x = 3;
444
+ result->y = 3;
445
+ result->m11 = NUM2FLOAT( argv[0] );
446
+ result->m22 = NUM2FLOAT( argv[1] );
447
+ result->m33 = 1;
448
+ }
449
+ else if( argc == 3)
450
+ {
451
+ result->x = 4;
452
+ result->y = 4;
453
+ result->m11 = NUM2FLOAT( argv[0] );
454
+ result->m22 = NUM2FLOAT( argv[1] );
455
+ result->m33 = NUM2FLOAT( argv[2] );
456
+ result->m44 = 1;
457
+ }
458
+
459
+ return vresult;
460
+ }
461
+
462
+ /* �z�� */
463
+ static VALUE Matrix_to_a( VALUE self )
464
+ {
465
+ struct DXRubyMatrix *mat = DXRUBY_GET_STRUCT( Matrix, self );
466
+ VALUE vresult;
467
+ int i, j;
468
+
469
+ vresult = rb_ary_new();
470
+ for( i = 0; i < mat->y; i++ )
471
+ {
472
+ for( j = 0; j < mat->x; j++ )
473
+ {
474
+ rb_ary_push( vresult, rb_float_new( mat->m[i][j] ) );
475
+ }
476
+ }
477
+ return vresult;
478
+ }
479
+
480
+ /* �t�s��쐬 */
481
+ static VALUE Matrix_inverse( VALUE self )
482
+ {
483
+ struct DXRubyMatrix *mat = DXRUBY_GET_STRUCT( Matrix, self );
484
+ struct DXRubyMatrix *result;
485
+ VALUE vresult;
486
+
487
+ vresult = Matrix_allocate( cMatrix );
488
+ result = DXRUBY_GET_STRUCT( Matrix, vresult );
489
+ result->x = result->y = 4;
490
+ D3DXMatrixInverse( (D3DMATRIX *)&result->m, 0, (D3DMATRIX *)&mat->m);
491
+
492
+ return vresult;
493
+ }
494
+
495
+
496
+ /*********************************************************************
497
+ * Vector�N���X
498
+ *
499
+ * �x�N�g����\������B
500
+ *********************************************************************/
501
+
502
+ /*--------------------------------------------------------------------
503
+ �Q�Ƃ���Ȃ��Ȃ����Ƃ���GC����Ă΂��֐�
504
+ ---------------------------------------------------------------------*/
505
+ void Vector_release( struct DXRubyVector* vec )
506
+ {
507
+ vec->v1 = 0;
508
+ free( vec );
509
+ }
510
+
511
+ #ifdef DXRUBY_USE_TYPEDDATA
512
+ const rb_data_type_t Vector_data_type = {
513
+ "Vector",
514
+ {
515
+ 0,
516
+ Vector_release,
517
+ 0,
518
+ },
519
+ NULL, NULL
520
+ };
521
+ #endif
522
+
523
+ /*--------------------------------------------------------------------
524
+ Vector�N���X��allocate�B���������m�ۂ���ׂ�initialize�O�ɌĂ΂��B
525
+ ---------------------------------------------------------------------*/
526
+ VALUE Vector_allocate( VALUE klass )
527
+ {
528
+ VALUE obj;
529
+ struct DXRubyVector *vec;
530
+
531
+ /* DXRubyVector�̃������擾��Vector�I�u�W�F�N�g���� */
532
+ vec = malloc( sizeof( struct DXRubyVector ) );
533
+ if( vec == NULL ) rb_raise( eDXRubyError, "�������̎擾�Ɏ��s���܂��� - Vector_allocate" );
534
+ #ifdef DXRUBY_USE_TYPEDDATA
535
+ obj = TypedData_Wrap_Struct( klass, &Vector_data_type, vec );
536
+ #else
537
+ obj = Data_Wrap_Struct( klass, 0, Vector_release, vec );
538
+ #endif
539
+ vec->x = 0;
540
+ vec->v1 = 0;
541
+ vec->v2 = 0;
542
+ vec->v3 = 0;
543
+ vec->v4 = 0;
544
+
545
+ return obj;
546
+ }
547
+
548
+ /*--------------------------------------------------------------------
549
+ Vector�N���X��Initialize
550
+ ---------------------------------------------------------------------*/
551
+ static VALUE Vector_initialize( int argc, VALUE *argv, VALUE self )
552
+ {
553
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
554
+ VALUE *ary_p;
555
+ int i, count;
556
+
557
+ if( argc == 0 )
558
+ {
559
+ return self;
560
+ }
561
+
562
+ if( argc == 1 && TYPE( argv[0] ) == T_ARRAY )
563
+ {
564
+ if( RARRAY_LEN( argv[0] ) > 4 || RARRAY_LEN( argv[0] ) < 1 ) rb_raise( eDXRubyError, "�z��̗v�f��������������܂���B - Vector_initialize");
565
+ ary_p = RARRAY_PTR( argv[0] );
566
+ count = RARRAY_LEN( argv[0] );
567
+ }
568
+ else
569
+ {
570
+ if( argc > 4 ) rb_raise( eDXRubyError, "�����̐�������������܂���B - Vector_initialize");
571
+ ary_p = argv;
572
+ count = argc;
573
+ }
574
+
575
+ vec->x = count;
576
+ for( i = 0; i < count; i++ )
577
+ {
578
+ vec->v[i] = NUM2FLOAT( ary_p[i] );
579
+ }
580
+
581
+ return self;
582
+ }
583
+
584
+ static VALUE Vector_mul( VALUE self, VALUE varg )
585
+ {
586
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
587
+ struct DXRubyVector *result;
588
+ VALUE vresult;
589
+ vresult = Vector_allocate( cVector );
590
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
591
+ result->x = vec->x;
592
+
593
+ if( FIXNUM_P( varg ) || TYPE( varg ) == T_FLOAT || TYPE( varg ) == T_BIGNUM )
594
+ {
595
+ int i;
596
+
597
+ for( i = 0; i < vec->x; i++ )
598
+ {
599
+ result->v[i] = vec->v[i] * NUM2FLOAT( varg );
600
+ }
601
+ }
602
+ else if( DXRUBY_CHECK( Vector, varg ) )
603
+ {
604
+ int i;
605
+ struct DXRubyVector* vec_s = DXRUBY_GET_STRUCT( Vector, varg );
606
+
607
+ for( i = 0; i < vec->x; i++ )
608
+ {
609
+ result->v[i] = vec->v[i];
610
+ }
611
+
612
+ for( i = 0; i < vec->x && i < vec_s->x; i++ )
613
+ {
614
+ result->v[i] = vec->v[i] * vec_s->v[i];
615
+ }
616
+ }
617
+ else if( DXRUBY_CHECK( Matrix, varg ) )
618
+ {
619
+ struct DXRubyMatrix *mat;
620
+ int i, j;
621
+ float temp[4] = {1.0f,1.0f,1.0f,1.0f};
622
+ DXRUBY_CHECK_TYPE( Matrix, varg );
623
+ mat = DXRUBY_GET_STRUCT( Matrix, varg );
624
+
625
+ if( vec->x != mat->y && vec->x != mat->y - 1 ) rb_raise( eDXRubyError, "�v�f������v���Ă��܂���B - Vector_mul");
626
+ for( i = 0; i < vec->x; i++ )
627
+ {
628
+ temp[i] = vec->v[i];
629
+ }
630
+
631
+ for( i = 0; i < mat->x; i++ )
632
+ {
633
+ for( j = 0; j < mat->y; j++)
634
+ {
635
+ result->v[i] += temp[j] * mat->m[j][i];
636
+ }
637
+ }
638
+
639
+ for( i = result->x; i < 4; i++)
640
+ {
641
+ result->v[i] = 0.0f;
642
+ }
643
+ }
644
+ else
645
+ {
646
+ rb_raise( eDXRubyError, "�������ُ�ł� - Vector_mul");
647
+ }
648
+
649
+ return vresult;
650
+ }
651
+
652
+ static VALUE Vector_add( VALUE self, VALUE varg )
653
+ {
654
+ struct DXRubyVector *vec_d = DXRUBY_GET_STRUCT( Vector, self );
655
+ struct DXRubyVector *vec_s;
656
+ struct DXRubyVector *result;
657
+ VALUE vresult;
658
+ int i;
659
+
660
+ vresult = Vector_allocate( cVector );
661
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
662
+ result->x = vec_d->x;
663
+
664
+ if( FIXNUM_P( varg ) || TYPE( varg ) == T_FLOAT || TYPE( varg ) == T_BIGNUM )
665
+ {
666
+ for( i = 0; i < vec_d->x; i++ )
667
+ {
668
+ result->v[i] = vec_d->v[i] + NUM2FLOAT( varg );
669
+ }
670
+ }
671
+ else
672
+ {
673
+ DXRUBY_CHECK_TYPE( Vector, varg );
674
+ vec_s = DXRUBY_GET_STRUCT( Vector, varg );
675
+
676
+ for( i = 0; i < vec_d->x; i++ )
677
+ {
678
+ result->v[i] = vec_d->v[i];
679
+ }
680
+
681
+ for( i = 0; i < vec_d->x && i < vec_s->x; i++ )
682
+ {
683
+ result->v[i] = vec_d->v[i] + vec_s->v[i];
684
+ }
685
+ }
686
+
687
+ return vresult;
688
+ }
689
+
690
+ static VALUE Vector_sub( VALUE self, VALUE varg )
691
+ {
692
+ struct DXRubyVector *vec_d = DXRUBY_GET_STRUCT( Vector, self );
693
+ struct DXRubyVector *vec_s;
694
+ struct DXRubyVector *result;
695
+ VALUE vresult;
696
+ int i;
697
+
698
+ vresult = Vector_allocate( cVector );
699
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
700
+ result->x = vec_d->x;
701
+
702
+ if( FIXNUM_P( varg ) || TYPE( varg ) == T_FLOAT || TYPE( varg ) == T_BIGNUM )
703
+ {
704
+ for( i = 0; i < vec_d->x; i++ )
705
+ {
706
+ result->v[i] = vec_d->v[i] - NUM2FLOAT( varg );
707
+ }
708
+ }
709
+ else
710
+ {
711
+ DXRUBY_CHECK_TYPE( Vector, varg );
712
+ vec_s = DXRUBY_GET_STRUCT( Vector, varg );
713
+
714
+ for( i = 0; i < vec_d->x; i++ )
715
+ {
716
+ result->v[i] = vec_d->v[i];
717
+ }
718
+
719
+ for( i = 0; i < vec_d->x && i < vec_s->x; i++ )
720
+ {
721
+ result->v[i] = vec_d->v[i] - vec_s->v[i];
722
+ }
723
+ }
724
+
725
+ return vresult;
726
+ }
727
+
728
+ static VALUE Vector_div( VALUE self, VALUE varg )
729
+ {
730
+ struct DXRubyVector *vec_d = DXRUBY_GET_STRUCT( Vector, self );
731
+ struct DXRubyVector *vec_s;
732
+ struct DXRubyVector *result;
733
+ VALUE vresult;
734
+ int i;
735
+
736
+ vresult = Vector_allocate( cVector );
737
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
738
+ result->x = vec_d->x;
739
+
740
+ if( FIXNUM_P( varg ) || TYPE( varg ) == T_FLOAT || TYPE( varg ) == T_BIGNUM )
741
+ {
742
+ for( i = 0; i < vec_d->x; i++ )
743
+ {
744
+ result->v[i] = vec_d->v[i] / NUM2FLOAT( varg );
745
+ }
746
+ }
747
+ else
748
+ {
749
+ DXRUBY_CHECK_TYPE( Vector, varg );
750
+ vec_s = DXRUBY_GET_STRUCT( Vector, varg );
751
+
752
+ for( i = 0; i < vec_d->x; i++ )
753
+ {
754
+ result->v[i] = vec_d->v[i];
755
+ }
756
+
757
+ for( i = 0; i < vec_d->x && i < vec_s->x; i++ )
758
+ {
759
+ result->v[i] = vec_d->v[i] / vec_s->v[i];
760
+ }
761
+ }
762
+
763
+ return vresult;
764
+ }
765
+
766
+ static VALUE Vector_minus( VALUE self )
767
+ {
768
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
769
+ struct DXRubyVector *result;
770
+ VALUE vresult;
771
+ int i;
772
+
773
+ vresult = Vector_allocate( cVector );
774
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
775
+ result->x = vec->x;
776
+
777
+ for( i = 0; i < vec->x; i++ )
778
+ {
779
+ result->v[i] = -vec->v[i];
780
+ }
781
+
782
+ return vresult;
783
+ }
784
+
785
+ static VALUE Vector_normalize( VALUE self )
786
+ {
787
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
788
+ struct DXRubyVector *result;
789
+ VALUE vresult;
790
+ float magsq = vec->v1*vec->v1 + vec->v2*vec->v2 + vec->v3*vec->v3 + vec->v4*vec->v4;
791
+ int i;
792
+
793
+ vresult = Vector_allocate( cVector );
794
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
795
+ result->x = vec->x;
796
+
797
+ if( magsq > 0.0f )
798
+ {
799
+ float temp = 1.0f / sqrt( magsq );
800
+ int i;
801
+ for( i = 0; i < vec->x; i++ )
802
+ {
803
+ result->v[i] = temp * vec->v[i];
804
+ }
805
+ }
806
+
807
+ return vresult;
808
+ }
809
+
810
+ static VALUE Vector_distance( VALUE klass, VALUE vvec1, VALUE vvec2 )
811
+ {
812
+ struct DXRubyVector *vec1;
813
+ struct DXRubyVector *vec2;
814
+ float dx, dy, dz, dw;
815
+
816
+ DXRUBY_CHECK_TYPE( Vector, vvec1 );
817
+ DXRUBY_CHECK_TYPE( Vector, vvec2 );
818
+ vec1 = DXRUBY_GET_STRUCT( Vector, vvec1 );
819
+ vec2 = DXRUBY_GET_STRUCT( Vector, vvec2 );
820
+
821
+ dx = vec1->v1 - vec2->v1;
822
+ dy = vec1->v2 - vec2->v2;
823
+ dz = vec1->v3 - vec2->v3;
824
+ dw = vec1->v4 - vec2->v4;
825
+ return rb_float_new( sqrt( dx*dx + dy*dy + dz*dz + dw*dw ) );
826
+ }
827
+
828
+ static VALUE Vector_cross_product( VALUE klass, VALUE vvec1, VALUE vvec2 )
829
+ {
830
+ struct DXRubyVector *vec1;
831
+ struct DXRubyVector *vec2;
832
+ struct DXRubyVector *result;
833
+ VALUE vresult;
834
+
835
+ DXRUBY_CHECK_TYPE( Vector, vvec1 );
836
+ DXRUBY_CHECK_TYPE( Vector, vvec2 );
837
+ vec1 = DXRUBY_GET_STRUCT( Vector, vvec1 );
838
+ vec2 = DXRUBY_GET_STRUCT( Vector, vvec2 );
839
+
840
+ vresult = Vector_allocate( cVector );
841
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
842
+ result->x = 3;
843
+
844
+ result->v1 = vec1->v2*vec2->v3 - vec1->v3*vec2->v2;
845
+ result->v2 = vec1->v3*vec2->v1 - vec1->v1*vec2->v3;
846
+ result->v3 = vec1->v1*vec2->v2 - vec1->v2*vec2->v1;
847
+
848
+ return vresult;
849
+ }
850
+
851
+ static VALUE Vector_dot_product( VALUE klass, VALUE vvec1, VALUE vvec2 )
852
+ {
853
+ struct DXRubyVector *vec1;
854
+ struct DXRubyVector *vec2;
855
+ DXRUBY_CHECK_TYPE( Vector, vvec1 );
856
+ DXRUBY_CHECK_TYPE( Vector, vvec2 );
857
+ vec1 = DXRUBY_GET_STRUCT( Vector, vvec1 );
858
+ vec2 = DXRUBY_GET_STRUCT( Vector, vvec2 );
859
+ return rb_float_new( vec1->v1 * vec2->v1 + vec1->v2 * vec2->v2 + vec1->v3 * vec2->v3 + vec1->v4 * vec2->v4 );
860
+ }
861
+
862
+ static VALUE Vector_to_s( VALUE self )
863
+ {
864
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
865
+ char buf[1024];
866
+ switch( vec->x ) {
867
+ case 1:
868
+ sprintf( buf, "size = %d (%f)", vec->x, vec->v1 );
869
+ break;
870
+ case 2:
871
+ sprintf( buf, "size = %d (%f, %f)", vec->x, vec->v1, vec->v2 );
872
+ break;
873
+ case 3:
874
+ sprintf( buf, "size = %d (%f, %f, %f)", vec->x, vec->v1, vec->v2, vec->v3 );
875
+ break;
876
+ default:
877
+ sprintf( buf, "size = %d (%f, %f, %f, %f)", vec->x, vec->v1, vec->v2, vec->v3, vec->v4 );
878
+ break;
879
+ }
880
+ return rb_str_new2( buf );
881
+ }
882
+
883
+ static VALUE Vector_get_x( VALUE self )
884
+ {
885
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
886
+ return rb_float_new(vec->v1);
887
+ }
888
+
889
+ static VALUE Vector_get_y( VALUE self )
890
+ {
891
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
892
+ return rb_float_new(vec->v2);
893
+ }
894
+
895
+ static VALUE Vector_get_z( VALUE self )
896
+ {
897
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
898
+ return rb_float_new(vec->v3);
899
+ }
900
+
901
+ static VALUE Vector_get_w( VALUE self )
902
+ {
903
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
904
+ return rb_float_new(vec->v4);
905
+ }
906
+
907
+ static VALUE Vector_get_size( VALUE self )
908
+ {
909
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
910
+ return rb_float_new(vec->x);
911
+ }
912
+
913
+ static VALUE Vector_get_xy( VALUE self )
914
+ {
915
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
916
+ struct DXRubyVector *result;
917
+ VALUE vresult;
918
+
919
+ vresult = Vector_allocate( cVector );
920
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
921
+ result->x = 2;
922
+
923
+ result->v1 = vec->v1;
924
+ result->v2 = vec->v2;
925
+
926
+ return vresult;
927
+ }
928
+
929
+ static VALUE Vector_get_xyz( VALUE self )
930
+ {
931
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
932
+ struct DXRubyVector *result;
933
+ VALUE vresult;
934
+
935
+ vresult = Vector_allocate( cVector );
936
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
937
+ result->x = 3;
938
+
939
+ result->v1 = vec->v1;
940
+ result->v2 = vec->v2;
941
+ result->v3 = vec->v3;
942
+
943
+ return vresult;
944
+ }
945
+
946
+ static VALUE Vector_equal( VALUE self, VALUE vvector )
947
+ {
948
+ struct DXRubyVector *vec_d = DXRUBY_GET_STRUCT( Vector, self );
949
+ struct DXRubyVector *vec_s;
950
+ int i;
951
+
952
+ DXRUBY_CHECK_TYPE( Vector, vvector );
953
+ vec_s = DXRUBY_GET_STRUCT( Vector, vvector );
954
+
955
+ if( vec_d->x != vec_s->x )
956
+ {
957
+ return Qfalse;
958
+ }
959
+ for( i = 0; i < vec_d->x; i++ )
960
+ {
961
+ if( vec_d->v[i] != vec_s->v[i] )
962
+ {
963
+ return Qfalse;
964
+ }
965
+ }
966
+
967
+ return Qtrue;
968
+ }
969
+
970
+ static VALUE Vector_translate( int argc, VALUE *argv, VALUE self )
971
+ {
972
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
973
+ struct DXRubyVector *result;
974
+ VALUE vresult;
975
+ int i;
976
+
977
+ if( argc < 1 || argc > 4 ) rb_raise( eDXRubyError, "�����̐�������������܂���B - Vector_translate");
978
+ vresult = Vector_allocate( cVector );
979
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
980
+ result->x = vec->x;
981
+
982
+ for( i = 0; i < vec->x; i++ )
983
+ {
984
+ result->v[i] = vec->v[i];
985
+ }
986
+
987
+ for( i = 0; i < vec->x && i < argc; i++ )
988
+ {
989
+ result->v[i] = vec->v[i] + NUM2FLOAT( argv[i] );
990
+ }
991
+
992
+ return vresult;
993
+ }
994
+
995
+ static VALUE Vector_rotate( int argc, VALUE *argv, VALUE obj )
996
+ {
997
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, obj );
998
+ struct DXRubyVector *center = NULL;
999
+ struct DXRubyVector *result;
1000
+ VALUE vresult, vangle, vcenter;
1001
+ float angle, x, y;
1002
+
1003
+ if( vec->x != 2 && vec->x != 3 ) rb_raise( eDXRubyError, "2D��]�ł���Vector�ł͂���܂��� - Vector_rotate");
1004
+
1005
+ rb_scan_args( argc, argv, "11", &vangle, &vcenter );
1006
+
1007
+ if( vcenter != Qnil )
1008
+ {
1009
+ center = DXRUBY_GET_STRUCT( Vector, vcenter );
1010
+ if( center->x != 2 && center->x != 3 ) rb_raise( eDXRubyError, "��]���S�ɐݒ�ł���Vector�ł͂���܂��� - Vector_rotate");
1011
+ }
1012
+
1013
+ vresult = Vector_allocate( cVector );
1014
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
1015
+ result->x = vec->x;
1016
+ x = vec->v1;
1017
+ y = vec->v2;
1018
+
1019
+ if( center )
1020
+ {
1021
+ x -= center->v1;
1022
+ y -= center->v2;
1023
+ }
1024
+
1025
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
1026
+ x = cos( angle ) * x - sin( angle ) * y;
1027
+ y = sin( angle ) * x + cos( angle ) * y;
1028
+
1029
+ if( center )
1030
+ {
1031
+ x += center->v1;
1032
+ y += center->v2;
1033
+ }
1034
+
1035
+ result->v1 = x;
1036
+ result->v2 = y;
1037
+ result->v3 = vec->v3;
1038
+
1039
+ return vresult;
1040
+ }
1041
+
1042
+ static VALUE Vector_rotate_x( VALUE self, VALUE vangle )
1043
+ {
1044
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
1045
+ struct DXRubyVector *result;
1046
+ VALUE vresult;
1047
+ float angle;
1048
+
1049
+ if( vec->x != 3 && vec->x != 4 ) rb_raise( eDXRubyError, "3D��]�ł���Vector�ł͂���܂��� - Vector_rotate_x");
1050
+ vresult = Vector_allocate( cVector );
1051
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
1052
+ result->x = vec->x;
1053
+
1054
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
1055
+ result->v1 = vec->v1;
1056
+ result->v2 = -sin( angle ) * vec->v2 + cos( angle ) * vec->v3;
1057
+ result->v3 = cos( angle ) * vec->v2 + sin( angle ) * vec->v3;
1058
+ result->v4 = vec->v4;
1059
+
1060
+ return vresult;
1061
+ }
1062
+
1063
+ static VALUE Vector_rotate_y( VALUE self, VALUE vangle )
1064
+ {
1065
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
1066
+ struct DXRubyVector *result;
1067
+ VALUE vresult;
1068
+ float angle;
1069
+
1070
+ if( vec->x != 3 && vec->x != 4 ) rb_raise( eDXRubyError, "3D��]�ł���Vector�ł͂���܂��� - Vector_rotate_x");
1071
+ vresult = Vector_allocate( cVector );
1072
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
1073
+ result->x = vec->x;
1074
+
1075
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
1076
+ result->v1 = sin( angle ) * vec->v1 + cos( angle ) * vec->v3;
1077
+ result->v2 = vec->v2;
1078
+ result->v3 = cos( angle ) * vec->v1 - sin( angle ) * vec->v3;
1079
+ result->v4 = vec->v4;
1080
+
1081
+ return vresult;
1082
+ }
1083
+
1084
+ static VALUE Vector_rotate_z( VALUE self, VALUE vangle )
1085
+ {
1086
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
1087
+ struct DXRubyVector *result;
1088
+ VALUE vresult;
1089
+ float angle;
1090
+
1091
+ if( vec->x != 3 && vec->x != 4 ) rb_raise( eDXRubyError, "3D��]�ł���Vector�ł͂���܂��� - Vector_rotate_x");
1092
+ vresult = Vector_allocate( cVector );
1093
+ result = DXRUBY_GET_STRUCT( Vector, vresult );
1094
+ result->x = vec->x;
1095
+
1096
+ angle = pi / 180.0f * NUM2FLOAT( vangle );
1097
+ result->v1 = cos( angle ) * vec->v1 - sin( angle ) * vec->v2;
1098
+ result->v2 = sin( angle ) * vec->v1 + cos( angle ) * vec->v2;
1099
+ result->v3 = vec->v3;
1100
+ result->v4 = vec->v4;
1101
+
1102
+ return vresult;
1103
+ }
1104
+
1105
+ /* �z�� */
1106
+ static VALUE Vector_to_a( VALUE self )
1107
+ {
1108
+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
1109
+ VALUE vresult;
1110
+ int i;
1111
+
1112
+ vresult = rb_ary_new();
1113
+ for( i = 0; i < vec->x; i++ )
1114
+ {
1115
+ rb_ary_push( vresult, rb_float_new( vec->v[i] ) );
1116
+ }
1117
+ return vresult;
1118
+ }
1119
+
1120
+
1121
+ static VALUE Vector_angle_to( VALUE self, VALUE vvector )
1122
+ {
1123
+ struct DXRubyVector *vec_d = DXRUBY_GET_STRUCT( Vector, self );
1124
+ struct DXRubyVector *vec_s;
1125
+ float angle;
1126
+
1127
+ DXRUBY_CHECK_TYPE( Vector, vvector );
1128
+ vec_s = DXRUBY_GET_STRUCT( Vector, vvector );
1129
+
1130
+ angle = atan2(vec_s->v2 - vec_d->v2, vec_s->v1 - vec_d->v1) / pi * 180;
1131
+
1132
+ return rb_float_new(angle);
1133
+ }
1134
+
1135
+
1136
+ /*
1137
+ ***************************************************************
1138
+ *
1139
+ * Global functions
1140
+ *
1141
+ ***************************************************************/
1142
+
1143
+ void Init_dxruby_Matrix()
1144
+ {
1145
+
1146
+ /* Matrix�N���X��` */
1147
+ cMatrix = rb_define_class_under( mDXRuby, "Matrix", rb_cObject );
1148
+
1149
+ /* Matrix�N���X�ɃN���X���\�b�h�o�^*/
1150
+ rb_define_singleton_method( cMatrix, "look_at", Matrix_look_at, 3 );
1151
+ rb_define_singleton_method( cMatrix, "lookAt", Matrix_look_at, 3 );
1152
+ rb_define_singleton_method( cMatrix, "projection", Matrix_create_projection, 4 );
1153
+ rb_define_singleton_method( cMatrix, "projection_fov", Matrix_create_projection_fov, 4 );
1154
+ rb_define_singleton_method( cMatrix, "projectionFov", Matrix_create_projection_fov, 4 );
1155
+ rb_define_singleton_method( cMatrix, "projection_ortho", Matrix_create_projection_ortho, 4 );
1156
+ rb_define_singleton_method( cMatrix, "projectionOrtho", Matrix_create_projection_ortho, 4 );
1157
+ rb_define_singleton_method( cMatrix, "rotation", Matrix_create_rot, 1 );
1158
+ rb_define_singleton_method( cMatrix, "rotation_x", Matrix_create_rot_x, 1 );
1159
+ rb_define_singleton_method( cMatrix, "rotationX", Matrix_create_rot_x, 1 );
1160
+ rb_define_singleton_method( cMatrix, "rotation_y", Matrix_create_rot_y, 1 );
1161
+ rb_define_singleton_method( cMatrix, "rotationY", Matrix_create_rot_y, 1 );
1162
+ rb_define_singleton_method( cMatrix, "rotation_z", Matrix_create_rot_z, 1 );
1163
+ rb_define_singleton_method( cMatrix, "rotationZ", Matrix_create_rot_z, 1 );
1164
+ rb_define_singleton_method( cMatrix, "scaling", Matrix_create_scale, -1 );
1165
+ rb_define_singleton_method( cMatrix, "translation", Matrix_create_trans, -1 );
1166
+
1167
+ /* Matrix�N���X�ɃC���X�^���X���\�b�h�o�^*/
1168
+ rb_define_private_method( cMatrix, "initialize", Matrix_initialize, -1 );
1169
+ rb_define_method( cMatrix, "*", Matrix_mul, 1 );
1170
+ rb_define_method( cMatrix, "to_s", Matrix_to_s, 0 );
1171
+ rb_define_method( cMatrix, "to_a", Matrix_to_a, 0 );
1172
+ rb_define_method( cMatrix, "inverse", Matrix_inverse, 0 );
1173
+
1174
+ /* Matrix�I�u�W�F�N�g�𐶐���������initialize�̑O�ɌĂ΂�郁�������蓖�Ċ֐��o�^ */
1175
+ rb_define_alloc_func( cMatrix, Matrix_allocate );
1176
+
1177
+
1178
+ /* Vector�N���X��` */
1179
+ cVector = rb_define_class_under( mDXRuby, "Vector", rb_cObject );
1180
+
1181
+ /* Vector�N���X�ɃN���X���\�b�h�o�^*/
1182
+ rb_define_singleton_method( cVector, "distance", Vector_distance, 2 );
1183
+ rb_define_singleton_method( cVector, "cross_product", Vector_cross_product, 2 );
1184
+ rb_define_singleton_method( cVector, "crossProduct", Vector_cross_product, 2 );
1185
+ rb_define_singleton_method( cVector, "dot_product", Vector_dot_product, 2 );
1186
+ rb_define_singleton_method( cVector, "dotProduct", Vector_dot_product, 2 );
1187
+
1188
+ /* Vector�N���X�ɃC���X�^���X���\�b�h�o�^*/
1189
+ rb_define_private_method( cVector, "initialize", Vector_initialize, -1 );
1190
+ rb_define_method( cVector, "*", Vector_mul, 1 );
1191
+ rb_define_method( cVector, "+", Vector_add, 1 );
1192
+ rb_define_method( cVector, "-", Vector_sub, 1 );
1193
+ rb_define_method( cVector, "-@", Vector_minus, 0 );
1194
+ rb_define_method( cVector, "/", Vector_div, 1 );
1195
+ rb_define_method( cVector, "to_s", Vector_to_s, 0 );
1196
+ rb_define_method( cVector, "to_a", Vector_to_a, 0 );
1197
+ rb_define_method( cVector, "x", Vector_get_x, 0 );
1198
+ rb_define_method( cVector, "y", Vector_get_y, 0 );
1199
+ rb_define_method( cVector, "z", Vector_get_z, 0 );
1200
+ rb_define_method( cVector, "w", Vector_get_w, 0 );
1201
+ rb_define_method( cVector, "xy", Vector_get_xy, 0 );
1202
+ rb_define_method( cVector, "xyz", Vector_get_xyz, 0 );
1203
+ rb_define_method( cVector, "size", Vector_get_size, 0 );
1204
+ rb_define_method( cVector, "normalize", Vector_normalize, 0 );
1205
+ rb_define_method( cVector, "==", Vector_equal, 1 );
1206
+ rb_define_method( cVector, "translate", Vector_translate, -1 );
1207
+ rb_define_method( cVector, "rotate", Vector_rotate, -1 );
1208
+ rb_define_method( cVector, "rotate_x", Vector_rotate_x, 1 );
1209
+ rb_define_method( cVector, "rotateX", Vector_rotate_x, 1 );
1210
+ rb_define_method( cVector, "rotate_y", Vector_rotate_y, 1 );
1211
+ rb_define_method( cVector, "rotateY", Vector_rotate_y, 1 );
1212
+ rb_define_method( cVector, "rotate_z", Vector_rotate_z, 1 );
1213
+ rb_define_method( cVector, "rotateZ", Vector_rotate_z, 1 );
1214
+ rb_define_method( cVector, "angle_to", Vector_angle_to, 1 );
1215
+ rb_define_method( cVector, "angleTo", Vector_angle_to, 1 );
1216
+
1217
+ /* Vector�I�u�W�F�N�g�𐶐���������initialize�̑O�ɌĂ΂�郁�������蓖�Ċ֐��o�^ */
1218
+ rb_define_alloc_func( cVector, Vector_allocate );
1219
+
1220
+ }
1221
+