More clipping work
This commit is contained in:
parent
b2a26e58b3
commit
4d3858d0f0
20
GL/clip.c
20
GL/clip.c
|
@ -1,4 +1,6 @@
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "clip.h"
|
#include "clip.h"
|
||||||
|
|
||||||
ClipResult clipLineToNearZ(const float* v1, const float* v2, const float dist, float* vout, float* t) {
|
ClipResult clipLineToNearZ(const float* v1, const float* v2, const float dist, float* vout, float* t) {
|
||||||
|
@ -45,7 +47,7 @@ TriangleClipResult clipTriangleToNearZ(
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef unsigned char uint8;
|
typedef unsigned char uint8;
|
||||||
uint8 visible = ((uint8) v1->z < plane_dist) | ((uint8) v2->z < plane_dist) << 1 | ((uint8) v3->z < plane_dist) << 2;
|
uint8 visible = (v1->z >= plane_dist) ? 1 : 0 | (v2->z >= plane_dist) ? 2 : 0 | (v3->z >= plane_dist) ? 4 : 0;
|
||||||
|
|
||||||
switch(visible) {
|
switch(visible) {
|
||||||
case 0b000:
|
case 0b000:
|
||||||
|
@ -67,27 +69,31 @@ TriangleClipResult clipTriangleToNearZ(
|
||||||
default: {
|
default: {
|
||||||
/* One vertex is visible */
|
/* One vertex is visible */
|
||||||
/* This is the "easy" case, we simply find the vertex which is visible, and clip the lines to the other 2 against the plane */
|
/* This is the "easy" case, we simply find the vertex which is visible, and clip the lines to the other 2 against the plane */
|
||||||
|
fprintf(stderr, "Clipping triangle\n");
|
||||||
|
|
||||||
pvr_vertex_t tmp1, tmp2;
|
pvr_vertex_t tmp1, tmp2;
|
||||||
float t1, t2;
|
float t1, t2;
|
||||||
|
|
||||||
if(visible == 0b001) {
|
if(visible == 0b001) {
|
||||||
ClipResult l1 = clipLineToNearZ(&v1->x, &v2->x, plane_dist, &tmp1, &t1);
|
ClipResult l1 = clipLineToNearZ(&v1->x, &v2->x, plane_dist, &tmp1.x, &t1);
|
||||||
ClipResult l2 = clipLineToNearZ(&v1->x, &v3->x, plane_dist, &tmp2, &t2);
|
ClipResult l2 = clipLineToNearZ(&v1->x, &v3->x, plane_dist, &tmp2.x, &t2);
|
||||||
|
|
||||||
|
fprintf(stderr, "New V2: %f, %f, %f. T: %f\n", tmp1.x, tmp1.y, tmp1.z, t1);
|
||||||
|
fprintf(stderr, "New V3: %f, %f, %f. T: %f\n", tmp2.x, tmp2.y, tmp2.z, t2);
|
||||||
|
|
||||||
*v1out = *v1;
|
*v1out = *v1;
|
||||||
*v2out = tmp1;
|
*v2out = tmp1;
|
||||||
*v3out = tmp2;
|
*v3out = tmp2;
|
||||||
} else if(visible == 0b010) {
|
} else if(visible == 0b010) {
|
||||||
ClipResult l1 = clipLineToNearZ(&v2->x, &v1->x, plane_dist, &tmp1, &t1);
|
ClipResult l1 = clipLineToNearZ(&v2->x, &v1->x, plane_dist, &tmp1.x, &t1);
|
||||||
ClipResult l2 = clipLineToNearZ(&v2->x, &v3->x, plane_dist, &tmp2, &t2);
|
ClipResult l2 = clipLineToNearZ(&v2->x, &v3->x, plane_dist, &tmp2.x, &t2);
|
||||||
|
|
||||||
*v1out = tmp1;
|
*v1out = tmp1;
|
||||||
*v2out = *v2;
|
*v2out = *v2;
|
||||||
*v3out = tmp2;
|
*v3out = tmp2;
|
||||||
} else {
|
} else {
|
||||||
ClipResult l1 = clipLineToNearZ(&v3->x, &v1->x, plane_dist, &tmp1, &t1);
|
ClipResult l1 = clipLineToNearZ(&v3->x, &v1->x, plane_dist, &tmp1.x, &t1);
|
||||||
ClipResult l2 = clipLineToNearZ(&v3->x, &v2->x, plane_dist, &tmp2, &t2);
|
ClipResult l2 = clipLineToNearZ(&v3->x, &v2->x, plane_dist, &tmp2.x, &t2);
|
||||||
|
|
||||||
*v1out = tmp1;
|
*v1out = tmp1;
|
||||||
*v2out = tmp2;
|
*v2out = tmp2;
|
||||||
|
|
|
@ -19,6 +19,8 @@ typedef struct {
|
||||||
uint32 argb; /**< \brief Vertex color */
|
uint32 argb; /**< \brief Vertex color */
|
||||||
uint32 oargb; /**< \brief Vertex offset color */
|
uint32 oargb; /**< \brief Vertex offset color */
|
||||||
} pvr_vertex_t;
|
} pvr_vertex_t;
|
||||||
|
#else
|
||||||
|
#include <dc/pvr.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
17
GL/draw.c
17
GL/draw.c
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "../include/gl.h"
|
#include "../include/gl.h"
|
||||||
#include "../include/glext.h"
|
#include "../include/glext.h"
|
||||||
|
@ -190,8 +191,8 @@ inline void transformNormalToEyeSpace(GLfloat* normal) {
|
||||||
mat_trans_normal3(normal[0], normal[1], normal[2]);
|
mat_trans_normal3(normal[0], normal[1], normal[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this has a value other than zero, it must be negative! */
|
/* If this has a value other than zero, it must be positive! */
|
||||||
#define NEAR_DEPTH 0.0f
|
#define NEAR_DEPTH 0.0001f
|
||||||
|
|
||||||
static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum type, const GLvoid* indices) {
|
static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum type, const GLvoid* indices) {
|
||||||
static GLfloat normal[3] = {0.0f, 0.0f, -1.0f};
|
static GLfloat normal[3] = {0.0f, 0.0f, -1.0f};
|
||||||
|
@ -322,6 +323,8 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
|
||||||
|
|
||||||
_applyRenderMatrix(); /* Apply the Render Matrix Stack */
|
_applyRenderMatrix(); /* Apply the Render Matrix Stack */
|
||||||
|
|
||||||
|
float W_stash[3];
|
||||||
|
|
||||||
// FIXME: Don't perspective divide!
|
// FIXME: Don't perspective divide!
|
||||||
transformVertex(&vertex->x, &vertex->x, &vertex->y, &vertex->z);
|
transformVertex(&vertex->x, &vertex->x, &vertex->y, &vertex->z);
|
||||||
|
|
||||||
|
@ -343,7 +346,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
|
||||||
// Store this for the clip stash
|
// Store this for the clip stash
|
||||||
pvr_vertex_t original_vertex = *((pvr_vertex_t*) dst);
|
pvr_vertex_t original_vertex = *((pvr_vertex_t*) dst);
|
||||||
|
|
||||||
if(rel >= 2) {
|
if(rel >= 2) {
|
||||||
/* We have at least one complete triangle, let's start clipping! */
|
/* We have at least one complete triangle, let's start clipping! */
|
||||||
pvr_vertex_t* v1 = (pvr_vertex_t*) &clip_stash[0];
|
pvr_vertex_t* v1 = (pvr_vertex_t*) &clip_stash[0];
|
||||||
pvr_vertex_t* v2 = (pvr_vertex_t*) &clip_stash[1];
|
pvr_vertex_t* v2 = (pvr_vertex_t*) &clip_stash[1];
|
||||||
|
@ -380,7 +383,6 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
|
||||||
/*
|
/*
|
||||||
* Two vertices were behind the clip plane, we just manipulated them.
|
* Two vertices were behind the clip plane, we just manipulated them.
|
||||||
we have to end the triangle strip here and pick up next vertex */
|
we have to end the triangle strip here and pick up next vertex */
|
||||||
|
|
||||||
v3out->flags = PVR_CMD_VERTEX_EOL;
|
v3out->flags = PVR_CMD_VERTEX_EOL;
|
||||||
|
|
||||||
/* Now we push back the original 2 vertices, so that the next triangle strip will be properly
|
/* Now we push back the original 2 vertices, so that the next triangle strip will be properly
|
||||||
|
@ -390,8 +392,9 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
|
||||||
activePolyList()->vector.size + 2
|
activePolyList()->vector.size + 2
|
||||||
);
|
);
|
||||||
|
|
||||||
*(++dst) = (PVRCommand) clip_stash[1];
|
/* clip_stash[1] holds the previous vertex, original_vertex holds the current one */
|
||||||
*(++dst) = (PVRCommand) original_vertex;
|
memcpy(++dst, &clip_stash[1], sizeof(PVRCommand));
|
||||||
|
memcpy(++dst, &original_vertex, sizeof(PVRCommand));
|
||||||
|
|
||||||
} else if(ret == TRIANGLE_CLIP_RESULT_ALTERED_AND_CREATED_VERTEX) {
|
} else if(ret == TRIANGLE_CLIP_RESULT_ALTERED_AND_CREATED_VERTEX) {
|
||||||
/* One vertex was behind the clip plane, we need to create another triangle */
|
/* One vertex was behind the clip plane, we need to create another triangle */
|
||||||
|
@ -407,7 +410,7 @@ static void submitVertices(GLenum mode, GLsizei first, GLsizei count, GLenum typ
|
||||||
clip_stash[0] = clip_stash[1];
|
clip_stash[0] = clip_stash[1];
|
||||||
clip_stash[1] = original_vertex;
|
clip_stash[1] = original_vertex;
|
||||||
|
|
||||||
//FIXME: Peform perspective division
|
//FIXME: Perform perspective division
|
||||||
|
|
||||||
++dst;
|
++dst;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,3 +14,5 @@ all:
|
||||||
$(KOS_MAKE) -C ortho2d all
|
$(KOS_MAKE) -C ortho2d all
|
||||||
$(KOS_MAKE) -C lerabot01 all
|
$(KOS_MAKE) -C lerabot01 all
|
||||||
$(KOS_MAKE) -C zclip all
|
$(KOS_MAKE) -C zclip all
|
||||||
|
$(KOS_MAKE) -C zclip1 all
|
||||||
|
$(KOS_MAKE) -C zclip2 all
|
||||||
|
|
Loading…
Reference in New Issue
Block a user