@@ -28,6 +28,8 @@ SOFTWARE.
2828
2929#include < stdint.h>
3030
31+ #include " psyqo/gte-kernels.hh"
32+ #include " psyqo/gte-registers.hh"
3133#include " psyqo/primitives/common.hh"
3234
3335namespace psyqo {
@@ -188,6 +190,48 @@ struct GouraudQuad {
188190 pointD = v;
189191 return *this ;
190192 }
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+ }
191235
192236 private:
193237 uint32_t command;
@@ -246,6 +290,48 @@ struct GouraudTexturedQuad {
246290 command |= 0x02000000 ;
247291 return *this ;
248292 }
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+ }
249335
250336 private:
251337 uint32_t command;
0 commit comments