room101/VERTEX.CPP

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;
}