79 lines
2.1 KiB
C++
79 lines
2.1 KiB
C++
#include "track.h"
|
|
#include "ASM.h"
|
|
|
|
|
|
void SPLINE3_GetSplinePoint3(float F, Vector *OUTVc,Vector *P)
|
|
{
|
|
float F2 = F * F;
|
|
*OUTVc = P[0] * F * F2 + P[1] * F2 + P[2] * F + P[3];
|
|
}
|
|
void SPLINE3_GetNurbPoint3(float F, Vector *OUTVc,Vector *P)
|
|
{
|
|
SPLINE3_GetSplinePoint3(F, OUTVc,P);
|
|
*OUTVc *= 1.0f/ OUTVc->z;
|
|
}
|
|
/*
|
|
D² = F²(A - 2B + C) + F(2B - 2A) + A
|
|
D³ = F³(-A + 3B - 3C + D) + F²(3A - 6B + 3C) + F(3B - 3A) + A
|
|
*/
|
|
void SPLINE3_GetSplineParams3(Vector *P1,Vector *P2,Vector *P3,Vector *P4,Vector *OutputP)
|
|
{
|
|
//F³(-A + 3B - 3C + D)
|
|
OutputP[0] = *P1 *-1.0f + *P2 * 3.0f - *P3 * 3.0f + *P4;
|
|
//F²(3A - 6B + 3C)
|
|
OutputP[1] = *P1 * 3.0f - *P2 * 6.0f + *P3 * 3.0f;
|
|
//F(3B - 3A)
|
|
OutputP[2] = *P2 * 3.0f - *P1 * 3.0f;
|
|
//A
|
|
OutputP[3] = *P1;
|
|
}
|
|
void SPLINE3_GetNurbParams3(Vector *P1,Vector *P2,Vector *P3,Vector *P4,Vector *OutputP)
|
|
{
|
|
Vector hP1,hP2,hP3,hP4;
|
|
hP1 = *P1;hP2 = *P2;hP3 = *P3;hP4 = *P4;
|
|
hP1.x *= hP1.z;
|
|
hP1.y *= hP1.z;
|
|
hP2.x *= hP2.z;
|
|
hP2.y *= hP2.z;
|
|
hP3.x *= hP3.z;
|
|
hP3.y *= hP3.z;
|
|
hP4.x *= hP4.z;
|
|
hP4.y *= hP4.z;
|
|
SPLINE3_GetSplineParams3(&hP1,&hP2,&hP3,&hP4,OutputP);
|
|
}
|
|
void SPLINE3_DrawSpline3(MAP *pSrc,Vector *P1,Vector *P2,Vector *P3,Vector *P4)
|
|
{
|
|
Vector Params[4];
|
|
Vector PointP,PointC;
|
|
/* DrawLine(pSrc,P1->x,P1->y,P2->x,P2->y,0xffff00);
|
|
DrawLine(pSrc,P3->x,P3->y,P2->x,P2->y,0xffff00);
|
|
DrawLine(pSrc,P3->x,P3->y,P4->x,P4->y,0xffff00);//*/
|
|
SPLINE3_GetSplineParams3(P1,P2,P3,P4,Params);
|
|
SPLINE3_GetSplinePoint3(0.0f,&PointP,Params);
|
|
for (int i = 1 ; i < 30 ; i++)
|
|
{
|
|
SPLINE3_GetSplinePoint3((float)i/30.0f,&PointC,Params);
|
|
DrawLine(pSrc,PointC.x,PointC.y,PointP.x,PointP.y,0xffff);
|
|
PointP = PointC;
|
|
}
|
|
}
|
|
void SPLINE3_DrawNurb3(MAP *pSrc,Vector *P1,Vector *P2,Vector *P3,Vector *P4)
|
|
{
|
|
Vector Params[4];
|
|
Vector PointP,PointC;
|
|
/* DrawLine(pSrc,P1->x,P1->y,P2->x,P2->y,0xffff00);
|
|
DrawLine(pSrc,P3->x,P3->y,P2->x,P2->y,0xffff00);
|
|
DrawLine(pSrc,P3->x,P3->y,P4->x,P4->y,0xffff00);//*/
|
|
SPLINE3_GetNurbParams3(P1,P2,P3,P4,Params);
|
|
SPLINE3_GetNurbPoint3(0.0f,&PointP,Params);
|
|
for (int i = 1 ; i < 30 ; i++)
|
|
{
|
|
SPLINE3_GetNurbPoint3((float)i/30.0f,&PointC,Params);
|
|
DrawLine(pSrc,PointC.x,PointC.y,PointP.x,PointP.y,0xffff);
|
|
PointP = PointC;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|