public override void DrawSpriteModel(BaseTexture texture, mspriteframe_t frame, Vector3 up, Vector3 right, Vector3 origin) { GL.Color3(1f, 1, 1); this.Device.DisableMultitexture( ); GL.Enable(EnableCap.Texture2D); texture.Bind( ); GL.Enable(EnableCap.AlphaTest); GL.Begin(PrimitiveType.Quads); GL.TexCoord2(0f, 1); var point = origin + up * frame.down + right * frame.left; GL.Vertex3(point.X, point.Y, point.Z); GL.TexCoord2(0f, 0); point = origin + up * frame.up + right * frame.left; GL.Vertex3(point.X, point.Y, point.Z); GL.TexCoord2(1f, 0); point = origin + up * frame.up + right * frame.right; GL.Vertex3(point.X, point.Y, point.Z); GL.TexCoord2(1f, 1); point = origin + up * frame.down + right * frame.right; GL.Vertex3(point.X, point.Y, point.Z); GL.End( ); GL.Disable(EnableCap.Texture2D); GL.Disable(EnableCap.AlphaTest); }
/// <summary> /// /// </summary> /// <returns>Offset of next data block</returns> private Int32 LoadSpriteFrame(ByteArraySegment pin, out Object ppframe, Int32 framenum, Func <String, ByteArraySegment, Int32, Int32, Int32> onLoadSpriteTexture) { var pinframe = Utilities.BytesToStructure <dspriteframe_t>(pin.Data, pin.StartIndex); var width = EndianHelper.LittleLong(pinframe.width); var height = EndianHelper.LittleLong(pinframe.height); var size = width * height; var pspriteframe = new mspriteframe_t( ); ppframe = pspriteframe; pspriteframe.width = width; pspriteframe.height = height; var orgx = EndianHelper.LittleLong(pinframe.origin[0]); var orgy = EndianHelper.LittleLong(pinframe.origin[1]); pspriteframe.up = orgy; // origin[1]; pspriteframe.down = orgy - height; pspriteframe.left = orgx; // origin[0]; pspriteframe.right = width + orgx; // origin[0]; var name = Name + "_" + framenum.ToString( ); var index = onLoadSpriteTexture(name, new ByteArraySegment(pin.Data, pin.StartIndex + dspriteframe_t.SizeInBytes), width, height); pspriteframe.gl_texturenum = index; return(pin.StartIndex + dspriteframe_t.SizeInBytes + size); }
public static void R_DrawSpriteModel(entity_t e) { // don't even bother culling, because it's just a single // polygon without a surface cache mspriteframe_t frame = R_GetSpriteFrame(e); msprite_t psprite = (msprite_t)e.model.cache.data; Vector3 v_forward, right, up; if (psprite.type == q_shared.SPR_ORIENTED) { // bullet marks on walls Mathlib.AngleVectors(ref e.angles, out v_forward, out right, out up); // Uze: changed from _CurrentEntity to e } else { // normal sprite up = vup; // vup; right = vright; // vright; } GL.Color3(1f, 1, 1); GL_DisableMultitexture(); GL_Bind(frame.gl_texturenum); GL.Enable(EnableCap.AlphaTest); GL.Begin(BeginMode.Quads); GL.TexCoord2(0f, 1); Vector3 point = e.origin + up * frame.down + right * frame.left; GL.Vertex3(point); GL.TexCoord2(0f, 0); point = e.origin + up * frame.up + right * frame.left; GL.Vertex3(point); GL.TexCoord2(1f, 0); point = e.origin + up * frame.up + right * frame.right; GL.Vertex3(point); GL.TexCoord2(1f, 1); point = e.origin + up * frame.down + right * frame.right; GL.Vertex3(point); GL.End(); GL.Disable(EnableCap.AlphaTest); }
public virtual void DrawSpriteModel(BaseTexture texture, mspriteframe_t frame, Vector3 up, Vector3 right, Vector3 origin) { throw new NotImplementedException( ); }
//============================================================================= /* ================= Mod_LoadSpriteFrame ================= */ static void Mod_LoadSpriteFrame(bspfile.ByteBuffer pin, ref object ppframe) { dspriteframe_t pinframe; mspriteframe_t pspriteframe; int width, height, size; int[] origin = new int[2]; pinframe = (dspriteframe_t)pin; width = pinframe.width; height = pinframe.height; size = width * height; pspriteframe = new mspriteframe_t(); pspriteframe.pixels = new byte[size*render.r_pixbytes]; ppframe = pspriteframe; pspriteframe.width = width; pspriteframe.height = height; origin[0] = pinframe.origin[0]; origin[1] = pinframe.origin[1]; pspriteframe.up = origin[1]; pspriteframe.down = origin[1] - height; pspriteframe.left = origin[0]; pspriteframe.right = width + origin[0]; if (render.r_pixbytes == 1) { pin.ofs += sizeof_dspriteframe_t; for(int kk = 0; kk < size; kk++) pspriteframe.pixels[kk] = pin.buffer[pin.ofs + kk]; } else if (render.r_pixbytes == 2) { } else { sys_linux.Sys_Error ("Mod_LoadSpriteFrame: driver set invalid r_pixbytes: " + render.r_pixbytes + "\n"); } pin.ofs += size; }