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;
56 mx = my = mz = m0 = *m;
59 VuxRotMatrixX(&mx, r->x);
60 VuxRotMatrixY(&my, r->y);
61 VuxRotMatrixZ(&mz, r->z);
65 VuxMulMatrix(&mz, &mx, &m0);
66 VuxMulMatrix(&my, &m0, m);
157void VuxRotMatrixXYZ(
VU_MATRIX *m,
float x,
float y,
float z)
162 mx = my = mz = m0 = *m;
164 VuxRotMatrixX(&mx, x);
165 VuxRotMatrixY(&my, y);
166 VuxRotMatrixZ(&mz, z);
176 VuxMulMatrix(&mz, &mx, &m0);
177 VuxMulMatrix(&my, &m0, m);
202void VuxTransMatrixXYZ(
VU_MATRIX *m,
float x,
float y,
float z)
226 VuxMulMatrix(m, &w, m);
232void VuxScaleMatrixXYZ(
VU_MATRIX *m,
float x,
float y,
float z)
242 VuxMulMatrix(m, &w, m);
254 float* pA = (
float*)m1;
255 float* pB = (
float*)m0;
256 float* pQ = (
float*)out;
259 for(i=0;i<16;i++)pM[i]=0;
264 pM[4*i+j] += pA[4*k+j] * pB[4*i+k];
266 for(i=0;i<16;i++)pQ[i] = pM[i];
276 static float *m,*out;
286 for ( i = 0; i < 4; i++)
289 src[i + 4] = m[i*4 + 1];
290 src[i + 8] = m[i*4 + 2];
291 src[i + 12] = m[i*4 + 3];
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];
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];
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];
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];
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];
355 det=src[0]*out[0]+src[1]*out[1]+src[2]*out[2]+src[3]*out[3];
358 for (j = 0; j < 16; j++)
375 dest->m[i][j] = src->m[i][j];
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;
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;
412 return (v0->x*v1->x + v0->y*v1->y + v0->z*v1->z);
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;
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;
449 float m = sqrtf(v->x*v->x + v->y*v->y + v->z*v->z + v->w*v->w);
462 float m = sqrtf(in->x*in->x + in->y*in->y + in->z*in->z + in->w*in->w);
490 VuxApplyMatrix(&VuLocalScreenMatrix, v0, out);
500 VuxApplyRotMatrix(&VuLocalScreenMatrix, v0, out);
514 VuxMulMatrix(world, view, out);
530 VuxMulMatrix(world, view, &work);
531 VuxMulMatrix(&work, projection, out);
549 VuxResetMatrix(&work);
550 VuxRotMatrix(&work, rot);
551 VuxTransMatrix(&work, pos);
552 VuxScaleMatrix(&work, scale);
555 VuxInverseMatrix(&work, out);
568 zaxis.x = target->x - eye->x;
569 zaxis.y = target->y - eye->y;
570 zaxis.z = target->z - eye->z;
571 VuxVectorNormal(&zaxis);
573 xaxis = VuxCrossProduct(up, &zaxis);
575 VuxVectorNormal(&xaxis);
577 yaxis = VuxCrossProduct(&zaxis, &xaxis);
579 out->m[0][0] = xaxis.x;
580 out->m[0][1] = yaxis.x;
581 out->m[0][2] = zaxis.x;
584 out->m[1][0] = xaxis.y;
585 out->m[1][1] = yaxis.y;
586 out->m[1][2] = zaxis.y;
589 out->m[2][0] = xaxis.z;
590 out->m[2][1] = yaxis.z;
591 out->m[2][2] = zaxis.z;
594 out->m[3][0] = -VuxDotProduct(&xaxis, eye);
595 out->m[3][1] = -VuxDotProduct(&yaxis, eye);
596 out->m[3][2] = -VuxDotProduct(&zaxis, eye);
612void VuxMakeProjectionMatrix(
VU_MATRIX *proj,
float near_plane_w,
float near_plane_h,
float near_plane_z,
float far_plane_z)
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);
639 if(vu_projection_type==0)
641 VuxMakeLocalScreenMatrix(&lsm, &VuWorldMatrix, &VuViewMatrix);
645 VuxMakeLocalScreenMatrix2(&lsm, &VuWorldMatrix, &VuViewMatrix, &VuPrjectionMatrix);
650 VuSetLocalScreenMatrix(&lsm);
665 VuxApplyMatrixLS(v0, out);
675 VuxApplyMatrixLS(v0, tv0);
677 VuxApplyMatrixLS(v1, tv1);
679 VuxApplyMatrixLS(v2, tv2);
689 for(i=0;i<num_verts;i++)
691 VuxApplyMatrixLS(&verts[i], &tverts[i]);
703 if(vu_projection_type==0)
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;
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);
716 sxyz0->z = (int)(-(v0->z/v0->w) * 0xffff);
729 if(vu_projection_type==0)
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;
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;
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;
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);
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);
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);
772 for(i=0;i<num_verts;i++)
774 VuxPers(&verts[i], &sxyz[i]);
788 if(vu_projection_type==0)
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;
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;
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;
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);
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);
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);
821 return VuxClipSxyz(sxyz0, sxyz1, sxyz2);
833 VuxRotTrans(v0, &tv0);
834 VuxPers(&tv0 , sxyz0);
847 VuxRotTrans3(v0, v1, v2, &tv0, &tv1, &tv2);
848 VuxPers3(&tv0, &tv1, &tv2, sxyz0, sxyz1, sxyz2);
858void VuxRotTransPersN(
VU_VECTOR *verts,
VU_SXYZ *sxyz,
unsigned int num_verts)
864 for(i=0;i<num_verts;i++)
866 VuxRotTransPers(&verts[i], &sxyz[i]);
879 VuxRotTrans3(v0, v1, v2, &tv0, &tv1, &tv2);
880 VuxPers3(&tv0, &tv1, &tv2, sxyz0, sxyz1, sxyz2);
883 return VuxClipSxyz(sxyz0, sxyz1, sxyz2);
897 return (sxyz1->
x - sxyz0->
x) * (sxyz2->
y - sxyz0->
y) - (sxyz2->
x - sxyz0->
x) * (sxyz1->
y - sxyz0->
y);
928 c0.r = col0->r * 0.0078125f;
929 c0.g = col0->g * 0.0078125f;
930 c0.b = col0->b * 0.0078125f;
933 if(light_type == VU_LIGHT_TYPE_FLAT)
940 dot = -VuxDotProduct(normal, &f_light->direction);
941 if(dot <0.0f)dot = 0.0f;
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);
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;
958 out0->r =
final.r*128.0f;
959 out0->g =
final.g*128.0f;
960 out0->b =
final.b*128.0f;
void VuxUpdateLocalScreenMatrix(void)