Exemple #1
0
        public virtual void GL_DrawAliasFrameLerp(qfiles.dmdl_t paliashdr, Single backlerp)
        {
            qfiles.daliasframe_t frame = paliashdr.aliasFrames[currententity.frame];
            Int32[] verts = frame.verts;
            qfiles.daliasframe_t oldframe = paliashdr.aliasFrames[currententity.oldframe];
            Int32[] ov = oldframe.verts;
            Single  alpha;
            Int32   size;

            if ((currententity.flags & Defines.RF_TRANSLUCENT) != 0)
            {
                alpha = currententity.alpha;
            }
            else
            {
                alpha = 1F;
            }
            if ((currententity.flags & (Defines.RF_SHELL_RED | Defines.RF_SHELL_GREEN | Defines.RF_SHELL_BLUE | Defines.RF_SHELL_DOUBLE | Defines.RF_SHELL_HALF_DAM)) != 0)
            {
                GL.Disable(EnableCap.Texture2D);
            }
            var frontlerp = 1F - backlerp;

            Math3D.VectorSubtract(currententity.oldorigin, currententity.origin, frontv);
            Math3D.AngleVectors(currententity.angles, vectors[0], vectors[1], vectors[2]);
            move[0] = Math3D.DotProduct(frontv, vectors[0]);
            move[1] = -Math3D.DotProduct(frontv, vectors[1]);
            move[2] = Math3D.DotProduct(frontv, vectors[2]);
            Math3D.VectorAdd(move, oldframe.translate, move);
            for (var i = 0; i < 3; i++)
            {
                move[i]   = backlerp * move[i] + frontlerp * frame.translate[i];
                frontv[i] = frontlerp * frame.scale[i];
                backv[i]  = backlerp * oldframe.scale[i];
            }

            GL_LerpVerts(paliashdr.num_xyz, ov, verts, move, frontv, backv);
            new Pinnable(vertexArrayBuf.Array, (ptr) =>
            {
                GL.VertexPointer(3, VertexPointerType.Float, 0, ptr);
            });
            if ((currententity.flags & (Defines.RF_SHELL_RED | Defines.RF_SHELL_GREEN | Defines.RF_SHELL_BLUE | Defines.RF_SHELL_DOUBLE | Defines.RF_SHELL_HALF_DAM)) != 0)
            {
                GL.Color4(shadelight[0], shadelight[1], shadelight[2], alpha);
            }
            else
            {
                GL.EnableClientState(ArrayCap.ColorArray);
                new Pinnable(colorArrayBuf.Array, (ptr) =>
                {
                    GL.ColorPointer(4, ColorPointerType.Float, 0, ptr);
                });
                SingleBuffer color = colorArrayBuf;
                Single       l;
                size = paliashdr.num_xyz;
                var j = 0;
                for (var i = 0; i < size; i++)
                {
                    l = shadedots[(verts[i] >> 24) & 0xFF];
                    color.Put(j, l * shadelight[0]);
                    color.Put(j + 1, l * shadelight[1]);
                    color.Put(j + 2, l * shadelight[2]);
                    color.Put(j + 3, alpha);
                    j += 4;
                }
            }

            GL.ClientActiveTexture(TextureUnit.Texture0);
            new Pinnable(textureArrayBuf.Array, (ptr) =>
            {
                GL.TexCoordPointer(2, TexCoordPointerType.Float, 0, ptr);
            });
            var pos = 0;

            Int32[]      counts           = paliashdr.counts;
            Int32Buffer  srcIndexBuf      = null;
            SingleBuffer dstTextureCoords = textureArrayBuf;
            SingleBuffer srcTextureCoords = paliashdr.textureCoordBuf;
            var          dstIndex         = 0;
            var          srcIndex         = 0;
            Int32        count;
            Int32        mode;

            size = counts.Length;
            for (var j = 0; j < size; j++)
            {
                count = counts[j];
                if (count == 0)
                {
                    break;
                }
                srcIndexBuf = paliashdr.indexElements[j];
                mode        = ( Int32 )PrimitiveType.TriangleStrip;
                if (count < 0)
                {
                    mode  = ( Int32 )PrimitiveType.TriangleFan;
                    count = -count;
                }

                srcIndex = pos << 1;
                srcIndex--;
                for (var k = 0; k < count; k++)
                {
                    dstIndex = srcIndexBuf.Get(k) << 1;
                    dstTextureCoords.Put(dstIndex, srcTextureCoords.Get(++srcIndex));
                    dstTextureCoords.Put(++dstIndex, srcTextureCoords.Get(++srcIndex));
                }
                new Pinnable(srcIndexBuf.Array, (ptr) =>
                {
                    GL.DrawElements(( PrimitiveType )mode, 1, DrawElementsType.UnsignedInt, ptr);
                });
                pos += count;
            }

            if ((currententity.flags & (Defines.RF_SHELL_RED | Defines.RF_SHELL_GREEN | Defines.RF_SHELL_BLUE | Defines.RF_SHELL_DOUBLE | Defines.RF_SHELL_HALF_DAM)) != 0)
            {
                GL.Enable(EnableCap.Texture2D);
            }
            GL.DisableClientState(ArrayCap.ColorArray);
        }
Exemple #2
0
        public virtual void Mod_LoadAliasModel(model_t mod, ByteBuffer buffer)
        {
            Int32 i;

            qfiles.dmdl_t          pheader;
            qfiles.dstvert_t[]     poutst;
            qfiles.dtriangle_t[]   pouttri;
            qfiles.daliasframe_t[] poutframe;
            Int32[] poutcmd;
            pheader = new dmdl_t(buffer);
            if (pheader.version != qfiles.ALIAS_VERSION)
            {
                Com.Error(Defines.ERR_DROP, "%s has wrong version number (%i should be %i)", mod.name, pheader.version, qfiles.ALIAS_VERSION);
            }
            if (pheader.skinheight > MAX_LBM_HEIGHT)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has a skin taller than " + MAX_LBM_HEIGHT);
            }
            if (pheader.num_xyz <= 0)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has no vertices");
            }
            if (pheader.num_xyz > qfiles.MAX_VERTS)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has too many vertices");
            }
            if (pheader.num_st <= 0)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has no st vertices");
            }
            if (pheader.num_tris <= 0)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has no triangles");
            }
            if (pheader.num_frames <= 0)
            {
                Com.Error(Defines.ERR_DROP, "model " + mod.name + " has no frames");
            }
            poutst          = new qfiles.dstvert_t[pheader.num_st];
            buffer.Position = pheader.ofs_st;
            for (i = 0; i < pheader.num_st; i++)
            {
                poutst[i] = new dstvert_t(buffer);
            }

            pouttri         = new qfiles.dtriangle_t[pheader.num_tris];
            buffer.Position = pheader.ofs_tris;
            for (i = 0; i < pheader.num_tris; i++)
            {
                pouttri[i] = new dtriangle_t(buffer);
            }

            poutframe       = new qfiles.daliasframe_t[pheader.num_frames];
            buffer.Position = pheader.ofs_frames;
            for (i = 0; i < pheader.num_frames; i++)
            {
                poutframe[i]       = new daliasframe_t(buffer);
                poutframe[i].verts = new Int32[pheader.num_xyz];
                for (var k = 0; k < pheader.num_xyz; k++)
                {
                    poutframe[i].verts[k] = buffer.GetInt32();
                }
            }

            mod.type        = mod_alias;
            poutcmd         = new Int32[pheader.num_glcmds];
            buffer.Position = pheader.ofs_glcmds;
            for (i = 0; i < pheader.num_glcmds; i++)
            {
                poutcmd[i] = buffer.GetInt32();
            }
            String[] skinNames = new String[pheader.num_skins];
            Byte[]   nameBuf   = new Byte[qfiles.MAX_SKINNAME];
            buffer.Position = pheader.ofs_skins;
            for (i = 0; i < pheader.num_skins; i++)
            {
                buffer.Get(nameBuf);
                skinNames[i] = Encoding.ASCII.GetString(nameBuf).Trim();
                mod.skins[i] = GL_FindImage(skinNames[i], it_skin);
            }

            pheader.skinNames   = skinNames;
            pheader.stVerts     = poutst;
            pheader.triAngles   = pouttri;
            pheader.glCmds      = poutcmd;
            pheader.aliasFrames = poutframe;
            mod.extradata       = pheader;
            mod.mins[0]         = -32;
            mod.mins[1]         = -32;
            mod.mins[2]         = -32;
            mod.maxs[0]         = 32;
            mod.maxs[1]         = 32;
            mod.maxs[2]         = 32;
        }
Exemple #3
0
        public virtual System.Boolean R_CullAliasModel(entity_t e)
        {
            qfiles.dmdl_t paliashdr = (qfiles.dmdl_t)currentmodel.extradata;
            if ((e.frame >= paliashdr.num_frames) || (e.frame < 0))
            {
                VID.Printf(Defines.PRINT_ALL, "R_CullAliasModel " + currentmodel.name + ": no such frame " + e.frame + '\\');
                e.frame = 0;
            }

            if ((e.oldframe >= paliashdr.num_frames) || (e.oldframe < 0))
            {
                VID.Printf(Defines.PRINT_ALL, "R_CullAliasModel " + currentmodel.name + ": no such oldframe " + e.oldframe + '\\');
                e.oldframe = 0;
            }

            qfiles.daliasframe_t pframe    = paliashdr.aliasFrames[e.frame];
            qfiles.daliasframe_t poldframe = paliashdr.aliasFrames[e.oldframe];
            if (pframe == poldframe)
            {
                for (var i = 0; i < 3; i++)
                {
                    mins[i] = pframe.translate[i];
                    maxs[i] = mins[i] + pframe.scale[i] * 255;
                }
            }
            else
            {
                Single thismaxs, oldmaxs;
                for (var i = 0; i < 3; i++)
                {
                    thismaxs = pframe.translate[i] + pframe.scale[i] * 255;
                    oldmaxs  = poldframe.translate[i] + poldframe.scale[i] * 255;
                    if (pframe.translate[i] < poldframe.translate[i])
                    {
                        mins[i] = pframe.translate[i];
                    }
                    else
                    {
                        mins[i] = poldframe.translate[i];
                    }
                    if (thismaxs > oldmaxs)
                    {
                        maxs[i] = thismaxs;
                    }
                    else
                    {
                        maxs[i] = oldmaxs;
                    }
                }
            }

            Single[] tmp;
            for (var i = 0; i < 8; i++)
            {
                tmp = bbox[i];
                if ((i & 1) != 0)
                {
                    tmp[0] = mins[0];
                }
                else
                {
                    tmp[0] = maxs[0];
                }
                if ((i & 2) != 0)
                {
                    tmp[1] = mins[1];
                }
                else
                {
                    tmp[1] = maxs[1];
                }
                if ((i & 4) != 0)
                {
                    tmp[2] = mins[2];
                }
                else
                {
                    tmp[2] = maxs[2];
                }
            }

            tmp = mins;
            Math3D.VectorCopy(e.angles, tmp);
            tmp[YAW] = -tmp[YAW];
            Math3D.AngleVectors(tmp, vectors[0], vectors[1], vectors[2]);
            for (var i = 0; i < 8; i++)
            {
                Math3D.VectorCopy(bbox[i], tmp);
                bbox[i][0] = Math3D.DotProduct(vectors[0], tmp);
                bbox[i][1] = -Math3D.DotProduct(vectors[1], tmp);
                bbox[i][2] = Math3D.DotProduct(vectors[2], tmp);
                Math3D.VectorAdd(e.origin, bbox[i], bbox[i]);
            }

            Int32 f, mask;
            var   aggregatemask = ~0;

            for (var p = 0; p < 8; p++)
            {
                mask = 0;
                for (f = 0; f < 4; f++)
                {
                    var dp = Math3D.DotProduct(frustum[f].normal, bbox[p]);
                    if ((dp - frustum[f].dist) < 0)
                    {
                        mask |= (1 << f);
                    }
                }

                aggregatemask &= mask;
            }

            if (aggregatemask != 0)
            {
                return(true);
            }

            return(false);
        }