summaryrefslogtreecommitdiff
path: root/include/d/d_light_env.h
blob: 350a7d9f2c71df8c4f69c53122d16389afe4d317 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
#ifndef D_LIGHT_ENV_H
#define D_LIGHT_ENV_H

#include "common.h"
#include "m/m_color.h"
#include "m/m_vec.h"
#include "toBeSorted/tlist.h"

class ActorLighting {
public:
    typedef TList<ActorLighting, 0> ListType;
    /* 0x00 */ TListNode<ActorLighting> mNode;
    static ListType sList;
    static void fn_80026500();
    static const mColor &getLightTev2Color();
    static const mColor &getLightTev1Color();
    static const mColor &getLightTev0Color();
    static const mColor &getLightTevKColor();

public:
    virtual ~ActorLighting();

    void reset();

    void setTev1Color(GXColor color) {
        mTev1Color = color;
        mUseTev1 = true;
    }

public:
    /* 0x0C */ f32 field_0x0C;
    /* 0x10 */ f32 field_0x10;
    /* 0x14 */ f32 field_0x14;
    /* 0x18 */ f32 field_0x18;
    /* 0x1C */ f32 field_0x1C;
    /* 0x20 */ f32 field_0x20;
    /* 0x24 */ f32 field_0x24;
    /* 0x28 */ f32 field_0x28;
    /* 0x2C */ f32 field_0x2C;
    /* 0x30 */ f32 field_0x30;
    /* 0x34 */ f32 field_0x34;
    /* 0x38 */ f32 field_0x38;
    /* 0x3C */ s32 mLightSetIdx;
    /* 0x40 */ mColor mTev0Color;
    /* 0x44 */ mColor mTev1Color;
    /* 0x48 */ mColor mTev2Color;
    /* 0x4C */ mColor mTevPrevColor;
    /* 0x50 */ mColor mTevK0Color;
    /* 0x54 */ mColor mTevK1Color;
    /* 0x58 */ mColor mTevK2Color;
    /* 0x5C */ mColor mTevK3Color;
    /* 0x60 */ u8 mLightingCode;
    /* 0x61 */ u8 field_0x61;
    /* 0x62 */ u8 field_0x62;
    /* 0x63 */ u8 field_0x63;
    /* 0x64 */ u8 field_0x64;
    /* 0x65 */ bool mUseTev0;
    /* 0x66 */ bool mUseTev1;
    /* 0x67 */ bool mUseTev2;
    /* 0x68 */ bool mUseTevPrev;
    /* 0x69 */ bool mUseTevK0;
    /* 0x6A */ bool mUseTevK1;
    /* 0x6B */ bool mUseTevK2;
    /* 0x6C */ bool mUseTevK3;
};

struct LIGHT_INFLUENCE {
    void SetColor(mColor clr) {
        mClr = clr;
    }
    void SetScale(f32 scale) {
        mScale = scale;
    }
    void SetPosition(const mVec3_c &pos) {
        mPos.x = pos.x;
        mPos.y = pos.y;
        mPos.z = pos.z;
    }

    /* 0x00 */ mVec3_c mPos;
    /* 0x0C */ mColor mClr;
    /* 0x10 */ f32 mScale;
    /* 0x14 */ s32 mIdx;
    /* 0x18 */ bool field_0x18;
};

// This is a weird one - mColor / nw4r::ut::Color are assumed
// to be 4-byte-aligned so that all the u32 type punning works
// correctly, but field_0x1D5 is unaligned and uses a separate
// assignment operator! So we'll go with a separate type for now.
struct UnalignedColor {
    UnalignedColor &operator=(const mColor &color) {
        r = color.r;
        g = color.g;
        b = color.b;
        a = color.a;
        return *this;
    }
    u8 r, g, b, a;
};

struct PaletteDefaultMCF {
    /* 0x00 */ mColor MA00_kColor3;
    /* 0x04 */ mColor MA01_tevReg1;
    /* 0x08 */ mColor MA01_kColor2;
    /* 0x0C */ mColor MA02_tevReg1;
    /* 0x10 */ mColor MA02_kColor2;
    /* 0x14 */ mColor MA03_kColor3;
    /* 0x18 */ mColor MA06_kColor3;
    /* 0x1C */ mColor field_0x1C;
};

struct TwoPaletteDefaultMCF {
    /* 0x00 */ PaletteDefaultMCF field_0x00;
    /* 0x20 */ PaletteDefaultMCF field_0x20;
};

struct ActorPalette {
    /* 0x000 */ mColor mAmbientClr;
    /* 0x004 */ mColor mDiffuseClr;
    /* 0x008 */ mColor mBrightnessClr;
    /* 0x00C */ mColor mSpecularClr;
    /* 0x010 */ mColor mDarkShadowClr;
    /* 0x014 */ mColor mDarkLightClr;
    /* 0x018 */ f32 mSpecular;
    /* 0x01C */ mColor field_0x01C;
    /* 0x020 */ f32 mTemperature; // -1 cool, 1 warm
    /* 0x024 */ f32 field_0x24;
    /* 0x028 */ mColor mShadowClr;
    /* 0x02C */ mColor field_0x02C;
};

struct StagePalette {
    /* 0x000 */ f32 mBrightness;
    /* 0x004 */ mColor mShadowClr;
    /* 0x008 */ mColor mLightClr;
    /* 0x00C */ f32 mSunMoonAngle1;
    /* 0x010 */ f32 mSunMoonAngle2;

    /* 0x014 */ mColor field_0x014;
    /* 0x018 */ u8 field_0x018[5];
    /* 0x020 */ mColor field_0x020[5];
    /* 0x034 */ f32 field_0x034[5];
    /* 0x048 */ f32 field_0x048[5];

    /* 0x05C */ f32 field_0x05C;
    /* 0x060 */ mColor field_0x060;
    /* 0x064 */ u8 field_0x064[5];
    /* 0x06C */ mColor field_0x06C[5];
    /* 0x080 */ f32 field_0x080[5];
    /* 0x094 */ f32 field_0x094[5];

    /* 0x0A8 */ f32 field_0x0A8;
    /* 0x0AC */ mColor field_0x0AC;
    /* 0x0B0 */ u8 field_0x0B0[5];
    /* 0x0B8 */ mColor field_0x0B8[5];
    /* 0x0CC */ f32 field_0x0CC[5];
    /* 0x0E0 */ f32 field_0x0E0[5];

    /* 0x0F4 */ f32 field_0x0F4;
    /* 0x0F8 */ mColor field_0x0F8;
    /* 0x0FC */ u8 field_0x0FC[5];
    /* 0x104 */ mColor field_0x104[5];
    /* 0x118 */ f32 field_0x118[5];
    /* 0x12C */ f32 field_0x12C[5];
};

struct SkyPalette {
    /* 0x000 */ mColor field_0x00;
    /* 0x004 */ mColor field_0x04;
    /* 0x008 */ mColor field_0x08;
    /* 0x00C */ mColor mCloudColor;
    /* 0x010 */ mColor mSkyColor;
    /* 0x014 */ mColor field_0x14;
    /* 0x018 */ mColor mSkyFilter;
    /* 0x01C */ mVec3_c mSkyCenter;
    /* 0x028 */ mVec3_c mSkyScale;
};

struct SffSub {
    mColor field_0x00;
    f32 field_0x04;
    f32 field_0x08;
};

struct SpfSubUnk0 {
    /* 0x00 */ SffSub field_0x00;
    /* 0x0C */ f32 field_0x0C[3];
};

struct SpfSubUnk1 {
    /* 0x00 */ u8 field_0x00;
    /* 0x04 */ f32 field_0x04;
    /* 0x08 */ f32 field_0x08;
    /* 0x0C */ u8 field_0x0C;
    /* 0x10 */ f32 field_0x10;
    /* 0x14 */ f32 field_0x14;
    /* 0x18 */ u8 field_0x18;
    /* 0x19 */ UnalignedColor field_0x19; // Bloom Color
    /* 0x1D */ u8 field_0x1D;
};

struct SpfSubUnk2 {
    /* 0x00 */ f32 field_0x00; // Blur Dist
    /* 0x04 */ f32 field_0x04; // Blur Diffuse
    /* 0x08 */ f32 field_0x08; // Softness Distance
    /* 0x0C */ f32 field_0x0C; // Softness diffuse
    /* 0x10 */ u8 field_0x10;
    /* 0x11 */ u8 field_0x11; // Turning this to not 0 disables effects
    /* 0x12 */ u16 field_0x12;
    /* 0x14 */ f32 field_0x14;
    /* 0x18 */ f32 field_0x18;
    /* 0x1C */ f32 field_0x1C; // Blur?
    /* 0x20 */ f32 field_0x20; // Fog? Shadow?
};

// Broken up in a way to get the assignment operator to match.
// Not 100% certain
struct Spf {
    /* 0x000 */ ActorPalette mActorPalette;
    /* 0x030 */ StagePalette mStagePalette;
    /* 0x170 */ SkyPalette mSkyPalette;
    /* 0x1A4 */ SpfSubUnk0 field_0x1A4;
    /* 0x1BC */ SpfSubUnk1 field_0x1BC;
    /* 0x1DC */ SpfSubUnk2 field_0x1D4;
    /* 0x200 */ mColor mParticleTransparentClr;
    /* 0x204 */ mColor mParticleSolidClr;
};

struct Sff {
    SffSub field_0x00[3];
};

struct EFLIGHT_PROC {
    /* 0x00 */ u8 mState;
    /* 0x01 */ u8 mFrame;
    /* 0x04 */ int mLightType;
    /* 0x08 */ LIGHT_INFLUENCE field_0x8;
};

// Deals with the direction wind particles go?
struct WIND_INFLUENCE {
    /* 0x00 */ mVec3_c mVel;
    /* 0x0C */ f32 field_0x0C;
    /* 0x10 */ f32 field_0x10;
};

struct PaletteEAF_smol_entry {
    mColor field_0x00;
    mColor field_0x04;
    mColor field_0x08;
    mColor field_0x0C;
};

struct PaletteEAF_smol {
    PaletteEAF_smol_entry field_0x00[8];
};

struct PaletteEAF_big_entry {
    mColor field_0x00;
    mColor field_0x04;
    mColor field_0x08;
    mColor field_0x0C;
    u8 field_0x10;
};

struct PaletteEAF_big {
    /* 0x00 */ PaletteEAF_big_entry field_0x00[8];
};

// Apparently particle color related
struct Bpm3 {
    /* 0x00 */ PaletteEAF_smol field_0x00[0x20];
};

struct Bpm4 {
    /* 0x00 */ PaletteEAF_big field_0x00[0x20];
};

struct SHADOW_INFLUENCE {
    /* 0x00 */ mVec3_c mPos;
    /* 0x0C */ f32 mRadius;
    /* 0x10 */ s16 mIdx;
};
struct Bpm8 {
    /* 0x00 */ mVec3_c mPos;
    /* 0x0C */ f32 mRadius;
    /* 0x10 */ s32 field_0x10;
};

struct Bpm9 {
    /* 0x00 */ bool field_0x00;
    /* 0x04 */ mVec3_c mPos;
    /* 0x10 */ f32 mRadius;
};

struct Mist {
    /* 0x00 */ u8 mMode;
    /* 0x01 */ u8 mDecay;
    /* 0x02 */ u8 mAlpha;
    /* 0x04 */ f32 mDirection;
    /* 0x08 */ f32 mSpeed;
};

struct SpfSetting {
    s16 mIdxStart;
    s16 mIdxEnd;
    f32 mRatio;
};

struct SpfTransitionSetting {
    s16 mIdxBefore;
    s16 mIdxAfter;
    s32 mNumFrames;
};

class dLightEnv_c {
public:
    dLightEnv_c();
    virtual ~dLightEnv_c();

    static dLightEnv_c &GetInstance() {
        return sInstance;
    }

    static dLightEnv_c *GetPInstance() {
        return sPInstance;
    }

    void get_vectle_calc(const mVec3_c *, const mVec3_c *, mVec3_c *);
    void sphere_to_cartesian(f32 ang_y, f32 ang_xz, mVec3_c *);

    void efplight_set(LIGHT_INFLUENCE *pLightInfo);
    void efplight_cut(LIGHT_INFLUENCE *pLightInfo);
    LIGHT_INFLUENCE *eflight_influence(const mVec3_c *);

    // Name is guess based on closest func in tp
    void SordFlush_set(const mVec3_c *pPos, s32 lightType);

    void plight_set(LIGHT_INFLUENCE *pLightInfo);
    void plight_cut(LIGHT_INFLUENCE *pLightInfo);
    LIGHT_INFLUENCE *light_influence(const mVec3_c *, bool param2);
    LIGHT_INFLUENCE *light_influence2(const mVec3_c *, bool param2);

    void shadow_set(SHADOW_INFLUENCE *pShadowInfo);
    void shadow_cut(SHADOW_INFLUENCE *pShadowInfo);
    SHADOW_INFLUENCE *shadow_influence(const mVec3_c *);

    void setLightFilter(f32 ratio);
    void set0x35B0(f32 f);

    // Params are guesses
    void setBPM8(const mVec3_c *pos, u32 type, f32 radius);
    void setBPM8_Type4(const mVec3_c *pos);
    void setBPM8_Type6(const mVec3_c *pos);
    void setBPM8_Type10(const mVec3_c *pos);
    void setBPM8_Type10_2(const mVec3_c *pos);
    void setBPM8_Type6_2(const mVec3_c *pos);
    bool check_BPM8(const mVec3_c *pos, mVec3_c *pOutPos);
    bool check_BPM8_1001(const mVec3_c *pos, mVec3_c *pOutPos);
    bool check_BPM8_501(const mVec3_c *pos, mVec3_c *pOutPos);

    bool setUnk(const mVec3_c *pos, f32 radius);
    void setBPM9(const mVec3_c *pos, f32 radius);
    bool check_BPM9(const mVec3_c *pos);

    s32 checkBPM9_Entity(mVec3_c *pOutPos);

    void setAlternateRoomId(s32 roomId);
    s32 getAlterateRoomId();

    mColor color_ratio_set(const mColor &start, const mColor &end, f32 ratio);
    mVec3_c vec_ratio_set(const mVec3_c &start, const mVec3_c &end, f32 ratio);
    f32 f32_ratio_set(const f32 start, const f32 end, f32 ratio);
    u16 u16_ratio_set(const u16 start, const u16 end, f32 ratio);
    u8 u8_ratio_set(const u8 start, const u8 end, f32 ratio);

    void spf_ratio_set(Spf &out, const Spf &start, const Spf &end, f32 ratio);
    void light_influence_ratio_set(
        LIGHT_INFLUENCE &out, const LIGHT_INFLUENCE &start, const LIGHT_INFLUENCE &end, f32 ratio
    );
    void sff_ratio_set(Sff &out, const Sff &start, const Sff &end, f32 ratio);

    void set_override_spf(s16 start, s16 end, f32 ratio);

    void setMist(u8 mode, u8 decay, u8 alpha, f32 dir, f32 speed);
    void setMistMode3(const mVec3_c &vel, f32 value);

    void setDOF(f32 dof);
    void disableDOF();

    void setWind(mVec3_c mPos, f32 f);

    void setField_0x2F20(f32 arg) {
        field_0x2F20 = arg;
    }

    void set_palette_transition(s16 before, s16 after, s32 numFrames);

    // All related
    void fn_80024740(u8, u8);
    bool fn_80024770(u8);
    bool fn_800247A0(u8);

    u8 get0x2DE8() const {
        return field_0x2DE8[0];
    }

    const PaletteDefaultMCF &GetCurrentDefaultMcf() const {
        return field_0x5CE4;
    }

    const Spf &GetCurrentSpf() const {
        return currentSpf;
    }

    SpfSetting &GetOverrideSpf() {
        return mOverrideSpfSetting;
    }

    const PaletteEAF_smol_entry &getSmallEAF(s32 idx1, s32 idx2) {
        return field_0x38E4.field_0x00[idx1].field_0x00[idx2];
    }

    f32 getfield_0x2F14() const {
        return field_0x2F14;
    }

    f32 getfield_0x2F18() const {
        return field_0x2F18;
    }

    f32 getfield_0x2F1C() const {
        return field_0x2F1C;
    }

    bool getfield_0x38B0() const {
        return field_0x38B0;
    }

    void setfield_0x38B0(bool val) {
        field_0x38B0 = val;
    }

    f32 getfield_0x38C0() const {
        return field_0x38C0;
    }

    const mVec3_c &getfield_0x38B4() const {
        return field_0x38B4;
    }

    mVec3_c &getfield_0x38C8() {
        return field_0x38C8;
    }

    void setfield_0x38C4(s32 val) {
        field_0x38C4 = val;
    }

    s32 getField_0x38DC() const {
        return field_0x38DC;
    }

    void setField_0x38DC(s32 v) {
        field_0x38DC = v;
    }

    f32 getfield_0x5D44() const {
        return field_0x5D44;
    }

    void setField_0x5D48(f32 val) {
        field_0x5D48 = val;
    }

private:
    /* 0x0004 */ Spf currentSpf;
    /* 0x020C */ Spf spfs[20];
    /* 0x2AAC */ Sff currentSff;
    /* 0x2AD0 */ Sff sffs[20];
    /* 0x2DA0 */ SpfSetting mCurrentSpfSetting;
    /* 0x2DA8 */ u8 field_0x2DA8[0x2DB4 - 0x2DA8];
    /* 0x2DB4 */ SpfTransitionSetting mTransitionSpfSetting;
    /* 0x2DBC */ u8 field_0x2DBC[0x2DC0 - 0x2DBC];
    /* 0x2DC0 */ SpfSetting mOverrideSpfSetting;
    /* 0x2DC8 */ Mist mMistInfo;
    /* 0x2DD4 */ mVec3_c mMistPos;
    /* 0x2DE0 */ bool mDofEnabled;
    /* 0x2DE4 */ f32 mDof;
    /* 0x2DE8 */ u8 field_0x2DE8[0x2DEC - 0x2DE8];
    /* 0x2DEC */ mColor field_0x2DEC;
    /* 0x2DF0 */ u8 field_0x2DF0[0x2DF4 - 0x2DF0];
    /* 0x2DF4 */ mColor field_0x2DF4;
    /* 0x2DF8 */ mVec3_c field_0x2DF8;
    /* 0x2E04 */ u8 field_0x2E04[0x2E08 - 0x2E04];
    /* 0x2E08 */ mVec3_c field_0x2E08[5];
    /* 0x2E44 */ mVec3_c field_0x2E44[5];
    /* 0x2E80 */ mVec3_c field_0x2E80[5];
    /* 0x2EBC */ mVec3_c field_0x2EBC[5];
    /* 0x2EF8 */ mColor field_0x2EF8;
    /* 0x2EFC */ mColor field_0x2EFC;
    /* 0x2F00 */ mVec3_c field_0x2F00;
    /* 0x2F0C */ s16 field_0x2F0C;
    /* 0x2F0E */ s16 field_0x2F0E;
    /* 0x2F10 */ u8 field_0x2F10;
    /* 0x2F14 */ f32 field_0x2F14;
    /* 0x2F18 */ f32 field_0x2F18;
    /* 0x2F1C */ f32 field_0x2F1C;
    /* 0x2F20 */ f32 field_0x2F20;
    /* 0x2F24 */ u8 field_0x2F24[4];
    /* 0x2F28 */ LIGHT_INFLUENCE *efplight[5];
    /* 0x2F3C */ LIGHT_INFLUENCE *pointlight[200];
    /* 0x325C */ SHADOW_INFLUENCE *pshadow[200];
    /* 0x357C */ EFLIGHT_PROC eflight;
    /* 0x35A0 */ WIND_INFLUENCE mWind;
    /* 0x35B4 */ SHADOW_INFLUENCE field_0x35B4[8];
    /* 0x3654 */ Bpm8 field_0x3654[10];
    /* 0x371C */ Bpm9 field_0x371C[20];
    /* 0x387C */ u32 field_0x387C;
    /* 0x38B0 */ bool field_0x38B0;
    /* 0x38B4 */ mVec3_c field_0x38B4;
    /* 0x38C0 */ f32 field_0x38C0;
    /* 0x38C4 */ s32 field_0x38C4;
    /* 0x38C8 */ mVec3_c field_0x38C8;
    /* 0x38D4 */ u32 mPlayerRoomId;
    /* 0x38D8 */ s32 mAlternateRoomId;
    /* 0x38D8 */ u32 field_0x38DC;
    /* 0x38D8 */ s32 field_0x38E0;
    /* 0x38E4 */ Bpm3 field_0x38E4;
    /* 0x48E4 */ Bpm4 field_0x48E4;
    /* 0x5CE4 */ PaletteDefaultMCF field_0x5CE4;
    /* 0x5D04 */ TwoPaletteDefaultMCF field_0x5D04;
    /* 0x5D44 */ f32 field_0x5D44;
    /* 0x5D48 */ f32 field_0x5D48;
    /* 0x5D4C */ u8 field_0x5D4C[0x5D59 - 0x5D4C];
    /* 0x5D59 */ struct { // Anonymous until more is known
        bool mEnabled;
        u8 mValue;
    } field_0x5D59[9];
    /* 0x5D6C */ u8 field_0x5D6C[0x5D70 - 0x5D6C];

    static dLightEnv_c sInstance;
    static dLightEnv_c *sPInstance;
};

#endif