TwlIPL_commit-99/add-ins/TwlSystem/include/nnsys/g3d/kernel.h

458 lines
18 KiB
C
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
Project: NITRO-System - include - nnsys - g3d
File: kernel.h
Copyright 2004-2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Revision: 172 $
*---------------------------------------------------------------------------*/
//
// AUTHOR: Kenji Nishida
//
#ifndef NNSG3D_KERNEL_H_
#define NNSG3D_KERNEL_H_
#include <nnsys/g3d/config.h>
#include <nnsys/g3d/binres/res_struct.h>
#include <nnsys/g3d/binres/res_struct_accessor_anm.h>
#ifdef __cplusplus
extern "C" {
#endif
////////////////////////////////////////////////////////////////////////////////
//
// <20>\‘¢‘Ì’è‹`yÑtypedef
//
#define NNS_G3D_SIZE_MAT_MAX_MAX 256
#define NNS_G3D_SIZE_JNT_MAX_MAX 256
#define NNS_G3D_SIZE_SHP_MAX_MAX 256
#if (NNS_G3D_SIZE_MAT_MAX <= 0 || NNS_G3D_SIZE_MAT_MAX > NNS_G3D_SIZE_MAT_MAX_MAX)
#error NNS_G3D_SIZE_MAT_MAX range error.
#endif
#if (NNS_G3D_SIZE_JNT_MAX <= 0 || NNS_G3D_SIZE_JNT_MAX > NNS_G3D_SIZE_JNT_MAX_MAX)
#error NNS_G3D_SIZE_JNT_MAX range error.
#endif
#if (NNS_G3D_SIZE_SHP_MAX <= 0 || NNS_G3D_SIZE_SHP_MAX > NNS_G3D_SIZE_SHP_MAX_MAX)
#error NNS_G3D_SIZE_SHP_MAX range error.
#endif
#if (NNS_G3D_SIZE_MAT_MAX % 32 != 0)
#error NNS_G3D_SIZE_MAT_MAX must be a multiple of 32.
#endif
#if (NNS_G3D_SIZE_JNT_MAX % 32 != 0)
#error NNS_G3D_SIZE_JNT_MAX must be a multiple of 32.
#endif
#if (NNS_G3D_SIZE_SHP_MAX % 32 != 0)
#error NNS_G3D_SIZE_SHP_MAX must be a multiple of 32.
#endif
typedef u32 NNSG3dTexKey; // compatible with NNSGfdTexKey
typedef u32 NNSG3dPlttKey; // compatible with NNSGfdPlttKey
/*---------------------------------------------------------------------------*
NNSG3dAnmObj
NNSG3dRenderObjÉŽQ<C5BD>Ƴêé<E2809A>\¢Ì<E28098><42>ƒƒŠÌŠm•Û<E280A2>E‰ð•ú̓†<C692>[ƒU<C692>[ªŽ©ç<E2809A>s¤
•K—vª èÜ·<E2809A>B<EFBFBD>‰Šú‰»ÍNNS_G3dAnmObjInitŠÖ<C5A0>Å<E2809A>s¢Ü·<E2809A>B
±Ì<E2809A>\¢ÌÌðŠ„Í<E2809A>A
<20>EƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒŠƒ\<5C>[ƒXÆ»êð<E2809A>ˆ<CB86>·éŠÖ<C5A0>̃yƒAðŽwèµ<E2809A>A
<20>EƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒŠƒ\<5C>[ƒXƃƒfƒƒŠƒ\<5C>[ƒXÌŠÖ˜A•t¯ð<E2809A>s¢<E2809A>A
<20>EƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ÌŒ»<C592>Ý̃tƒŒ<C692>[ƒ€ð•ÛŽ<C39B>·é±ÆÅ·<E2809A>B
frame: Ç̃tƒŒ<C692>[ƒ€ð<E2809A>Ä<EFBFBD>·é©Žwè·é<E2809A>B
ratio: ƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒuƒŒƒ“ƒhŠÖ<C5A0>ªŽg—p·é<E2809A>B
resAnm: ŒÂ<C592>X̃Aƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒŠƒ\<5C>[ƒXÖ̃|ƒCƒ“ƒ^
funcAnm: resAnmÌframe”ÔÚ̃tƒŒ<C692>[ƒ€ð<E2809A>Ä<EFBFBD>·éŠÖ<C5A0>Ö̃|ƒCƒ“ƒ^
next: NNS_G3dRenderObjBindAnmObj, NNS_G3dRenderObjReleaseAnmObjÅ
<20>Ýè³êé<E2809A>B
resTex: ƒeƒNƒXƒ`ƒƒƒŠƒ\<5C>[ƒXÖ̃|ƒCƒ“ƒ^<5E>BƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ª•K—vÆ·é<E2809A>ê<EFBFBD>ÌÝ
<20>Ýè³êé<E2809A>B
priority: NNSG3dRenderObjÉ“o˜^³êé<E2809A>ÛÌ—D<E28094>æ<EFBFBD>ˆÊ
numMapData: ƒƒfƒƒŠƒ\<5C>[ƒXƃAƒjƒ<6A>ƒŠƒ\<5C>[ƒX̃Cƒ“ƒfƒbƒNƒXÌΉžðÆéƒe<C692>[ƒuƒ
̃Gƒ“ƒgƒŠÌ<E2809A>
*---------------------------------------------------------------------------*/
typedef struct NNSG3dAnmObj_
{
fx32 frame;
fx32 ratio;
void* resAnm; // ƒŠƒ\<5C>[ƒXƒtƒ@ƒCƒ“àƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒf<C692>[ƒ^ƒuƒ<75>ƒbƒNÖ̃|ƒCƒ“ƒ^
void* funcAnm; // ŠeƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ÌŠÖ<C5A0>”ƒ|ƒCƒ“ƒ^ɃLƒƒƒXƒg³êé<E2809A>BƒfƒtƒHƒƒgª“ü骕Ï<E280A2>XÅ«é
struct NNSG3dAnmObj_* next;
const NNSG3dResTex* resTex; // ƒeƒNƒXƒ`ƒƒƒuƒ<75>ƒbƒNÌ<E2809A>î•ñª•K—vÈ<E2809A>ê<EFBFBD>‡(ƒeƒNƒXƒ`ƒƒƒpƒ^<5E>[ƒ“ƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ÌÝ)
u8 priority;
u8 numMapData;
u16 mapData[1]; // numMapDataŒÂÌ”z—ñÉÈé(NNSG3dAnmObjMapData)
}
NNSG3dAnmObj;
//
// NNSG3dAnmObjÉ•K—vȃ<C388>ƒƒŠÌƒTƒCƒY̓ƒfƒƒŠƒ\<5C>[ƒXƃAƒjƒ<6A><C692>[ƒVƒ‡ƒ“̃JƒeƒSƒŠ©çŒˆè³êé<E2809A>B
// ƒ}ƒeƒŠƒAƒƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“Ì<E2809A>ê<EFBFBD>Í<E2809A>AˆÈ‰ºÌƒ}ƒNƒ<4E>ðŽg—p·é<E2809A>B
// {“Ísizeof(NNSG3dAnmObj) + sizeof(u16) * (pMdl->info.numMat - 1)
// ¾ª4ƒoƒCƒg«ŠEÉ·é
//
#define NNS_G3D_ANMOBJ_SIZE_MATANM(pMdl) ((sizeof(NNSG3dAnmObj) + sizeof(u16) * pMdl->info.numMat) & ~3)
//
// NNSG3dAnmObjÉ•K—vȃ<C388>ƒƒŠÌƒTƒCƒY̓ƒfƒƒŠƒ\<5C>[ƒXƃAƒjƒ<6A><C692>[ƒVƒ‡ƒ“̃JƒeƒSƒŠ©çŒˆè³êé<E2809A>B
// ƒWƒ‡ƒCƒ“ƒgƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƃrƒWƒrƒŠƒeƒBƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“Ì<E2809A>ê<EFBFBD>Í<E2809A>AˆÈ‰ºÌƒ}ƒNƒ<4E>ðŽg—p·é<E2809A>B
// {“Ísizeof(NNSG3dAnmObj) + sizeof(u16) * (pMdl->info.numNode - 1)
// ¾ª4ƒoƒCƒg«ŠEÉ·é
//
#define NNS_G3D_ANMOBJ_SIZE_JNTANM(pMdl) ((sizeof(NNSG3dAnmObj) + sizeof(u16) * pMdl->info.numNode) & ~3)
#define NNS_G3D_ANMOBJ_SIZE_VISANM(pMdl) ((sizeof(NNSG3dAnmObj) + sizeof(u16) * pMdl->info.numNode) & ~3)
/*---------------------------------------------------------------------------*
NNSG3dAnmObjMapData
NNSG3dAnmObjÌmapData”z—ñÉŠi”[³êéƒf<C692>[ƒ^̽ß̃†<C692>[ƒeƒBƒŠƒeƒB“IÈ
—ñ‹“Œ^<5E>B
*---------------------------------------------------------------------------*/
typedef enum
{
NNS_G3D_ANMOBJ_MAPDATA_EXIST = 0x0100,
NNS_G3D_ANMOBJ_MAPDATA_DISABLED = 0x0200,
NNS_G3D_ANMOBJ_MAPDATA_DATAFIELD = 0x00ff
}
NNSG3dAnmObjMapData;
/*---------------------------------------------------------------------------*
ƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒuƒŒƒ“ƒhŠÖ<C5A0>Ìtypedef
*---------------------------------------------------------------------------*/
// anm.hÅè`
struct NNSG3dMatAnmResult_;
struct NNSG3dJntAnmResult_;
struct NNSG3dVisAnmResult_;
// ƒ}ƒeƒŠƒAƒƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒuƒŒƒ“ƒhŠÖ<C5A0>
typedef BOOL (*NNSG3dFuncAnmBlendMat)(struct NNSG3dMatAnmResult_*,
const NNSG3dAnmObj*,
u32);
// ƒWƒ‡ƒCƒ“ƒgƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒuƒŒƒ“ƒhŠÖ<C5A0>
typedef BOOL (*NNSG3dFuncAnmBlendJnt)(struct NNSG3dJntAnmResult_*,
const NNSG3dAnmObj*,
u32);
// ƒrƒWƒrƒŠƒeƒBƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ƒuƒŒƒ“ƒhŠÖ<C5A0>
typedef BOOL (*NNSG3dFuncAnmBlendVis)(struct NNSG3dVisAnmResult_*,
const NNSG3dAnmObj*,
u32);
/*---------------------------------------------------------------------------*
NNSG3dRenderObjFlag
NNSG3dRenderObjªŽ<C2AA>ƒtƒ‰ƒOÅ<E2809A>ANNS_G3dDrawÌ“®<E2809C>ìðƒJƒXƒ^ƒ}ƒCƒYÅ«é<E2809A>B
NNS_G3D_RENDEROBJ_FLAG_RECORD
NNS_G3dDrawÌŽÀ<C5BD>sŽžÉ<E2809A>ArecJntAnm, recMatAnmɃWƒ‡ƒCƒ“ƒgâƒ}ƒeƒŠƒAƒÌ
ŒvŽZŒ‰ÊðƒXƒgƒAµÜ·<E2809A>BŽÀ<C5BD>s<EFBFBD>I—¹ŽžÉ±Ìƒtƒ‰ƒOÍƒŠƒZƒbƒg³êÜ·<E2809A>B
±Ìƒtƒ‰ƒOªƒŠƒZƒbƒg³êÄ¢Ä<E2809A>ArecJntAnm, recMatAnmªNULLų¢<E2809A>ê<EFBFBD>Í
recJntAnm, recMatAnm“àÌŒvŽZŒ‰Êª»ÌÜÜŽg—p³êÜ·<E2809A>B
NNS_G3D_RENDEROBJ_FLAG_NOGECMD
NNS_G3dDrawÌŽÀ<C5BD>sŽžÉ<E2809A>AƒWƒIƒ<49>ƒgƒŠƒRƒ}ƒ“ƒhð<E28098>MµÜ¹ñ<E2809A>B
NNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_DRAW
NNS_G3dDrawÌŽÀ<C5BD>sŽžÉ<E2809A>ASBCÌ•`‰æŒnƒRƒ}ƒ“ƒhÌŽÀ<C5BD>sðƒXƒLƒbƒvµÜ·<E2809A>B
NNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_MTXCALC
NNS_G3dDrawÌŽÀ<C5BD>sŽžÉ<E2809A>ASBCÌ<E2809A>s—ñŒvŽZŒnƒRƒ}ƒ“ƒhÌŽÀ<C5BD>sðƒXƒLƒbƒvµÜ·<E2809A>B
NNS_G3D_RENDEROBJ_FLAG_HINT_OBSOLETE
G3D“à•”ÅƒZƒbƒg<C692>^ƒŠƒZƒbƒg³êéƒtƒ‰ƒOÅhintXXXAnmExistª<E2809A>³µ­È¢<E2809A>óÔ
Ì<E2809A>ê<EFBFBD>‡ƒZƒbƒg³êÜ·(NNS_G3dRenderObjRemoveAnmObj³ê½Æ«ƒZƒbƒg)
NNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_DRAWÆNNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_MTXCALCÍ
g3dcvtrÅ-sƒIƒvƒVƒ‡ƒ“ð¯ăRƒ“ƒo<C692>[ƒgµ½ƒƒfƒÉεėLŒøÅ·<E2809A>B
*---------------------------------------------------------------------------*/
typedef enum
{
NNS_G3D_RENDEROBJ_FLAG_RECORD = 0x00000001,
NNS_G3D_RENDEROBJ_FLAG_NOGECMD = 0x00000002,
NNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_DRAW = 0x00000004,
NNS_G3D_RENDEROBJ_FLAG_SKIP_SBC_MTXCALC = 0x00000008,
NNS_G3D_RENDEROBJ_FLAG_HINT_OBSOLETE = 0x00000010
}
NNSG3dRenderObjFlag;
/*---------------------------------------------------------------------------*
NNSG3dSbcCallBackFunc
NNSG3dRS“àÉŠi”[³êéƒR<C692>ƒoƒbƒNŠÖ<C5A0>Ö̃|ƒCƒ“ƒ^
*---------------------------------------------------------------------------*/
struct NNSG3dRS_;
typedef void (*NNSG3dSbcCallBackFunc)(struct NNSG3dRS_*);
/*---------------------------------------------------------------------------*
NNSG3dSbcCallBackTiming
SBC½—ß“àÅN“®·éƒR<C692>ƒoƒbƒÑ^ƒCƒ~ƒ“ƒOð3Ží—Þ©çŽwèÅ«é<E2809A>B
*---------------------------------------------------------------------------*/
typedef enum
{
NNS_G3D_SBC_CALLBACK_TIMING_NONE = 0x00,
NNS_G3D_SBC_CALLBACK_TIMING_A = 0x01,
NNS_G3D_SBC_CALLBACK_TIMING_B = 0x02,
NNS_G3D_SBC_CALLBACK_TIMING_C = 0x03
}
NNSG3dSbcCallBackTiming;
#define NNS_G3D_SBC_CALLBACK_TIMING_ASSERT(x) \
NNS_G3D_ASSERT(x == NNS_G3D_SBC_CALLBACK_TIMING_NONE || \
x == NNS_G3D_SBC_CALLBACK_TIMING_A || \
x == NNS_G3D_SBC_CALLBACK_TIMING_B || \
x == NNS_G3D_SBC_CALLBACK_TIMING_C)
/*---------------------------------------------------------------------------*
NNSG3dRenderObj
<20>\¢Ì̃<C38C>ƒ“ƒo“™Í<E2809A>íɕω»·é‰Â”\<5C>«ª é
*---------------------------------------------------------------------------*/
typedef struct NNSG3dRenderObj_
{
u32 flag; // NNSG3dRenderObjFlag
// NOTICE:
// NNS_G3dDraw“àÅÍNNSG3dResMdlÌ¡ð<E2809A>«Š·¦é±ÆÍ èܹñ<E2809A>B
// (ƒR<C692>ƒoƒbƒNðŽgÁ½<E2809A>ê<EFBFBD>‡“™Í<E2809A>œ­)
NNSG3dResMdl* resMdl;
NNSG3dAnmObj* anmMat;
NNSG3dFuncAnmBlendMat funcBlendMat;
NNSG3dAnmObj* anmJnt;
NNSG3dFuncAnmBlendJnt funcBlendJnt;
NNSG3dAnmObj* anmVis;
NNSG3dFuncAnmBlendVis funcBlendVis;
// ƒR<C692>ƒoƒbƒN—p<E28094>î•ñ
NNSG3dSbcCallBackFunc cbFunc; // NULLÈç΃R<C692>ƒoƒbƒNÍÈ¢<E2809A>B
u8 cbCmd; // ’âŽ~ˆÊuðƒRƒ}ƒ“ƒhÅŽwè<E28099>BNNS_G3D_SBC_*****(res_struct.hÅè`)
u8 cbTiming; // NNSG3dSbcCallBackTiming(sbc.hÅè`)
u16 dummy_;
// ƒŒƒ“ƒ_ƒŠƒ“ƒOŠJŽn¼OÉŒÄÎêé<E2809A>Bˆê”Ê“IÉNNS_G3dRSÌ
// ƒR<C692>ƒoƒbƒNƒxƒNƒ^ð<E2809A>Ýè·é½ßÉŽgíêé<E2809A>B
NNSG3dSbcCallBackFunc cbInitFunc;
// ƒ†<C692>[ƒU<C692>[ªŠÇ—<C387>·é—̈æÖ̃|ƒCƒ“ƒ^
// ‚ ‚ç‚©‚¶‚߃|ƒCƒ“ƒ^ð<E2809A>ÝèµÄ¨¯ÎƒR<C692>ƒoƒbƒNÅÌŽg—pª‰Â”\.
void* ptrUser;
//
// ƒfƒtƒHƒƒgÅÍresMdl“àÉŠi”[³êÄ¢éSBCðŽg—p·éª<E2809A>A
// ptrUserSbcɃ|ƒCƒ“ƒ^ðŠi”[·é±ÆÉæÁÄ<E2809A>Aƒ†<C692>[ƒU<C692>[’è‹`ÌSBCª
// Žg—p³ê鿤ÉÈé<E2809A>B
//
// Example:
// ƒp<C692>[ƒeƒBƒNƒƒVƒXƒeƒ€“™Å<E2809A>AP<E28099>ƒÈƒƒfƒ(1ƒ}ƒeƒŠƒAƒ1ƒVƒFƒCƒv)‚ð‚¢‚ë‚¢‚ë‚È
// <20>ê<EFBFBD>ŠÉ<E2809A>oµ½¢æ¤È<E2809A>ê<EFBFBD><EFBFBD>AŽŸÌæ¤ÈSBCƒR<C692>[ƒhð<E2809A>ì<EFBFBD>¬µÄƒR<C692>[ƒhÖ̃|ƒCƒ“ƒ^‚ð
// ptrUserSbcÉã“üµÄ¨­ÆŒø—¦ªæ¢<E2809A>B
//
// MAT[000] 0
// MTX 0
// SHP 0
// MTX 1
// SHP 0
// ....
// MTX n
// SHP 0
// RET
//
//  ç©ß<E2809A>s—ñÍ<E2809A>s—ñƒXƒ^ƒbƒNɃZƒbƒgµÄ¨­•K—vª é<E2809A>B
// ܽ<E2809A>Aƒ}ƒeƒŠƒAƒðƒVƒFƒCƒvˆÉ<E2809A>­µ¸Â•Ϧ½¢<E2809A>ê<EFBFBD>Í<E2809A>A
// ƒR<C692>ƒoƒbƒNÅ•Ï<E280A2>X·é̪梾ë¤<E2809A>B
//
u8* ptrUserSbc;
//
// ŒvŽZŒ‰Ễoƒbƒtƒ@ƒŠƒ“ƒO—̈æÖ̃|ƒCƒ“ƒ^
// ƒWƒ‡ƒCƒ“ƒg<C692>Eƒ}ƒeƒŠƒAƒÌŒvŽZŒ‰Êð•¡<E280A2>”ƒtƒŒ<C692>[ƒ€<C692>^•¡<E280A2>Ì̃ƒfƒ
// ÅŽg¢Üíµ½¢<E2809A>ê<EFBFBD>Í<E2809A>ArecJntAnm/recMatAnmɃoƒbƒtƒ@ðƒZƒbƒg·é<E2809A>B
//
// flagÌNNS_G3D_RENDEROBJ_FLAG_RECORDªONÌÆ«<E2809A>A
// recJntAnm, recMatAnmÅNULLÅÈ¢àÌÉ¢Ä<E2809A>A
// ‚»‚ꂼ‚êƒ}ƒeƒŠƒAƒ<C692>EƒWƒ‡ƒCƒ“ƒgÌŒvŽZŒ‰ÊªL˜^³êÄ¢­<E2809A>B
//
// flagÌNNS_G3D_RENDEROBJ_FLAG_RECORDªOFFÌÆ«<E2809A>A
// recJntAnm, recMatAnmªNULLÅÈ¢àÌÉ¢Ä<E2809A>A
// ‚»‚ꂼ‚êƒ}ƒeƒŠƒAƒ<C692>EƒWƒ‡ƒCƒ“ƒgÌŒvŽZŒ‰ÊƵė˜—pµÄ¢­<E2809A>B
//
// ƒ†<C692>[ƒU<C692>[‚Í
// recJntAnmÉ¢ÄÍ<E2809A>A
// sizeof(NNSG3dJntAnmResult) * resMdl->info.numNodeƒoƒCƒg
// recMatAnmÉ¢ÄÍ<E2809A>A
// sizeof(NNSG3dMatAnmResult) * resMdl->info.numMatƒoƒCƒg
// ̗̈æðŠm•۵Ĩ©È­ÄÍÈçÈ¢<E2809A>B
//
struct NNSG3dJntAnmResult_* recJntAnm;
struct NNSG3dMatAnmResult_* recMatAnm;
//
// ƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ªÇ‰Á³ê½Æ«<E2809A>AmatID/nodeIDÉεÄè`‚³‚ê‚Ä‚¢‚邯
// bitª1ÉÈé<E2809A>BŠeIDÍ<E2809A>ÅåÅà256ŒÂÜÅÈÌÅ<E2809A>A8ƒ<38><C692>[ƒh¸ÂÅŠÇ—<C387>Å«é<E2809A>B
// ½¾µ<E2809A>AƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ª<E2809A>í<EFBFBD>œ³ê½<E2809A>ê<EFBFBD>ÉàbitÍ1ÌÜÜÅ é<E2809A>B
// SBC̃Cƒ“ƒ^ƒvƒŠƒ^ͱ̃tƒB<C692>ƒhðƒ`ƒFƒbƒNµÄ<E2809A>A
// NNSG3dFuncBlendMatXXXðƒR<C692>·é©Ç¤©ðŒˆè·é<E2809A>B
// <>ˆÓ·×«ÈÌÍ<E2809A>Abitª0ÌÆ«Í<E2809A>A»ÌmatID/nodeIDÉŠÖŒWµ½
// ƒAƒjƒ<6A><C692>[ƒVƒ‡ƒ“ªÈ¢<E2809A>AÆ¢¤±Æ¾¯ªŠmŽÀŠ鱯Šé<E2809A>B
//
u32 hintMatAnmExist[NNS_G3D_SIZE_MAT_MAX / 32];
u32 hintJntAnmExist[NNS_G3D_SIZE_JNT_MAX / 32];
u32 hintVisAnmExist[NNS_G3D_SIZE_JNT_MAX / 32];
}
NNSG3dRenderObj;
// NNSG3dJntAnmResultŒvŽZŒ‰Êðƒoƒbƒtƒ@ƒŠƒ“ƒO·é<E2809A>ÛÉ
// Žg—p·éƒoƒbƒtƒ@̃TƒCƒYŒvŽZƒ}ƒNƒ<4E>
#define NNS_G3D_RENDEROBJ_JNTBUFFER_SIZE(numJnt) \
((u32)(sizeof(NNSG3dJntAnmResult) * (numJnt)))
// NNSG3dMatAnmResultŒvŽZŒ‰Êðƒoƒbƒtƒ@ƒŠƒ“ƒO·é<E2809A>ÛÉ
// Žg—p·éƒoƒbƒtƒ@̃TƒCƒYŒvŽZƒ}ƒNƒ<4E>
#define NNS_G3D_RENDEROBJ_MATBUFFER_SIZE(numMat) \
((u32)(sizeof(NNSG3dMatAnmResult) * (numMat)))
////////////////////////////////////////////////////////////////////////////////
//
// ŠÖ<C5A0>Ì<E2809A>錾
//
//
// inline functions for NNSG3dAnmObj
//
NNS_G3D_INLINE void NNS_G3dAnmObjSetFrame(NNSG3dAnmObj* pAnmObj, fx32 frame);
NNS_G3D_INLINE void NNS_G3dAnmObjSetBlendRatio(NNSG3dAnmObj* pAnmObj, fx32 ratio);
NNS_G3D_INLINE fx32 NNS_G3dAnmObjGetNumFrame(const NNSG3dAnmObj* pAnmObj);
//
// non-inline functions for NNSG3dAnmObj
//
u32 NNS_G3dAnmObjCalcSizeRequired(const void* pAnm, const NNSG3dResMdl* pMdl);
void NNS_G3dAnmObjInit(NNSG3dAnmObj* pAnmObj,
void* pResAnm,
const NNSG3dResMdl* pResMdl,
const NNSG3dResTex* pResTex);
void NNS_G3dAnmObjEnableID(NNSG3dAnmObj* pAnmObj, int id);
void NNS_G3dAnmObjDisableID(NNSG3dAnmObj* pAnmObj, int id);
//
// inline functions for NNSG3dRenderObj
//
NNS_G3D_INLINE void NNS_G3dRenderObjSetFlag(NNSG3dRenderObj* pRenderObj, NNSG3dRenderObjFlag flag);
NNS_G3D_INLINE void NNS_G3dRenderObjResetFlag(NNSG3dRenderObj* pRenderObj, NNSG3dRenderObjFlag flag);
NNS_G3D_INLINE BOOL NNS_G3dRenderObjTestFlag(const NNSG3dRenderObj* pRenderObj, NNSG3dRenderObjFlag flag);
NNS_G3D_INLINE u8* NNS_G3dRenderObjSetUserSbc(NNSG3dRenderObj* pRenderObj, u8* sbc);
NNS_G3D_INLINE void NNS_G3dRenderObjSetJntAnmBuffer(NNSG3dRenderObj* pRenderObj, struct NNSG3dJntAnmResult_* buf);
NNS_G3D_INLINE void NNS_G3dRenderObjSetMatAnmBuffer(NNSG3dRenderObj* pRenderObj, struct NNSG3dMatAnmResult_* buf);
NNS_G3D_INLINE struct NNSG3dJntAnmResult_* NNS_G3dRenderObjReleaseJntAnmBuffer(NNSG3dRenderObj* pRenderObj);
NNS_G3D_INLINE struct NNSG3dMatAnmResult_* NNS_G3dRenderObjReleaseMatAnmBuffer(NNSG3dRenderObj* pRenderObj);
NNS_G3D_INLINE void* NNS_G3dRenderObjSetUserPtr(NNSG3dRenderObj* pRenderObj, void* ptr);
NNS_G3D_INLINE NNSG3dResMdl* NNS_G3dRenderObjGetResMdl(NNSG3dRenderObj* pRenderObj);
NNS_G3D_INLINE void NNS_G3dRenderObjSetBlendFuncMat(NNSG3dRenderObj* pRenderObj, NNSG3dFuncAnmBlendMat func);
NNS_G3D_INLINE void NNS_G3dRenderObjSetBlendFuncJnt(NNSG3dRenderObj* pRenderObj, NNSG3dFuncAnmBlendJnt func);
NNS_G3D_INLINE void NNS_G3dRenderObjSetBlendFuncVis(NNSG3dRenderObj* pRenderObj, NNSG3dFuncAnmBlendVis func);
//
// non-inline functions for NNSG3dRenderObj
//
void NNS_G3dRenderObjInit(NNSG3dRenderObj* pRenderObj, NNSG3dResMdl* pResMdl);
void NNS_G3dRenderObjAddAnmObj(NNSG3dRenderObj* pRenderObj, NNSG3dAnmObj* pAnmObj);
void NNS_G3dRenderObjRemoveAnmObj(NNSG3dRenderObj* pRenderObj, NNSG3dAnmObj* pAnmObj);
void NNS_G3dRenderObjSetCallBack(NNSG3dRenderObj* pRenderObj,
NNSG3dSbcCallBackFunc func,
u8*,
u8 cmd,
NNSG3dSbcCallBackTiming timing);
void NNS_G3dRenderObjResetCallBack(NNSG3dRenderObj* pRenderObj);
void NNS_G3dRenderObjSetInitFunc(NNSG3dRenderObj* pRenderObj, NNSG3dSbcCallBackFunc func);
//
// non-inline functions for Model/Texture binding
//
// Texture Key
u32 NNS_G3dTexGetRequiredSize(const NNSG3dResTex* pTex);
u32 NNS_G3dTex4x4GetRequiredSize(const NNSG3dResTex* pTex);
void NNS_G3dTexSetTexKey(NNSG3dResTex* pTex,
NNSG3dTexKey texKey,
NNSG3dTexKey tex4x4Key);
void NNS_G3dTexLoad(NNSG3dResTex* pTex, BOOL exec_begin_end);
void NNS_G3dTexReleaseTexKey(NNSG3dResTex* pTex,
NNSG3dTexKey* texKey,
NNSG3dTexKey* tex4x4Key);
// Palette Key
u32 NNS_G3dPlttGetRequiredSize(const NNSG3dResTex* pTex);
void NNS_G3dPlttSetPlttKey(NNSG3dResTex* pTex, NNSG3dPlttKey plttKey);
void NNS_G3dPlttLoad(NNSG3dResTex* pTex, BOOL exec_begin_end);
NNSG3dPlttKey NNS_G3dPlttReleasePlttKey(NNSG3dResTex* pTex);
// Model -> Texture binding
BOOL NNS_G3dBindMdlTex(NNSG3dResMdl* pMdl, const NNSG3dResTex* pTex);
BOOL NNS_G3dBindMdlTexEx(NNSG3dResMdl* pMdl,
const NNSG3dResTex* pTex,
const NNSG3dResName* pResName);
BOOL NNS_G3dForceBindMdlTex(NNSG3dResMdl* pMdl,
const NNSG3dResTex* pTex,
u32 texToMatListIdx,
u32 texIdx);
void NNS_G3dReleaseMdlTex(NNSG3dResMdl* pMdl);
BOOL NNS_G3dReleaseMdlTexEx(NNSG3dResMdl* pMdl, const NNSG3dResName* pResName);
// Model -> Palette binding
BOOL NNS_G3dBindMdlPltt(NNSG3dResMdl* pMdl, const NNSG3dResTex* pTex);
BOOL NNS_G3dBindMdlPlttEx(NNSG3dResMdl* pMdl,
const NNSG3dResTex* pTex,
const NNSG3dResName* pResName);
BOOL NNS_G3dForceBindMdlPltt(NNSG3dResMdl* pMdl,
const NNSG3dResTex* pTex,
u32 plttToMatListIdx,
u32 plttIdx);
void NNS_G3dReleaseMdlPltt(NNSG3dResMdl* pMdl);
BOOL NNS_G3dReleaseMdlPlttEx(NNSG3dResMdl* pMdl, const NNSG3dResName* pResName);
BOOL NNS_G3dBindMdlSet(NNSG3dResMdlSet* pMdlSet, const NNSG3dResTex* pTex);
void NNS_G3dReleaseMdlSet(NNSG3dResMdlSet* pMdlSet);
//
// Misc inline functions
//
#ifdef __cplusplus
}
#endif
#include <nnsys/g3d/kernel_inline.h>
#endif