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(); } }
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); }
public override float S1(int index) { return(buffer.Get((index + pos) * STRIDE)); }
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; } } }
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); }