MCPcopy Create free account
hub / github.com/DescentDevelopers/Descent3 / DoVectorToMatrix

Function DoVectorToMatrix

scripts/osiris_vector.h:618–681  ·  view source on GitHub ↗

do the math for vm_VectorToMatrix()

Source from the content-addressed store, hash-verified

616
617// do the math for vm_VectorToMatrix()
618void DoVectorToMatrix(matrix *m, vector *fvec, vector *uvec, vector *rvec) {
619 vector *xvec = &m->rvec, *yvec = &m->uvec, *zvec = &m->fvec;
620
621 // ASSERT(fvec != NULL);
622
623 *zvec = *fvec;
624 if (vm_VectorNormalize(zvec) == 0) {
625 return;
626 }
627
628 if (uvec == NULL) {
629
630 if (rvec == NULL) { // just forward vec
631
632 bad_vector2:;
633
634 if (zvec->x == 0 && zvec->z == 0) { // forward vec is straight up or down
635
636 m->rvec.x = 1.0;
637 m->uvec.z = (zvec->y < 0) ? 1.0 : -1.0;
638
639 m->rvec.y = m->rvec.z = m->uvec.x = m->uvec.y = 0;
640 } else { // not straight up or down
641
642 xvec->x = zvec->z;
643 xvec->y = 0;
644 xvec->z = -zvec->x;
645
646 vm_VectorNormalize(xvec);
647
648 *yvec = *zvec ^ *xvec;
649 }
650
651 } else { // use right vec
652
653 *xvec = *rvec;
654 if (vm_VectorNormalize(xvec) == 0)
655 goto bad_vector2;
656
657 *yvec = *zvec ^ *xvec;
658
659 // normalize new perpendicular vector
660 if (vm_VectorNormalize(yvec) == 0)
661 goto bad_vector2;
662
663 // now recompute right vector, in case it wasn't entirely perpendiclar
664 *xvec = *yvec ^ *zvec;
665 }
666 } else { // use up vec
667
668 *yvec = *uvec;
669 if (vm_VectorNormalize(yvec) == 0)
670 goto bad_vector2;
671
672 *xvec = *yvec ^ *zvec;
673
674 // normalize new perpendicular vector
675 if (vm_VectorNormalize(xvec) == 0)

Callers 1

vm_VectorToMatrixFunction · 0.70

Calls 1

vm_VectorNormalizeFunction · 0.70

Tested by

no test coverage detected