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); }
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; }
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); }