147 lines
5 KiB
C++
147 lines
5 KiB
C++
|
|
#include "vertex.hpp"
|
|
#include "polygon.hpp"
|
|
/*******************************************************************************
|
|
** VertexArrayProject
|
|
*******************************************************************************/
|
|
void
|
|
VertexArrayProject(Vertex dst[], int n, Vector origin)
|
|
{
|
|
while (n--)
|
|
{
|
|
assert(dst[n][0][2] != 0.0);
|
|
|
|
dst[n][0][0] = origin[0] * dst[n][0][0] / dst[n][0][2] + origin[0];
|
|
dst[n][0][1] = - origin[1] * dst[n][0][1] / dst[n][0][2] + origin[1];
|
|
}
|
|
}
|
|
/*******************************************************************************
|
|
** VertexArrayClip1
|
|
*******************************************************************************/
|
|
int
|
|
VertexArrayClip1(Vertex dst[], Vertex src[], int n, float dist[])
|
|
{
|
|
int i, j, k = 0;
|
|
|
|
if (n > 2)
|
|
{
|
|
for (j = n - 1, i = 0; i < n; j = i++)
|
|
{
|
|
if (dist[j] >= 0.0f) VertexCopy(dst[k++], src[j]);
|
|
|
|
if (dist[j] < 0.0f ^ dist[i] < 0.0f)
|
|
{
|
|
float scale = dist[j] / (dist[j] - dist[i]);
|
|
|
|
VectorInterpolate(dst[k][0], src[j][0], src[i][0], scale);
|
|
|
|
k++;
|
|
}
|
|
}
|
|
}
|
|
return k;
|
|
}
|
|
/*******************************************************************************
|
|
** VertexArrayClip2
|
|
*******************************************************************************/
|
|
int
|
|
VertexArrayClip2(Vertex dst[], Vertex src[], int n, float dist[])
|
|
{
|
|
int i, j, k = 0;
|
|
|
|
if (n > 2)
|
|
{
|
|
for (j = n - 1, i = 0; i < n; j = i++)
|
|
{
|
|
if (dist[j] >= 0.0f) VertexCopy(dst[k++], src[j]);
|
|
|
|
if (dist[j] < 0.0f ^ dist[i] < 0.0f)
|
|
{
|
|
float scale = dist[j] / (dist[j] - dist[i]);
|
|
|
|
VectorInterpolate(dst[k][0], src[j][0], src[i][0], scale);
|
|
VectorInterpolate(dst[k][1], src[j][1], src[i][1], scale);
|
|
|
|
k++;
|
|
}
|
|
}
|
|
}
|
|
return k;
|
|
}
|
|
/*******************************************************************************
|
|
** VertexArrayClip3
|
|
*******************************************************************************/
|
|
int
|
|
VertexArrayClip3(Vertex dst[], Vertex src[], int n, float dist[])
|
|
{
|
|
int i, j, k = 0;
|
|
|
|
if (n > 2)
|
|
{
|
|
for (j = n - 1, i = 0; i < n; j = i++)
|
|
{
|
|
if (dist[j] >= 0.0f) VertexCopy(dst[k++], src[j]);
|
|
|
|
if (dist[j] < 0.0f ^ dist[i] < 0.0f)
|
|
{
|
|
float scale = dist[j] / (dist[j] - dist[i]);
|
|
|
|
VectorInterpolate(dst[k][0], src[j][0], src[i][0], scale);
|
|
VectorInterpolate(dst[k][1], src[j][1], src[i][1], scale);
|
|
VectorInterpolate(dst[k][2], src[j][2], src[i][2], scale);
|
|
|
|
k++;
|
|
}
|
|
}
|
|
}
|
|
return k;
|
|
}
|
|
/*******************************************************************************
|
|
** VertexArrayClipToFrustum1
|
|
*******************************************************************************/
|
|
int
|
|
VertexArrayClipToFrustum1(Vertex dst[], Vertex src[], int n)
|
|
{
|
|
int i;
|
|
Vertex tmp[POLYGON_MAX];
|
|
float dist[POLYGON_MAX];
|
|
|
|
for (i = 0; i < n; i++) dist[i] = src[i][0][2] - 2.0f; /* front */
|
|
n = VertexArrayClip1(dst, src, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = dst[i][0][1] + dst[i][0][2]; /* roof */
|
|
n = VertexArrayClip1(tmp, dst, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = tmp[i][0][2] - tmp[i][0][1]; /* floor */
|
|
n = VertexArrayClip1(dst, tmp, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = dst[i][0][0] + dst[i][0][2]; /* left */
|
|
n = VertexArrayClip1(tmp, dst, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = tmp[i][0][2] - tmp[i][0][0]; /* right */
|
|
n = VertexArrayClip1(dst, tmp, n, dist);
|
|
|
|
return n;
|
|
}
|
|
/*******************************************************************************
|
|
** VertexArrayClipToFrustum2
|
|
*******************************************************************************/
|
|
int
|
|
VertexArrayClipToFrustum2(Vertex dst[], Vertex src[], int n)
|
|
{
|
|
int i;
|
|
Vertex tmp[POLYGON_MAX];
|
|
float dist[POLYGON_MAX];
|
|
|
|
for (i = 0; i < n; i++) dist[i] = src[i][0][2] - 2.0f; /* front */
|
|
n = VertexArrayClip2(tmp, src, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = 10000 - tmp[i][0][2]; /* back */
|
|
n = VertexArrayClip2(dst, tmp, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = dst[i][0][1] + dst[i][0][2]; /* roof */
|
|
n = VertexArrayClip2(tmp, dst, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = tmp[i][0][2] - tmp[i][0][1]; /* floor */
|
|
n = VertexArrayClip2(dst, tmp, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = dst[i][0][0] + dst[i][0][2]; /* left */
|
|
n = VertexArrayClip2(tmp, dst, n, dist);
|
|
for (i = 0; i < n; i++) dist[i] = tmp[i][0][2] - tmp[i][0][0]; /* right */
|
|
n = VertexArrayClip2(dst, tmp, n, dist);
|
|
|
|
return n;
|
|
}
|
|
|