Example #1
0
        public virtual void GL_DrawAliasShadow(qfiles.dmdl_t paliashdr, Int32 posenum)
        {
            Single[] point = new Single[] { 0, 0, 0 };
            Int32    count;
            var      lheight = currententity.origin[2] - lightspot[2];

            Int32[] order      = paliashdr.glCmds;
            var     height     = -lheight + 1F;
            var     orderIndex = 0;
            var     index      = 0;

            while (true)
            {
                count = order[orderIndex++];
                if (count == 0)
                {
                    break;
                }
                if (count < 0)
                {
                    count = -count;
                    GL.Begin(PrimitiveType.TriangleFan);
                }
                else
                {
                    GL.Begin(PrimitiveType.TriangleStrip);
                }
                do
                {
                    if (gl_vertex_arrays.value != 0F)
                    {
                        index    = order[orderIndex + 2] * 3;
                        point[0] = vertexArrayBuf.Get(index);
                        point[1] = vertexArrayBuf.Get(index + 1);
                        point[2] = vertexArrayBuf.Get(index + 2);
                    }
                    else
                    {
                        Math3D.VectorCopy(s_lerped[order[orderIndex + 2]], point);
                    }

                    point[0] -= shadevector[0] * (point[2] + lheight);
                    point[1] -= shadevector[1] * (point[2] + lheight);
                    point[2]  = height;
                    GL.Vertex3(point[0], point[1], point[2]);
                    orderIndex += 3;
                }while (--count != 0);
                GL.End();
            }
        }
Example #2
0
        public virtual void GL_DrawParticles(Int32 num_particles)
        {
            Single origin_x, origin_y, origin_z;

            Math3D.VectorScale(vup, 1.5F, up);
            Math3D.VectorScale(vright, 1.5F, right);
            GL_Bind(r_particletexture.texnum);
            GL.DepthMask(false);
            GL.Enable(EnableCap.Blend);
            GL_TexEnv(( Int32 )All.Modulate);
            GL.Begin(PrimitiveType.Triangles);
            SingleBuffer sourceVertices = particle_t.vertexArray;
            Int32Buffer  sourceColors   = particle_t.colorArray;
            Single       scale;
            Int32        color;

            for (Int32 j = 0, i = 0; i < num_particles; i++)
            {
                origin_x = sourceVertices.Get(j++);
                origin_y = sourceVertices.Get(j++);
                origin_z = sourceVertices.Get(j++);
                scale    = (origin_x - r_origin[0]) * vpn[0] + (origin_y - r_origin[1]) * vpn[1] + (origin_z - r_origin[2]) * vpn[2];
                scale    = (scale < 20) ? 1 : 1 + scale * 0.004F;
                color    = sourceColors.Get(i);
                GL.Color4(( Byte )((color) & 0xFF), ( Byte )((color >> 8) & 0xFF), ( Byte )((color >> 16) & 0xFF), ( Byte )((color >> 24)));
                GL.TexCoord2(0.0625F, 0.0625F);
                GL.Vertex3(origin_x, origin_y, origin_z);
                GL.TexCoord2(1.0625F, 0.0625F);
                GL.Vertex3(origin_x + up[0] * scale, origin_y + up[1] * scale, origin_z + up[2] * scale);
                GL.TexCoord2(0.0625F, 1.0625F);
                GL.Vertex3(origin_x + right[0] * scale, origin_y + right[1] * scale, origin_z + right[2] * scale);
            }

            GL.End();
            GL.Disable(EnableCap.Blend);
            GL.Color4(1, 1, 1, 1);
            GL.DepthMask(true);
            GL_TexEnv(( Int32 )All.Replace);
        }
Example #3
0
 public override float S1(int index)
 {
     return(buffer.Get((index + pos) * STRIDE));
 }
Example #4
0
        public static void PlayAllSounds(SingleBuffer listenerOrigin)
        {
            SingleBuffer sourceOrigin = sourceOriginBuffer;
            Channel      ch;
            int          sourceId;
            int          state;

            for (int i = 0; i < numChannels; i++)
            {
                ch = channels[i];
                if (ch.active)
                {
                    sourceId = ch.sourceId;
                    switch (ch.type)
                    {
                    case Channel.LISTENER:
                        sourceOrigin.Put(0, listenerOrigin.Get(0));
                        sourceOrigin.Put(1, listenerOrigin.Get(1));
                        sourceOrigin.Put(2, listenerOrigin.Get(2));
                        break;

                    case Channel.DYNAMIC:
                        CL_ents.GetEntitySoundOrigin(ch.entnum, entityOrigin);
                        ConvertVector(entityOrigin, sourceOrigin);
                        break;

                    case Channel.FIXED:
                        ConvertVector(ch.origin, sourceOrigin);
                        break;
                    }

                    if (ch.modified)
                    {
                        if (ch.bufferChanged)
                        {
                            try
                            {
                                AL10.AlSourcei(sourceId, AL10.AL_BUFFER, ch.bufferId);
                            }
                            catch (OpenALException e)
                            {
                                AL10.AlSourceStop(sourceId);
                                AL10.AlSourcei(sourceId, AL10.AL_BUFFER, ch.bufferId);
                            }
                        }

                        if (ch.volumeChanged)
                        {
                            AL10.AlSourcef(sourceId, AL10.AL_GAIN, ch.volume);
                        }

                        AL10.AlSourcef(sourceId, AL10.AL_ROLLOFF_FACTOR, ch.rolloff);
                        AL10.AlSource(sourceId, AL10.AL_POSITION, sourceOrigin);
                        AL10.AlSourcePlay(sourceId);
                        ch.modified = false;
                    }
                    else
                    {
                        state = AL10.AlGetSourcei(sourceId, AL10.AL_SOURCE_STATE);
                        if (state == AL10.AL_PLAYING)
                        {
                            AL10.AlSource(sourceId, AL10.AL_POSITION, sourceOrigin);
                        }
                        else
                        {
                            ch.Clear();
                        }
                    }

                    ch.autosound = false;
                }
            }
        }
Example #5
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);
        }