mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-07 22:34:43 -04:00
Dreamcast: Line clip works, unoptimised though
This commit is contained in:
parent
60a6ce3840
commit
67a47a0a9b
@ -1,3 +1,7 @@
|
||||
! r0 CLOBBERS
|
||||
! r1 CLOBBERS
|
||||
! r2 CLOBBERS
|
||||
! r3 CLOBBERS
|
||||
! r4 = v1
|
||||
! r5 = v2
|
||||
! r6 = OUT
|
||||
@ -12,8 +16,8 @@
|
||||
! FR7 = B.2
|
||||
! FR8 = 0
|
||||
! FR9 = 0
|
||||
! FR10 = t
|
||||
! FR11 = invT
|
||||
! FR10 = invT
|
||||
! FR11 = t
|
||||
|
||||
! Calculates the near plane intersection point between two points:
|
||||
! float t = fabsf(v1->z) / fabsf(v2->z - v1->z)
|
||||
@ -51,21 +55,21 @@ _ClipLine:
|
||||
mov r5, r1 ! MT, r1 = &v2
|
||||
fldi0 fr5 ! LS, fr5 = 0
|
||||
add #12, r1 ! EX, r1 = &v2->z
|
||||
fmov.s @r1,fr10 ! LS, fr10 = v2->z
|
||||
fsub fr2,fr10 ! FE, fr10 = v2->z - v1->z
|
||||
fmov.s @r1,fr11 ! LS, fr11 = v2->z
|
||||
fsub fr2,fr11 ! FE, fr11 = v2->z - v1->z
|
||||
fldi0 fr8 ! LS, fr8 = 0
|
||||
fmul fr10,fr10 ! FE, fr10 = (v2->z - v1->z) * (B->z * v1->z)
|
||||
fmul fr11,fr11 ! FE, fr11 = (v2->z - v1->z) * (v2->z * v1->z)
|
||||
fldi0 fr9 ! LS, fr9 = 0
|
||||
fldi0 fr0 ! LS, fr0 = 0
|
||||
fldi0 fr1 ! LS, fr1 = 0
|
||||
fsrra fr10 ! FE, fr10 = 1 / abs(B->z - v1->z)
|
||||
fsrra fr11 ! FE, fr11 = 1 / abs(v2->z - v1->z)
|
||||
fabs fr2 ! LS, fr2 = abs(v1->z)
|
||||
fmul fr2,fr10 ! FE, fr10 = abs(v1->Z) / abs(B->z - v1->z) --> t
|
||||
fmul fr2,fr11 ! FE, fr11 = abs(v1->Z) / abs(v2->z - v1->z) --> t
|
||||
add #4, r4 ! EX, A = &v1->x
|
||||
fldi1 fr11 ! LS, fr11 = 1
|
||||
fldi1 fr10 ! LS, fr10 = 1
|
||||
add #4, r5 ! EX, B = &v2->x
|
||||
add #4, r6 ! EX, OUT = &OUT->x
|
||||
fsub fr10,fr11 ! FE, fr11 = 1.0 - t --> invT
|
||||
fsub fr11,fr10 ! FE, fr10 = 1.0 - t --> invT
|
||||
|
||||
fmov.s @r4+, fr2 ! LS, A = v1->x
|
||||
fmov.s @r5+, fr3 ! LS, B = v2->x
|
||||
|
68
third_party/gldc/src/sh4.c
vendored
68
third_party/gldc/src/sh4.c
vendored
@ -46,25 +46,7 @@ static inline void _glPushHeaderOrVertex(Vertex* v) {
|
||||
sq += 8;
|
||||
}
|
||||
|
||||
static void ClipEdge(const Vertex* const v1, const Vertex* const v2, Vertex* vout) {
|
||||
float d0 = v1->z;
|
||||
float d1 = v2->z;
|
||||
float t = (fabsf(d0) * MATH_fsrra((d1 - d0) * (d1 - d0))) + 0.000001f;
|
||||
float invt = 1.0f - t;
|
||||
|
||||
vout->x = invt * v1->x + t * v2->x;
|
||||
vout->y = invt * v1->y + t * v2->y;
|
||||
vout->z = 0.0f; // clipped against near plane anyways (I.e Z/W = 0 --> Z = 0)
|
||||
|
||||
vout->u = invt * v1->u + t * v2->u;
|
||||
vout->v = invt * v1->v + t * v2->v;
|
||||
vout->w = invt * v1->w + t * v2->w;
|
||||
|
||||
vout->bgra[0] = invt * v1->bgra[0] + t * v2->bgra[0];
|
||||
vout->bgra[1] = invt * v1->bgra[1] + t * v2->bgra[1];
|
||||
vout->bgra[2] = invt * v1->bgra[2] + t * v2->bgra[2];
|
||||
vout->bgra[3] = invt * v1->bgra[3] + t * v2->bgra[3];
|
||||
}
|
||||
extern void ClipLine(const Vertex* const v1, const Vertex* const v2, Vertex* vout);
|
||||
|
||||
#define SPAN_SORT_CFG 0x005F8030
|
||||
static volatile uint32_t* PVR_LMMODE0 = (uint32_t*) 0xA05F6884;
|
||||
@ -92,9 +74,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// .....A....B...
|
||||
// / |
|
||||
// v3--v2---v1
|
||||
ClipEdge(v3, v0, a);
|
||||
ClipLine(v3, v0, a);
|
||||
a->flags = PVR_CMD_VERTEX_EOL;
|
||||
ClipEdge(v0, v1, b);
|
||||
ClipLine(v0, v1, b);
|
||||
b->flags = PVR_CMD_VERTEX;
|
||||
|
||||
_glPerspectiveDivideVertex(v0);
|
||||
@ -115,9 +97,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....A.....B...
|
||||
// / |
|
||||
// v0--v3---v2
|
||||
ClipEdge(v0, v1, a);
|
||||
ClipLine(v0, v1, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v1, v2, b);
|
||||
ClipLine(v1, v2, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
|
||||
_glPerspectiveDivideVertex(a);
|
||||
@ -138,9 +120,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// / |
|
||||
// v1--v0---v3
|
||||
|
||||
ClipEdge(v1, v2, a);
|
||||
ClipLine(v1, v2, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v2, v3, b);
|
||||
ClipLine(v2, v3, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
|
||||
_glPerspectiveDivideVertex(a);
|
||||
@ -160,9 +142,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....A.....B...
|
||||
// / |
|
||||
// v2--v1---v0
|
||||
ClipEdge(v2, v3, a);
|
||||
ClipLine(v2, v3, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v3, v0, b);
|
||||
ClipLine(v3, v0, b);
|
||||
b->flags = PVR_CMD_VERTEX;
|
||||
|
||||
_glPerspectiveDivideVertex(b);
|
||||
@ -182,9 +164,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....B..........A...
|
||||
// \ |
|
||||
// v3-----v2
|
||||
ClipEdge(v1, v2, a);
|
||||
ClipLine(v1, v2, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v3, v0, b);
|
||||
ClipLine(v3, v0, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
|
||||
_glPerspectiveDivideVertex(v1);
|
||||
@ -207,9 +189,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....B..........A...
|
||||
// \ |
|
||||
// v2-----v1
|
||||
ClipEdge(v0, v1, a);
|
||||
ClipLine(v0, v1, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v2, v3, b);
|
||||
ClipLine(v2, v3, b);
|
||||
b->flags = PVR_CMD_VERTEX;
|
||||
|
||||
_glPerspectiveDivideVertex(a);
|
||||
@ -231,9 +213,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....B..........A...
|
||||
// \ |
|
||||
// v0-----v3
|
||||
ClipEdge(v2, v3, a);
|
||||
ClipLine(v2, v3, a);
|
||||
a->flags = PVR_CMD_VERTEX_EOL;
|
||||
ClipEdge(v0, v1, b);
|
||||
ClipLine(v0, v1, b);
|
||||
b->flags = PVR_CMD_VERTEX;
|
||||
|
||||
_glPerspectiveDivideVertex(v1);
|
||||
@ -256,9 +238,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// ....B..........A...
|
||||
// \ |
|
||||
// v1-----v0
|
||||
ClipEdge(v3, v0, a);
|
||||
ClipLine(v3, v0, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v1, v2, b);
|
||||
ClipLine(v1, v2, b);
|
||||
b->flags = PVR_CMD_VERTEX;
|
||||
|
||||
_glPerspectiveDivideVertex(b);
|
||||
@ -282,9 +264,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// \ |
|
||||
// v3
|
||||
// v1,v2,v0 v2,v0,A v0,A,B
|
||||
ClipEdge(v2, v3, a);
|
||||
ClipLine(v2, v3, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v3, v0, b);
|
||||
ClipLine(v3, v0, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
|
||||
_glPerspectiveDivideVertex(v1);
|
||||
@ -311,9 +293,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// \ |
|
||||
// v2
|
||||
// v0,v1,v3 v1,v3,A v3,A,B
|
||||
ClipEdge(v1, v2, a);
|
||||
ClipLine(v1, v2, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v2, v3, b);
|
||||
ClipLine(v2, v3, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
v3->flags = PVR_CMD_VERTEX;
|
||||
|
||||
@ -341,9 +323,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// \ |
|
||||
// v1
|
||||
// v3,v0,v2 v0,v2,A v2,A,B
|
||||
ClipEdge(v0, v1, a);
|
||||
ClipLine(v0, v1, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v1, v2, b);
|
||||
ClipLine(v1, v2, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
v3->flags = PVR_CMD_VERTEX;
|
||||
|
||||
@ -371,9 +353,9 @@ static void SubmitClipped(Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3, uint8_
|
||||
// \ |
|
||||
// v0
|
||||
// v2,v3,v1 v3,v1,A v1,A,B
|
||||
ClipEdge(v3, v0, a);
|
||||
ClipLine(v3, v0, a);
|
||||
a->flags = PVR_CMD_VERTEX;
|
||||
ClipEdge(v0, v1, b);
|
||||
ClipLine(v0, v1, b);
|
||||
b->flags = PVR_CMD_VERTEX_EOL;
|
||||
v3->flags = PVR_CMD_VERTEX;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user