#include "la_5.h"

/*
NUL4.0 - Nick's Best - www.nicksbest.com

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@  TNS OpenGL 2D/3D Rendering System  @@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@                  __                 @@
@@            ___---  |                @@
@@      __----     @@  ||              @@
@@  _---  _         @@@  ||            @@
@@   |  @@@__         @@   ||          @@
@@    |  @@ #@@@#_     @@@   ||        @@
@@     |  @@     `#@@@@  @@    |_      @@
@@      |  @@         `#@@@@@_--       @@
@@       |  @@          _--'           @@
@@        |  @@     _---               @@
@@         |  @@_---                   @@
@@          |_--          _ __ __ __ __@@
@@                       |  Not Fancy  @@
@@                       |  But Easy   @@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Author(s):WuYiming - xp8110@outlook.com

Want to join the development?
Append your name in the author list above.
Send feedback to la_support@nicksbest.com
*/
#include "la_tns.h"

#include "la_util.h"
#include <math.h>

extern tnsMain *T;

real tnsInterpolate(real L, real R, real T){
    return tnsLinearItp(L, R, T);
}
void tnsInterpolate2dv(real *L, real *R, real T, real *Result){
    Result[0] = tnsLinearItp(L[0], R[0], T);
    Result[1] = tnsLinearItp(L[1], R[1], T);
}
void tnsInterpolate3dv(real *L, real *R, real T, real *Result){
    Result[0] = tnsLinearItp(L[0], R[0], T);
    Result[1] = tnsLinearItp(L[1], R[1], T);
    Result[2] = tnsLinearItp(L[2], R[2], T);
}

//z3 = 1/( linearintp(1/z1),(1/z2),t )
//L,R is GLocation
void tnsInterpolatePerspective4dv(tnsVector4d LG, tnsVector4d RG, tnsVector4d L, tnsVector4d R, real T, tnsVector3d Result){
    ////real t = (w - L[3]) / (R[3] - L[3]);
    real z = 1 / tnsLinearItp(1 / L[2], 1 / R[2], T);

    ////Result[2] = tnsLinearItp(L[2] / L[3], R[2] / R[3], t)*w;
    ////Result[0] = tnsLinearItp(L[0] / L[3], R[0] / R[3], t)*w;
    ////Result[1] = tnsLinearItp(L[1] / L[3], R[1] / R[3], t)*w;

    Result[0] = tnsLinearItp(L[0] / L[2], R[0] / R[2], T) * z;
    Result[1] = tnsLinearItp(L[1] / L[2], R[1] / R[2], T) * z;
    Result[2] = z;

    //real x1z1 = LG[0] / LG[2], x2z2 = RG[0] / RG[2];
    //real x3 = tnsLinearItp(LG[0], RG[0], T);
    //real z3 = tnsLinearItp(LG[2], RG[2], T);
    //real t = (x3 / z3 - x1z1) / (x2z2 - x1z1);
    //Result[0] = tnsLinearItp(L[0], R[0], t);
    //Result[1] = tnsLinearItp(L[1], R[1], t);
    //Result[2] = tnsLinearItp(L[2], R[2], t);
}

tnsLineStrip *tnsCreateLineStrip(){
    tnsLineStrip *ls = CreateNew(tnsLineStrip);
    return ls;
}
tnsLineStripPoint *tnsAppendPoint(tnsLineStrip *ls, real X, real Y, real Z){
    tnsLineStripPoint *lsp = CreateNew(tnsLineStripPoint);

    lsp->P[0] = X;
    lsp->P[1] = Y;
    lsp->P[2] = Z;

    lstAppendItem(&ls->Points, lsp);

    ls->PointCount++;

    return lsp;
}
tnsLineStripPoint *tnsPushPoint(tnsLineStrip *ls, real X, real Y, real Z){
    tnsLineStripPoint *lsp = CreateNew(tnsLineStripPoint);

    lsp->P[0] = X;
    lsp->P[1] = Y;
    lsp->P[2] = Z;

    lstPushItem(&ls->Points, lsp);

    ls->PointCount++;

    return lsp;
}

void tnsRemovePoint(tnsLineStrip *ls, tnsLineStripPoint *lsp){
    lstRemoveItem(&ls->Points, lsp);
    FreeMem(lsp);
}

void tnsDestroyLineStrip(tnsLineStrip *ls){
    tnsLineStripPoint *lsp;
    while (lsp = lstPopItem(&ls->Points)){
        FreeMem(lsp);
    }
    FreeMem(ls);
}