rename unk_021E7D8 to camera.c

This commit is contained in:
Akashi Akira
2023-05-02 11:50:23 +01:00
parent b21e7ea5dc
commit a4d727d6b1
6 changed files with 483 additions and 448 deletions

View File

@@ -71,7 +71,7 @@ Static arm9
Object unk_0201D040.o
Object unk_0201E00C.o
Object GX_layers.o
Object unk_0201E7D8.o
Object camera.o
Object unk_0201F06C.o
Object unk_020208B8.o
Object timer3.o

View File

@@ -1,4 +1,5 @@
#include "global.h"
#include "camera.h"
#include "heap.h"
#include "constants/species.h"
#include "gx.h"
@@ -16,8 +17,7 @@ extern void * FUN_02012CDC(void *, void *, void *, u32, u32, u32);
extern void FUN_02068C00(struct UnkStruct_02006D98_4*, u16, u32, u32, u32, u32, u32);
extern void FUN_02012CC8(void);
extern void Camera_SetPerspectiveClippingPlane(u32, u32, u32);
extern u32 FUN_0201343C(void);
extern struct CameraWork * FUN_0201343C(void);
extern void FUN_02013194(void *, u32, u32, u32);
extern u32 FUN_0201318C(u32, u32, u32);

View File

@@ -1,383 +1,383 @@
#include "global.h"
#include "fx.h"
#include "heap.h"
#include "nitro/NNS_g3d.h"
#include "unk_0201E7D8.h"
#include "GX_g3.h"
extern fx16 CalcAngleBetweenVecs(VecFx32 * a, VecFx32 * b);
GXBufferMode g3dDepthBufferingMode = GX_BUFFERMODE_W;
static struct CameraWork * sCameraWorkPtr;
void Camera_OffsetLookAtPosAndTarget(const VecFx32 *delta, struct CameraWork * camera);
void Camera_ApplyPerspectiveType(u8 perspectiveType, struct CameraWork * camera);
THUMB_FUNC void Camera_CalcLookAtPosFromTargetAndAngle(struct CameraWork * camera)
{
u16 negx = -camera->angle.x;
camera->lookAt.camPos.x = FX_Mul(FX_Mul(FX_SinIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camPos.z = FX_Mul(FX_Mul(FX_CosIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camPos.y = FX_Mul(FX_SinIdx(negx), camera->distance);
VEC_Add(&camera->lookAt.camPos, &camera->lookAt.camTarget, &camera->lookAt.camPos);
}
THUMB_FUNC void Camera_CalcLookAtTargetFromPosAndAngle(struct CameraWork * camera)
{
u16 negx = -camera->angle.x;
camera->lookAt.camTarget.x = -FX_Mul(FX_Mul(FX_SinIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camTarget.z = -FX_Mul(FX_Mul(FX_CosIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camTarget.y = -FX_Mul(FX_SinIdx(negx), camera->distance);
VEC_Add(&camera->lookAt.camTarget, &camera->lookAt.camPos, &camera->lookAt.camTarget);
}
THUMB_FUNC void Camera_InitInternal(u16 perspectiveAngle, struct CameraWork * camera)
{
camera->perspectiveAngle = perspectiveAngle;
camera->perspective.fovySin = FX_SinIdx(perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(perspectiveAngle);
camera->perspective.aspect = FX32_CONST(1.33333333); // 4x3
camera->perspective.near = FX32_CONST(150);
camera->perspective.far = FX32_CONST(900);
camera->lookAt.camUp.x = 0;
camera->lookAt.camUp.y = FX32_ONE;
camera->lookAt.camUp.z = 0;
camera->currTarget_p = NULL;
camera->enableOffsetX = FALSE;
camera->enableOffsetY = FALSE;
camera->enableOffsetZ = FALSE;
camera->history = NULL;
}
THUMB_FUNC void Camera_VecResetCoordsIfOffsetComponentNotEnabled(struct CameraWork * camera, VecFx32 * vec)
{
if (!camera->enableOffsetX)
vec->x = 0;
if (!camera->enableOffsetY)
vec->y = 0;
if (!camera->enableOffsetZ)
vec->z = 0;
}
THUMB_FUNC void Camera_GetVecFromSomeRingBufferMaybe(struct CameraWork * camera, const VecFx32 * vecDefault, VecFx32 * vecDst)
{
s32 * idx_p;
s32 * idx2_p;
if (camera->history == NULL)
{
*vecDst = *vecDefault;
}
else
{
idx_p = &camera->history->readIdx;
idx2_p = &camera->history->writeIdx;
if (!camera->history->overrideEnabled)
{
*vecDst = *vecDefault;
if (*idx_p == camera->history->writeIdxInit)
camera->history->overrideEnabled = TRUE;
}
else
{
*vecDst = camera->history->vecs[camera->history->readIdx];
}
*idx_p = (*idx_p + 1) % camera->history->count;
camera->history->vecs[*idx2_p] = *vecDefault;
*idx2_p = (*idx2_p + 1) % camera->history->count;
if (!camera->history->enableUpdateX)
vecDst->x = vecDefault->x;
if (!camera->history->enableUpdateY)
vecDst->y = vecDefault->y;
if (!camera->history->enableUpdateZ)
vecDst->z = vecDefault->z;
}
}
THUMB_FUNC void Camera_AllocHistory(s32 count, s32 initialWriteIdx, s32 updateEnableFlags, s32 heap_id, struct CameraWork * camera)
{
s32 i;
struct CameraHistory * history;
if (camera->currTarget_p != NULL)
{
GF_ASSERT(initialWriteIdx + 1 <= count);
history = AllocFromHeap(heap_id, sizeof(struct CameraHistory));
history->vecs = AllocFromHeap(heap_id, sizeof(VecFx32) * count);
for (i = 0; i < count; i++)
{
history->vecs[i].x = 0;
history->vecs[i].y = 0;
history->vecs[i].z = 0;
}
history->count = count;
history->readIdx = 0;
history->writeIdx = initialWriteIdx;
history->writeIdxInit = initialWriteIdx;
history->overrideEnabled = FALSE;
history->enableUpdateX = FALSE;
history->enableUpdateY = FALSE;
history->enableUpdateZ = FALSE;
if (updateEnableFlags & 1)
history->enableUpdateX = TRUE;
if (updateEnableFlags & 2)
history->enableUpdateY = TRUE;
if (updateEnableFlags & 4)
history->enableUpdateZ = TRUE;
camera->history = history;
}
}
THUMB_FUNC void Camera_FreeHistory(struct CameraWork * camera)
{
if (camera->history != NULL)
{
FreeToHeap(camera->history->vecs);
FreeToHeap(camera->history);
camera->history = NULL;
}
}
THUMB_FUNC struct CameraWork * Camera_Alloc(u32 heap_id)
{
return AllocFromHeap(heap_id, sizeof(struct CameraWork));
}
THUMB_FUNC void Camera_Free(struct CameraWork * camera)
{
FreeToHeap(camera);
}
THUMB_FUNC void Camera_Copy(struct CameraWork * src, struct CameraWork * dest)
{
*dest = *src;
}
THUMB_FUNC void Camera_SetWorkPtr(struct CameraWork * camera)
{
sCameraWorkPtr = camera;
}
THUMB_FUNC void Camera_UnsetWorkPtr(void)
{
sCameraWorkPtr = NULL;
}
THUMB_FUNC void Camera_PushLookAtToNNSGlb(void)
{
VecFx32 diff;
VecFx32 offset;
if (sCameraWorkPtr != NULL)
{
if (sCameraWorkPtr->currTarget_p != NULL)
{
VEC_Subtract(sCameraWorkPtr->currTarget_p, &sCameraWorkPtr->lastTarget, &diff);
Camera_VecResetCoordsIfOffsetComponentNotEnabled(sCameraWorkPtr, &diff);
Camera_GetVecFromSomeRingBufferMaybe(sCameraWorkPtr, &diff, &offset);
Camera_OffsetLookAtPosAndTarget(&offset, sCameraWorkPtr);
sCameraWorkPtr->lastTarget = *sCameraWorkPtr->currTarget_p;
}
NNS_G3dGlbLookAt(&sCameraWorkPtr->lookAt.camPos, &sCameraWorkPtr->lookAt.camUp, &sCameraWorkPtr->lookAt.camTarget);
}
}
THUMB_FUNC void Camera_SetLookAtCamUp(VecFx32 * camUp, struct CameraWork * camera)
{
camera->lookAt.camUp = *camUp;
}
THUMB_FUNC void Camera_SetFixedTarget(VecFx32 * target, struct CameraWork * camera)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
THUMB_FUNC void Camera_ClearFixedTarget(struct CameraWork * camera)
{
camera->currTarget_p = NULL;
camera->enableOffsetX = FALSE;
camera->enableOffsetY = FALSE;
camera->enableOffsetZ = FALSE;
}
THUMB_FUNC void Camera_SetPerspectiveClippingPlane(s32 n, s32 f, struct CameraWork * camera)
{
camera->perspective.near = n;
camera->perspective.far = f,
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_InitWithTargetAndAngle(VecFx32 * target, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 perspectiveType, BOOL fixReference, struct CameraWork * camera)
{
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camTarget = *target;
camera->distance = distance;
camera->angle = *angle;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
Camera_ApplyPerspectiveType(perspectiveType, camera);
if (fixReference)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
}
THUMB_FUNC void Camera_InitWithPosAndAngle(VecFx32 * pos, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 sp18, struct CameraWork * camera)
{
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camPos = *pos;
camera->distance = distance;
camera->angle = *angle;
Camera_CalcLookAtTargetFromPosAndAngle(camera);
Camera_ApplyPerspectiveType(sp18, camera);
}
THUMB_FUNC void Camera_InitWithPosAndTarget(const VecFx32 *target, const VecFx32 *pos, u16 perspectiveAngle, u8 perspectiveType, BOOL setReference, struct CameraWork * camera)
{
VecFx32 vec_from_pos_to_target;
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camTarget = *target;
camera->lookAt.camPos = *pos;
VEC_Subtract(pos, target, &vec_from_pos_to_target);
camera->distance = VEC_Mag(&vec_from_pos_to_target);
{
VecFx32 sp24 = {0, 0, 0}; // unused
VecFx32 sp18 = {0, 0, 0}; // unused
VecFx32 sp0C = {0, 0, 0};
VecFx32 sp00;
sp00.x = 0;
sp00.y = 0;
sp00.z = FX32_ONE;
sp0C = vec_from_pos_to_target;
sp0C.y = 0;
camera->angle.y = CalcAngleBetweenVecs(&sp00, &sp0C);
sp00.x = FX32_ONE;
sp00.y = 0;
sp00.z = 0;
sp0C.x = vec_from_pos_to_target.z;
sp0C.z = vec_from_pos_to_target.y;
sp0C.y = 0;
camera->angle.x = CalcAngleBetweenVecs(&sp00, &sp0C);
camera->angle.z = 0;
}
Camera_ApplyPerspectiveType(perspectiveType, camera);
if (setReference)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
}
THUMB_FUNC void Camera_ApplyPerspectiveType(u8 perspectiveType, struct CameraWork * camera)
{
if (perspectiveType == 0)
{
NNS_G3dGlbPerspective(camera->perspective.fovySin, camera->perspective.fovyCos, camera->perspective.aspect, camera->perspective.near, camera->perspective.far);
camera->perspectiveType = 0;
g3dDepthBufferingMode = GX_BUFFERMODE_Z;
}
else
{
fx32 y = FX_Mul(FX_Div(camera->perspective.fovySin, camera->perspective.fovyCos), camera->distance);
fx32 x = FX_Mul(y, camera->perspective.aspect);
NNS_G3dGlbOrtho(y, -y, -x, x, camera->perspective.near, camera->perspective.far);
camera->perspectiveType = 1;
g3dDepthBufferingMode = GX_BUFFERMODE_Z;
}
}
THUMB_FUNC void Camera_SetPerspectiveAngle(u16 perspectiveAngle, struct CameraWork * camera)
{
camera->perspectiveAngle = perspectiveAngle;
camera->perspective.fovySin = FX_SinIdx(camera->perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(camera->perspectiveAngle);
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_AdjustPerspectiveAngle(u16 rotation, struct CameraWork * camera)
{
camera->perspectiveAngle += rotation;
camera->perspective.fovySin = FX_SinIdx(camera->perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(camera->perspectiveAngle);
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_OffsetLookAtPosAndTarget(const VecFx32 *delta, struct CameraWork * camera)
{
VEC_Add(&camera->lookAt.camPos, delta, &camera->lookAt.camPos);
VEC_Add(&camera->lookAt.camTarget, delta, &camera->lookAt.camTarget);
}
THUMB_FUNC void Camera_SetAngle(const struct CameraAngle * angle, struct CameraWork * camera)
{
camera->angle = *angle;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC void Camera_AdjustAngle(const struct CameraAngle * delta, struct CameraWork * camera)
{
camera->angle.x += delta->x;
camera->angle.y += delta->y;
camera->angle.z += delta->z;
Camera_CalcLookAtTargetFromPosAndAngle(camera);
}
THUMB_FUNC void Camera_SetDistance(fx32 distance, struct CameraWork * camera)
{
camera->distance = distance;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC void Camera_SetLookAtTargetAndRecalcPos(const VecFx32 * target, struct CameraWork * camera)
{
camera->lookAt.camTarget = *target;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC u16 Camera_GetPerspectiveAngle(struct CameraWork * camera)
{
return camera->perspectiveAngle;
}
THUMB_FUNC fx32 Camera_GetDistance(struct CameraWork * camera)
{
return camera->distance;
}
THUMB_FUNC void Camera_GetAngle(struct CameraAngle * dest, struct CameraWork * camera)
{
*dest = camera->angle;
}
THUMB_FUNC void Camera_GetLookAtCamTarget(VecFx32 * dest, const struct CameraWork * camera)
{
*dest = camera->lookAt.camTarget;
}
THUMB_FUNC void Camera_GetLookAtCamPos(VecFx32 * dest, const struct CameraWork * camera)
{
*dest = camera->lookAt.camPos;
}
THUMB_FUNC void Camera_SetLookAtCamTarget(const VecFx32 * target, struct CameraWork * camera)
{
camera->lookAt.camTarget = *target;
}
THUMB_FUNC void Camera_SetLookAtCamPos(const VecFx32 * pos, struct CameraWork * camera)
{
camera->lookAt.camPos = *pos;
}
#include "global.h"
#include "nitro/NNS_g3d.h"
#include "camera.h"
#include "GX_g3.h"
#include "fx.h"
#include "heap.h"
extern fx16 CalcAngleBetweenVecs(VecFx32 * a, VecFx32 * b);
GXBufferMode g3dDepthBufferingMode = GX_BUFFERMODE_W;
static struct CameraWork * sCameraWorkPtr;
void Camera_OffsetLookAtPosAndTarget(const VecFx32 *delta, struct CameraWork * camera);
void Camera_ApplyPerspectiveType(u8 perspectiveType, struct CameraWork * camera);
THUMB_FUNC void Camera_CalcLookAtPosFromTargetAndAngle(struct CameraWork * camera)
{
u16 negx = -camera->angle.x;
camera->lookAt.camPos.x = FX_Mul(FX_Mul(FX_SinIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camPos.z = FX_Mul(FX_Mul(FX_CosIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camPos.y = FX_Mul(FX_SinIdx(negx), camera->distance);
VEC_Add(&camera->lookAt.camPos, &camera->lookAt.camTarget, &camera->lookAt.camPos);
}
THUMB_FUNC void Camera_CalcLookAtTargetFromPosAndAngle(struct CameraWork * camera)
{
u16 negx = -camera->angle.x;
camera->lookAt.camTarget.x = -FX_Mul(FX_Mul(FX_SinIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camTarget.z = -FX_Mul(FX_Mul(FX_CosIdx(camera->angle.y), camera->distance), FX_CosIdx(camera->angle.x));
camera->lookAt.camTarget.y = -FX_Mul(FX_SinIdx(negx), camera->distance);
VEC_Add(&camera->lookAt.camTarget, &camera->lookAt.camPos, &camera->lookAt.camTarget);
}
THUMB_FUNC void Camera_InitInternal(u16 perspectiveAngle, struct CameraWork * camera)
{
camera->perspectiveAngle = perspectiveAngle;
camera->perspective.fovySin = FX_SinIdx(perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(perspectiveAngle);
camera->perspective.aspect = FX32_CONST(1.33333333); // 4x3
camera->perspective.near = FX32_CONST(150);
camera->perspective.far = FX32_CONST(900);
camera->lookAt.camUp.x = 0;
camera->lookAt.camUp.y = FX32_ONE;
camera->lookAt.camUp.z = 0;
camera->currTarget_p = NULL;
camera->enableOffsetX = FALSE;
camera->enableOffsetY = FALSE;
camera->enableOffsetZ = FALSE;
camera->history = NULL;
}
THUMB_FUNC void Camera_VecResetCoordsIfOffsetComponentNotEnabled(struct CameraWork * camera, VecFx32 * vec)
{
if (!camera->enableOffsetX)
vec->x = 0;
if (!camera->enableOffsetY)
vec->y = 0;
if (!camera->enableOffsetZ)
vec->z = 0;
}
THUMB_FUNC void Camera_GetVecFromSomeRingBufferMaybe(struct CameraWork * camera, const VecFx32 * vecDefault, VecFx32 * vecDst)
{
s32 * idx_p;
s32 * idx2_p;
if (camera->history == NULL)
{
*vecDst = *vecDefault;
}
else
{
idx_p = &camera->history->readIdx;
idx2_p = &camera->history->writeIdx;
if (!camera->history->overrideEnabled)
{
*vecDst = *vecDefault;
if (*idx_p == camera->history->writeIdxInit)
camera->history->overrideEnabled = TRUE;
}
else
{
*vecDst = camera->history->vecs[camera->history->readIdx];
}
*idx_p = (*idx_p + 1) % camera->history->count;
camera->history->vecs[*idx2_p] = *vecDefault;
*idx2_p = (*idx2_p + 1) % camera->history->count;
if (!camera->history->enableUpdateX)
vecDst->x = vecDefault->x;
if (!camera->history->enableUpdateY)
vecDst->y = vecDefault->y;
if (!camera->history->enableUpdateZ)
vecDst->z = vecDefault->z;
}
}
THUMB_FUNC void Camera_AllocHistory(s32 count, s32 initialWriteIdx, s32 updateEnableFlags, s32 heap_id, struct CameraWork * camera)
{
s32 i;
struct CameraHistory * history;
if (camera->currTarget_p != NULL)
{
GF_ASSERT(initialWriteIdx + 1 <= count);
history = AllocFromHeap(heap_id, sizeof(struct CameraHistory));
history->vecs = AllocFromHeap(heap_id, sizeof(VecFx32) * count);
for (i = 0; i < count; i++)
{
history->vecs[i].x = 0;
history->vecs[i].y = 0;
history->vecs[i].z = 0;
}
history->count = count;
history->readIdx = 0;
history->writeIdx = initialWriteIdx;
history->writeIdxInit = initialWriteIdx;
history->overrideEnabled = FALSE;
history->enableUpdateX = FALSE;
history->enableUpdateY = FALSE;
history->enableUpdateZ = FALSE;
if (updateEnableFlags & 1)
history->enableUpdateX = TRUE;
if (updateEnableFlags & 2)
history->enableUpdateY = TRUE;
if (updateEnableFlags & 4)
history->enableUpdateZ = TRUE;
camera->history = history;
}
}
THUMB_FUNC void Camera_FreeHistory(struct CameraWork * camera)
{
if (camera->history != NULL)
{
FreeToHeap(camera->history->vecs);
FreeToHeap(camera->history);
camera->history = NULL;
}
}
THUMB_FUNC struct CameraWork * Camera_Alloc(u32 heap_id)
{
return AllocFromHeap(heap_id, sizeof(struct CameraWork));
}
THUMB_FUNC void Camera_Free(struct CameraWork * camera)
{
FreeToHeap(camera);
}
THUMB_FUNC void Camera_Copy(struct CameraWork * src, struct CameraWork * dest)
{
*dest = *src;
}
THUMB_FUNC void Camera_SetWorkPtr(struct CameraWork * camera)
{
sCameraWorkPtr = camera;
}
THUMB_FUNC void Camera_UnsetWorkPtr(void)
{
sCameraWorkPtr = NULL;
}
THUMB_FUNC void Camera_PushLookAtToNNSGlb(void)
{
VecFx32 diff;
VecFx32 offset;
if (sCameraWorkPtr != NULL)
{
if (sCameraWorkPtr->currTarget_p != NULL)
{
VEC_Subtract(sCameraWorkPtr->currTarget_p, &sCameraWorkPtr->lastTarget, &diff);
Camera_VecResetCoordsIfOffsetComponentNotEnabled(sCameraWorkPtr, &diff);
Camera_GetVecFromSomeRingBufferMaybe(sCameraWorkPtr, &diff, &offset);
Camera_OffsetLookAtPosAndTarget(&offset, sCameraWorkPtr);
sCameraWorkPtr->lastTarget = *sCameraWorkPtr->currTarget_p;
}
NNS_G3dGlbLookAt(&sCameraWorkPtr->lookAt.camPos, &sCameraWorkPtr->lookAt.camUp, &sCameraWorkPtr->lookAt.camTarget);
}
}
THUMB_FUNC void Camera_SetLookAtCamUp(VecFx32 * camUp, struct CameraWork * camera)
{
camera->lookAt.camUp = *camUp;
}
THUMB_FUNC void Camera_SetFixedTarget(VecFx32 * target, struct CameraWork * camera)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
THUMB_FUNC void Camera_ClearFixedTarget(struct CameraWork * camera)
{
camera->currTarget_p = NULL;
camera->enableOffsetX = FALSE;
camera->enableOffsetY = FALSE;
camera->enableOffsetZ = FALSE;
}
THUMB_FUNC void Camera_SetPerspectiveClippingPlane(s32 n, s32 f, struct CameraWork * camera)
{
camera->perspective.near = n;
camera->perspective.far = f,
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_InitWithTargetAndAngle(VecFx32 * target, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 perspectiveType, BOOL fixReference, struct CameraWork * camera)
{
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camTarget = *target;
camera->distance = distance;
camera->angle = *angle;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
Camera_ApplyPerspectiveType(perspectiveType, camera);
if (fixReference)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
}
THUMB_FUNC void Camera_InitWithPosAndAngle(VecFx32 * pos, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 sp18, struct CameraWork * camera)
{
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camPos = *pos;
camera->distance = distance;
camera->angle = *angle;
Camera_CalcLookAtTargetFromPosAndAngle(camera);
Camera_ApplyPerspectiveType(sp18, camera);
}
THUMB_FUNC void Camera_InitWithPosAndTarget(const VecFx32 *target, const VecFx32 *pos, u16 perspectiveAngle, u8 perspectiveType, BOOL setReference, struct CameraWork * camera)
{
VecFx32 vec_from_pos_to_target;
Camera_InitInternal(perspectiveAngle, camera);
camera->lookAt.camTarget = *target;
camera->lookAt.camPos = *pos;
VEC_Subtract(pos, target, &vec_from_pos_to_target);
camera->distance = VEC_Mag(&vec_from_pos_to_target);
{
VecFx32 sp24 = {0, 0, 0}; // unused
VecFx32 sp18 = {0, 0, 0}; // unused
VecFx32 sp0C = {0, 0, 0};
VecFx32 sp00;
sp00.x = 0;
sp00.y = 0;
sp00.z = FX32_ONE;
sp0C = vec_from_pos_to_target;
sp0C.y = 0;
camera->angle.y = CalcAngleBetweenVecs(&sp00, &sp0C);
sp00.x = FX32_ONE;
sp00.y = 0;
sp00.z = 0;
sp0C.x = vec_from_pos_to_target.z;
sp0C.z = vec_from_pos_to_target.y;
sp0C.y = 0;
camera->angle.x = CalcAngleBetweenVecs(&sp00, &sp0C);
camera->angle.z = 0;
}
Camera_ApplyPerspectiveType(perspectiveType, camera);
if (setReference)
{
camera->currTarget_p = target;
camera->lastTarget = *target;
camera->enableOffsetX = TRUE;
camera->enableOffsetY = TRUE;
camera->enableOffsetZ = TRUE;
}
}
THUMB_FUNC void Camera_ApplyPerspectiveType(u8 perspectiveType, struct CameraWork * camera)
{
if (perspectiveType == 0)
{
NNS_G3dGlbPerspective(camera->perspective.fovySin, camera->perspective.fovyCos, camera->perspective.aspect, camera->perspective.near, camera->perspective.far);
camera->perspectiveType = 0;
g3dDepthBufferingMode = GX_BUFFERMODE_Z;
}
else
{
fx32 y = FX_Mul(FX_Div(camera->perspective.fovySin, camera->perspective.fovyCos), camera->distance);
fx32 x = FX_Mul(y, camera->perspective.aspect);
NNS_G3dGlbOrtho(y, -y, -x, x, camera->perspective.near, camera->perspective.far);
camera->perspectiveType = 1;
g3dDepthBufferingMode = GX_BUFFERMODE_Z;
}
}
THUMB_FUNC void Camera_SetPerspectiveAngle(u16 perspectiveAngle, struct CameraWork * camera)
{
camera->perspectiveAngle = perspectiveAngle;
camera->perspective.fovySin = FX_SinIdx(camera->perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(camera->perspectiveAngle);
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_AdjustPerspectiveAngle(u16 rotation, struct CameraWork * camera)
{
camera->perspectiveAngle += rotation;
camera->perspective.fovySin = FX_SinIdx(camera->perspectiveAngle);
camera->perspective.fovyCos = FX_CosIdx(camera->perspectiveAngle);
Camera_ApplyPerspectiveType(camera->perspectiveType, camera);
}
THUMB_FUNC void Camera_OffsetLookAtPosAndTarget(const VecFx32 *delta, struct CameraWork * camera)
{
VEC_Add(&camera->lookAt.camPos, delta, &camera->lookAt.camPos);
VEC_Add(&camera->lookAt.camTarget, delta, &camera->lookAt.camTarget);
}
THUMB_FUNC void Camera_SetAngle(const struct CameraAngle * angle, struct CameraWork * camera)
{
camera->angle = *angle;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC void Camera_AdjustAngle(const struct CameraAngle * delta, struct CameraWork * camera)
{
camera->angle.x += delta->x;
camera->angle.y += delta->y;
camera->angle.z += delta->z;
Camera_CalcLookAtTargetFromPosAndAngle(camera);
}
THUMB_FUNC void Camera_SetDistance(fx32 distance, struct CameraWork * camera)
{
camera->distance = distance;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC void Camera_SetLookAtTargetAndRecalcPos(const VecFx32 * target, struct CameraWork * camera)
{
camera->lookAt.camTarget = *target;
Camera_CalcLookAtPosFromTargetAndAngle(camera);
}
THUMB_FUNC u16 Camera_GetPerspectiveAngle(struct CameraWork * camera)
{
return camera->perspectiveAngle;
}
THUMB_FUNC fx32 Camera_GetDistance(struct CameraWork * camera)
{
return camera->distance;
}
THUMB_FUNC void Camera_GetAngle(struct CameraAngle * dest, struct CameraWork * camera)
{
*dest = camera->angle;
}
THUMB_FUNC void Camera_GetLookAtCamTarget(VecFx32 * dest, const struct CameraWork * camera)
{
*dest = camera->lookAt.camTarget;
}
THUMB_FUNC void Camera_GetLookAtCamPos(VecFx32 * dest, const struct CameraWork * camera)
{
*dest = camera->lookAt.camPos;
}
THUMB_FUNC void Camera_SetLookAtCamTarget(const VecFx32 * target, struct CameraWork * camera)
{
camera->lookAt.camTarget = *target;
}
THUMB_FUNC void Camera_SetLookAtCamPos(const VecFx32 * pos, struct CameraWork * camera)
{
camera->lookAt.camPos = *pos;
}

96
include/camera.h Normal file
View File

@@ -0,0 +1,96 @@
#ifndef POKEDIAMOND_CAMERA_H
#define POKEDIAMOND_CAMERA_H
#include "fx.h"
#include "global.h"
struct CameraHistory
{
s32 count;
s32 readIdx;
s32 writeIdx;
s32 writeIdxInit;
BOOL overrideEnabled;
BOOL enableUpdateX;
BOOL enableUpdateY;
BOOL enableUpdateZ;
VecFx32 * vecs;
};
struct CameraAngle
{
u16 x;
u16 y;
u16 z;
u16 unused;
};
struct CameraPerspective
{
fx32 fovySin;
fx32 fovyCos;
fx32 aspect;
fx32 near;
fx32 far;
};
struct CameraLookAt
{
VecFx32 camPos;
VecFx32 camTarget;
VecFx32 camUp;
};
struct CameraWork
{
struct CameraPerspective perspective;
struct CameraLookAt lookAt;
fx32 distance;
struct CameraAngle angle;
u8 perspectiveType;
u16 perspectiveAngle;
VecFx32 lastTarget;
const VecFx32 * currTarget_p;
BOOL enableOffsetX;
BOOL enableOffsetY;
BOOL enableOffsetZ;
struct CameraHistory * history;
};
void Camera_CalcLookAtPosFromTargetAndAngle(struct CameraWork * camera);
void Camera_CalcLookAtTargetFromPosAndAngle(struct CameraWork * camera);
void Camera_InitInternal(u16 perspectiveAngle, struct CameraWork * camera);
void Camera_VecResetCoordsIfOffsetComponentNotEnabled(struct CameraWork * camera, VecFx32 * vec);
void Camera_GetVecFromSomeRingBufferMaybe(struct CameraWork * camera, const VecFx32 * vecDefault, VecFx32 * vecDst);
void Camera_AllocHistory(s32 count, s32 initialWriteIdx, s32 updateEnableFlags, s32 heap_id, struct CameraWork * camera);
void Camera_FreeHistory(struct CameraWork * camera);
struct CameraWork * Camera_Alloc(u32 heap_id);
void Camera_Free(struct CameraWork * camera);
void Camera_Copy(struct CameraWork * src, struct CameraWork * dest);
void Camera_SetWorkPtr(struct CameraWork * camera);
void Camera_UnsetWorkPtr(void);
void Camera_PushLookAtToNNSGlb(void);
void Camera_SetLookAtCamUp(VecFx32 * camUp, struct CameraWork * camera);
void Camera_SetFixedTarget(VecFx32 * target, struct CameraWork * camera);
void Camera_ClearFixedTarget(struct CameraWork * camera);
void Camera_SetPerspectiveClippingPlane(s32 n, s32 f, struct CameraWork * camera);
void Camera_InitWithTargetAndAngle(VecFx32 * target, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 perspectiveType, BOOL fixReference, struct CameraWork * camera);
void Camera_InitWithPosAndAngle(VecFx32 * pos, fx32 distance, struct CameraAngle * angle, u16 perspectiveAngle, u8 sp18, struct CameraWork * camera);
void Camera_InitWithPosAndTarget(const VecFx32 *target, const VecFx32 *pos, u16 perspectiveAngle, u8 perspectiveType, BOOL setReference, struct CameraWork * camera);
void Camera_ApplyPerspectiveType(u8 perspectiveType, struct CameraWork * camera);
void Camera_SetPerspectiveAngle(u16 perspectiveAngle, struct CameraWork * camera);
void Camera_AdjustPerspectiveAngle(u16 rotation, struct CameraWork * camera);
void Camera_OffsetLookAtPosAndTarget(const VecFx32 *delta, struct CameraWork * camera);
void Camera_SetAngle(const struct CameraAngle * angle, struct CameraWork * camera);
void Camera_AdjustAngle(const struct CameraAngle * delta, struct CameraWork * camera);
void Camera_SetDistance(fx32 distance, struct CameraWork * camera);
void Camera_SetLookAtTargetAndRecalcPos(const VecFx32 * target, struct CameraWork * camera);
u16 Camera_GetPerspectiveAngle(struct CameraWork * camera);
fx32 Camera_GetDistance(struct CameraWork * camera);
void Camera_GetAngle(struct CameraAngle * dest, struct CameraWork * camera);
void Camera_GetLookAtCamTarget(VecFx32 * dest, const struct CameraWork * camera);
void Camera_GetLookAtCamPos(VecFx32 * dest, const struct CameraWork * camera);
void Camera_SetLookAtCamTarget(const VecFx32 * target, struct CameraWork * camera);
void Camera_SetLookAtCamPos(const VecFx32 * pos, struct CameraWork * camera);
#endif // POKEDIAMOND_CAMERA_H

View File

@@ -198,7 +198,7 @@ BOOL ScrCmd_SaveChatotCry(struct ScriptContext* ctx);
BOOL ScrCmd_Unk005D(struct ScriptContext* ctx);
BOOL ScrCmd_SetVolume(struct ScriptContext *ctx);
//scrcmd_8.c
//scrcmd_union.c
BOOL ScrCmd_UnionGroup(struct ScriptContext* ctx);
//scrcmd_berry_trees.c

View File

@@ -1,61 +0,0 @@
#ifndef POKEDIAMOND_UNK_0201E7D8_H
#define POKEDIAMOND_UNK_0201E7D8_H
#include "fx.h"
struct CameraHistory
{
s32 count;
s32 readIdx;
s32 writeIdx;
s32 writeIdxInit;
BOOL overrideEnabled;
BOOL enableUpdateX;
BOOL enableUpdateY;
BOOL enableUpdateZ;
VecFx32 * vecs;
};
struct CameraAngle
{
u16 x;
u16 y;
u16 z;
u16 unused;
};
struct CameraPerspective
{
fx32 fovySin;
fx32 fovyCos;
fx32 aspect;
fx32 near;
fx32 far;
};
struct CameraLookAt
{
VecFx32 camPos;
VecFx32 camTarget;
VecFx32 camUp;
};
struct CameraWork
{
struct CameraPerspective perspective;
struct CameraLookAt lookAt;
fx32 distance;
struct CameraAngle angle;
u8 perspectiveType;
u16 perspectiveAngle;
VecFx32 lastTarget;
const VecFx32 * currTarget_p;
BOOL enableOffsetX;
BOOL enableOffsetY;
BOOL enableOffsetZ;
struct CameraHistory * history;
};
#endif //POKEDIAMOND_UNK_0201E7D8_H