public static TankMesh FromModel(Model model, Device device, ModelTextureManager textureManager) { Log.InfoFormat("load tank mesh {0} from {1}", model.ModelName, ((ITankObject)model.TankObject).ShortName); var mesh = new TankMesh(); mesh.Tank = model.TankObject; mesh._device = device; try { mesh._undamagedMesh = SubTankMesh.FromModel(model.Visual, model.Primitive, model.Database.PackageDatabase, device, textureManager); } catch (Exception e) { Log.Info("exception occurred when load undamaged mesh", e); mesh._undamagedMesh = null; } try { mesh._collisionMesh = SubTankMesh.FromModel(model.CollisionVisual, model.CollisionPrimitive, model.Database.PackageDatabase, device, textureManager); } catch (Exception e) { Log.Info("exception occurred when load collision mesh", e); mesh._collisionMesh = null; } return(mesh); }
public bool Hit(TankMesh tankMesh) { return(_hitMeshs.Contains(tankMesh)); }
internal static SubTankMesh FromModel(ModelVisual modelVisual, ModelPrimitive modelPrimitive, IPackageIndexer packageIndexer, Device device, ModelTextureManager textureManager) { if (modelVisual == null) { return(null); } if (modelPrimitive == null) { return(null); } var mesh = new SubTankMesh(); _textureManager = textureManager; var verticesMap = new Dictionary <string, VertexState>(); foreach (var kv in modelPrimitive.Vertices) { var name = kv.Key; var vlist = kv.Value; verticesMap[name] = TankMesh.ConvertToVertexBuffer(vlist, device); } var indicesMap = new Dictionary <string, IndexBuffer>(); foreach (var kv in modelPrimitive.Indices) { var name = kv.Key; var nlist = kv.Value; indicesMap[name] = TankMesh.ConvertToIndexBuffer(nlist, device); } foreach (var renderSet in modelVisual.RenderSets) { //renderSet.Geometry.PrimitiveName var vState = verticesMap[renderSet.Geometry.VerticesName]; var indices = indicesMap[renderSet.Geometry.IndicesName]; var rawVertices = modelPrimitive.Vertices[renderSet.Geometry.VerticesName].Vertices; var rawIndices = modelPrimitive.Indices[renderSet.Geometry.IndicesName]; foreach (var groupKv in renderSet.Geometry.ModelPrimitiveGroups) { var group = groupKv.Value; RenderGroup renderGroup = null; if (group.Sectioned) { renderGroup = new RenderGroup { MinVertexIndex = (int)group.StartVertex, VerticesCount = (int)group.VerticesCount, StartIndex = (int)group.StartIndex, PrimitiveCount = (int)group.PrimitiveCount, }; } else { renderGroup = new RenderGroup { MinVertexIndex = 0, VerticesCount = vState.Count, StartIndex = 0, PrimitiveCount = ((int)indices.Tag) / 3, }; } renderGroup.VertexState = vState; renderGroup.Indices = indices; renderGroup.RawVertices = rawVertices; renderGroup.RawIndices = rawIndices; if (group.Material.ShowArmor) { renderGroup.RenderArmor = true; renderGroup.Textures = null; renderGroup.Armor = group.Material.Armor; } else { renderGroup.RenderArmor = false; var textures = new Dictionary <string, ModelTexture>(); foreach (var property in group.Material.Propertys) { var texturePath = property.Texture; if (string.IsNullOrWhiteSpace(texturePath)) { if (property.Name == "alphaTestEnable" && group.Material.Fx != "shaders/std_effects/PBS_tank.fx") { renderGroup.AlphaTestEnable = property.BoolValue; } else { switch (property.Name) { case "alphaReference": renderGroup.AlphaReference = property.IntValue; break; case "g_useNormalPackDXT1": renderGroup.UseNormalPackDxt1 = property.BoolValue; break; case "g_detailPower": renderGroup.DetailPower = property.FloatValue; break; case "g_metallicDetailUVTiling": renderGroup.DetailUvTiling = property.Vector4Value; break; case "g_defaultPBSConversionParam": break; case "g_albedoConversions": break; case "g_glossConversions": break; case "g_metallicConversions": break; case "g_defaultPBSConversionParams": break; case "g_albedoCorrection": break; case "g_useDetailMetallic": break; case "g_maskBias": break; case "doubleSided": break; case "alphaTestEnable": break; case "crash_coefficient": break; default: break; } } } else { try { var texture = textureManager.LoadTexture(packageIndexer, texturePath, device); textures[property.Name] = texture; if (property.Name == "normalMap" && !renderGroup.UseNormalBc1) { if (texture.ImageInformation.Format == Format.Dxt1) { renderGroup.UseNormalBc1 = true; } } } catch (Exception) { Log.InfoFormat("can't load texture {0} for {1}", texturePath, property.Name); } } } renderGroup.Textures = textures; } mesh._renderGroups.Add(renderGroup); } } return(mesh); }