ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
vusw.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # (c) 2009 Lion
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
11 #include <libvux.h>
12 
13 #include "vux.h"
14 
15 
16 #include <math.h>
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
31 {
32 
33  VuxResetMatrix(m);
34 }
35 
36 
37 
38 
40 {
41 
42  m->m[0][0]=1.0f; m->m[0][1]=0.0f; m->m[0][2]=0.0f; m->m[0][3]=0.0f;
43  m->m[1][0]=0.0f; m->m[1][1]=1.0f; m->m[1][2]=0.0f; m->m[1][3]=0.0f;
44  m->m[2][0]=0.0f; m->m[2][1]=0.0f; m->m[2][2]=1.0f; m->m[2][3]=0.0f;
45  m->m[3][0]=0.0f; m->m[3][1]=0.0f; m->m[3][2]=0.0f; m->m[3][3]=1.0f;
46 }
47 
48 
49 
50 
52 {
53  VU_MATRIX mx,my,mz, m0;
54 
55  VuxResetMatrix(m);
56  mx = my = mz = m0 = *m;
57 
58 
59  VuxRotMatrixX(&mx, r->x);
60  VuxRotMatrixY(&my, r->y);
61  VuxRotMatrixZ(&mz, r->z);
62 
63 // VuxMulMatrix(&my, &mx, &m0);
64 // VuxMulMatrix(&mz, &m0, m);
65  VuxMulMatrix(&mz, &mx, &m0);
66  VuxMulMatrix(&my, &m0, m);
67 }
68 
69 
70 
71 
72 
73 
74 void VuxRotMatrixX(VU_MATRIX *m, float x)
75 {
76  float cs,sn;
77 
78  cs = cosf(x);
79  sn = sinf(x);
80 
81 
82  m->m[1][1] = cs;
83  m->m[1][2] = sn;
84  m->m[2][1] = -sn;
85  m->m[2][2] = cs;
86 
87 
88 /* colum major(left hand)
89  m->m[1][1] = cs;
90  m->m[1][2] = -sn;
91  m->m[2][1] = sn;
92  m->m[2][2] = cs;
93 */
94 }
95 
96 
97 
98 
99 
100 
101 void VuxRotMatrixY(VU_MATRIX *m, float y)
102 {
103  float cs,sn;
104 
105  cs = cosf(y);
106  sn = sinf(y);
107 
108 
109  m->m[0][0] = cs;
110  m->m[0][2] = -sn;
111  m->m[2][0] = sn;
112  m->m[2][2] = cs;
113 
114 
115 /* colum major(left hand)
116  m->m[0][0] = cs;
117  m->m[0][2] = sn;
118  m->m[2][0] = -sn;
119  m->m[2][2] = cs;
120 
121  */
122 }
123 
124 
125 
126 
127 
128 
129 void VuxRotMatrixZ(VU_MATRIX *m, float z)
130 {
131  float cs,sn;
132 
133  cs = cosf(z);
134  sn = sinf(z);
135 
136 
137  m->m[0][0] = cs;
138  m->m[0][1] = sn;
139  m->m[1][0] = -sn;
140  m->m[1][1] = cs;
141 
142 
143  /* colum major(left hand)
144  m->m[0][0] = cs;
145  m->m[0][1] = -sn;
146  m->m[1][0] = sn;
147  m->m[1][1] = cs;
148 */
149 }
150 
151 
152 
153 
154 
155 
156 
157 void VuxRotMatrixXYZ(VU_MATRIX *m, float x,float y, float z)
158 {
159  VU_MATRIX mx,my,mz, m0;
160 
161  VuxResetMatrix(m);
162  mx = my = mz = m0 = *m;
163 
164  VuxRotMatrixX(&mx, x);
165  VuxRotMatrixY(&my, y);
166  VuxRotMatrixZ(&mz, z);
167 
168 
169 
170 // VuxMulMatrix(&mx, &my, &m0);
171 // VuxMulMatrix(&m0, &mz, m);
172 
173 // VuxMulMatrix(&mz, &my, &m0);
174 // VuxMulMatrix(&mx, &m0, m);
175 
176  VuxMulMatrix(&mz, &mx, &m0);
177  VuxMulMatrix(&my, &m0, m);
178 }
179 
180 
181 
182 
183 
184 
185 
186 
187 
189 {
190 
191  m->m[3][0] = t->x;
192  m->m[3][1] = t->y;
193  m->m[3][2] = t->z;
194  m->m[3][3] = 1.0f;
195 }
196 
197 
198 
199 
200 
201 /*move matrix to given xyz position*/
202 void VuxTransMatrixXYZ(VU_MATRIX *m,float x, float y, float z)
203 {
204 
205  m->m[3][0] = x;
206  m->m[3][1] = y;
207  m->m[3][2] = z;
208  m->m[3][3] = 1.0f;
209 }
210 
211 
212 
213 
214 
215 
217 {
218  VU_MATRIX w;
219 
220  VuxResetMatrix(&w);
221 
222  w.m[0][0] = s->x;
223  w.m[1][1] = s->y;
224  w.m[2][2] = s->z;
225 
226  VuxMulMatrix(m, &w, m);
227 }
228 
229 
230 
231 
232 void VuxScaleMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
233 {
234  VU_MATRIX w;
235 
236  VuxResetMatrix(&w);
237 
238  w.m[0][0] = x;
239  w.m[1][1] = y;
240  w.m[2][2] = z;
241 
242  VuxMulMatrix(m, &w, m);
243 
244 }
245 
246 
247 
248 
249 
250 
252 {
253  int i,j,k;
254  float* pA = (float*)m1;
255  float* pB = (float*)m0;
256  float* pQ = (float*)out;
257  float pM[16];
258 
259  for(i=0;i<16;i++)pM[i]=0;
260 
261  for( i=0; i<4; i++ )
262  for( j=0; j<4; j++ )
263  for( k=0; k<4; k++ )
264  pM[4*i+j] += pA[4*k+j] * pB[4*i+k];
265 
266  for(i=0;i<16;i++)pQ[i] = pM[i];
267 }
268 
269 
270 
271 
272 
274 {
275  int i,j;
276  static float *m,*out;
277  float tmp[12]; /* temp array for pairs */
278  float src[16]; /* array of transpose source matrix */
279  float det; /* determinant */
280 
281  m = (float *)in;
282  out = (float *)mat;
283 
284 
285  /* transpose matrix */
286  for ( i = 0; i < 4; i++)
287  {
288  src[i] = m[i*4];
289  src[i + 4] = m[i*4 + 1];
290  src[i + 8] = m[i*4 + 2];
291  src[i + 12] = m[i*4 + 3];
292  }
293  /* calculate pairs for first 8 elements (cofactors) */
294  tmp[0] = src[10] * src[15];
295  tmp[1] = src[11] * src[14];
296  tmp[2] = src[9] * src[15];
297  tmp[3] = src[11] * src[13];
298  tmp[4] = src[9] * src[14];
299  tmp[5] = src[10] * src[13];
300  tmp[6] = src[8] * src[15];
301  tmp[7] = src[11] * src[12];
302  tmp[8] = src[8] * src[14];
303  tmp[9] = src[10] * src[12];
304  tmp[10] = src[8] * src[13];
305  tmp[11] = src[9] * src[12];
306  /* calculate first 8 elements (cofactors) */
307  out[0] = tmp[0]*src[5] + tmp[3]*src[6] + tmp[4]*src[7];
308  out[0] -= tmp[1]*src[5] + tmp[2]*src[6] + tmp[5]*src[7];
309  out[1] = tmp[1]*src[4] + tmp[6]*src[6] + tmp[9]*src[7];
310  out[1] -= tmp[0]*src[4] + tmp[7]*src[6] + tmp[8]*src[7];
311  out[2] = tmp[2]*src[4] + tmp[7]*src[5] + tmp[10]*src[7];
312  out[2] -= tmp[3]*src[4] + tmp[6]*src[5] + tmp[11]*src[7];
313  out[3] = tmp[5]*src[4] + tmp[8]*src[5] + tmp[11]*src[6];
314  out[3] -= tmp[4]*src[4] + tmp[9]*src[5] + tmp[10]*src[6];
315  out[4] = tmp[1]*src[1] + tmp[2]*src[2] + tmp[5]*src[3];
316  out[4] -= tmp[0]*src[1] + tmp[3]*src[2] + tmp[4]*src[3];
317  out[5] = tmp[0]*src[0] + tmp[7]*src[2] + tmp[8]*src[3];
318  out[5] -= tmp[1]*src[0] + tmp[6]*src[2] + tmp[9]*src[3];
319  out[6] = tmp[3]*src[0] + tmp[6]*src[1] + tmp[11]*src[3];
320  out[6] -= tmp[2]*src[0] + tmp[7]*src[1] + tmp[10]*src[3];
321  out[7] = tmp[4]*src[0] + tmp[9]*src[1] + tmp[10]*src[2];
322  out[7] -= tmp[5]*src[0] + tmp[8]*src[1] + tmp[11]*src[2];
323  /* calculate pairs for second 8 elements (cofactors) */
324  tmp[0] = src[2]*src[7];
325  tmp[1] = src[3]*src[6];
326  tmp[2] = src[1]*src[7];
327  tmp[3] = src[3]*src[5];
328  tmp[4] = src[1]*src[6];
329  tmp[5] = src[2]*src[5];
330 
331  tmp[6] = src[0]*src[7];
332  tmp[7] = src[3]*src[4];
333  tmp[8] = src[0]*src[6];
334  tmp[9] = src[2]*src[4];
335  tmp[10] = src[0]*src[5];
336  tmp[11] = src[1]*src[4];
337  /* calculate second 8 elements (cofactors) */
338  out[8] = tmp[0]*src[13] + tmp[3]*src[14] + tmp[4]*src[15];
339  out[8] -= tmp[1]*src[13] + tmp[2]*src[14] + tmp[5]*src[15];
340  out[9] = tmp[1]*src[12] + tmp[6]*src[14] + tmp[9]*src[15];
341  out[9] -= tmp[0]*src[12] + tmp[7]*src[14] + tmp[8]*src[15];
342  out[10] = tmp[2]*src[12] + tmp[7]*src[13] + tmp[10]*src[15];
343  out[10]-= tmp[3]*src[12] + tmp[6]*src[13] + tmp[11]*src[15];
344  out[11] = tmp[5]*src[12] + tmp[8]*src[13] + tmp[11]*src[14];
345  out[11]-= tmp[4]*src[12] + tmp[9]*src[13] + tmp[10]*src[14];
346  out[12] = tmp[2]*src[10] + tmp[5]*src[11] + tmp[1]*src[9];
347  out[12]-= tmp[4]*src[11] + tmp[0]*src[9] + tmp[3]*src[10];
348  out[13] = tmp[8]*src[11] + tmp[0]*src[8] + tmp[7]*src[10];
349  out[13]-= tmp[6]*src[10] + tmp[9]*src[11] + tmp[1]*src[8];
350  out[14] = tmp[6]*src[9] + tmp[11]*src[11] + tmp[3]*src[8];
351  out[14]-= tmp[10]*src[11] + tmp[2]*src[8] + tmp[7]*src[9];
352  out[15] = tmp[10]*src[10] + tmp[4]*src[8] + tmp[9]*src[9];
353  out[15]-= tmp[8]*src[9] + tmp[11]*src[10] + tmp[5]*src[8];
354  /* calculate determinant */
355  det=src[0]*out[0]+src[1]*out[1]+src[2]*out[2]+src[3]*out[3];
356  /* calculate matrix inverse */
357  det = 1/det;
358  for (j = 0; j < 16; j++)
359  out[j] *= det;
360 }
361 
362 
363 
364 
365 
367 {
368  int i,j;
369 
370  for(i=0;i<4;i++)
371  {
372  for(j=0;j<4;j++)
373  {
374 
375  dest->m[i][j] = src->m[i][j];
376  }
377 
378  }
379 }
380 
381 
382 
384 {
385 
386 
387  out->x = m->m[0][0]*v0->x + m->m[1][0]*v0->y + m->m[2][0]*v0->z + m->m[3][0]*v0->w;
388  out->y = m->m[0][1]*v0->x + m->m[1][1]*v0->y + m->m[2][1]*v0->z + m->m[3][1]*v0->w;
389  out->z = m->m[0][2]*v0->x + m->m[1][2]*v0->y + m->m[2][2]*v0->z + m->m[3][2]*v0->w;
390  out->w = m->m[0][3]*v0->x + m->m[1][3]*v0->y + m->m[2][3]*v0->z + m->m[3][3]*v0->w;
391 }
392 
393 
394 
395 
397 {
398 
399  out->x = m->m[0][0]*v0->x + m->m[1][0]*v0->y + m->m[2][0]*v0->z;
400  out->y = m->m[0][1]*v0->x + m->m[1][1]*v0->y + m->m[2][1]*v0->z;
401  out->z = m->m[0][2]*v0->x + m->m[1][2]*v0->y + m->m[2][2]*v0->z;
402  out->w = 1.0f;
403 }
404 
405 
406 
407 
408 
410 {
411 
412  return (v0->x*v1->x + v0->y*v1->y + v0->z*v1->z);
413 }
414 
415 
416 
417 
418 
420 {
421  VU_VECTOR ret;
422 
423  ret.x = v0->y*v1->z - v0->z*v1->y;
424  ret.y = v0->z*v1->x - v0->x*v1->z;
425  ret.z = v0->x*v1->y - v0->y*v1->x;
426 
427  return ret;
428 }
429 
430 
431 
432 
433 
435 {
436 
437 
438  out->x = v0->y*v1->z - v0->z*v1->y;
439  out->y = v0->z*v1->x - v0->x*v1->z;
440  out->z = v0->x*v1->y - v0->y*v1->x;
441 }
442 
443 
444 
445 
446 
448 {
449  float m = sqrtf(v->x*v->x + v->y*v->y + v->z*v->z + v->w*v->w);
450 
451  v->x /= m;
452  v->y /= m;
453  v->z /= m;
454  v->w /= m;
455 }
456 
457 
458 
459 
461 {
462  float m = sqrtf(in->x*in->x + in->y*in->y + in->z*in->z + in->w*in->w);
463 
464  out->x /= m;
465  out->y /= m;
466  out->z /= m;
467  out->w /= m;
468 }
469 
470 
471 
472 
473 
474 
475 
476 
477 
478 
479 
480 
481 
482 
483 
485 {
486 
487 
488 
489 // Vu0ApplyMatrix(&VuLocalScreenMatrix, v0, out);
491 }
492 
493 
494 
495 
497 {
498 
499 
501 
502 }
503 
504 
505 
506 
507 
508 
509 
510 
512 {
513 
514  VuxMulMatrix(world, view, out); // then multiply it by world
515 
516 }
517 
518 
519 
520 
521 
522 
523 
524 void VuxMakeLocalScreenMatrix2(VU_MATRIX *out, VU_MATRIX *world, VU_MATRIX *view, VU_MATRIX *projection)
525 {
526  VU_MATRIX work;
527 
528 
529 
530  VuxMulMatrix(world, view, &work); // then multiply it by world
531  VuxMulMatrix(&work, projection, out); // mul projection
532 }
533 
534 
535 
536 
537 
538 
539 
540 
541 
542 
543 
545 {
546  VU_MATRIX work;
547 
548 
549  VuxResetMatrix(&work);
550  VuxRotMatrix(&work, rot);
551  VuxTransMatrix(&work, pos);
552  VuxScaleMatrix(&work, scale);
553 
554 
555  VuxInverseMatrix(&work, out);
556 }
557 
558 
559 
560 
561 
562 
564 {
565  static VU_VECTOR xaxis, yaxis, zaxis;
566 
567 
568  zaxis.x = target->x - eye->x;
569  zaxis.y = target->y - eye->y;
570  zaxis.z = target->z - eye->z;
571  VuxVectorNormal(&zaxis);
572 
573  xaxis = VuxCrossProduct(up, &zaxis);
574 
575  VuxVectorNormal(&xaxis);
576 
577  yaxis = VuxCrossProduct(&zaxis, &xaxis);
578 
579  out->m[0][0] = xaxis.x;
580  out->m[0][1] = yaxis.x;
581  out->m[0][2] = zaxis.x;
582  out->m[0][3] = 0.0f;
583 
584  out->m[1][0] = xaxis.y;
585  out->m[1][1] = yaxis.y;
586  out->m[1][2] = zaxis.y;
587  out->m[1][3] = 0.0f;
588 
589  out->m[2][0] = xaxis.z;
590  out->m[2][1] = yaxis.z;
591  out->m[2][2] = zaxis.z;
592  out->m[2][3] = 0.0f;
593 
594  out->m[3][0] = -VuxDotProduct(&xaxis, eye);
595  out->m[3][1] = -VuxDotProduct(&yaxis, eye);
596  out->m[3][2] = -VuxDotProduct(&zaxis, eye);
597  out->m[3][3] = 1.0f;
598 
599 
600  /*******************************************
601  ** the created matrix is already inverted **
602  *******************************************/
603 
604 }
605 
606 
607 
608 
609 
610 
611 
612 void VuxMakeProjectionMatrix(VU_MATRIX *proj, float near_plane_w, float near_plane_h, float near_plane_z, float far_plane_z)
613 {
614 
615  VuxIdMatrix(proj);
616 
617 
618 
619  proj->m[0][0] = (1.0f*near_plane_z)/near_plane_w;
620  proj->m[1][1] = (1.0f*near_plane_z)/near_plane_h;
621  proj->m[2][2] = far_plane_z/(far_plane_z-near_plane_z);
622  proj->m[2][3] = 1.0f;
623  proj->m[3][2] = near_plane_z*far_plane_z/(near_plane_z-far_plane_z);
624 
625 
626 
627 }
628 
629 
630 
631 
632 
633 
635 {
636  VU_MATRIX lsm;
637 
638 
639  if(vu_projection_type==0) // use vu_projection
640  {
642  }
643  else /*if(vu_projection_type==1)*/ // use projection matrix
644  {
646  }
647 
648 
649 
651 }
652 
653 
654 
655 
656 
657 
658 
659 
660 
661 
663 {
664 
665  VuxApplyMatrixLS(v0, out);
666 }
667 
668 
669 
670 
672 {
673 
674  // v0
675  VuxApplyMatrixLS(v0, tv0);
676  // v1
677  VuxApplyMatrixLS(v1, tv1);
678  // v2
679  VuxApplyMatrixLS(v2, tv2);
680 }
681 
682 
683 
684 void VuxRotTransN(VU_VECTOR *verts, VU_VECTOR *tverts, unsigned int num_verts)
685 {
686  unsigned int i;
687 
688 
689  for(i=0;i<num_verts;i++)
690  {
691  VuxApplyMatrixLS(&verts[i], &tverts[i]);
692  }
693 }
694 
695 
696 
697 
698 void VuxPers(VU_VECTOR *v0, VU_SXYZ *sxyz0)
699 {
700 
701 
702 
703  if(vu_projection_type==0)
704  {
705 
706  sxyz0->x = ftoi4( (vu_projection * v0->x / (v0->z)) +vu_offset_x);
707  sxyz0->y = ftoi4(-(vu_projection * v0->y / (v0->z)) +vu_offset_y);
708  sxyz0->z = 0xffffff-(short)(float)v0->z;
709  }
710  else // use projection matrix
711  {
712 
713  sxyz0->x = ftoi4( (((v0->x)/(v0->w))*vu_near_plane_w) +vu_offset_x);
714  sxyz0->y = ftoi4(-(((v0->y)/(v0->w))*vu_near_plane_h) +vu_offset_y);
715 
716  sxyz0->z = (int)(-(v0->z/v0->w) * 0xffff);
717  }
718 }
719 
720 
721 
722 
723 
724 void VuxPers3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
725 {
726 
727 
728 
729  if(vu_projection_type==0)
730  {
731  //v0
732  sxyz0->x = ftoi4( (vu_projection * v0->x / (v0->z)) +vu_offset_x);
733  sxyz0->y = ftoi4(-(vu_projection * v0->y / (v0->z)) +vu_offset_y);
734  sxyz0->z = 0xffffff - (short)(float)v0->z;
735 
736  //v1
737  sxyz1->x = ftoi4( (vu_projection * v1->x / (v1->z)) +vu_offset_x);
738  sxyz1->y = ftoi4(-(vu_projection * v1->y / (v1->z)) +vu_offset_y);
739  sxyz1->z = 0xffffff - (short)(float)v1->z;
740 
741  //v2
742  sxyz2->x = ftoi4( (vu_projection * v2->x / (v2->z)) +vu_offset_x);
743  sxyz2->y = ftoi4(-(vu_projection * v2->y / (v2->z)) +vu_offset_y);
744  sxyz2->z = 0xffffff - (short)(float)v2->z;
745  }
746  else // use projection matrix
747  {
748  sxyz0->x = ftoi4( (((v0->x)/(v0->w))*vu_near_plane_w) +vu_offset_x);
749  sxyz0->y = ftoi4(-(((v0->y)/(v0->w))*vu_near_plane_h) +vu_offset_y);
750  sxyz0->z = (int)(-(v0->z/v0->w) * 0xffff);
751 
752  sxyz1->x = ftoi4( (((v1->x)/(v1->w))*vu_near_plane_w) +vu_offset_x);
753  sxyz1->y = ftoi4(-(((v1->y)/(v1->w))*vu_near_plane_h) +vu_offset_y);
754  sxyz1->z = (int)(-(v1->z/v1->w) * 0xffff);
755 
756  sxyz2->x = ftoi4( (((v2->x)/(v2->w))*vu_near_plane_w) +vu_offset_x);
757  sxyz2->y = ftoi4(-(((v2->y)/(v2->w))*vu_near_plane_h) +vu_offset_y);
758  sxyz2->z = (int)(-(v2->z/v2->w) * 0xffff);
759  }
760 }
761 
762 
763 
764 
765 
766 
767 void VuxPersN(VU_VECTOR *verts, VU_SXYZ *sxyz, unsigned int num_verts)
768 {
769  unsigned int i;
770 
771 
772  for(i=0;i<num_verts;i++)
773  {
774  VuxPers(&verts[i], &sxyz[i]);
775  }
776 }
777 
778 
779 
780 
781 
782 
783 int VuxPersClip3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
784 {
785 
786 
787 
788  if(vu_projection_type==0)
789  {
790  //v0
791  sxyz0->x = ftoi4( (vu_projection * v0->x / (v0->z)) +vu_offset_x);
792  sxyz0->y = ftoi4(-(vu_projection * v0->y / (v0->z)) +vu_offset_y);
793  sxyz0->z = 0xffffff - (short)(float)v0->z;
794 
795  //v1
796  sxyz1->x = ftoi4( (vu_projection * v1->x / (v1->z)) +vu_offset_x);
797  sxyz1->y = ftoi4(-(vu_projection * v1->y / (v1->z)) +vu_offset_y);
798  sxyz1->z = 0xffffff - (short)(float)v1->z;
799 
800  //v2
801  sxyz2->x = ftoi4( (vu_projection * v2->x / (v2->z)) +vu_offset_x);
802  sxyz2->y = ftoi4(-(vu_projection * v2->y / (v2->z)) +vu_offset_y);
803  sxyz2->z = 0xffffff - (short)(float)v2->z;
804  }
805  else // use projection matrix
806  {
807  sxyz0->x = ftoi4( (((v0->x)/(v0->w))*vu_near_plane_w) +vu_offset_x);
808  sxyz0->y = ftoi4(-(((v0->y)/(v0->w))*vu_near_plane_h) +vu_offset_y);
809  sxyz0->z = (int)(-(v0->z/v0->w) * 0xffff);
810 
811  sxyz1->x = ftoi4( (((v1->x)/(v1->w))*vu_near_plane_w) +vu_offset_x);
812  sxyz1->y = ftoi4(-(((v1->y)/(v1->w))*vu_near_plane_h) +vu_offset_y);
813  sxyz1->z = (int)(-(v1->z/v1->w) * 0xffff);
814 
815  sxyz2->x = ftoi4( (((v2->x)/(v2->w))*vu_near_plane_w) +vu_offset_x);
816  sxyz2->y = ftoi4(-(((v2->y)/(v2->w))*vu_near_plane_h) +vu_offset_y);
817  sxyz2->z = (int)(-(v2->z/v2->w) * 0xffff);
818  }
819 
820 
821  return VuxClipSxyz(sxyz0, sxyz1, sxyz2);
822 }
823 
824 
825 
826 
827 
828 
830 {
831  VU_VECTOR tv0;
832 
833  VuxRotTrans(v0, &tv0);
834  VuxPers(&tv0 , sxyz0);
835 
836  return tv0.z;
837 }
838 
839 
840 
841 
842 
843 float VuxRotTransPers3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
844 {
845  VU_VECTOR tv0,tv1,tv2;
846 
847  VuxRotTrans3(v0, v1, v2, &tv0, &tv1, &tv2);
848  VuxPers3(&tv0, &tv1, &tv2, sxyz0, sxyz1, sxyz2);
849 
850  return tv0.z;
851 }
852 
853 
854 
855 
856 
857 
858 void VuxRotTransPersN(VU_VECTOR *verts, VU_SXYZ *sxyz, unsigned int num_verts)
859 {
860  unsigned int i;
861 
862 
863 
864  for(i=0;i<num_verts;i++)
865  {
866  VuxRotTransPers(&verts[i], &sxyz[i]);
867  }
868 
869 }
870 
871 
872 
873 
874 
876 {
877  VU_VECTOR tv0,tv1,tv2;
878 
879  VuxRotTrans3(v0, v1, v2, &tv0, &tv1, &tv2);
880  VuxPers3(&tv0, &tv1, &tv2, sxyz0, sxyz1, sxyz2);
881 
882 
883  return VuxClipSxyz(sxyz0, sxyz1, sxyz2);
884 }
885 
886 
887 
888 
889 
890 
891 
892 
893 
894 int VuxClipSxyz(VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
895 {
896 
897  return (sxyz1->x - sxyz0->x) * (sxyz2->y - sxyz0->y) - (sxyz2->x - sxyz0->x) * (sxyz1->y - sxyz0->y);
898 }
899 
900 
901 
903 {
904  int ret = 0;
905 
906  return ret;
907 }
908 
909 
910 
911 
912 
913 
914 
915 
916 /* LIGHTING */
917 
918 
919 
920 int VuxLightNormal(VU_VECTOR *normal, VU_CVECTOR *col0, void *light, unsigned int light_type, VU_CVECTOR *out0)
921 {
922  float dot;
923  VU_FCVECTOR final;
924  VU_FCVECTOR c0;
925  VU_FLAT_LIGHT *f_light;
926 
927 
928  c0.r = col0->r * 0.0078125f;
929  c0.g = col0->g * 0.0078125f;
930  c0.b = col0->b * 0.0078125f;
931 
932 
934  {
935  f_light = (VU_FLAT_LIGHT *)light;
936 
937  dot = -VuxDotProduct(normal, &f_light->direction);
938  if(dot <0.0f)dot = 0.0f;
939 
940 
941 
942  final.r = vu_light_ambient.r + (c0.r * dot * f_light->color.r);
943  final.g = vu_light_ambient.g + (c0.g * dot * f_light->color.g);
944  final.b = vu_light_ambient.b + (c0.b * dot * f_light->color.b);
945  }
946  else
947  {
948  final.r = vu_light_ambient.r + c0.r;
949  final.g = vu_light_ambient.g + c0.g;
950  final.b = vu_light_ambient.b + c0.b;
951  }
952 
953 
954 
955  out0->r =final.r*128.0f;
956  out0->g =final.g*128.0f;
957  out0->b =final.b*128.0f;
958  out0->a =0x80;
959  out0->q =1.0f;
960 
961 
962  return 0;
963 }
964 
#define v0
Definition: as_reg_compat.h:35
#define v1
Definition: as_reg_compat.h:36
#define ftoi4(F)
Definition: draw_types.h:15
struct @29::@30 pos
s32 x
Definition: libmouse.c:34
s32 y
Definition: libmouse.c:34
VU_MATRIX VuLocalScreenMatrix
Definition: vux.c:42
VU_MATRIX VuWorldMatrix
Definition: vux.c:21
VU_MATRIX VuViewMatrix
Definition: vux.c:28
#define VU_LIGHT_TYPE_FLAT
Definition: libvux.h:32
VU_MATRIX VuPrjectionMatrix
Definition: vux.c:35
void VuSetLocalScreenMatrix(VU_MATRIX *m)
Definition: vux.c:135
s32 s
Definition: ps2ipc.c:30
unsigned char g
Definition: libvux.h:79
unsigned char r
Definition: libvux.h:78
unsigned char a
Definition: libvux.h:81
unsigned char b
Definition: libvux.h:80
float q
Definition: libvux.h:82
float g
Definition: libvux.h:90
float b
Definition: libvux.h:91
float r
Definition: libvux.h:89
VU_FCVECTOR color
Definition: libvux.h:99
VU_VECTOR direction
Definition: libvux.h:98
float m[4][4]
Definition: libvux.h:38
Definition: libvux.h:54
unsigned int z
Definition: libvux.h:59
unsigned short y
Definition: libvux.h:58
unsigned short x
Definition: libvux.h:56
float w
Definition: libvux.h:48
float x
Definition: libvux.h:45
float z
Definition: libvux.h:47
float y
Definition: libvux.h:46
int light_type[4]
Definition: teapot.c:59
void VuxScaleMatrix(VU_MATRIX *m, VU_VECTOR *s)
Definition: vusw.c:216
int VuxLightNormal(VU_VECTOR *normal, VU_CVECTOR *col0, void *light, unsigned int light_type, VU_CVECTOR *out0)
Definition: vusw.c:920
void VuxPersN(VU_VECTOR *verts, VU_SXYZ *sxyz, unsigned int num_verts)
Definition: vusw.c:767
float VuxRotTransPers3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
Definition: vusw.c:843
void VuxRotMatrixX(VU_MATRIX *m, float x)
Definition: vusw.c:74
void VuxMakeLookAtViewMatrix(VU_MATRIX *out, VU_VECTOR *eye, VU_VECTOR *target, VU_VECTOR *up)
Definition: vusw.c:563
void VuxScaleMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
Definition: vusw.c:232
void VuxIdMatrix(VU_MATRIX *m)
Definition: vusw.c:30
void VuxRotMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
Definition: vusw.c:157
void VuxPers(VU_VECTOR *v0, VU_SXYZ *sxyz0)
Definition: vusw.c:698
void VuxCrossProduct0(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *out)
Definition: vusw.c:434
void VuxRotMatrixZ(VU_MATRIX *m, float z)
Definition: vusw.c:129
float VuxRotTransPers(VU_VECTOR *v0, VU_SXYZ *sxyz0)
Definition: vusw.c:829
VU_VECTOR VuxCrossProduct(VU_VECTOR *v0, VU_VECTOR *v1)
Definition: vusw.c:419
void VuxApplyMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
Definition: vusw.c:383
void VuxApplyRotMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
Definition: vusw.c:396
void VuxRotTrans(VU_VECTOR *v0, VU_VECTOR *out)
Definition: vusw.c:662
void VuxMakeViewMatrix(VU_MATRIX *out, VU_VECTOR *rot, VU_VECTOR *pos, VU_VECTOR *scale)
Definition: vusw.c:544
void VuxTransMatrixXYZ(VU_MATRIX *m, float x, float y, float z)
Definition: vusw.c:202
int VuxPersClip3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
Definition: vusw.c:783
void VuxPers3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
Definition: vusw.c:724
void VuxResetMatrix(VU_MATRIX *m)
Definition: vusw.c:39
void VuxRotMatrixY(VU_MATRIX *m, float y)
Definition: vusw.c:101
void VuxMakeProjectionMatrix(VU_MATRIX *proj, float near_plane_w, float near_plane_h, float near_plane_z, float far_plane_z)
Definition: vusw.c:612
void VuxVectorNormal(VU_VECTOR *v)
Definition: vusw.c:447
void VuxRotTransPersN(VU_VECTOR *verts, VU_SXYZ *sxyz, unsigned int num_verts)
Definition: vusw.c:858
void VuxTransMatrix(VU_MATRIX *m, VU_VECTOR *t)
Definition: vusw.c:188
void VuxMulMatrix(VU_MATRIX *m0, VU_MATRIX *m1, VU_MATRIX *out)
Definition: vusw.c:251
void VuxVectorNormal0(VU_VECTOR *in, VU_VECTOR *out)
Definition: vusw.c:460
void VuxRotMatrix(VU_MATRIX *m, VU_VECTOR *r)
Definition: vusw.c:51
void VuxInverseMatrix(VU_MATRIX *in, VU_MATRIX *mat)
Definition: vusw.c:273
void VuxUpdateLocalScreenMatrix(void)
Definition: vusw.c:634
int VuxClipW(VU_VECTOR *tv0)
Definition: vusw.c:902
float VuxDotProduct(VU_VECTOR *v0, VU_VECTOR *v1)
Definition: vusw.c:409
void VuxMakeLocalScreenMatrix2(VU_MATRIX *out, VU_MATRIX *world, VU_MATRIX *view, VU_MATRIX *projection)
Definition: vusw.c:524
void VuxApplyMatrixLS(VU_VECTOR *v0, VU_VECTOR *out)
Definition: vusw.c:484
void VuxMakeLocalScreenMatrix(VU_MATRIX *out, VU_MATRIX *world, VU_MATRIX *view)
Definition: vusw.c:511
int VuxClipSxyz(VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
Definition: vusw.c:894
void VuxCopyMatrix(VU_MATRIX *dest, VU_MATRIX *src)
Definition: vusw.c:366
int VuxRotTransPersClip3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
Definition: vusw.c:875
void VuxApplyRotMatrixLS(VU_VECTOR *v0, VU_VECTOR *out)
Definition: vusw.c:496
void VuxRotTrans3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_VECTOR *tv0, VU_VECTOR *tv1, VU_VECTOR *tv2)
Definition: vusw.c:671
void VuxRotTransN(VU_VECTOR *verts, VU_VECTOR *tverts, unsigned int num_verts)
Definition: vusw.c:684
VU_FCVECTOR vu_light_ambient
Definition: vux.c:57
unsigned short vu_offset_x
Definition: vux.c:55
unsigned short vu_offset_y
Definition: vux.c:56
float vu_near_plane_h
Definition: vux.c:61
int vu_projection_type
Definition: vux.c:54
float vu_projection
Definition: vux.c:53
float vu_near_plane_w
Definition: vux.c:60