public void R_DrawAliasModel(CModel.SEntities _CurrentEntity) { Matrix wMatrix; Color shadelight; if (_CurrentEntity.Model.ModelMD2.vbModel == null) { return; } // set vertex buffer CProgram.gQ2Game.gGraphicsDevice.SetVertexBuffer(_CurrentEntity.Model.ModelMD2.vbModel[_CurrentEntity.ModelFrameSeqStart + _CurrentEntity.ModelFrameCurrent]); // create model rotation and translation matrix wMatrix = Matrix.CreateFromYawPitchRoll(_CurrentEntity.Angles.Y, _CurrentEntity.Angles.X, _CurrentEntity.Angles.Z); wMatrix *= Matrix.CreateTranslation(_CurrentEntity.Origin); // calculate the model light color shadelight = new Color(); CProgram.gQ2Game.gCMain.gCLight.R_LightPoint(_CurrentEntity.Origin, ref shadelight); // update HLSL variables CProgram.gQ2Game.gEffect.Parameters["xWorld"].SetValue(wMatrix); CProgram.gQ2Game.gEffect.Parameters["xLightModel"].SetValue(shadelight.ToVector4()); CProgram.gQ2Game.gEffect.CurrentTechnique = CProgram.gQ2Game.gEffect.Techniques["TexturedSkin"]; // bind new texture CProgram.gQ2Game.gEffect.Parameters["xTextureSkin"].SetValue(_CurrentEntity.Model.ModelMD2.skins[_CurrentEntity.ModelCurrentSkin]); foreach (EffectPass pass in CProgram.gQ2Game.gEffect.CurrentTechnique.Passes) { pass.Apply(); CProgram.gQ2Game.gGraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, _CurrentEntity.Model.ModelMD2.md2.num_tris); } CMain.c_brush_polys += _CurrentEntity.Model.ModelMD2.md2.num_tris; }
public void R_DrawBrushModel(CModel.SEntities _CurrentEntity) { Matrix wMatrix; //EffectParameter EP; Vector3 mins; Vector3 maxs; bool rotated; // update HLSL variables CProgram.gQ2Game.gCMain.UpdateHLSL(-1); // sort textures and surfaces if (CProgram.gQ2Game.gCMain.MarkSurfaceSetupStatic(ref _CurrentEntity.Model) == false) { return; } // set vertex buffer CProgram.gQ2Game.gGraphicsDevice.SetVertexBuffer(_CurrentEntity.Model.vbWorldSolid); if (_CurrentEntity.Angles.X != 0.0f || _CurrentEntity.Angles.Y != 0.0f || _CurrentEntity.Angles.Z != 0.0f) { rotated = true; mins.X = _CurrentEntity.Origin.X - _CurrentEntity.Model.radius; mins.Y = _CurrentEntity.Origin.Y - _CurrentEntity.Model.radius; mins.Z = _CurrentEntity.Origin.Z - _CurrentEntity.Model.radius; maxs.X = _CurrentEntity.Origin.X + _CurrentEntity.Model.radius; maxs.Y = _CurrentEntity.Origin.Y + _CurrentEntity.Model.radius; maxs.Z = _CurrentEntity.Origin.Z + _CurrentEntity.Model.radius; } else { rotated = false; mins.X = _CurrentEntity.Origin.X + _CurrentEntity.Model.mins.X; mins.Y = _CurrentEntity.Origin.Y + _CurrentEntity.Model.mins.Y; mins.Z = _CurrentEntity.Origin.Z + _CurrentEntity.Model.mins.Z; maxs.X = _CurrentEntity.Origin.X + _CurrentEntity.Model.maxs.X; maxs.Y = _CurrentEntity.Origin.Y + _CurrentEntity.Model.maxs.Y; maxs.Z = _CurrentEntity.Origin.Z + _CurrentEntity.Model.maxs.Z; } //if (R_CullBox(mins, maxs)) // return; CMain.ModelOrigin.X = CClient.cl.RefDef.ViewOrigin.X - _CurrentEntity.Origin.X; CMain.ModelOrigin.Y = CClient.cl.RefDef.ViewOrigin.Y - _CurrentEntity.Origin.Y; CMain.ModelOrigin.Z = CClient.cl.RefDef.ViewOrigin.Z - _CurrentEntity.Origin.Z; if (rotated == true) { Vector3 temp; Vector3 forward, right, up; temp.X = CMain.ModelOrigin.X; temp.Y = CMain.ModelOrigin.Y; temp.Z = CMain.ModelOrigin.Z; forward = Vector3.Zero; right = Vector3.Zero; up = Vector3.Zero; CShared.AngleVectors(_CurrentEntity.Angles, ref forward, ref right, ref up); CMain.ModelOrigin.X = Vector3.Dot(temp, forward); CMain.ModelOrigin.Y = -Vector3.Dot(temp, right); CMain.ModelOrigin.Z = Vector3.Dot(temp, up); } if (rotated == false) { wMatrix = Matrix.CreateFromYawPitchRoll(_CurrentEntity.Angles.Y, _CurrentEntity.Angles.X, _CurrentEntity.Angles.Z); wMatrix *= Matrix.CreateTranslation(_CurrentEntity.Origin); } else { wMatrix = Matrix.CreateTranslation(_CurrentEntity.Origin); } // update HLSL variables CProgram.gQ2Game.gEffect.Parameters["xWorld"].SetValue(wMatrix); // set a rendering technique if ((_CurrentEntity.Model.Flags & CQ2MD2.EModelFlags.RF_TRANSLUCENT) == CQ2MD2.EModelFlags.RF_TRANSLUCENT) { CProgram.gQ2Game.gEffect.CurrentTechnique = CProgram.gQ2Game.gEffect.Techniques["TexturedTranslucent"]; } else { if (CProgram.gQ2Game.gCMain.r_hardwarelight == false) { CProgram.gQ2Game.gEffect.CurrentTechnique = CProgram.gQ2Game.gEffect.Techniques["TexturedLightmap"]; } else { CProgram.gQ2Game.gEffect.CurrentTechnique = CProgram.gQ2Game.gEffect.Techniques["TexturedLight"]; } } // jkrige TODO - probably need to update this since most brushmodels can translate/rotate // save effect parameter collection shortcut //EP = CProgram.gQ2Game.gEffect.Parameters["lights"]; for (int i = 0; i < _CurrentEntity.Model.nummodelsurfaces; i++) { int surf = _CurrentEntity.Model.firstmodelsurface + i; // update surface HLSL variables CProgram.gQ2Game.gCMain.UpdateHLSL(surf); // set lights for current surface //for (int k = 0; k < CProgram.gQ2Game.gCMain.r_maxLights; k++) //{ // _CurrentEntity.Model.lights[CQ2BSP.SWorldData.surfaces[surf].lightIndex[k]].SetLight(EP.Elements[k]); //} } for (int i = 0; i < _CurrentEntity.Model.lSChainLightmap.Count; i++) { // bind new lightmap int lightmaptexturenum = _CurrentEntity.Model.lSChainLightmap[i].lightmaptexturenum; CProgram.gQ2Game.gEffect.Parameters["xTextureLightmap"].SetValue(CQ2BSP.SWorldData.WorldLightmaps[lightmaptexturenum]); for (int j = 0; j < _CurrentEntity.Model.lSChainLightmap[i].TexInfo.Count; j++) { // bind new texture int texanim = CProgram.gQ2Game.gCMain.TextureAnimation(_CurrentEntity.Model.lSChainLightmap[i].TexInfo[j].texinfo); int texinfo = _CurrentEntity.Model.lSChainLightmap[i].TexInfo[j].texinfo; CProgram.gQ2Game.gEffect.Parameters["xTextureDiffuse"].SetValue(CQ2BSP.SWorldData.WorldTextures[CQ2BSP.SWorldData.texinfo[texanim].image].Tex2D); // set the indices CProgram.gQ2Game.gGraphicsDevice.Indices = _CurrentEntity.Model.ibWorldSolid[lightmaptexturenum, texinfo].ibBuffer; foreach (EffectPass pass in CProgram.gQ2Game.gEffect.CurrentTechnique.Passes) { pass.Apply(); CProgram.gQ2Game.gGraphicsDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, 0, 0, _CurrentEntity.Model.vbWorldSolid.VertexCount, 0, _CurrentEntity.Model.ibWorldSolid[lightmaptexturenum, texinfo].PrimitiveCount); } CMain.c_brush_polys += _CurrentEntity.Model.ibWorldSolid[lightmaptexturenum, texinfo].PrimitiveCount; } } }