@@ -28,6 +28,8 @@ SOFTWARE.
28
28
29
29
#include < stdint.h>
30
30
31
+ #include " psyqo/gte-kernels.hh"
32
+ #include " psyqo/gte-registers.hh"
31
33
#include " psyqo/primitives/common.hh"
32
34
33
35
namespace psyqo {
@@ -188,6 +190,48 @@ struct GouraudQuad {
188
190
pointD = v;
189
191
return *this ;
190
192
}
193
+ template <Transparency transparency = Transparency::Auto>
194
+ void interpolateColors (const Color* a, const Color* b, const Color* c, const Color* d) {
195
+ uint32_t rgb;
196
+ if constexpr (transparency == Transparency::Auto) {
197
+ rgb = (a->packed & 0xffffff ) | (command & 0xff000000 );
198
+ } else if constexpr (transparency == Transparency::Opaque) {
199
+ rgb = (a->packed & 0xffffff ) | 0x38000000 ;
200
+ } else if constexpr (transparency == Transparency::SemiTransparent) {
201
+ rgb = (a->packed & 0xffffff ) | 0x3a000000 ;
202
+ }
203
+ GTE::write<GTE::Register::RGB, GTE::Safe>(rgb);
204
+ GTE::Kernels::dpcs ();
205
+ GTE::read<GTE::Register::RGB2>(&command);
206
+ GTE::write<GTE::Register::RGB0, GTE::Unsafe>(&b->packed );
207
+ GTE::write<GTE::Register::RGB1, GTE::Unsafe>(&c->packed );
208
+ GTE::write<GTE::Register::RGB2, GTE::Unsafe>(&d->packed );
209
+ GTE::Kernels::dpct ();
210
+ GTE::read<GTE::Register::RGB0>(&colorB.packed );
211
+ GTE::read<GTE::Register::RGB1>(&colorC.packed );
212
+ GTE::read<GTE::Register::RGB2>(&colorD.packed );
213
+ }
214
+ template <Transparency transparency = Transparency::Auto>
215
+ void interpolateColors (Color a, Color b, Color c, Color d) {
216
+ uint32_t rgb;
217
+ if constexpr (transparency == Transparency::Auto) {
218
+ rgb = (a.packed & 0xffffff ) | (command & 0xff000000 );
219
+ } else if constexpr (transparency == Transparency::Opaque) {
220
+ rgb = (a.packed & 0xffffff ) | 0x38000000 ;
221
+ } else if constexpr (transparency == Transparency::SemiTransparent) {
222
+ rgb = (a.packed & 0xffffff ) | 0x3a000000 ;
223
+ }
224
+ GTE::write<GTE::Register::RGB, GTE::Safe>(rgb);
225
+ GTE::Kernels::dpcs ();
226
+ GTE::read<GTE::Register::RGB2>(&command);
227
+ GTE::write<GTE::Register::RGB0, GTE::Unsafe>(b.packed );
228
+ GTE::write<GTE::Register::RGB1, GTE::Unsafe>(c.packed );
229
+ GTE::write<GTE::Register::RGB2, GTE::Unsafe>(d.packed );
230
+ GTE::Kernels::dpct ();
231
+ GTE::read<GTE::Register::RGB0>(&colorB.packed );
232
+ GTE::read<GTE::Register::RGB1>(&colorC.packed );
233
+ GTE::read<GTE::Register::RGB2>(&colorD.packed );
234
+ }
191
235
192
236
private:
193
237
uint32_t command;
@@ -246,6 +290,48 @@ struct GouraudTexturedQuad {
246
290
command |= 0x02000000 ;
247
291
return *this ;
248
292
}
293
+ template <Transparency transparency = Transparency::Auto>
294
+ void interpolateColors (const Color* a, const Color* b, const Color* c, const Color* d) {
295
+ uint32_t rgb;
296
+ if constexpr (transparency == Transparency::Auto) {
297
+ rgb = (a->packed & 0xffffff ) | (command & 0xff000000 );
298
+ } else if constexpr (transparency == Transparency::Opaque) {
299
+ rgb = (a->packed & 0xffffff ) | 0x3c000000 ;
300
+ } else if constexpr (transparency == Transparency::SemiTransparent) {
301
+ rgb = (a->packed & 0xffffff ) | 0x3e000000 ;
302
+ }
303
+ GTE::write<GTE::Register::RGB, GTE::Safe>(rgb);
304
+ GTE::Kernels::dpcs ();
305
+ GTE::read<GTE::Register::RGB2>(&command);
306
+ GTE::write<GTE::Register::RGB0, GTE::Unsafe>(&b->packed );
307
+ GTE::write<GTE::Register::RGB1, GTE::Unsafe>(&c->packed );
308
+ GTE::write<GTE::Register::RGB2, GTE::Unsafe>(&d->packed );
309
+ GTE::Kernels::dpct ();
310
+ GTE::read<GTE::Register::RGB0>(&colorB.packed );
311
+ GTE::read<GTE::Register::RGB1>(&colorC.packed );
312
+ GTE::read<GTE::Register::RGB2>(&colorD.packed );
313
+ }
314
+ template <Transparency transparency = Transparency::Auto>
315
+ void interpolateColors (Color a, Color b, Color c, Color d) {
316
+ uint32_t rgb;
317
+ if constexpr (transparency == Transparency::Auto) {
318
+ rgb = (a.packed & 0xffffff ) | (command & 0xff000000 );
319
+ } else if constexpr (transparency == Transparency::Opaque) {
320
+ rgb = (a.packed & 0xffffff ) | 0x3c000000 ;
321
+ } else if constexpr (transparency == Transparency::SemiTransparent) {
322
+ rgb = (a.packed & 0xffffff ) | 0x3e000000 ;
323
+ }
324
+ GTE::write<GTE::Register::RGB, GTE::Safe>(rgb);
325
+ GTE::Kernels::dpcs ();
326
+ GTE::read<GTE::Register::RGB2>(&command);
327
+ GTE::write<GTE::Register::RGB0, GTE::Unsafe>(b.packed );
328
+ GTE::write<GTE::Register::RGB1, GTE::Unsafe>(c.packed );
329
+ GTE::write<GTE::Register::RGB2, GTE::Unsafe>(d.packed );
330
+ GTE::Kernels::dpct ();
331
+ GTE::read<GTE::Register::RGB0>(&colorB.packed );
332
+ GTE::read<GTE::Register::RGB1>(&colorC.packed );
333
+ GTE::read<GTE::Register::RGB2>(&colorD.packed );
334
+ }
249
335
250
336
private:
251
337
uint32_t command;
0 commit comments