1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin GD library
3   File:     GDTransform.h
4 
5   Copyright 2001 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: GDTransform.h,v $
14   Revision 1.2  2006/02/04 11:56:46  hashida
15   (none)
16 
17   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
18   Ported from dolphin source tree.
19 
20 
21     4     2004/02/09 9:45 Hirose
22     Parenthesized 'mtxId' in __*MtxToXFMem macros for safety.
23 
24     3     2002/08/05 19:49 Hirose
25     Const type specifier support.
26 
27     2     2002/05/30 13:39 Hirose
28     Added GDSetProjection.
29 
30     1     2001/09/12 1:55p Carl
31     Initial revision of GD: Graphics Display List Library.
32 
33   $NoKeywords: $
34  *---------------------------------------------------------------------------*/
35 
36 #ifndef __GDTRANSFORM_H__
37 #define __GDTRANSFORM_H__
38 
39 /*---------------------------------------------------------------------------*/
40 #include <revolution/types.h>
41 #include <revolution/gx/GXEnum.h>
42 /*---------------------------------------------------------------------------*/
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 // Define some XF memory spaces:
49 #define __XFMemPosMtx 0x0000
50 #define __XFMemNrmMtx 0x0400
51 #define __XFMemDTTMtx 0x0500
52 
53 // Define conversions from GX enums to XF memory spaces:
54 #define __PosMtxToXFMem(mtxId) ((u16)(__XFMemPosMtx + (mtxId) * 4))
55 #define __TexMtxToXFMem(mtxId) ((u16)(__XFMemPosMtx + (mtxId) * 4))
56 #define __NrmMtxToXFMem(mtxId) ((u16)(__XFMemNrmMtx + (mtxId) * 3))
57 #define __DTTMtxToXFMem(mtxId) ((u16)(__XFMemDTTMtx + ((mtxId)-GX_PTTEXMTX0) * 4))
58 
59 /*---------------------------------------------------------------------------*/
60 
61 void GDLoadPosMtxImm ( const f32 mtx[3][4], u32 id );
62 void GDLoadPosMtxIndx ( u16 mtx_indx, u32 id );
63 void GDLoadNrmMtxImm ( const f32 mtx[3][4], u32 id );
64 void GDLoadNrmMtxImm3x3 ( const f32 mtx[3][3], u32 id );
65 void GDLoadNrmMtxIndx3x3 ( u16 mtx_indx, u32 id );
66 void GDLoadTexMtxImm ( const f32 mtx[][4], u32 id, GXTexMtxType type );
67 void GDLoadTexMtxIndx ( u16 mtx_indx, u32 id, GXTexMtxType type );
68 
69 void GDSetCurrentMtx ( u32 pn, u32 t0, u32 t1, u32 t2, u32 t3,
70                        u32 t4, u32 t5, u32 t6, u32 t7 );
71 
72 void GDSetProjection ( const f32 mtx[4][4], GXProjectionType type );
73 
74 
75 /*---------------------------------------------------------------------------*/
76 
77 #define MATIDX_REG_A_POSIDX_SHIFT	0
78 #define MATIDX_REG_A_TEX0IDX_SHIFT	6
79 #define MATIDX_REG_A_TEX1IDX_SHIFT	12
80 #define MATIDX_REG_A_TEX2IDX_SHIFT	18
81 #define MATIDX_REG_A_TEX3IDX_SHIFT	24
82 #define MATIDX_REG_A(posIdx, tex0Idx, tex1Idx, tex2Idx, tex3Idx) \
83 	((((unsigned long)(posIdx))  << MATIDX_REG_A_POSIDX_SHIFT) | \
84 	 (((unsigned long)(tex0Idx)) << MATIDX_REG_A_TEX0IDX_SHIFT) | \
85 	 (((unsigned long)(tex1Idx)) << MATIDX_REG_A_TEX1IDX_SHIFT) | \
86 	 (((unsigned long)(tex2Idx)) << MATIDX_REG_A_TEX2IDX_SHIFT) | \
87 	 (((unsigned long)(tex3Idx)) << MATIDX_REG_A_TEX3IDX_SHIFT))
88 
89 #define MATIDX_REG_B_TEX4IDX_SHIFT	0
90 #define MATIDX_REG_B_TEX5IDX_SHIFT	6
91 #define MATIDX_REG_B_TEX6IDX_SHIFT	12
92 #define MATIDX_REG_B_TEX7IDX_SHIFT	18
93 #define MATIDX_REG_B(tex4Idx, tex5Idx, tex6Idx, tex7Idx) \
94 	((((unsigned long)(tex4Idx)) << MATIDX_REG_B_TEX4IDX_SHIFT) | \
95 	 (((unsigned long)(tex5Idx)) << MATIDX_REG_B_TEX5IDX_SHIFT) | \
96 	 (((unsigned long)(tex6Idx)) << MATIDX_REG_B_TEX6IDX_SHIFT) | \
97 	 (((unsigned long)(tex7Idx)) << MATIDX_REG_B_TEX7IDX_SHIFT))
98 
99 #define CP_MATINDEX_A	    0x30
100 #define CP_MATINDEX_B	    0x40
101 
102 #define XF_MATINDEX_A	    0x1018
103 #define XF_MATINDEX_B	    0x1019
104 
105 #define XF_PROJECTION_ID    0x1020
106 
107 /*---------------------------------------------------------------------------*/
108 #ifdef __cplusplus
109 }
110 #endif
111 
112 #endif // __GDTRANSFORM_H__
113