Skip to content

Commit e9dc935

Browse files
authored
Merge pull request #1788 from nicolasnoble/prim-color-interpolate
Adding interpolateColors to gouraud primitives.
2 parents 4b98d6b + d4f7ad6 commit e9dc935

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed

src/mips/psyqo/primitives/common.hh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ enum SemiTrans { HalfBackAndHalfFront, FullBackAndFullFront, FullBackSubFullFron
101101
enum ColorMode { Tex4Bits, Tex8Bits, Tex16Bits };
102102
} // namespace Prim::TPageAttr
103103

104+
namespace Prim {
105+
enum class Transparency { Auto, Opaque, SemiTransparent };
106+
}
107+
104108
namespace PrimPieces {
105109

106110
/**

src/mips/psyqo/primitives/quads.hh

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3335
namespace 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;

src/mips/psyqo/primitives/triangles.hh

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3335
namespace psyqo {
@@ -167,6 +169,40 @@ struct GouraudTriangle {
167169
pointC = v;
168170
return *this;
169171
}
172+
template <Transparency transparency = Transparency::Auto>
173+
void interpolateColors(const Color* a, const Color* b, const Color* c) {
174+
GTE::write<GTE::Register::RGB0, GTE::Unsafe>(&a->packed);
175+
GTE::write<GTE::Register::RGB1, GTE::Unsafe>(&b->packed);
176+
GTE::write<GTE::Register::RGB2, GTE::Unsafe>(&c->packed);
177+
if constexpr (transparency == Transparency::Auto) {
178+
GTE::write<GTE::Register::RGB, GTE::Safe>(&command);
179+
} else if constexpr (transparency == Transparency::Opaque) {
180+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x30000000);
181+
} else if constexpr (transparency == Transparency::SemiTransparent) {
182+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x32000000);
183+
}
184+
GTE::Kernels::dpct();
185+
GTE::read<GTE::Register::RGB0>(&command);
186+
GTE::read<GTE::Register::RGB1>(&colorB.packed);
187+
GTE::read<GTE::Register::RGB2>(&colorC.packed);
188+
}
189+
template <Transparency transparency = Transparency::Auto>
190+
void interpolateColors(Color a, Color b, Color c) {
191+
GTE::write<GTE::Register::RGB0, GTE::Unsafe>(a.packed);
192+
GTE::write<GTE::Register::RGB1, GTE::Unsafe>(b.packed);
193+
GTE::write<GTE::Register::RGB2, GTE::Unsafe>(c.packed);
194+
if constexpr (transparency == Transparency::Auto) {
195+
GTE::write<GTE::Register::RGB, GTE::Safe>(&command);
196+
} else if constexpr (transparency == Transparency::Opaque) {
197+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x30000000);
198+
} else if constexpr (transparency == Transparency::SemiTransparent) {
199+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x32000000);
200+
}
201+
GTE::Kernels::dpct();
202+
GTE::read<GTE::Register::RGB0>(&command);
203+
GTE::read<GTE::Register::RGB1>(&colorB.packed);
204+
GTE::read<GTE::Register::RGB2>(&colorC.packed);
205+
}
170206

171207
private:
172208
uint32_t command;
@@ -218,6 +254,40 @@ struct GouraudTexturedTriangle {
218254
command |= 0x02000000;
219255
return *this;
220256
}
257+
template <Transparency transparency = Transparency::Auto>
258+
void interpolateColors(const Color* a, const Color* b, const Color* c) {
259+
GTE::write<GTE::Register::RGB0, GTE::Unsafe>(&a->packed);
260+
GTE::write<GTE::Register::RGB1, GTE::Unsafe>(&b->packed);
261+
GTE::write<GTE::Register::RGB2, GTE::Unsafe>(&c->packed);
262+
if constexpr (transparency == Transparency::Auto) {
263+
GTE::write<GTE::Register::RGB, GTE::Safe>(&command);
264+
} else if constexpr (transparency == Transparency::Opaque) {
265+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x34000000);
266+
} else if constexpr (transparency == Transparency::SemiTransparent) {
267+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x36000000);
268+
}
269+
GTE::Kernels::dpct();
270+
GTE::read<GTE::Register::RGB0>(&command);
271+
GTE::read<GTE::Register::RGB1>(&colorB.packed);
272+
GTE::read<GTE::Register::RGB2>(&colorC.packed);
273+
}
274+
template <Transparency transparency = Transparency::Auto>
275+
void interpolateColors(Color a, Color b, Color c) {
276+
GTE::write<GTE::Register::RGB0, GTE::Unsafe>(a.packed);
277+
GTE::write<GTE::Register::RGB1, GTE::Unsafe>(b.packed);
278+
GTE::write<GTE::Register::RGB2, GTE::Unsafe>(c.packed);
279+
if constexpr (transparency == Transparency::Auto) {
280+
GTE::write<GTE::Register::RGB, GTE::Safe>(&command);
281+
} else if constexpr (transparency == Transparency::Opaque) {
282+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x34000000);
283+
} else if constexpr (transparency == Transparency::SemiTransparent) {
284+
GTE::write<GTE::Register::RGB, GTE::Safe>(0x36000000);
285+
}
286+
GTE::Kernels::dpct();
287+
GTE::read<GTE::Register::RGB0>(&command);
288+
GTE::read<GTE::Register::RGB1>(&colorB.packed);
289+
GTE::read<GTE::Register::RGB2>(&colorC.packed);
290+
}
221291

222292
private:
223293
uint32_t command;

0 commit comments

Comments
 (0)