summaryrefslogtreecommitdiff
path: root/src/m_Do/m_Do_lib.cpp
blob: 5fa191b39f70f4a881a445e84cd9d9acfd4b4452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
// Generated by dtk
// Translation Unit: m_Do_lib.cpp
//

#include "m_Do/m_Do_lib.h"
#include "m_Do/m_Do_mtx.h"
#include "d/d_com_inf_game.h"
#include "JSystem/JMath/JMATrigonometric.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTTexture.h"
#include "dolphin/gx/GX.h"

/* 80017530-800176BC       .text mDoLib_setResTimgObj__FP7ResTIMGP9_GXTexObjUlP10_GXTlutObj */
u32 mDoLib_setResTimgObj(ResTIMG* i_img, GXTexObj* o_texObj, u32 i_tlut_name, GXTlutObj * o_tlutObj) {
    if (i_img->indexTexture) {
        JUT_ASSERT(43, o_tlutObj != NULL);
        GXInitTlutObj(o_tlutObj, ((char*)i_img) + i_img->paletteOffset, (GXTlutFmt)i_img->colorFormat, (u16)i_img->numColors);
        GXInitTexObjCI(o_texObj, ((char*)i_img) + i_img->imageOffset, i_img->width, i_img->height, (GXCITexFmt)i_img->format,
            (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, i_img->mipmapCount > 1 ? GX_TRUE : GX_FALSE, i_tlut_name);
    } else {
        GXInitTexObj(o_texObj, ((char*)i_img) + i_img->imageOffset, i_img->width, i_img->height, (GXTexFmt)i_img->format,
            (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, i_img->mipmapCount > 1 ? GX_TRUE : GX_FALSE);
    }

    GXInitTexObjLOD(o_texObj, (GXTexFilter)i_img->minFilter, (GXTexFilter)i_img->magFilter,
                    i_img->minLOD * 0.125f, i_img->maxLOD * 0.125f, i_img->LODBias * 0.01f,
                    (GXBool)i_img->biasClamp, (GXBool)i_img->doEdgeLOD,
                    (GXAnisotropy)i_img->maxAnisotropy);
    return i_img->indexTexture;
}

J3DUClipper mDoLib_clipper::mClipper;
f32 mDoLib_clipper::mSystemFar;
f32 mDoLib_clipper::mFovyRate;

/* 800176BC-80017748       .text setup__14mDoLib_clipperFffff */
void mDoLib_clipper::setup(f32 fovY, f32 aspect, f32 n, f32 f) {
    mClipper.setFovy(fovY);
    mClipper.setAspect(aspect);
    mClipper.setNear(n);
    mClipper.setFar(f);
    mSystemFar = f;
    mClipper.calcViewFrustum();

    s16 ang = DEG2S(fovY);
    mFovyRate = JMASCos(ang) / JMASSin(ang);
}

/* 80017748-80017924       .text mDoLib_project__FP3VecP3Vec */
void mDoLib_project(Vec* src, Vec* dst) {
    if (dComIfGd_getView() == NULL) {
        dst->x = 0.0f;
        dst->y = 0.0f;
        dst->z = 0.0f;
        return;
    }
    Mtx44* projMtx = dComIfGd_getProjViewMtx();
    cMtx_multVec(*projMtx, src, dst);

    f32 calcFloat = (src->x * (*dComIfGd_getProjViewMtx())[3][0]) +
                    (src->y * (*dComIfGd_getProjViewMtx())[3][1]) +
                    (src->z * (*dComIfGd_getProjViewMtx())[3][2]) +
                    (*dComIfGd_getProjViewMtx())[3][3];
    if (dst->z >= 0.0f) {
        dst->z = 0.0f;
    }
    f32 f3;
    if (calcFloat <= 0.0f) {
        if (calcFloat == 0.0f) {
            dst->z *= 500000.0f;
        } else {
            dst->z *= (0.5f / calcFloat);
        }
        f3 = 500000.0f;
    } else {
        f3 = 0.5f / calcFloat;
        dst->z *= f3;
    }

    view_port_class* viewPort = dComIfGd_getViewport();
    f32 xOffset;
    f32 yOffset;
    f32 xSize;
    f32 ySize;
    if (viewPort->mXOrig != 0.0f) {
        xOffset = (0.5f * ((2.0f * viewPort->mXOrig) + viewPort->mWidth)) - 320.0f;
        xSize = 640.0f;
    } else {
        xOffset = viewPort->mXOrig;
        xSize = viewPort->mWidth;
    }

    if (viewPort->mYOrig != 0.0f) {
        yOffset = (0.5f * ((2.0f * viewPort->mYOrig) + viewPort->mHeight)) - 240.0f;
        ySize = 480.0f;
    } else {
        yOffset = viewPort->mYOrig;
        ySize = viewPort->mHeight;
    }

    dst->x = ((0.5f + (dst->x * f3)) * xSize) + xOffset;
    dst->y = ((0.5f + (dst->y * (-f3))) * ySize) + yOffset;
}

/* 80017924-80017960       .text mDoLib_pos2camera__FP3VecP3Vec */
void mDoLib_pos2camera(Vec* src, Vec* dst) {
    cMtx_multVec(dComIfGd_getView()->mViewMtx, src, dst);
}

/* 80017960-80017994       .text mDoLib_cnvind32__FUl */
u32 mDoLib_cnvind32(u32 r3) {
    u8 sp0C[4];
    u8 sp08[4];
    *(u32*)sp0C = r3;
    sp08[0] = sp0C[3];
    sp08[1] = sp0C[2];
    sp08[2] = sp0C[1];
    sp08[3] = sp0C[0];
    return *(u32*)sp08;
}

/* 80017994-800179B8       .text mDoLib_cnvind16__FUs */
u16 mDoLib_cnvind16(u16 r3) {
    u8 sp0C[2];
    u8 sp08[2];
    *(u16*)sp0C = r3;
    sp08[0] = sp0C[1];
    sp08[1] = sp0C[0];
    return *(u16*)sp08;
}