Exemple #1
0
        public virtual void DrawGLPolyChain(glpoly_t p, Single soffset, Single toffset)
        {
            if (soffset == 0 && toffset == 0)
            {
                for ( ; p != null; p = p.chain)
                {
                    GL.Begin(PrimitiveType.Polygon);
                    for (var j = 0; j < p.numverts; j++)
                    {
                        GL.TexCoord2(p.S2(j), p.T2(j));
                        GL.Vertex3(p.X(j), p.Y(j), p.Z(j));
                    }

                    GL.End();
                }
            }
            else
            {
                for ( ; p != null; p = p.chain)
                {
                    GL.Begin(PrimitiveType.Polygon);
                    for (var j = 0; j < p.numverts; j++)
                    {
                        GL.TexCoord2(p.S2(j) - soffset, p.T2(j) - toffset);
                        GL.Vertex3(p.X(j), p.Y(j), p.Z(j));
                    }

                    GL.End();
                }
            }
        }
Exemple #2
0
        public virtual void GL_BuildPolygonFromSurface(msurface_t fa)
        {
            medge_t[] pedges    = currentmodel.edges;
            var       lnumverts = fa.numedges;
            glpoly_t  poly      = Polygon.Create(lnumverts);

            poly.next  = fa.polys;
            poly.flags = fa.flags;
            fa.polys   = poly;
            Int32 lindex;

            Single[] vec;
            medge_t  r_pedge;
            Single   s, t;

            for (var i = 0; i < lnumverts; i++)
            {
                lindex = currentmodel.surfedges[fa.firstedge + i];
                if (lindex > 0)
                {
                    r_pedge = pedges[lindex];
                    vec     = currentmodel.vertexes[r_pedge.v[0]].position;
                }
                else
                {
                    r_pedge = pedges[-lindex];
                    vec     = currentmodel.vertexes[r_pedge.v[1]].position;
                }

                s  = Math3D.DotProduct(vec, fa.texinfo.vecs[0]) + fa.texinfo.vecs[0][3];
                s /= fa.texinfo.image.width;
                t  = Math3D.DotProduct(vec, fa.texinfo.vecs[1]) + fa.texinfo.vecs[1][3];
                t /= fa.texinfo.image.height;
                poly.X(i, vec[0]);
                poly.Y(i, vec[1]);
                poly.Z(i, vec[2]);
                poly.S1(i, s);
                poly.T1(i, t);
                s  = Math3D.DotProduct(vec, fa.texinfo.vecs[0]) + fa.texinfo.vecs[0][3];
                s -= fa.texturemins[0];
                s += fa.light_s * 16;
                s += 8;
                s /= BLOCK_WIDTH * 16;
                t  = Math3D.DotProduct(vec, fa.texinfo.vecs[1]) + fa.texinfo.vecs[1][3];
                t -= fa.texturemins[1];
                t += fa.light_t * 16;
                t += 8;
                t /= BLOCK_HEIGHT * 16;
                poly.S2(i, s);
                poly.T2(i, t);
            }
        }
Exemple #3
0
        public virtual void SubdividePolygon(int numverts, float[][] verts)
        {
            int i, j, k;

            float[] mins = new float[] { 0, 0, 0 };
            float[] maxs = new float[] { 0, 0, 0 };
            float   m;

            float[]   v = new float[] { 0, 0, 0 };
            float[][] front = Lib.CreateJaggedArray <float[][]>(64, 3);
            float[][] back = Lib.CreateJaggedArray <float[][]>(64, 3);
            int       f, b;

            float[] dist = new float[64];
            float   frac;
            float   s, t;

            float[] total = new float[] { 0, 0, 0 };
            float   total_s, total_t;

            if (numverts > 60)
            {
                Com.Error(Defines.ERR_DROP, "numverts = " + numverts);
            }
            BoundPoly(numverts, verts, mins, maxs);
            for (i = 0; i < 3; i++)
            {
                m = (mins[i] + maxs[i]) * 0.5F;
                m = SUBDIVIDE_SIZE * (float)Math.Floor(m / SUBDIVIDE_SIZE + 0.5F);
                if (maxs[i] - m < 8)
                {
                    continue;
                }
                if (m - mins[i] < 8)
                {
                    continue;
                }
                for (j = 0; j < numverts; j++)
                {
                    dist[j] = verts[j][i] - m;
                }

                dist[j] = dist[0];
                Math3D.VectorCopy(verts[0], verts[numverts]);
                f = b = 0;
                for (j = 0; j < numverts; j++)
                {
                    v = verts[j];
                    if (dist[j] >= 0)
                    {
                        Math3D.VectorCopy(v, front[f]);
                        f++;
                    }

                    if (dist[j] <= 0)
                    {
                        Math3D.VectorCopy(v, back[b]);
                        b++;
                    }

                    if (dist[j] == 0 || dist[j + 1] == 0)
                    {
                        continue;
                    }
                    if ((dist[j] > 0) != (dist[j + 1] > 0))
                    {
                        frac = dist[j] / (dist[j] - dist[j + 1]);
                        for (k = 0; k < 3; k++)
                        {
                            front[f][k] = back[b][k] = v[k] + frac * (verts[j + 1][k] - v[k]);
                        }
                        f++;
                        b++;
                    }
                }

                SubdividePolygon(f, front);
                SubdividePolygon(b, back);
                return;
            }

            glpoly_t poly = Polygon.Create(numverts + 2);

            poly.next      = warpface.polys;
            warpface.polys = poly;
            Math3D.VectorClear(total);
            total_s = 0;
            total_t = 0;
            for (i = 0; i < numverts; i++)
            {
                poly.X(i + 1, verts[i][0]);
                poly.Y(i + 1, verts[i][1]);
                poly.Z(i + 1, verts[i][2]);
                s        = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[0]);
                t        = Math3D.DotProduct(verts[i], warpface.texinfo.vecs[1]);
                total_s += s;
                total_t += t;
                Math3D.VectorAdd(total, verts[i], total);
                poly.S1(i + 1, s);
                poly.T1(i + 1, t);
            }

            float scale = 1F / numverts;

            poly.X(0, total[0] * scale);
            poly.Y(0, total[1] * scale);
            poly.Z(0, total[2] * scale);
            poly.S1(0, total_s * scale);
            poly.T1(0, total_t * scale);
            poly.X(i + 1, poly.X(1));
            poly.Y(i + 1, poly.Y(1));
            poly.Z(i + 1, poly.Z(1));
            poly.S1(i + 1, poly.S1(1));
            poly.T1(i + 1, poly.T1(1));
            poly.S2(i + 1, poly.S2(1));
            poly.T2(i + 1, poly.T2(1));
        }