PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vusw.c
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
30void VuxIdMatrix(VU_MATRIX *m)
31{
32
33 VuxResetMatrix(m);
34}
35
36
37
38
39void VuxResetMatrix(VU_MATRIX *m)
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
51void VuxRotMatrix(VU_MATRIX *m, VU_VECTOR *r)
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
74void 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
101void 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
129void 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
157void 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
188void VuxTransMatrix(VU_MATRIX *m, VU_VECTOR *t)
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*/
202void 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
216void VuxScaleMatrix(VU_MATRIX *m, VU_VECTOR *s)
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
232void 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
251void VuxMulMatrix(VU_MATRIX *m0, VU_MATRIX *m1, VU_MATRIX *out)
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
273void VuxInverseMatrix(VU_MATRIX *in, VU_MATRIX *mat)
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
366void VuxCopyMatrix(VU_MATRIX *dest, VU_MATRIX *src)
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
383void VuxApplyMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
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
396void VuxApplyRotMatrix(VU_MATRIX *m, VU_VECTOR *v0, VU_VECTOR *out)
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
409float VuxDotProduct(VU_VECTOR *v0, VU_VECTOR *v1)
410{
411
412 return (v0->x*v1->x + v0->y*v1->y + v0->z*v1->z);
413}
414
415
416
417
418
419VU_VECTOR VuxCrossProduct(VU_VECTOR *v0, VU_VECTOR *v1)
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
434void VuxCrossProduct0(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *out)
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
447void VuxVectorNormal(VU_VECTOR *v)
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
460void VuxVectorNormal0(VU_VECTOR *in, VU_VECTOR *out)
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
484void VuxApplyMatrixLS(VU_VECTOR *v0, VU_VECTOR *out)
485{
486
487
488
489// Vu0ApplyMatrix(&VuLocalScreenMatrix, v0, out);
490 VuxApplyMatrix(&VuLocalScreenMatrix, v0, out);
491}
492
493
494
495
496void VuxApplyRotMatrixLS(VU_VECTOR *v0, VU_VECTOR *out)
497{
498
499
500 VuxApplyRotMatrix(&VuLocalScreenMatrix, v0, out);
501
502}
503
504
505
506
507
508
509
510
511void VuxMakeLocalScreenMatrix(VU_MATRIX *out, VU_MATRIX *world, VU_MATRIX *view)
512{
513
514 VuxMulMatrix(world, view, out); // then multiply it by world
515
516}
517
518
519
520
521
522
523
524void 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
544void VuxMakeViewMatrix(VU_MATRIX *out, VU_VECTOR *rot, VU_VECTOR *pos, VU_VECTOR *scale)
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
563void VuxMakeLookAtViewMatrix(VU_MATRIX *out, VU_VECTOR *eye, VU_VECTOR *target, VU_VECTOR *up)
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
612void 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 {
641 VuxMakeLocalScreenMatrix(&lsm, &VuWorldMatrix, &VuViewMatrix);
642 }
643 else /*if(vu_projection_type==1)*/ // use projection matrix
644 {
645 VuxMakeLocalScreenMatrix2(&lsm, &VuWorldMatrix, &VuViewMatrix, &VuPrjectionMatrix);
646 }
647
648
649
650 VuSetLocalScreenMatrix(&lsm);
651}
652
653
654
655
656
657
658
659
660
661
662void VuxRotTrans(VU_VECTOR *v0, VU_VECTOR *out)
663{
664
665 VuxApplyMatrixLS(v0, out);
666}
667
668
669
670
671void VuxRotTrans3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_VECTOR *tv0, VU_VECTOR *tv1, VU_VECTOR *tv2)
672{
673
674 // v0
675 VuxApplyMatrixLS(v0, tv0);
676 // v1
677 VuxApplyMatrixLS(v1, tv1);
678 // v2
679 VuxApplyMatrixLS(v2, tv2);
680}
681
682
683
684void 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
698void 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
724void 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
767void 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
783int 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
829float VuxRotTransPers(VU_VECTOR *v0, VU_SXYZ *sxyz0)
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
843float 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
858void 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
875int VuxRotTransPersClip3(VU_VECTOR *v0, VU_VECTOR *v1, VU_VECTOR *v2, VU_SXYZ *sxyz0, VU_SXYZ *sxyz1, VU_SXYZ *sxyz2)
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
894int 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
902int VuxClipW(VU_VECTOR *tv0)
903{
904 int ret = 0;
905
906 (void)tv0;
907
908 return ret;
909}
910
911
912
913
914
915
916
917
918/* LIGHTING */
919
920
921
922int VuxLightNormal(VU_VECTOR *normal, VU_CVECTOR *col0, void *light, unsigned int light_type, VU_CVECTOR *out0)
923{
924 VU_FCVECTOR final;
925 VU_FCVECTOR c0;
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
933 if(light_type == VU_LIGHT_TYPE_FLAT)
934 {
935 float dot;
936 VU_FLAT_LIGHT *f_light;
937
938 f_light = (VU_FLAT_LIGHT *)light;
939
940 dot = -VuxDotProduct(normal, &f_light->direction);
941 if(dot <0.0f)dot = 0.0f;
942
943
944
945 final.r = vu_light_ambient.r + (c0.r * dot * f_light->color.r);
946 final.g = vu_light_ambient.g + (c0.g * dot * f_light->color.g);
947 final.b = vu_light_ambient.b + (c0.b * dot * f_light->color.b);
948 }
949 else
950 {
951 final.r = vu_light_ambient.r + c0.r;
952 final.g = vu_light_ambient.g + c0.g;
953 final.b = vu_light_ambient.b + c0.b;
954 }
955
956
957
958 out0->r =final.r*128.0f;
959 out0->g =final.g*128.0f;
960 out0->b =final.b*128.0f;
961 out0->a =0x80;
962 out0->q =1.0f;
963
964
965 return 0;
966}
967
unsigned short y
Definition libvux.h:58
unsigned short x
Definition libvux.h:56
void VuxUpdateLocalScreenMatrix(void)
Definition vusw.c:634