6 #include "vertexdeclaration9.h"
8 boolean
nine_ff_init(struct NineDevice9
*);
9 void nine_ff_fini(struct NineDevice9
*);
11 void nine_ff_update(struct NineDevice9
*);
14 nine_d3d_matrix_matrix_mul(D3DMATRIX
*, const D3DMATRIX
*, const D3DMATRIX
*);
17 nine_d3d_vector4_matrix_mul(D3DVECTOR
*, const D3DVECTOR
*, const D3DMATRIX
*);
19 nine_d3d_vector3_matrix_mul(D3DVECTOR
*, const D3DVECTOR
*, const D3DMATRIX
*);
22 nine_d3d_matrix_det(const D3DMATRIX
*);
25 nine_d3d_matrix_inverse(D3DMATRIX
*, const D3DMATRIX
*);
28 nine_d3d_matrix_transpose(D3DMATRIX
*, const D3DMATRIX
*);
30 #define NINED3DTSS_TCI_DISABLE 0
31 #define NINED3DTSS_TCI_PASSTHRU 1
32 #define NINED3DTSS_TCI_CAMERASPACENORMAL 2
33 #define NINED3DTSS_TCI_CAMERASPACEPOSITION 3
34 #define NINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 4
35 #define NINED3DTSS_TCI_SPHEREMAP 5
37 static inline unsigned
38 nine_decltype_get_dim(BYTE type
)
41 case D3DDECLTYPE_FLOAT1
: return 1;
42 case D3DDECLTYPE_FLOAT2
: return 2;
43 case D3DDECLTYPE_FLOAT3
: return 3;
44 case D3DDECLTYPE_FLOAT4
: return 4;
45 case D3DDECLTYPE_D3DCOLOR
: return 1;
46 case D3DDECLTYPE_UBYTE4
: return 4;
47 case D3DDECLTYPE_SHORT2
: return 2;
48 case D3DDECLTYPE_SHORT4
: return 4;
49 case D3DDECLTYPE_UBYTE4N
: return 4;
50 case D3DDECLTYPE_SHORT2N
: return 2;
51 case D3DDECLTYPE_SHORT4N
: return 4;
52 case D3DDECLTYPE_USHORT2N
: return 2;
53 case D3DDECLTYPE_USHORT4N
: return 4;
54 case D3DDECLTYPE_UDEC3
: return 3;
55 case D3DDECLTYPE_DEC3N
: return 3;
56 case D3DDECLTYPE_FLOAT16_2
: return 2;
57 case D3DDECLTYPE_FLOAT16_4
: return 4;
59 assert(!"Implementation error !");
64 static inline uint16_t
65 nine_ff_get_projected_key(struct nine_context
*context
)
68 uint16_t projected
= 0;
69 char input_texture_coord
[8];
70 memset(&input_texture_coord
, 0, sizeof(input_texture_coord
));
73 for (i
= 0; i
< context
->vdecl
->nelems
; i
++) {
74 uint16_t usage
= context
->vdecl
->usage_map
[i
];
75 if (usage
% NINE_DECLUSAGE_COUNT
== NINE_DECLUSAGE_TEXCOORD
) {
76 s
= usage
/ NINE_DECLUSAGE_COUNT
;
78 input_texture_coord
[s
] = nine_decltype_get_dim(context
->vdecl
->decls
[i
].Type
);
83 for (s
= 0; s
< 8; ++s
) {
84 unsigned gen
= (context
->ff
.tex_stage
[s
][D3DTSS_TEXCOORDINDEX
] >> 16) + 1;
85 unsigned dim
= context
->ff
.tex_stage
[s
][D3DTSS_TEXTURETRANSFORMFLAGS
] & 0x7;
86 unsigned proj
= !!(context
->ff
.tex_stage
[s
][D3DTSS_TEXTURETRANSFORMFLAGS
] & D3DTTFF_PROJECTED
);
90 dim
= input_texture_coord
[s
];
92 if (!dim
&& gen
== NINED3DTSS_TCI_PASSTHRU
)
93 dim
= input_texture_coord
[s
];
97 if (dim
== 1) /* NV behaviour */
99 if (dim
> input_texture_coord
[s
] && gen
== NINED3DTSS_TCI_PASSTHRU
)
105 projected
|= (dim
-1) << (2 * s
);
110 #endif /* _NINE_FF_H_ */