Example #1
0
        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);
        }
Example #2
0
            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);
            }