Identify + document render_view

This commit is contained in:
Rachel 2025-02-04 19:38:00 -08:00
parent 6ae0808081
commit cc98efb825
10 changed files with 103 additions and 105 deletions

17
include/render_view.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef POKEPLATINUM_RENDER_VIEW_H
#define POKEPLATINUM_RENDER_VIEW_H
#include <nnsys.h>
void InitRenderer(NNSG2dRendererInstance *renderer, fx32 spriteZOffset);
void InitRenderSurface(NNSG2dRenderSurface *surface,
NNSG2dViewRect *viewRect,
NNSG2dOamRegisterFunction oamRegisterFunc,
NNSG2dAffineRegisterFunction oamAffineRegisterFunc,
NNSG2dRndCellCullingFunction visibilityCullingFunc,
NNSG2dSurfaceType surfaceType,
NNSG2dRendererInstance *renderer);
void SetRenderSurfaceViewRect(NNSG2dRenderSurface *surface, NNSG2dViewRect *viewRect);
BOOL IsObjectInView(const NNSG2dCellData *cellData, const MtxFx32 *objectCoords, const NNSG2dViewRect *viewRect);
#endif // POKEPLATINUM_RENDER_VIEW_H

View File

@ -1,11 +0,0 @@
#ifndef POKEPLATINUM_UNK_0202309C_H
#define POKEPLATINUM_UNK_0202309C_H
#include <nnsys.h>
void sub_0202309C(NNSG2dRendererInstance *param0, fx32 param1);
void sub_020230AC(NNSG2dRenderSurface *param0, NNSG2dViewRect *param1, NNSG2dOamRegisterFunction param2, NNSG2dAffineRegisterFunction param3, NNSG2dRndCellCullingFunction param4, NNSG2dSurfaceType param5, NNSG2dRendererInstance *param6);
void sub_020230E0(NNSG2dRenderSurface *param0, NNSG2dViewRect *param1);
BOOL sub_020230F0(const NNSG2dCellData *param0, const MtxFx32 *param1, const NNSG2dViewRect *param2);
#endif // POKEPLATINUM_UNK_0202309C_H

View File

@ -93,7 +93,7 @@ Static main
Object main.nef.p/src_unk_02022844.c.o
Object main.nef.p/src_error_handling.c.o
Object main.nef.p/src_resource_collection.c.o
Object main.nef.p/src_unk_0202309C.c.o
Object main.nef.p/src_render_view.c.o
Object main.nef.p/src_font_manager.c.o
Object main.nef.p/src_strbuf.c.o
Object main.nef.p/src_unk_02023FCC.c.o

View File

@ -86,7 +86,7 @@ pokeplatinum_c = files(
'touch_screen.c',
'unk_02022844.c',
'resource_collection.c',
'unk_0202309C.c',
'render_view.c',
'font_manager.c',
'unk_02023FCC.c',
'unk_0202414C.c',

View File

@ -20,6 +20,7 @@
#include "heap.h"
#include "math.h"
#include "narc.h"
#include "render_view.h"
#include "sprite_resource.h"
#include "sprite_transfer.h"
#include "sprite_util.h"
@ -27,7 +28,6 @@
#include "sys_task_manager.h"
#include "unk_02005474.h"
#include "unk_0200A784.h"
#include "unk_0202309C.h"
typedef struct UnkStruct_ov5_021D5EF8_t {
UnkStruct_ov5_021D6594 *unk_00;
@ -768,7 +768,7 @@ static void ov5_021D61D0(UnkStruct_ov5_021D61D0 *param0)
int v1;
int v2;
sub_0202309C(&param0->unk_14, -FX32_ONE);
InitRenderer(&param0->unk_14, -FX32_ONE);
v0.posTopLeft.x = 0;
v0.posTopLeft.y = 0;

View File

@ -57,7 +57,7 @@
#include "unk_0200F174.h"
#include "unk_020131EC.h"
#include "unk_02017728.h"
#include "unk_0202309C.h"
#include "render_view.h"
#include "unk_0202ACE0.h"
#include "unk_0203061C.h"
#include "unk_0203909C.h"
@ -2333,7 +2333,7 @@ static BOOL ov64_0222F948 (UnkStruct_ov64_0222F0C4 * param0, UnkStruct_ov64_0222
Bg_ScheduleScroll(param2->unk_00, Unk_ov64_02232258[3], 0, 0);
v2 = Unk_ov64_02232460;
sub_020230E0(&param2->unk_08, &v2);
SetRenderSurfaceViewRect(&param2->unk_08, &v2);
if (param0->unk_AC == 2) {
v0 = 2;
@ -2359,7 +2359,7 @@ static BOOL ov64_0222F948 (UnkStruct_ov64_0222F0C4 * param0, UnkStruct_ov64_0222
v2 = Unk_ov64_02232460;
v2.posTopLeft.x += v1 << FX32_SHIFT;
sub_020230E0(&param2->unk_08, &v2);
SetRenderSurfaceViewRect(&param2->unk_08, &v2);
if (param0->unk_AA % (12 / 4)) {
v3 = param0->unk_AA / (12 / 4);

72
src/render_view.c Normal file
View File

@ -0,0 +1,72 @@
#include "render_view.h"
#include <nnsys.h>
void InitRenderer(NNSG2dRendererInstance *renderer, fx32 spriteZOffset)
{
NNS_G2dInitRenderer(renderer);
NNS_G2dSetRendererSpriteZoffset(renderer, spriteZOffset);
}
void InitRenderSurface(NNSG2dRenderSurface *surface, NNSG2dViewRect *viewRect, NNSG2dOamRegisterFunction oamRegisterFunc, NNSG2dAffineRegisterFunction oamAffineRegisterFunc, NNSG2dRndCellCullingFunction visibilityCullingFunc, NNSG2dSurfaceType surfaceType, NNSG2dRendererInstance *renderer)
{
NNS_G2dInitRenderSurface(surface);
surface->viewRect = *viewRect;
surface->pFuncOamRegister = oamRegisterFunc;
surface->pFuncOamAffineRegister = oamAffineRegisterFunc;
surface->pFuncVisibilityCulling = visibilityCullingFunc;
surface->type = surfaceType;
if (renderer) {
NNS_G2dAddRendererTargetSurface(renderer, surface);
}
}
void SetRenderSurfaceViewRect(NNSG2dRenderSurface *surface, NNSG2dViewRect *viewRect)
{
surface->viewRect = *viewRect;
}
BOOL IsObjectInView(const NNSG2dCellData *cellData, const MtxFx32 *objectCoords, const NNSG2dViewRect *viewRect)
{
const NNSG2dCellBoundingRectS16 *boundingRect = NNS_G2dGetCellBoundingRect(cellData);
const fx32 boundingRadius = NNS_G2dGetCellBoundingSphereR(cellData);
const fx32 originX = objectCoords->_20 - viewRect->posTopLeft.x;
const fx32 originY = objectCoords->_21 - viewRect->posTopLeft.y;
fx32 minY, maxY;
fx32 minX, maxX;
fx32 tmp;
if (NNS_G2dCellHasBR(cellData) == 1) {
minY = boundingRect->minY << FX32_SHIFT;
maxY = boundingRect->maxY << FX32_SHIFT;
minX = boundingRect->minX << FX32_SHIFT;
maxX = boundingRect->maxX << FX32_SHIFT;
} else {
minY = -boundingRadius << FX32_SHIFT;
maxY = boundingRadius << FX32_SHIFT;
minX = -boundingRadius << FX32_SHIFT;
maxX = boundingRadius << FX32_SHIFT;
}
minY = FX_Mul(minY, objectCoords->_01) + FX_Mul(minY, objectCoords->_11) + originY;
maxY = FX_Mul(maxY, objectCoords->_01) + FX_Mul(maxY, objectCoords->_11) + originY;
minX = FX_Mul(minX, objectCoords->_00) + FX_Mul(minX, objectCoords->_10) + originX;
maxX = FX_Mul(maxX, objectCoords->_00) + FX_Mul(maxX, objectCoords->_10) + originX;
if (maxY < minY) {
tmp = maxY;
maxY = minY;
minY = tmp;
}
if (maxX < minX) {
tmp = maxX;
maxX = minX;
minX = tmp;
}
return maxY > 0 && minY < viewRect->sizeView.y && maxX > 0 && minX < viewRect->sizeView.x;
}

View File

@ -7,11 +7,11 @@
#include "char_transfer.h"
#include "heap.h"
#include "pltt_transfer.h"
#include "render_view.h"
#include "sprite_resource.h"
#include "sprite_transfer.h"
#include "sprite_util.h"
#include "unk_0200A784.h"
#include "unk_0202309C.h"
void sub_020093B4(CellActorResourceData *param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, SpriteResourceCollection *param9, SpriteResourceCollection *param10, SpriteResourceCollection *param11, SpriteResourceCollection *param12, SpriteResourceCollection *param13, SpriteResourceCollection *param14)
{
@ -134,7 +134,7 @@ CellActorCollection *sub_020095C4(int param0, G2dRenderer *param1, int param2)
CellActorCollectionParams v0;
NNSG2dViewRect v1;
sub_0202309C(&param1->renderer, -FX32_ONE);
InitRenderer(&param1->renderer, -FX32_ONE);
v1.posTopLeft.x = 0;
v1.posTopLeft.y = 0;
@ -166,7 +166,7 @@ void sub_0200962C(G2dRenderer *param0, fx32 param1, fx32 param2)
v0.sizeView.x = (255 << FX32_SHIFT);
v0.sizeView.y = (192 << FX32_SHIFT);
sub_020230E0(&param0->mainScreen, &v0);
SetRenderSurfaceViewRect(&param0->mainScreen, &v0);
}
void sub_0200964C(G2dRenderer *param0, fx32 param1, fx32 param2)
@ -178,7 +178,7 @@ void sub_0200964C(G2dRenderer *param0, fx32 param1, fx32 param2)
v0.sizeView.x = (255 << FX32_SHIFT);
v0.sizeView.y = (192 << FX32_SHIFT);
sub_020230E0(&param0->subScreen, &v0);
SetRenderSurfaceViewRect(&param0->subScreen, &v0);
}
void sub_0200966C(u32 param0, GXOBJVRamModeChar param1)

View File

@ -5,7 +5,7 @@
#include "cell_actor.h"
#include "heap.h"
#include "unk_0202309C.h"
#include "render_view.h"
typedef struct {
NNSG2dOamManagerInstance unk_00;
@ -98,9 +98,9 @@ void sub_0200A8B0(NNSG2dRenderSurface *param0, NNSG2dViewRect *param1, NNSG2dSur
GF_ASSERT(Unk_021BF430);
if (param2 == NNS_G2D_SURFACETYPE_MAIN2D) {
sub_020230AC(param0, param1, sub_0200A94C, sub_0200A990, sub_020230F0, param2, param3);
InitRenderSurface(param0, param1, sub_0200A94C, sub_0200A990, IsObjectInView, param2, param3);
} else {
sub_020230AC(param0, param1, sub_0200A96C, sub_0200A9B4, sub_020230F0, param2, param3);
InitRenderSurface(param0, param1, sub_0200A96C, sub_0200A9B4, IsObjectInView, param2, param3);
}
}

View File

@ -1,80 +0,0 @@
#include "unk_0202309C.h"
#include <nitro.h>
#include <string.h>
void sub_0202309C(NNSG2dRendererInstance *param0, fx32 param1)
{
NNS_G2dInitRenderer(param0);
NNS_G2dSetRendererSpriteZoffset(param0, param1);
}
void sub_020230AC(NNSG2dRenderSurface *param0, NNSG2dViewRect *param1, NNSG2dOamRegisterFunction param2, NNSG2dAffineRegisterFunction param3, NNSG2dRndCellCullingFunction param4, NNSG2dSurfaceType param5, NNSG2dRendererInstance *param6)
{
NNS_G2dInitRenderSurface(param0);
param0->viewRect = *param1;
param0->pFuncOamRegister = param2;
param0->pFuncOamAffineRegister = param3;
param0->pFuncVisibilityCulling = param4;
param0->type = param5;
if (param6) {
NNS_G2dAddRendererTargetSurface(param6, param0);
}
}
void sub_020230E0(NNSG2dRenderSurface *param0, NNSG2dViewRect *param1)
{
param0->viewRect = *param1;
}
BOOL sub_020230F0(const NNSG2dCellData *param0, const MtxFx32 *param1, const NNSG2dViewRect *param2)
{
const NNSG2dCellBoundingRectS16 *v0 = NNS_G2dGetCellBoundingRect(param0);
const fx32 v1 = NNS_G2dGetCellBoundingSphereR(param0);
const fx32 v2 = param1->_20 - param2->posTopLeft.x;
const fx32 v3 = param1->_21 - param2->posTopLeft.y;
fx32 v4;
fx32 v5;
fx32 v6;
fx32 v7;
fx32 v8;
if (NNS_G2dCellHasBR(param0) == 1) {
v4 = v0->minY << FX32_SHIFT;
v5 = v0->maxY << FX32_SHIFT;
v6 = v0->minX << FX32_SHIFT;
v7 = v0->maxX << FX32_SHIFT;
} else {
v4 = -v1 << FX32_SHIFT;
v5 = v1 << FX32_SHIFT;
v6 = -v1 << FX32_SHIFT;
v7 = v1 << FX32_SHIFT;
}
v4 = FX_Mul(v4, param1->_01) + FX_Mul(v4, param1->_11) + v3;
v5 = FX_Mul(v5, param1->_01) + FX_Mul(v5, param1->_11) + v3;
v6 = FX_Mul(v6, param1->_00) + FX_Mul(v6, param1->_10) + v2;
v7 = FX_Mul(v7, param1->_00) + FX_Mul(v7, param1->_10) + v2;
if (v5 < v4) {
v8 = v5;
v5 = v4;
v4 = v8;
}
if (v7 < v6) {
v8 = v7;
v7 = v6;
v6 = v8;
}
if ((v5 > 0) && (v4 < param2->sizeView.y)) {
if ((v7 > 0) && (v6 < param2->sizeView.x)) {
return 1;
}
}
return 0;
}